From python-checkins at python.org Wed Feb 1 00:22:11 2012 From: python-checkins at python.org (victor.stinner) Date: Wed, 01 Feb 2012 00:22:11 +0100 Subject: [Python-checkins] =?utf8?q?cpython=3A_Issue_=2313706=3A_Add_asser?= =?utf8?q?tions_to_detect_bugs_earlier?= Message-ID: http://hg.python.org/cpython/rev/056f5cc8885d changeset: 74702:056f5cc8885d user: Victor Stinner date: Wed Feb 01 00:22:23 2012 +0100 summary: Issue #13706: Add assertions to detect bugs earlier files: Include/unicodeobject.h | 3 +++ Python/formatter_unicode.c | 12 +++++++++--- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/Include/unicodeobject.h b/Include/unicodeobject.h --- a/Include/unicodeobject.h +++ b/Include/unicodeobject.h @@ -499,14 +499,17 @@ do { \ switch ((kind)) { \ case PyUnicode_1BYTE_KIND: { \ + assert(value <= 0xff); \ ((Py_UCS1 *)(data))[(index)] = (Py_UCS1)(value); \ break; \ } \ case PyUnicode_2BYTE_KIND: { \ + assert(value <= 0xffff); \ ((Py_UCS2 *)(data))[(index)] = (Py_UCS2)(value); \ break; \ } \ default: { \ + assert(value <= 0x10ffff); \ assert((kind) == PyUnicode_4BYTE_KIND); \ ((Py_UCS4 *)(data))[(index)] = (Py_UCS4)(value); \ } \ diff --git a/Python/formatter_unicode.c b/Python/formatter_unicode.c --- a/Python/formatter_unicode.c +++ b/Python/formatter_unicode.c @@ -559,8 +559,9 @@ Py_ssize_t t; for (t = 0; t < spec->n_prefix; t++) { Py_UCS4 c = PyUnicode_READ(kind, data, pos + t); + c = Py_TOUPPER(c); assert (c <= 127); - PyUnicode_WRITE(kind, data, pos + t, Py_TOUPPER(c)); + PyUnicode_WRITE(kind, data, pos + t, c); } } pos += spec->n_prefix; @@ -603,11 +604,12 @@ Py_ssize_t t; for (t = 0; t < spec->n_grouped_digits; t++) { Py_UCS4 c = PyUnicode_READ(kind, data, pos + t); + c = Py_TOUPPER(c); if (c > 127) { PyErr_SetString(PyExc_SystemError, "non-ascii grouped digit"); return -1; } - PyUnicode_WRITE(kind, data, pos + t, Py_TOUPPER(c)); + PyUnicode_WRITE(kind, data, pos + t, c); } } pos += spec->n_grouped_digits; @@ -733,6 +735,7 @@ Py_CLEAR(result); done: + assert(!result || _PyUnicode_CheckConsistency(result, 1)); return result; } @@ -759,7 +762,7 @@ 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; + Py_ssize_t prefix = 0; NumberFieldWidths spec; long x; int err; @@ -894,6 +897,7 @@ done: Py_XDECREF(tmp); + assert(!result || _PyUnicode_CheckConsistency(result, 1)); return result; } @@ -1036,6 +1040,7 @@ done: PyMem_Free(buf); Py_DECREF(unicode_tmp); + assert(!result || _PyUnicode_CheckConsistency(result, 1)); return result; } @@ -1270,6 +1275,7 @@ PyMem_Free(im_buf); Py_XDECREF(re_unicode_tmp); Py_XDECREF(im_unicode_tmp); + assert(!result || _PyUnicode_CheckConsistency(result, 1)); return result; } -- Repository URL: http://hg.python.org/cpython From solipsis at pitrou.net Wed Feb 1 05:32:37 2012 From: solipsis at pitrou.net (solipsis at pitrou.net) Date: Wed, 01 Feb 2012 05:32:37 +0100 Subject: [Python-checkins] Daily reference leaks (056f5cc8885d): sum=0 Message-ID: results for 056f5cc8885d on branch "default" -------------------------------------------- Command line was: ['./python', '-m', 'test.regrtest', '-uall', '-R', '3:3:/home/antoine/cpython/refleaks/reflogCio5Ts', '-x'] From python-checkins at python.org Wed Feb 1 17:54:25 2012 From: python-checkins at python.org (raymond.hettinger) Date: Wed, 01 Feb 2012 17:54:25 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=282=2E7=29=3A_Add_a_usage_not?= =?utf8?q?e?= Message-ID: http://hg.python.org/cpython/rev/0c12790791e6 changeset: 74703:0c12790791e6 branch: 2.7 parent: 74695:822d7a1f8885 user: Raymond Hettinger date: Wed Feb 01 08:52:44 2012 -0800 summary: Add a usage note files: Doc/library/itertools.rst | 5 +++++ 1 files changed, 5 insertions(+), 0 deletions(-) diff --git a/Doc/library/itertools.rst b/Doc/library/itertools.rst --- a/Doc/library/itertools.rst +++ b/Doc/library/itertools.rst @@ -590,6 +590,11 @@ for i in xrange(times): yield object + A common use for *repeat* is to supply a stream of constant values to *imap* + or *zip*:: + + >>> list(imap(pow, range(10), repeat(2))) + [0, 1, 4, 9, 16, 25, 36, 49, 64, 81] .. function:: starmap(function, iterable) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Feb 1 17:54:26 2012 From: python-checkins at python.org (raymond.hettinger) Date: Wed, 01 Feb 2012 17:54:26 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=282=2E7=29=3A_fix_whitespace?= Message-ID: http://hg.python.org/cpython/rev/998622bb5e42 changeset: 74704:998622bb5e42 branch: 2.7 user: Raymond Hettinger date: Wed Feb 01 08:54:14 2012 -0800 summary: fix whitespace files: Doc/library/itertools.rst | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Doc/library/itertools.rst b/Doc/library/itertools.rst --- a/Doc/library/itertools.rst +++ b/Doc/library/itertools.rst @@ -592,7 +592,7 @@ A common use for *repeat* is to supply a stream of constant values to *imap* or *zip*:: - + >>> list(imap(pow, range(10), repeat(2))) [0, 1, 4, 9, 16, 25, 36, 49, 64, 81] -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Feb 1 17:55:32 2012 From: python-checkins at python.org (raymond.hettinger) Date: Wed, 01 Feb 2012 17:55:32 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=282=2E7=29=3A_Use_xrange_in_t?= =?utf8?q?he_example?= Message-ID: http://hg.python.org/cpython/rev/94b69bae61eb changeset: 74705:94b69bae61eb branch: 2.7 user: Raymond Hettinger date: Wed Feb 01 08:55:21 2012 -0800 summary: Use xrange in the example files: Doc/library/itertools.rst | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Doc/library/itertools.rst b/Doc/library/itertools.rst --- a/Doc/library/itertools.rst +++ b/Doc/library/itertools.rst @@ -593,7 +593,7 @@ A common use for *repeat* is to supply a stream of constant values to *imap* or *zip*:: - >>> list(imap(pow, range(10), repeat(2))) + >>> list(imap(pow, xrange(10), repeat(2))) [0, 1, 4, 9, 16, 25, 36, 49, 64, 81] .. function:: starmap(function, iterable) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Feb 1 18:08:34 2012 From: python-checkins at python.org (raymond.hettinger) Date: Wed, 01 Feb 2012 18:08:34 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=283=2E2=29=3A_Add_usage_note?= Message-ID: http://hg.python.org/cpython/rev/546261016fcd changeset: 74706:546261016fcd branch: 3.2 parent: 74696:89b699e68fa2 user: Raymond Hettinger date: Wed Feb 01 09:07:40 2012 -0800 summary: Add usage note files: Doc/library/itertools.rst | 5 +++++ 1 files changed, 5 insertions(+), 0 deletions(-) diff --git a/Doc/library/itertools.rst b/Doc/library/itertools.rst --- a/Doc/library/itertools.rst +++ b/Doc/library/itertools.rst @@ -496,6 +496,11 @@ for i in range(times): yield object + A common use for *repeat* is to supply a stream of constant values to *map* + or *zip*:: + + >>> list(map(pow, range(10), repeat(2))) + [0, 1, 4, 9, 16, 25, 36, 49, 64, 81] .. function:: starmap(function, iterable) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Feb 1 18:08:35 2012 From: python-checkins at python.org (raymond.hettinger) Date: Wed, 01 Feb 2012 18:08:35 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_3=2E2_-=3E_default=29?= =?utf8?q?=3A_merge?= Message-ID: http://hg.python.org/cpython/rev/771e2a372462 changeset: 74707:771e2a372462 parent: 74702:056f5cc8885d parent: 74706:546261016fcd user: Raymond Hettinger date: Wed Feb 01 09:08:08 2012 -0800 summary: merge files: Doc/library/itertools.rst | 5 +++++ 1 files changed, 5 insertions(+), 0 deletions(-) diff --git a/Doc/library/itertools.rst b/Doc/library/itertools.rst --- a/Doc/library/itertools.rst +++ b/Doc/library/itertools.rst @@ -534,6 +534,11 @@ for i in range(times): yield object + A common use for *repeat* is to supply a stream of constant values to *map* + or *zip*:: + + >>> list(map(pow, range(10), repeat(2))) + [0, 1, 4, 9, 16, 25, 36, 49, 64, 81] .. function:: starmap(function, iterable) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Feb 1 21:45:07 2012 From: python-checkins at python.org (petri.lehtinen) Date: Wed, 01 Feb 2012 21:45:07 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=283=2E2=29=3A_sqlite3=3A_Hand?= =?utf8?q?le_strings_with_embedded_zeros_correctly?= Message-ID: http://hg.python.org/cpython/rev/2e13011b3719 changeset: 74708:2e13011b3719 branch: 3.2 parent: 74706:546261016fcd user: Petri Lehtinen date: Wed Feb 01 22:18:19 2012 +0200 summary: sqlite3: Handle strings with embedded zeros correctly Closes #13676. files: Lib/sqlite3/test/dbapi.py | 7 ++++ Lib/sqlite3/test/factory.py | 37 ++++++++++++++++++++++++- Misc/NEWS | 2 + Modules/_sqlite/cursor.c | 13 ++++---- Modules/_sqlite/statement.c | 4 +- 5 files changed, 54 insertions(+), 9 deletions(-) diff --git a/Lib/sqlite3/test/dbapi.py b/Lib/sqlite3/test/dbapi.py --- a/Lib/sqlite3/test/dbapi.py +++ b/Lib/sqlite3/test/dbapi.py @@ -225,6 +225,13 @@ def CheckExecuteArgString(self): self.cu.execute("insert into test(name) values (?)", ("Hugo",)) + def CheckExecuteArgStringWithZeroByte(self): + self.cu.execute("insert into test(name) values (?)", ("Hu\x00go",)) + + self.cu.execute("select name from test where id=?", (self.cu.lastrowid,)) + row = self.cu.fetchone() + self.assertEqual(row[0], "Hu\x00go") + def CheckExecuteWrongNoOfArgs1(self): # too many parameters try: diff --git a/Lib/sqlite3/test/factory.py b/Lib/sqlite3/test/factory.py --- a/Lib/sqlite3/test/factory.py +++ b/Lib/sqlite3/test/factory.py @@ -189,13 +189,48 @@ def tearDown(self): self.con.close() +class TextFactoryTestsWithEmbeddedZeroBytes(unittest.TestCase): + def setUp(self): + self.con = sqlite.connect(":memory:") + self.con.execute("create table test (value text)") + self.con.execute("insert into test (value) values (?)", ("a\x00b",)) + + def CheckString(self): + # text_factory defaults to str + row = self.con.execute("select value from test").fetchone() + self.assertIs(type(row[0]), str) + self.assertEqual(row[0], "a\x00b") + + def CheckBytes(self): + self.con.text_factory = bytes + row = self.con.execute("select value from test").fetchone() + self.assertIs(type(row[0]), bytes) + self.assertEqual(row[0], b"a\x00b") + + def CheckBytearray(self): + self.con.text_factory = bytearray + row = self.con.execute("select value from test").fetchone() + self.assertIs(type(row[0]), bytearray) + self.assertEqual(row[0], b"a\x00b") + + def CheckCustom(self): + # A custom factory should receive a bytes argument + self.con.text_factory = lambda x: x + row = self.con.execute("select value from test").fetchone() + self.assertIs(type(row[0]), bytes) + self.assertEqual(row[0], b"a\x00b") + + def tearDown(self): + self.con.close() + def suite(): connection_suite = unittest.makeSuite(ConnectionFactoryTests, "Check") cursor_suite = unittest.makeSuite(CursorFactoryTests, "Check") row_suite_compat = unittest.makeSuite(RowFactoryTestsBackwardsCompat, "Check") row_suite = unittest.makeSuite(RowFactoryTests, "Check") text_suite = unittest.makeSuite(TextFactoryTests, "Check") - return unittest.TestSuite((connection_suite, cursor_suite, row_suite_compat, row_suite, text_suite)) + text_zero_bytes_suite = unittest.makeSuite(TextFactoryTestsWithEmbeddedZeroBytes, "Check") + return unittest.TestSuite((connection_suite, cursor_suite, row_suite_compat, row_suite, text_suite, text_zero_bytes_suite)) def test(): runner = unittest.TextTestRunner() diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -113,6 +113,8 @@ Library ------- +- 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. diff --git a/Modules/_sqlite/cursor.c b/Modules/_sqlite/cursor.c --- a/Modules/_sqlite/cursor.c +++ b/Modules/_sqlite/cursor.c @@ -268,9 +268,9 @@ } } -PyObject* pysqlite_unicode_from_string(const char* val_str, int optimize) +PyObject* pysqlite_unicode_from_string(const char* val_str, Py_ssize_t size, int optimize) { - return PyUnicode_FromString(val_str); + return PyUnicode_FromStringAndSize(val_str, size); } /* @@ -355,10 +355,11 @@ converted = PyFloat_FromDouble(sqlite3_column_double(self->statement->st, i)); } 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, + converted = pysqlite_unicode_from_string(val_str, nbytes, self->connection->text_factory == pysqlite_OptimizedUnicode ? 1 : 0); if (!converted) { @@ -383,11 +384,11 @@ } } } else if (self->connection->text_factory == (PyObject*)&PyBytes_Type) { - converted = PyBytes_FromString(val_str); + converted = PyBytes_FromStringAndSize(val_str, nbytes); } else if (self->connection->text_factory == (PyObject*)&PyByteArray_Type) { - converted = PyByteArray_FromStringAndSize(val_str, strlen(val_str)); + converted = PyByteArray_FromStringAndSize(val_str, nbytes); } else { - converted = PyObject_CallFunction(self->connection->text_factory, "y", val_str); + converted = PyObject_CallFunction(self->connection->text_factory, "y#", val_str, nbytes); } } else { /* coltype == SQLITE_BLOB */ diff --git a/Modules/_sqlite/statement.c b/Modules/_sqlite/statement.c --- a/Modules/_sqlite/statement.c +++ b/Modules/_sqlite/statement.c @@ -129,9 +129,9 @@ rc = sqlite3_bind_double(self->st, pos, PyFloat_AsDouble(parameter)); break; case TYPE_UNICODE: - string = _PyUnicode_AsString(parameter); + string = _PyUnicode_AsStringAndSize(parameter, &buflen); if (string != NULL) - rc = sqlite3_bind_text(self->st, pos, string, -1, SQLITE_TRANSIENT); + rc = sqlite3_bind_text(self->st, pos, string, buflen, SQLITE_TRANSIENT); else rc = -1; break; -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Feb 1 21:45:08 2012 From: python-checkins at python.org (petri.lehtinen) Date: Wed, 01 Feb 2012 21:45:08 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=282=2E7=29=3A_sqlite3=3A_Hand?= =?utf8?q?le_strings_with_embedded_zeros_correctly?= Message-ID: http://hg.python.org/cpython/rev/93ac4b12a750 changeset: 74709:93ac4b12a750 branch: 2.7 parent: 74705:94b69bae61eb user: Petri Lehtinen date: Wed Feb 01 22:20:12 2012 +0200 summary: sqlite3: Handle strings with embedded zeros correctly Closes #13676. files: Lib/sqlite3/test/dbapi.py | 7 ++++ Lib/sqlite3/test/factory.py | 41 ++++++++++++++++++++++++- Misc/NEWS | 2 + Modules/_sqlite/cursor.c | 16 +++++---- Modules/_sqlite/statement.c | 8 ++-- 5 files changed, 62 insertions(+), 12 deletions(-) diff --git a/Lib/sqlite3/test/dbapi.py b/Lib/sqlite3/test/dbapi.py --- a/Lib/sqlite3/test/dbapi.py +++ b/Lib/sqlite3/test/dbapi.py @@ -203,6 +203,13 @@ def CheckExecuteArgString(self): self.cu.execute("insert into test(name) values (?)", ("Hugo",)) + def CheckExecuteArgStringWithZeroByte(self): + self.cu.execute("insert into test(name) values (?)", ("Hu\x00go",)) + + self.cu.execute("select name from test where id=?", (self.cu.lastrowid,)) + row = self.cu.fetchone() + self.assertEqual(row[0], "Hu\x00go") + def CheckExecuteWrongNoOfArgs1(self): # too many parameters try: diff --git a/Lib/sqlite3/test/factory.py b/Lib/sqlite3/test/factory.py --- a/Lib/sqlite3/test/factory.py +++ b/Lib/sqlite3/test/factory.py @@ -189,13 +189,52 @@ def tearDown(self): self.con.close() +class TextFactoryTestsWithEmbeddedZeroBytes(unittest.TestCase): + def setUp(self): + self.con = sqlite.connect(":memory:") + self.con.execute("create table test (value text)") + self.con.execute("insert into test (value) values (?)", ("a\x00b",)) + + def CheckString(self): + # text_factory defaults to unicode + row = self.con.execute("select value from test").fetchone() + self.assertIs(type(row[0]), unicode) + self.assertEqual(row[0], "a\x00b") + + def CheckCustom(self): + # A custom factory should receive an str argument + self.con.text_factory = lambda x: x + row = self.con.execute("select value from test").fetchone() + self.assertIs(type(row[0]), str) + self.assertEqual(row[0], "a\x00b") + + def CheckOptimizedUnicodeAsString(self): + # ASCII -> str argument + self.con.text_factory = sqlite.OptimizedUnicode + row = self.con.execute("select value from test").fetchone() + self.assertIs(type(row[0]), str) + self.assertEqual(row[0], "a\x00b") + + def CheckOptimizedUnicodeAsUnicode(self): + # Non-ASCII -> unicode argument + self.con.text_factory = sqlite.OptimizedUnicode + self.con.execute("delete from test") + self.con.execute("insert into test (value) values (?)", (u'?\0?',)) + row = self.con.execute("select value from test").fetchone() + self.assertIs(type(row[0]), unicode) + self.assertEqual(row[0], u"?\x00?") + + def tearDown(self): + self.con.close() + def suite(): connection_suite = unittest.makeSuite(ConnectionFactoryTests, "Check") cursor_suite = unittest.makeSuite(CursorFactoryTests, "Check") row_suite_compat = unittest.makeSuite(RowFactoryTestsBackwardsCompat, "Check") row_suite = unittest.makeSuite(RowFactoryTests, "Check") text_suite = unittest.makeSuite(TextFactoryTests, "Check") - return unittest.TestSuite((connection_suite, cursor_suite, row_suite_compat, row_suite, text_suite)) + text_zero_bytes_suite = unittest.makeSuite(TextFactoryTestsWithEmbeddedZeroBytes, "Check") + return unittest.TestSuite((connection_suite, cursor_suite, row_suite_compat, row_suite, text_suite, text_zero_bytes_suite)) def test(): runner = unittest.TextTestRunner() diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -90,6 +90,8 @@ Library ------- +- 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. diff --git a/Modules/_sqlite/cursor.c b/Modules/_sqlite/cursor.c --- a/Modules/_sqlite/cursor.c +++ b/Modules/_sqlite/cursor.c @@ -268,16 +268,17 @@ } } -PyObject* pysqlite_unicode_from_string(const char* val_str, int optimize) +PyObject* pysqlite_unicode_from_string(const char* val_str, Py_ssize_t size, int optimize) { const char* check; + Py_ssize_t pos; int is_ascii = 0; if (optimize) { is_ascii = 1; check = val_str; - while (*check) { + for (pos = 0; pos < size; pos++) { if (*check & 0x80) { is_ascii = 0; break; @@ -288,9 +289,9 @@ } if (is_ascii) { - return PyString_FromString(val_str); + return PyString_FromStringAndSize(val_str, size); } else { - return PyUnicode_DecodeUTF8(val_str, strlen(val_str), NULL); + return PyUnicode_DecodeUTF8(val_str, size, NULL); } } @@ -375,10 +376,11 @@ converted = PyFloat_FromDouble(sqlite3_column_double(self->statement->st, i)); } 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, + converted = pysqlite_unicode_from_string(val_str, nbytes, self->connection->text_factory == pysqlite_OptimizedUnicode ? 1 : 0); if (!converted) { @@ -391,9 +393,9 @@ PyErr_SetString(pysqlite_OperationalError, buf); } } else if (self->connection->text_factory == (PyObject*)&PyString_Type) { - converted = PyString_FromString(val_str); + converted = PyString_FromStringAndSize(val_str, nbytes); } else { - converted = PyObject_CallFunction(self->connection->text_factory, "s", val_str); + converted = PyObject_CallFunction(self->connection->text_factory, "s#", val_str, nbytes); } } else { /* coltype == SQLITE_BLOB */ diff --git a/Modules/_sqlite/statement.c b/Modules/_sqlite/statement.c --- a/Modules/_sqlite/statement.c +++ b/Modules/_sqlite/statement.c @@ -166,13 +166,13 @@ rc = sqlite3_bind_double(self->st, pos, PyFloat_AsDouble(parameter)); break; case TYPE_STRING: - string = PyString_AS_STRING(parameter); - rc = sqlite3_bind_text(self->st, pos, string, -1, SQLITE_TRANSIENT); + PyString_AsStringAndSize(parameter, &string, &buflen); + rc = sqlite3_bind_text(self->st, pos, string, buflen, SQLITE_TRANSIENT); break; case TYPE_UNICODE: stringval = PyUnicode_AsUTF8String(parameter); - string = PyString_AsString(stringval); - rc = sqlite3_bind_text(self->st, pos, string, -1, SQLITE_TRANSIENT); + PyString_AsStringAndSize(stringval, &string, &buflen); + rc = sqlite3_bind_text(self->st, pos, string, buflen, SQLITE_TRANSIENT); Py_DECREF(stringval); break; case TYPE_BUFFER: -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Feb 1 21:45:09 2012 From: python-checkins at python.org (petri.lehtinen) Date: Wed, 01 Feb 2012 21:45:09 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_3=2E2_-=3E_default=29?= =?utf8?q?=3A_Merge_branch_3=2E2?= Message-ID: http://hg.python.org/cpython/rev/6f4044afa600 changeset: 74710:6f4044afa600 parent: 74707:771e2a372462 parent: 74708:2e13011b3719 user: Petri Lehtinen date: Wed Feb 01 22:20:41 2012 +0200 summary: Merge branch 3.2 Closes #13676. files: Lib/sqlite3/test/dbapi.py | 7 ++++ Lib/sqlite3/test/factory.py | 37 ++++++++++++++++++++++++- Misc/NEWS | 2 + Modules/_sqlite/cursor.c | 13 ++++---- Modules/_sqlite/statement.c | 4 +- 5 files changed, 54 insertions(+), 9 deletions(-) diff --git a/Lib/sqlite3/test/dbapi.py b/Lib/sqlite3/test/dbapi.py --- a/Lib/sqlite3/test/dbapi.py +++ b/Lib/sqlite3/test/dbapi.py @@ -225,6 +225,13 @@ def CheckExecuteArgString(self): self.cu.execute("insert into test(name) values (?)", ("Hugo",)) + def CheckExecuteArgStringWithZeroByte(self): + self.cu.execute("insert into test(name) values (?)", ("Hu\x00go",)) + + self.cu.execute("select name from test where id=?", (self.cu.lastrowid,)) + row = self.cu.fetchone() + self.assertEqual(row[0], "Hu\x00go") + def CheckExecuteWrongNoOfArgs1(self): # too many parameters try: diff --git a/Lib/sqlite3/test/factory.py b/Lib/sqlite3/test/factory.py --- a/Lib/sqlite3/test/factory.py +++ b/Lib/sqlite3/test/factory.py @@ -189,13 +189,48 @@ def tearDown(self): self.con.close() +class TextFactoryTestsWithEmbeddedZeroBytes(unittest.TestCase): + def setUp(self): + self.con = sqlite.connect(":memory:") + self.con.execute("create table test (value text)") + self.con.execute("insert into test (value) values (?)", ("a\x00b",)) + + def CheckString(self): + # text_factory defaults to str + row = self.con.execute("select value from test").fetchone() + self.assertIs(type(row[0]), str) + self.assertEqual(row[0], "a\x00b") + + def CheckBytes(self): + self.con.text_factory = bytes + row = self.con.execute("select value from test").fetchone() + self.assertIs(type(row[0]), bytes) + self.assertEqual(row[0], b"a\x00b") + + def CheckBytearray(self): + self.con.text_factory = bytearray + row = self.con.execute("select value from test").fetchone() + self.assertIs(type(row[0]), bytearray) + self.assertEqual(row[0], b"a\x00b") + + def CheckCustom(self): + # A custom factory should receive a bytes argument + self.con.text_factory = lambda x: x + row = self.con.execute("select value from test").fetchone() + self.assertIs(type(row[0]), bytes) + self.assertEqual(row[0], b"a\x00b") + + def tearDown(self): + self.con.close() + def suite(): connection_suite = unittest.makeSuite(ConnectionFactoryTests, "Check") cursor_suite = unittest.makeSuite(CursorFactoryTests, "Check") row_suite_compat = unittest.makeSuite(RowFactoryTestsBackwardsCompat, "Check") row_suite = unittest.makeSuite(RowFactoryTests, "Check") text_suite = unittest.makeSuite(TextFactoryTests, "Check") - return unittest.TestSuite((connection_suite, cursor_suite, row_suite_compat, row_suite, text_suite)) + text_zero_bytes_suite = unittest.makeSuite(TextFactoryTestsWithEmbeddedZeroBytes, "Check") + return unittest.TestSuite((connection_suite, cursor_suite, row_suite_compat, row_suite, text_suite, text_zero_bytes_suite)) def test(): runner = unittest.TextTestRunner() diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -463,6 +463,8 @@ Library ------- +- 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. diff --git a/Modules/_sqlite/cursor.c b/Modules/_sqlite/cursor.c --- a/Modules/_sqlite/cursor.c +++ b/Modules/_sqlite/cursor.c @@ -267,9 +267,9 @@ } } -PyObject* pysqlite_unicode_from_string(const char* val_str, int optimize) +PyObject* pysqlite_unicode_from_string(const char* val_str, Py_ssize_t size, int optimize) { - return PyUnicode_FromString(val_str); + return PyUnicode_FromStringAndSize(val_str, size); } /* @@ -354,10 +354,11 @@ converted = PyFloat_FromDouble(sqlite3_column_double(self->statement->st, i)); } 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, + converted = pysqlite_unicode_from_string(val_str, nbytes, self->connection->text_factory == pysqlite_OptimizedUnicode ? 1 : 0); if (!converted) { @@ -382,11 +383,11 @@ } } } else if (self->connection->text_factory == (PyObject*)&PyBytes_Type) { - converted = PyBytes_FromString(val_str); + converted = PyBytes_FromStringAndSize(val_str, nbytes); } else if (self->connection->text_factory == (PyObject*)&PyByteArray_Type) { - converted = PyByteArray_FromStringAndSize(val_str, strlen(val_str)); + converted = PyByteArray_FromStringAndSize(val_str, nbytes); } else { - converted = PyObject_CallFunction(self->connection->text_factory, "y", val_str); + converted = PyObject_CallFunction(self->connection->text_factory, "y#", val_str, nbytes); } } else { /* coltype == SQLITE_BLOB */ diff --git a/Modules/_sqlite/statement.c b/Modules/_sqlite/statement.c --- a/Modules/_sqlite/statement.c +++ b/Modules/_sqlite/statement.c @@ -129,9 +129,9 @@ rc = sqlite3_bind_double(self->st, pos, PyFloat_AsDouble(parameter)); break; case TYPE_UNICODE: - string = _PyUnicode_AsString(parameter); + string = _PyUnicode_AsStringAndSize(parameter, &buflen); if (string != NULL) - rc = sqlite3_bind_text(self->st, pos, string, -1, SQLITE_TRANSIENT); + rc = sqlite3_bind_text(self->st, pos, string, buflen, SQLITE_TRANSIENT); else rc = -1; break; -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Feb 1 22:25:00 2012 From: python-checkins at python.org (brian.curtin) Date: Wed, 01 Feb 2012 22:25:00 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=283=2E2=29=3A_Add_a_hint_that?= =?utf8?q?_CSD_=3D=3D_Service_Pack=2E?= Message-ID: http://hg.python.org/cpython/rev/fb225c289bf0 changeset: 74711:fb225c289bf0 branch: 3.2 parent: 74696:89b699e68fa2 user: Brian Curtin date: Wed Feb 01 15:14:00 2012 -0600 summary: Add a hint that CSD == Service Pack. People searcing for the way to get a "service pack" will never find that we provide it here, and people that find this function won't know what CSD is until they run the function. On top of this, they won't know what the value means unless they really have a service pack installed. CSD, or Customer Service Diagnostics, is apparently no longer used, and was rarely used term at that. Most references to it online are from universities making Windows 2000 and XP service packs available to students. files: Doc/library/platform.rst | 4 ++-- Lib/platform.py | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Doc/library/platform.rst b/Doc/library/platform.rst --- a/Doc/library/platform.rst +++ b/Doc/library/platform.rst @@ -188,8 +188,8 @@ .. function:: win32_ver(release='', version='', csd='', ptype='') Get additional version information from the Windows Registry and return a tuple - ``(version, csd, ptype)`` referring to version number, CSD level and OS type - (multi/single processor). + ``(version, csd, ptype)`` referring to version number, CSD level + (service pack) and OS type (multi/single processor). As a hint: *ptype* is ``'Uniprocessor Free'`` on single processor NT machines and ``'Multiprocessor Free'`` on multi processor machines. The *'Free'* refers diff --git a/Lib/platform.py b/Lib/platform.py --- a/Lib/platform.py +++ b/Lib/platform.py @@ -549,7 +549,7 @@ """ Get additional version information from the Windows Registry and return a tuple (version,csd,ptype) referring to version - number, CSD level and OS type (multi/single + number, CSD level (service pack), and OS type (multi/single processor). As a hint: ptype returns 'Uniprocessor Free' on single -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Feb 1 22:25:00 2012 From: python-checkins at python.org (brian.curtin) Date: Wed, 01 Feb 2012 22:25:00 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_3=2E2_-=3E_default=29?= =?utf8?q?=3A_merge_from_3=2E2?= Message-ID: http://hg.python.org/cpython/rev/8ff6930c6ea1 changeset: 74712:8ff6930c6ea1 parent: 74702:056f5cc8885d parent: 74711:fb225c289bf0 user: Brian Curtin date: Wed Feb 01 15:15:14 2012 -0600 summary: merge from 3.2 files: Doc/library/platform.rst | 4 ++-- Lib/platform.py | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Doc/library/platform.rst b/Doc/library/platform.rst --- a/Doc/library/platform.rst +++ b/Doc/library/platform.rst @@ -188,8 +188,8 @@ .. function:: win32_ver(release='', version='', csd='', ptype='') Get additional version information from the Windows Registry and return a tuple - ``(version, csd, ptype)`` referring to version number, CSD level and OS type - (multi/single processor). + ``(version, csd, ptype)`` referring to version number, CSD level + (service pack) and OS type (multi/single processor). As a hint: *ptype* is ``'Uniprocessor Free'`` on single processor NT machines and ``'Multiprocessor Free'`` on multi processor machines. The *'Free'* refers diff --git a/Lib/platform.py b/Lib/platform.py --- a/Lib/platform.py +++ b/Lib/platform.py @@ -475,7 +475,7 @@ """ Get additional version information from the Windows Registry and return a tuple (version,csd,ptype) referring to version - number, CSD level and OS type (multi/single + number, CSD level (service pack), and OS type (multi/single processor). As a hint: ptype returns 'Uniprocessor Free' on single -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Feb 1 22:25:01 2012 From: python-checkins at python.org (brian.curtin) Date: Wed, 01 Feb 2012 22:25:01 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=282=2E7=29=3A_merge_from_fb22?= =?utf8?q?5c289bf0?= Message-ID: http://hg.python.org/cpython/rev/822d362ab48f changeset: 74713:822d362ab48f branch: 2.7 parent: 74695:822d7a1f8885 user: Brian Curtin date: Wed Feb 01 15:17:39 2012 -0600 summary: merge from fb225c289bf0 files: Doc/library/platform.rst | 4 ++-- Lib/platform.py | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Doc/library/platform.rst b/Doc/library/platform.rst --- a/Doc/library/platform.rst +++ b/Doc/library/platform.rst @@ -197,8 +197,8 @@ .. function:: win32_ver(release='', version='', csd='', ptype='') Get additional version information from the Windows Registry and return a tuple - ``(version, csd, ptype)`` referring to version number, CSD level and OS type - (multi/single processor). + ``(version, csd, ptype)`` referring to version number, CSD level + (service pack) and OS type (multi/single processor). As a hint: *ptype* is ``'Uniprocessor Free'`` on single processor NT machines and ``'Multiprocessor Free'`` on multi processor machines. The *'Free'* refers diff --git a/Lib/platform.py b/Lib/platform.py --- a/Lib/platform.py +++ b/Lib/platform.py @@ -554,7 +554,7 @@ """ Get additional version information from the Windows Registry and return a tuple (version,csd,ptype) referring to version - number, CSD level and OS type (multi/single + number, CSD level (service pack), and OS type (multi/single processor). As a hint: ptype returns 'Uniprocessor Free' on single -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Feb 1 22:25:02 2012 From: python-checkins at python.org (brian.curtin) Date: Wed, 01 Feb 2012 22:25:02 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_default_-=3E_default?= =?utf8?q?=29=3A_merge_updates?= Message-ID: http://hg.python.org/cpython/rev/650be5ace87c changeset: 74714:650be5ace87c parent: 74712:8ff6930c6ea1 parent: 74710:6f4044afa600 user: Brian Curtin date: Wed Feb 01 15:20:03 2012 -0600 summary: merge updates files: Doc/library/itertools.rst | 5 +++ Lib/sqlite3/test/dbapi.py | 7 ++++ Lib/sqlite3/test/factory.py | 37 ++++++++++++++++++++++++- Misc/NEWS | 2 + Modules/_sqlite/cursor.c | 13 ++++---- Modules/_sqlite/statement.c | 4 +- 6 files changed, 59 insertions(+), 9 deletions(-) diff --git a/Doc/library/itertools.rst b/Doc/library/itertools.rst --- a/Doc/library/itertools.rst +++ b/Doc/library/itertools.rst @@ -534,6 +534,11 @@ for i in range(times): yield object + A common use for *repeat* is to supply a stream of constant values to *map* + or *zip*:: + + >>> list(map(pow, range(10), repeat(2))) + [0, 1, 4, 9, 16, 25, 36, 49, 64, 81] .. function:: starmap(function, iterable) diff --git a/Lib/sqlite3/test/dbapi.py b/Lib/sqlite3/test/dbapi.py --- a/Lib/sqlite3/test/dbapi.py +++ b/Lib/sqlite3/test/dbapi.py @@ -225,6 +225,13 @@ def CheckExecuteArgString(self): self.cu.execute("insert into test(name) values (?)", ("Hugo",)) + def CheckExecuteArgStringWithZeroByte(self): + self.cu.execute("insert into test(name) values (?)", ("Hu\x00go",)) + + self.cu.execute("select name from test where id=?", (self.cu.lastrowid,)) + row = self.cu.fetchone() + self.assertEqual(row[0], "Hu\x00go") + def CheckExecuteWrongNoOfArgs1(self): # too many parameters try: diff --git a/Lib/sqlite3/test/factory.py b/Lib/sqlite3/test/factory.py --- a/Lib/sqlite3/test/factory.py +++ b/Lib/sqlite3/test/factory.py @@ -189,13 +189,48 @@ def tearDown(self): self.con.close() +class TextFactoryTestsWithEmbeddedZeroBytes(unittest.TestCase): + def setUp(self): + self.con = sqlite.connect(":memory:") + self.con.execute("create table test (value text)") + self.con.execute("insert into test (value) values (?)", ("a\x00b",)) + + def CheckString(self): + # text_factory defaults to str + row = self.con.execute("select value from test").fetchone() + self.assertIs(type(row[0]), str) + self.assertEqual(row[0], "a\x00b") + + def CheckBytes(self): + self.con.text_factory = bytes + row = self.con.execute("select value from test").fetchone() + self.assertIs(type(row[0]), bytes) + self.assertEqual(row[0], b"a\x00b") + + def CheckBytearray(self): + self.con.text_factory = bytearray + row = self.con.execute("select value from test").fetchone() + self.assertIs(type(row[0]), bytearray) + self.assertEqual(row[0], b"a\x00b") + + def CheckCustom(self): + # A custom factory should receive a bytes argument + self.con.text_factory = lambda x: x + row = self.con.execute("select value from test").fetchone() + self.assertIs(type(row[0]), bytes) + self.assertEqual(row[0], b"a\x00b") + + def tearDown(self): + self.con.close() + def suite(): connection_suite = unittest.makeSuite(ConnectionFactoryTests, "Check") cursor_suite = unittest.makeSuite(CursorFactoryTests, "Check") row_suite_compat = unittest.makeSuite(RowFactoryTestsBackwardsCompat, "Check") row_suite = unittest.makeSuite(RowFactoryTests, "Check") text_suite = unittest.makeSuite(TextFactoryTests, "Check") - return unittest.TestSuite((connection_suite, cursor_suite, row_suite_compat, row_suite, text_suite)) + text_zero_bytes_suite = unittest.makeSuite(TextFactoryTestsWithEmbeddedZeroBytes, "Check") + return unittest.TestSuite((connection_suite, cursor_suite, row_suite_compat, row_suite, text_suite, text_zero_bytes_suite)) def test(): runner = unittest.TextTestRunner() diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -463,6 +463,8 @@ Library ------- +- 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. diff --git a/Modules/_sqlite/cursor.c b/Modules/_sqlite/cursor.c --- a/Modules/_sqlite/cursor.c +++ b/Modules/_sqlite/cursor.c @@ -267,9 +267,9 @@ } } -PyObject* pysqlite_unicode_from_string(const char* val_str, int optimize) +PyObject* pysqlite_unicode_from_string(const char* val_str, Py_ssize_t size, int optimize) { - return PyUnicode_FromString(val_str); + return PyUnicode_FromStringAndSize(val_str, size); } /* @@ -354,10 +354,11 @@ converted = PyFloat_FromDouble(sqlite3_column_double(self->statement->st, i)); } 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, + converted = pysqlite_unicode_from_string(val_str, nbytes, self->connection->text_factory == pysqlite_OptimizedUnicode ? 1 : 0); if (!converted) { @@ -382,11 +383,11 @@ } } } else if (self->connection->text_factory == (PyObject*)&PyBytes_Type) { - converted = PyBytes_FromString(val_str); + converted = PyBytes_FromStringAndSize(val_str, nbytes); } else if (self->connection->text_factory == (PyObject*)&PyByteArray_Type) { - converted = PyByteArray_FromStringAndSize(val_str, strlen(val_str)); + converted = PyByteArray_FromStringAndSize(val_str, nbytes); } else { - converted = PyObject_CallFunction(self->connection->text_factory, "y", val_str); + converted = PyObject_CallFunction(self->connection->text_factory, "y#", val_str, nbytes); } } else { /* coltype == SQLITE_BLOB */ diff --git a/Modules/_sqlite/statement.c b/Modules/_sqlite/statement.c --- a/Modules/_sqlite/statement.c +++ b/Modules/_sqlite/statement.c @@ -129,9 +129,9 @@ rc = sqlite3_bind_double(self->st, pos, PyFloat_AsDouble(parameter)); break; case TYPE_UNICODE: - string = _PyUnicode_AsString(parameter); + string = _PyUnicode_AsStringAndSize(parameter, &buflen); if (string != NULL) - rc = sqlite3_bind_text(self->st, pos, string, -1, SQLITE_TRANSIENT); + rc = sqlite3_bind_text(self->st, pos, string, buflen, SQLITE_TRANSIENT); else rc = -1; break; -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Feb 1 22:25:03 2012 From: python-checkins at python.org (brian.curtin) Date: Wed, 01 Feb 2012 22:25:03 +0100 Subject: [Python-checkins] =?utf8?b?Y3B5dGhvbiAobWVyZ2UgMi43IC0+IDIuNyk6?= =?utf8?q?_merge=2E?= Message-ID: http://hg.python.org/cpython/rev/2c3f5556128c changeset: 74715:2c3f5556128c branch: 2.7 parent: 74709:93ac4b12a750 parent: 74713:822d362ab48f user: Brian Curtin date: Wed Feb 01 15:22:50 2012 -0600 summary: merge. files: Doc/library/platform.rst | 4 ++-- Lib/platform.py | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Doc/library/platform.rst b/Doc/library/platform.rst --- a/Doc/library/platform.rst +++ b/Doc/library/platform.rst @@ -197,8 +197,8 @@ .. function:: win32_ver(release='', version='', csd='', ptype='') Get additional version information from the Windows Registry and return a tuple - ``(version, csd, ptype)`` referring to version number, CSD level and OS type - (multi/single processor). + ``(version, csd, ptype)`` referring to version number, CSD level + (service pack) and OS type (multi/single processor). As a hint: *ptype* is ``'Uniprocessor Free'`` on single processor NT machines and ``'Multiprocessor Free'`` on multi processor machines. The *'Free'* refers diff --git a/Lib/platform.py b/Lib/platform.py --- a/Lib/platform.py +++ b/Lib/platform.py @@ -554,7 +554,7 @@ """ Get additional version information from the Windows Registry and return a tuple (version,csd,ptype) referring to version - number, CSD level and OS type (multi/single + number, CSD level (service pack), and OS type (multi/single processor). As a hint: ptype returns 'Uniprocessor Free' on single -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Feb 1 22:25:03 2012 From: python-checkins at python.org (brian.curtin) Date: Wed, 01 Feb 2012 22:25:03 +0100 Subject: [Python-checkins] =?utf8?b?Y3B5dGhvbiAobWVyZ2UgMy4yIC0+IDMuMik6?= =?utf8?q?_merge=2E_again=2E?= Message-ID: http://hg.python.org/cpython/rev/c9bc33e124b8 changeset: 74716:c9bc33e124b8 branch: 3.2 parent: 74708:2e13011b3719 parent: 74711:fb225c289bf0 user: Brian Curtin date: Wed Feb 01 15:24:10 2012 -0600 summary: merge. again. files: Doc/library/platform.rst | 4 ++-- Lib/platform.py | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Doc/library/platform.rst b/Doc/library/platform.rst --- a/Doc/library/platform.rst +++ b/Doc/library/platform.rst @@ -188,8 +188,8 @@ .. function:: win32_ver(release='', version='', csd='', ptype='') Get additional version information from the Windows Registry and return a tuple - ``(version, csd, ptype)`` referring to version number, CSD level and OS type - (multi/single processor). + ``(version, csd, ptype)`` referring to version number, CSD level + (service pack) and OS type (multi/single processor). As a hint: *ptype* is ``'Uniprocessor Free'`` on single processor NT machines and ``'Multiprocessor Free'`` on multi processor machines. The *'Free'* refers diff --git a/Lib/platform.py b/Lib/platform.py --- a/Lib/platform.py +++ b/Lib/platform.py @@ -549,7 +549,7 @@ """ Get additional version information from the Windows Registry and return a tuple (version,csd,ptype) referring to version - number, CSD level and OS type (multi/single + number, CSD level (service pack), and OS type (multi/single processor). As a hint: ptype returns 'Uniprocessor Free' on single -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Feb 1 22:32:50 2012 From: python-checkins at python.org (raymond.hettinger) Date: Wed, 01 Feb 2012 22:32:50 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=282=2E7=29=3A_Show_the_import?= =?utf8?q?_in_the_sqlite3_example?= Message-ID: http://hg.python.org/cpython/rev/3a5c0f599aca changeset: 74717:3a5c0f599aca branch: 2.7 parent: 74715:2c3f5556128c user: Raymond Hettinger date: Wed Feb 01 13:32:45 2012 -0800 summary: Show the import in the sqlite3 example files: Doc/library/sqlite3.rst | 1 + 1 files changed, 1 insertions(+), 0 deletions(-) diff --git a/Doc/library/sqlite3.rst b/Doc/library/sqlite3.rst --- a/Doc/library/sqlite3.rst +++ b/Doc/library/sqlite3.rst @@ -22,6 +22,7 @@ represents the database. Here the data will be stored in the :file:`/tmp/example` file:: + import sqlite3 conn = sqlite3.connect('/tmp/example') You can also supply the special name ``:memory:`` to create a database in RAM. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Feb 1 22:41:14 2012 From: python-checkins at python.org (raymond.hettinger) Date: Wed, 01 Feb 2012 22:41:14 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=282=2E7=29=3A_Use_validate_SQ?= =?utf8?q?L_in_the_example_=28this_was_confusing_to_readers=29?= Message-ID: http://hg.python.org/cpython/rev/f8ecf10a7c73 changeset: 74718:f8ecf10a7c73 branch: 2.7 user: Raymond Hettinger date: Wed Feb 01 13:41:11 2012 -0800 summary: Use validate SQL in the example (this was confusing to readers) files: Doc/library/sqlite3.rst | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Doc/library/sqlite3.rst b/Doc/library/sqlite3.rst --- a/Doc/library/sqlite3.rst +++ b/Doc/library/sqlite3.rst @@ -59,7 +59,7 @@ # Never do this -- insecure! symbol = 'IBM' - c.execute("... where symbol = '%s'" % symbol) + c.execute("select * from stocks where symbol = '%s'" % symbol) # Do this instead t = (symbol,) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Feb 2 04:00:12 2012 From: python-checkins at python.org (raymond.hettinger) Date: Thu, 02 Feb 2012 04:00:12 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=282=2E7=29=3A_Clarify_the_not?= =?utf8?q?e_for_UserList?= Message-ID: http://hg.python.org/cpython/rev/1aa526414795 changeset: 74719:1aa526414795 branch: 2.7 user: Raymond Hettinger date: Wed Feb 01 19:00:09 2012 -0800 summary: Clarify the note for UserList files: Doc/library/userdict.rst | 15 ++++++++++++--- 1 files changed, 12 insertions(+), 3 deletions(-) diff --git a/Doc/library/userdict.rst b/Doc/library/userdict.rst --- a/Doc/library/userdict.rst +++ b/Doc/library/userdict.rst @@ -83,9 +83,18 @@ .. note:: - This module is available for backward compatibility only. If you are writing - code that does not need to work with versions of Python earlier than Python 2.2, - please consider subclassing directly from the built-in :class:`list` type. + When Python 2.2 was released, many of the use cases for this class were + subsumed by the ability to subclass :class:`list` directly. However, a + handful of use cases remain. + + This module provides a list-interface around an underlying data store. By + default, that data store is a :class:`list`; however, it can be used to wrap + a list-like interface around other objects (such as persistent storage). + + In addition, this class can be mixed-in with built-in classes using multiple + inheritance. This can sometimes be useful. For example, you can inherit + from :class:`UserList` and :class:`str` at the same time. That would not be + possible with both a real :class:`list` and a real :class:`str`. This module defines a class that acts as a wrapper around list objects. It is a useful base class for your own list-like classes, which can inherit from them -- Repository URL: http://hg.python.org/cpython From solipsis at pitrou.net Thu Feb 2 05:31:47 2012 From: solipsis at pitrou.net (solipsis at pitrou.net) Date: Thu, 02 Feb 2012 05:31:47 +0100 Subject: [Python-checkins] Daily reference leaks (650be5ace87c): sum=0 Message-ID: results for 650be5ace87c on branch "default" -------------------------------------------- Command line was: ['./python', '-m', 'test.regrtest', '-uall', '-R', '3:3:/home/antoine/cpython/refleaks/reflogVnNiJn', '-x'] From python-checkins at python.org Thu Feb 2 09:52:41 2012 From: python-checkins at python.org (raymond.hettinger) Date: Thu, 02 Feb 2012 09:52:41 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=282=2E7=29=3A_Add_pure_python?= =?utf8?q?_equivalent_code_for_reduce=28=29=2E?= Message-ID: http://hg.python.org/cpython/rev/ef770e20c7c3 changeset: 74720:ef770e20c7c3 branch: 2.7 user: Raymond Hettinger date: Thu Feb 02 00:48:46 2012 -0800 summary: Add pure python equivalent code for reduce(). files: Doc/library/functions.rst | 12 ++++++++++++ 1 files changed, 12 insertions(+), 0 deletions(-) diff --git a/Doc/library/functions.rst b/Doc/library/functions.rst --- a/Doc/library/functions.rst +++ b/Doc/library/functions.rst @@ -1058,7 +1058,19 @@ it is placed before the items of the iterable in the calculation, and serves as a default when the iterable is empty. If *initializer* is not given and *iterable* contains only one item, the first item is returned. + Roughly equivalent to:: + def reduce(function, iterable, initializer=None): + it = iter(iterable) + if initializer is None: + try: + initializer = next(it) + except StopIteration: + raise TypeError('reduce() of empty sequence with no initial value') + accum_value = initializer + for x in iterable: + accum_value = function(accum_value, x) + return accum_value .. function:: reload(module) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Feb 2 09:52:42 2012 From: python-checkins at python.org (raymond.hettinger) Date: Thu, 02 Feb 2012 09:52:42 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=282=2E7=29=3A_Clean-up_docs_f?= =?utf8?q?or_input=28=29?= Message-ID: http://hg.python.org/cpython/rev/98c574ba45fc changeset: 74721:98c574ba45fc branch: 2.7 user: Raymond Hettinger date: Thu Feb 02 00:52:33 2012 -0800 summary: Clean-up docs for input() files: Doc/library/functions.rst | 9 +++------ 1 files changed, 3 insertions(+), 6 deletions(-) diff --git a/Doc/library/functions.rst b/Doc/library/functions.rst --- a/Doc/library/functions.rst +++ b/Doc/library/functions.rst @@ -592,12 +592,9 @@ Equivalent to ``eval(raw_input(prompt))``. - .. note:: - - This function does not catch user errors. It expects a valid Python - expression as input. If the input is not syntactically valid, a - :exc:`SyntaxError` will be raised. Other exceptions may be raised if there - is an error during evaluation. + This function does not catch user errors. If the input is not syntactically + valid, a :exc:`SyntaxError` will be raised. Other exceptions may be raised if + there is an error during evaluation. If the :mod:`readline` module was loaded, then :func:`input` will use it to provide elaborate line editing and history features. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Feb 2 16:59:58 2012 From: python-checkins at python.org (stefan.krah) Date: Thu, 02 Feb 2012 16:59:58 +0100 Subject: [Python-checkins] =?utf8?b?Y3B5dGhvbiAoMy4yKTogSXNzdWUgIzE4MTM6?= =?utf8?q?_Revert_workaround_for_a_glibc_bug_on_the_Fedora_buildbot=2E?= Message-ID: http://hg.python.org/cpython/rev/a55ffb6c1993 changeset: 74722:a55ffb6c1993 branch: 3.2 parent: 74716:c9bc33e124b8 user: Stefan Krah date: Thu Feb 02 16:40:52 2012 +0100 summary: Issue #1813: Revert workaround for a glibc bug on the Fedora buildbot. files: Lib/test/test_locale.py | 3 --- 1 files changed, 0 insertions(+), 3 deletions(-) diff --git a/Lib/test/test_locale.py b/Lib/test/test_locale.py --- a/Lib/test/test_locale.py +++ b/Lib/test/test_locale.py @@ -1,5 +1,4 @@ from test.support import run_unittest, verbose -from platform import linux_distribution import unittest import locale import sys @@ -392,8 +391,6 @@ # crasher from bug #7419 self.assertRaises(locale.Error, locale.setlocale, 12345) - @unittest.skipIf(linux_distribution()[0] == 'Fedora', "Fedora setlocale() " - "bug: https://bugzilla.redhat.com/show_bug.cgi?id=726536") def test_getsetlocale_issue1813(self): # Issue #1813: setting and getting the locale under a Turkish locale oldlocale = locale.setlocale(locale.LC_CTYPE) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Feb 2 16:59:59 2012 From: python-checkins at python.org (stefan.krah) Date: Thu, 02 Feb 2012 16:59:59 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_3=2E2_-=3E_default=29?= =?utf8?q?=3A_Issue_=231813=3A_merge_changeset_that_reverts_a_glibc_workar?= =?utf8?q?ound_for_the?= Message-ID: http://hg.python.org/cpython/rev/4244e4348362 changeset: 74723:4244e4348362 parent: 74714:650be5ace87c parent: 74722:a55ffb6c1993 user: Stefan Krah date: Thu Feb 02 16:50:10 2012 +0100 summary: Issue #1813: merge changeset that reverts a glibc workaround for the Fedora buildbot. files: Lib/test/test_locale.py | 3 --- 1 files changed, 0 insertions(+), 3 deletions(-) diff --git a/Lib/test/test_locale.py b/Lib/test/test_locale.py --- a/Lib/test/test_locale.py +++ b/Lib/test/test_locale.py @@ -1,5 +1,4 @@ from test.support import run_unittest, verbose -from platform import linux_distribution import unittest import locale import sys @@ -392,8 +391,6 @@ # crasher from bug #7419 self.assertRaises(locale.Error, locale.setlocale, 12345) - @unittest.skipIf(linux_distribution()[0] == 'Fedora', "Fedora setlocale() " - "bug: https://bugzilla.redhat.com/show_bug.cgi?id=726536") def test_getsetlocale_issue1813(self): # Issue #1813: setting and getting the locale under a Turkish locale oldlocale = locale.setlocale(locale.LC_CTYPE) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Feb 2 17:00:00 2012 From: python-checkins at python.org (stefan.krah) Date: Thu, 02 Feb 2012 17:00:00 +0100 Subject: [Python-checkins] =?utf8?b?Y3B5dGhvbiAoMi43KTogSXNzdWUgIzE4MTM6?= =?utf8?q?_backport_changeset_that_reverts_a_glibc_workaround_for_the?= Message-ID: http://hg.python.org/cpython/rev/0b8917fc6db5 changeset: 74724:0b8917fc6db5 branch: 2.7 parent: 74721:98c574ba45fc user: Stefan Krah date: Thu Feb 02 16:57:49 2012 +0100 summary: Issue #1813: backport changeset that reverts a glibc workaround for the Fedora buildbot. files: Lib/test/test_locale.py | 3 --- 1 files changed, 0 insertions(+), 3 deletions(-) diff --git a/Lib/test/test_locale.py b/Lib/test/test_locale.py --- a/Lib/test/test_locale.py +++ b/Lib/test/test_locale.py @@ -1,5 +1,4 @@ from test.test_support import run_unittest, verbose -from platform import linux_distribution import unittest import locale import sys @@ -397,8 +396,6 @@ # crasher from bug #7419 self.assertRaises(locale.Error, locale.setlocale, 12345) - @unittest.skipIf(linux_distribution()[0] == 'Fedora', "Fedora setlocale() " - "bug: https://bugzilla.redhat.com/show_bug.cgi?id=726536") def test_getsetlocale_issue1813(self): # Issue #1813: setting and getting the locale under a Turkish locale oldlocale = locale.getlocale() -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Feb 2 20:30:21 2012 From: python-checkins at python.org (petri.lehtinen) Date: Thu, 02 Feb 2012 20:30:21 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=283=2E2=29=3A_Document_absolu?= =?utf8?q?teness_of_sys=2Eexecutable?= Message-ID: http://hg.python.org/cpython/rev/fdcda5b74317 changeset: 74725:fdcda5b74317 branch: 3.2 parent: 74722:a55ffb6c1993 user: Petri Lehtinen date: Thu Feb 02 20:59:48 2012 +0200 summary: Document absoluteness of sys.executable Closes #13402. files: Doc/library/sys.rst | 6 ++++-- Lib/test/test_sys.py | 3 +++ Misc/NEWS | 2 ++ Python/sysmodule.c | 2 +- 4 files changed, 10 insertions(+), 3 deletions(-) diff --git a/Doc/library/sys.rst b/Doc/library/sys.rst --- a/Doc/library/sys.rst +++ b/Doc/library/sys.rst @@ -202,8 +202,10 @@ .. data:: executable - A string giving the name of the executable binary for the Python interpreter, on - systems where this makes sense. + A string giving the absolute path of the executable binary for the Python + interpreter, on systems where this makes sense. If Python is unable to retrieve + the real path to its executable, :data:`sys.executable` will be an empty string + or ``None``. .. function:: exit([arg]) diff --git a/Lib/test/test_sys.py b/Lib/test/test_sys.py --- a/Lib/test/test_sys.py +++ b/Lib/test/test_sys.py @@ -532,6 +532,9 @@ self.assertEqual(out, b'?') def test_executable(self): + # sys.executable should be absolute + self.assertEqual(os.path.abspath(sys.executable), sys.executable) + # Issue #7774: Ensure that sys.executable is 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 diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -454,6 +454,8 @@ Documentation ------------- +- Issue #13402: Document absoluteness of sys.executable. + - Issue #13883: PYTHONCASEOK also used on OS X and OS/2. - Issue #12949: Document the kwonlyargcount argument for the PyCode_New diff --git a/Python/sysmodule.c b/Python/sysmodule.c --- a/Python/sysmodule.c +++ b/Python/sysmodule.c @@ -1263,7 +1263,7 @@ hexversion -- version information encoded as a single integer\n\ copyright -- copyright notice pertaining to this interpreter\n\ platform -- platform identifier\n\ -executable -- pathname of this Python interpreter\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\ float_repr_style -- string indicating the style of repr() output for floats\n\ -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Feb 2 20:30:25 2012 From: python-checkins at python.org (petri.lehtinen) Date: Thu, 02 Feb 2012 20:30:25 +0100 Subject: [Python-checkins] =?utf8?q?cpython=3A_Make_sqlite3_tests_editable?= =?utf8?q?_with_Emacs?= Message-ID: http://hg.python.org/cpython/rev/d2ab2e4ce3ae changeset: 74726:d2ab2e4ce3ae parent: 74723:4244e4348362 user: Petri Lehtinen date: Thu Feb 02 17:17:36 2012 +0200 summary: Make sqlite3 tests editable with Emacs Change the coding declaration from ISO-8859-1 to iso-8859-1. Emacs doesn't understand the former. files: Lib/sqlite3/test/dbapi.py | 2 +- Lib/sqlite3/test/factory.py | 2 +- Lib/sqlite3/test/hooks.py | 2 +- Lib/sqlite3/test/regression.py | 2 +- Lib/sqlite3/test/transactions.py | 2 +- Lib/sqlite3/test/types.py | 2 +- Lib/sqlite3/test/userfunctions.py | 2 +- 7 files changed, 7 insertions(+), 7 deletions(-) diff --git a/Lib/sqlite3/test/dbapi.py b/Lib/sqlite3/test/dbapi.py --- 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 diff --git a/Lib/sqlite3/test/factory.py b/Lib/sqlite3/test/factory.py --- 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 diff --git a/Lib/sqlite3/test/hooks.py b/Lib/sqlite3/test/hooks.py --- 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 diff --git a/Lib/sqlite3/test/regression.py b/Lib/sqlite3/test/regression.py --- 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 diff --git a/Lib/sqlite3/test/transactions.py b/Lib/sqlite3/test/transactions.py --- 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 diff --git a/Lib/sqlite3/test/types.py b/Lib/sqlite3/test/types.py --- 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 diff --git a/Lib/sqlite3/test/userfunctions.py b/Lib/sqlite3/test/userfunctions.py --- 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. # -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Feb 2 20:30:26 2012 From: python-checkins at python.org (petri.lehtinen) Date: Thu, 02 Feb 2012 20:30:26 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_3=2E2_-=3E_default=29?= =?utf8?q?=3A_Merge_branch_3=2E2?= Message-ID: http://hg.python.org/cpython/rev/8b591a86fc91 changeset: 74727:8b591a86fc91 parent: 74726:d2ab2e4ce3ae parent: 74725:fdcda5b74317 user: Petri Lehtinen date: Thu Feb 02 21:23:15 2012 +0200 summary: Merge branch 3.2 Closes #13402. files: Doc/library/sys.rst | 6 ++++-- Lib/test/test_sys.py | 3 +++ Misc/NEWS | 2 ++ Python/sysmodule.c | 2 +- 4 files changed, 10 insertions(+), 3 deletions(-) diff --git a/Doc/library/sys.rst b/Doc/library/sys.rst --- a/Doc/library/sys.rst +++ b/Doc/library/sys.rst @@ -202,8 +202,10 @@ .. data:: executable - A string giving the name of the executable binary for the Python interpreter, on - systems where this makes sense. + A string giving the absolute path of the executable binary for the Python + interpreter, on systems where this makes sense. If Python is unable to retrieve + the real path to its executable, :data:`sys.executable` will be an empty string + or ``None``. .. function:: exit([arg]) diff --git a/Lib/test/test_sys.py b/Lib/test/test_sys.py --- a/Lib/test/test_sys.py +++ b/Lib/test/test_sys.py @@ -542,6 +542,9 @@ self.assertEqual(out, b'?') def test_executable(self): + # sys.executable should be absolute + self.assertEqual(os.path.abspath(sys.executable), sys.executable) + # Issue #7774: Ensure that sys.executable is 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 diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -2147,6 +2147,8 @@ Documentation ------------- +- Issue #13402: Document absoluteness of sys.executable. + - Issue #13883: PYTHONCASEOK also works on OS X. - Issue #12949: Document the kwonlyargcount argument for the PyCode_New diff --git a/Python/sysmodule.c b/Python/sysmodule.c --- a/Python/sysmodule.c +++ b/Python/sysmodule.c @@ -1257,7 +1257,7 @@ builtin_module_names -- tuple of module names built into this interpreter\n\ copyright -- copyright notice pertaining to this interpreter\n\ exec_prefix -- prefix used to find the machine-specific Python library\n\ -executable -- pathname of this Python interpreter\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\ -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Feb 2 20:30:29 2012 From: python-checkins at python.org (petri.lehtinen) Date: Thu, 02 Feb 2012 20:30:29 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=282=2E7=29=3A_Document_absolu?= =?utf8?q?teness_of_sys=2Eexecutable?= Message-ID: http://hg.python.org/cpython/rev/c351536e804a changeset: 74728:c351536e804a branch: 2.7 parent: 74724:0b8917fc6db5 user: Petri Lehtinen date: Thu Feb 02 21:11:28 2012 +0200 summary: Document absoluteness of sys.executable Closes #13402. files: Doc/library/sys.rst | 6 ++++-- Lib/test/test_sys.py | 3 +++ Misc/NEWS | 2 ++ Python/sysmodule.c | 2 +- 4 files changed, 10 insertions(+), 3 deletions(-) diff --git a/Doc/library/sys.rst b/Doc/library/sys.rst --- a/Doc/library/sys.rst +++ b/Doc/library/sys.rst @@ -215,8 +215,10 @@ .. data:: executable - A string giving the name of the executable binary for the Python interpreter, on - systems where this makes sense. + A string giving the absolute path of the executable binary for the Python + interpreter, on systems where this makes sense. If Python is unable to retrieve + the real path to its executable, :data:`sys.executable` will be an empty string + or ``None``. .. function:: exit([arg]) diff --git a/Lib/test/test_sys.py b/Lib/test/test_sys.py --- a/Lib/test/test_sys.py +++ b/Lib/test/test_sys.py @@ -471,6 +471,9 @@ self.assertRaises(TypeError, sys.call_tracing, str, 2) def test_executable(self): + # sys.executable should be absolute + self.assertEqual(os.path.abspath(sys.executable), sys.executable) + # Issue #7774: Ensure that sys.executable is 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 diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -509,6 +509,8 @@ Documentation ------------- +- Issue #13402: Document absoluteness of sys.executable. + - Issue #13883: PYTHONCASEOK also works on OS X, OS/2, and RiscOS. - Issue #2134: The tokenize documentation has been clarified to explain why diff --git a/Python/sysmodule.c b/Python/sysmodule.c --- a/Python/sysmodule.c +++ b/Python/sysmodule.c @@ -1093,7 +1093,7 @@ hexversion -- version information encoded as a single integer\n\ copyright -- copyright notice pertaining to this interpreter\n\ platform -- platform identifier\n\ -executable -- pathname of this Python interpreter\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\ float_repr_style -- string indicating the style of repr() output for floats\n\ -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Feb 2 20:39:17 2012 From: python-checkins at python.org (charles-francois.natali) Date: Thu, 02 Feb 2012 20:39:17 +0100 Subject: [Python-checkins] =?utf8?b?Y3B5dGhvbiAoMi43KTogSXNzdWUgIzEzODE3?= =?utf8?q?=3A_After_fork=28=29=2C_reinit_the_ad-hoc_TLS_implementation_ear?= =?utf8?q?lier_to_fix?= Message-ID: http://hg.python.org/cpython/rev/c3649173d093 changeset: 74729:c3649173d093 branch: 2.7 parent: 74724:0b8917fc6db5 user: Charles-Fran?ois Natali date: Thu Feb 02 19:57:19 2012 +0100 summary: Issue #13817: After fork(), reinit the ad-hoc TLS implementation earlier to fix a random deadlock when fork() is called in a multithreaded process in debug mode, and make PyOS_AfterFork() more robust. files: Lib/test/test_threading.py | 23 +++++++++++++++++++++++ Modules/signalmodule.c | 4 +++- 2 files changed, 26 insertions(+), 1 deletions(-) diff --git a/Lib/test/test_threading.py b/Lib/test/test_threading.py --- a/Lib/test/test_threading.py +++ b/Lib/test/test_threading.py @@ -635,6 +635,29 @@ output = "end of worker thread\nend of main thread\n" self.assertScriptHasOutput(script, output) + @unittest.skipUnless(hasattr(os, 'fork'), "needs os.fork()") + def test_reinit_tls_after_fork(self): + # Issue #13817: fork() would deadlock in a multithreaded program with + # the ad-hoc TLS implementation. + + def do_fork_and_wait(): + # just fork a child process and wait it + pid = os.fork() + if pid > 0: + os.waitpid(pid, 0) + else: + os._exit(0) + + # start a bunch of threads that will fork() child processes + threads = [] + for i in range(16): + t = threading.Thread(target=do_fork_and_wait) + threads.append(t) + t.start() + + for t in threads: + t.join() + class ThreadingExceptionTests(BaseTestCase): # A RuntimeError should be raised if Thread.start() is called diff --git a/Modules/signalmodule.c b/Modules/signalmodule.c --- a/Modules/signalmodule.c +++ b/Modules/signalmodule.c @@ -976,10 +976,12 @@ PyOS_AfterFork(void) { #ifdef WITH_THREAD + /* PyThread_ReInitTLS() must be called early, to make sure that the TLS API + * can be called safely. */ + PyThread_ReInitTLS(); PyEval_ReInitThreads(); main_thread = PyThread_get_thread_ident(); main_pid = getpid(); _PyImport_ReInitLock(); - PyThread_ReInitTLS(); #endif } -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Feb 2 20:39:18 2012 From: python-checkins at python.org (charles-francois.natali) Date: Thu, 02 Feb 2012 20:39:18 +0100 Subject: [Python-checkins] =?utf8?b?Y3B5dGhvbiAoMy4yKTogSXNzdWUgIzEzODE3?= =?utf8?q?=3A_After_fork=28=29=2C_reinit_the_ad-hoc_TLS_implementation_ear?= =?utf8?q?lier_to_fix?= Message-ID: http://hg.python.org/cpython/rev/7b24dd587a7b changeset: 74730:7b24dd587a7b branch: 3.2 parent: 74722:a55ffb6c1993 user: Charles-Fran?ois Natali date: Thu Feb 02 20:31:42 2012 +0100 summary: Issue #13817: After fork(), reinit the ad-hoc TLS implementation earlier to fix a random deadlock when fork() is called in a multithreaded process in debug mode, and make PyOS_AfterFork() more robust. files: Lib/test/test_threading.py | 23 +++++++++++++++++++++++ Modules/signalmodule.c | 4 +++- 2 files changed, 26 insertions(+), 1 deletions(-) diff --git a/Lib/test/test_threading.py b/Lib/test/test_threading.py --- a/Lib/test/test_threading.py +++ b/Lib/test/test_threading.py @@ -666,6 +666,29 @@ rc, out, err = assert_python_ok('-c', script) self.assertFalse(err) + @unittest.skipUnless(hasattr(os, 'fork'), "needs os.fork()") + def test_reinit_tls_after_fork(self): + # Issue #13817: fork() would deadlock in a multithreaded program with + # the ad-hoc TLS implementation. + + def do_fork_and_wait(): + # just fork a child process and wait it + pid = os.fork() + if pid > 0: + os.waitpid(pid, 0) + else: + os._exit(0) + + # start a bunch of threads that will fork() child processes + threads = [] + for i in range(16): + t = threading.Thread(target=do_fork_and_wait) + threads.append(t) + t.start() + + for t in threads: + t.join() + class ThreadingExceptionTests(BaseTestCase): # A RuntimeError should be raised if Thread.start() is called diff --git a/Modules/signalmodule.c b/Modules/signalmodule.c --- a/Modules/signalmodule.c +++ b/Modules/signalmodule.c @@ -991,11 +991,13 @@ PyOS_AfterFork(void) { #ifdef WITH_THREAD + /* PyThread_ReInitTLS() must be called early, to make sure that the TLS API + * can be called safely. */ + PyThread_ReInitTLS(); _PyGILState_Reinit(); PyEval_ReInitThreads(); main_thread = PyThread_get_thread_ident(); main_pid = getpid(); _PyImport_ReInitLock(); - PyThread_ReInitTLS(); #endif } -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Feb 2 20:39:18 2012 From: python-checkins at python.org (charles-francois.natali) Date: Thu, 02 Feb 2012 20:39:18 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_3=2E2_-=3E_default=29?= =?utf8?q?=3A_Issue_=2313817=3A_After_fork=28=29=2C_reinit_the_ad-hoc_TLS_?= =?utf8?q?implementation_earlier_to_fix?= Message-ID: http://hg.python.org/cpython/rev/a0100852b6fe changeset: 74731:a0100852b6fe parent: 74723:4244e4348362 parent: 74730:7b24dd587a7b user: Charles-Fran?ois Natali date: Thu Feb 02 20:32:48 2012 +0100 summary: Issue #13817: After fork(), reinit the ad-hoc TLS implementation earlier to fix a random deadlock when fork() is called in a multithreaded process in debug mode, and make PyOS_AfterFork() more robust. files: Lib/test/test_threading.py | 23 +++++++++++++++++++++++ Modules/signalmodule.c | 4 +++- 2 files changed, 26 insertions(+), 1 deletions(-) diff --git a/Lib/test/test_threading.py b/Lib/test/test_threading.py --- a/Lib/test/test_threading.py +++ b/Lib/test/test_threading.py @@ -674,6 +674,29 @@ rc, out, err = assert_python_ok('-c', script) self.assertFalse(err) + @unittest.skipUnless(hasattr(os, 'fork'), "needs os.fork()") + def test_reinit_tls_after_fork(self): + # Issue #13817: fork() would deadlock in a multithreaded program with + # the ad-hoc TLS implementation. + + def do_fork_and_wait(): + # just fork a child process and wait it + pid = os.fork() + if pid > 0: + os.waitpid(pid, 0) + else: + os._exit(0) + + # start a bunch of threads that will fork() child processes + threads = [] + for i in range(16): + t = threading.Thread(target=do_fork_and_wait) + threads.append(t) + t.start() + + for t in threads: + t.join() + class ThreadingExceptionTests(BaseTestCase): # A RuntimeError should be raised if Thread.start() is called diff --git a/Modules/signalmodule.c b/Modules/signalmodule.c --- a/Modules/signalmodule.c +++ b/Modules/signalmodule.c @@ -1403,12 +1403,14 @@ PyOS_AfterFork(void) { #ifdef WITH_THREAD + /* PyThread_ReInitTLS() must be called early, to make sure that the TLS API + * can be called safely. */ + PyThread_ReInitTLS(); _PyGILState_Reinit(); PyEval_ReInitThreads(); main_thread = PyThread_get_thread_ident(); main_pid = getpid(); _PyImport_ReInitLock(); - PyThread_ReInitTLS(); #endif } -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Feb 2 20:39:19 2012 From: python-checkins at python.org (charles-francois.natali) Date: Thu, 02 Feb 2012 20:39:19 +0100 Subject: [Python-checkins] =?utf8?b?Y3B5dGhvbiAobWVyZ2UgMi43IC0+IDIuNyk6?= =?utf8?q?_Merge=2E?= Message-ID: http://hg.python.org/cpython/rev/4c93ef04eff5 changeset: 74732:4c93ef04eff5 branch: 2.7 parent: 74728:c351536e804a parent: 74729:c3649173d093 user: Charles-Fran?ois Natali date: Thu Feb 02 20:36:47 2012 +0100 summary: Merge. files: Lib/test/test_threading.py | 23 +++++++++++++++++++++++ Modules/signalmodule.c | 4 +++- 2 files changed, 26 insertions(+), 1 deletions(-) diff --git a/Lib/test/test_threading.py b/Lib/test/test_threading.py --- a/Lib/test/test_threading.py +++ b/Lib/test/test_threading.py @@ -635,6 +635,29 @@ output = "end of worker thread\nend of main thread\n" self.assertScriptHasOutput(script, output) + @unittest.skipUnless(hasattr(os, 'fork'), "needs os.fork()") + def test_reinit_tls_after_fork(self): + # Issue #13817: fork() would deadlock in a multithreaded program with + # the ad-hoc TLS implementation. + + def do_fork_and_wait(): + # just fork a child process and wait it + pid = os.fork() + if pid > 0: + os.waitpid(pid, 0) + else: + os._exit(0) + + # start a bunch of threads that will fork() child processes + threads = [] + for i in range(16): + t = threading.Thread(target=do_fork_and_wait) + threads.append(t) + t.start() + + for t in threads: + t.join() + class ThreadingExceptionTests(BaseTestCase): # A RuntimeError should be raised if Thread.start() is called diff --git a/Modules/signalmodule.c b/Modules/signalmodule.c --- a/Modules/signalmodule.c +++ b/Modules/signalmodule.c @@ -976,10 +976,12 @@ PyOS_AfterFork(void) { #ifdef WITH_THREAD + /* PyThread_ReInitTLS() must be called early, to make sure that the TLS API + * can be called safely. */ + PyThread_ReInitTLS(); PyEval_ReInitThreads(); main_thread = PyThread_get_thread_ident(); main_pid = getpid(); _PyImport_ReInitLock(); - PyThread_ReInitTLS(); #endif } -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Feb 2 20:39:20 2012 From: python-checkins at python.org (charles-francois.natali) Date: Thu, 02 Feb 2012 20:39:20 +0100 Subject: [Python-checkins] =?utf8?b?Y3B5dGhvbiAobWVyZ2UgMy4yIC0+IDMuMik6?= =?utf8?q?_Merge=2E?= Message-ID: http://hg.python.org/cpython/rev/5727d3398996 changeset: 74733:5727d3398996 branch: 3.2 parent: 74725:fdcda5b74317 parent: 74730:7b24dd587a7b user: Charles-Fran?ois Natali date: Thu Feb 02 20:37:29 2012 +0100 summary: Merge. files: Lib/test/test_threading.py | 23 +++++++++++++++++++++++ Modules/signalmodule.c | 4 +++- 2 files changed, 26 insertions(+), 1 deletions(-) diff --git a/Lib/test/test_threading.py b/Lib/test/test_threading.py --- a/Lib/test/test_threading.py +++ b/Lib/test/test_threading.py @@ -666,6 +666,29 @@ rc, out, err = assert_python_ok('-c', script) self.assertFalse(err) + @unittest.skipUnless(hasattr(os, 'fork'), "needs os.fork()") + def test_reinit_tls_after_fork(self): + # Issue #13817: fork() would deadlock in a multithreaded program with + # the ad-hoc TLS implementation. + + def do_fork_and_wait(): + # just fork a child process and wait it + pid = os.fork() + if pid > 0: + os.waitpid(pid, 0) + else: + os._exit(0) + + # start a bunch of threads that will fork() child processes + threads = [] + for i in range(16): + t = threading.Thread(target=do_fork_and_wait) + threads.append(t) + t.start() + + for t in threads: + t.join() + class ThreadingExceptionTests(BaseTestCase): # A RuntimeError should be raised if Thread.start() is called diff --git a/Modules/signalmodule.c b/Modules/signalmodule.c --- a/Modules/signalmodule.c +++ b/Modules/signalmodule.c @@ -991,11 +991,13 @@ PyOS_AfterFork(void) { #ifdef WITH_THREAD + /* PyThread_ReInitTLS() must be called early, to make sure that the TLS API + * can be called safely. */ + PyThread_ReInitTLS(); _PyGILState_Reinit(); PyEval_ReInitThreads(); main_thread = PyThread_get_thread_ident(); main_pid = getpid(); _PyImport_ReInitLock(); - PyThread_ReInitTLS(); #endif } -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Feb 2 20:39:21 2012 From: python-checkins at python.org (charles-francois.natali) Date: Thu, 02 Feb 2012 20:39:21 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_3=2E2_-=3E_default=29?= =?utf8?q?=3A_Merge=2E?= Message-ID: http://hg.python.org/cpython/rev/14eaa5970500 changeset: 74734:14eaa5970500 parent: 74727:8b591a86fc91 parent: 74733:5727d3398996 user: Charles-Fran?ois Natali date: Thu Feb 02 20:38:10 2012 +0100 summary: Merge. files: Lib/test/test_threading.py | 23 +++++++++++++++++++++++ Modules/signalmodule.c | 4 +++- 2 files changed, 26 insertions(+), 1 deletions(-) diff --git a/Lib/test/test_threading.py b/Lib/test/test_threading.py --- a/Lib/test/test_threading.py +++ b/Lib/test/test_threading.py @@ -674,6 +674,29 @@ rc, out, err = assert_python_ok('-c', script) self.assertFalse(err) + @unittest.skipUnless(hasattr(os, 'fork'), "needs os.fork()") + def test_reinit_tls_after_fork(self): + # Issue #13817: fork() would deadlock in a multithreaded program with + # the ad-hoc TLS implementation. + + def do_fork_and_wait(): + # just fork a child process and wait it + pid = os.fork() + if pid > 0: + os.waitpid(pid, 0) + else: + os._exit(0) + + # start a bunch of threads that will fork() child processes + threads = [] + for i in range(16): + t = threading.Thread(target=do_fork_and_wait) + threads.append(t) + t.start() + + for t in threads: + t.join() + class ThreadingExceptionTests(BaseTestCase): # A RuntimeError should be raised if Thread.start() is called diff --git a/Modules/signalmodule.c b/Modules/signalmodule.c --- a/Modules/signalmodule.c +++ b/Modules/signalmodule.c @@ -1403,12 +1403,14 @@ PyOS_AfterFork(void) { #ifdef WITH_THREAD + /* PyThread_ReInitTLS() must be called early, to make sure that the TLS API + * can be called safely. */ + PyThread_ReInitTLS(); _PyGILState_Reinit(); PyEval_ReInitThreads(); main_thread = PyThread_get_thread_ident(); main_pid = getpid(); _PyImport_ReInitLock(); - PyThread_ReInitTLS(); #endif } -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Feb 2 20:39:24 2012 From: python-checkins at python.org (charles-francois.natali) Date: Thu, 02 Feb 2012 20:39:24 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_default_-=3E_default?= =?utf8?q?=29=3A_Null_merge=2E?= Message-ID: http://hg.python.org/cpython/rev/347847f68df7 changeset: 74735:347847f68df7 parent: 74734:14eaa5970500 parent: 74731:a0100852b6fe user: Charles-Fran?ois Natali date: Thu Feb 02 20:38:46 2012 +0100 summary: Null merge. files: -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Feb 2 22:22:21 2012 From: python-checkins at python.org (georg.brandl) Date: Thu, 02 Feb 2012 22:22:21 +0100 Subject: [Python-checkins] =?utf8?q?cpython=3A_Fix_small_grammatical_incon?= =?utf8?q?sistency=2E?= Message-ID: http://hg.python.org/cpython/rev/55bbcbc48683 changeset: 74736:55bbcbc48683 user: Georg Brandl date: Thu Feb 02 22:22:19 2012 +0100 summary: Fix small grammatical inconsistency. files: Doc/library/time.rst | 3 ++- 1 files changed, 2 insertions(+), 1 deletions(-) diff --git a/Doc/library/time.rst b/Doc/library/time.rst --- a/Doc/library/time.rst +++ b/Doc/library/time.rst @@ -115,7 +115,8 @@ .. 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() -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Fri Feb 3 01:05:57 2012 From: python-checkins at python.org (victor.stinner) Date: Fri, 03 Feb 2012 01:05:57 +0100 Subject: [Python-checkins] =?utf8?q?peps=3A_Add_PEP_410=3A_Use_decimal=2ED?= =?utf8?q?ecimal_type_for_timestamps?= Message-ID: http://hg.python.org/peps/rev/c736e4cce278 changeset: 4030:c736e4cce278 user: Victor Stinner date: Fri Feb 03 01:06:18 2012 +0100 summary: Add PEP 410: Use decimal.Decimal type for timestamps files: pep-0410.txt | 260 +++++++++++++++++++++++++++++++++++++++ 1 files changed, 260 insertions(+), 0 deletions(-) diff --git a/pep-0410.txt b/pep-0410.txt new file mode 100644 --- /dev/null +++ b/pep-0410.txt @@ -0,0 +1,260 @@ +PEP: 410 +Title: Use decimal.Decimal type for timestamps +Version: $Revision$ +Last-Modified: $Date$ +Author: Victor Stinner +Status: Draft +Type: Standards Track +Content-Type: text/x-rst +Created: 01-Feburary-2012 +Python-Version: 3.3 + + +Abstract +======== + +Python 3.3 introduced functions supporting nanosecond resolutions. Python 3.3 +only supports int or float to store timestamps, but these types cannot be use +to store a timestamp with a nanosecond resolution. + + +Motivation +========== + +Python 2.3 introduced float timestamps to support subsecond resolutions. +os.stat() uses float timestamps by default since Python 2.5. + +Python 3.3 introduced functions supporting nanosecond resolutions: + + * os module: stat(), utimensat(), futimens() + * time module: clock_gettime(), clock_getres(), wallclock() + +The Python float type uses binary64 format of the IEEE 754 standard. With a +resolution of 1 nanosecond (10^-9), float timestamps lose precision for values +bigger than 2^24 seconds (194 days: 1970-07-14 for an Epoch timestamp). + +.. note:: + With a resolution of 1 microsecond (10^-6), float timestamps lose precision + for values bigger than 2^33 seconds (272 years: 2242-03-16 for an Epoch + timestamp). + + +Specification +============= + +Add decimal.Decimal as a new type for timestamps. Add a *timestamp* optional +argument to: + + * os module: fstat(), fstatat(), lstat() and stat() + * time module: clock(), clock_gettime(), clock_getres(), time() and + wallclock() + +The *timestamp* argument is a type, there are three supported types: + + * int + * float + * decimal.Decimal + +The float type is still used by default for backward compatibility. + +Support decimal.Decimal (without implicit conversion to float to avoid lose of +precision) in functions having timestamp arguments: + + * datetime.datetime.fromtimestamp() + * time.gmtime(), time.localtime() + * os.utimensat(), os.futimens() + + +Backwards Compatibility +======================= + +The default timestamp type is unchanged, so there is no impact of backwad +compatibility, nor impact on performances. The new timestamp type, +decimal.Decimal, is only used when requested explicitly. + + +Alternatives: Timestamp types +============================= + +To support timestamps with a nanosecond resolution, five types were considered: + + * 128 bits float + * decimal.Decimal + * datetime.datetime + * datetime.timedelta + * tuple of integers + +Criteria: + + * Doing arithmetic on timestamps must be possible. + * Timestamps must be comparable. + * The type must have a resolution of a least 1 nanosecond (without losing + precision) or an arbitrary resolution. + +128 bits float +-------------- + +Add a new IEEE 754-2008 quad-precision float type. The IEEE 754-2008 quad +precision float has 1 sign bit, 15 bits of exponent and 112 bits of mantissa. + +128 bits float is supported by GCC (4.3), Clang and ICC. The problem is that +Visual C++ 2008 doesn't support it. Python must be portable and so cannot rely +on a type only available on some platforms. Another example: GCC 4.3 does not +support __float128 in 32-bit mode on x86 (but gcc 4.4 does). + +Intel CPUs have FPU supporting 80-bit floats, but not using SSE intructions. +Other CPU vendors don't support this float size. + +There is also a license issue: GCC uses the MPFR library which is distributed +under the GNU LGPL license. This license is incompatible with the Python +license. + +datetime.datetime +----------------- + +datetime.datetime only supports microsecond resolution, but can be enhanced +to support nanosecond. + +datetime.datetime has issues: + +- there is no easy way to convert it into "seconds since the epoch" +- any broken-down time has issues of time stamp ordering in the + duplicate hour of switching from DST to normal time +- time zone support is flaky-to-nonexistent in the datetime module + +datetime.timedelta +------------------ + +As datetime.datetime, datetime.timedelta only supports microsecond resolution, +but can be enhanced to support nanosecond. + +Even if datetime.timedelta have most criteria, it was not selected because it +is more complex than a simple number and is not accepted by functions getting +timestamp inputs. + + +decimal.Decimal +--------------- + +Decimal has an arbitrary precision, support arithmetic operations, is +comparable. Functions getting float inputs support directly Decimal, Decimal is +converted implicitly to float, even if the conversion may lose precision. + +Using Decimal by default would cause bootstrap issue because the module is +implemented in Python, but using Decimal by default was not considered. + +The decimal module is implemented in Python and is slow, but there is a C +reimplementation which is almost ready for inclusion in CPython. + +Tuple of integers +----------------- + +Creating a tuple of integers is simple and fast, but arithmetic operations +cannot be done directly on tuple. For example, (2, 1) - (2, 0) fails with a +TypeError. + +An integer fraction can be used to store any number without loss of precision +with any resolution: (numerator: int, denominator: int). The timestamp value +can be computed with a simple division: numerator / denominator. + +For the C implementation, a variant can be used to avoid integer overflow +because C types have a fixed size: (intpart: int, numerator: int, denominator: +int), value = intpart + numerator / denominator. Still to avoid integer +overflow in C types, numerator can be bigger than denominator while intpart can +be zero. + +Other formats have been proposed: + + * A: (sec, nsec): value = sec + nsec * 10 ** -9 + * B: (intpart, floatpart, exponent): value = intpart + floatpart * 10 ** exponent + * C: (intpart, floatpart, base, exponent): value = intpart + floatpart * base ** exponent + +The format A only supports nanosecond resolution. Formats A and B lose +precision if the clock frequency is not a power of 10. The format C has a +similar issue. + + +Alternatives: API design +======================== + +Add a global flag to change the timestamp type +---------------------------------------------- + +A global flag like os.stat_decimal_times(), similar to os.stat_float_times(), +can be added to set globally the timestamp type. + +A global flag may cause issues with libraries and applications expecting float +instead of Decimal. A float cannot be converted implicitly to Decimal. The +os.stat_float_times() case is different because an int can be converted +implictly to float. + +Add a protocol to create a timestamp +------------------------------------ + +Instead of hardcoding how timestamps are created, a new protocol can be added +to create a timestamp from a fraction. time.time(timestamp=type) would call +type.__from_fraction__(numerator, denominator) to create a timestamp object of +the specified type. + +If the type doesn't support the protocol, a fallback can be used: +type(numerator) / type(denominator). + +A variant is to use a "converter" callback to create a timestamp. Example +creating a float timestamp: + + def timestamp_to_float(numerator, denominator): + return float(numerator) / float(denominator) + +Common converters can be provided by time, datetime and other modules, or maybe +a specific "hires" module. Users can defined their own converters. + +Such protocol has a limitation: the structure of data passed to the protocol or +the callback has to be decided once and cannot be changed later. For example, +adding a timezone or the absolution start of the timestamp (e.g. Epoch or +unspecified start for monotonic clocks) would break the API. + +Add new fields to os.stat +------------------------- + +It was proposed to add 3 fields to os.stat() structure to get nanoseconds of +timestamps. + +Populating the extra fields is time consuming. If new fields are available by +default, any call to os.stat() would be slower. If new fields are optional, the +stat structure would have a variable number of fields, which can be surprising. + +Anyway, this approach does not help with the time module. + +Add a boolean argument +---------------------- + +Because we only need one new type, decimal.Decimal, a simple boolean flag +can be added. For example, time.time(decimal=True) or time.time(hires=True). + +Add new functions +----------------- + +Add new functions for each type, examples: + + * time.clock_decimal() + * time.time_decimal() + * os.stat_decimal() + * etc. + +Adding a new function for each function creating timestamps duplicate a lot +of time. + + +Links +===== + + * `Issue #11457: os.stat(): add new fields to get timestamps as Decimal objects with nanosecond resolution `_ + * `Issue #13882: Add format argument for time.time(), time.clock(), ... to get a timestamp as a Decimal object `_ + * `[Python-Dev] Store timestamps as decimal.Decimal objects `_ + + +Copyright +========= + +This document has been placed in the public domain. + -- Repository URL: http://hg.python.org/peps From python-checkins at python.org Fri Feb 3 02:17:11 2012 From: python-checkins at python.org (victor.stinner) Date: Fri, 03 Feb 2012 02:17:11 +0100 Subject: [Python-checkins] =?utf8?q?peps=3A_PEP_410=3A_deprecate_os=2Estat?= =?utf8?b?X2Zsb2F0X3RpbWVzKCk=?= Message-ID: http://hg.python.org/peps/rev/67b68e48700f changeset: 4031:67b68e48700f user: Victor Stinner date: Fri Feb 03 02:17:33 2012 +0100 summary: PEP 410: deprecate os.stat_float_times() files: pep-0410.txt | 2 ++ 1 files changed, 2 insertions(+), 0 deletions(-) diff --git a/pep-0410.txt b/pep-0410.txt --- a/pep-0410.txt +++ b/pep-0410.txt @@ -64,6 +64,8 @@ * time.gmtime(), time.localtime() * os.utimensat(), os.futimens() +The os.stat_float_times() is deprecated: use timestamp=int argument instead. + Backwards Compatibility ======================= -- Repository URL: http://hg.python.org/peps From python-checkins at python.org Fri Feb 3 02:52:35 2012 From: python-checkins at python.org (ned.deily) Date: Fri, 03 Feb 2012 02:52:35 +0100 Subject: [Python-checkins] =?utf8?b?Y3B5dGhvbiAoMi43KTogSXNzdWUgIzEzOTAx?= =?utf8?q?=3A_Prevent_test=5Fdistutils_failures_on_OS_X_with_--enable-shar?= =?utf8?b?ZWQu?= Message-ID: http://hg.python.org/cpython/rev/41cabdff2686 changeset: 74737:41cabdff2686 branch: 2.7 parent: 74732:4c93ef04eff5 user: Ned Deily date: Fri Feb 03 02:39:49 2012 +0100 summary: Issue #13901: Prevent test_distutils failures on OS X with --enable-shared. files: Lib/distutils/tests/support.py | 10 ++++++++-- Misc/NEWS | 2 ++ 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/Lib/distutils/tests/support.py b/Lib/distutils/tests/support.py --- a/Lib/distutils/tests/support.py +++ b/Lib/distutils/tests/support.py @@ -200,6 +200,9 @@ cmd = build_ext(dist) support.fixup_build_ext(cmd) cmd.ensure_finalized() + + Unlike most other Unix platforms, Mac OS X embeds absolute paths + to shared libraries into executables, so the fixup is not needed there. """ if os.name == 'nt': cmd.debug = sys.executable.endswith('_d.exe') @@ -211,5 +214,8 @@ if runshared is None: cmd.library_dirs = ['.'] else: - name, equals, value = runshared.partition('=') - cmd.library_dirs = value.split(os.pathsep) + if sys.platform == 'darwin': + cmd.library_dirs = [] + else: + name, equals, value = runshared.partition('=') + cmd.library_dirs = value.split(os.pathsep) diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -90,6 +90,8 @@ Library ------- +- 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. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Fri Feb 3 02:52:35 2012 From: python-checkins at python.org (ned.deily) Date: Fri, 03 Feb 2012 02:52:35 +0100 Subject: [Python-checkins] =?utf8?b?Y3B5dGhvbiAoMy4yKTogSXNzdWUgIzEzOTAx?= =?utf8?q?=3A_Prevent_test=5Fdistutils_failures_on_OS_X_with_--enable-shar?= =?utf8?b?ZWQu?= Message-ID: http://hg.python.org/cpython/rev/6f6100a752ba changeset: 74738:6f6100a752ba branch: 3.2 parent: 74733:5727d3398996 user: Ned Deily date: Fri Feb 03 02:42:16 2012 +0100 summary: Issue #13901: Prevent test_distutils failures on OS X with --enable-shared. files: Lib/distutils/tests/support.py | 10 ++++++++-- Misc/NEWS | 2 ++ 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/Lib/distutils/tests/support.py b/Lib/distutils/tests/support.py --- a/Lib/distutils/tests/support.py +++ b/Lib/distutils/tests/support.py @@ -188,6 +188,9 @@ cmd = build_ext(dist) support.fixup_build_ext(cmd) cmd.ensure_finalized() + + Unlike most other Unix platforms, Mac OS X embeds absolute paths + to shared libraries into executables, so the fixup is not needed there. """ if os.name == 'nt': cmd.debug = sys.executable.endswith('_d.exe') @@ -199,5 +202,8 @@ if runshared is None: cmd.library_dirs = ['.'] else: - name, equals, value = runshared.partition('=') - cmd.library_dirs = value.split(os.pathsep) + if sys.platform == 'darwin': + cmd.library_dirs = [] + else: + name, equals, value = runshared.partition('=') + cmd.library_dirs = value.split(os.pathsep) diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -113,6 +113,8 @@ Library ------- +- 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. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Fri Feb 3 02:52:36 2012 From: python-checkins at python.org (ned.deily) Date: Fri, 03 Feb 2012 02:52:36 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_3=2E2_-=3E_default=29?= =?utf8?q?=3A_merge?= Message-ID: http://hg.python.org/cpython/rev/70e47b8cc485 changeset: 74739:70e47b8cc485 parent: 74736:55bbcbc48683 parent: 74738:6f6100a752ba user: Ned Deily date: Fri Feb 03 02:45:05 2012 +0100 summary: merge files: Lib/distutils/tests/support.py | 10 ++++++++-- Misc/NEWS | 2 ++ 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/Lib/distutils/tests/support.py b/Lib/distutils/tests/support.py --- a/Lib/distutils/tests/support.py +++ b/Lib/distutils/tests/support.py @@ -188,6 +188,9 @@ cmd = build_ext(dist) support.fixup_build_ext(cmd) cmd.ensure_finalized() + + Unlike most other Unix platforms, Mac OS X embeds absolute paths + to shared libraries into executables, so the fixup is not needed there. """ if os.name == 'nt': cmd.debug = sys.executable.endswith('_d.exe') @@ -199,5 +202,8 @@ if runshared is None: cmd.library_dirs = ['.'] else: - name, equals, value = runshared.partition('=') - cmd.library_dirs = value.split(os.pathsep) + if sys.platform == 'darwin': + cmd.library_dirs = [] + else: + name, equals, value = runshared.partition('=') + cmd.library_dirs = value.split(os.pathsep) diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -463,6 +463,8 @@ Library ------- +- 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. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Fri Feb 3 02:52:39 2012 From: python-checkins at python.org (ned.deily) Date: Fri, 03 Feb 2012 02:52:39 +0100 Subject: [Python-checkins] =?utf8?q?cpython=3A_Issue_=2313901=3A_Prevent_t?= =?utf8?q?est=5Fpackaging_failures_on_OS_X_with_--enable-shared=2E?= Message-ID: http://hg.python.org/cpython/rev/84be86af9161 changeset: 74740:84be86af9161 user: Ned Deily date: Fri Feb 03 02:46:37 2012 +0100 summary: Issue #13901: Prevent test_packaging failures on OS X with --enable-shared. files: Lib/packaging/tests/support.py | 11 ++++++++--- 1 files changed, 8 insertions(+), 3 deletions(-) diff --git a/Lib/packaging/tests/support.py b/Lib/packaging/tests/support.py --- a/Lib/packaging/tests/support.py +++ b/Lib/packaging/tests/support.py @@ -366,6 +366,9 @@ cmd = build_ext(dist) support.fixup_build_ext(cmd) cmd.ensure_finalized() + + Unlike most other Unix platforms, Mac OS X embeds absolute paths + to shared libraries into executables, so the fixup is not needed there. """ if os.name == 'nt': cmd.debug = sys.executable.endswith('_d.exe') @@ -377,9 +380,11 @@ if runshared is None: cmd.library_dirs = ['.'] else: - name, equals, value = runshared.partition('=') - cmd.library_dirs = value.split(os.pathsep) - + if sys.platform == 'darwin': + cmd.library_dirs = [] + else: + name, equals, value = runshared.partition('=') + cmd.library_dirs = value.split(os.pathsep) try: from test.support import skip_unless_symlink -- Repository URL: http://hg.python.org/cpython From solipsis at pitrou.net Fri Feb 3 05:32:08 2012 From: solipsis at pitrou.net (solipsis at pitrou.net) Date: Fri, 03 Feb 2012 05:32:08 +0100 Subject: [Python-checkins] Daily reference leaks (84be86af9161): sum=0 Message-ID: results for 84be86af9161 on branch "default" -------------------------------------------- Command line was: ['./python', '-m', 'test.regrtest', '-uall', '-R', '3:3:/home/antoine/cpython/refleaks/reflogZkknLC', '-x'] From python-checkins at python.org Fri Feb 3 09:34:37 2012 From: python-checkins at python.org (georg.brandl) Date: Fri, 03 Feb 2012 09:34:37 +0100 Subject: [Python-checkins] =?utf8?q?peps=3A_Update_from_Ethan=2E?= Message-ID: http://hg.python.org/peps/rev/d995704c931c changeset: 4032:d995704c931c user: Georg Brandl date: Fri Feb 03 09:34:26 2012 +0100 summary: Update from Ethan. files: pep-0409.txt | 128 +++++++++++++++++++++++++++++++------- 1 files changed, 102 insertions(+), 26 deletions(-) diff --git a/pep-0409.txt b/pep-0409.txt --- a/pep-0409.txt +++ b/pep-0409.txt @@ -7,8 +7,7 @@ Type: Standards Track Content-Type: text/x-rst Created: 26-Jan-2012 -Python-Version: 3.3 -Post-History: 2012-01-27 +Post-History: 30-Aug-2002, 01-Feb-2012, 03-Feb-2012 Abstract @@ -18,48 +17,50 @@ there is no way to do it. This PEP proposes one. -Motivation -========== +Rationale +========= -There are two basic ways to generate exceptions: 1) Python does it -(buggy code, missing resources, ending loops, etc.); and, 2) manually -(with a raise statement). +There are two basic ways to generate exceptions: + +1. Python does it (buggy code, missing resources, ending loops, etc.) + +2. manually (with a raise statement) When writing libraries, or even just custom classes, it can become necessary to raise exceptions; moreover it can be useful, even necessary, to change from one exception to another. To take an example from my dbf module:: - try: - value = int(value) - except Exception: - raise DbfError(...) + try: + value = int(value) + except Exception: + raise DbfError(...) -Whatever the original exception was (ValueError, TypeError, or +Whatever the original exception was (``ValueError``, ``TypeError``, or something else) is irrelevant. The exception from this point on is a -DbfError, and the original exception is of no value. However, if this -exception is printed, we would currently see both. +``DbfError``, and the original exception is of no value. However, if +this exception is printed, we would currently see both. Alternatives ============ - Several possibilities have been put forth: -- ``raise as NewException()`` +* ``raise as NewException()`` - Reuses the 'as' keyword; can be confusing since we are not really reraising - the originating exception + Reuses the ``as`` keyword; can be confusing since we are not really + reraising the originating exception -- ``raise NewException() from None`` +* ``raise NewException() from None`` - Follows existing syntax of explicitly declaring the originating exception + Follows existing syntax of explicitly declaring the originating + exception -- ``exc = NewException(); exc.__context__ = None; raise exc`` +* ``exc = NewException(); exc.__context__ = None; raise exc`` Very verbose way of the previous method -- ``raise NewException.no_context(...)`` +* ``raise NewException.no_context(...)`` Make context suppression a class method. @@ -78,15 +79,91 @@ raise KeyError() from NameError() -but because the 'cause' is None the previous context is discarded. -There is a patch to this effect attached to issue 6210 [#issue6210]_. +but because the cause is ``None`` the previous context is not +displayed by the default exception printing routines. + + +Implementation Discussion +========================= + +Currently, ``None`` is the default for both ``__context__`` and +``__cause__``. In order to support ``raise ... from None`` (which +would set ``__cause__`` to ``None``) we need a different default value +for ``__cause__``. Several ideas were put forth on how to implement +this at the language level: + +* Overwrite the previous exception information (side-stepping the + issue and leaving ``__cause__`` at ``None``). + + Rejected as this can seriously hinder debugging due to `poor error + messages`_. + +* Use one of the boolean values in ``__cause__``: ``False`` would be + the default value, and would be replaced when ``from ...`` was used + with the explicity chained exception or ``None``. + + Rejected as this encourages the use of two different objects types + for ``__cause__`` with one of them (boolean) not allowed to have the + full range of possible values (``True`` would never be used). + +* Create a special exception class, ``__NoException__``. + + Rejected as possibly confusing, possibly being mistakenly raised by + users, and not being a truly unique value as ``None``, ``True``, and + ``False`` are. + +* Use ``Ellipsis`` as the default value (the ``...`` singleton). + + Accepted. There are no other possible values; it cannot be raised + as it is not an exception; it has the connotation of 'fill in the + rest...' as in ``__cause__`` is not set, look in ``__context__`` for + it. + + +Language Details +================ + +To support ``from None``, ``__context__`` will stay as it is, but +``__cause__`` will start out as ``Ellipsis`` and will change to +``None`` when the ``raise ... from None`` method is used. + +============================================ ================== ======================================= +form __context__ __cause__ +============================================ ================== ======================================= +raise ``None`` ``Ellipsis`` +reraise previous exception ``Ellipsis`` +reraise from ``None`` | ``ChainedException`` previous exception ``None`` | explicitly chained exception +============================================ ================== ======================================= + +The default exception printing routine will then: + +* If ``__cause__`` is ``Ellipsis`` the ``__context__`` (if any) will + be printed. + +* If ``__cause__`` is ``None`` the ``__context__`` will not be + printed. + +* If ``__cause__`` is anything else, ``__cause__`` will be printed. + + +Patches +======= + +There is a patch for CPython implementing this attached to `Issue +6210`_. References ========== -.. [#issue6210] +Discussion and refinements in this `thread on python-dev`_. + +.. _poor error messages: + http://bugs.python.org/msg152294 +.. _issue 6210: http://bugs.python.org/issue6210 +.. _Thread on python-dev: + http://mail.python.org/pipermail/python-dev/2012-January/115838.html Copyright @@ -95,7 +172,6 @@ This document has been placed in the public domain. - .. Local Variables: mode: indented-text -- Repository URL: http://hg.python.org/peps From python-checkins at python.org Fri Feb 3 12:56:25 2012 From: python-checkins at python.org (victor.stinner) Date: Fri, 03 Feb 2012 12:56:25 +0100 Subject: [Python-checkins] =?utf8?q?peps=3A_PEP_410=3A_Update_for_Nick=27s?= =?utf8?q?_remarks?= Message-ID: http://hg.python.org/peps/rev/8339f7714c15 changeset: 4033:8339f7714c15 user: Victor Stinner date: Fri Feb 03 12:56:11 2012 +0100 summary: PEP 410: Update for Nick's remarks files: pep-0410.txt | 38 +++++++++++++++++++++++++------------- 1 files changed, 25 insertions(+), 13 deletions(-) diff --git a/pep-0410.txt b/pep-0410.txt --- a/pep-0410.txt +++ b/pep-0410.txt @@ -42,8 +42,12 @@ Specification ============= -Add decimal.Decimal as a new type for timestamps. Add a *timestamp* optional -argument to: +Add decimal.Decimal as a new type for timestamps. Decimal supports any +timestamp resolution, support arithmetic operations and is comparable. +Functions getting float inputs support directly Decimal, Decimal is converted +implicitly to float, even if the conversion may lose precision. + +Add a *timestamp* optional argument to: * os module: fstat(), fstatat(), lstat() and stat() * time module: clock(), clock_gettime(), clock_getres(), time() and @@ -66,6 +70,10 @@ The os.stat_float_times() is deprecated: use timestamp=int argument instead. +.. note:: + The decimal module is implemented in Python and is slow, but there is a C + reimplementation which is almost ready for inclusion in CPython. + Backwards Compatibility ======================= @@ -124,6 +132,8 @@ duplicate hour of switching from DST to normal time - time zone support is flaky-to-nonexistent in the datetime module +datetime.datetime is also more complex than a simple number. + datetime.timedelta ------------------ @@ -135,18 +145,7 @@ timestamp inputs. -decimal.Decimal ---------------- - -Decimal has an arbitrary precision, support arithmetic operations, is -comparable. Functions getting float inputs support directly Decimal, Decimal is -converted implicitly to float, even if the conversion may lose precision. - -Using Decimal by default would cause bootstrap issue because the module is -implemented in Python, but using Decimal by default was not considered. - -The decimal module is implemented in Python and is slow, but there is a C -reimplementation which is almost ready for inclusion in CPython. +.. _tuple-integers: Tuple of integers ----------------- @@ -215,6 +214,14 @@ adding a timezone or the absolution start of the timestamp (e.g. Epoch or unspecified start for monotonic clocks) would break the API. +The protocol proposition was as being excessive given the requirements, but +that the specific syntax proposed (time.time(timestamp=type)) allows this to be +introduced later if compelling use cases are discovered. + +.. note:: + Other formats can also be used instead of a fraction: see the `Tuple of integers + `_ section + Add new fields to os.stat ------------------------- @@ -233,6 +240,10 @@ Because we only need one new type, decimal.Decimal, a simple boolean flag can be added. For example, time.time(decimal=True) or time.time(hires=True). +The boolean argument API was rejected because it is not "pythonic". Changing +the return type with a parameter value is preferred over a boolean parameter (a +flag). + Add new functions ----------------- -- Repository URL: http://hg.python.org/peps From python-checkins at python.org Fri Feb 3 17:45:07 2012 From: python-checkins at python.org (martin.v.loewis) Date: Fri, 03 Feb 2012 17:45:07 +0100 Subject: [Python-checkins] =?utf8?q?cpython=3A_Issue_=2313777=3A_Add_PF=5F?= =?utf8?q?SYSTEM_sockets_on_OS_X=2E?= Message-ID: http://hg.python.org/cpython/rev/aa3680d2c24d changeset: 74741:aa3680d2c24d user: Martin v. L?wis date: Fri Feb 03 17:44:58 2012 +0100 summary: Issue #13777: Add PF_SYSTEM sockets on OS X. Patch by Michael Goderbauer. files: Doc/library/socket.rst | 8 ++ Misc/ACKS | 1 + Misc/NEWS | 3 + Modules/socketmodule.c | 107 +++++++++++++++++++++++++++++ Modules/socketmodule.h | 10 ++ configure | 6 +- configure.in | 6 +- pyconfig.h.in | 6 + 8 files changed, 141 insertions(+), 6 deletions(-) diff --git a/Doc/library/socket.rst b/Doc/library/socket.rst --- a/Doc/library/socket.rst +++ b/Doc/library/socket.rst @@ -99,6 +99,14 @@ ``'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. diff --git a/Misc/ACKS b/Misc/ACKS --- a/Misc/ACKS +++ b/Misc/ACKS @@ -366,6 +366,7 @@ Johannes Gijsbers Michael Gilfix Yannick Gingras +Michael Goderbauer Christoph Gohlke Tim Golden Tiago Gon?alves diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -10,6 +10,9 @@ Core and Builtins ----------------- +- Issue #13777: Add PF_SYSTEM sockets on OS X. + Patch by Michael Goderbauer. + - Issue #13908: Ready types returned from PyType_FromSpec. - Issue #11235: Fix OverflowError when trying to import a source file whose diff --git a/Modules/socketmodule.c b/Modules/socketmodule.c --- a/Modules/socketmodule.c +++ b/Modules/socketmodule.c @@ -218,6 +218,11 @@ # include #endif +#ifdef __APPLE__ +# include +#endif + + #if defined(PYOS_OS2) # define INCL_DOS # define INCL_DOSERRORS @@ -1239,6 +1244,23 @@ } #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: @@ -1677,6 +1699,64 @@ 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... */ @@ -1783,6 +1863,21 @@ 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... */ @@ -5660,6 +5755,14 @@ 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 @@ -6096,6 +6199,10 @@ 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); diff --git a/Modules/socketmodule.h b/Modules/socketmodule.h --- a/Modules/socketmodule.h +++ b/Modules/socketmodule.h @@ -80,6 +80,13 @@ #include #endif +#ifdef HAVE_SYS_SYS_DOMAIN_H +#include +#endif +#ifdef HAVE_SYS_KERN_CONTROL_H +#include +#endif + #ifndef Py__SOCKET_H #define Py__SOCKET_H #ifdef __cplusplus @@ -138,6 +145,9 @@ #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/configure b/configure --- a/configure +++ b/configure @@ -6144,10 +6144,10 @@ sched.h shadow.h signal.h stdint.h stropts.h termios.h \ unistd.h utime.h \ poll.h sys/devpoll.h sys/epoll.h sys/poll.h \ -sys/audioio.h sys/xattr.h sys/bsdtty.h sys/event.h sys/file.h sys/loadavg.h \ -sys/lock.h sys/mkdev.h sys/modem.h \ +sys/audioio.h sys/xattr.h sys/bsdtty.h sys/event.h sys/file.h \ +sys/kern_control.h sys/loadavg.h sys/lock.h sys/mkdev.h sys/modem.h \ sys/param.h sys/select.h sys/sendfile.h sys/socket.h sys/statvfs.h \ -sys/stat.h sys/syscall.h sys/termio.h sys/time.h \ +sys/stat.h sys/syscall.h sys/sys_domain.h sys/termio.h sys/time.h \ sys/times.h sys/types.h sys/uio.h sys/un.h sys/utsname.h sys/wait.h pty.h \ libutil.h sys/resource.h netpacket/packet.h sysexits.h bluetooth.h \ bluetooth/bluetooth.h linux/tipc.h spawn.h util.h diff --git a/configure.in b/configure.in --- a/configure.in +++ b/configure.in @@ -1334,10 +1334,10 @@ sched.h shadow.h signal.h stdint.h stropts.h termios.h \ unistd.h utime.h \ poll.h sys/devpoll.h sys/epoll.h sys/poll.h \ -sys/audioio.h sys/xattr.h sys/bsdtty.h sys/event.h sys/file.h sys/loadavg.h \ -sys/lock.h sys/mkdev.h sys/modem.h \ +sys/audioio.h sys/xattr.h sys/bsdtty.h sys/event.h sys/file.h \ +sys/kern_control.h sys/loadavg.h sys/lock.h sys/mkdev.h sys/modem.h \ sys/param.h sys/select.h sys/sendfile.h sys/socket.h sys/statvfs.h \ -sys/stat.h sys/syscall.h sys/termio.h sys/time.h \ +sys/stat.h sys/syscall.h sys/sys_domain.h sys/termio.h sys/time.h \ sys/times.h sys/types.h sys/uio.h sys/un.h sys/utsname.h sys/wait.h pty.h \ libutil.h sys/resource.h netpacket/packet.h sysexits.h bluetooth.h \ bluetooth/bluetooth.h linux/tipc.h spawn.h util.h) diff --git a/pyconfig.h.in b/pyconfig.h.in --- a/pyconfig.h.in +++ b/pyconfig.h.in @@ -908,6 +908,9 @@ /* Define to 1 if you have the header file. */ #undef HAVE_SYS_FILE_H +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_KERN_CONTROL_H + /* Define to 1 if you have the header file. */ #undef HAVE_SYS_LOADAVG_H @@ -951,6 +954,9 @@ /* Define to 1 if you have the header file. */ #undef HAVE_SYS_SYSCALL_H +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_SYS_DOMAIN_H + /* Define to 1 if you have the header file. */ #undef HAVE_SYS_TERMIO_H -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Fri Feb 3 18:08:40 2012 From: python-checkins at python.org (brett.cannon) Date: Fri, 03 Feb 2012 18:08:40 +0100 Subject: [Python-checkins] =?utf8?q?cpython=3A_Check_for_errors_in_creatin?= =?utf8?q?g_sub-interpreters_when_testing_the_C_API=2E?= Message-ID: http://hg.python.org/cpython/rev/404c0c345321 changeset: 74742:404c0c345321 parent: 74740:84be86af9161 user: Brett Cannon date: Fri Feb 03 12:08:03 2012 -0500 summary: Check for errors in creating sub-interpreters when testing the C API. files: Modules/_testcapimodule.c | 8 ++++++++ 1 files changed, 8 insertions(+), 0 deletions(-) diff --git a/Modules/_testcapimodule.c b/Modules/_testcapimodule.c --- a/Modules/_testcapimodule.c +++ b/Modules/_testcapimodule.c @@ -2396,6 +2396,14 @@ 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); -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Fri Feb 3 18:08:41 2012 From: python-checkins at python.org (brett.cannon) Date: Fri, 03 Feb 2012 18:08:41 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_default_-=3E_default?= =?utf8?q?=29=3A_Merge?= Message-ID: http://hg.python.org/cpython/rev/bf24b2e1be24 changeset: 74743:bf24b2e1be24 parent: 74742:404c0c345321 parent: 74741:aa3680d2c24d user: Brett Cannon date: Fri Feb 03 12:08:32 2012 -0500 summary: Merge files: Doc/library/socket.rst | 8 ++ Misc/ACKS | 1 + Misc/NEWS | 3 + Modules/socketmodule.c | 107 +++++++++++++++++++++++++++++ Modules/socketmodule.h | 10 ++ configure | 6 +- configure.in | 6 +- pyconfig.h.in | 6 + 8 files changed, 141 insertions(+), 6 deletions(-) diff --git a/Doc/library/socket.rst b/Doc/library/socket.rst --- a/Doc/library/socket.rst +++ b/Doc/library/socket.rst @@ -99,6 +99,14 @@ ``'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. diff --git a/Misc/ACKS b/Misc/ACKS --- a/Misc/ACKS +++ b/Misc/ACKS @@ -366,6 +366,7 @@ Johannes Gijsbers Michael Gilfix Yannick Gingras +Michael Goderbauer Christoph Gohlke Tim Golden Tiago Gon?alves diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -10,6 +10,9 @@ Core and Builtins ----------------- +- Issue #13777: Add PF_SYSTEM sockets on OS X. + Patch by Michael Goderbauer. + - Issue #13908: Ready types returned from PyType_FromSpec. - Issue #11235: Fix OverflowError when trying to import a source file whose diff --git a/Modules/socketmodule.c b/Modules/socketmodule.c --- a/Modules/socketmodule.c +++ b/Modules/socketmodule.c @@ -218,6 +218,11 @@ # include #endif +#ifdef __APPLE__ +# include +#endif + + #if defined(PYOS_OS2) # define INCL_DOS # define INCL_DOSERRORS @@ -1239,6 +1244,23 @@ } #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: @@ -1677,6 +1699,64 @@ 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... */ @@ -1783,6 +1863,21 @@ 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... */ @@ -5660,6 +5755,14 @@ 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 @@ -6096,6 +6199,10 @@ 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); diff --git a/Modules/socketmodule.h b/Modules/socketmodule.h --- a/Modules/socketmodule.h +++ b/Modules/socketmodule.h @@ -80,6 +80,13 @@ #include #endif +#ifdef HAVE_SYS_SYS_DOMAIN_H +#include +#endif +#ifdef HAVE_SYS_KERN_CONTROL_H +#include +#endif + #ifndef Py__SOCKET_H #define Py__SOCKET_H #ifdef __cplusplus @@ -138,6 +145,9 @@ #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/configure b/configure --- a/configure +++ b/configure @@ -6144,10 +6144,10 @@ sched.h shadow.h signal.h stdint.h stropts.h termios.h \ unistd.h utime.h \ poll.h sys/devpoll.h sys/epoll.h sys/poll.h \ -sys/audioio.h sys/xattr.h sys/bsdtty.h sys/event.h sys/file.h sys/loadavg.h \ -sys/lock.h sys/mkdev.h sys/modem.h \ +sys/audioio.h sys/xattr.h sys/bsdtty.h sys/event.h sys/file.h \ +sys/kern_control.h sys/loadavg.h sys/lock.h sys/mkdev.h sys/modem.h \ sys/param.h sys/select.h sys/sendfile.h sys/socket.h sys/statvfs.h \ -sys/stat.h sys/syscall.h sys/termio.h sys/time.h \ +sys/stat.h sys/syscall.h sys/sys_domain.h sys/termio.h sys/time.h \ sys/times.h sys/types.h sys/uio.h sys/un.h sys/utsname.h sys/wait.h pty.h \ libutil.h sys/resource.h netpacket/packet.h sysexits.h bluetooth.h \ bluetooth/bluetooth.h linux/tipc.h spawn.h util.h diff --git a/configure.in b/configure.in --- a/configure.in +++ b/configure.in @@ -1334,10 +1334,10 @@ sched.h shadow.h signal.h stdint.h stropts.h termios.h \ unistd.h utime.h \ poll.h sys/devpoll.h sys/epoll.h sys/poll.h \ -sys/audioio.h sys/xattr.h sys/bsdtty.h sys/event.h sys/file.h sys/loadavg.h \ -sys/lock.h sys/mkdev.h sys/modem.h \ +sys/audioio.h sys/xattr.h sys/bsdtty.h sys/event.h sys/file.h \ +sys/kern_control.h sys/loadavg.h sys/lock.h sys/mkdev.h sys/modem.h \ sys/param.h sys/select.h sys/sendfile.h sys/socket.h sys/statvfs.h \ -sys/stat.h sys/syscall.h sys/termio.h sys/time.h \ +sys/stat.h sys/syscall.h sys/sys_domain.h sys/termio.h sys/time.h \ sys/times.h sys/types.h sys/uio.h sys/un.h sys/utsname.h sys/wait.h pty.h \ libutil.h sys/resource.h netpacket/packet.h sysexits.h bluetooth.h \ bluetooth/bluetooth.h linux/tipc.h spawn.h util.h) diff --git a/pyconfig.h.in b/pyconfig.h.in --- a/pyconfig.h.in +++ b/pyconfig.h.in @@ -908,6 +908,9 @@ /* Define to 1 if you have the header file. */ #undef HAVE_SYS_FILE_H +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_KERN_CONTROL_H + /* Define to 1 if you have the header file. */ #undef HAVE_SYS_LOADAVG_H @@ -951,6 +954,9 @@ /* Define to 1 if you have the header file. */ #undef HAVE_SYS_SYSCALL_H +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_SYS_DOMAIN_H + /* Define to 1 if you have the header file. */ #undef HAVE_SYS_TERMIO_H -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Fri Feb 3 19:24:37 2012 From: python-checkins at python.org (vinay.sajip) Date: Fri, 03 Feb 2012 19:24:37 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=283=2E1=29=3A_Revert_fix_for_?= =?utf8?q?=2313807_mistakenly_applied_in_this_branch=2E?= Message-ID: http://hg.python.org/cpython/rev/813a34170ac5 changeset: 74744:813a34170ac5 branch: 3.1 parent: 74647:e7706bdaaa0d user: Vinay Sajip date: Fri Feb 03 18:23:05 2012 +0000 summary: Revert fix for #13807 mistakenly applied in this branch. files: Lib/logging/__init__.py | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Lib/logging/__init__.py b/Lib/logging/__init__.py --- a/Lib/logging/__init__.py +++ b/Lib/logging/__init__.py @@ -721,7 +721,7 @@ You could, however, replace this with a custom handler if you wish. The record which was being processed is passed in to this method. """ - if raiseExceptions and sys.stderr: # see issue 13807 + if raiseExceptions: ei = sys.exc_info() try: traceback.print_exception(ei[0], ei[1], ei[2], None, sys.stderr) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Fri Feb 3 23:16:46 2012 From: python-checkins at python.org (ned.deily) Date: Fri, 03 Feb 2012 23:16:46 +0100 Subject: [Python-checkins] =?utf8?b?Y3B5dGhvbiAoMi43KTogSXNzdWUgIzEzODYx?= =?utf8?q?=3A_Prevent_test=5Fapropos*_test_case_failures_in_test=5Fpydoc?= =?utf8?q?=2E?= Message-ID: http://hg.python.org/cpython/rev/e5f2c04055a2 changeset: 74745:e5f2c04055a2 branch: 2.7 parent: 74737:41cabdff2686 user: Ned Deily date: Fri Feb 03 23:13:03 2012 +0100 summary: Issue #13861: Prevent test_apropos* test case failures in test_pydoc. files: Lib/test/test_pydoc.py | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Lib/test/test_pydoc.py b/Lib/test/test_pydoc.py --- a/Lib/test/test_pydoc.py +++ b/Lib/test/test_pydoc.py @@ -313,7 +313,7 @@ badsyntax = os.path.join(pkgdir, "__init__") + os.extsep + "py" with open(badsyntax, 'w') as f: f.write("invalid python syntax = $1\n") - result = run_pydoc('nothing', '-k', PYTHONPATH=TESTFN) + result = run_pydoc('zqwykjv', '-k', PYTHONPATH=TESTFN) self.assertEqual('', result) def test_apropos_with_unreadable_dir(self): @@ -323,7 +323,7 @@ self.addCleanup(os.rmdir, self.unreadable_dir) # Note, on Windows the directory appears to be still # readable so this is not really testing the issue there - result = run_pydoc('nothing', '-k', PYTHONPATH=TESTFN) + result = run_pydoc('zqwykjv', '-k', PYTHONPATH=TESTFN) self.assertEqual('', result) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Fri Feb 3 23:16:47 2012 From: python-checkins at python.org (ned.deily) Date: Fri, 03 Feb 2012 23:16:47 +0100 Subject: [Python-checkins] =?utf8?b?Y3B5dGhvbiAoMy4yKTogSXNzdWUgIzEzODYx?= =?utf8?q?=3A_Prevent_test=5Fapropos*_test_case_failures_in_test=5Fpydoc?= =?utf8?q?=2E?= Message-ID: http://hg.python.org/cpython/rev/5eb47e1732a0 changeset: 74746:5eb47e1732a0 branch: 3.2 parent: 74738:6f6100a752ba user: Ned Deily date: Fri Feb 03 23:14:37 2012 +0100 summary: Issue #13861: Prevent test_apropos* test case failures in test_pydoc. files: Lib/test/test_pydoc.py | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Lib/test/test_pydoc.py b/Lib/test/test_pydoc.py --- a/Lib/test/test_pydoc.py +++ b/Lib/test/test_pydoc.py @@ -399,7 +399,7 @@ badsyntax = os.path.join(pkgdir, "__init__") + os.extsep + "py" with open(badsyntax, 'w') as f: f.write("invalid python syntax = $1\n") - result = run_pydoc('nothing', '-k', PYTHONPATH=TESTFN) + result = run_pydoc('zqwykjv', '-k', PYTHONPATH=TESTFN) self.assertEqual(b'', result) def test_apropos_with_unreadable_dir(self): @@ -409,7 +409,7 @@ self.addCleanup(os.rmdir, self.unreadable_dir) # Note, on Windows the directory appears to be still # readable so this is not really testing the issue there - result = run_pydoc('nothing', '-k', PYTHONPATH=TESTFN) + result = run_pydoc('zqwykjv', '-k', PYTHONPATH=TESTFN) self.assertEqual(b'', result) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Fri Feb 3 23:16:48 2012 From: python-checkins at python.org (ned.deily) Date: Fri, 03 Feb 2012 23:16:48 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_3=2E2_-=3E_default=29?= =?utf8?q?=3A_Issue_=2313861=3A_merge?= Message-ID: http://hg.python.org/cpython/rev/ff230e366610 changeset: 74747:ff230e366610 parent: 74743:bf24b2e1be24 parent: 74746:5eb47e1732a0 user: Ned Deily date: Fri Feb 03 23:16:11 2012 +0100 summary: Issue #13861: merge files: Lib/test/test_pydoc.py | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Lib/test/test_pydoc.py b/Lib/test/test_pydoc.py --- a/Lib/test/test_pydoc.py +++ b/Lib/test/test_pydoc.py @@ -405,7 +405,7 @@ badsyntax = os.path.join(pkgdir, "__init__") + os.extsep + "py" with open(badsyntax, 'w') as f: f.write("invalid python syntax = $1\n") - result = run_pydoc('nothing', '-k', PYTHONPATH=TESTFN) + result = run_pydoc('zqwykjv', '-k', PYTHONPATH=TESTFN) self.assertEqual(b'', result) def test_apropos_with_unreadable_dir(self): @@ -415,7 +415,7 @@ self.addCleanup(os.rmdir, self.unreadable_dir) # Note, on Windows the directory appears to be still # readable so this is not really testing the issue there - result = run_pydoc('nothing', '-k', PYTHONPATH=TESTFN) + result = run_pydoc('zqwykjv', '-k', PYTHONPATH=TESTFN) self.assertEqual(b'', result) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sat Feb 4 00:06:07 2012 From: python-checkins at python.org (victor.stinner) Date: Sat, 04 Feb 2012 00:06:07 +0100 Subject: [Python-checkins] =?utf8?q?peps=3A_PEP_410=3A_use_=3Asup=3A_and_e?= =?utf8?q?xplain_the_loss_of_precision_with_other_tuple_formats?= Message-ID: http://hg.python.org/peps/rev/f5f31e154b20 changeset: 4034:f5f31e154b20 user: Victor Stinner date: Sat Feb 04 00:06:26 2012 +0100 summary: PEP 410: use :sup: and explain the loss of precision with other tuple formats files: pep-0410.txt | 48 +++++++++++++++++++++++++--------------- 1 files changed, 30 insertions(+), 18 deletions(-) diff --git a/pep-0410.txt b/pep-0410.txt --- a/pep-0410.txt +++ b/pep-0410.txt @@ -30,12 +30,12 @@ * time module: clock_gettime(), clock_getres(), wallclock() The Python float type uses binary64 format of the IEEE 754 standard. With a -resolution of 1 nanosecond (10^-9), float timestamps lose precision for values -bigger than 2^24 seconds (194 days: 1970-07-14 for an Epoch timestamp). +resolution of 1 nanosecond (10\ :sup:`-9`), float timestamps lose precision for values +bigger than 2\ :sup:`24` seconds (194 days: 1970-07-14 for an Epoch timestamp). .. note:: - With a resolution of 1 microsecond (10^-6), float timestamps lose precision - for values bigger than 2^33 seconds (272 years: 2242-03-16 for an Epoch + With a resolution of 1 microsecond (10\ :sup:`-6`), float timestamps lose precision + for values bigger than 2\ :sup:`33` seconds (272 years: 2242-03-16 for an Epoch timestamp). @@ -107,17 +107,18 @@ Add a new IEEE 754-2008 quad-precision float type. The IEEE 754-2008 quad precision float has 1 sign bit, 15 bits of exponent and 112 bits of mantissa. -128 bits float is supported by GCC (4.3), Clang and ICC. The problem is that -Visual C++ 2008 doesn't support it. Python must be portable and so cannot rely -on a type only available on some platforms. Another example: GCC 4.3 does not -support __float128 in 32-bit mode on x86 (but gcc 4.4 does). +128 bits float is supported by GCC (4.3), Clang and ICC compilers. Python must +be portable and so cannot rely on a type only available on some platforms. For +example, Visual C++ 2008 doesn't support it 128 bits float, whereas it is used +to build the official Windows executables. Another example: GCC 4.3 does not +support __float128 in 32-bit mode on x86 (but GCC 4.4 does). -Intel CPUs have FPU supporting 80-bit floats, but not using SSE intructions. -Other CPU vendors don't support this float size. +Intel CPUs have FPU (x87) supporting 80-bit floats, but not using SSE +intructions. Other CPU vendors don't support this float size. -There is also a license issue: GCC uses the MPFR library which is distributed -under the GNU LGPL license. This license is incompatible with the Python -license. +There is also a license issue: GCC uses the MPFR library for 128 bits float, +library distributed under the GNU LGPL license. This license is not compatible +with the Python license. datetime.datetime ----------------- @@ -166,13 +167,24 @@ Other formats have been proposed: - * A: (sec, nsec): value = sec + nsec * 10 ** -9 - * B: (intpart, floatpart, exponent): value = intpart + floatpart * 10 ** exponent - * C: (intpart, floatpart, base, exponent): value = intpart + floatpart * base ** exponent + * A: (sec, nsec): value = sec + nsec * 10\ :sup:`-9` + * B: (intpart, floatpart, exponent): value = intpart + floatpart * 10\ :sup:`exponent` + * C: (intpart, floatpart, base, exponent): value = intpart + floatpart * base\ :sup:`exponent` The format A only supports nanosecond resolution. Formats A and B lose -precision if the clock frequency is not a power of 10. The format C has a -similar issue. +precision if the clock frequency cannot be written as a power of 10: if the +clock frequency is not coprime with 2 and 5. + +For some clocks, like ``QueryPerformanceCounter()`` on Windows, the frequency +is only known as runtime. The base and exponent has to be computed. If +computing the base and the exponent is too expensive (or not possible, e.g. if +the frequency is a prime number), exponent=1 can be used. The format (C) is +just a fractionn if exponent=1. + +The only advantage of these formats is a small optimization if the base is 2 +for float or if the base 10 for Decimal. In other cases, frequency = base\ +:sup:`exponent` must be computed again to convert a timestamp as float or +Decimal. Storing directly the frequency in the denominator is simpler. Alternatives: API design -- Repository URL: http://hg.python.org/peps From python-checkins at python.org Sat Feb 4 01:09:43 2012 From: python-checkins at python.org (benjamin.peterson) Date: Sat, 04 Feb 2012 01:09:43 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=282=2E7=29=3A_remove_unused_i?= =?utf8?q?mport?= Message-ID: http://hg.python.org/cpython/rev/6fb2eb6398bf changeset: 74748:6fb2eb6398bf branch: 2.7 parent: 74745:e5f2c04055a2 user: Benjamin Peterson date: Fri Feb 03 19:07:30 2012 -0500 summary: remove unused import files: Lib/threading.py | 1 - 1 files changed, 0 insertions(+), 1 deletions(-) diff --git a/Lib/threading.py b/Lib/threading.py --- a/Lib/threading.py +++ b/Lib/threading.py @@ -12,7 +12,6 @@ from time import time as _time, sleep as _sleep from traceback import format_exc as _format_exc -from collections import deque # Note regarding PEP 8 compliant aliases # This threading model was originally inspired by Java, and inherited -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sat Feb 4 01:09:44 2012 From: python-checkins at python.org (benjamin.peterson) Date: Sat, 04 Feb 2012 01:09:44 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=283=2E2=29=3A_remove_unused_i?= =?utf8?q?mport?= Message-ID: http://hg.python.org/cpython/rev/9eb5fec8674b changeset: 74749:9eb5fec8674b branch: 3.2 parent: 74746:5eb47e1732a0 user: Benjamin Peterson date: Fri Feb 03 19:07:30 2012 -0500 summary: remove unused import files: Lib/threading.py | 1 - 1 files changed, 0 insertions(+), 1 deletions(-) diff --git a/Lib/threading.py b/Lib/threading.py --- a/Lib/threading.py +++ b/Lib/threading.py @@ -5,7 +5,6 @@ from time import time as _time, sleep as _sleep from traceback import format_exc as _format_exc -from collections import deque from _weakrefset import WeakSet # Note regarding PEP 8 compliant names -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sat Feb 4 01:09:45 2012 From: python-checkins at python.org (benjamin.peterson) Date: Sat, 04 Feb 2012 01:09:45 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_3=2E2_-=3E_default=29?= =?utf8?q?=3A_merge_3=2E2?= Message-ID: http://hg.python.org/cpython/rev/0b9799f8b4cb changeset: 74750:0b9799f8b4cb parent: 74747:ff230e366610 parent: 74749:9eb5fec8674b user: Benjamin Peterson date: Fri Feb 03 19:09:38 2012 -0500 summary: merge 3.2 files: Lib/threading.py | 1 - 1 files changed, 0 insertions(+), 1 deletions(-) diff --git a/Lib/threading.py b/Lib/threading.py --- a/Lib/threading.py +++ b/Lib/threading.py @@ -5,7 +5,6 @@ from time import time as _time, sleep as _sleep from traceback import format_exc as _format_exc -from collections import deque from _weakrefset import WeakSet # Note regarding PEP 8 compliant names -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sat Feb 4 01:25:07 2012 From: python-checkins at python.org (benjamin.peterson) Date: Sat, 04 Feb 2012 01:25:07 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=282=2E7=29=3A_put_returns_on_?= =?utf8?q?their_own_lines?= Message-ID: http://hg.python.org/cpython/rev/93cfb0bff87a changeset: 74751:93cfb0bff87a branch: 2.7 parent: 74748:6fb2eb6398bf user: Benjamin Peterson date: Fri Feb 03 19:22:31 2012 -0500 summary: put returns on their own lines files: Objects/exceptions.c | 18 ++++++++++++------ 1 files changed, 12 insertions(+), 6 deletions(-) diff --git a/Objects/exceptions.c b/Objects/exceptions.c --- a/Objects/exceptions.c +++ b/Objects/exceptions.c @@ -306,7 +306,8 @@ return -1; } seq = PySequence_Tuple(val); - if (!seq) return -1; + if (!seq) + return -1; Py_CLEAR(self->args); self->args = seq; return 0; @@ -773,7 +774,8 @@ * file name given to EnvironmentError. */ if (PyTuple_GET_SIZE(args) == 2 && self->filename) { args = PyTuple_New(3); - if (!args) return NULL; + if (!args) + return NULL; tmp = PyTuple_GET_ITEM(self->args, 0); Py_INCREF(tmp); @@ -1071,7 +1073,8 @@ if (lenargs == 2) { info = PyTuple_GET_ITEM(args, 1); info = PySequence_Tuple(info); - if (!info) return -1; + if (!info) + return -1; if (PyTuple_GET_SIZE(info) != 4) { /* not a very good error message, but it's what Python 2.4 gives */ @@ -1167,9 +1170,11 @@ str = PyObject_Str(self->msg); else str = PyObject_Str(Py_None); - if (!str) return NULL; + if (!str) + return NULL; /* Don't fiddle with non-string return (shouldn't happen anyway) */ - if (!PyString_Check(str)) return str; + if (!PyString_Check(str)) + return str; /* XXX -- do all the additional formatting with filename and lineno here */ @@ -2111,7 +2116,8 @@ m = Py_InitModule4("exceptions", functions, exceptions_doc, (PyObject *)NULL, PYTHON_API_VERSION); - if (m == NULL) return; + if (m == NULL) + return; bltinmod = PyImport_ImportModule("__builtin__"); if (bltinmod == NULL) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sat Feb 4 01:25:07 2012 From: python-checkins at python.org (benjamin.peterson) Date: Sat, 04 Feb 2012 01:25:07 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=283=2E2=29=3A_put_returns_on_?= =?utf8?q?their_own_lines?= Message-ID: http://hg.python.org/cpython/rev/e35f1c431302 changeset: 74752:e35f1c431302 branch: 3.2 parent: 74749:9eb5fec8674b user: Benjamin Peterson date: Fri Feb 03 19:22:31 2012 -0500 summary: put returns on their own lines files: Objects/exceptions.c | 15 ++++++++++----- 1 files changed, 10 insertions(+), 5 deletions(-) diff --git a/Objects/exceptions.c b/Objects/exceptions.c --- a/Objects/exceptions.c +++ b/Objects/exceptions.c @@ -213,7 +213,8 @@ return -1; } seq = PySequence_Tuple(val); - if (!seq) return -1; + if (!seq) + return -1; Py_CLEAR(self->args); self->args = seq; return 0; @@ -252,7 +253,8 @@ static PyObject * BaseException_get_context(PyObject *self) { PyObject *res = PyException_GetContext(self); - if (res) return res; /* new reference already returned above */ + if (res) + return res; /* new reference already returned above */ Py_RETURN_NONE; } @@ -278,7 +280,8 @@ static PyObject * BaseException_get_cause(PyObject *self) { PyObject *res = PyException_GetCause(self); - if (res) return res; /* new reference already returned above */ + if (res) + return res; /* new reference already returned above */ Py_RETURN_NONE; } @@ -672,7 +675,8 @@ * file name given to EnvironmentError. */ if (PyTuple_GET_SIZE(args) == 2 && self->filename) { args = PyTuple_New(3); - if (!args) return NULL; + if (!args) + return NULL; tmp = PyTuple_GET_ITEM(self->args, 0); Py_INCREF(tmp); @@ -894,7 +898,8 @@ if (lenargs == 2) { info = PyTuple_GET_ITEM(args, 1); info = PySequence_Tuple(info); - if (!info) return -1; + if (!info) + return -1; if (PyTuple_GET_SIZE(info) != 4) { /* not a very good error message, but it's what Python 2.4 gives */ -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sat Feb 4 01:25:08 2012 From: python-checkins at python.org (benjamin.peterson) Date: Sat, 04 Feb 2012 01:25:08 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_3=2E2_-=3E_default=29?= =?utf8?q?=3A_merge_3=2E2?= Message-ID: http://hg.python.org/cpython/rev/50901238ad29 changeset: 74753:50901238ad29 parent: 74750:0b9799f8b4cb parent: 74752:e35f1c431302 user: Benjamin Peterson date: Fri Feb 03 19:25:01 2012 -0500 summary: merge 3.2 files: Objects/exceptions.c | 15 ++++++++++----- 1 files changed, 10 insertions(+), 5 deletions(-) diff --git a/Objects/exceptions.c b/Objects/exceptions.c --- a/Objects/exceptions.c +++ b/Objects/exceptions.c @@ -227,7 +227,8 @@ return -1; } seq = PySequence_Tuple(val); - if (!seq) return -1; + if (!seq) + return -1; Py_CLEAR(self->args); self->args = seq; return 0; @@ -266,7 +267,8 @@ static PyObject * BaseException_get_context(PyObject *self) { PyObject *res = PyException_GetContext(self); - if (res) return res; /* new reference already returned above */ + if (res) + return res; /* new reference already returned above */ Py_RETURN_NONE; } @@ -292,7 +294,8 @@ static PyObject * BaseException_get_cause(PyObject *self) { PyObject *res = PyException_GetCause(self); - if (res) return res; /* new reference already returned above */ + if (res) + return res; /* new reference already returned above */ Py_RETURN_NONE; } @@ -961,7 +964,8 @@ * file name given to OSError. */ if (PyTuple_GET_SIZE(args) == 2 && self->filename) { args = PyTuple_New(3); - if (!args) return NULL; + if (!args) + return NULL; tmp = PyTuple_GET_ITEM(self->args, 0); Py_INCREF(tmp); @@ -1132,7 +1136,8 @@ if (lenargs == 2) { info = PyTuple_GET_ITEM(args, 1); info = PySequence_Tuple(info); - if (!info) return -1; + if (!info) + return -1; if (PyTuple_GET_SIZE(info) != 4) { /* not a very good error message, but it's what Python 2.4 gives */ -- Repository URL: http://hg.python.org/cpython From solipsis at pitrou.net Sat Feb 4 05:30:39 2012 From: solipsis at pitrou.net (solipsis at pitrou.net) Date: Sat, 04 Feb 2012 05:30:39 +0100 Subject: [Python-checkins] Daily reference leaks (50901238ad29): sum=0 Message-ID: results for 50901238ad29 on branch "default" -------------------------------------------- Command line was: ['./python', '-m', 'test.regrtest', '-uall', '-R', '3:3:/home/antoine/cpython/refleaks/reflogwv7bzV', '-x'] From python-checkins at python.org Sat Feb 4 08:55:56 2012 From: python-checkins at python.org (georg.brandl) Date: Sat, 04 Feb 2012 08:55:56 +0100 Subject: [Python-checkins] =?utf8?q?cpython=3A_Small_grammar_fixes_by_Mark?= =?utf8?q?_Summerfield=2E?= Message-ID: http://hg.python.org/cpython/rev/57ccd573e71b changeset: 74754:57ccd573e71b user: Georg Brandl date: Sat Feb 04 08:55:56 2012 +0100 summary: Small grammar fixes by Mark Summerfield. files: Doc/whatsnew/3.3.rst | 20 ++++++++++---------- 1 files changed, 10 insertions(+), 10 deletions(-) diff --git a/Doc/whatsnew/3.3.rst b/Doc/whatsnew/3.3.rst --- a/Doc/whatsnew/3.3.rst +++ b/Doc/whatsnew/3.3.rst @@ -313,23 +313,23 @@ ------ The :mod:`~encodings.mbcs` codec has be rewritten to handle correclty -``replace`` and ``ignore`` error handlers on all Windows versions. The -:mod:`~encodings.mbcs` codec is now supporting all error handlers, instead of -only ``replace`` to encode and ``ignore`` to decode. +``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). +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 +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`) -Don't reset incremental encoders of CJK codecs at each call to their encode() -method anymore. For example:: +Incremental CJK codec encoders are no longer reset at each call to their +encode() methods. For example:: $ ./python -q >>> import codecs -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sat Feb 4 14:17:07 2012 From: python-checkins at python.org (nadeem.vawda) Date: Sat, 04 Feb 2012 14:17:07 +0100 Subject: [Python-checkins] =?utf8?q?cpython=3A_Update_docstring_for_BZ2Fil?= =?utf8?b?ZS5fX2luaXRfXygpLg==?= Message-ID: http://hg.python.org/cpython/rev/93bab621d053 changeset: 74755:93bab621d053 user: Nadeem Vawda date: Sat Feb 04 13:08:11 2012 +0200 summary: Update docstring for BZ2File.__init__(). files: Lib/bz2.py | 10 +++++++--- 1 files changed, 7 insertions(+), 3 deletions(-) diff --git a/Lib/bz2.py b/Lib/bz2.py --- a/Lib/bz2.py +++ b/Lib/bz2.py @@ -47,13 +47,17 @@ the file object given by fileobj. Exactly one of these two parameters should be provided. - mode can be 'r' for reading (default), or 'w' for writing. + mode can be 'r' for reading (default), 'w' for (over)writing, or + 'a' for appending. buffering is ignored. Its use is deprecated. - If mode is 'w', compresslevel can be a number between 1 and 9 - specifying the level of compression: 1 produces the least + 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. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sat Feb 4 14:17:08 2012 From: python-checkins at python.org (nadeem.vawda) Date: Sat, 04 Feb 2012 14:17:08 +0100 Subject: [Python-checkins] =?utf8?q?cpython=3A_Make_BZ2File=2E=5F=5Finit?= =?utf8?q?=5F=5F=28=29=27s_fileobj_argument_keyword-only=2E?= Message-ID: http://hg.python.org/cpython/rev/6f7d9455d3bb changeset: 74756:6f7d9455d3bb user: Nadeem Vawda date: Sat Feb 04 13:58:07 2012 +0200 summary: Make BZ2File.__init__()'s fileobj argument keyword-only. files: Doc/library/bz2.rst | 2 +- Lib/bz2.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Doc/library/bz2.rst b/Doc/library/bz2.rst --- a/Doc/library/bz2.rst +++ b/Doc/library/bz2.rst @@ -29,7 +29,7 @@ (De)compression of files ------------------------ -.. class:: BZ2File(filename=None, mode='r', buffering=None, compresslevel=9, fileobj=None) +.. class:: BZ2File(filename=None, mode='r', buffering=None, compresslevel=9, \*, fileobj=None) Open a bzip2-compressed file. diff --git a/Lib/bz2.py b/Lib/bz2.py --- a/Lib/bz2.py +++ b/Lib/bz2.py @@ -40,7 +40,7 @@ """ def __init__(self, filename=None, mode="r", buffering=None, - compresslevel=9, fileobj=None): + compresslevel=9, *, fileobj=None): """Open a bzip2-compressed file. If filename is given, open the named file. Otherwise, operate on -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sat Feb 4 14:17:09 2012 From: python-checkins at python.org (nadeem.vawda) Date: Sat, 04 Feb 2012 14:17:09 +0100 Subject: [Python-checkins] =?utf8?q?cpython=3A_Document_that_some_of_LZMAF?= =?utf8?b?aWxlLl9faW5pdF9fKCkncyBhcmdzIGFyZSBrZXl3b3JkLW9ubHku?= Message-ID: http://hg.python.org/cpython/rev/bce51190dd83 changeset: 74757:bce51190dd83 user: Nadeem Vawda date: Sat Feb 04 14:06:07 2012 +0200 summary: Document that some of LZMAFile.__init__()'s args are keyword-only. files: Doc/library/lzma.rst | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Doc/library/lzma.rst b/Doc/library/lzma.rst --- a/Doc/library/lzma.rst +++ b/Doc/library/lzma.rst @@ -32,7 +32,7 @@ Reading and writing compressed files ------------------------------------ -.. class:: LZMAFile(filename=None, mode="r", fileobj=None, format=None, check=-1, preset=None, filters=None) +.. class:: LZMAFile(filename=None, mode="r", \*, fileobj=None, format=None, check=-1, preset=None, filters=None) Open an LZMA-compressed file. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sat Feb 4 15:13:10 2012 From: python-checkins at python.org (charles-francois.natali) Date: Sat, 04 Feb 2012 15:13:10 +0100 Subject: [Python-checkins] =?utf8?b?Y3B5dGhvbiAoMi43KTogSXNzdWUgIzgxODQ6?= =?utf8?q?_Fix_a_potential_file_descriptor_leak_when_a?= Message-ID: http://hg.python.org/cpython/rev/887d0ab5fb97 changeset: 74758:887d0ab5fb97 branch: 2.7 parent: 74751:93cfb0bff87a user: Charles-Fran?ois Natali date: Sat Feb 04 14:40:25 2012 +0100 summary: Issue #8184: Fix a potential file descriptor leak when a multiprocessing.Connection socket can't be bound. files: Lib/multiprocessing/connection.py | 12 ++++++++---- 1 files changed, 8 insertions(+), 4 deletions(-) diff --git a/Lib/multiprocessing/connection.py b/Lib/multiprocessing/connection.py --- a/Lib/multiprocessing/connection.py +++ b/Lib/multiprocessing/connection.py @@ -249,10 +249,14 @@ ''' def __init__(self, address, family, backlog=1): self._socket = socket.socket(getattr(socket, family)) - self._socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) - self._socket.bind(address) - self._socket.listen(backlog) - self._address = self._socket.getsockname() + try: + self._socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) + self._socket.bind(address) + self._socket.listen(backlog) + self._address = self._socket.getsockname() + except socket.error: + self._socket.close() + raise self._family = family self._last_accepted = None -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sat Feb 4 15:13:11 2012 From: python-checkins at python.org (charles-francois.natali) Date: Sat, 04 Feb 2012 15:13:11 +0100 Subject: [Python-checkins] =?utf8?b?Y3B5dGhvbiAoMy4yKTogSXNzdWUgIzgxODQ6?= =?utf8?q?_Fix_a_potential_file_descriptor_leak_when_a?= Message-ID: http://hg.python.org/cpython/rev/ba1e0a1ac5b7 changeset: 74759:ba1e0a1ac5b7 branch: 3.2 parent: 74752:e35f1c431302 user: Charles-Fran?ois Natali date: Sat Feb 04 14:55:53 2012 +0100 summary: Issue #8184: Fix a potential file descriptor leak when a multiprocessing.Connection socket can't be bound. files: Lib/multiprocessing/connection.py | 12 ++++++++---- 1 files changed, 8 insertions(+), 4 deletions(-) diff --git a/Lib/multiprocessing/connection.py b/Lib/multiprocessing/connection.py --- a/Lib/multiprocessing/connection.py +++ b/Lib/multiprocessing/connection.py @@ -249,10 +249,14 @@ ''' def __init__(self, address, family, backlog=1): self._socket = socket.socket(getattr(socket, family)) - self._socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) - self._socket.bind(address) - self._socket.listen(backlog) - self._address = self._socket.getsockname() + try: + self._socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) + self._socket.bind(address) + self._socket.listen(backlog) + self._address = self._socket.getsockname() + except socket.error: + self._socket.close() + raise self._family = family self._last_accepted = None -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sat Feb 4 15:13:12 2012 From: python-checkins at python.org (charles-francois.natali) Date: Sat, 04 Feb 2012 15:13:12 +0100 Subject: [Python-checkins] =?utf8?q?cpython=3A_Issue_=238184=3A_Fix_a_pote?= =?utf8?q?ntial_file_descriptor_leak_when_a?= Message-ID: http://hg.python.org/cpython/rev/cca40a0ecffa changeset: 74760:cca40a0ecffa parent: 74757:bce51190dd83 user: Charles-Fran?ois Natali date: Sat Feb 04 15:12:08 2012 +0100 summary: Issue #8184: Fix a potential file descriptor leak when a multiprocessing.Connection socket can't be bound. files: Lib/multiprocessing/connection.py | 12 ++++++++---- 1 files changed, 8 insertions(+), 4 deletions(-) diff --git a/Lib/multiprocessing/connection.py b/Lib/multiprocessing/connection.py --- a/Lib/multiprocessing/connection.py +++ b/Lib/multiprocessing/connection.py @@ -575,10 +575,14 @@ ''' def __init__(self, address, family, backlog=1): self._socket = socket.socket(getattr(socket, family)) - self._socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) - self._socket.bind(address) - self._socket.listen(backlog) - self._address = self._socket.getsockname() + try: + self._socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) + self._socket.bind(address) + self._socket.listen(backlog) + self._address = self._socket.getsockname() + except OSError: + self._socket.close() + raise self._family = family self._last_accepted = None -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sat Feb 4 15:56:48 2012 From: python-checkins at python.org (benjamin.peterson) Date: Sat, 04 Feb 2012 15:56:48 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_3=2E2_-=3E_default=29?= =?utf8?q?=3A_merge_3=2E2?= Message-ID: http://hg.python.org/cpython/rev/204e40fa250d changeset: 74762:204e40fa250d parent: 74760:cca40a0ecffa parent: 74761:048e38c87883 user: Benjamin Peterson date: Sat Feb 04 09:56:43 2012 -0500 summary: merge 3.2 files: Doc/library/multiprocessing.rst | 8 -------- 1 files changed, 0 insertions(+), 8 deletions(-) diff --git a/Doc/library/multiprocessing.rst b/Doc/library/multiprocessing.rst --- a/Doc/library/multiprocessing.rst +++ b/Doc/library/multiprocessing.rst @@ -900,14 +900,6 @@ .. note:: - The :meth:`acquire` method of :class:`BoundedSemaphore`, :class:`Lock`, - :class:`RLock` and :class:`Semaphore` has a timeout parameter not supported - by the equivalents in :mod:`threading`. The signature is - ``acquire(block=True, timeout=None)`` with keyword parameters being - acceptable. If *block* is ``True`` and *timeout* is not ``None`` then it - specifies a timeout in seconds. If *block* is ``False`` then *timeout* is - ignored. - On Mac OS X, ``sem_timedwait`` is unsupported, so calling ``acquire()`` with a timeout will emulate that function's behavior using a sleeping loop. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sat Feb 4 15:56:47 2012 From: python-checkins at python.org (benjamin.peterson) Date: Sat, 04 Feb 2012 15:56:47 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=283=2E2=29=3A_threading_primi?= =?utf8?q?tives_now_have_timeouts?= Message-ID: http://hg.python.org/cpython/rev/048e38c87883 changeset: 74761:048e38c87883 branch: 3.2 parent: 74759:ba1e0a1ac5b7 user: Benjamin Peterson date: Sat Feb 04 09:55:52 2012 -0500 summary: threading primitives now have timeouts files: Doc/library/multiprocessing.rst | 8 -------- 1 files changed, 0 insertions(+), 8 deletions(-) diff --git a/Doc/library/multiprocessing.rst b/Doc/library/multiprocessing.rst --- a/Doc/library/multiprocessing.rst +++ b/Doc/library/multiprocessing.rst @@ -876,14 +876,6 @@ .. note:: - The :meth:`acquire` method of :class:`BoundedSemaphore`, :class:`Lock`, - :class:`RLock` and :class:`Semaphore` has a timeout parameter not supported - by the equivalents in :mod:`threading`. The signature is - ``acquire(block=True, timeout=None)`` with keyword parameters being - acceptable. If *block* is ``True`` and *timeout* is not ``None`` then it - specifies a timeout in seconds. If *block* is ``False`` then *timeout* is - ignored. - On Mac OS X, ``sem_timedwait`` is unsupported, so calling ``acquire()`` with a timeout will emulate that function's behavior using a sleeping loop. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sat Feb 4 16:46:58 2012 From: python-checkins at python.org (antoine.pitrou) Date: Sat, 04 Feb 2012 16:46:58 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=282=2E7=29=3A_Fix_failing_tes?= =?utf8?q?t_on_big-endian_machines_=28issue_=2313806=29=2E?= Message-ID: http://hg.python.org/cpython/rev/bc6e768de2cc changeset: 74763:bc6e768de2cc branch: 2.7 parent: 74758:887d0ab5fb97 user: Antoine Pitrou date: Sat Feb 04 16:44:21 2012 +0100 summary: Fix failing test on big-endian machines (issue #13806). files: Lib/test/test_audioop.py | 31 ++++++++++++++++++++------- 1 files changed, 23 insertions(+), 8 deletions(-) diff --git a/Lib/test/test_audioop.py b/Lib/test/test_audioop.py --- a/Lib/test/test_audioop.py +++ b/Lib/test/test_audioop.py @@ -2,18 +2,19 @@ import unittest from test.test_support import run_unittest +endian = 'big' if audioop.getsample('\0\1', 2, 0) == 1 else 'little' def gendata1(): return '\0\1\2' def gendata2(): - if audioop.getsample('\0\1', 2, 0) == 1: + if endian == 'big': return '\0\0\0\1\0\2' else: return '\0\0\1\0\2\0' def gendata4(): - if audioop.getsample('\0\0\0\1', 4, 0) == 1: + if endian == 'big': return '\0\0\0\0\0\0\0\1\0\0\0\2' else: return '\0\0\0\0\1\0\0\0\2\0\0\0' @@ -111,9 +112,16 @@ # Cursory d = audioop.lin2alaw(data[0], 1) self.assertEqual(audioop.alaw2lin(d, 1), data[0]) - self.assertEqual(audioop.alaw2lin(d, 2), b'\x08\x00\x08\x01\x10\x02') - self.assertEqual(audioop.alaw2lin(d, 4), - b'\x00\x00\x08\x00\x00\x00\x08\x01\x00\x00\x10\x02') + if endian == 'big': + self.assertEqual(audioop.alaw2lin(d, 2), + b'\x00\x08\x01\x08\x02\x10') + self.assertEqual(audioop.alaw2lin(d, 4), + b'\x00\x08\x00\x00\x01\x08\x00\x00\x02\x10\x00\x00') + else: + self.assertEqual(audioop.alaw2lin(d, 2), + b'\x08\x00\x08\x01\x10\x02') + self.assertEqual(audioop.alaw2lin(d, 4), + b'\x00\x00\x08\x00\x00\x00\x08\x01\x00\x00\x10\x02') def test_lin2ulaw(self): self.assertEqual(audioop.lin2ulaw(data[0], 1), '\xff\xe7\xdb') @@ -124,9 +132,16 @@ # Cursory d = audioop.lin2ulaw(data[0], 1) self.assertEqual(audioop.ulaw2lin(d, 1), data[0]) - self.assertEqual(audioop.ulaw2lin(d, 2), b'\x00\x00\x04\x01\x0c\x02') - self.assertEqual(audioop.ulaw2lin(d, 4), - b'\x00\x00\x00\x00\x00\x00\x04\x01\x00\x00\x0c\x02') + if endian == 'big': + self.assertEqual(audioop.ulaw2lin(d, 2), + b'\x00\x00\x01\x04\x02\x0c') + self.assertEqual(audioop.ulaw2lin(d, 4), + b'\x00\x00\x00\x00\x01\x04\x00\x00\x02\x0c\x00\x00') + else: + self.assertEqual(audioop.ulaw2lin(d, 2), + b'\x00\x00\x04\x01\x0c\x02') + self.assertEqual(audioop.ulaw2lin(d, 4), + b'\x00\x00\x00\x00\x00\x00\x04\x01\x00\x00\x0c\x02') def test_mul(self): data2 = [] -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sat Feb 4 16:52:08 2012 From: python-checkins at python.org (antoine.pitrou) Date: Sat, 04 Feb 2012 16:52:08 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=283=2E2=29=3A_Fix_failing_tes?= =?utf8?q?t_on_big-endian_machines_=28issue_=2313806=29=2E?= Message-ID: http://hg.python.org/cpython/rev/cfbd800af3a4 changeset: 74764:cfbd800af3a4 branch: 3.2 parent: 74761:048e38c87883 user: Antoine Pitrou date: Sat Feb 04 16:44:21 2012 +0100 summary: Fix failing test on big-endian machines (issue #13806). files: Lib/test/test_audioop.py | 31 ++++++++++++++++++++------- 1 files changed, 23 insertions(+), 8 deletions(-) diff --git a/Lib/test/test_audioop.py b/Lib/test/test_audioop.py --- a/Lib/test/test_audioop.py +++ b/Lib/test/test_audioop.py @@ -2,18 +2,19 @@ import unittest from test.support import run_unittest +endian = 'big' if audioop.getsample(b'\0\1', 2, 0) == 1 else 'little' def gendata1(): return b'\0\1\2' def gendata2(): - if audioop.getsample(b'\0\1', 2, 0) == 1: + if endian == 'big': return b'\0\0\0\1\0\2' else: return b'\0\0\1\0\2\0' def gendata4(): - if audioop.getsample(b'\0\0\0\1', 4, 0) == 1: + if endian == 'big': return b'\0\0\0\0\0\0\0\1\0\0\0\2' else: return b'\0\0\0\0\1\0\0\0\2\0\0\0' @@ -111,9 +112,16 @@ # Cursory d = audioop.lin2alaw(data[0], 1) self.assertEqual(audioop.alaw2lin(d, 1), data[0]) - self.assertEqual(audioop.alaw2lin(d, 2), b'\x08\x00\x08\x01\x10\x02') - self.assertEqual(audioop.alaw2lin(d, 4), - b'\x00\x00\x08\x00\x00\x00\x08\x01\x00\x00\x10\x02') + if endian == 'big': + self.assertEqual(audioop.alaw2lin(d, 2), + b'\x00\x08\x01\x08\x02\x10') + self.assertEqual(audioop.alaw2lin(d, 4), + b'\x00\x08\x00\x00\x01\x08\x00\x00\x02\x10\x00\x00') + else: + self.assertEqual(audioop.alaw2lin(d, 2), + b'\x08\x00\x08\x01\x10\x02') + self.assertEqual(audioop.alaw2lin(d, 4), + b'\x00\x00\x08\x00\x00\x00\x08\x01\x00\x00\x10\x02') def test_lin2ulaw(self): self.assertEqual(audioop.lin2ulaw(data[0], 1), b'\xff\xe7\xdb') @@ -124,9 +132,16 @@ # Cursory d = audioop.lin2ulaw(data[0], 1) self.assertEqual(audioop.ulaw2lin(d, 1), data[0]) - self.assertEqual(audioop.ulaw2lin(d, 2), b'\x00\x00\x04\x01\x0c\x02') - self.assertEqual(audioop.ulaw2lin(d, 4), - b'\x00\x00\x00\x00\x00\x00\x04\x01\x00\x00\x0c\x02') + if endian == 'big': + self.assertEqual(audioop.ulaw2lin(d, 2), + b'\x00\x00\x01\x04\x02\x0c') + self.assertEqual(audioop.ulaw2lin(d, 4), + b'\x00\x00\x00\x00\x01\x04\x00\x00\x02\x0c\x00\x00') + else: + self.assertEqual(audioop.ulaw2lin(d, 2), + b'\x00\x00\x04\x01\x0c\x02') + self.assertEqual(audioop.ulaw2lin(d, 4), + b'\x00\x00\x00\x00\x00\x00\x04\x01\x00\x00\x0c\x02') def test_mul(self): data2 = [] -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sat Feb 4 16:52:13 2012 From: python-checkins at python.org (antoine.pitrou) Date: Sat, 04 Feb 2012 16:52:13 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_3=2E2_-=3E_default=29?= =?utf8?q?=3A_Fix_failing_test_on_big-endian_machines_=28issue_=2313806=29?= =?utf8?q?=2E?= Message-ID: http://hg.python.org/cpython/rev/05b40b006565 changeset: 74765:05b40b006565 parent: 74762:204e40fa250d parent: 74764:cfbd800af3a4 user: Antoine Pitrou date: Sat Feb 04 16:49:31 2012 +0100 summary: Fix failing test on big-endian machines (issue #13806). files: Lib/test/test_audioop.py | 31 ++++++++++++++++++++------- 1 files changed, 23 insertions(+), 8 deletions(-) diff --git a/Lib/test/test_audioop.py b/Lib/test/test_audioop.py --- a/Lib/test/test_audioop.py +++ b/Lib/test/test_audioop.py @@ -2,18 +2,19 @@ import unittest from test.support import run_unittest +endian = 'big' if audioop.getsample(b'\0\1', 2, 0) == 1 else 'little' def gendata1(): return b'\0\1\2' def gendata2(): - if audioop.getsample(b'\0\1', 2, 0) == 1: + if endian == 'big': return b'\0\0\0\1\0\2' else: return b'\0\0\1\0\2\0' def gendata4(): - if audioop.getsample(b'\0\0\0\1', 4, 0) == 1: + if endian == 'big': return b'\0\0\0\0\0\0\0\1\0\0\0\2' else: return b'\0\0\0\0\1\0\0\0\2\0\0\0' @@ -111,9 +112,16 @@ # Cursory d = audioop.lin2alaw(data[0], 1) self.assertEqual(audioop.alaw2lin(d, 1), data[0]) - self.assertEqual(audioop.alaw2lin(d, 2), b'\x08\x00\x08\x01\x10\x02') - self.assertEqual(audioop.alaw2lin(d, 4), - b'\x00\x00\x08\x00\x00\x00\x08\x01\x00\x00\x10\x02') + if endian == 'big': + self.assertEqual(audioop.alaw2lin(d, 2), + b'\x00\x08\x01\x08\x02\x10') + self.assertEqual(audioop.alaw2lin(d, 4), + b'\x00\x08\x00\x00\x01\x08\x00\x00\x02\x10\x00\x00') + else: + self.assertEqual(audioop.alaw2lin(d, 2), + b'\x08\x00\x08\x01\x10\x02') + self.assertEqual(audioop.alaw2lin(d, 4), + b'\x00\x00\x08\x00\x00\x00\x08\x01\x00\x00\x10\x02') def test_lin2ulaw(self): self.assertEqual(audioop.lin2ulaw(data[0], 1), b'\xff\xe7\xdb') @@ -124,9 +132,16 @@ # Cursory d = audioop.lin2ulaw(data[0], 1) self.assertEqual(audioop.ulaw2lin(d, 1), data[0]) - self.assertEqual(audioop.ulaw2lin(d, 2), b'\x00\x00\x04\x01\x0c\x02') - self.assertEqual(audioop.ulaw2lin(d, 4), - b'\x00\x00\x00\x00\x00\x00\x04\x01\x00\x00\x0c\x02') + if endian == 'big': + self.assertEqual(audioop.ulaw2lin(d, 2), + b'\x00\x00\x01\x04\x02\x0c') + self.assertEqual(audioop.ulaw2lin(d, 4), + b'\x00\x00\x00\x00\x01\x04\x00\x00\x02\x0c\x00\x00') + else: + self.assertEqual(audioop.ulaw2lin(d, 2), + b'\x00\x00\x04\x01\x0c\x02') + self.assertEqual(audioop.ulaw2lin(d, 4), + b'\x00\x00\x00\x00\x00\x00\x04\x01\x00\x00\x0c\x02') def test_mul(self): data2 = [] -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sat Feb 4 18:38:45 2012 From: python-checkins at python.org (ned.deily) Date: Sat, 04 Feb 2012 18:38:45 +0100 Subject: [Python-checkins] =?utf8?b?Y3B5dGhvbiAoMi43KTogSXNzdWUgIzEzOTMz?= =?utf8?q?=3A_IDLE_auto-complete_did_not_work_with_some_imported?= Message-ID: http://hg.python.org/cpython/rev/741d4aaf7947 changeset: 74766:741d4aaf7947 branch: 2.7 parent: 74763:bc6e768de2cc user: Ned Deily date: Sat Feb 04 18:35:23 2012 +0100 summary: Issue #13933: IDLE auto-complete did not work with some imported module, like hashlib. (Patch by Roger Serwy) files: Lib/idlelib/AutoComplete.py | 4 ++-- Misc/NEWS | 3 +++ 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/Lib/idlelib/AutoComplete.py b/Lib/idlelib/AutoComplete.py --- a/Lib/idlelib/AutoComplete.py +++ b/Lib/idlelib/AutoComplete.py @@ -190,7 +190,7 @@ bigl = eval("dir()", namespace) bigl.sort() if "__all__" in bigl: - smalll = eval("__all__", namespace) + smalll = list(eval("__all__", namespace)) smalll.sort() else: smalll = [s for s in bigl if s[:1] != '_'] @@ -200,7 +200,7 @@ bigl = dir(entity) bigl.sort() if "__all__" in bigl: - smalll = entity.__all__ + smalll = list(entity.__all__) smalll.sort() else: smalll = [s for s in bigl if s[:1] != '_'] diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -90,6 +90,9 @@ Library ------- +- 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. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sat Feb 4 18:38:46 2012 From: python-checkins at python.org (ned.deily) Date: Sat, 04 Feb 2012 18:38:46 +0100 Subject: [Python-checkins] =?utf8?b?Y3B5dGhvbiAoMy4yKTogSXNzdWUgIzEzOTMz?= =?utf8?q?=3A_IDLE_auto-complete_did_not_work_with_some_imported?= Message-ID: http://hg.python.org/cpython/rev/3e9a7fdf0498 changeset: 74767:3e9a7fdf0498 branch: 3.2 parent: 74764:cfbd800af3a4 user: Ned Deily date: Sat Feb 04 18:36:43 2012 +0100 summary: Issue #13933: IDLE auto-complete did not work with some imported module, like hashlib. (Patch by Roger Serwy) files: Lib/idlelib/AutoComplete.py | 4 ++-- Misc/NEWS | 3 +++ 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/Lib/idlelib/AutoComplete.py b/Lib/idlelib/AutoComplete.py --- a/Lib/idlelib/AutoComplete.py +++ b/Lib/idlelib/AutoComplete.py @@ -190,7 +190,7 @@ bigl = eval("dir()", namespace) bigl.sort() if "__all__" in bigl: - smalll = eval("__all__", namespace) + smalll = list(eval("__all__", namespace)) smalll.sort() else: smalll = [s for s in bigl if s[:1] != '_'] @@ -200,7 +200,7 @@ bigl = dir(entity) bigl.sort() if "__all__" in bigl: - smalll = entity.__all__ + smalll = list(entity.__all__) smalll.sort() else: smalll = [s for s in bigl if s[:1] != '_'] diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -113,6 +113,9 @@ Library ------- +- 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. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sat Feb 4 18:38:46 2012 From: python-checkins at python.org (ned.deily) Date: Sat, 04 Feb 2012 18:38:46 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_3=2E2_-=3E_default=29?= =?utf8?q?=3A_Issue_=2313933=3A_merge?= Message-ID: http://hg.python.org/cpython/rev/443772a82dcd changeset: 74768:443772a82dcd parent: 74765:05b40b006565 parent: 74767:3e9a7fdf0498 user: Ned Deily date: Sat Feb 04 18:38:10 2012 +0100 summary: Issue #13933: merge files: Lib/idlelib/AutoComplete.py | 4 ++-- Misc/NEWS | 3 +++ 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/Lib/idlelib/AutoComplete.py b/Lib/idlelib/AutoComplete.py --- a/Lib/idlelib/AutoComplete.py +++ b/Lib/idlelib/AutoComplete.py @@ -190,7 +190,7 @@ bigl = eval("dir()", namespace) bigl.sort() if "__all__" in bigl: - smalll = eval("__all__", namespace) + smalll = list(eval("__all__", namespace)) smalll.sort() else: smalll = [s for s in bigl if s[:1] != '_'] @@ -200,7 +200,7 @@ bigl = dir(entity) bigl.sort() if "__all__" in bigl: - smalll = entity.__all__ + smalll = list(entity.__all__) smalll.sort() else: smalll = [s for s in bigl if s[:1] != '_'] diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -466,6 +466,9 @@ Library ------- +- 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. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sat Feb 4 22:46:54 2012 From: python-checkins at python.org (nadeem.vawda) Date: Sat, 04 Feb 2012 22:46:54 +0100 Subject: [Python-checkins] =?utf8?b?Y3B5dGhvbiAoMi43KTogSXNzdWUgIzE2MjU6?= =?utf8?q?_Document_BZ2File=27s_lack_of_support_for_multi-stream_inputs=2E?= Message-ID: http://hg.python.org/cpython/rev/e73d549b7458 changeset: 74769:e73d549b7458 branch: 2.7 parent: 74766:741d4aaf7947 user: Nadeem Vawda date: Sat Feb 04 23:43:25 2012 +0200 summary: Issue #1625: Document BZ2File's lack of support for multi-stream inputs. files: Doc/library/bz2.rst | 9 +++++++++ 1 files changed, 9 insertions(+), 0 deletions(-) diff --git a/Doc/library/bz2.rst b/Doc/library/bz2.rst --- a/Doc/library/bz2.rst +++ b/Doc/library/bz2.rst @@ -67,6 +67,15 @@ Support for the :keyword:`with` statement was added. + .. 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 `bz2file + module `_ instead of this class. + + .. method:: close() Close the file. Sets data attribute :attr:`closed` to true. A closed file -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sat Feb 4 22:46:54 2012 From: python-checkins at python.org (nadeem.vawda) Date: Sat, 04 Feb 2012 22:46:54 +0100 Subject: [Python-checkins] =?utf8?b?Y3B5dGhvbiAoMy4yKTogSXNzdWUgIzE2MjU6?= =?utf8?q?_Document_BZ2File=27s_lack_of_support_for_multi-stream_inputs=2E?= Message-ID: http://hg.python.org/cpython/rev/190826ee0450 changeset: 74770:190826ee0450 branch: 3.2 parent: 74767:3e9a7fdf0498 user: Nadeem Vawda date: Sat Feb 04 23:44:49 2012 +0200 summary: Issue #1625: Document BZ2File's lack of support for multi-stream inputs. files: Doc/library/bz2.rst | 9 +++++++++ 1 files changed, 9 insertions(+), 0 deletions(-) diff --git a/Doc/library/bz2.rst b/Doc/library/bz2.rst --- a/Doc/library/bz2.rst +++ b/Doc/library/bz2.rst @@ -65,6 +65,15 @@ Support for the :keyword:`with` statement was added. + .. 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 `bz2file + module `_ instead of this class. + + .. method:: close() Close the file. Sets data attribute :attr:`closed` to true. A closed file -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sat Feb 4 22:46:55 2012 From: python-checkins at python.org (nadeem.vawda) Date: Sat, 04 Feb 2012 22:46:55 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_3=2E2_-=3E_default=29?= =?utf8?q?=3A_Null_merge=2E?= Message-ID: http://hg.python.org/cpython/rev/fd424ccc8cee changeset: 74771:fd424ccc8cee parent: 74768:443772a82dcd parent: 74770:190826ee0450 user: Nadeem Vawda date: Sat Feb 04 23:45:40 2012 +0200 summary: Null merge. files: -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Feb 5 01:46:10 2012 From: python-checkins at python.org (victor.stinner) Date: Sun, 05 Feb 2012 01:46:10 +0100 Subject: [Python-checkins] =?utf8?q?cpython=3A_=5FPy=5FIdentifier_are_alwa?= =?utf8?q?ys_ASCII_strings?= Message-ID: http://hg.python.org/cpython/rev/d2c1521ad0a1 changeset: 74772:d2c1521ad0a1 user: Victor Stinner date: Sun Feb 05 01:45:45 2012 +0100 summary: _Py_Identifier are always ASCII strings files: Objects/unicodeobject.c | 5 ++--- 1 files changed, 2 insertions(+), 3 deletions(-) diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -1744,9 +1744,8 @@ _PyUnicode_FromId(_Py_Identifier *id) { if (!id->object) { - id->object = PyUnicode_DecodeUTF8Stateful(id->string, - strlen(id->string), - NULL, NULL); + id->object = unicode_fromascii((unsigned char*)id->string, + strlen(id->string)); if (!id->object) return NULL; PyUnicode_InternInPlace(&id->object); -- Repository URL: http://hg.python.org/cpython From solipsis at pitrou.net Sun Feb 5 05:31:55 2012 From: solipsis at pitrou.net (solipsis at pitrou.net) Date: Sun, 05 Feb 2012 05:31:55 +0100 Subject: [Python-checkins] Daily reference leaks (d2c1521ad0a1): sum=0 Message-ID: results for d2c1521ad0a1 on branch "default" -------------------------------------------- Command line was: ['./python', '-m', 'test.regrtest', '-uall', '-R', '3:3:/home/antoine/cpython/refleaks/reflogvTHyva', '-x'] From python-checkins at python.org Sun Feb 5 07:29:09 2012 From: python-checkins at python.org (meador.inge) Date: Sun, 05 Feb 2012 07:29:09 +0100 Subject: [Python-checkins] =?utf8?b?Y3B5dGhvbiAoMy4yKTogSXNzdWUgIzEyMTQy?= =?utf8?q?=3A_Fixed_reference_cycle_when_importing_ctypes?= Message-ID: http://hg.python.org/cpython/rev/205da7a19a78 changeset: 74773:205da7a19a78 branch: 3.2 parent: 74770:190826ee0450 user: Meador Inge date: Sat Feb 04 20:36:48 2012 -0600 summary: Issue #12142: Fixed reference cycle when importing ctypes files: Lib/ctypes/_endian.py | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Lib/ctypes/_endian.py b/Lib/ctypes/_endian.py --- a/Lib/ctypes/_endian.py +++ b/Lib/ctypes/_endian.py @@ -1,7 +1,7 @@ import sys from ctypes import * -_array_type = type(c_int * 3) +_array_type = type(Array) def _other_endian(typ): """Return the type with the 'other' byte order. Simple types like -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Feb 5 07:29:39 2012 From: python-checkins at python.org (meador.inge) Date: Sun, 05 Feb 2012 07:29:39 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_3=2E2_-=3E_default=29?= =?utf8?q?=3A_Issue_=2312142=3A_Fixed_reference_cycle_when_importing_ctype?= =?utf8?q?s?= Message-ID: http://hg.python.org/cpython/rev/b228d9da8bd3 changeset: 74774:b228d9da8bd3 parent: 74772:d2c1521ad0a1 parent: 74773:205da7a19a78 user: Meador Inge date: Sat Feb 04 20:38:20 2012 -0600 summary: Issue #12142: Fixed reference cycle when importing ctypes files: Lib/ctypes/_endian.py | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Lib/ctypes/_endian.py b/Lib/ctypes/_endian.py --- a/Lib/ctypes/_endian.py +++ b/Lib/ctypes/_endian.py @@ -1,7 +1,7 @@ import sys from ctypes import * -_array_type = type(c_int * 3) +_array_type = type(Array) def _other_endian(typ): """Return the type with the 'other' byte order. Simple types like -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Feb 5 07:30:11 2012 From: python-checkins at python.org (meador.inge) Date: Sun, 05 Feb 2012 07:30:11 +0100 Subject: [Python-checkins] =?utf8?b?Y3B5dGhvbiAoMi43KTogSXNzdWUgIzEyMTQy?= =?utf8?q?=3A_Fixed_reference_cycle_when_importing_ctypes?= Message-ID: http://hg.python.org/cpython/rev/7cdbf627f958 changeset: 74775:7cdbf627f958 branch: 2.7 parent: 74769:e73d549b7458 user: Meador Inge date: Sun Feb 05 00:27:40 2012 -0600 summary: Issue #12142: Fixed reference cycle when importing ctypes files: Lib/ctypes/_endian.py | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Lib/ctypes/_endian.py b/Lib/ctypes/_endian.py --- a/Lib/ctypes/_endian.py +++ b/Lib/ctypes/_endian.py @@ -4,7 +4,7 @@ import sys from ctypes import * -_array_type = type(c_int * 3) +_array_type = type(Array) def _other_endian(typ): """Return the type with the 'other' byte order. Simple types like -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Feb 5 09:28:40 2012 From: python-checkins at python.org (georg.brandl) Date: Sun, 05 Feb 2012 09:28:40 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=282=2E7=29=3A_Closes_=2313944?= =?utf8?q?=3A_fix_capitalization_of_class_name=2E?= Message-ID: http://hg.python.org/cpython/rev/7c263bfc92f5 changeset: 74776:7c263bfc92f5 branch: 2.7 user: Georg Brandl date: Sun Feb 05 09:25:22 2012 +0100 summary: Closes #13944: fix capitalization of class name. files: Doc/library/hmac.rst | 9 ++++----- 1 files changed, 4 insertions(+), 5 deletions(-) diff --git a/Doc/library/hmac.rst b/Doc/library/hmac.rst --- a/Doc/library/hmac.rst +++ b/Doc/library/hmac.rst @@ -25,29 +25,28 @@ An HMAC object has the following methods: - -.. method:: hmac.update(msg) +.. method:: HMAC.update(msg) Update the hmac object with the string *msg*. Repeated calls are equivalent to a single call with the concatenation of all the arguments: ``m.update(a); m.update(b)`` is equivalent to ``m.update(a + b)``. -.. method:: hmac.digest() +.. method:: HMAC.digest() Return the digest of the strings passed to the :meth:`update` method so far. This string will be the same length as the *digest_size* of the digest given to the constructor. It may contain non-ASCII characters, including NUL bytes. -.. method:: hmac.hexdigest() +.. method:: HMAC.hexdigest() Like :meth:`digest` except the digest is returned as a string twice the length containing only hexadecimal digits. This may be used to exchange the value safely in email or other non-binary environments. -.. method:: hmac.copy() +.. method:: HMAC.copy() Return a copy ("clone") of the hmac object. This can be used to efficiently compute the digests of strings that share a common initial substring. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Feb 5 09:28:41 2012 From: python-checkins at python.org (georg.brandl) Date: Sun, 05 Feb 2012 09:28:41 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=283=2E2=29=3A_Closes_=2313944?= =?utf8?q?=3A_fix_capitalization_of_class_name=2E?= Message-ID: http://hg.python.org/cpython/rev/cd748bab3cdd changeset: 74777:cd748bab3cdd branch: 3.2 parent: 74773:205da7a19a78 user: Georg Brandl date: Sun Feb 05 09:25:22 2012 +0100 summary: Closes #13944: fix capitalization of class name. files: Doc/library/hmac.rst | 8 ++++---- 1 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Doc/library/hmac.rst b/Doc/library/hmac.rst --- a/Doc/library/hmac.rst +++ b/Doc/library/hmac.rst @@ -24,14 +24,14 @@ An HMAC object has the following methods: -.. method:: hmac.update(msg) +.. method:: HMAC.update(msg) Update the hmac object with the bytes object *msg*. Repeated calls are equivalent to a single call with the concatenation of all the arguments: ``m.update(a); m.update(b)`` is equivalent to ``m.update(a + b)``. -.. method:: hmac.digest() +.. method:: HMAC.digest() Return the digest of the bytes passed to the :meth:`update` method so far. This bytes object will be the same length as the *digest_size* of the digest @@ -39,14 +39,14 @@ bytes. -.. method:: hmac.hexdigest() +.. method:: HMAC.hexdigest() Like :meth:`digest` except the digest is returned as a string twice the length containing only hexadecimal digits. This may be used to exchange the value safely in email or other non-binary environments. -.. method:: hmac.copy() +.. method:: HMAC.copy() Return a copy ("clone") of the hmac object. This can be used to efficiently compute the digests of strings that share a common initial substring. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Feb 5 09:28:41 2012 From: python-checkins at python.org (georg.brandl) Date: Sun, 05 Feb 2012 09:28:41 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_3=2E2_-=3E_default=29?= =?utf8?q?=3A_merge_with_3=2E2?= Message-ID: http://hg.python.org/cpython/rev/ca8c2a185aa3 changeset: 74778:ca8c2a185aa3 parent: 74774:b228d9da8bd3 parent: 74777:cd748bab3cdd user: Georg Brandl date: Sun Feb 05 09:28:39 2012 +0100 summary: merge with 3.2 files: Doc/library/hmac.rst | 8 ++++---- 1 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Doc/library/hmac.rst b/Doc/library/hmac.rst --- a/Doc/library/hmac.rst +++ b/Doc/library/hmac.rst @@ -24,14 +24,14 @@ An HMAC object has the following methods: -.. method:: hmac.update(msg) +.. method:: HMAC.update(msg) Update the hmac object with the bytes object *msg*. Repeated calls are equivalent to a single call with the concatenation of all the arguments: ``m.update(a); m.update(b)`` is equivalent to ``m.update(a + b)``. -.. method:: hmac.digest() +.. method:: HMAC.digest() Return the digest of the bytes passed to the :meth:`update` method so far. This bytes object will be the same length as the *digest_size* of the digest @@ -39,14 +39,14 @@ bytes. -.. method:: hmac.hexdigest() +.. method:: HMAC.hexdigest() Like :meth:`digest` except the digest is returned as a string twice the length containing only hexadecimal digits. This may be used to exchange the value safely in email or other non-binary environments. -.. method:: hmac.copy() +.. method:: HMAC.copy() Return a copy ("clone") of the hmac object. This can be used to efficiently compute the digests of strings that share a common initial substring. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Feb 5 09:29:03 2012 From: python-checkins at python.org (georg.brandl) Date: Sun, 05 Feb 2012 09:29:03 +0100 Subject: [Python-checkins] =?utf8?q?peps=3A_Closes_=2313945=3A_fix_typo=2E?= Message-ID: http://hg.python.org/peps/rev/5748c9cf7628 changeset: 4035:5748c9cf7628 user: Georg Brandl date: Sun Feb 05 09:28:57 2012 +0100 summary: Closes #13945: fix typo. files: pep-0383.txt | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/pep-0383.txt b/pep-0383.txt --- a/pep-0383.txt +++ b/pep-0383.txt @@ -89,7 +89,7 @@ deprecated. External libraries that operate on file names (such as GUI file -chosers) should also encode them according to the PEP. +choosers) should also encode them according to the PEP. Discussion ========== -- Repository URL: http://hg.python.org/peps From python-checkins at python.org Sun Feb 5 10:49:20 2012 From: python-checkins at python.org (eric.araujo) Date: Sun, 05 Feb 2012 10:49:20 +0100 Subject: [Python-checkins] =?utf8?q?cpython=3A_Improve_one_packaging_test?= =?utf8?q?=2C_remove_a_setuptoolism_in_another?= Message-ID: http://hg.python.org/cpython/rev/55eab86477e5 changeset: 74779:55eab86477e5 parent: 74754:57ccd573e71b user: ?ric Araujo date: Sat Feb 04 21:43:07 2012 +0100 summary: Improve one packaging test, remove a setuptoolism in another files: Lib/packaging/tests/test_command_build_py.py | 18 +++++++-- Lib/packaging/tests/test_command_sdist.py | 1 - 2 files changed, 14 insertions(+), 5 deletions(-) diff --git a/Lib/packaging/tests/test_command_build_py.py b/Lib/packaging/tests/test_command_build_py.py --- a/Lib/packaging/tests/test_command_build_py.py +++ b/Lib/packaging/tests/test_command_build_py.py @@ -24,11 +24,17 @@ f.write("# Pretend this is a package.") finally: f.close() + # let's have two files to make sure globbing works f = open(os.path.join(pkg_dir, "README.txt"), "w") try: f.write("Info about this package") finally: f.close() + f = open(os.path.join(pkg_dir, "HACKING.txt"), "w") + try: + f.write("How to contribute") + finally: + f.close() destination = self.mkdtemp() @@ -42,7 +48,7 @@ convert_2to3_doctests=None, use_2to3=False) dist.packages = ["pkg"] - dist.package_data = {"pkg": ["README.txt"]} + dist.package_data = {"pkg": ["*.txt"]} dist.package_dir = sources cmd = build_py(dist) @@ -55,15 +61,19 @@ # This makes sure the list of outputs includes byte-compiled # files for Python modules but not for package data files # (there shouldn't *be* byte-code files for those!). - # - self.assertEqual(len(cmd.get_outputs()), 3) + # FIXME the test below is not doing what the comment above says, and + # if it did it would show a code bug: if we add a demo.py file to + # package_data, it gets byte-compiled! + outputs = cmd.get_outputs() + self.assertEqual(len(outputs), 4, outputs) pkgdest = os.path.join(destination, "pkg") files = os.listdir(pkgdest) pycache_dir = os.path.join(pkgdest, "__pycache__") self.assertIn("__init__.py", files) self.assertIn("README.txt", files) + self.assertIn("HACKING.txt", files) pyc_files = os.listdir(pycache_dir) - self.assertIn("__init__.%s.pyc" % imp.get_tag(), pyc_files) + self.assertEqual(["__init__.%s.pyc" % imp.get_tag()], pyc_files) def test_empty_package_dir(self): # See SF 1668596/1720897. diff --git a/Lib/packaging/tests/test_command_sdist.py b/Lib/packaging/tests/test_command_sdist.py --- a/Lib/packaging/tests/test_command_sdist.py +++ b/Lib/packaging/tests/test_command_sdist.py @@ -73,7 +73,6 @@ 'author_email': 'xxx'} dist = Distribution(metadata) dist.packages = ['somecode'] - dist.include_package_data = True cmd = sdist(dist) cmd.dist_dir = 'dist' return dist, cmd -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Feb 5 10:49:21 2012 From: python-checkins at python.org (eric.araujo) Date: Sun, 05 Feb 2012 10:49:21 +0100 Subject: [Python-checkins] =?utf8?q?cpython=3A_Allow_multiple_values_for_p?= =?utf8?q?ackage=5Fdata_in_setup=2Ecfg_=28=2311805=29=2E?= Message-ID: http://hg.python.org/cpython/rev/2c08bf9aca22 changeset: 74780:2c08bf9aca22 user: ?ric Araujo date: Sat Feb 04 21:53:07 2012 +0100 summary: Allow multiple values for package_data in setup.cfg (#11805). Even though the resources system obsoletes data_files and package_data (see bug discussion), package_data still exists to allow compatibility with distutils and thus an easier transition. In setup.py, the values are lists of glob patterns, so the setup.cfg syntax needed a way to express multiple values too. Doc for this option will be added later as part of the big packaging doc patches. For now, the test serves as example. Reported by Erik Bray. files: Lib/packaging/config.py | 25 ++++++++--- Lib/packaging/tests/test_config.py | 37 ++++++++++++++--- Misc/NEWS | 2 + 3 files changed, 50 insertions(+), 14 deletions(-) diff --git a/Lib/packaging/config.py b/Lib/packaging/config.py --- a/Lib/packaging/config.py +++ b/Lib/packaging/config.py @@ -20,7 +20,6 @@ if '.' not in name: return parts = name.split('.') - modname = parts[-1] parent = '.'.join(parts[:-1]) if parent not in packages: # we could log a warning instead of raising, but what's the use @@ -227,13 +226,25 @@ self.dist.scripts = [self.dist.scripts] self.dist.package_data = {} + # bookkeeping for the loop below + firstline = True + prev = None + for line in files.get('package_data', []): - data = line.split('=') - if len(data) != 2: - raise ValueError('invalid line for package_data: %s ' - '(misses "=")' % line) - key, value = data - self.dist.package_data[key.strip()] = value.strip() + if '=' in line: + # package name -- file globs or specs + key, value = line.split('=') + prev = self.dist.package_data[key.strip()] = value.split() + elif firstline: + # invalid continuation on the first line + raise PackagingOptionError( + 'malformed package_data first line: %r (misses "=")' % + line) + else: + # continuation, add to last seen package name + prev.extend(line.split()) + + firstline = False self.dist.data_files = [] for data in files.get('data_files', []): diff --git a/Lib/packaging/tests/test_config.py b/Lib/packaging/tests/test_config.py --- a/Lib/packaging/tests/test_config.py +++ b/Lib/packaging/tests/test_config.py @@ -66,11 +66,15 @@ bin/taunt package_data = - cheese = data/templates/* + cheese = data/templates/* doc/* + doc/images/*.png + extra_files = %(extra-files)s # Replaces MANIFEST.in +# FIXME no, it's extra_files +# (but sdist_extra is a better name, should use it) sdist_extra = include THANKS HACKING recursive-include examples *.txt *.py @@ -96,6 +100,17 @@ sub_commands = foo """ +SETUP_CFG_PKGDATA_BUGGY_1 = """ +[files] +package_data = foo.* +""" + +SETUP_CFG_PKGDATA_BUGGY_2 = """ +[files] +package_data = + foo.* +""" + # Can not be merged with SETUP_CFG else install_dist # command will fail when trying to compile C sources # TODO use a DummyCommand to mock build_ext @@ -276,13 +291,14 @@ self.assertEqual(dist.packages, ['one', 'two', 'three']) self.assertEqual(dist.py_modules, ['haven']) - self.assertEqual(dist.package_data, {'cheese': 'data/templates/*'}) - self.assertEqual( + self.assertEqual(dist.package_data, + {'cheese': ['data/templates/*', 'doc/*', + 'doc/images/*.png']}) + self.assertEqual(dist.data_files, {'bm/b1.gif': '{icon}/b1.gif', 'bm/b2.gif': '{icon}/b2.gif', 'Cfg/data.CFG': '{config}/baBar/data.CFG', - 'init_script': '{script}/JunGle/init_script'}, - dist.data_files) + 'init_script': '{script}/JunGle/init_script'}) self.assertEqual(dist.package_dir, 'src') @@ -293,8 +309,8 @@ # this file would be __main__.Foo when run as "python test_config.py". # The name FooBarBazTest should be unique enough to prevent # collisions. - self.assertEqual('FooBarBazTest', - dist.get_command_obj('foo').__class__.__name__) + self.assertEqual(dist.get_command_obj('foo').__class__.__name__, + 'FooBarBazTest') # did the README got loaded ? self.assertEqual(dist.metadata['description'], 'yeah') @@ -304,6 +320,13 @@ d = new_compiler(compiler='d') self.assertEqual(d.description, 'D Compiler') + # check error reporting for invalid package_data value + self.write_file('setup.cfg', SETUP_CFG_PKGDATA_BUGGY_1) + self.assertRaises(PackagingOptionError, self.get_dist) + + self.write_file('setup.cfg', SETUP_CFG_PKGDATA_BUGGY_2) + self.assertRaises(PackagingOptionError, self.get_dist) + def test_multiple_description_file(self): self.write_setup({'description-file': 'README CHANGES'}) self.write_file('README', 'yeah') diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -466,6 +466,8 @@ Library ------- +- Issue #11805: package_data in setup.cfg should allow more than one value. + - Issue #13901: Prevent test_distutils failures on OS X with --enable-shared. - Issue #13676: Handle strings with embedded zeros correctly in sqlite3. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Feb 5 10:49:22 2012 From: python-checkins at python.org (eric.araujo) Date: Sun, 05 Feb 2012 10:49:22 +0100 Subject: [Python-checkins] =?utf8?q?cpython=3A_Stop_converting_package=5Fd?= =?utf8?q?ata_to_extra=5Ffiles_in_pysetup_create_=28=2313712=29=2E?= Message-ID: http://hg.python.org/cpython/rev/edb6f9fb54ac changeset: 74781:edb6f9fb54ac user: ?ric Araujo date: Sun Feb 05 10:26:16 2012 +0100 summary: Stop converting package_data to extra_files in pysetup create (#13712). pysetup create, the setup.cfg creation helper, used to convert package_data (from an existing setup.py) into extra_files, the replacement for MANIFEST.in, but these files are only present in sdists, not installed: they don?t have the same use case at all, so converting one into the other did not work. files: Lib/packaging/create.py | 36 ++++++++++------- Lib/packaging/tests/test_create.py | 25 ++++++------ Misc/NEWS | 2 + 3 files changed, 35 insertions(+), 28 deletions(-) diff --git a/Lib/packaging/create.py b/Lib/packaging/create.py --- a/Lib/packaging/create.py +++ b/Lib/packaging/create.py @@ -287,6 +287,7 @@ # optional string entries if 'keywords' in self.data and self.data['keywords']: + # XXX shoud use comma to separate, not space fp.write('keywords = %s\n' % ' '.join(self.data['keywords'])) for name in ('home_page', 'author', 'author_email', 'maintainer', 'maintainer_email', 'description-file'): @@ -306,17 +307,29 @@ fp.write('%s = ' % name) fp.write(''.join(' %s\n' % val for val in self.data[name]).lstrip()) + fp.write('\n[files]\n') - for name in ('packages', 'modules', 'scripts', - 'package_data', 'extra_files'): + + for name in ('packages', 'modules', 'scripts', 'extra_files'): if not(name in self.data and self.data[name]): continue fp.write('%s = %s\n' % (name, '\n '.join(self.data[name]).strip())) - fp.write('\nresources =\n') - for src, dest in self.data['resources']: - fp.write(' %s = %s\n' % (src, dest)) - fp.write('\n') + + if self.data.get('package_data'): + fp.write('package_data =\n') + for pkg, spec in sorted(self.data['package_data'].items()): + # put one spec per line, indented under the package name + indent = ' ' * (len(pkg) + 7) + spec = ('\n' + indent).join(spec) + fp.write(' %s = %s\n' % (pkg, spec)) + fp.write('\n') + + if self.data.get('resources'): + fp.write('resources =\n') + for src, dest in self.data['resources']: + fp.write(' %s = %s\n' % (src, dest)) + fp.write('\n') os.chmod(_FILENAME, 0o644) logger.info('Wrote "%s".' % _FILENAME) @@ -349,7 +362,6 @@ ('long_description', 'description'), ('url', 'home_page'), ('platforms', 'platform'), - # backport only for 2.5+ ('provides', 'provides-dist'), ('obsoletes', 'obsoletes-dist'), ('requires', 'requires-dist')) @@ -385,14 +397,8 @@ for src in srcs] data['resources'].extend(files) - # 2.2 package_data -> extra_files - package_dirs = dist.package_dir or {} - for package, extras in dist.package_data.items() or []: - package_dir = package_dirs.get(package, package) - for file_ in extras: - if package_dir: - file_ = package_dir + '/' + file_ - data['extra_files'].append(file_) + # 2.2 package_data + data['package_data'] = dist.package_data.copy() # Use README file if its content is the desciption if "description" in data: diff --git a/Lib/packaging/tests/test_create.py b/Lib/packaging/tests/test_create.py --- a/Lib/packaging/tests/test_create.py +++ b/Lib/packaging/tests/test_create.py @@ -116,7 +116,6 @@ package_data={ 'babar': ['Pom', 'Flora', 'Alexander'], 'me': ['dady', 'mumy', 'sys', 'bro'], - '': ['setup.py', 'README'], 'pyxfoil': ['fengine.so'], }, scripts=['my_script', 'bin/run'], @@ -150,16 +149,15 @@ mymodule scripts = my_script bin/run - extra_files = Martinique/Lamentin/dady - Martinique/Lamentin/mumy - Martinique/Lamentin/sys - Martinique/Lamentin/bro - setup.py - README - Pom - Flora - Alexander - pyxfoil/fengine.so + package_data = + babar = Pom + Flora + Alexander + me = dady + mumy + sys + bro + pyxfoil = fengine.so resources = README.rst = {doc} @@ -217,8 +215,9 @@ [files] packages = pyxfoil - extra_files = pyxfoil/fengine.so - pyxfoil/babar.so + package_data = + pyxfoil = fengine.so + babar.so resources = README.rst = {doc} diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -466,6 +466,8 @@ Library ------- +- Issue #13712: pysetup create should not convert package_data to extra_files. + - Issue #11805: package_data in setup.cfg should allow more than one value. - Issue #13901: Prevent test_distutils failures on OS X with --enable-shared. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Feb 5 10:49:23 2012 From: python-checkins at python.org (eric.araujo) Date: Sun, 05 Feb 2012 10:49:23 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_default_-=3E_default?= =?utf8?q?=29=3A_Branch_merge?= Message-ID: http://hg.python.org/cpython/rev/028e2ba85685 changeset: 74782:028e2ba85685 parent: 74778:ca8c2a185aa3 parent: 74781:edb6f9fb54ac user: ?ric Araujo date: Sun Feb 05 10:48:52 2012 +0100 summary: Branch merge files: Lib/packaging/config.py | 25 ++++- Lib/packaging/create.py | 36 +++++---- Lib/packaging/tests/test_command_build_py.py | 18 +++- Lib/packaging/tests/test_command_sdist.py | 1 - Lib/packaging/tests/test_config.py | 37 ++++++++- Lib/packaging/tests/test_create.py | 25 +++--- Misc/NEWS | 4 + 7 files changed, 99 insertions(+), 47 deletions(-) diff --git a/Lib/packaging/config.py b/Lib/packaging/config.py --- a/Lib/packaging/config.py +++ b/Lib/packaging/config.py @@ -20,7 +20,6 @@ if '.' not in name: return parts = name.split('.') - modname = parts[-1] parent = '.'.join(parts[:-1]) if parent not in packages: # we could log a warning instead of raising, but what's the use @@ -227,13 +226,25 @@ self.dist.scripts = [self.dist.scripts] self.dist.package_data = {} + # bookkeeping for the loop below + firstline = True + prev = None + for line in files.get('package_data', []): - data = line.split('=') - if len(data) != 2: - raise ValueError('invalid line for package_data: %s ' - '(misses "=")' % line) - key, value = data - self.dist.package_data[key.strip()] = value.strip() + if '=' in line: + # package name -- file globs or specs + key, value = line.split('=') + prev = self.dist.package_data[key.strip()] = value.split() + elif firstline: + # invalid continuation on the first line + raise PackagingOptionError( + 'malformed package_data first line: %r (misses "=")' % + line) + else: + # continuation, add to last seen package name + prev.extend(line.split()) + + firstline = False self.dist.data_files = [] for data in files.get('data_files', []): diff --git a/Lib/packaging/create.py b/Lib/packaging/create.py --- a/Lib/packaging/create.py +++ b/Lib/packaging/create.py @@ -287,6 +287,7 @@ # optional string entries if 'keywords' in self.data and self.data['keywords']: + # XXX shoud use comma to separate, not space fp.write('keywords = %s\n' % ' '.join(self.data['keywords'])) for name in ('home_page', 'author', 'author_email', 'maintainer', 'maintainer_email', 'description-file'): @@ -306,17 +307,29 @@ fp.write('%s = ' % name) fp.write(''.join(' %s\n' % val for val in self.data[name]).lstrip()) + fp.write('\n[files]\n') - for name in ('packages', 'modules', 'scripts', - 'package_data', 'extra_files'): + + for name in ('packages', 'modules', 'scripts', 'extra_files'): if not(name in self.data and self.data[name]): continue fp.write('%s = %s\n' % (name, '\n '.join(self.data[name]).strip())) - fp.write('\nresources =\n') - for src, dest in self.data['resources']: - fp.write(' %s = %s\n' % (src, dest)) - fp.write('\n') + + if self.data.get('package_data'): + fp.write('package_data =\n') + for pkg, spec in sorted(self.data['package_data'].items()): + # put one spec per line, indented under the package name + indent = ' ' * (len(pkg) + 7) + spec = ('\n' + indent).join(spec) + fp.write(' %s = %s\n' % (pkg, spec)) + fp.write('\n') + + if self.data.get('resources'): + fp.write('resources =\n') + for src, dest in self.data['resources']: + fp.write(' %s = %s\n' % (src, dest)) + fp.write('\n') os.chmod(_FILENAME, 0o644) logger.info('Wrote "%s".' % _FILENAME) @@ -349,7 +362,6 @@ ('long_description', 'description'), ('url', 'home_page'), ('platforms', 'platform'), - # backport only for 2.5+ ('provides', 'provides-dist'), ('obsoletes', 'obsoletes-dist'), ('requires', 'requires-dist')) @@ -385,14 +397,8 @@ for src in srcs] data['resources'].extend(files) - # 2.2 package_data -> extra_files - package_dirs = dist.package_dir or {} - for package, extras in dist.package_data.items() or []: - package_dir = package_dirs.get(package, package) - for file_ in extras: - if package_dir: - file_ = package_dir + '/' + file_ - data['extra_files'].append(file_) + # 2.2 package_data + data['package_data'] = dist.package_data.copy() # Use README file if its content is the desciption if "description" in data: diff --git a/Lib/packaging/tests/test_command_build_py.py b/Lib/packaging/tests/test_command_build_py.py --- a/Lib/packaging/tests/test_command_build_py.py +++ b/Lib/packaging/tests/test_command_build_py.py @@ -24,11 +24,17 @@ f.write("# Pretend this is a package.") finally: f.close() + # let's have two files to make sure globbing works f = open(os.path.join(pkg_dir, "README.txt"), "w") try: f.write("Info about this package") finally: f.close() + f = open(os.path.join(pkg_dir, "HACKING.txt"), "w") + try: + f.write("How to contribute") + finally: + f.close() destination = self.mkdtemp() @@ -42,7 +48,7 @@ convert_2to3_doctests=None, use_2to3=False) dist.packages = ["pkg"] - dist.package_data = {"pkg": ["README.txt"]} + dist.package_data = {"pkg": ["*.txt"]} dist.package_dir = sources cmd = build_py(dist) @@ -55,15 +61,19 @@ # This makes sure the list of outputs includes byte-compiled # files for Python modules but not for package data files # (there shouldn't *be* byte-code files for those!). - # - self.assertEqual(len(cmd.get_outputs()), 3) + # FIXME the test below is not doing what the comment above says, and + # if it did it would show a code bug: if we add a demo.py file to + # package_data, it gets byte-compiled! + outputs = cmd.get_outputs() + self.assertEqual(len(outputs), 4, outputs) pkgdest = os.path.join(destination, "pkg") files = os.listdir(pkgdest) pycache_dir = os.path.join(pkgdest, "__pycache__") self.assertIn("__init__.py", files) self.assertIn("README.txt", files) + self.assertIn("HACKING.txt", files) pyc_files = os.listdir(pycache_dir) - self.assertIn("__init__.%s.pyc" % imp.get_tag(), pyc_files) + self.assertEqual(["__init__.%s.pyc" % imp.get_tag()], pyc_files) def test_empty_package_dir(self): # See SF 1668596/1720897. diff --git a/Lib/packaging/tests/test_command_sdist.py b/Lib/packaging/tests/test_command_sdist.py --- a/Lib/packaging/tests/test_command_sdist.py +++ b/Lib/packaging/tests/test_command_sdist.py @@ -73,7 +73,6 @@ 'author_email': 'xxx'} dist = Distribution(metadata) dist.packages = ['somecode'] - dist.include_package_data = True cmd = sdist(dist) cmd.dist_dir = 'dist' return dist, cmd diff --git a/Lib/packaging/tests/test_config.py b/Lib/packaging/tests/test_config.py --- a/Lib/packaging/tests/test_config.py +++ b/Lib/packaging/tests/test_config.py @@ -66,11 +66,15 @@ bin/taunt package_data = - cheese = data/templates/* + cheese = data/templates/* doc/* + doc/images/*.png + extra_files = %(extra-files)s # Replaces MANIFEST.in +# FIXME no, it's extra_files +# (but sdist_extra is a better name, should use it) sdist_extra = include THANKS HACKING recursive-include examples *.txt *.py @@ -96,6 +100,17 @@ sub_commands = foo """ +SETUP_CFG_PKGDATA_BUGGY_1 = """ +[files] +package_data = foo.* +""" + +SETUP_CFG_PKGDATA_BUGGY_2 = """ +[files] +package_data = + foo.* +""" + # Can not be merged with SETUP_CFG else install_dist # command will fail when trying to compile C sources # TODO use a DummyCommand to mock build_ext @@ -276,13 +291,14 @@ self.assertEqual(dist.packages, ['one', 'two', 'three']) self.assertEqual(dist.py_modules, ['haven']) - self.assertEqual(dist.package_data, {'cheese': 'data/templates/*'}) - self.assertEqual( + self.assertEqual(dist.package_data, + {'cheese': ['data/templates/*', 'doc/*', + 'doc/images/*.png']}) + self.assertEqual(dist.data_files, {'bm/b1.gif': '{icon}/b1.gif', 'bm/b2.gif': '{icon}/b2.gif', 'Cfg/data.CFG': '{config}/baBar/data.CFG', - 'init_script': '{script}/JunGle/init_script'}, - dist.data_files) + 'init_script': '{script}/JunGle/init_script'}) self.assertEqual(dist.package_dir, 'src') @@ -293,8 +309,8 @@ # this file would be __main__.Foo when run as "python test_config.py". # The name FooBarBazTest should be unique enough to prevent # collisions. - self.assertEqual('FooBarBazTest', - dist.get_command_obj('foo').__class__.__name__) + self.assertEqual(dist.get_command_obj('foo').__class__.__name__, + 'FooBarBazTest') # did the README got loaded ? self.assertEqual(dist.metadata['description'], 'yeah') @@ -304,6 +320,13 @@ d = new_compiler(compiler='d') self.assertEqual(d.description, 'D Compiler') + # check error reporting for invalid package_data value + self.write_file('setup.cfg', SETUP_CFG_PKGDATA_BUGGY_1) + self.assertRaises(PackagingOptionError, self.get_dist) + + self.write_file('setup.cfg', SETUP_CFG_PKGDATA_BUGGY_2) + self.assertRaises(PackagingOptionError, self.get_dist) + def test_multiple_description_file(self): self.write_setup({'description-file': 'README CHANGES'}) self.write_file('README', 'yeah') diff --git a/Lib/packaging/tests/test_create.py b/Lib/packaging/tests/test_create.py --- a/Lib/packaging/tests/test_create.py +++ b/Lib/packaging/tests/test_create.py @@ -116,7 +116,6 @@ package_data={ 'babar': ['Pom', 'Flora', 'Alexander'], 'me': ['dady', 'mumy', 'sys', 'bro'], - '': ['setup.py', 'README'], 'pyxfoil': ['fengine.so'], }, scripts=['my_script', 'bin/run'], @@ -150,16 +149,15 @@ mymodule scripts = my_script bin/run - extra_files = Martinique/Lamentin/dady - Martinique/Lamentin/mumy - Martinique/Lamentin/sys - Martinique/Lamentin/bro - setup.py - README - Pom - Flora - Alexander - pyxfoil/fengine.so + package_data = + babar = Pom + Flora + Alexander + me = dady + mumy + sys + bro + pyxfoil = fengine.so resources = README.rst = {doc} @@ -217,8 +215,9 @@ [files] packages = pyxfoil - extra_files = pyxfoil/fengine.so - pyxfoil/babar.so + package_data = + pyxfoil = fengine.so + babar.so resources = README.rst = {doc} diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -466,6 +466,10 @@ Library ------- +- Issue #13712: pysetup create should not convert package_data to extra_files. + +- Issue #11805: package_data in setup.cfg should allow more than one value. + - Issue #13933: IDLE auto-complete did not work with some imported module, like hashlib. (Patch by Roger Serwy) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Feb 5 12:23:57 2012 From: python-checkins at python.org (eric.araujo) Date: Sun, 05 Feb 2012 12:23:57 +0100 Subject: [Python-checkins] =?utf8?q?distutils2=3A_Port_OS_X_--enable-share?= =?utf8?q?d_fix_from_packaging_=28=2313901=3B_untested=29?= Message-ID: http://hg.python.org/distutils2/rev/e6a28ae0dfd6 changeset: 1270:e6a28ae0dfd6 user: ?ric Araujo date: Sun Feb 05 11:42:49 2012 +0100 summary: Port OS X --enable-shared fix from packaging (#13901; untested) files: CHANGES.txt | 1 + distutils2/tests/support.py | 13 +++++++++---- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/CHANGES.txt b/CHANGES.txt --- a/CHANGES.txt +++ b/CHANGES.txt @@ -160,6 +160,7 @@ - Remove verbose arguments for Command and Compiler classes as well as util functions, obsoleted by logging [?ric] - #12659: Add tests for tests.support [francisco] +- #13901: Prevent test failure on OS X for Python built in shared mode [ned] 1.0a3 - 2010-10-08 diff --git a/distutils2/tests/support.py b/distutils2/tests/support.py --- a/distutils2/tests/support.py +++ b/distutils2/tests/support.py @@ -357,7 +357,9 @@ When Python was built with --enable-shared on Unix, -L. is not enough to find libpython.so, because regrtest runs in a tempdir, not in the - source directory where the .so lives. + source directory where the .so lives. (Mac OS X embeds absolute paths + to shared libraries into executables, so the fixup is a no-op on that + platform.) When Python was built with in debug mode on Windows, build_ext commands need their debug attribute set, and it is not done automatically for @@ -379,9 +381,12 @@ if runshared is None: cmd.library_dirs = ['.'] else: - # FIXME no partition in 2.4 - name, equals, value = runshared.partition('=') - cmd.library_dirs = value.split(os.pathsep) + if sys.platform == 'darwin': + cmd.library_dirs = [] + else: + # FIXME no partition in 2.4 + name, equals, value = runshared.partition('=') + cmd.library_dirs = value.split(os.pathsep) try: -- Repository URL: http://hg.python.org/distutils2 From python-checkins at python.org Sun Feb 5 12:23:57 2012 From: python-checkins at python.org (eric.araujo) Date: Sun, 05 Feb 2012 12:23:57 +0100 Subject: [Python-checkins] =?utf8?q?distutils2=3A_Allow_multiple_values_fo?= =?utf8?q?r_package=5Fdata_in_setup=2Ecfg_=28=2311805=29=2E?= Message-ID: http://hg.python.org/distutils2/rev/83a0985c7aad changeset: 1272:83a0985c7aad user: ?ric Araujo date: Sun Feb 05 11:52:01 2012 +0100 summary: Allow multiple values for package_data in setup.cfg (#11805). Even though the resources system obsoletes data_files and package_data (see bug discussion), package_data still exists to allow compatibility with distutils and thus an easier transition. In setup.py, the values are lists of glob patterns, so the setup.cfg syntax needed a way to express multiple values too. Reported by Erik Bray. files: CHANGES.txt | 3 +- distutils2/config.py | 24 ++++++++++--- distutils2/tests/test_config.py | 37 +++++++++++++++++--- 3 files changed, 50 insertions(+), 14 deletions(-) diff --git a/CHANGES.txt b/CHANGES.txt --- a/CHANGES.txt +++ b/CHANGES.txt @@ -9,7 +9,7 @@ CONTRIBUTORS.txt for full names. Bug numbers refer to http://bugs.python.org/. -1.0a4 - 2011-12-?? +1.0a4 - 2012-02-?? ------------------ - Remove type check for commands in favor of minimal duck type check [tarek] @@ -161,6 +161,7 @@ functions, obsoleted by logging [?ric] - #12659: Add tests for tests.support [francisco] - #13901: Prevent test failure on OS X for Python built in shared mode [ned] +- #11805: Add multiple value syntax for package_data in setup.cfg [?ric] 1.0a3 - 2010-10-08 diff --git a/distutils2/config.py b/distutils2/config.py --- a/distutils2/config.py +++ b/distutils2/config.py @@ -232,13 +232,25 @@ self.dist.scripts = [self.dist.scripts] self.dist.package_data = {} + # bookkeeping for the loop below + firstline = True + prev = None + for line in files.get('package_data', []): - data = line.split('=') - if len(data) != 2: - raise ValueError('invalid line for package_data: %s ' - '(misses "=")' % line) - key, value = data - self.dist.package_data[key.strip()] = value.strip() + if '=' in line: + # package name -- file globs or specs + key, value = line.split('=') + prev = self.dist.package_data[key.strip()] = value.split() + elif firstline: + # invalid continuation on the first line + raise PackagingOptionError( + 'malformed package_data first line: %r (misses "=")' % + line) + else: + # continuation, add to last seen package name + prev.extend(line.split()) + + firstline = False self.dist.data_files = [] for data in files.get('data_files', []): diff --git a/distutils2/tests/test_config.py b/distutils2/tests/test_config.py --- a/distutils2/tests/test_config.py +++ b/distutils2/tests/test_config.py @@ -67,11 +67,15 @@ bin/taunt package_data = - cheese = data/templates/* + cheese = data/templates/* doc/* + doc/images/*.png + extra_files = %(extra-files)s # Replaces MANIFEST.in +# FIXME no, it's extra_files +# (but sdist_extra is a better name, should use it) sdist_extra = include THANKS HACKING recursive-include examples *.txt *.py @@ -97,6 +101,17 @@ sub_commands = foo """ +SETUP_CFG_PKGDATA_BUGGY_1 = """ +[files] +package_data = foo.* +""" + +SETUP_CFG_PKGDATA_BUGGY_2 = """ +[files] +package_data = + foo.* +""" + # Can not be merged with SETUP_CFG else install_dist # command will fail when trying to compile C sources # TODO use a DummyCommand to mock build_ext @@ -277,13 +292,14 @@ self.assertEqual(dist.packages, ['one', 'two', 'three']) self.assertEqual(dist.py_modules, ['haven']) - self.assertEqual(dist.package_data, {'cheese': 'data/templates/*'}) - self.assertEqual( + self.assertEqual(dist.package_data, + {'cheese': ['data/templates/*', 'doc/*', + 'doc/images/*.png']}) + self.assertEqual(dist.data_files, {'bm/b1.gif': '{icon}/b1.gif', 'bm/b2.gif': '{icon}/b2.gif', 'Cfg/data.CFG': '{config}/baBar/data.CFG', - 'init_script': '{script}/JunGle/init_script'}, - dist.data_files) + 'init_script': '{script}/JunGle/init_script'}) self.assertEqual(dist.package_dir, 'src') @@ -294,8 +310,8 @@ # this file would be __main__.Foo when run as "python test_config.py". # The name FooBarBazTest should be unique enough to prevent # collisions. - self.assertEqual('FooBarBazTest', - dist.get_command_obj('foo').__class__.__name__) + self.assertEqual(dist.get_command_obj('foo').__class__.__name__, + 'FooBarBazTest') # did the README got loaded ? self.assertEqual(dist.metadata['description'], 'yeah') @@ -305,6 +321,13 @@ d = new_compiler(compiler='d') self.assertEqual(d.description, 'D Compiler') + # check error reporting for invalid package_data value + self.write_file('setup.cfg', SETUP_CFG_PKGDATA_BUGGY_1) + self.assertRaises(PackagingOptionError, self.get_dist) + + self.write_file('setup.cfg', SETUP_CFG_PKGDATA_BUGGY_2) + self.assertRaises(PackagingOptionError, self.get_dist) + def test_multiple_description_file(self): self.write_setup({'description-file': 'README CHANGES'}) self.write_file('README', 'yeah') -- Repository URL: http://hg.python.org/distutils2 From python-checkins at python.org Sun Feb 5 12:23:57 2012 From: python-checkins at python.org (eric.araujo) Date: Sun, 05 Feb 2012 12:23:57 +0100 Subject: [Python-checkins] =?utf8?q?distutils2=3A_Improve_one_test=2C_remo?= =?utf8?q?ve_a_setuptoolism_in_another?= Message-ID: http://hg.python.org/distutils2/rev/6f66d7f57adb changeset: 1271:6f66d7f57adb user: ?ric Araujo date: Sun Feb 05 11:39:40 2012 +0100 summary: Improve one test, remove a setuptoolism in another files: distutils2/tests/test_command_build_py.py | 19 ++++++++-- distutils2/tests/test_command_sdist.py | 1 - 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/distutils2/tests/test_command_build_py.py b/distutils2/tests/test_command_build_py.py --- a/distutils2/tests/test_command_build_py.py +++ b/distutils2/tests/test_command_build_py.py @@ -23,11 +23,17 @@ f.write("# Pretend this is a package.") finally: f.close() + # let's have two files to make sure globbing works f = open(os.path.join(pkg_dir, "README.txt"), "w") try: f.write("Info about this package") finally: f.close() + f = open(os.path.join(pkg_dir, "HACKING.txt"), "w") + try: + f.write("How to contribute") + finally: + f.close() destination = self.mkdtemp() @@ -41,7 +47,7 @@ convert_2to3_doctests=None, use_2to3=False) dist.packages = ["pkg"] - dist.package_data = {"pkg": ["README.txt"]} + dist.package_data = {"pkg": ["*.txt"]} dist.package_dir = sources cmd = build_py(dist) @@ -54,12 +60,15 @@ # This makes sure the list of outputs includes byte-compiled # files for Python modules but not for package data files # (there shouldn't *be* byte-code files for those!). - self.assertEqual(len(cmd.get_outputs()), 3) + # FIXME the test below is not doing what the comment above says, and + # if it did it would show a code bug: if we add a demo.py file to + # package_data, it gets byte-compiled! + outputs = cmd.get_outputs() + self.assertEqual(len(outputs), 4, outputs) pkgdest = os.path.join(destination, "pkg") files = os.listdir(pkgdest) - self.assertIn("__init__.py", files) - self.assertIn("README.txt", files) - self.assertIn("__init__.pyc", files) + self.assertEqual(sorted(files), ["HACKING.txt", "README.txt", + "__init__.py", "__init__.pyc"]) def test_empty_package_dir(self): # See SF 1668596/1720897. diff --git a/distutils2/tests/test_command_sdist.py b/distutils2/tests/test_command_sdist.py --- a/distutils2/tests/test_command_sdist.py +++ b/distutils2/tests/test_command_sdist.py @@ -74,7 +74,6 @@ 'author_email': 'xxx'} dist = Distribution(metadata) dist.packages = ['somecode'] - dist.include_package_data = True cmd = sdist(dist) cmd.dist_dir = 'dist' return dist, cmd -- Repository URL: http://hg.python.org/distutils2 From python-checkins at python.org Sun Feb 5 12:23:57 2012 From: python-checkins at python.org (eric.araujo) Date: Sun, 05 Feb 2012 12:23:57 +0100 Subject: [Python-checkins] =?utf8?q?distutils2=3A_Stop_converting_package?= =?utf8?q?=5Fdata_to_extra=5Ffiles_in_pysetup_create_=28=2313712=29=2E?= Message-ID: http://hg.python.org/distutils2/rev/730c2e4aaf9c changeset: 1273:730c2e4aaf9c user: ?ric Araujo date: Sun Feb 05 11:59:27 2012 +0100 summary: Stop converting package_data to extra_files in pysetup create (#13712). pysetup create used to convert package_data from an existing setup.py into extra_files, but these files are only present in sdists, not installed: they don?t have the same use case at all, so converting one into the other did not work. files: CHANGES.txt | 2 + distutils2/create.py | 36 ++++++++++++-------- distutils2/tests/test_create.py | 25 +++++++------- 3 files changed, 36 insertions(+), 27 deletions(-) diff --git a/CHANGES.txt b/CHANGES.txt --- a/CHANGES.txt +++ b/CHANGES.txt @@ -162,6 +162,8 @@ - #12659: Add tests for tests.support [francisco] - #13901: Prevent test failure on OS X for Python built in shared mode [ned] - #11805: Add multiple value syntax for package_data in setup.cfg [?ric] +- #13712: Don't map package_data to extra_files when converting a setup.py + script with pysetup create [?ric] 1.0a3 - 2010-10-08 diff --git a/distutils2/create.py b/distutils2/create.py --- a/distutils2/create.py +++ b/distutils2/create.py @@ -298,6 +298,7 @@ # optional string entries if 'keywords' in self.data and self.data['keywords']: + # XXX shoud use comma to separate, not space fp.write(u'keywords = %s\n' % ' '.join(self.data['keywords'])) for name in ('home_page', 'author', 'author_email', 'maintainer', 'maintainer_email', 'description-file'): @@ -318,17 +319,30 @@ fp.write(u'%s = ' % name) fp.write(u''.join(' %s\n' % val for val in self.data[name]).lstrip()) + fp.write(u'\n[files]\n') - for name in ('packages', 'modules', 'scripts', - 'package_data', 'extra_files'): + + for name in ('packages', 'modules', 'scripts', 'extra_files'): if not(name in self.data and self.data[name]): continue fp.write(u'%s = %s\n' % (name, u'\n '.join(self.data[name]).strip())) - fp.write(u'\nresources =\n') - for src, dest in self.data['resources']: - fp.write(u' %s = %s\n' % (src, dest)) - fp.write(u'\n') + + if self.data.get('package_data'): + fp.write(u'package_data =\n') + for pkg, spec in sorted(self.data['package_data'].items()): + # put one spec per line, indented under the package name + indent = u' ' * (len(pkg) + 7) + spec = (u'\n' + indent).join(spec) + fp.write(u' %s = %s\n' % (pkg, spec)) + fp.write(u'\n') + + if self.data.get('resources'): + fp.write(u'resources =\n') + for src, dest in self.data['resources']: + fp.write(u' %s = %s\n' % (src, dest)) + fp.write(u'\n') + finally: fp.close() @@ -400,14 +414,8 @@ for src in srcs] data['resources'].extend(files) - # 2.2 package_data -> extra_files - package_dirs = dist.package_dir or {} - for package, extras in dist.package_data.items() or []: - package_dir = package_dirs.get(package, package) - for file_ in extras: - if package_dir: - file_ = package_dir + '/' + file_ - data['extra_files'].append(file_) + # 2.2 package_data + data['package_data'] = dist.package_data.copy() # Use README file if its content is the desciption if "description" in data: diff --git a/distutils2/tests/test_create.py b/distutils2/tests/test_create.py --- a/distutils2/tests/test_create.py +++ b/distutils2/tests/test_create.py @@ -118,7 +118,6 @@ package_data={ 'babar': ['Pom', 'Flora', 'Alexander'], 'me': ['dady', 'mumy', 'sys', 'bro'], - '': ['setup.py', 'README'], 'pyxfoil': ['fengine.so'], }, scripts=['my_script', 'bin/run'], @@ -155,16 +154,15 @@ mymodule scripts = my_script bin/run - extra_files = Martinique/Lamentin/dady - Martinique/Lamentin/mumy - Martinique/Lamentin/sys - Martinique/Lamentin/bro - setup.py - README - Pom - Flora - Alexander - pyxfoil/fengine.so + package_data = + babar = Pom + Flora + Alexander + me = dady + mumy + sys + bro + pyxfoil = fengine.so resources = README.rst = {doc} @@ -228,8 +226,9 @@ [files] packages = pyxfoil - extra_files = pyxfoil/fengine.so - pyxfoil/babar.so + package_data = + pyxfoil = fengine.so + babar.so resources = README.rst = {doc} -- Repository URL: http://hg.python.org/distutils2 From python-checkins at python.org Sun Feb 5 12:23:57 2012 From: python-checkins at python.org (eric.araujo) Date: Sun, 05 Feb 2012 12:23:57 +0100 Subject: [Python-checkins] =?utf8?q?distutils2_=28merge_default_-=3E_pytho?= =?utf8?q?n3=29=3A_Merge_fixes_for_=2313901=2C_=2311805=2C_=2313712_and_ot?= =?utf8?q?her_improvements?= Message-ID: http://hg.python.org/distutils2/rev/ea717d8e71d0 changeset: 1274:ea717d8e71d0 branch: python3 parent: 1267:bcea7cbddd47 parent: 1273:730c2e4aaf9c user: ?ric Araujo date: Sun Feb 05 12:23:06 2012 +0100 summary: Merge fixes for #13901, #11805, #13712 and other improvements files: CHANGES.txt | 6 +- distutils2/_trove.py | 12 +++ distutils2/config.py | 24 +++++- distutils2/create.py | 35 ++++++---- distutils2/pypi/dist.py | 2 +- distutils2/pypi/simple.py | 2 +- distutils2/tests/support.py | 13 ++- distutils2/tests/test_command_build_py.py | 24 +++++- distutils2/tests/test_command_sdist.py | 1 - distutils2/tests/test_config.py | 37 ++++++++-- distutils2/tests/test_create.py | 25 +++--- 11 files changed, 127 insertions(+), 54 deletions(-) diff --git a/CHANGES.txt b/CHANGES.txt --- a/CHANGES.txt +++ b/CHANGES.txt @@ -9,7 +9,7 @@ CONTRIBUTORS.txt for full names. Bug numbers refer to http://bugs.python.org/. -1.0a4 - 2011-12-?? +1.0a4 - 2012-02-?? ------------------ - Remove type check for commands in favor of minimal duck type check [tarek] @@ -160,6 +160,10 @@ - Remove verbose arguments for Command and Compiler classes as well as util functions, obsoleted by logging [?ric] - #12659: Add tests for tests.support [francisco] +- #13901: Prevent test failure on OS X for Python built in shared mode [ned] +- #11805: Add multiple value syntax for package_data in setup.cfg [?ric] +- #13712: Don't map package_data to extra_files when converting a setup.py + script with pysetup create [?ric] 1.0a3 - 2010-10-08 diff --git a/distutils2/_trove.py b/distutils2/_trove.py --- a/distutils2/_trove.py +++ b/distutils2/_trove.py @@ -47,6 +47,12 @@ 'Framework :: IDLE', 'Framework :: Paste', 'Framework :: Plone', +'Framework :: Plone :: 3.2', +'Framework :: Plone :: 3.3', +'Framework :: Plone :: 4.0', +'Framework :: Plone :: 4.1', +'Framework :: Plone :: 4.2', +'Framework :: Plone :: 4.3', 'Framework :: Pylons', 'Framework :: Setuptools Plugin', 'Framework :: Trac', @@ -261,6 +267,12 @@ 'Programming Language :: Python :: 3.0', 'Programming Language :: Python :: 3.1', 'Programming Language :: Python :: 3.2', +'Programming Language :: Python :: Implementation', +'Programming Language :: Python :: Implementation :: CPython', +'Programming Language :: Python :: Implementation :: IronPython', +'Programming Language :: Python :: Implementation :: Jython', +'Programming Language :: Python :: Implementation :: PyPy', +'Programming Language :: Python :: Implementation :: Stackless', 'Programming Language :: REBOL', 'Programming Language :: Rexx', 'Programming Language :: Ruby', diff --git a/distutils2/config.py b/distutils2/config.py --- a/distutils2/config.py +++ b/distutils2/config.py @@ -226,13 +226,25 @@ self.dist.scripts = [self.dist.scripts] self.dist.package_data = {} + # bookkeeping for the loop below + firstline = True + prev = None + for line in files.get('package_data', []): - data = line.split('=') - if len(data) != 2: - raise ValueError('invalid line for package_data: %s ' - '(misses "=")' % line) - key, value = data - self.dist.package_data[key.strip()] = value.strip() + if '=' in line: + # package name -- file globs or specs + key, value = line.split('=') + prev = self.dist.package_data[key.strip()] = value.split() + elif firstline: + # invalid continuation on the first line + raise PackagingOptionError( + 'malformed package_data first line: %r (misses "=")' % + line) + else: + # continuation, add to last seen package name + prev.extend(line.split()) + + firstline = False self.dist.data_files = [] for data in files.get('data_files', []): diff --git a/distutils2/create.py b/distutils2/create.py --- a/distutils2/create.py +++ b/distutils2/create.py @@ -287,6 +287,7 @@ # optional string entries if 'keywords' in self.data and self.data['keywords']: + # XXX shoud use comma to separate, not space fp.write('keywords = %s\n' % ' '.join(self.data['keywords'])) for name in ('home_page', 'author', 'author_email', 'maintainer', 'maintainer_email', 'description-file'): @@ -306,17 +307,29 @@ fp.write('%s = ' % name) fp.write(''.join(' %s\n' % val for val in self.data[name]).lstrip()) + fp.write('\n[files]\n') - for name in ('packages', 'modules', 'scripts', - 'package_data', 'extra_files'): + + for name in ('packages', 'modules', 'scripts', 'extra_files'): if not(name in self.data and self.data[name]): continue fp.write('%s = %s\n' % (name, '\n '.join(self.data[name]).strip())) - fp.write('\nresources =\n') - for src, dest in self.data['resources']: - fp.write(' %s = %s\n' % (src, dest)) - fp.write('\n') + + if self.data.get('package_data'): + fp.write('package_data =\n') + for pkg, spec in sorted(self.data['package_data'].items()): + # put one spec per line, indented under the package name + indent = ' ' * (len(pkg) + 7) + spec = ('\n' + indent).join(spec) + fp.write(' %s = %s\n' % (pkg, spec)) + fp.write('\n') + + if self.data.get('resources'): + fp.write('resources =\n') + for src, dest in self.data['resources']: + fp.write(' %s = %s\n' % (src, dest)) + fp.write('\n') os.chmod(_FILENAME, 0o644) logger.info('Wrote "%s".' % _FILENAME) @@ -384,14 +397,8 @@ for src in srcs] data['resources'].extend(files) - # 2.2 package_data -> extra_files - package_dirs = dist.package_dir or {} - for package, extras in dist.package_data.items() or []: - package_dir = package_dirs.get(package, package) - for file_ in extras: - if package_dir: - file_ = package_dir + '/' + file_ - data['extra_files'].append(file_) + # 2.2 package_data + data['package_data'] = dist.package_data.copy() # Use README file if its content is the desciption if "description" in data: diff --git a/distutils2/pypi/dist.py b/distutils2/pypi/dist.py --- a/distutils2/pypi/dist.py +++ b/distutils2/pypi/dist.py @@ -426,7 +426,7 @@ """Sort the results with the given properties. The `prefer_final` argument can be used to specify if final - distributions (eg. not dev, bet or alpha) would be prefered or not. + distributions (eg. not dev, beta or alpha) would be preferred or not. Results can be inverted by using `reverse`. diff --git a/distutils2/pypi/simple.py b/distutils2/pypi/simple.py --- a/distutils2/pypi/simple.py +++ b/distutils2/pypi/simple.py @@ -269,7 +269,7 @@ def _register_release(self, release=None, release_info={}): """Register a new release. - Both a release or a dict of release_info can be provided, the prefered + Both a release or a dict of release_info can be provided, the preferred way (eg. the quicker) is the dict one. Return the list of existing releases for the given project. diff --git a/distutils2/tests/support.py b/distutils2/tests/support.py --- a/distutils2/tests/support.py +++ b/distutils2/tests/support.py @@ -353,7 +353,9 @@ When Python was built with --enable-shared on Unix, -L. is not enough to find libpython.so, because regrtest runs in a tempdir, not in the - source directory where the .so lives. + source directory where the .so lives. (Mac OS X embeds absolute paths + to shared libraries into executables, so the fixup is a no-op on that + platform.) When Python was built with in debug mode on Windows, build_ext commands need their debug attribute set, and it is not done automatically for @@ -380,9 +382,12 @@ if runshared is None: cmd.library_dirs = ['.'] else: - # FIXME no partition in 2.4 - name, equals, value = runshared.partition('=') - cmd.library_dirs = value.split(os.pathsep) + if sys.platform == 'darwin': + cmd.library_dirs = [] + else: + # FIXME no partition in 2.4 + name, equals, value = runshared.partition('=') + cmd.library_dirs = value.split(os.pathsep) # Allow tests to run with an uninstalled Python 3.3 if sys.version_info[:2] == (3, 3) and sysconfig.is_python_build(): diff --git a/distutils2/tests/test_command_build_py.py b/distutils2/tests/test_command_build_py.py --- a/distutils2/tests/test_command_build_py.py +++ b/distutils2/tests/test_command_build_py.py @@ -24,11 +24,17 @@ f.write("# Pretend this is a package.") finally: f.close() + # let's have two files to make sure globbing works f = open(os.path.join(pkg_dir, "README.txt"), "w") try: f.write("Info about this package") finally: f.close() + f = open(os.path.join(pkg_dir, "HACKING.txt"), "w") + try: + f.write("How to contribute") + finally: + f.close() destination = self.mkdtemp() @@ -42,7 +48,7 @@ convert_2to3_doctests=None, use_2to3=False) dist.packages = ["pkg"] - dist.package_data = {"pkg": ["README.txt"]} + dist.package_data = {"pkg": ["*.txt"]} dist.package_dir = sources cmd = build_py(dist) @@ -55,17 +61,23 @@ # This makes sure the list of outputs includes byte-compiled # files for Python modules but not for package data files # (there shouldn't *be* byte-code files for those!). - self.assertEqual(len(cmd.get_outputs()), 3) + # FIXME the test below is not doing what the comment above says, and + # if it did it would show a code bug: if we add a demo.py file to + # package_data, it gets byte-compiled! + outputs = cmd.get_outputs() + self.assertEqual(len(outputs), 4, outputs) pkgdest = os.path.join(destination, "pkg") files = os.listdir(pkgdest) - self.assertIn("__init__.py", files) - self.assertIn("README.txt", files) + wanted = ["__init__.py", "HACKING.txt", "README.txt"] if sys.version_info[1] == 1: - self.assertIn("__init__.pyc", files) + wanted.append("__init__.pyc") else: + wanted.append("__pycache__") + self.assertEqual(sorted(files), sorted(wanted)) + if sys.version_info[1] >= 2: pycache_dir = os.path.join(pkgdest, "__pycache__") pyc_files = os.listdir(pycache_dir) - self.assertIn("__init__.%s.pyc" % imp.get_tag(), pyc_files) + self.assertEqual(["__init__.%s.pyc" % imp.get_tag()], pyc_files) def test_empty_package_dir(self): # See SF 1668596/1720897. diff --git a/distutils2/tests/test_command_sdist.py b/distutils2/tests/test_command_sdist.py --- a/distutils2/tests/test_command_sdist.py +++ b/distutils2/tests/test_command_sdist.py @@ -74,7 +74,6 @@ 'author_email': 'xxx'} dist = Distribution(metadata) dist.packages = ['somecode'] - dist.include_package_data = True cmd = sdist(dist) cmd.dist_dir = 'dist' return dist, cmd diff --git a/distutils2/tests/test_config.py b/distutils2/tests/test_config.py --- a/distutils2/tests/test_config.py +++ b/distutils2/tests/test_config.py @@ -66,11 +66,15 @@ bin/taunt package_data = - cheese = data/templates/* + cheese = data/templates/* doc/* + doc/images/*.png + extra_files = %(extra-files)s # Replaces MANIFEST.in +# FIXME no, it's extra_files +# (but sdist_extra is a better name, should use it) sdist_extra = include THANKS HACKING recursive-include examples *.txt *.py @@ -96,6 +100,17 @@ sub_commands = foo """ +SETUP_CFG_PKGDATA_BUGGY_1 = """ +[files] +package_data = foo.* +""" + +SETUP_CFG_PKGDATA_BUGGY_2 = """ +[files] +package_data = + foo.* +""" + # Can not be merged with SETUP_CFG else install_dist # command will fail when trying to compile C sources # TODO use a DummyCommand to mock build_ext @@ -276,13 +291,14 @@ self.assertEqual(dist.packages, ['one', 'two', 'three']) self.assertEqual(dist.py_modules, ['haven']) - self.assertEqual(dist.package_data, {'cheese': 'data/templates/*'}) - self.assertEqual( + self.assertEqual(dist.package_data, + {'cheese': ['data/templates/*', 'doc/*', + 'doc/images/*.png']}) + self.assertEqual(dist.data_files, {'bm/b1.gif': '{icon}/b1.gif', 'bm/b2.gif': '{icon}/b2.gif', 'Cfg/data.CFG': '{config}/baBar/data.CFG', - 'init_script': '{script}/JunGle/init_script'}, - dist.data_files) + 'init_script': '{script}/JunGle/init_script'}) self.assertEqual(dist.package_dir, 'src') @@ -293,8 +309,8 @@ # this file would be __main__.Foo when run as "python test_config.py". # The name FooBarBazTest should be unique enough to prevent # collisions. - self.assertEqual('FooBarBazTest', - dist.get_command_obj('foo').__class__.__name__) + self.assertEqual(dist.get_command_obj('foo').__class__.__name__, + 'FooBarBazTest') # did the README got loaded ? self.assertEqual(dist.metadata['description'], 'yeah') @@ -304,6 +320,13 @@ d = new_compiler(compiler='d') self.assertEqual(d.description, 'D Compiler') + # check error reporting for invalid package_data value + self.write_file('setup.cfg', SETUP_CFG_PKGDATA_BUGGY_1) + self.assertRaises(PackagingOptionError, self.get_dist) + + self.write_file('setup.cfg', SETUP_CFG_PKGDATA_BUGGY_2) + self.assertRaises(PackagingOptionError, self.get_dist) + def test_multiple_description_file(self): self.write_setup({'description-file': 'README CHANGES'}) self.write_file('README', 'yeah') diff --git a/distutils2/tests/test_create.py b/distutils2/tests/test_create.py --- a/distutils2/tests/test_create.py +++ b/distutils2/tests/test_create.py @@ -116,7 +116,6 @@ package_data={ 'babar': ['Pom', 'Flora', 'Alexander'], 'me': ['dady', 'mumy', 'sys', 'bro'], - '': ['setup.py', 'README'], 'pyxfoil': ['fengine.so'], }, scripts=['my_script', 'bin/run'], @@ -150,16 +149,15 @@ mymodule scripts = my_script bin/run - extra_files = Martinique/Lamentin/dady - Martinique/Lamentin/mumy - Martinique/Lamentin/sys - Martinique/Lamentin/bro - setup.py - README - Pom - Flora - Alexander - pyxfoil/fengine.so + package_data = + babar = Pom + Flora + Alexander + me = dady + mumy + sys + bro + pyxfoil = fengine.so resources = README.rst = {doc} @@ -217,8 +215,9 @@ [files] packages = pyxfoil - extra_files = pyxfoil/fengine.so - pyxfoil/babar.so + package_data = + pyxfoil = fengine.so + babar.so resources = README.rst = {doc} -- Repository URL: http://hg.python.org/distutils2 From python-checkins at python.org Sun Feb 5 13:30:38 2012 From: python-checkins at python.org (nadeem.vawda) Date: Sun, 05 Feb 2012 13:30:38 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=282=2E7=29=3A_Clarify_note_in?= =?utf8?q?_BZ2File_docs_about_lack_of_multi-stream_support_=28issue_=23162?= =?utf8?b?NSku?= Message-ID: http://hg.python.org/cpython/rev/ad20324229f4 changeset: 74783:ad20324229f4 branch: 2.7 parent: 74776:7c263bfc92f5 user: Nadeem Vawda date: Sun Feb 05 14:27:01 2012 +0200 summary: Clarify note in BZ2File docs about lack of multi-stream support (issue #1625). files: Doc/library/bz2.rst | 7 +++++-- 1 files changed, 5 insertions(+), 2 deletions(-) diff --git a/Doc/library/bz2.rst b/Doc/library/bz2.rst --- a/Doc/library/bz2.rst +++ b/Doc/library/bz2.rst @@ -72,8 +72,11 @@ 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 `bz2file - module `_ instead of this class. + support for multi-stream files, consider using the third-party + :mod:`bz2file` module (available from + `PyPI `_). This module provides a + backport of Python 3.3's :class:`BZ2File` class, which does support + multi-stream files. .. method:: close() -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Feb 5 13:30:38 2012 From: python-checkins at python.org (nadeem.vawda) Date: Sun, 05 Feb 2012 13:30:38 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=283=2E2=29=3A_Clarify_note_in?= =?utf8?q?_BZ2File_docs_about_lack_of_multi-stream_support_=28issue_=23162?= =?utf8?b?NSku?= Message-ID: http://hg.python.org/cpython/rev/e4c4595033ad changeset: 74784:e4c4595033ad branch: 3.2 parent: 74777:cd748bab3cdd user: Nadeem Vawda date: Sun Feb 05 14:29:00 2012 +0200 summary: Clarify note in BZ2File docs about lack of multi-stream support (issue #1625). files: Doc/library/bz2.rst | 7 +++++-- 1 files changed, 5 insertions(+), 2 deletions(-) diff --git a/Doc/library/bz2.rst b/Doc/library/bz2.rst --- a/Doc/library/bz2.rst +++ b/Doc/library/bz2.rst @@ -70,8 +70,11 @@ 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 `bz2file - module `_ instead of this class. + support for multi-stream files, consider using the third-party + :mod:`bz2file` module (available from + `PyPI `_). This module provides a + backport of Python 3.3's :class:`BZ2File` class, which does support + multi-stream files. .. method:: close() -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Feb 5 13:30:39 2012 From: python-checkins at python.org (nadeem.vawda) Date: Sun, 05 Feb 2012 13:30:39 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_3=2E2_-=3E_default=29?= =?utf8?q?=3A_Null_merge=2E?= Message-ID: http://hg.python.org/cpython/rev/ef78d696206a changeset: 74785:ef78d696206a parent: 74782:028e2ba85685 parent: 74784:e4c4595033ad user: Nadeem Vawda date: Sun Feb 05 14:30:09 2012 +0200 summary: Null merge. files: -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Feb 5 13:50:11 2012 From: python-checkins at python.org (eric.araujo) Date: Sun, 05 Feb 2012 13:50:11 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=283=2E2=29=3A_Hide_or_remove_?= =?utf8?q?user-visible_XXX_notes_from_distutils_doc_=28=2313716=29=2E?= Message-ID: http://hg.python.org/cpython/rev/3d25869fce0c changeset: 74786:3d25869fce0c branch: 3.2 parent: 74415:050c07b31192 user: ?ric Araujo date: Sun Jan 15 02:25:31 2012 +0100 summary: Hide or remove user-visible XXX notes from distutils doc (#13716). Requested by Florent Xicluna with the rationale that they make the docs look unfinished. I?ve also removed a few XXX notes that were not visible in the HTML but could waste contributors? time by suggesting improvements that are never going to happen for distutils. files: Doc/distutils/apiref.rst | 36 ++++++++------------------- 1 files changed, 11 insertions(+), 25 deletions(-) diff --git a/Doc/distutils/apiref.rst b/Doc/distutils/apiref.rst --- a/Doc/distutils/apiref.rst +++ b/Doc/distutils/apiref.rst @@ -449,7 +449,9 @@ Define a preprocessor macro for all compilations driven by this compiler object. The optional parameter *value* should be a string; if it is not supplied, then the macro will be defined without an explicit value and the exact outcome - depends on the compiler used (XXX true? does ANSI say anything about this?) + depends on the compiler used. + + .. XXX true? does ANSI say anything about this? .. method:: CCompiler.undefine_macro(name) @@ -603,7 +605,9 @@ *output_libname* should be a library name, not a filename; the filename will be inferred from the library name. *output_dir* is the directory where the library - file will be put. XXX defaults to what? + file will be put. + + .. XXX defaults to what? *debug* is a boolean; if true, debugging information will be included in the library (note that on most platforms, it is the compile step where this matters: @@ -723,30 +727,29 @@ Invokes :func:`distutils.util.execute` This method invokes a Python function *func* with the given arguments *args*, after logging and taking into account - the *dry_run* flag. XXX see also. + the *dry_run* flag. .. method:: CCompiler.spawn(cmd) Invokes :func:`distutils.util.spawn`. This invokes an external process to run - the given command. XXX see also. + the given command. .. method:: CCompiler.mkpath(name[, mode=511]) Invokes :func:`distutils.dir_util.mkpath`. This creates a directory and any - missing ancestor directories. XXX see also. + missing ancestor directories. .. method:: CCompiler.move_file(src, dst) - Invokes :meth:`distutils.file_util.move_file`. Renames *src* to *dst*. XXX see - also. + Invokes :meth:`distutils.file_util.move_file`. Renames *src* to *dst*. .. method:: CCompiler.announce(msg[, level=1]) - Write a message using :func:`distutils.log.debug`. XXX see also. + Write a message using :func:`distutils.log.debug`. .. method:: CCompiler.warn(msg) @@ -874,8 +877,6 @@ prefix of all files and directories in the archive. *root_dir* and *base_dir* both default to the current directory. Returns the name of the archive file. - .. XXX This should be changed to support bz2 files. - .. function:: make_tarball(base_name, base_dir[, compress='gzip', verbose=0, dry_run=0]) @@ -887,8 +888,6 @@ possibly plus the appropriate compression extension (:file:`.gz`, :file:`.bz2` or :file:`.Z`). Return the output filename. - .. XXX This should be replaced with calls to the :mod:`tarfile` module. - .. function:: make_zipfile(base_name, base_dir[, verbose=0, dry_run=0]) @@ -1000,8 +999,6 @@ errors are ignored (apart from being reported to ``sys.stdout`` if *verbose* is true). -.. XXX Some of this could be replaced with the shutil module? - :mod:`distutils.file_util` --- Single file operations ===================================================== @@ -1115,8 +1112,6 @@ * ``macosx-10.6-intel`` - .. % XXX isn't this also provided by some other non-distutils module? - .. function:: convert_path(pathname) @@ -1321,8 +1316,6 @@ the "negative alias" of :option:`--verbose`, then :option:`--quiet` on the command line sets *verbose* to false. -.. XXX Should be replaced with optparse - .. function:: fancy_getopt(options, negative_opt, object, args) Wrapper function. *options* is a list of ``(long_option, short_option, @@ -1338,9 +1331,6 @@ Wraps *text* to less than *width* wide. - .. XXX Should be replaced with :mod:`textwrap` (which is available in Python - 2.3 and later). - .. class:: FancyGetopt([option_table=None]) @@ -1403,10 +1393,6 @@ :synopsis: A simple logging mechanism, 282-style -.. XXX Should be replaced with standard :mod:`logging` module. - - - :mod:`distutils.spawn` --- Spawn a sub-process ============================================== -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Feb 5 13:50:12 2012 From: python-checkins at python.org (eric.araujo) Date: Sun, 05 Feb 2012 13:50:12 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=283=2E2=29=3A_Markup_improvem?= =?utf8?q?ents_for_the_embedding_CPython_doc_patch_from_=231040439?= Message-ID: http://hg.python.org/cpython/rev/79e8de78abd0 changeset: 74787:79e8de78abd0 branch: 3.2 user: ?ric Araujo date: Sun Jan 15 02:31:58 2012 +0100 summary: Markup improvements for the embedding CPython doc patch from #1040439 files: Doc/extending/embedding.rst | 9 +++++---- 1 files changed, 5 insertions(+), 4 deletions(-) diff --git a/Doc/extending/embedding.rst b/Doc/extending/embedding.rst --- a/Doc/extending/embedding.rst +++ b/Doc/extending/embedding.rst @@ -271,7 +271,7 @@ To find out the required compiler and linker flags, you can execute the :file:`python{X.Y}-config` script which is generated as part of the -installation process (a generic :file:`python3-config` script is also +installation process (a :file:`python3-config` script may also be available). This script has several options, of which the following will be directly useful to you: @@ -294,9 +294,10 @@ example. If this procedure doesn't work for you (it is not guaranteed to work for -all Unix-like platforms; however, we welcome bug reports at -http://bugs.python.org), you will have to read your system's documentation -about dynamic linking and/or examine Python's Makefile and compilation +all Unix-like platforms; however, we welcome :ref:`bug reports `) +you will have to read your system's documentation about dynamic linking and/or +examine Python's :file:`Makefile` (use :func:`sysconfig.get_makefile_filename` +to find its location) and compilation options. In this case, the :mod:`sysconfig` module is a useful tool to programmatically extract the configuration values that you will want to combine together:: -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Feb 5 13:50:13 2012 From: python-checkins at python.org (eric.araujo) Date: Sun, 05 Feb 2012 13:50:13 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=283=2E2=29=3A_Stop_ignoring_R?= =?utf8?q?PMs_in_distutils=27_upload_command_=28=232945=29=2E?= Message-ID: http://hg.python.org/cpython/rev/26aea1825418 changeset: 74788:26aea1825418 branch: 3.2 user: ?ric Araujo date: Sun Jan 15 02:48:55 2012 +0100 summary: Stop ignoring RPMs in distutils' upload command (#2945). Bug reported by Hartmut Goebel and patch contributed by Carl Robben. Carl tested the fix and we have a buildbot with rpm installed, so I?m committing even though I could not run this test (but I do understand the changed code :) files: Lib/distutils/command/bdist_rpm.py | 12 ++++++++++++ Lib/distutils/tests/test_bdist_rpm.py | 9 +++++++++ Misc/ACKS | 1 + Misc/NEWS | 2 ++ 4 files changed, 24 insertions(+), 0 deletions(-) diff --git a/Lib/distutils/command/bdist_rpm.py b/Lib/distutils/command/bdist_rpm.py --- a/Lib/distutils/command/bdist_rpm.py +++ b/Lib/distutils/command/bdist_rpm.py @@ -365,16 +365,28 @@ self.spawn(rpm_cmd) if not self.dry_run: + if self.distribution.has_ext_modules(): + pyversion = get_python_version() + else: + pyversion = 'any' + if not self.binary_only: srpm = os.path.join(rpm_dir['SRPMS'], source_rpm) assert(os.path.exists(srpm)) self.move_file(srpm, self.dist_dir) + filename = os.path.join(self.dist_dir, source_rpm) + self.distribution.dist_files.append( + ('bdist_rpm', pyversion, filename)) if not self.source_only: for rpm in binary_rpms: rpm = os.path.join(rpm_dir['RPMS'], rpm) if os.path.exists(rpm): self.move_file(rpm, self.dist_dir) + filename = os.path.join(self.dist_dir, + os.path.basename(rpm)) + self.distribution.dist_files.append( + ('bdist_rpm', pyversion, filename)) def _dist_path(self, path): return os.path.join(self.dist_dir, os.path.basename(path)) diff --git a/Lib/distutils/tests/test_bdist_rpm.py b/Lib/distutils/tests/test_bdist_rpm.py --- a/Lib/distutils/tests/test_bdist_rpm.py +++ b/Lib/distutils/tests/test_bdist_rpm.py @@ -78,6 +78,10 @@ dist_created = os.listdir(os.path.join(pkg_dir, 'dist')) self.assertTrue('foo-0.1-1.noarch.rpm' in dist_created) + # bug #2945: upload ignores bdist_rpm files + self.assertIn(('bdist_rpm', 'any', 'dist/foo-0.1-1.src.rpm'), dist.dist_files) + self.assertIn(('bdist_rpm', 'any', 'dist/foo-0.1-1.noarch.rpm'), dist.dist_files) + def test_no_optimize_flag(self): # XXX I am unable yet to make this test work without @@ -117,6 +121,11 @@ dist_created = os.listdir(os.path.join(pkg_dir, 'dist')) self.assertTrue('foo-0.1-1.noarch.rpm' in dist_created) + + # bug #2945: upload ignores bdist_rpm files + self.assertIn(('bdist_rpm', 'any', 'dist/foo-0.1-1.src.rpm'), dist.dist_files) + self.assertIn(('bdist_rpm', 'any', 'dist/foo-0.1-1.noarch.rpm'), dist.dist_files) + os.remove(os.path.join(pkg_dir, 'dist', 'foo-0.1-1.noarch.rpm')) def test_suite(): diff --git a/Misc/ACKS b/Misc/ACKS --- a/Misc/ACKS +++ b/Misc/ACKS @@ -765,6 +765,7 @@ Juan M. Bello Rivas Davide Rizzo Anthony Roach +Carl Robben Mark Roberts Jim Robinson Andy Robinson diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -97,6 +97,8 @@ Library ------- +- Issue #2945: Make the distutils upload command aware of bdist_rpm products. + - Issue #13642: Unquote before b64encoding user:password during Basic Authentication. Patch contributed by Joonas Kuorilehto. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Feb 5 13:50:14 2012 From: python-checkins at python.org (eric.araujo) Date: Sun, 05 Feb 2012 13:50:14 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=283=2E2=29=3A_Document_json?= =?utf8?q?=2Edump_ensure=5Fascii_parameter_=28=2313770=29?= Message-ID: http://hg.python.org/cpython/rev/33d6da1b1c71 changeset: 74789:33d6da1b1c71 branch: 3.2 user: ?ric Araujo date: Mon Jan 16 10:09:20 2012 +0100 summary: Document json.dump ensure_ascii parameter (#13770) files: Doc/library/json.rst | 4 ++++ 1 files changed, 4 insertions(+), 0 deletions(-) diff --git a/Doc/library/json.rst b/Doc/library/json.rst --- a/Doc/library/json.rst +++ b/Doc/library/json.rst @@ -125,6 +125,10 @@ :class:`bytes` objects. Therefore, ``fp.write()`` must support :class:`str` input. + If *ensure_ascii* is ``True`` (the default), the output is guaranteed to + have all incoming non-ASCII characters escaped. If *ensure_ascii* is + ``False``, these characters will be output as-is. + If *check_circular* is ``False`` (default: ``True``), then the circular reference check for container types will be skipped and a circular reference will result in an :exc:`OverflowError` (or worse). -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Feb 5 13:50:15 2012 From: python-checkins at python.org (eric.araujo) Date: Sun, 05 Feb 2012 13:50:15 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=283=2E2=29=3A_Improve_interli?= =?utf8?q?nking_of_archiving/compression_modules_docs=2E?= Message-ID: http://hg.python.org/cpython/rev/11bd2d32b4e8 changeset: 74790:11bd2d32b4e8 branch: 3.2 user: ?ric Araujo date: Mon Jan 16 16:55:55 2012 +0100 summary: Improve interlinking of archiving/compression modules docs. - Remove duplicated list of links to the other modules from each module?s doc (people can already go up to library/archiving and there they can see the list). - Link to shutil high-level operations. Reviewed by Nadeem Vawda in #6715. files: Doc/library/archiving.rst | 1 + Doc/library/bz2.rst | 3 --- Doc/library/gzip.rst | 3 --- Doc/library/shutil.rst | 10 +++++++--- Doc/library/tarfile.rst | 3 ++- Doc/library/zipfile.rst | 3 --- Doc/library/zlib.rst | 4 +--- 7 files changed, 11 insertions(+), 16 deletions(-) diff --git a/Doc/library/archiving.rst b/Doc/library/archiving.rst --- a/Doc/library/archiving.rst +++ b/Doc/library/archiving.rst @@ -6,6 +6,7 @@ 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. .. toctree:: diff --git a/Doc/library/bz2.rst b/Doc/library/bz2.rst --- a/Doc/library/bz2.rst +++ b/Doc/library/bz2.rst @@ -12,9 +12,6 @@ It implements a complete file interface, one-shot (de)compression functions, and types for sequential (de)compression. -For other archive formats, see the :mod:`gzip`, :mod:`zipfile`, and -:mod:`tarfile` modules. - Here is a summary of the features offered by the bz2 module: * :class:`BZ2File` class implements a complete file interface, including diff --git a/Doc/library/gzip.rst b/Doc/library/gzip.rst --- a/Doc/library/gzip.rst +++ b/Doc/library/gzip.rst @@ -21,9 +21,6 @@ :program:`gzip` and :program:`gunzip` programs, such as those produced by :program:`compress` and :program:`pack`, are not supported by this module. -For other archive formats, see the :mod:`bz2`, :mod:`zipfile`, and -:mod:`tarfile` modules. - The module defines the following items: diff --git a/Doc/library/shutil.rst b/Doc/library/shutil.rst --- a/Doc/library/shutil.rst +++ b/Doc/library/shutil.rst @@ -31,6 +31,8 @@ are not copied. +.. _file-operations: + Directory and files operations ------------------------------ @@ -181,7 +183,7 @@ (*srcname*, *dstname*, *exception*). -.. _shutil-example: +.. _shutil-copytree-example: copytree example :::::::::::::::: @@ -248,6 +250,9 @@ Archiving operations -------------------- +High-level utilities to create and read compressed and archived files are also +provided. They rely on the :mod:`zipfile` and :mod:`tarfile` modules. + .. function:: make_archive(base_name, format, [root_dir, [base_dir, [verbose, [dry_run, [owner, [group, [logger]]]]]]]) Create an archive file (such as zip or tar) and return its name. @@ -375,6 +380,7 @@ .. versionadded:: 3.2 +.. _shutil-archiving-example: Archiving example ::::::::::::::::: @@ -400,5 +406,3 @@ -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 - - diff --git a/Doc/library/tarfile.rst b/Doc/library/tarfile.rst --- a/Doc/library/tarfile.rst +++ b/Doc/library/tarfile.rst @@ -14,7 +14,8 @@ The :mod:`tarfile` module makes it possible to read and write tar archives, including those using gzip or bz2 compression. -(:file:`.zip` files can be read and written using the :mod:`zipfile` module.) +Use the :mod:`zipfile` module to read or write :file:`.zip` files, or the +higher-level functions in :ref:`shutil `. Some facts and figures: diff --git a/Doc/library/zipfile.rst b/Doc/library/zipfile.rst --- a/Doc/library/zipfile.rst +++ b/Doc/library/zipfile.rst @@ -23,9 +23,6 @@ create an encrypted file. Decryption is extremely slow as it is implemented in native Python rather than C. -For other archive formats, see the :mod:`bz2`, :mod:`gzip`, and -:mod:`tarfile` modules. - The module defines the following items: .. exception:: BadZipFile diff --git a/Doc/library/zlib.rst b/Doc/library/zlib.rst --- a/Doc/library/zlib.rst +++ b/Doc/library/zlib.rst @@ -18,9 +18,7 @@ consult the zlib manual at http://www.zlib.net/manual.html for authoritative information. -For reading and writing ``.gz`` files see the :mod:`gzip` module. For -other archive formats, see the :mod:`bz2`, :mod:`zipfile`, and -:mod:`tarfile` modules. +For reading and writing ``.gz`` files see the :mod:`gzip` module. The available exception and functions in this module are: -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Feb 5 13:50:15 2012 From: python-checkins at python.org (eric.araujo) Date: Sun, 05 Feb 2012 13:50:15 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=283=2E2=29=3A_Really_make_bzt?= =?utf8?q?ar_support_in_shutil_conditional=2E?= Message-ID: http://hg.python.org/cpython/rev/054ba2a49d64 changeset: 74791:054ba2a49d64 branch: 3.2 user: ?ric Araujo date: Sun Feb 05 13:40:08 2012 +0100 summary: Really make bztar support in shutil conditional. This dict entry is added a few lines after if the bzip2 module is available, but removing this line was forgotten. files: Lib/shutil.py | 1 - 1 files changed, 0 insertions(+), 1 deletions(-) diff --git a/Lib/shutil.py b/Lib/shutil.py --- a/Lib/shutil.py +++ b/Lib/shutil.py @@ -493,7 +493,6 @@ _ARCHIVE_FORMATS = { 'gztar': (_make_tarball, [('compress', 'gzip')], "gzip'ed tar-file"), - 'bztar': (_make_tarball, [('compress', 'bzip2')], "bzip2'ed tar-file"), 'tar': (_make_tarball, [('compress', None)], "uncompressed tar file"), 'zip': (_make_zipfile, [],"ZIP file") } -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Feb 5 13:50:16 2012 From: python-checkins at python.org (eric.araujo) Date: Sun, 05 Feb 2012 13:50:16 +0100 Subject: [Python-checkins] =?utf8?b?Y3B5dGhvbiAobWVyZ2UgMy4yIC0+IDMuMik6?= =?utf8?q?_Branch_merge?= Message-ID: http://hg.python.org/cpython/rev/4017f305d689 changeset: 74792:4017f305d689 branch: 3.2 parent: 74784:e4c4595033ad parent: 74791:054ba2a49d64 user: ?ric Araujo date: Sun Feb 05 13:41:47 2012 +0100 summary: Branch merge files: Doc/distutils/apiref.rst | 36 ++++---------- Doc/extending/embedding.rst | 9 ++- Doc/library/archiving.rst | 1 + Doc/library/bz2.rst | 3 - Doc/library/gzip.rst | 3 - Doc/library/json.rst | 4 + Doc/library/shutil.rst | 10 ++- Doc/library/tarfile.rst | 3 +- Doc/library/zipfile.rst | 3 - Doc/library/zlib.rst | 4 +- Lib/distutils/command/bdist_rpm.py | 12 +++++ Lib/distutils/tests/test_bdist_rpm.py | 9 +++ Lib/shutil.py | 1 - Misc/ACKS | 1 + Misc/NEWS | 2 + 15 files changed, 55 insertions(+), 46 deletions(-) diff --git a/Doc/distutils/apiref.rst b/Doc/distutils/apiref.rst --- a/Doc/distutils/apiref.rst +++ b/Doc/distutils/apiref.rst @@ -449,7 +449,9 @@ Define a preprocessor macro for all compilations driven by this compiler object. The optional parameter *value* should be a string; if it is not supplied, then the macro will be defined without an explicit value and the exact outcome - depends on the compiler used (XXX true? does ANSI say anything about this?) + depends on the compiler used. + + .. XXX true? does ANSI say anything about this? .. method:: CCompiler.undefine_macro(name) @@ -603,7 +605,9 @@ *output_libname* should be a library name, not a filename; the filename will be inferred from the library name. *output_dir* is the directory where the library - file will be put. XXX defaults to what? + file will be put. + + .. XXX defaults to what? *debug* is a boolean; if true, debugging information will be included in the library (note that on most platforms, it is the compile step where this matters: @@ -723,30 +727,29 @@ Invokes :func:`distutils.util.execute` This method invokes a Python function *func* with the given arguments *args*, after logging and taking into account - the *dry_run* flag. XXX see also. + the *dry_run* flag. .. method:: CCompiler.spawn(cmd) Invokes :func:`distutils.util.spawn`. This invokes an external process to run - the given command. XXX see also. + the given command. .. method:: CCompiler.mkpath(name[, mode=511]) Invokes :func:`distutils.dir_util.mkpath`. This creates a directory and any - missing ancestor directories. XXX see also. + missing ancestor directories. .. method:: CCompiler.move_file(src, dst) - Invokes :meth:`distutils.file_util.move_file`. Renames *src* to *dst*. XXX see - also. + Invokes :meth:`distutils.file_util.move_file`. Renames *src* to *dst*. .. method:: CCompiler.announce(msg[, level=1]) - Write a message using :func:`distutils.log.debug`. XXX see also. + Write a message using :func:`distutils.log.debug`. .. method:: CCompiler.warn(msg) @@ -874,8 +877,6 @@ prefix of all files and directories in the archive. *root_dir* and *base_dir* both default to the current directory. Returns the name of the archive file. - .. XXX This should be changed to support bz2 files. - .. function:: make_tarball(base_name, base_dir[, compress='gzip', verbose=0, dry_run=0]) @@ -887,8 +888,6 @@ possibly plus the appropriate compression extension (:file:`.gz`, :file:`.bz2` or :file:`.Z`). Return the output filename. - .. XXX This should be replaced with calls to the :mod:`tarfile` module. - .. function:: make_zipfile(base_name, base_dir[, verbose=0, dry_run=0]) @@ -1000,8 +999,6 @@ errors are ignored (apart from being reported to ``sys.stdout`` if *verbose* is true). -.. XXX Some of this could be replaced with the shutil module? - :mod:`distutils.file_util` --- Single file operations ===================================================== @@ -1115,8 +1112,6 @@ * ``macosx-10.6-intel`` - .. % XXX isn't this also provided by some other non-distutils module? - .. function:: convert_path(pathname) @@ -1321,8 +1316,6 @@ the "negative alias" of :option:`--verbose`, then :option:`--quiet` on the command line sets *verbose* to false. -.. XXX Should be replaced with optparse - .. function:: fancy_getopt(options, negative_opt, object, args) Wrapper function. *options* is a list of ``(long_option, short_option, @@ -1338,9 +1331,6 @@ Wraps *text* to less than *width* wide. - .. XXX Should be replaced with :mod:`textwrap` (which is available in Python - 2.3 and later). - .. class:: FancyGetopt([option_table=None]) @@ -1403,10 +1393,6 @@ :synopsis: A simple logging mechanism, 282-style -.. XXX Should be replaced with standard :mod:`logging` module. - - - :mod:`distutils.spawn` --- Spawn a sub-process ============================================== diff --git a/Doc/extending/embedding.rst b/Doc/extending/embedding.rst --- a/Doc/extending/embedding.rst +++ b/Doc/extending/embedding.rst @@ -271,7 +271,7 @@ To find out the required compiler and linker flags, you can execute the :file:`python{X.Y}-config` script which is generated as part of the -installation process (a generic :file:`python3-config` script is also +installation process (a :file:`python3-config` script may also be available). This script has several options, of which the following will be directly useful to you: @@ -294,9 +294,10 @@ example. If this procedure doesn't work for you (it is not guaranteed to work for -all Unix-like platforms; however, we welcome bug reports at -http://bugs.python.org), you will have to read your system's documentation -about dynamic linking and/or examine Python's Makefile and compilation +all Unix-like platforms; however, we welcome :ref:`bug reports `) +you will have to read your system's documentation about dynamic linking and/or +examine Python's :file:`Makefile` (use :func:`sysconfig.get_makefile_filename` +to find its location) and compilation options. In this case, the :mod:`sysconfig` module is a useful tool to programmatically extract the configuration values that you will want to combine together:: diff --git a/Doc/library/archiving.rst b/Doc/library/archiving.rst --- a/Doc/library/archiving.rst +++ b/Doc/library/archiving.rst @@ -6,6 +6,7 @@ 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. .. toctree:: diff --git a/Doc/library/bz2.rst b/Doc/library/bz2.rst --- a/Doc/library/bz2.rst +++ b/Doc/library/bz2.rst @@ -12,9 +12,6 @@ It implements a complete file interface, one-shot (de)compression functions, and types for sequential (de)compression. -For other archive formats, see the :mod:`gzip`, :mod:`zipfile`, and -:mod:`tarfile` modules. - Here is a summary of the features offered by the bz2 module: * :class:`BZ2File` class implements a complete file interface, including diff --git a/Doc/library/gzip.rst b/Doc/library/gzip.rst --- a/Doc/library/gzip.rst +++ b/Doc/library/gzip.rst @@ -21,9 +21,6 @@ :program:`gzip` and :program:`gunzip` programs, such as those produced by :program:`compress` and :program:`pack`, are not supported by this module. -For other archive formats, see the :mod:`bz2`, :mod:`zipfile`, and -:mod:`tarfile` modules. - The module defines the following items: diff --git a/Doc/library/json.rst b/Doc/library/json.rst --- a/Doc/library/json.rst +++ b/Doc/library/json.rst @@ -125,6 +125,10 @@ :class:`bytes` objects. Therefore, ``fp.write()`` must support :class:`str` input. + If *ensure_ascii* is ``True`` (the default), the output is guaranteed to + have all incoming non-ASCII characters escaped. If *ensure_ascii* is + ``False``, these characters will be output as-is. + If *check_circular* is ``False`` (default: ``True``), then the circular reference check for container types will be skipped and a circular reference will result in an :exc:`OverflowError` (or worse). diff --git a/Doc/library/shutil.rst b/Doc/library/shutil.rst --- a/Doc/library/shutil.rst +++ b/Doc/library/shutil.rst @@ -31,6 +31,8 @@ are not copied. +.. _file-operations: + Directory and files operations ------------------------------ @@ -181,7 +183,7 @@ (*srcname*, *dstname*, *exception*). -.. _shutil-example: +.. _shutil-copytree-example: copytree example :::::::::::::::: @@ -248,6 +250,9 @@ Archiving operations -------------------- +High-level utilities to create and read compressed and archived files are also +provided. They rely on the :mod:`zipfile` and :mod:`tarfile` modules. + .. function:: make_archive(base_name, format, [root_dir, [base_dir, [verbose, [dry_run, [owner, [group, [logger]]]]]]]) Create an archive file (such as zip or tar) and return its name. @@ -375,6 +380,7 @@ .. versionadded:: 3.2 +.. _shutil-archiving-example: Archiving example ::::::::::::::::: @@ -400,5 +406,3 @@ -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 - - diff --git a/Doc/library/tarfile.rst b/Doc/library/tarfile.rst --- a/Doc/library/tarfile.rst +++ b/Doc/library/tarfile.rst @@ -14,7 +14,8 @@ The :mod:`tarfile` module makes it possible to read and write tar archives, including those using gzip or bz2 compression. -(:file:`.zip` files can be read and written using the :mod:`zipfile` module.) +Use the :mod:`zipfile` module to read or write :file:`.zip` files, or the +higher-level functions in :ref:`shutil `. Some facts and figures: diff --git a/Doc/library/zipfile.rst b/Doc/library/zipfile.rst --- a/Doc/library/zipfile.rst +++ b/Doc/library/zipfile.rst @@ -23,9 +23,6 @@ create an encrypted file. Decryption is extremely slow as it is implemented in native Python rather than C. -For other archive formats, see the :mod:`bz2`, :mod:`gzip`, and -:mod:`tarfile` modules. - The module defines the following items: .. exception:: BadZipFile diff --git a/Doc/library/zlib.rst b/Doc/library/zlib.rst --- a/Doc/library/zlib.rst +++ b/Doc/library/zlib.rst @@ -18,9 +18,7 @@ consult the zlib manual at http://www.zlib.net/manual.html for authoritative information. -For reading and writing ``.gz`` files see the :mod:`gzip` module. For -other archive formats, see the :mod:`bz2`, :mod:`zipfile`, and -:mod:`tarfile` modules. +For reading and writing ``.gz`` files see the :mod:`gzip` module. The available exception and functions in this module are: diff --git a/Lib/distutils/command/bdist_rpm.py b/Lib/distutils/command/bdist_rpm.py --- a/Lib/distutils/command/bdist_rpm.py +++ b/Lib/distutils/command/bdist_rpm.py @@ -365,16 +365,28 @@ self.spawn(rpm_cmd) if not self.dry_run: + if self.distribution.has_ext_modules(): + pyversion = get_python_version() + else: + pyversion = 'any' + if not self.binary_only: srpm = os.path.join(rpm_dir['SRPMS'], source_rpm) assert(os.path.exists(srpm)) self.move_file(srpm, self.dist_dir) + filename = os.path.join(self.dist_dir, source_rpm) + self.distribution.dist_files.append( + ('bdist_rpm', pyversion, filename)) if not self.source_only: for rpm in binary_rpms: rpm = os.path.join(rpm_dir['RPMS'], rpm) if os.path.exists(rpm): self.move_file(rpm, self.dist_dir) + filename = os.path.join(self.dist_dir, + os.path.basename(rpm)) + self.distribution.dist_files.append( + ('bdist_rpm', pyversion, filename)) def _dist_path(self, path): return os.path.join(self.dist_dir, os.path.basename(path)) diff --git a/Lib/distutils/tests/test_bdist_rpm.py b/Lib/distutils/tests/test_bdist_rpm.py --- a/Lib/distutils/tests/test_bdist_rpm.py +++ b/Lib/distutils/tests/test_bdist_rpm.py @@ -78,6 +78,10 @@ dist_created = os.listdir(os.path.join(pkg_dir, 'dist')) self.assertTrue('foo-0.1-1.noarch.rpm' in dist_created) + # bug #2945: upload ignores bdist_rpm files + self.assertIn(('bdist_rpm', 'any', 'dist/foo-0.1-1.src.rpm'), dist.dist_files) + self.assertIn(('bdist_rpm', 'any', 'dist/foo-0.1-1.noarch.rpm'), dist.dist_files) + def test_no_optimize_flag(self): # XXX I am unable yet to make this test work without @@ -117,6 +121,11 @@ dist_created = os.listdir(os.path.join(pkg_dir, 'dist')) self.assertTrue('foo-0.1-1.noarch.rpm' in dist_created) + + # bug #2945: upload ignores bdist_rpm files + self.assertIn(('bdist_rpm', 'any', 'dist/foo-0.1-1.src.rpm'), dist.dist_files) + self.assertIn(('bdist_rpm', 'any', 'dist/foo-0.1-1.noarch.rpm'), dist.dist_files) + os.remove(os.path.join(pkg_dir, 'dist', 'foo-0.1-1.noarch.rpm')) def test_suite(): diff --git a/Lib/shutil.py b/Lib/shutil.py --- a/Lib/shutil.py +++ b/Lib/shutil.py @@ -493,7 +493,6 @@ _ARCHIVE_FORMATS = { 'gztar': (_make_tarball, [('compress', 'gzip')], "gzip'ed tar-file"), - 'bztar': (_make_tarball, [('compress', 'bzip2')], "bzip2'ed tar-file"), 'tar': (_make_tarball, [('compress', None)], "uncompressed tar file"), 'zip': (_make_zipfile, [],"ZIP file") } diff --git a/Misc/ACKS b/Misc/ACKS --- a/Misc/ACKS +++ b/Misc/ACKS @@ -767,6 +767,7 @@ Juan M. Bello Rivas Davide Rizzo Anthony Roach +Carl Robben Mark Roberts Jim Robinson Andy Robinson diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -113,6 +113,8 @@ Library ------- +- 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) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Feb 5 13:50:18 2012 From: python-checkins at python.org (eric.araujo) Date: Sun, 05 Feb 2012 13:50:18 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_3=2E2_-=3E_default=29?= =?utf8?b?OiBNZXJnZSBlZGl0cyBmcm9tIDMuMiAoIzEzNzE2LCAjMTA0MDQzOSwgIzI5NDUs?= =?utf8?b?ICMxMzc3MCwgIzY3MTUp?= Message-ID: http://hg.python.org/cpython/rev/1cb9b8126534 changeset: 74793:1cb9b8126534 parent: 74785:ef78d696206a parent: 74792:4017f305d689 user: ?ric Araujo date: Sun Feb 05 13:49:59 2012 +0100 summary: Merge edits from 3.2 (#13716, #1040439, #2945, #13770, #6715) files: Doc/distutils/apiref.rst | 36 ++++---------- Doc/extending/embedding.rst | 9 ++- Doc/library/archiving.rst | 3 +- Doc/library/bz2.rst | 3 - Doc/library/gzip.rst | 3 - Doc/library/json.rst | 4 + Doc/library/shutil.rst | 10 ++- Doc/library/tarfile.rst | 3 +- Doc/library/zipfile.rst | 3 - Doc/library/zlib.rst | 4 +- Lib/distutils/command/bdist_rpm.py | 12 +++++ Lib/distutils/tests/test_bdist_rpm.py | 9 +++ Lib/shutil.py | 1 - Misc/ACKS | 1 + Misc/NEWS | 2 + 15 files changed, 56 insertions(+), 47 deletions(-) diff --git a/Doc/distutils/apiref.rst b/Doc/distutils/apiref.rst --- a/Doc/distutils/apiref.rst +++ b/Doc/distutils/apiref.rst @@ -449,7 +449,9 @@ Define a preprocessor macro for all compilations driven by this compiler object. The optional parameter *value* should be a string; if it is not supplied, then the macro will be defined without an explicit value and the exact outcome - depends on the compiler used (XXX true? does ANSI say anything about this?) + depends on the compiler used. + + .. XXX true? does ANSI say anything about this? .. method:: CCompiler.undefine_macro(name) @@ -603,7 +605,9 @@ *output_libname* should be a library name, not a filename; the filename will be inferred from the library name. *output_dir* is the directory where the library - file will be put. XXX defaults to what? + file will be put. + + .. XXX defaults to what? *debug* is a boolean; if true, debugging information will be included in the library (note that on most platforms, it is the compile step where this matters: @@ -723,30 +727,29 @@ Invokes :func:`distutils.util.execute` This method invokes a Python function *func* with the given arguments *args*, after logging and taking into account - the *dry_run* flag. XXX see also. + the *dry_run* flag. .. method:: CCompiler.spawn(cmd) Invokes :func:`distutils.util.spawn`. This invokes an external process to run - the given command. XXX see also. + the given command. .. method:: CCompiler.mkpath(name[, mode=511]) Invokes :func:`distutils.dir_util.mkpath`. This creates a directory and any - missing ancestor directories. XXX see also. + missing ancestor directories. .. method:: CCompiler.move_file(src, dst) - Invokes :meth:`distutils.file_util.move_file`. Renames *src* to *dst*. XXX see - also. + Invokes :meth:`distutils.file_util.move_file`. Renames *src* to *dst*. .. method:: CCompiler.announce(msg[, level=1]) - Write a message using :func:`distutils.log.debug`. XXX see also. + Write a message using :func:`distutils.log.debug`. .. method:: CCompiler.warn(msg) @@ -874,8 +877,6 @@ prefix of all files and directories in the archive. *root_dir* and *base_dir* both default to the current directory. Returns the name of the archive file. - .. XXX This should be changed to support bz2 files. - .. function:: make_tarball(base_name, base_dir[, compress='gzip', verbose=0, dry_run=0]) @@ -887,8 +888,6 @@ possibly plus the appropriate compression extension (:file:`.gz`, :file:`.bz2` or :file:`.Z`). Return the output filename. - .. XXX This should be replaced with calls to the :mod:`tarfile` module. - .. function:: make_zipfile(base_name, base_dir[, verbose=0, dry_run=0]) @@ -1000,8 +999,6 @@ errors are ignored (apart from being reported to ``sys.stdout`` if *verbose* is true). -.. XXX Some of this could be replaced with the shutil module? - :mod:`distutils.file_util` --- Single file operations ===================================================== @@ -1115,8 +1112,6 @@ * ``macosx-10.6-intel`` - .. % XXX isn't this also provided by some other non-distutils module? - .. function:: convert_path(pathname) @@ -1320,8 +1315,6 @@ the "negative alias" of :option:`--verbose`, then :option:`--quiet` on the command line sets *verbose* to false. -.. XXX Should be replaced with optparse - .. function:: fancy_getopt(options, negative_opt, object, args) Wrapper function. *options* is a list of ``(long_option, short_option, @@ -1337,9 +1330,6 @@ Wraps *text* to less than *width* wide. - .. XXX Should be replaced with :mod:`textwrap` (which is available in Python - 2.3 and later). - .. class:: FancyGetopt([option_table=None]) @@ -1402,10 +1392,6 @@ :synopsis: A simple logging mechanism, 282-style -.. XXX Should be replaced with standard :mod:`logging` module. - - - :mod:`distutils.spawn` --- Spawn a sub-process ============================================== diff --git a/Doc/extending/embedding.rst b/Doc/extending/embedding.rst --- a/Doc/extending/embedding.rst +++ b/Doc/extending/embedding.rst @@ -271,7 +271,7 @@ To find out the required compiler and linker flags, you can execute the :file:`python{X.Y}-config` script which is generated as part of the -installation process (a generic :file:`python3-config` script is also +installation process (a :file:`python3-config` script may also be available). This script has several options, of which the following will be directly useful to you: @@ -294,9 +294,10 @@ example. If this procedure doesn't work for you (it is not guaranteed to work for -all Unix-like platforms; however, we welcome bug reports at -http://bugs.python.org), you will have to read your system's documentation -about dynamic linking and/or examine Python's Makefile and compilation +all Unix-like platforms; however, we welcome :ref:`bug reports `) +you will have to read your system's documentation about dynamic linking and/or +examine Python's :file:`Makefile` (use :func:`sysconfig.get_makefile_filename` +to find its location) and compilation options. In this case, the :mod:`sysconfig` module is a useful tool to programmatically extract the configuration values that you will want to combine together:: diff --git a/Doc/library/archiving.rst b/Doc/library/archiving.rst --- a/Doc/library/archiving.rst +++ b/Doc/library/archiving.rst @@ -6,7 +6,8 @@ The modules described in this chapter support data compression with the zlib, gzip, bzip2 and lzma algorithms, and the creation of ZIP- and tar-format -archives. +archives. See also :ref:`archiving-operations` provided by the :mod:`shutil` +module. .. toctree:: diff --git a/Doc/library/bz2.rst b/Doc/library/bz2.rst --- a/Doc/library/bz2.rst +++ b/Doc/library/bz2.rst @@ -12,9 +12,6 @@ This module provides a comprehensive interface for compressing and decompressing data using the bzip2 compression algorithm. -For related file formats, see the :mod:`gzip`, :mod:`lzma`, :mod:`zipfile`, and -:mod:`tarfile` modules. - The :mod:`bz2` module contains: * The :class:`BZ2File` class for reading and writing compressed files. diff --git a/Doc/library/gzip.rst b/Doc/library/gzip.rst --- a/Doc/library/gzip.rst +++ b/Doc/library/gzip.rst @@ -21,9 +21,6 @@ :program:`gzip` and :program:`gunzip` programs, such as those produced by :program:`compress` and :program:`pack`, are not supported by this module. -For related file formats, see the :mod:`bz2`, :mod:`lzma`, :mod:`zipfile`, and -:mod:`tarfile` modules. - The module defines the following items: diff --git a/Doc/library/json.rst b/Doc/library/json.rst --- a/Doc/library/json.rst +++ b/Doc/library/json.rst @@ -125,6 +125,10 @@ :class:`bytes` objects. Therefore, ``fp.write()`` must support :class:`str` input. + If *ensure_ascii* is ``True`` (the default), the output is guaranteed to + have all incoming non-ASCII characters escaped. If *ensure_ascii* is + ``False``, these characters will be output as-is. + If *check_circular* is ``False`` (default: ``True``), then the circular reference check for container types will be skipped and a circular reference will result in an :exc:`OverflowError` (or worse). diff --git a/Doc/library/shutil.rst b/Doc/library/shutil.rst --- a/Doc/library/shutil.rst +++ b/Doc/library/shutil.rst @@ -31,6 +31,8 @@ are not copied. +.. _file-operations: + Directory and files operations ------------------------------ @@ -234,7 +236,7 @@ (*srcname*, *dstname*, *exception*). -.. _shutil-example: +.. _shutil-copytree-example: copytree example :::::::::::::::: @@ -301,6 +303,9 @@ Archiving operations -------------------- +High-level utilities to create and read compressed and archived files are also +provided. They rely on the :mod:`zipfile` and :mod:`tarfile` modules. + .. function:: make_archive(base_name, format, [root_dir, [base_dir, [verbose, [dry_run, [owner, [group, [logger]]]]]]]) Create an archive file (such as zip or tar) and return its name. @@ -428,6 +433,7 @@ .. versionadded:: 3.2 +.. _shutil-archiving-example: Archiving example ::::::::::::::::: @@ -453,5 +459,3 @@ -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 - - diff --git a/Doc/library/tarfile.rst b/Doc/library/tarfile.rst --- a/Doc/library/tarfile.rst +++ b/Doc/library/tarfile.rst @@ -14,7 +14,8 @@ The :mod:`tarfile` module makes it possible to read and write tar archives, including those using gzip, bz2 and lzma compression. -(:file:`.zip` files can be read and written using the :mod:`zipfile` module.) +Use the :mod:`zipfile` module to read or write :file:`.zip` files, or the +higher-level functions in :ref:`shutil `. Some facts and figures: diff --git a/Doc/library/zipfile.rst b/Doc/library/zipfile.rst --- a/Doc/library/zipfile.rst +++ b/Doc/library/zipfile.rst @@ -23,9 +23,6 @@ create an encrypted file. Decryption is extremely slow as it is implemented in native Python rather than C. -For related file formats, see the :mod:`bz2`, :mod:`gzip`, :mod:`lzma`, and -:mod:`tarfile` modules. - The module defines the following items: .. exception:: BadZipFile diff --git a/Doc/library/zlib.rst b/Doc/library/zlib.rst --- a/Doc/library/zlib.rst +++ b/Doc/library/zlib.rst @@ -18,9 +18,7 @@ consult the zlib manual at http://www.zlib.net/manual.html for authoritative information. -For reading and writing ``.gz`` files see the :mod:`gzip` module. For other -related file formats, see the :mod:`bz2`, :mod:`lzma`, :mod:`zipfile`, and -:mod:`tarfile` modules. +For reading and writing ``.gz`` files see the :mod:`gzip` module. The available exception and functions in this module are: diff --git a/Lib/distutils/command/bdist_rpm.py b/Lib/distutils/command/bdist_rpm.py --- a/Lib/distutils/command/bdist_rpm.py +++ b/Lib/distutils/command/bdist_rpm.py @@ -365,16 +365,28 @@ self.spawn(rpm_cmd) if not self.dry_run: + if self.distribution.has_ext_modules(): + pyversion = get_python_version() + else: + pyversion = 'any' + if not self.binary_only: srpm = os.path.join(rpm_dir['SRPMS'], source_rpm) assert(os.path.exists(srpm)) self.move_file(srpm, self.dist_dir) + filename = os.path.join(self.dist_dir, source_rpm) + self.distribution.dist_files.append( + ('bdist_rpm', pyversion, filename)) if not self.source_only: for rpm in binary_rpms: rpm = os.path.join(rpm_dir['RPMS'], rpm) if os.path.exists(rpm): self.move_file(rpm, self.dist_dir) + filename = os.path.join(self.dist_dir, + os.path.basename(rpm)) + self.distribution.dist_files.append( + ('bdist_rpm', pyversion, filename)) def _dist_path(self, path): return os.path.join(self.dist_dir, os.path.basename(path)) diff --git a/Lib/distutils/tests/test_bdist_rpm.py b/Lib/distutils/tests/test_bdist_rpm.py --- a/Lib/distutils/tests/test_bdist_rpm.py +++ b/Lib/distutils/tests/test_bdist_rpm.py @@ -83,6 +83,10 @@ dist_created = os.listdir(os.path.join(pkg_dir, 'dist')) self.assertTrue('foo-0.1-1.noarch.rpm' in dist_created) + # bug #2945: upload ignores bdist_rpm files + self.assertIn(('bdist_rpm', 'any', 'dist/foo-0.1-1.src.rpm'), dist.dist_files) + self.assertIn(('bdist_rpm', 'any', 'dist/foo-0.1-1.noarch.rpm'), dist.dist_files) + def test_no_optimize_flag(self): # XXX I am unable yet to make this test work without @@ -122,6 +126,11 @@ dist_created = os.listdir(os.path.join(pkg_dir, 'dist')) self.assertTrue('foo-0.1-1.noarch.rpm' in dist_created) + + # bug #2945: upload ignores bdist_rpm files + self.assertIn(('bdist_rpm', 'any', 'dist/foo-0.1-1.src.rpm'), dist.dist_files) + self.assertIn(('bdist_rpm', 'any', 'dist/foo-0.1-1.noarch.rpm'), dist.dist_files) + os.remove(os.path.join(pkg_dir, 'dist', 'foo-0.1-1.noarch.rpm')) def test_suite(): diff --git a/Lib/shutil.py b/Lib/shutil.py --- a/Lib/shutil.py +++ b/Lib/shutil.py @@ -552,7 +552,6 @@ _ARCHIVE_FORMATS = { 'gztar': (_make_tarball, [('compress', 'gzip')], "gzip'ed tar-file"), - 'bztar': (_make_tarball, [('compress', 'bzip2')], "bzip2'ed tar-file"), 'tar': (_make_tarball, [('compress', None)], "uncompressed tar file"), 'zip': (_make_zipfile, [], "ZIP file") } diff --git a/Misc/ACKS b/Misc/ACKS --- a/Misc/ACKS +++ b/Misc/ACKS @@ -836,6 +836,7 @@ Juan M. Bello Rivas Davide Rizzo Anthony Roach +Carl Robben Mark Roberts Andy Robinson Jim Robinson diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -466,6 +466,8 @@ Library ------- +- Issue #2945: Make the distutils upload command aware of bdist_rpm products. + - Issue #13712: pysetup create should not convert package_data to extra_files. - Issue #11805: package_data in setup.cfg should allow more than one value. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Feb 5 14:08:13 2012 From: python-checkins at python.org (nadeem.vawda) Date: Sun, 05 Feb 2012 14:08:13 +0100 Subject: [Python-checkins] =?utf8?q?cpython=3A_Make_lzma_docs_consistent_w?= =?utf8?q?ith_other_compression_modules_=28cf=2E_changeset?= Message-ID: http://hg.python.org/cpython/rev/0fbc75593f0b changeset: 74794:0fbc75593f0b user: Nadeem Vawda date: Sun Feb 05 15:07:43 2012 +0200 summary: Make lzma docs consistent with other compression modules (cf. changeset 11bd2d32b4e8). files: Doc/library/lzma.rst | 3 --- 1 files changed, 0 insertions(+), 3 deletions(-) diff --git a/Doc/library/lzma.rst b/Doc/library/lzma.rst --- a/Doc/library/lzma.rst +++ b/Doc/library/lzma.rst @@ -14,9 +14,6 @@ interface supporting the ``.xz`` and legacy ``.lzma`` file formats used by the :program:`xz` utility, as well as raw compressed streams. -For related file formats, see the :mod:`bz2`, :mod:`gzip`, :mod:`zipfile`, and -:mod:`tarfile` modules. - 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 -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Feb 5 15:16:00 2012 From: python-checkins at python.org (charles-francois.natali) Date: Sun, 05 Feb 2012 15:16:00 +0100 Subject: [Python-checkins] =?utf8?q?cpython=3A_Issue_=2313734=3A_Add_os=2E?= =?utf8?q?fwalk=28=29=2C_a_directory_walking_function_yielding_file?= Message-ID: http://hg.python.org/cpython/rev/773a97b3927d changeset: 74795:773a97b3927d user: Charles-Fran?ois Natali date: Sun Feb 05 15:15:38 2012 +0100 summary: Issue #13734: Add os.fwalk(), a directory walking function yielding file descriptors. files: Doc/library/os.rst | 51 +++++++++++++++ Doc/whatsnew/3.3.rst | 4 + Lib/os.py | 101 +++++++++++++++++++++++++++++- Lib/test/test_os.py | 60 +++++++++++++++++- Misc/NEWS | 3 + 5 files changed, 212 insertions(+), 7 deletions(-) diff --git a/Doc/library/os.rst b/Doc/library/os.rst --- a/Doc/library/os.rst +++ b/Doc/library/os.rst @@ -2251,6 +2251,57 @@ os.rmdir(os.path.join(root, name)) +.. function:: fwalk(top, topdown=True, onerror=None, followlinks=False) + + .. index:: + single: directory; walking + single: directory; traversal + + This behaves exactly like :func:`walk`, except that it yields a 4-tuple + ``(dirpath, dirnames, filenames, dirfd)``. + + *dirpath*, *dirnames* and *filenames* are identical to :func:`walk` output, + and *dirfd* is a file descriptor referring to the directory *dirpath*. + + .. 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.fstatat(rootfd, name).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:`unlinkat` 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.unlinkat(rootfd, name) + for name in dirs: + os.unlinkat(rootfd, name, os.AT_REMOVEDIR) + + Availability: Unix. + + .. versionadded:: 3.3 + + .. _os-process: Process Management diff --git a/Doc/whatsnew/3.3.rst b/Doc/whatsnew/3.3.rst --- a/Doc/whatsnew/3.3.rst +++ b/Doc/whatsnew/3.3.rst @@ -497,6 +497,10 @@ (Patch submitted by Giampaolo Rodol? in :issue:`10784`.) +* 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. + * "at" functions (:issue:`4761`): * :func:`~os.faccessat` diff --git a/Lib/os.py b/Lib/os.py --- a/Lib/os.py +++ b/Lib/os.py @@ -24,6 +24,7 @@ #' import sys, errno +import stat as st _names = sys.builtin_module_names @@ -32,6 +33,9 @@ "defpath", "name", "path", "devnull", "SEEK_SET", "SEEK_CUR", "SEEK_END"] +def _exists(name): + return name in globals() + def _get_exports_list(module): try: return list(module.__all__) @@ -120,7 +124,12 @@ umask(mask) return mode & ~mask -#' +def _are_same_file(stat1, stat2): + """Helper function that checks whether two stat results refer to the same + file. + """ + return (stat1.st_ino == stat2.st_ino and stat1.st_dev == stat2.st_dev) +# # Super directory utilities. # (Inspired by Eric Raymond; the doc strings are mostly his) @@ -151,7 +160,6 @@ try: mkdir(name, mode) except OSError as e: - import stat as st if not (e.errno == errno.EEXIST and exist_ok and path.isdir(name) and st.S_IMODE(lstat(name).st_mode) == _get_masked_mode(mode)): raise @@ -298,6 +306,92 @@ __all__.append("walk") +if _exists("openat"): + + def fwalk(top, topdown=True, onerror=None, followlinks=False): + """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 walkfd() over walk() is that it's safe against symlink + races (when followlinks is False). + + 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.fstatat(rootfd, name).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 = lstat(top) + topfd = open(top, O_RDONLY) + try: + if (followlinks or (st.S_ISDIR(orig_st.st_mode) and + _are_same_file(orig_st, fstat(topfd)))): + for x in _fwalk(topfd, top, topdown, onerror, followlinks): + yield x + finally: + close(topfd) + + def _fwalk(topfd, toppath, topdown, onerror, followlinks): + # 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. + + # whether to follow symlinks + flag = 0 if followlinks else AT_SYMLINK_NOFOLLOW + + names = fdlistdir(topfd) + dirs, nondirs = [], [] + for name in names: + # 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(fstatat(topfd, name).st_mode): + dirs.append(name) + else: + nondirs.append(name) + + if topdown: + yield toppath, dirs, nondirs, topfd + + for name in dirs: + try: + orig_st = fstatat(topfd, name, flag) + dirfd = openat(topfd, name, O_RDONLY) + except error as err: + if onerror is not None: + onerror(err) + return + try: + if followlinks or _are_same_file(orig_st, fstat(dirfd)): + dirpath = path.join(toppath, name) + for x in _fwalk(dirfd, dirpath, topdown, onerror, followlinks): + yield x + finally: + close(dirfd) + + if not topdown: + yield toppath, dirs, nondirs, topfd + + __all__.append("fwalk") + # Make sure os.environ exists, at least try: environ @@ -598,9 +692,6 @@ 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"): diff --git a/Lib/test/test_os.py b/Lib/test/test_os.py --- a/Lib/test/test_os.py +++ b/Lib/test/test_os.py @@ -20,6 +20,8 @@ import asyncore import asynchat import socket +import itertools +import stat try: import threading except ImportError: @@ -159,7 +161,6 @@ if not hasattr(os, "stat"): return - import stat result = os.stat(fname) # Make sure direct access works @@ -476,7 +477,7 @@ class WalkTests(unittest.TestCase): """Tests for os.walk().""" - def test_traversal(self): + def setUp(self): import os from os.path import join @@ -586,6 +587,60 @@ os.remove(dirname) os.rmdir(support.TESTFN) + + at unittest.skipUnless(hasattr(os, 'fwalk'), "Test needs os.fwalk()") +class FwalkTests(WalkTests): + """Tests for os.fwalk().""" + + def test_compare_to_walk(self): + # compare with walk() results + for topdown, followlinks in itertools.product((True, False), repeat=2): + args = support.TESTFN, topdown, None, followlinks + expected = {} + for root, dirs, files in os.walk(*args): + expected[root] = (set(dirs), set(files)) + + for root, dirs, files, rootfd in os.fwalk(*args): + self.assertIn(root, expected) + self.assertEqual(expected[root], (set(dirs), set(files))) + + def test_dir_fd(self): + # check returned file descriptors + for topdown, followlinks in itertools.product((True, False), repeat=2): + args = support.TESTFN, topdown, None, followlinks + for root, dirs, files, rootfd in os.fwalk(*args): + # check that the FD is valid + os.fstat(rootfd) + # check that fdlistdir() returns consistent information + self.assertEqual(set(os.fdlistdir(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.unlinkat(rootfd, name) + for name in dirs: + st = os.fstatat(rootfd, name, os.AT_SYMLINK_NOFOLLOW) + if stat.S_ISDIR(st.st_mode): + os.unlinkat(rootfd, name, os.AT_REMOVEDIR) + else: + os.unlinkat(rootfd, name) + os.rmdir(support.TESTFN) + + class MakedirTests(unittest.TestCase): def setUp(self): os.mkdir(support.TESTFN) @@ -1700,6 +1755,7 @@ StatAttributeTests, EnvironTests, WalkTests, + FwalkTests, MakedirTests, DevNullTests, URandomTests, diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -466,6 +466,9 @@ Library ------- +- Issue #13734: Add os.fwalk(), a directory walking function yielding file + descriptors. + - Issue #2945: Make the distutils upload command aware of bdist_rpm products. - Issue #13712: pysetup create should not convert package_data to extra_files. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Feb 5 19:56:15 2012 From: python-checkins at python.org (georg.brandl) Date: Sun, 05 Feb 2012 19:56:15 +0100 Subject: [Python-checkins] =?utf8?q?peps=3A_Update_with_bugfix_releases=2E?= Message-ID: http://hg.python.org/peps/rev/e03c759b1ff8 changeset: 4036:e03c759b1ff8 user: Georg Brandl date: Sun Feb 05 19:56:15 2012 +0100 summary: Update with bugfix releases. files: pep-0392.txt | 9 +++++++++ 1 files changed, 9 insertions(+), 0 deletions(-) diff --git a/pep-0392.txt b/pep-0392.txt --- a/pep-0392.txt +++ b/pep-0392.txt @@ -64,6 +64,15 @@ No large-scale changes have been recorded yet. +Bugfix Releases +=============== + +- 3.2.1: released July 10, 2011 +- 3.2.2: released September 4, 2011 + +- 3.2.3: planned February 10-17, 2012 + + References ========== -- Repository URL: http://hg.python.org/peps From python-checkins at python.org Sun Feb 5 20:33:24 2012 From: python-checkins at python.org (terry.reedy) Date: Sun, 05 Feb 2012 20:33:24 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=282=2E7=29=3A_=2313933_refine?= =?utf8?q?_patch_using_=27new=27_builtin?= Message-ID: http://hg.python.org/cpython/rev/2b93ee675ec4 changeset: 74796:2b93ee675ec4 branch: 2.7 parent: 74783:ad20324229f4 user: Terry Jan Reedy date: Sun Feb 05 14:30:43 2012 -0500 summary: #13933 refine patch using 'new' builtin files: Lib/idlelib/AutoComplete.py | 6 ++---- 1 files changed, 2 insertions(+), 4 deletions(-) diff --git a/Lib/idlelib/AutoComplete.py b/Lib/idlelib/AutoComplete.py --- a/Lib/idlelib/AutoComplete.py +++ b/Lib/idlelib/AutoComplete.py @@ -190,8 +190,7 @@ bigl = eval("dir()", namespace) bigl.sort() if "__all__" in bigl: - smalll = list(eval("__all__", namespace)) - smalll.sort() + smalll = sorted(eval("__all__", namespace)) else: smalll = [s for s in bigl if s[:1] != '_'] else: @@ -200,8 +199,7 @@ bigl = dir(entity) bigl.sort() if "__all__" in bigl: - smalll = list(entity.__all__) - smalll.sort() + smalll = sorted(entity.__all__) else: smalll = [s for s in bigl if s[:1] != '_'] except: -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Feb 5 20:33:25 2012 From: python-checkins at python.org (terry.reedy) Date: Sun, 05 Feb 2012 20:33:25 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=283=2E2=29=3A_=2313933_refine?= =?utf8?q?_patch_using_=27new=27_builtin?= Message-ID: http://hg.python.org/cpython/rev/d8f988b0c959 changeset: 74797:d8f988b0c959 branch: 3.2 parent: 74792:4017f305d689 user: Terry Jan Reedy date: Sun Feb 05 14:31:16 2012 -0500 summary: #13933 refine patch using 'new' builtin files: Lib/idlelib/AutoComplete.py | 6 ++---- 1 files changed, 2 insertions(+), 4 deletions(-) diff --git a/Lib/idlelib/AutoComplete.py b/Lib/idlelib/AutoComplete.py --- a/Lib/idlelib/AutoComplete.py +++ b/Lib/idlelib/AutoComplete.py @@ -190,8 +190,7 @@ bigl = eval("dir()", namespace) bigl.sort() if "__all__" in bigl: - smalll = list(eval("__all__", namespace)) - smalll.sort() + smalll = sorted(eval("__all__", namespace)) else: smalll = [s for s in bigl if s[:1] != '_'] else: @@ -200,8 +199,7 @@ bigl = dir(entity) bigl.sort() if "__all__" in bigl: - smalll = list(entity.__all__) - smalll.sort() + smalll = sorted(entity.__all__) else: smalll = [s for s in bigl if s[:1] != '_'] except: -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Feb 5 20:33:26 2012 From: python-checkins at python.org (terry.reedy) Date: Sun, 05 Feb 2012 20:33:26 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_3=2E2_-=3E_default=29?= =?utf8?q?=3A_Merge_with_3=2E2?= Message-ID: http://hg.python.org/cpython/rev/60beb14636b7 changeset: 74798:60beb14636b7 parent: 74795:773a97b3927d parent: 74797:d8f988b0c959 user: Terry Jan Reedy date: Sun Feb 05 14:32:37 2012 -0500 summary: Merge with 3.2 #13933 refine patch using 'new' builtin files: Lib/idlelib/AutoComplete.py | 6 ++---- 1 files changed, 2 insertions(+), 4 deletions(-) diff --git a/Lib/idlelib/AutoComplete.py b/Lib/idlelib/AutoComplete.py --- a/Lib/idlelib/AutoComplete.py +++ b/Lib/idlelib/AutoComplete.py @@ -190,8 +190,7 @@ bigl = eval("dir()", namespace) bigl.sort() if "__all__" in bigl: - smalll = list(eval("__all__", namespace)) - smalll.sort() + smalll = sorted(eval("__all__", namespace)) else: smalll = [s for s in bigl if s[:1] != '_'] else: @@ -200,8 +199,7 @@ bigl = dir(entity) bigl.sort() if "__all__" in bigl: - smalll = list(entity.__all__) - smalll.sort() + smalll = sorted(entity.__all__) else: smalll = [s for s in bigl if s[:1] != '_'] except: -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Feb 5 21:25:57 2012 From: python-checkins at python.org (terry.reedy) Date: Sun, 05 Feb 2012 21:25:57 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=282=2E7=29=3A_Issue_964437_Ma?= =?utf8?q?ke_IDLE_help_window_non-modal=2E?= Message-ID: http://hg.python.org/cpython/rev/5452c881bd2d changeset: 74799:5452c881bd2d branch: 2.7 parent: 74796:2b93ee675ec4 user: Terry Jan Reedy date: Sun Feb 05 15:10:55 2012 -0500 summary: Issue 964437 Make IDLE help window non-modal. Patch by Guilherme Polo and Roger Serwy. files: Lib/idlelib/EditorWindow.py | 51 ++++++++++++++++++++++++- Lib/idlelib/textView.py | 24 +++++++---- Misc/NEWS | 3 + 3 files changed, 67 insertions(+), 11 deletions(-) diff --git a/Lib/idlelib/EditorWindow.py b/Lib/idlelib/EditorWindow.py --- a/Lib/idlelib/EditorWindow.py +++ b/Lib/idlelib/EditorWindow.py @@ -65,6 +65,50 @@ descr = filename, None, imp.PY_SOURCE return file, filename, descr + +class HelpDialog(object): + + def __init__(self): + self.parent = None # parent of help window + self.dlg = None # the help window iteself + + def display(self, parent, near=None): + """ Display the help dialog. + + parent - parent widget for the help window + + near - a Toplevel widget (e.g. EditorWindow or PyShell) + to use as a reference for placing the help window + """ + if self.dlg is None: + self.show_dialog(parent) + if near: + self.nearwindow(near) + + def show_dialog(self, parent): + self.parent = parent + fn=os.path.join(os.path.abspath(os.path.dirname(__file__)),'help.txt') + self.dlg = dlg = textView.view_file(parent,'Help',fn, modal=False) + dlg.bind('', self.destroy, '+') + + def nearwindow(self, near): + # Place the help dialog near the window specified by parent. + # Note - this may not reposition the window in Metacity + # if "/apps/metacity/general/disable_workarounds" is enabled + dlg = self.dlg + geom = (near.winfo_rootx() + 10, near.winfo_rooty() + 10) + dlg.withdraw() + dlg.geometry("=+%d+%d" % geom) + dlg.deiconify() + dlg.lift() + + def destroy(self, ev=None): + self.dlg = None + self.parent = None + +helpDialog = HelpDialog() # singleton instance + + class EditorWindow(object): from idlelib.Percolator import Percolator from idlelib.ColorDelegator import ColorDelegator @@ -459,8 +503,11 @@ configDialog.ConfigDialog(self.top,'Settings') def help_dialog(self, event=None): - fn=os.path.join(os.path.abspath(os.path.dirname(__file__)),'help.txt') - textView.view_file(self.top,'Help',fn) + if self.root: + parent = self.root + else: + parent = self.top + helpDialog.display(parent, near=self.top) def python_docs(self, event=None): if sys.platform[:3] == 'win': diff --git a/Lib/idlelib/textView.py b/Lib/idlelib/textView.py --- a/Lib/idlelib/textView.py +++ b/Lib/idlelib/textView.py @@ -9,7 +9,7 @@ """A simple text viewer dialog for IDLE """ - def __init__(self, parent, title, text): + def __init__(self, parent, title, text, modal=True): """Show the given text in a scrollable window with a 'close' button """ @@ -24,8 +24,6 @@ self.CreateWidgets() self.title(title) - self.transient(parent) - self.grab_set() self.protocol("WM_DELETE_WINDOW", self.Ok) self.parent = parent self.textView.focus_set() @@ -34,7 +32,11 @@ self.bind('',self.Ok) #dismiss dialog self.textView.insert(0.0, text) self.textView.config(state=DISABLED) - self.wait_window() + + if modal: + self.transient(parent) + self.grab_set() + self.wait_window() def CreateWidgets(self): frameText = Frame(self, relief=SUNKEN, height=700) @@ -57,10 +59,10 @@ self.destroy() -def view_text(parent, title, text): - TextViewer(parent, title, text) +def view_text(parent, title, text, modal=True): + return TextViewer(parent, title, text, modal) -def view_file(parent, title, filename, encoding=None): +def view_file(parent, title, filename, encoding=None, modal=True): try: if encoding: import codecs @@ -73,7 +75,7 @@ message='Unable to load file %r .' % filename, parent=parent) else: - return view_text(parent, title, textFile.read()) + return view_text(parent, title, textFile.read(), modal) if __name__ == '__main__': @@ -83,11 +85,15 @@ filename = './textView.py' text = file(filename, 'r').read() btn1 = Button(root, text='view_text', - command=lambda:view_text(root, 'view_text', text)) + command=lambda:view_text(root, 'view_text', text)) btn1.pack(side=LEFT) btn2 = Button(root, text='view_file', command=lambda:view_file(root, 'view_file', filename)) btn2.pack(side=LEFT) + btn3 = Button(root, text='nonmodal view_text', + command=lambda:view_text(root, 'nonmodal view_text', text, + modal=False)) + btn3.pack(side=LEFT) close = Button(root, text='Close', command=root.destroy) close.pack(side=RIGHT) root.mainloop() diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -90,6 +90,9 @@ Library ------- +- Issue #964437 Make IDLE help window non-modal. + Patch by Guilherme Polo and Roger Serwy. + - Issue #13933: IDLE auto-complete did not work with some imported module, like hashlib. (Patch by Roger Serwy) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Feb 5 21:25:58 2012 From: python-checkins at python.org (terry.reedy) Date: Sun, 05 Feb 2012 21:25:58 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=283=2E2=29=3A_Issue_964437_Ma?= =?utf8?q?ke_IDLE_help_window_non-modal=2E?= Message-ID: http://hg.python.org/cpython/rev/a949956a80cc changeset: 74800:a949956a80cc branch: 3.2 parent: 74797:d8f988b0c959 user: Terry Jan Reedy date: Sun Feb 05 15:14:20 2012 -0500 summary: Issue 964437 Make IDLE help window non-modal. Patch by Guilherme Polo and Roger Serwy. files: Lib/idlelib/EditorWindow.py | 51 ++++++++++++++++++++++++- Lib/idlelib/textView.py | 24 +++++++---- Misc/NEWS | 3 + 3 files changed, 67 insertions(+), 11 deletions(-) diff --git a/Lib/idlelib/EditorWindow.py b/Lib/idlelib/EditorWindow.py --- a/Lib/idlelib/EditorWindow.py +++ b/Lib/idlelib/EditorWindow.py @@ -63,6 +63,50 @@ descr = os.path.splitext(filename)[1], None, imp.PY_SOURCE return file, filename, descr + +class HelpDialog(object): + + def __init__(self): + self.parent = None # parent of help window + self.dlg = None # the help window iteself + + def display(self, parent, near=None): + """ Display the help dialog. + + parent - parent widget for the help window + + near - a Toplevel widget (e.g. EditorWindow or PyShell) + to use as a reference for placing the help window + """ + if self.dlg is None: + self.show_dialog(parent) + if near: + self.nearwindow(near) + + def show_dialog(self, parent): + self.parent = parent + fn=os.path.join(os.path.abspath(os.path.dirname(__file__)),'help.txt') + self.dlg = dlg = textView.view_file(parent,'Help',fn, modal=False) + dlg.bind('', self.destroy, '+') + + def nearwindow(self, near): + # Place the help dialog near the window specified by parent. + # Note - this may not reposition the window in Metacity + # if "/apps/metacity/general/disable_workarounds" is enabled + dlg = self.dlg + geom = (near.winfo_rootx() + 10, near.winfo_rooty() + 10) + dlg.withdraw() + dlg.geometry("=+%d+%d" % geom) + dlg.deiconify() + dlg.lift() + + def destroy(self, ev=None): + self.dlg = None + self.parent = None + +helpDialog = HelpDialog() # singleton instance + + class EditorWindow(object): from idlelib.Percolator import Percolator from idlelib.ColorDelegator import ColorDelegator @@ -453,8 +497,11 @@ configDialog.ConfigDialog(self.top,'Settings') def help_dialog(self, event=None): - fn=os.path.join(os.path.abspath(os.path.dirname(__file__)),'help.txt') - textView.view_file(self.top,'Help',fn) + if self.root: + parent = self.root + else: + parent = self.top + helpDialog.display(parent, near=self.top) def python_docs(self, event=None): if sys.platform[:3] == 'win': diff --git a/Lib/idlelib/textView.py b/Lib/idlelib/textView.py --- a/Lib/idlelib/textView.py +++ b/Lib/idlelib/textView.py @@ -9,7 +9,7 @@ """A simple text viewer dialog for IDLE """ - def __init__(self, parent, title, text): + def __init__(self, parent, title, text, modal=True): """Show the given text in a scrollable window with a 'close' button """ @@ -24,8 +24,6 @@ self.CreateWidgets() self.title(title) - self.transient(parent) - self.grab_set() self.protocol("WM_DELETE_WINDOW", self.Ok) self.parent = parent self.textView.focus_set() @@ -34,7 +32,11 @@ self.bind('',self.Ok) #dismiss dialog self.textView.insert(0.0, text) self.textView.config(state=DISABLED) - self.wait_window() + + if modal: + self.transient(parent) + self.grab_set() + self.wait_window() def CreateWidgets(self): frameText = Frame(self, relief=SUNKEN, height=700) @@ -57,10 +59,10 @@ self.destroy() -def view_text(parent, title, text): - TextViewer(parent, title, text) +def view_text(parent, title, text, modal=True): + return TextViewer(parent, title, text, modal) -def view_file(parent, title, filename, encoding=None): +def view_file(parent, title, filename, encoding=None, modal=True): try: with open(filename, 'r', encoding=encoding) as file: contents = file.read() @@ -70,7 +72,7 @@ message='Unable to load file %r .' % filename, parent=parent) else: - return view_text(parent, title, contents) + return view_text(parent, title, contents, modal) if __name__ == '__main__': @@ -80,11 +82,15 @@ filename = './textView.py' text = file(filename, 'r').read() btn1 = Button(root, text='view_text', - command=lambda:view_text(root, 'view_text', text)) + command=lambda:view_text(root, 'view_text', text)) btn1.pack(side=LEFT) btn2 = Button(root, text='view_file', command=lambda:view_file(root, 'view_file', filename)) btn2.pack(side=LEFT) + btn3 = Button(root, text='nonmodal view_text', + command=lambda:view_text(root, 'nonmodal view_text', text, + modal=False)) + btn3.pack(side=LEFT) close = Button(root, text='Close', command=root.destroy) close.pack(side=RIGHT) root.mainloop() diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -113,6 +113,9 @@ Library ------- +- 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 -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Feb 5 21:25:59 2012 From: python-checkins at python.org (terry.reedy) Date: Sun, 05 Feb 2012 21:25:59 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_3=2E2_-=3E_default=29?= =?utf8?q?=3A_Merge_with_3=2E2_=23964437?= Message-ID: http://hg.python.org/cpython/rev/2b841adbae81 changeset: 74801:2b841adbae81 parent: 74798:60beb14636b7 parent: 74800:a949956a80cc user: Terry Jan Reedy date: Sun Feb 05 15:24:39 2012 -0500 summary: Merge with 3.2 #964437 files: Lib/idlelib/EditorWindow.py | 51 ++++++++++++++++++++++++- Lib/idlelib/textView.py | 24 +++++++---- Misc/NEWS | 3 + 3 files changed, 67 insertions(+), 11 deletions(-) diff --git a/Lib/idlelib/EditorWindow.py b/Lib/idlelib/EditorWindow.py --- a/Lib/idlelib/EditorWindow.py +++ b/Lib/idlelib/EditorWindow.py @@ -63,6 +63,50 @@ descr = os.path.splitext(filename)[1], None, imp.PY_SOURCE return file, filename, descr + +class HelpDialog(object): + + def __init__(self): + self.parent = None # parent of help window + self.dlg = None # the help window iteself + + def display(self, parent, near=None): + """ Display the help dialog. + + parent - parent widget for the help window + + near - a Toplevel widget (e.g. EditorWindow or PyShell) + to use as a reference for placing the help window + """ + if self.dlg is None: + self.show_dialog(parent) + if near: + self.nearwindow(near) + + def show_dialog(self, parent): + self.parent = parent + fn=os.path.join(os.path.abspath(os.path.dirname(__file__)),'help.txt') + self.dlg = dlg = textView.view_file(parent,'Help',fn, modal=False) + dlg.bind('', self.destroy, '+') + + def nearwindow(self, near): + # Place the help dialog near the window specified by parent. + # Note - this may not reposition the window in Metacity + # if "/apps/metacity/general/disable_workarounds" is enabled + dlg = self.dlg + geom = (near.winfo_rootx() + 10, near.winfo_rooty() + 10) + dlg.withdraw() + dlg.geometry("=+%d+%d" % geom) + dlg.deiconify() + dlg.lift() + + def destroy(self, ev=None): + self.dlg = None + self.parent = None + +helpDialog = HelpDialog() # singleton instance + + class EditorWindow(object): from idlelib.Percolator import Percolator from idlelib.ColorDelegator import ColorDelegator @@ -453,8 +497,11 @@ configDialog.ConfigDialog(self.top,'Settings') def help_dialog(self, event=None): - fn=os.path.join(os.path.abspath(os.path.dirname(__file__)),'help.txt') - textView.view_file(self.top,'Help',fn) + if self.root: + parent = self.root + else: + parent = self.top + helpDialog.display(parent, near=self.top) def python_docs(self, event=None): if sys.platform[:3] == 'win': diff --git a/Lib/idlelib/textView.py b/Lib/idlelib/textView.py --- a/Lib/idlelib/textView.py +++ b/Lib/idlelib/textView.py @@ -9,7 +9,7 @@ """A simple text viewer dialog for IDLE """ - def __init__(self, parent, title, text): + def __init__(self, parent, title, text, modal=True): """Show the given text in a scrollable window with a 'close' button """ @@ -24,8 +24,6 @@ self.CreateWidgets() self.title(title) - self.transient(parent) - self.grab_set() self.protocol("WM_DELETE_WINDOW", self.Ok) self.parent = parent self.textView.focus_set() @@ -34,7 +32,11 @@ self.bind('',self.Ok) #dismiss dialog self.textView.insert(0.0, text) self.textView.config(state=DISABLED) - self.wait_window() + + if modal: + self.transient(parent) + self.grab_set() + self.wait_window() def CreateWidgets(self): frameText = Frame(self, relief=SUNKEN, height=700) @@ -57,10 +59,10 @@ self.destroy() -def view_text(parent, title, text): - TextViewer(parent, title, text) +def view_text(parent, title, text, modal=True): + return TextViewer(parent, title, text, modal) -def view_file(parent, title, filename, encoding=None): +def view_file(parent, title, filename, encoding=None, modal=True): try: with open(filename, 'r', encoding=encoding) as file: contents = file.read() @@ -70,7 +72,7 @@ message='Unable to load file %r .' % filename, parent=parent) else: - return view_text(parent, title, contents) + return view_text(parent, title, contents, modal) if __name__ == '__main__': @@ -80,11 +82,15 @@ filename = './textView.py' text = file(filename, 'r').read() btn1 = Button(root, text='view_text', - command=lambda:view_text(root, 'view_text', text)) + command=lambda:view_text(root, 'view_text', text)) btn1.pack(side=LEFT) btn2 = Button(root, text='view_file', command=lambda:view_file(root, 'view_file', filename)) btn2.pack(side=LEFT) + btn3 = Button(root, text='nonmodal view_text', + command=lambda:view_text(root, 'nonmodal view_text', text, + modal=False)) + btn3.pack(side=LEFT) close = Button(root, text='Close', command=root.destroy) close.pack(side=RIGHT) root.mainloop() diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -466,6 +466,9 @@ Library ------- +- Issue #964437 Make IDLE help window non-modal. + Patch by Guilherme Polo and Roger Serwy. + - Issue #13734: Add os.fwalk(), a directory walking function yielding file descriptors. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Feb 5 23:54:42 2012 From: python-checkins at python.org (barry.warsaw) Date: Sun, 05 Feb 2012 23:54:42 +0100 Subject: [Python-checkins] =?utf8?q?peps=3A_Add_release_dates_for_all_of_t?= =?utf8?q?he_2=2E6_series=2E?= Message-ID: http://hg.python.org/peps/rev/b62b25799cdf changeset: 4037:b62b25799cdf user: Barry Warsaw date: Sun Feb 05 17:54:37 2012 -0500 summary: Add release dates for all of the 2.6 series. files: pep-0361.txt | 10 +++++++--- 1 files changed, 7 insertions(+), 3 deletions(-) diff --git a/pep-0361.txt b/pep-0361.txt --- a/pep-0361.txt +++ b/pep-0361.txt @@ -63,9 +63,13 @@ Nov 06 2008: Python 3.0rc2 released Nov 21 2008: Python 3.0rc3 released Dec 03 2008: Python 3.0 final released - Dec 04 2008: Python 2.6.1 final release - Apr 14 2009: Python 2.6.2 final release - Oct 02 2009: Python 2.6.3 final release + Dec 04 2008: Python 2.6.1 final released + Apr 14 2009: Python 2.6.2 final released + Oct 02 2009: Python 2.6.3 final released + Oct 25 2009: Python 2.6.4 final released + Mar 19 2010: Python 2.6.5 final released + Aug 24 2010: Python 2.6.6 final released + Jun 03 2011: Python 2.6.7 final released (security-only) See the public `Google calendar`_ -- Repository URL: http://hg.python.org/peps From python-checkins at python.org Sun Feb 5 23:56:17 2012 From: python-checkins at python.org (barry.warsaw) Date: Sun, 05 Feb 2012 23:56:17 +0100 Subject: [Python-checkins] =?utf8?q?peps=3A_planning_for_2=2E6=2E8?= Message-ID: http://hg.python.org/peps/rev/1cf4bcfb741a changeset: 4038:1cf4bcfb741a user: Barry Warsaw date: Sun Feb 05 17:56:12 2012 -0500 summary: planning for 2.6.8 files: pep-0361.txt | 2 ++ 1 files changed, 2 insertions(+), 0 deletions(-) diff --git a/pep-0361.txt b/pep-0361.txt --- a/pep-0361.txt +++ b/pep-0361.txt @@ -71,6 +71,8 @@ Aug 24 2010: Python 2.6.6 final released Jun 03 2011: Python 2.6.7 final released (security-only) + Python 2.6.8 (security-only) planned for Feb 10-17 2012 + See the public `Google calendar`_ -- Repository URL: http://hg.python.org/peps From python-checkins at python.org Mon Feb 6 01:00:44 2012 From: python-checkins at python.org (ned.deily) Date: Mon, 06 Feb 2012 01:00:44 +0100 Subject: [Python-checkins] =?utf8?b?Y3B5dGhvbiAoMi43KTogSXNzdWUgIzEwODgx?= =?utf8?q?=3A_Fix_test=5Fsite_failures_with_OS_X_framework_builds=2E?= Message-ID: http://hg.python.org/cpython/rev/82c4f094f811 changeset: 74802:82c4f094f811 branch: 2.7 parent: 74799:5452c881bd2d user: Ned Deily date: Mon Feb 06 00:55:50 2012 +0100 summary: Issue #10881: Fix test_site failures with OS X framework builds. files: Lib/site.py | 2 +- Lib/sysconfig.py | 5 +++-- Lib/test/test_site.py | 26 +++++++++++++------------- Misc/NEWS | 2 ++ 4 files changed, 19 insertions(+), 16 deletions(-) diff --git a/Lib/site.py b/Lib/site.py --- a/Lib/site.py +++ b/Lib/site.py @@ -312,7 +312,7 @@ # locations. from sysconfig import get_config_var framework = get_config_var("PYTHONFRAMEWORK") - if framework and "/%s.framework/"%(framework,) in prefix: + if framework: sitepackages.append( os.path.join("/Library", framework, sys.version[:3], "site-packages")) diff --git a/Lib/sysconfig.py b/Lib/sysconfig.py --- a/Lib/sysconfig.py +++ b/Lib/sysconfig.py @@ -176,8 +176,9 @@ if sys.platform == "darwin": framework = get_config_var("PYTHONFRAMEWORK") if framework: - return joinuser("~", "Library", framework, "%d.%d"%( - sys.version_info[:2])) + return env_base if env_base else \ + joinuser("~", "Library", framework, "%d.%d" + % (sys.version_info[:2])) return env_base if env_base else joinuser("~", ".local") diff --git a/Lib/test/test_site.py b/Lib/test/test_site.py --- a/Lib/test/test_site.py +++ b/Lib/test/test_site.py @@ -228,7 +228,19 @@ self.assertEqual(len(dirs), 1) wanted = os.path.join('xoxo', 'Lib', 'site-packages') self.assertEqual(dirs[0], wanted) + elif (sys.platform == "darwin" and + sysconfig.get_config_var("PYTHONFRAMEWORK")): + # OS X framework builds + site.PREFIXES = ['Python.framework'] + dirs = site.getsitepackages() + self.assertEqual(len(dirs), 3) + wanted = os.path.join('/Library', + sysconfig.get_config_var("PYTHONFRAMEWORK"), + sys.version[:3], + 'site-packages') + self.assertEqual(dirs[2], wanted) elif os.sep == '/': + # OS X non-framwework builds, Linux, FreeBSD, etc self.assertEqual(len(dirs), 2) wanted = os.path.join('xoxo', 'lib', 'python' + sys.version[:3], 'site-packages') @@ -236,24 +248,12 @@ wanted = os.path.join('xoxo', 'lib', 'site-python') self.assertEqual(dirs[1], wanted) else: + # other platforms self.assertEqual(len(dirs), 2) self.assertEqual(dirs[0], 'xoxo') wanted = os.path.join('xoxo', 'lib', 'site-packages') self.assertEqual(dirs[1], wanted) - # let's try the specific Apple location - if (sys.platform == "darwin" and - sysconfig.get_config_var("PYTHONFRAMEWORK")): - site.PREFIXES = ['Python.framework'] - dirs = site.getsitepackages() - self.assertEqual(len(dirs), 4) - wanted = os.path.join('~', 'Library', 'Python', - sys.version[:3], 'site-packages') - self.assertEqual(dirs[2], os.path.expanduser(wanted)) - wanted = os.path.join('/Library', 'Python', sys.version[:3], - 'site-packages') - self.assertEqual(dirs[3], wanted) - class PthFile(object): """Helper class for handling testing of .pth files""" diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -90,6 +90,8 @@ Library ------- +- Issue #10881: Fix test_site failures with OS X framework builds. + - Issue #964437 Make IDLE help window non-modal. Patch by Guilherme Polo and Roger Serwy. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Feb 6 01:00:44 2012 From: python-checkins at python.org (ned.deily) Date: Mon, 06 Feb 2012 01:00:44 +0100 Subject: [Python-checkins] =?utf8?b?Y3B5dGhvbiAoMy4yKTogSXNzdWUgIzEwODgx?= =?utf8?q?=3A_Fix_test=5Fsite_failure_with_OS_X_framework_builds=2E?= Message-ID: http://hg.python.org/cpython/rev/013cba2eb008 changeset: 74803:013cba2eb008 branch: 3.2 parent: 74800:a949956a80cc user: Ned Deily date: Mon Feb 06 00:58:18 2012 +0100 summary: Issue #10881: Fix test_site failure with OS X framework builds. files: Lib/test/test_site.py | 23 +++++++++++++---------- Misc/NEWS | 2 ++ 2 files changed, 15 insertions(+), 10 deletions(-) diff --git a/Lib/test/test_site.py b/Lib/test/test_site.py --- a/Lib/test/test_site.py +++ b/Lib/test/test_site.py @@ -223,7 +223,19 @@ self.assertEqual(len(dirs), 1) wanted = os.path.join('xoxo', 'Lib', 'site-packages') self.assertEqual(dirs[0], wanted) + elif (sys.platform == "darwin" and + sysconfig.get_config_var("PYTHONFRAMEWORK")): + # OS X framework builds + site.PREFIXES = ['Python.framework'] + dirs = site.getsitepackages() + self.assertEqual(len(dirs), 3) + wanted = os.path.join('/Library', + sysconfig.get_config_var("PYTHONFRAMEWORK"), + sys.version[:3], + 'site-packages') + self.assertEqual(dirs[2], wanted) elif os.sep == '/': + # OS X non-framwework builds, Linux, FreeBSD, etc self.assertEqual(len(dirs), 2) wanted = os.path.join('xoxo', 'lib', 'python' + sys.version[:3], 'site-packages') @@ -231,21 +243,12 @@ wanted = os.path.join('xoxo', 'lib', 'site-python') self.assertEqual(dirs[1], wanted) else: + # other platforms self.assertEqual(len(dirs), 2) self.assertEqual(dirs[0], 'xoxo') wanted = os.path.join('xoxo', 'lib', 'site-packages') self.assertEqual(dirs[1], wanted) - # let's try the specific Apple location - if (sys.platform == "darwin" and - sysconfig.get_config_var("PYTHONFRAMEWORK")): - site.PREFIXES = ['Python.framework'] - dirs = site.getsitepackages() - self.assertEqual(len(dirs), 3) - wanted = os.path.join('/Library', 'Python', sys.version[:3], - 'site-packages') - self.assertEqual(dirs[2], wanted) - class PthFile(object): """Helper class for handling testing of .pth files""" diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -113,6 +113,8 @@ Library ------- +- 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. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Feb 6 01:00:45 2012 From: python-checkins at python.org (ned.deily) Date: Mon, 06 Feb 2012 01:00:45 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_3=2E2_-=3E_default=29?= =?utf8?q?=3A_Issue_=2310881=3A_merge?= Message-ID: http://hg.python.org/cpython/rev/c88606bd5287 changeset: 74804:c88606bd5287 parent: 74801:2b841adbae81 parent: 74803:013cba2eb008 user: Ned Deily date: Mon Feb 06 01:00:05 2012 +0100 summary: Issue #10881: merge files: Lib/test/test_site.py | 23 +++++++++++++---------- Misc/NEWS | 2 ++ 2 files changed, 15 insertions(+), 10 deletions(-) diff --git a/Lib/test/test_site.py b/Lib/test/test_site.py --- a/Lib/test/test_site.py +++ b/Lib/test/test_site.py @@ -223,7 +223,19 @@ self.assertEqual(len(dirs), 1) wanted = os.path.join('xoxo', 'Lib', 'site-packages') self.assertEqual(dirs[0], wanted) + elif (sys.platform == "darwin" and + sysconfig.get_config_var("PYTHONFRAMEWORK")): + # OS X framework builds + site.PREFIXES = ['Python.framework'] + dirs = site.getsitepackages() + self.assertEqual(len(dirs), 3) + wanted = os.path.join('/Library', + sysconfig.get_config_var("PYTHONFRAMEWORK"), + sys.version[:3], + 'site-packages') + self.assertEqual(dirs[2], wanted) elif os.sep == '/': + # OS X non-framwework builds, Linux, FreeBSD, etc self.assertEqual(len(dirs), 2) wanted = os.path.join('xoxo', 'lib', 'python' + sys.version[:3], 'site-packages') @@ -231,21 +243,12 @@ wanted = os.path.join('xoxo', 'lib', 'site-python') self.assertEqual(dirs[1], wanted) else: + # other platforms self.assertEqual(len(dirs), 2) self.assertEqual(dirs[0], 'xoxo') wanted = os.path.join('xoxo', 'lib', 'site-packages') self.assertEqual(dirs[1], wanted) - # let's try the specific Apple location - if (sys.platform == "darwin" and - sysconfig.get_config_var("PYTHONFRAMEWORK")): - site.PREFIXES = ['Python.framework'] - dirs = site.getsitepackages() - self.assertEqual(len(dirs), 3) - wanted = os.path.join('/Library', 'Python', sys.version[:3], - 'site-packages') - self.assertEqual(dirs[2], wanted) - class PthFile(object): """Helper class for handling testing of .pth files""" diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -466,6 +466,8 @@ Library ------- +- 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. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Feb 6 01:36:17 2012 From: python-checkins at python.org (brett.cannon) Date: Mon, 06 Feb 2012 01:36:17 +0100 Subject: [Python-checkins] =?utf8?q?peps=3A_Latest_update_from_Ethan=2C_ma?= =?utf8?q?rking_PEP_409_as_accepted=2E?= Message-ID: http://hg.python.org/peps/rev/04d6b8630485 changeset: 4039:04d6b8630485 user: Brett Cannon date: Sun Feb 05 19:36:12 2012 -0500 summary: Latest update from Ethan, marking PEP 409 as accepted. files: pep-0409.txt | 89 +++++++++++++++++++++------------------ 1 files changed, 47 insertions(+), 42 deletions(-) diff --git a/pep-0409.txt b/pep-0409.txt --- a/pep-0409.txt +++ b/pep-0409.txt @@ -3,17 +3,18 @@ Version: $Revision$ Last-Modified: $Date$ Author: Ethan Furman -Status: Draft +Status: Accepted Type: Standards Track Content-Type: text/x-rst Created: 26-Jan-2012 Post-History: 30-Aug-2002, 01-Feb-2012, 03-Feb-2012 +Resolution: http://mail.python.org/pipermail/python-dev/2012-February/116136.html Abstract ======== -One of the open issues from PEP 3134 is suppressing context: currently +One of the open issues from PEP 3134 is suppressing context: currently there is no way to do it. This PEP proposes one. @@ -22,14 +23,14 @@ There are two basic ways to generate exceptions: -1. Python does it (buggy code, missing resources, ending loops, etc.) +1) Python does it (buggy code, missing resources, ending loops, etc.) -2. manually (with a raise statement) +2) manually (with a raise statement) When writing libraries, or even just custom classes, it can become necessary to raise exceptions; moreover it can be useful, even -necessary, to change from one exception to another. To take an -example from my dbf module:: +necessary, to change from one exception to another. To take an example +from my dbf module:: try: value = int(value) @@ -74,58 +75,55 @@ raise NewException from None -It has the advantage of using the existing pattern of explicitly -setting the cause:: +It has the advantage of using the existing pattern of explicitly setting +the cause:: raise KeyError() from NameError() -but because the cause is ``None`` the previous context is not -displayed by the default exception printing routines. +but because the cause is ``None`` the previous context is not displayed +by the default exception printing routines. Implementation Discussion ========================= -Currently, ``None`` is the default for both ``__context__`` and -``__cause__``. In order to support ``raise ... from None`` (which -would set ``__cause__`` to ``None``) we need a different default value -for ``__cause__``. Several ideas were put forth on how to implement -this at the language level: +Currently, ``None`` is the default for both ``__context__`` and ``__cause__``. +In order to support ``raise ... from None`` (which would set ``__cause__`` to +``None``) we need a different default value for ``__cause__``. Several ideas +were put forth on how to implement this at the language level: -* Overwrite the previous exception information (side-stepping the - issue and leaving ``__cause__`` at ``None``). +* Overwrite the previous exception information (side-stepping the issue and + leaving ``__cause__`` at ``None``). - Rejected as this can seriously hinder debugging due to `poor error - messages`_. + Rejected as this can seriously hinder debugging due to + `poor error messages`_. -* Use one of the boolean values in ``__cause__``: ``False`` would be - the default value, and would be replaced when ``from ...`` was used - with the explicity chained exception or ``None``. +* Use one of the boolean values in ``__cause__``: ``False`` would be the + default value, and would be replaced when ``from ...`` was used with the + explicity chained exception or ``None``. - Rejected as this encourages the use of two different objects types - for ``__cause__`` with one of them (boolean) not allowed to have the - full range of possible values (``True`` would never be used). + Rejected as this encourages the use of two different objects types for + ``__cause__`` with one of them (boolean) not allowed to have the full range + of possible values (``True`` would never be used). * Create a special exception class, ``__NoException__``. - Rejected as possibly confusing, possibly being mistakenly raised by - users, and not being a truly unique value as ``None``, ``True``, and - ``False`` are. + Rejected as possibly confusing, possibly being mistakenly raised by users, + and not being a truly unique value as ``None``, ``True``, and ``False`` are. * Use ``Ellipsis`` as the default value (the ``...`` singleton). - Accepted. There are no other possible values; it cannot be raised - as it is not an exception; it has the connotation of 'fill in the - rest...' as in ``__cause__`` is not set, look in ``__context__`` for - it. + Accepted. There are no other possible values; it cannot be raised as it is + not an exception; it has the connotation of 'fill in the rest...' as in + ``__cause__`` is not set, look in ``__context__`` for it. Language Details ================ To support ``from None``, ``__context__`` will stay as it is, but -``__cause__`` will start out as ``Ellipsis`` and will change to -``None`` when the ``raise ... from None`` method is used. +``__cause__`` will start out as ``Ellipsis`` and will change to ``None`` +when the ``raise ... from None`` method is used. ============================================ ================== ======================================= form __context__ __cause__ @@ -137,20 +135,26 @@ The default exception printing routine will then: -* If ``__cause__`` is ``Ellipsis`` the ``__context__`` (if any) will - be printed. - -* If ``__cause__`` is ``None`` the ``__context__`` will not be +* If ``__cause__`` is ``Ellipsis`` the ``__context__`` (if any) will be printed. -* If ``__cause__`` is anything else, ``__cause__`` will be printed. +* If ``__cause__`` is ``None`` the ``__context__`` will not be printed. + +* if ``__cause__`` is anything else, ``__cause__`` will be printed. + +In both of the latter cases the exception chain will stop being followed. + +Because the default value for ``__cause__`` is now ``Ellipsis``:: + + raise Exception from Ellipsis + +is allowed and will (re)set ``__cause__`` to ``Ellipsis``. Patches ======= -There is a patch for CPython implementing this attached to `Issue -6210`_. +There is a patch for CPython implementing this attached to `Issue 6210`_. References @@ -171,7 +175,7 @@ This document has been placed in the public domain. - + .. Local Variables: mode: indented-text @@ -180,3 +184,4 @@ fill-column: 70 coding: utf-8 End: + -- Repository URL: http://hg.python.org/peps From brett at python.org Mon Feb 6 01:39:55 2012 From: brett at python.org (Brett Cannon) Date: Sun, 5 Feb 2012 19:39:55 -0500 Subject: [Python-checkins] cpython (3.2): remove unused import In-Reply-To: References: Message-ID: I'm going to assume pylint or pyflakes would throw too many warnings on the stdlib, but would it be worth someone's time to write a simple unused import checker to run over the stdlib on occasion? I bet even one that did nothing more than a regex search for matched import statements would be good enough. On Fri, Feb 3, 2012 at 19:09, benjamin.peterson wrote: > http://hg.python.org/cpython/rev/9eb5fec8674b > changeset: 74749:9eb5fec8674b > branch: 3.2 > parent: 74746:5eb47e1732a0 > user: Benjamin Peterson > date: Fri Feb 03 19:07:30 2012 -0500 > summary: > remove unused import > > files: > Lib/threading.py | 1 - > 1 files changed, 0 insertions(+), 1 deletions(-) > > > diff --git a/Lib/threading.py b/Lib/threading.py > --- a/Lib/threading.py > +++ b/Lib/threading.py > @@ -5,7 +5,6 @@ > > from time import time as _time, sleep as _sleep > from traceback import format_exc as _format_exc > -from collections import deque > from _weakrefset import WeakSet > > # Note regarding PEP 8 compliant names > > -- > Repository URL: http://hg.python.org/cpython > > _______________________________________________ > Python-checkins mailing list > Python-checkins at python.org > http://mail.python.org/mailman/listinfo/python-checkins > > -------------- next part -------------- An HTML attachment was scrubbed... URL: From solipsis at pitrou.net Mon Feb 6 05:31:54 2012 From: solipsis at pitrou.net (solipsis at pitrou.net) Date: Mon, 06 Feb 2012 05:31:54 +0100 Subject: [Python-checkins] Daily reference leaks (c88606bd5287): sum=0 Message-ID: results for c88606bd5287 on branch "default" -------------------------------------------- Command line was: ['./python', '-m', 'test.regrtest', '-uall', '-R', '3:3:/home/antoine/cpython/refleaks/reflogI2nYKi', '-x'] From python-checkins at python.org Mon Feb 6 16:11:36 2012 From: python-checkins at python.org (eric.araujo) Date: Mon, 06 Feb 2012 16:11:36 +0100 Subject: [Python-checkins] =?utf8?q?distutils2=3A_Fix_typos_in_comments=2E?= Message-ID: http://hg.python.org/distutils2/rev/8a6c9e5ccfe2 changeset: 1275:8a6c9e5ccfe2 parent: 1273:730c2e4aaf9c user: ?ric Araujo date: Mon Feb 06 15:23:55 2012 +0100 summary: Fix typos in comments. Reported by David-Sarah Hopwood on the Bitbucket bug tracker of the former verlib/distutilsversion project. files: distutils2/version.py | 6 +++--- 1 files changed, 3 insertions(+), 3 deletions(-) diff --git a/distutils2/version.py b/distutils2/version.py --- a/distutils2/version.py +++ b/distutils2/version.py @@ -293,12 +293,12 @@ # The 'r' and the '-' tags are post release tags # 0.4a1.r10 -> 0.4a1.post10 - # 0.9.33-17222 -> 0.9.3.post17222 - # 0.9.33-r17222 -> 0.9.3.post17222 + # 0.9.33-17222 -> 0.9.33.post17222 + # 0.9.33-r17222 -> 0.9.33.post17222 rs = re.sub(r"\.?(r|-|-r)\.?(\d+)$", r".post\2", rs) # Clean 'r' instead of 'dev' usage: - # 0.9.33+r17222 -> 0.9.3.dev17222 + # 0.9.33+r17222 -> 0.9.33.dev17222 # 1.0dev123 -> 1.0.dev123 # 1.0.git123 -> 1.0.dev123 # 1.0.bzr123 -> 1.0.dev123 -- Repository URL: http://hg.python.org/distutils2 From python-checkins at python.org Mon Feb 6 16:12:27 2012 From: python-checkins at python.org (eric.araujo) Date: Mon, 06 Feb 2012 16:12:27 +0100 Subject: [Python-checkins] =?utf8?q?cpython=3A_Fix_typos_in_comments=2E?= Message-ID: http://hg.python.org/cpython/rev/edfb5e8afa89 changeset: 74805:edfb5e8afa89 user: ?ric Araujo date: Mon Feb 06 16:12:21 2012 +0100 summary: Fix typos in comments. Reported by David-Sarah Hopwood on the Bitbucket bug tracker of Tarek?s former verlib/distutils.version project. files: Lib/packaging/version.py | 6 +++--- 1 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Lib/packaging/version.py b/Lib/packaging/version.py --- a/Lib/packaging/version.py +++ b/Lib/packaging/version.py @@ -293,12 +293,12 @@ # The 'r' and the '-' tags are post release tags # 0.4a1.r10 -> 0.4a1.post10 - # 0.9.33-17222 -> 0.9.3.post17222 - # 0.9.33-r17222 -> 0.9.3.post17222 + # 0.9.33-17222 -> 0.9.33.post17222 + # 0.9.33-r17222 -> 0.9.33.post17222 rs = re.sub(r"\.?(r|-|-r)\.?(\d+)$", r".post\2", rs) # Clean 'r' instead of 'dev' usage: - # 0.9.33+r17222 -> 0.9.3.dev17222 + # 0.9.33+r17222 -> 0.9.33.dev17222 # 1.0dev123 -> 1.0.dev123 # 1.0.git123 -> 1.0.dev123 # 1.0.bzr123 -> 1.0.dev123 -- Repository URL: http://hg.python.org/cpython From jimjjewett at gmail.com Mon Feb 6 16:58:37 2012 From: jimjjewett at gmail.com (Jim Jewett) Date: Mon, 6 Feb 2012 10:58:37 -0500 Subject: [Python-checkins] cpython: Make BZ2File.__init__()'s fileobj argument keyword-only. In-Reply-To: References: Message-ID: Why is this change being applied to bug-fix releases? Are you saying that it was really keyword-only all along, but not documented well enough? (FWIW, trying it on python 3.2, I don't find a .py file at all, it goes to .pyd, so that it possible.) On Sat, Feb 4, 2012 at 8:17 AM, nadeem.vawda wrote: > http://hg.python.org/cpython/rev/6f7d9455d3bb > changeset: ? 74756:6f7d9455d3bb > user: ? ? ? ?Nadeem Vawda > date: ? ? ? ?Sat Feb 04 13:58:07 2012 +0200 > summary: > ?Make BZ2File.__init__()'s fileobj argument keyword-only. > > files: > ?Doc/library/bz2.rst | ?2 +- > ?Lib/bz2.py ? ? ? ? ?| ?2 +- > ?2 files changed, 2 insertions(+), 2 deletions(-) > > > diff --git a/Doc/library/bz2.rst b/Doc/library/bz2.rst > --- a/Doc/library/bz2.rst > +++ b/Doc/library/bz2.rst > @@ -29,7 +29,7 @@ > ?(De)compression of files > ?------------------------ > > -.. class:: BZ2File(filename=None, mode='r', buffering=None, compresslevel=9, fileobj=None) > +.. class:: BZ2File(filename=None, mode='r', buffering=None, compresslevel=9, \*, fileobj=None) > > ? ?Open a bzip2-compressed file. > > diff --git a/Lib/bz2.py b/Lib/bz2.py > --- a/Lib/bz2.py > +++ b/Lib/bz2.py > @@ -40,7 +40,7 @@ > ? ? """ > > ? ? def __init__(self, filename=None, mode="r", buffering=None, > - ? ? ? ? ? ? ? ? compresslevel=9, fileobj=None): > + ? ? ? ? ? ? ? ? compresslevel=9, *, fileobj=None): > ? ? ? ? """Open a bzip2-compressed file. > > ? ? ? ? If filename is given, open the named file. Otherwise, operate on > > -- > Repository URL: http://hg.python.org/cpython > > _______________________________________________ > Python-checkins mailing list > Python-checkins at python.org > http://mail.python.org/mailman/listinfo/python-checkins > From nadeem.vawda at gmail.com Mon Feb 6 17:22:00 2012 From: nadeem.vawda at gmail.com (Nadeem Vawda) Date: Mon, 6 Feb 2012 18:22:00 +0200 Subject: [Python-checkins] cpython: Make BZ2File.__init__()'s fileobj argument keyword-only. In-Reply-To: References: Message-ID: On Mon, Feb 6, 2012 at 5:58 PM, Jim Jewett wrote: > Why is this change being applied to bug-fix releases? It isn't; this changeset is on the default branch. The fileobj argument was only added recently - it doesn't exist at all in 3.2 and earlier. Cheers, Nadeem From jimjjewett at gmail.com Mon Feb 6 17:28:40 2012 From: jimjjewett at gmail.com (Jim Jewett) Date: Mon, 6 Feb 2012 11:28:40 -0500 Subject: [Python-checkins] Is this safe enough? Re: cpython: _Py_Identifier are always ASCII strings Message-ID: I realize that _Py_Identifier is a private name, and that PEP 3131 requires anything (except test cases) in the standard library to stick with ASCII ... but somehow, that feels like too long of a chain. I would prefer to see _Py_Identifier renamed to _Py_ASCII_Identifier, or at least a comment stating that Identifiers will (per PEP 3131) always be ASCII -- preferably with an assert to back that up. -jJ On Sat, Feb 4, 2012 at 7:46 PM, victor.stinner wrote: > http://hg.python.org/cpython/rev/d2c1521ad0a1 > changeset: ? 74772:d2c1521ad0a1 > user: ? ? ? ?Victor Stinner > date: ? ? ? ?Sun Feb 05 01:45:45 2012 +0100 > summary: > ?_Py_Identifier are always ASCII strings > > files: > ?Objects/unicodeobject.c | ?5 ++--- > ?1 files changed, 2 insertions(+), 3 deletions(-) > > > diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c > --- a/Objects/unicodeobject.c > +++ b/Objects/unicodeobject.c > @@ -1744,9 +1744,8 @@ > ?_PyUnicode_FromId(_Py_Identifier *id) > ?{ > ? ? if (!id->object) { > - ? ? ? ?id->object = PyUnicode_DecodeUTF8Stateful(id->string, > - ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?strlen(id->string), > - ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?NULL, NULL); > + ? ? ? ?id->object = unicode_fromascii((unsigned char*)id->string, > + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? strlen(id->string)); > ? ? ? ? if (!id->object) > ? ? ? ? ? ? return NULL; > ? ? ? ? PyUnicode_InternInPlace(&id->object); > > -- > Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Feb 6 17:30:16 2012 From: python-checkins at python.org (benjamin.peterson) Date: Mon, 06 Feb 2012 17:30:16 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=283=2E2=29=3A_bltinmod_is_bor?= =?utf8?q?rowed=2C_so_it_shouldn=27t_be_decrefed?= Message-ID: http://hg.python.org/cpython/rev/c19be14466e8 changeset: 74806:c19be14466e8 branch: 3.2 parent: 74761:048e38c87883 user: Benjamin Peterson date: Mon Feb 06 11:28:45 2012 -0500 summary: bltinmod is borrowed, so it shouldn't be decrefed files: Objects/exceptions.c | 1 - 1 files changed, 0 insertions(+), 1 deletions(-) diff --git a/Objects/exceptions.c b/Objects/exceptions.c --- a/Objects/exceptions.c +++ b/Objects/exceptions.c @@ -2127,7 +2127,6 @@ } } - Py_DECREF(bltinmod); } void -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Feb 6 17:30:17 2012 From: python-checkins at python.org (benjamin.peterson) Date: Mon, 06 Feb 2012 17:30:17 +0100 Subject: [Python-checkins] =?utf8?b?Y3B5dGhvbiAobWVyZ2UgMy4yIC0+IDMuMik6?= =?utf8?q?_merge_heads?= Message-ID: http://hg.python.org/cpython/rev/2a6813546e41 changeset: 74807:2a6813546e41 branch: 3.2 parent: 74806:c19be14466e8 parent: 74803:013cba2eb008 user: Benjamin Peterson date: Mon Feb 06 11:29:05 2012 -0500 summary: merge heads files: Doc/distutils/apiref.rst | 36 +++------- Doc/extending/embedding.rst | 9 +- Doc/library/archiving.rst | 1 + Doc/library/bz2.rst | 15 +++- Doc/library/gzip.rst | 3 - Doc/library/hmac.rst | 8 +- Doc/library/json.rst | 4 + Doc/library/shutil.rst | 10 ++- Doc/library/tarfile.rst | 3 +- Doc/library/zipfile.rst | 3 - Doc/library/zlib.rst | 4 +- Lib/ctypes/_endian.py | 2 +- Lib/distutils/command/bdist_rpm.py | 12 +++ Lib/distutils/tests/test_bdist_rpm.py | 9 ++ Lib/idlelib/AutoComplete.py | 6 +- Lib/idlelib/EditorWindow.py | 51 ++++++++++++++- Lib/idlelib/textView.py | 24 ++++-- Lib/shutil.py | 1 - Lib/test/test_audioop.py | 31 ++++++-- Lib/test/test_site.py | 23 +++-- Misc/ACKS | 1 + Misc/NEWS | 10 ++ 22 files changed, 182 insertions(+), 84 deletions(-) diff --git a/Doc/distutils/apiref.rst b/Doc/distutils/apiref.rst --- a/Doc/distutils/apiref.rst +++ b/Doc/distutils/apiref.rst @@ -449,7 +449,9 @@ Define a preprocessor macro for all compilations driven by this compiler object. The optional parameter *value* should be a string; if it is not supplied, then the macro will be defined without an explicit value and the exact outcome - depends on the compiler used (XXX true? does ANSI say anything about this?) + depends on the compiler used. + + .. XXX true? does ANSI say anything about this? .. method:: CCompiler.undefine_macro(name) @@ -603,7 +605,9 @@ *output_libname* should be a library name, not a filename; the filename will be inferred from the library name. *output_dir* is the directory where the library - file will be put. XXX defaults to what? + file will be put. + + .. XXX defaults to what? *debug* is a boolean; if true, debugging information will be included in the library (note that on most platforms, it is the compile step where this matters: @@ -723,30 +727,29 @@ Invokes :func:`distutils.util.execute` This method invokes a Python function *func* with the given arguments *args*, after logging and taking into account - the *dry_run* flag. XXX see also. + the *dry_run* flag. .. method:: CCompiler.spawn(cmd) Invokes :func:`distutils.util.spawn`. This invokes an external process to run - the given command. XXX see also. + the given command. .. method:: CCompiler.mkpath(name[, mode=511]) Invokes :func:`distutils.dir_util.mkpath`. This creates a directory and any - missing ancestor directories. XXX see also. + missing ancestor directories. .. method:: CCompiler.move_file(src, dst) - Invokes :meth:`distutils.file_util.move_file`. Renames *src* to *dst*. XXX see - also. + Invokes :meth:`distutils.file_util.move_file`. Renames *src* to *dst*. .. method:: CCompiler.announce(msg[, level=1]) - Write a message using :func:`distutils.log.debug`. XXX see also. + Write a message using :func:`distutils.log.debug`. .. method:: CCompiler.warn(msg) @@ -874,8 +877,6 @@ prefix of all files and directories in the archive. *root_dir* and *base_dir* both default to the current directory. Returns the name of the archive file. - .. XXX This should be changed to support bz2 files. - .. function:: make_tarball(base_name, base_dir[, compress='gzip', verbose=0, dry_run=0]) @@ -887,8 +888,6 @@ possibly plus the appropriate compression extension (:file:`.gz`, :file:`.bz2` or :file:`.Z`). Return the output filename. - .. XXX This should be replaced with calls to the :mod:`tarfile` module. - .. function:: make_zipfile(base_name, base_dir[, verbose=0, dry_run=0]) @@ -1000,8 +999,6 @@ errors are ignored (apart from being reported to ``sys.stdout`` if *verbose* is true). -.. XXX Some of this could be replaced with the shutil module? - :mod:`distutils.file_util` --- Single file operations ===================================================== @@ -1115,8 +1112,6 @@ * ``macosx-10.6-intel`` - .. % XXX isn't this also provided by some other non-distutils module? - .. function:: convert_path(pathname) @@ -1321,8 +1316,6 @@ the "negative alias" of :option:`--verbose`, then :option:`--quiet` on the command line sets *verbose* to false. -.. XXX Should be replaced with optparse - .. function:: fancy_getopt(options, negative_opt, object, args) Wrapper function. *options* is a list of ``(long_option, short_option, @@ -1338,9 +1331,6 @@ Wraps *text* to less than *width* wide. - .. XXX Should be replaced with :mod:`textwrap` (which is available in Python - 2.3 and later). - .. class:: FancyGetopt([option_table=None]) @@ -1403,10 +1393,6 @@ :synopsis: A simple logging mechanism, 282-style -.. XXX Should be replaced with standard :mod:`logging` module. - - - :mod:`distutils.spawn` --- Spawn a sub-process ============================================== diff --git a/Doc/extending/embedding.rst b/Doc/extending/embedding.rst --- a/Doc/extending/embedding.rst +++ b/Doc/extending/embedding.rst @@ -271,7 +271,7 @@ To find out the required compiler and linker flags, you can execute the :file:`python{X.Y}-config` script which is generated as part of the -installation process (a generic :file:`python3-config` script is also +installation process (a :file:`python3-config` script may also be available). This script has several options, of which the following will be directly useful to you: @@ -294,9 +294,10 @@ example. If this procedure doesn't work for you (it is not guaranteed to work for -all Unix-like platforms; however, we welcome bug reports at -http://bugs.python.org), you will have to read your system's documentation -about dynamic linking and/or examine Python's Makefile and compilation +all Unix-like platforms; however, we welcome :ref:`bug reports `) +you will have to read your system's documentation about dynamic linking and/or +examine Python's :file:`Makefile` (use :func:`sysconfig.get_makefile_filename` +to find its location) and compilation options. In this case, the :mod:`sysconfig` module is a useful tool to programmatically extract the configuration values that you will want to combine together:: diff --git a/Doc/library/archiving.rst b/Doc/library/archiving.rst --- a/Doc/library/archiving.rst +++ b/Doc/library/archiving.rst @@ -6,6 +6,7 @@ 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. .. toctree:: diff --git a/Doc/library/bz2.rst b/Doc/library/bz2.rst --- a/Doc/library/bz2.rst +++ b/Doc/library/bz2.rst @@ -12,9 +12,6 @@ It implements a complete file interface, one-shot (de)compression functions, and types for sequential (de)compression. -For other archive formats, see the :mod:`gzip`, :mod:`zipfile`, and -:mod:`tarfile` modules. - Here is a summary of the features offered by the bz2 module: * :class:`BZ2File` class implements a complete file interface, including @@ -65,6 +62,18 @@ Support for the :keyword:`with` statement was added. + .. 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 `_). This module provides a + backport of Python 3.3's :class:`BZ2File` class, which does support + multi-stream files. + + .. method:: close() Close the file. Sets data attribute :attr:`closed` to true. A closed file diff --git a/Doc/library/gzip.rst b/Doc/library/gzip.rst --- a/Doc/library/gzip.rst +++ b/Doc/library/gzip.rst @@ -21,9 +21,6 @@ :program:`gzip` and :program:`gunzip` programs, such as those produced by :program:`compress` and :program:`pack`, are not supported by this module. -For other archive formats, see the :mod:`bz2`, :mod:`zipfile`, and -:mod:`tarfile` modules. - The module defines the following items: diff --git a/Doc/library/hmac.rst b/Doc/library/hmac.rst --- a/Doc/library/hmac.rst +++ b/Doc/library/hmac.rst @@ -24,14 +24,14 @@ An HMAC object has the following methods: -.. method:: hmac.update(msg) +.. method:: HMAC.update(msg) Update the hmac object with the bytes object *msg*. Repeated calls are equivalent to a single call with the concatenation of all the arguments: ``m.update(a); m.update(b)`` is equivalent to ``m.update(a + b)``. -.. method:: hmac.digest() +.. method:: HMAC.digest() Return the digest of the bytes passed to the :meth:`update` method so far. This bytes object will be the same length as the *digest_size* of the digest @@ -39,14 +39,14 @@ bytes. -.. method:: hmac.hexdigest() +.. method:: HMAC.hexdigest() Like :meth:`digest` except the digest is returned as a string twice the length containing only hexadecimal digits. This may be used to exchange the value safely in email or other non-binary environments. -.. method:: hmac.copy() +.. method:: HMAC.copy() Return a copy ("clone") of the hmac object. This can be used to efficiently compute the digests of strings that share a common initial substring. diff --git a/Doc/library/json.rst b/Doc/library/json.rst --- a/Doc/library/json.rst +++ b/Doc/library/json.rst @@ -125,6 +125,10 @@ :class:`bytes` objects. Therefore, ``fp.write()`` must support :class:`str` input. + If *ensure_ascii* is ``True`` (the default), the output is guaranteed to + have all incoming non-ASCII characters escaped. If *ensure_ascii* is + ``False``, these characters will be output as-is. + If *check_circular* is ``False`` (default: ``True``), then the circular reference check for container types will be skipped and a circular reference will result in an :exc:`OverflowError` (or worse). diff --git a/Doc/library/shutil.rst b/Doc/library/shutil.rst --- a/Doc/library/shutil.rst +++ b/Doc/library/shutil.rst @@ -31,6 +31,8 @@ are not copied. +.. _file-operations: + Directory and files operations ------------------------------ @@ -181,7 +183,7 @@ (*srcname*, *dstname*, *exception*). -.. _shutil-example: +.. _shutil-copytree-example: copytree example :::::::::::::::: @@ -248,6 +250,9 @@ Archiving operations -------------------- +High-level utilities to create and read compressed and archived files are also +provided. They rely on the :mod:`zipfile` and :mod:`tarfile` modules. + .. function:: make_archive(base_name, format, [root_dir, [base_dir, [verbose, [dry_run, [owner, [group, [logger]]]]]]]) Create an archive file (such as zip or tar) and return its name. @@ -375,6 +380,7 @@ .. versionadded:: 3.2 +.. _shutil-archiving-example: Archiving example ::::::::::::::::: @@ -400,5 +406,3 @@ -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 - - diff --git a/Doc/library/tarfile.rst b/Doc/library/tarfile.rst --- a/Doc/library/tarfile.rst +++ b/Doc/library/tarfile.rst @@ -14,7 +14,8 @@ The :mod:`tarfile` module makes it possible to read and write tar archives, including those using gzip or bz2 compression. -(:file:`.zip` files can be read and written using the :mod:`zipfile` module.) +Use the :mod:`zipfile` module to read or write :file:`.zip` files, or the +higher-level functions in :ref:`shutil `. Some facts and figures: diff --git a/Doc/library/zipfile.rst b/Doc/library/zipfile.rst --- a/Doc/library/zipfile.rst +++ b/Doc/library/zipfile.rst @@ -23,9 +23,6 @@ create an encrypted file. Decryption is extremely slow as it is implemented in native Python rather than C. -For other archive formats, see the :mod:`bz2`, :mod:`gzip`, and -:mod:`tarfile` modules. - The module defines the following items: .. exception:: BadZipFile diff --git a/Doc/library/zlib.rst b/Doc/library/zlib.rst --- a/Doc/library/zlib.rst +++ b/Doc/library/zlib.rst @@ -18,9 +18,7 @@ consult the zlib manual at http://www.zlib.net/manual.html for authoritative information. -For reading and writing ``.gz`` files see the :mod:`gzip` module. For -other archive formats, see the :mod:`bz2`, :mod:`zipfile`, and -:mod:`tarfile` modules. +For reading and writing ``.gz`` files see the :mod:`gzip` module. The available exception and functions in this module are: diff --git a/Lib/ctypes/_endian.py b/Lib/ctypes/_endian.py --- a/Lib/ctypes/_endian.py +++ b/Lib/ctypes/_endian.py @@ -1,7 +1,7 @@ import sys from ctypes import * -_array_type = type(c_int * 3) +_array_type = type(Array) def _other_endian(typ): """Return the type with the 'other' byte order. Simple types like diff --git a/Lib/distutils/command/bdist_rpm.py b/Lib/distutils/command/bdist_rpm.py --- a/Lib/distutils/command/bdist_rpm.py +++ b/Lib/distutils/command/bdist_rpm.py @@ -365,16 +365,28 @@ self.spawn(rpm_cmd) if not self.dry_run: + if self.distribution.has_ext_modules(): + pyversion = get_python_version() + else: + pyversion = 'any' + if not self.binary_only: srpm = os.path.join(rpm_dir['SRPMS'], source_rpm) assert(os.path.exists(srpm)) self.move_file(srpm, self.dist_dir) + filename = os.path.join(self.dist_dir, source_rpm) + self.distribution.dist_files.append( + ('bdist_rpm', pyversion, filename)) if not self.source_only: for rpm in binary_rpms: rpm = os.path.join(rpm_dir['RPMS'], rpm) if os.path.exists(rpm): self.move_file(rpm, self.dist_dir) + filename = os.path.join(self.dist_dir, + os.path.basename(rpm)) + self.distribution.dist_files.append( + ('bdist_rpm', pyversion, filename)) def _dist_path(self, path): return os.path.join(self.dist_dir, os.path.basename(path)) diff --git a/Lib/distutils/tests/test_bdist_rpm.py b/Lib/distutils/tests/test_bdist_rpm.py --- a/Lib/distutils/tests/test_bdist_rpm.py +++ b/Lib/distutils/tests/test_bdist_rpm.py @@ -78,6 +78,10 @@ dist_created = os.listdir(os.path.join(pkg_dir, 'dist')) self.assertTrue('foo-0.1-1.noarch.rpm' in dist_created) + # bug #2945: upload ignores bdist_rpm files + self.assertIn(('bdist_rpm', 'any', 'dist/foo-0.1-1.src.rpm'), dist.dist_files) + self.assertIn(('bdist_rpm', 'any', 'dist/foo-0.1-1.noarch.rpm'), dist.dist_files) + def test_no_optimize_flag(self): # XXX I am unable yet to make this test work without @@ -117,6 +121,11 @@ dist_created = os.listdir(os.path.join(pkg_dir, 'dist')) self.assertTrue('foo-0.1-1.noarch.rpm' in dist_created) + + # bug #2945: upload ignores bdist_rpm files + self.assertIn(('bdist_rpm', 'any', 'dist/foo-0.1-1.src.rpm'), dist.dist_files) + self.assertIn(('bdist_rpm', 'any', 'dist/foo-0.1-1.noarch.rpm'), dist.dist_files) + os.remove(os.path.join(pkg_dir, 'dist', 'foo-0.1-1.noarch.rpm')) def test_suite(): diff --git a/Lib/idlelib/AutoComplete.py b/Lib/idlelib/AutoComplete.py --- a/Lib/idlelib/AutoComplete.py +++ b/Lib/idlelib/AutoComplete.py @@ -190,8 +190,7 @@ bigl = eval("dir()", namespace) bigl.sort() if "__all__" in bigl: - smalll = eval("__all__", namespace) - smalll.sort() + smalll = sorted(eval("__all__", namespace)) else: smalll = [s for s in bigl if s[:1] != '_'] else: @@ -200,8 +199,7 @@ bigl = dir(entity) bigl.sort() if "__all__" in bigl: - smalll = entity.__all__ - smalll.sort() + smalll = sorted(entity.__all__) else: smalll = [s for s in bigl if s[:1] != '_'] except: diff --git a/Lib/idlelib/EditorWindow.py b/Lib/idlelib/EditorWindow.py --- a/Lib/idlelib/EditorWindow.py +++ b/Lib/idlelib/EditorWindow.py @@ -63,6 +63,50 @@ descr = os.path.splitext(filename)[1], None, imp.PY_SOURCE return file, filename, descr + +class HelpDialog(object): + + def __init__(self): + self.parent = None # parent of help window + self.dlg = None # the help window iteself + + def display(self, parent, near=None): + """ Display the help dialog. + + parent - parent widget for the help window + + near - a Toplevel widget (e.g. EditorWindow or PyShell) + to use as a reference for placing the help window + """ + if self.dlg is None: + self.show_dialog(parent) + if near: + self.nearwindow(near) + + def show_dialog(self, parent): + self.parent = parent + fn=os.path.join(os.path.abspath(os.path.dirname(__file__)),'help.txt') + self.dlg = dlg = textView.view_file(parent,'Help',fn, modal=False) + dlg.bind('', self.destroy, '+') + + def nearwindow(self, near): + # Place the help dialog near the window specified by parent. + # Note - this may not reposition the window in Metacity + # if "/apps/metacity/general/disable_workarounds" is enabled + dlg = self.dlg + geom = (near.winfo_rootx() + 10, near.winfo_rooty() + 10) + dlg.withdraw() + dlg.geometry("=+%d+%d" % geom) + dlg.deiconify() + dlg.lift() + + def destroy(self, ev=None): + self.dlg = None + self.parent = None + +helpDialog = HelpDialog() # singleton instance + + class EditorWindow(object): from idlelib.Percolator import Percolator from idlelib.ColorDelegator import ColorDelegator @@ -453,8 +497,11 @@ configDialog.ConfigDialog(self.top,'Settings') def help_dialog(self, event=None): - fn=os.path.join(os.path.abspath(os.path.dirname(__file__)),'help.txt') - textView.view_file(self.top,'Help',fn) + if self.root: + parent = self.root + else: + parent = self.top + helpDialog.display(parent, near=self.top) def python_docs(self, event=None): if sys.platform[:3] == 'win': diff --git a/Lib/idlelib/textView.py b/Lib/idlelib/textView.py --- a/Lib/idlelib/textView.py +++ b/Lib/idlelib/textView.py @@ -9,7 +9,7 @@ """A simple text viewer dialog for IDLE """ - def __init__(self, parent, title, text): + def __init__(self, parent, title, text, modal=True): """Show the given text in a scrollable window with a 'close' button """ @@ -24,8 +24,6 @@ self.CreateWidgets() self.title(title) - self.transient(parent) - self.grab_set() self.protocol("WM_DELETE_WINDOW", self.Ok) self.parent = parent self.textView.focus_set() @@ -34,7 +32,11 @@ self.bind('',self.Ok) #dismiss dialog self.textView.insert(0.0, text) self.textView.config(state=DISABLED) - self.wait_window() + + if modal: + self.transient(parent) + self.grab_set() + self.wait_window() def CreateWidgets(self): frameText = Frame(self, relief=SUNKEN, height=700) @@ -57,10 +59,10 @@ self.destroy() -def view_text(parent, title, text): - TextViewer(parent, title, text) +def view_text(parent, title, text, modal=True): + return TextViewer(parent, title, text, modal) -def view_file(parent, title, filename, encoding=None): +def view_file(parent, title, filename, encoding=None, modal=True): try: with open(filename, 'r', encoding=encoding) as file: contents = file.read() @@ -70,7 +72,7 @@ message='Unable to load file %r .' % filename, parent=parent) else: - return view_text(parent, title, contents) + return view_text(parent, title, contents, modal) if __name__ == '__main__': @@ -80,11 +82,15 @@ filename = './textView.py' text = file(filename, 'r').read() btn1 = Button(root, text='view_text', - command=lambda:view_text(root, 'view_text', text)) + command=lambda:view_text(root, 'view_text', text)) btn1.pack(side=LEFT) btn2 = Button(root, text='view_file', command=lambda:view_file(root, 'view_file', filename)) btn2.pack(side=LEFT) + btn3 = Button(root, text='nonmodal view_text', + command=lambda:view_text(root, 'nonmodal view_text', text, + modal=False)) + btn3.pack(side=LEFT) close = Button(root, text='Close', command=root.destroy) close.pack(side=RIGHT) root.mainloop() diff --git a/Lib/shutil.py b/Lib/shutil.py --- a/Lib/shutil.py +++ b/Lib/shutil.py @@ -493,7 +493,6 @@ _ARCHIVE_FORMATS = { 'gztar': (_make_tarball, [('compress', 'gzip')], "gzip'ed tar-file"), - 'bztar': (_make_tarball, [('compress', 'bzip2')], "bzip2'ed tar-file"), 'tar': (_make_tarball, [('compress', None)], "uncompressed tar file"), 'zip': (_make_zipfile, [],"ZIP file") } diff --git a/Lib/test/test_audioop.py b/Lib/test/test_audioop.py --- a/Lib/test/test_audioop.py +++ b/Lib/test/test_audioop.py @@ -2,18 +2,19 @@ import unittest from test.support import run_unittest +endian = 'big' if audioop.getsample(b'\0\1', 2, 0) == 1 else 'little' def gendata1(): return b'\0\1\2' def gendata2(): - if audioop.getsample(b'\0\1', 2, 0) == 1: + if endian == 'big': return b'\0\0\0\1\0\2' else: return b'\0\0\1\0\2\0' def gendata4(): - if audioop.getsample(b'\0\0\0\1', 4, 0) == 1: + if endian == 'big': return b'\0\0\0\0\0\0\0\1\0\0\0\2' else: return b'\0\0\0\0\1\0\0\0\2\0\0\0' @@ -111,9 +112,16 @@ # Cursory d = audioop.lin2alaw(data[0], 1) self.assertEqual(audioop.alaw2lin(d, 1), data[0]) - self.assertEqual(audioop.alaw2lin(d, 2), b'\x08\x00\x08\x01\x10\x02') - self.assertEqual(audioop.alaw2lin(d, 4), - b'\x00\x00\x08\x00\x00\x00\x08\x01\x00\x00\x10\x02') + if endian == 'big': + self.assertEqual(audioop.alaw2lin(d, 2), + b'\x00\x08\x01\x08\x02\x10') + self.assertEqual(audioop.alaw2lin(d, 4), + b'\x00\x08\x00\x00\x01\x08\x00\x00\x02\x10\x00\x00') + else: + self.assertEqual(audioop.alaw2lin(d, 2), + b'\x08\x00\x08\x01\x10\x02') + self.assertEqual(audioop.alaw2lin(d, 4), + b'\x00\x00\x08\x00\x00\x00\x08\x01\x00\x00\x10\x02') def test_lin2ulaw(self): self.assertEqual(audioop.lin2ulaw(data[0], 1), b'\xff\xe7\xdb') @@ -124,9 +132,16 @@ # Cursory d = audioop.lin2ulaw(data[0], 1) self.assertEqual(audioop.ulaw2lin(d, 1), data[0]) - self.assertEqual(audioop.ulaw2lin(d, 2), b'\x00\x00\x04\x01\x0c\x02') - self.assertEqual(audioop.ulaw2lin(d, 4), - b'\x00\x00\x00\x00\x00\x00\x04\x01\x00\x00\x0c\x02') + if endian == 'big': + self.assertEqual(audioop.ulaw2lin(d, 2), + b'\x00\x00\x01\x04\x02\x0c') + self.assertEqual(audioop.ulaw2lin(d, 4), + b'\x00\x00\x00\x00\x01\x04\x00\x00\x02\x0c\x00\x00') + else: + self.assertEqual(audioop.ulaw2lin(d, 2), + b'\x00\x00\x04\x01\x0c\x02') + self.assertEqual(audioop.ulaw2lin(d, 4), + b'\x00\x00\x00\x00\x00\x00\x04\x01\x00\x00\x0c\x02') def test_mul(self): data2 = [] diff --git a/Lib/test/test_site.py b/Lib/test/test_site.py --- a/Lib/test/test_site.py +++ b/Lib/test/test_site.py @@ -223,7 +223,19 @@ self.assertEqual(len(dirs), 1) wanted = os.path.join('xoxo', 'Lib', 'site-packages') self.assertEqual(dirs[0], wanted) + elif (sys.platform == "darwin" and + sysconfig.get_config_var("PYTHONFRAMEWORK")): + # OS X framework builds + site.PREFIXES = ['Python.framework'] + dirs = site.getsitepackages() + self.assertEqual(len(dirs), 3) + wanted = os.path.join('/Library', + sysconfig.get_config_var("PYTHONFRAMEWORK"), + sys.version[:3], + 'site-packages') + self.assertEqual(dirs[2], wanted) elif os.sep == '/': + # OS X non-framwework builds, Linux, FreeBSD, etc self.assertEqual(len(dirs), 2) wanted = os.path.join('xoxo', 'lib', 'python' + sys.version[:3], 'site-packages') @@ -231,21 +243,12 @@ wanted = os.path.join('xoxo', 'lib', 'site-python') self.assertEqual(dirs[1], wanted) else: + # other platforms self.assertEqual(len(dirs), 2) self.assertEqual(dirs[0], 'xoxo') wanted = os.path.join('xoxo', 'lib', 'site-packages') self.assertEqual(dirs[1], wanted) - # let's try the specific Apple location - if (sys.platform == "darwin" and - sysconfig.get_config_var("PYTHONFRAMEWORK")): - site.PREFIXES = ['Python.framework'] - dirs = site.getsitepackages() - self.assertEqual(len(dirs), 3) - wanted = os.path.join('/Library', 'Python', sys.version[:3], - 'site-packages') - self.assertEqual(dirs[2], wanted) - class PthFile(object): """Helper class for handling testing of .pth files""" diff --git a/Misc/ACKS b/Misc/ACKS --- a/Misc/ACKS +++ b/Misc/ACKS @@ -767,6 +767,7 @@ Juan M. Bello Rivas Davide Rizzo Anthony Roach +Carl Robben Mark Roberts Jim Robinson Andy Robinson diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -113,6 +113,16 @@ Library ------- +- 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. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Feb 6 17:30:19 2012 From: python-checkins at python.org (benjamin.peterson) Date: Mon, 06 Feb 2012 17:30:19 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=282=2E7=29=3A_bltinmod_is_bor?= =?utf8?q?rowed=2C_so_it_shouldn=27t_be_decrefed?= Message-ID: http://hg.python.org/cpython/rev/5d2244007bd9 changeset: 74808:5d2244007bd9 branch: 2.7 parent: 74802:82c4f094f811 user: Benjamin Peterson date: Mon Feb 06 11:28:45 2012 -0500 summary: bltinmod is borrowed, so it shouldn't be decrefed files: Objects/exceptions.c | 1 - 1 files changed, 0 insertions(+), 1 deletions(-) diff --git a/Objects/exceptions.c b/Objects/exceptions.c --- a/Objects/exceptions.c +++ b/Objects/exceptions.c @@ -2210,7 +2210,6 @@ Py_DECREF(args_tuple); } - Py_DECREF(bltinmod); } void -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Feb 6 17:30:19 2012 From: python-checkins at python.org (benjamin.peterson) Date: Mon, 06 Feb 2012 17:30:19 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_3=2E2_-=3E_default=29?= =?utf8?q?=3A_merge_3=2E2?= Message-ID: http://hg.python.org/cpython/rev/567767a6df02 changeset: 74809:567767a6df02 parent: 74805:edfb5e8afa89 parent: 74807:2a6813546e41 user: Benjamin Peterson date: Mon Feb 06 11:30:05 2012 -0500 summary: merge 3.2 files: Objects/exceptions.c | 1 - 1 files changed, 0 insertions(+), 1 deletions(-) diff --git a/Objects/exceptions.c b/Objects/exceptions.c --- a/Objects/exceptions.c +++ b/Objects/exceptions.c @@ -2475,7 +2475,6 @@ } } - Py_DECREF(bltinmod); } void -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Feb 6 19:55:43 2012 From: python-checkins at python.org (charles-francois.natali) Date: Mon, 06 Feb 2012 19:55:43 +0100 Subject: [Python-checkins] =?utf8?q?cpython=3A_Following_Nick=27s_suggesti?= =?utf8?q?on=2C_rename_posix=2Efdlistdir=28=29_to_posix=2Eflistdir=28=29?= =?utf8?q?=2C_to?= Message-ID: http://hg.python.org/cpython/rev/015936cec930 changeset: 74810:015936cec930 user: Charles-Fran?ois Natali date: Mon Feb 06 19:54:48 2012 +0100 summary: Following Nick's suggestion, rename posix.fdlistdir() to posix.flistdir(), to be consistent with other functions accepting file descriptors (fdlistdir() was added in 3.3, so hasn't been released yet). files: Doc/library/os.rst | 2 +- Doc/whatsnew/3.3.rst | 2 +- Lib/os.py | 2 +- Lib/test/test_os.py | 4 ++-- Lib/test/test_posix.py | 8 ++++---- Misc/NEWS | 2 +- Modules/posixmodule.c | 10 +++++----- 7 files changed, 15 insertions(+), 15 deletions(-) diff --git a/Doc/library/os.rst b/Doc/library/os.rst --- a/Doc/library/os.rst +++ b/Doc/library/os.rst @@ -769,7 +769,7 @@ .. versionadded:: 3.3 -.. function:: fdlistdir(fd) +.. function:: flistdir(fd) Like :func:`listdir`, but uses a file descriptor instead and always returns strings. diff --git a/Doc/whatsnew/3.3.rst b/Doc/whatsnew/3.3.rst --- a/Doc/whatsnew/3.3.rst +++ b/Doc/whatsnew/3.3.rst @@ -571,7 +571,7 @@ * Other new functions: - * :func:`~os.fdlistdir` (:issue:`10755`) + * :func:`~os.flistdir` (:issue:`10755`) * :func:`~os.getgrouplist` (:issue:`9344`) diff --git a/Lib/os.py b/Lib/os.py --- a/Lib/os.py +++ b/Lib/os.py @@ -357,7 +357,7 @@ # whether to follow symlinks flag = 0 if followlinks else AT_SYMLINK_NOFOLLOW - names = fdlistdir(topfd) + names = flistdir(topfd) dirs, nondirs = [], [] for name in names: # Here, we don't use AT_SYMLINK_NOFOLLOW to be consistent with diff --git a/Lib/test/test_os.py b/Lib/test/test_os.py --- a/Lib/test/test_os.py +++ b/Lib/test/test_os.py @@ -611,8 +611,8 @@ for root, dirs, files, rootfd in os.fwalk(*args): # check that the FD is valid os.fstat(rootfd) - # check that fdlistdir() returns consistent information - self.assertEqual(set(os.fdlistdir(rootfd)), set(dirs) | set(files)) + # check that flistdir() returns consistent information + self.assertEqual(set(os.flistdir(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: diff --git a/Lib/test/test_posix.py b/Lib/test/test_posix.py --- a/Lib/test/test_posix.py +++ b/Lib/test/test_posix.py @@ -451,18 +451,18 @@ if hasattr(posix, 'listdir'): self.assertTrue(support.TESTFN in posix.listdir()) - @unittest.skipUnless(hasattr(posix, 'fdlistdir'), "test needs posix.fdlistdir()") - def test_fdlistdir(self): + @unittest.skipUnless(hasattr(posix, 'flistdir'), "test needs posix.flistdir()") + def test_flistdir(self): f = posix.open(posix.getcwd(), posix.O_RDONLY) self.addCleanup(posix.close, f) self.assertEqual( sorted(posix.listdir('.')), - sorted(posix.fdlistdir(f)) + sorted(posix.flistdir(f)) ) # Check that the fd offset was reset (issue #13739) self.assertEqual( sorted(posix.listdir('.')), - sorted(posix.fdlistdir(f)) + sorted(posix.flistdir(f)) ) def test_access(self): diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -1745,7 +1745,7 @@ - Issue #11297: Add collections.ChainMap(). -- Issue #10755: Add the posix.fdlistdir() function. Patch by Ross Lagerwall. +- Issue #10755: Add the posix.flistdir() function. Patch by Ross Lagerwall. - Issue #4761: Add the *at() family of functions (openat(), etc.) to the posix module. Patch by Ross Lagerwall. diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c --- a/Modules/posixmodule.c +++ b/Modules/posixmodule.c @@ -2867,12 +2867,12 @@ } /* end of posix_listdir */ #ifdef HAVE_FDOPENDIR -PyDoc_STRVAR(posix_fdlistdir__doc__, -"fdlistdir(fd) -> list_of_strings\n\n\ +PyDoc_STRVAR(posix_flistdir__doc__, +"flistdir(fd) -> list_of_strings\n\n\ Like listdir(), but uses a file descriptor instead."); static PyObject * -posix_fdlistdir(PyObject *self, PyObject *args) +posix_flistdir(PyObject *self, PyObject *args) { PyObject *d, *v; DIR *dirp; @@ -2880,7 +2880,7 @@ int fd; errno = 0; - if (!PyArg_ParseTuple(args, "i:fdlistdir", &fd)) + if (!PyArg_ParseTuple(args, "i:flistdir", &fd)) return NULL; /* closedir() closes the FD, so we duplicate it */ fd = dup(fd); @@ -10555,7 +10555,7 @@ #endif /* HAVE_LINK */ {"listdir", posix_listdir, METH_VARARGS, posix_listdir__doc__}, #ifdef HAVE_FDOPENDIR - {"fdlistdir", posix_fdlistdir, METH_VARARGS, posix_fdlistdir__doc__}, + {"flistdir", posix_flistdir, METH_VARARGS, posix_flistdir__doc__}, #endif {"lstat", posix_lstat, METH_VARARGS, posix_lstat__doc__}, {"mkdir", posix_mkdir, METH_VARARGS, posix_mkdir__doc__}, -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Feb 6 21:07:08 2012 From: python-checkins at python.org (petri.lehtinen) Date: Mon, 06 Feb 2012 21:07:08 +0100 Subject: [Python-checkins] =?utf8?b?Y3B5dGhvbiAoMi43KTogSXNzdWUgIzEwODEx?= =?utf8?q?=3A_Fix_recursive_usage_of_cursors=2E_Instead_of_crashing=2C_rai?= =?utf8?q?se_a?= Message-ID: http://hg.python.org/cpython/rev/631e99961c5f changeset: 74811:631e99961c5f branch: 2.7 parent: 74808:5d2244007bd9 user: Petri Lehtinen date: Mon May 09 12:24:09 2011 +0200 summary: Issue #10811: Fix recursive usage of cursors. Instead of crashing, raise a ProgrammingError now. files: Lib/sqlite3/test/regression.py | 22 ++++++++++++++++ Misc/NEWS | 3 ++ Modules/_sqlite/cursor.c | 29 ++++++++++++++------- Modules/_sqlite/cursor.h | 1 + 4 files changed, 45 insertions(+), 10 deletions(-) diff --git a/Lib/sqlite3/test/regression.py b/Lib/sqlite3/test/regression.py --- a/Lib/sqlite3/test/regression.py +++ b/Lib/sqlite3/test/regression.py @@ -264,6 +264,28 @@ """ self.assertRaises(sqlite.Warning, self.con, 1) + def CheckRecursiveCursorUse(self): + """ + http://bugs.python.org/issue10811 + + Recursively using a cursor, such as when reusing it from a generator led to segfaults. + Now we catch recursive cursor usage and raise a ProgrammingError. + """ + con = sqlite.connect(":memory:") + + cur = con.cursor() + cur.execute("create table a (bar)") + cur.execute("create table b (baz)") + + def foo(): + cur.execute("insert into a (bar) values (?)", (1,)) + yield 1 + + with self.assertRaises(sqlite.ProgrammingError): + cur.executemany("insert into b (baz) values (?)", + ((i,) for i in foo())) + + def suite(): regression_suite = unittest.makeSuite(RegressionTests, "Check") return unittest.TestSuite((regression_suite,)) diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -90,6 +90,9 @@ Library ------- +- Issue #10811: Fix recursive usage of cursors. Instead of crashing, + raise a ProgrammingError now. + - Issue #10881: Fix test_site failures with OS X framework builds. - Issue #964437 Make IDLE help window non-modal. diff --git a/Modules/_sqlite/cursor.c b/Modules/_sqlite/cursor.c --- a/Modules/_sqlite/cursor.c +++ b/Modules/_sqlite/cursor.c @@ -443,9 +443,14 @@ if (cur->closed) { PyErr_SetString(pysqlite_ProgrammingError, "Cannot operate on a closed cursor."); return 0; - } else { - return pysqlite_check_thread(cur->connection) && pysqlite_check_connection(cur->connection); } + + if (cur->locked) { + PyErr_SetString(pysqlite_ProgrammingError, "Recursive use of cursors not allowed."); + return 0; + } + + return pysqlite_check_thread(cur->connection) && pysqlite_check_connection(cur->connection); } PyObject* _pysqlite_query_execute(pysqlite_Cursor* self, int multiple, PyObject* args) @@ -468,9 +473,10 @@ int allow_8bit_chars; if (!check_cursor(self)) { - return NULL; + goto error; } + self->locked = 1; self->reset = 0; /* Make shooting yourself in the foot with not utf-8 decodable 8-bit-strings harder */ @@ -483,12 +489,12 @@ if (multiple) { /* executemany() */ if (!PyArg_ParseTuple(args, "OO", &operation, &second_argument)) { - return NULL; + goto error; } if (!PyString_Check(operation) && !PyUnicode_Check(operation)) { PyErr_SetString(PyExc_ValueError, "operation parameter must be str or unicode"); - return NULL; + goto error; } if (PyIter_Check(second_argument)) { @@ -499,23 +505,23 @@ /* sequence */ parameters_iter = PyObject_GetIter(second_argument); if (!parameters_iter) { - return NULL; + goto error; } } } else { /* execute() */ if (!PyArg_ParseTuple(args, "O|O", &operation, &second_argument)) { - return NULL; + goto error; } if (!PyString_Check(operation) && !PyUnicode_Check(operation)) { PyErr_SetString(PyExc_ValueError, "operation parameter must be str or unicode"); - return NULL; + goto error; } parameters_list = PyList_New(0); if (!parameters_list) { - return NULL; + goto error; } if (second_argument == NULL) { @@ -761,7 +767,8 @@ * ROLLBACK could have happened */ #ifdef SQLITE_VERSION_NUMBER #if SQLITE_VERSION_NUMBER >= 3002002 - self->connection->inTransaction = !sqlite3_get_autocommit(self->connection->db); + if (self->connection && self->connection->db) + self->connection->inTransaction = !sqlite3_get_autocommit(self->connection->db); #endif #endif @@ -770,6 +777,8 @@ Py_XDECREF(parameters_iter); Py_XDECREF(parameters_list); + self->locked = 0; + if (PyErr_Occurred()) { self->rowcount = -1L; return NULL; diff --git a/Modules/_sqlite/cursor.h b/Modules/_sqlite/cursor.h --- a/Modules/_sqlite/cursor.h +++ b/Modules/_sqlite/cursor.h @@ -42,6 +42,7 @@ pysqlite_Statement* statement; int closed; int reset; + int locked; int initialized; /* the next row to be returned, NULL if no next row available */ -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Feb 6 21:07:08 2012 From: python-checkins at python.org (petri.lehtinen) Date: Mon, 06 Feb 2012 21:07:08 +0100 Subject: [Python-checkins] =?utf8?b?Y3B5dGhvbiAoMy4yKTogSXNzdWUgIzEwODEx?= =?utf8?q?=3A_Fix_recursive_usage_of_cursors=2E_Instead_of_crashing=2C_rai?= =?utf8?q?se_a?= Message-ID: http://hg.python.org/cpython/rev/d51ceef4b62f changeset: 74812:d51ceef4b62f branch: 3.2 parent: 74807:2a6813546e41 user: Petri Lehtinen date: Mon May 09 12:24:09 2011 +0200 summary: Issue #10811: Fix recursive usage of cursors. Instead of crashing, raise a ProgrammingError now. files: Lib/sqlite3/test/regression.py | 22 ++++++++++++++++ Misc/NEWS | 3 ++ Modules/_sqlite/cursor.c | 29 ++++++++++++++------- Modules/_sqlite/cursor.h | 1 + 4 files changed, 45 insertions(+), 10 deletions(-) diff --git a/Lib/sqlite3/test/regression.py b/Lib/sqlite3/test/regression.py --- a/Lib/sqlite3/test/regression.py +++ b/Lib/sqlite3/test/regression.py @@ -281,6 +281,28 @@ # Lone surrogate cannot be encoded to the default encoding (utf8) "\uDC80", collation_cb) + def CheckRecursiveCursorUse(self): + """ + http://bugs.python.org/issue10811 + + Recursively using a cursor, such as when reusing it from a generator led to segfaults. + Now we catch recursive cursor usage and raise a ProgrammingError. + """ + con = sqlite.connect(":memory:") + + cur = con.cursor() + cur.execute("create table a (bar)") + cur.execute("create table b (baz)") + + def foo(): + cur.execute("insert into a (bar) values (?)", (1,)) + yield 1 + + with self.assertRaises(sqlite.ProgrammingError): + cur.executemany("insert into b (baz) values (?)", + ((i,) for i in foo())) + + def suite(): regression_suite = unittest.makeSuite(RegressionTests, "Check") return unittest.TestSuite((regression_suite,)) diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -113,6 +113,9 @@ Library ------- +- 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. diff --git a/Modules/_sqlite/cursor.c b/Modules/_sqlite/cursor.c --- a/Modules/_sqlite/cursor.c +++ b/Modules/_sqlite/cursor.c @@ -433,9 +433,14 @@ if (cur->closed) { PyErr_SetString(pysqlite_ProgrammingError, "Cannot operate on a closed cursor."); return 0; - } else { - return pysqlite_check_thread(cur->connection) && pysqlite_check_connection(cur->connection); } + + if (cur->locked) { + PyErr_SetString(pysqlite_ProgrammingError, "Recursive use of cursors not allowed."); + return 0; + } + + return pysqlite_check_thread(cur->connection) && pysqlite_check_connection(cur->connection); } PyObject* _pysqlite_query_execute(pysqlite_Cursor* self, int multiple, PyObject* args) @@ -458,9 +463,10 @@ int allow_8bit_chars; if (!check_cursor(self)) { - return NULL; + goto error; } + self->locked = 1; self->reset = 0; /* Make shooting yourself in the foot with not utf-8 decodable 8-bit-strings harder */ @@ -473,12 +479,12 @@ if (multiple) { /* executemany() */ if (!PyArg_ParseTuple(args, "OO", &operation, &second_argument)) { - return NULL; + goto error; } if (!PyUnicode_Check(operation)) { PyErr_SetString(PyExc_ValueError, "operation parameter must be str"); - return NULL; + goto error; } if (PyIter_Check(second_argument)) { @@ -489,23 +495,23 @@ /* sequence */ parameters_iter = PyObject_GetIter(second_argument); if (!parameters_iter) { - return NULL; + goto error; } } } else { /* execute() */ if (!PyArg_ParseTuple(args, "O|O", &operation, &second_argument)) { - return NULL; + goto error; } if (!PyUnicode_Check(operation)) { PyErr_SetString(PyExc_ValueError, "operation parameter must be str"); - return NULL; + goto error; } parameters_list = PyList_New(0); if (!parameters_list) { - return NULL; + goto error; } if (second_argument == NULL) { @@ -745,7 +751,8 @@ * ROLLBACK could have happened */ #ifdef SQLITE_VERSION_NUMBER #if SQLITE_VERSION_NUMBER >= 3002002 - self->connection->inTransaction = !sqlite3_get_autocommit(self->connection->db); + if (self->connection && self->connection->db) + self->connection->inTransaction = !sqlite3_get_autocommit(self->connection->db); #endif #endif @@ -753,6 +760,8 @@ Py_XDECREF(parameters_iter); Py_XDECREF(parameters_list); + self->locked = 0; + if (PyErr_Occurred()) { self->rowcount = -1L; return NULL; diff --git a/Modules/_sqlite/cursor.h b/Modules/_sqlite/cursor.h --- a/Modules/_sqlite/cursor.h +++ b/Modules/_sqlite/cursor.h @@ -42,6 +42,7 @@ pysqlite_Statement* statement; int closed; int reset; + int locked; int initialized; /* the next row to be returned, NULL if no next row available */ -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Feb 6 21:07:09 2012 From: python-checkins at python.org (petri.lehtinen) Date: Mon, 06 Feb 2012 21:07:09 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_3=2E2_-=3E_default=29?= =?utf8?q?=3A_Merge_branch_=273=2E2=27?= Message-ID: http://hg.python.org/cpython/rev/630dfddab73c changeset: 74813:630dfddab73c parent: 74810:015936cec930 parent: 74812:d51ceef4b62f user: Petri Lehtinen date: Mon Feb 06 22:04:41 2012 +0200 summary: Merge branch '3.2' files: Misc/NEWS | 3 +++ 1 files changed, 3 insertions(+), 0 deletions(-) diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -466,6 +466,9 @@ Library ------- +- 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. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Feb 6 21:19:20 2012 From: python-checkins at python.org (brett.cannon) Date: Mon, 06 Feb 2012 21:19:20 +0100 Subject: [Python-checkins] =?utf8?q?peps=3A_Update_from_Ethan_Furman=2E?= Message-ID: http://hg.python.org/peps/rev/9b4d817a762d changeset: 4040:9b4d817a762d user: Brett Cannon date: Mon Feb 06 15:19:16 2012 -0500 summary: Update from Ethan Furman. files: pep-0409.txt | 21 +++++++++++++++------ 1 files changed, 15 insertions(+), 6 deletions(-) diff --git a/pep-0409.txt b/pep-0409.txt --- a/pep-0409.txt +++ b/pep-0409.txt @@ -113,17 +113,26 @@ * Use ``Ellipsis`` as the default value (the ``...`` singleton). - Accepted. There are no other possible values; it cannot be raised as it is - not an exception; it has the connotation of 'fill in the rest...' as in - ``__cause__`` is not set, look in ``__context__`` for it. + Accepted. + + Ellipses are commonly used in English as place holders when words are + omitted. This works in our favor here as a signal that ``__cause__`` is + omitted, so look in ``__context__`` for more details. + + Ellipsis is not an exception, so cannot be raised. + + There is only one Ellipsis, so no unused values. + + Error information is not thrown away, so custom code can trace the entire + exception chain even if the default code does not. Language Details ================ -To support ``from None``, ``__context__`` will stay as it is, but -``__cause__`` will start out as ``Ellipsis`` and will change to ``None`` -when the ``raise ... from None`` method is used. +To support ``raise Exception from None``, ``__context__`` will stay as it is, +but ``__cause__`` will start out as ``Ellipsis`` and will change to ``None`` +when the ``raise Exception from None`` method is used. ============================================ ================== ======================================= form __context__ __cause__ -- Repository URL: http://hg.python.org/peps From python-checkins at python.org Mon Feb 6 22:25:54 2012 From: python-checkins at python.org (vinay.sajip) Date: Mon, 06 Feb 2012 22:25:54 +0100 Subject: [Python-checkins] =?utf8?b?Y3B5dGhvbiAobWVyZ2UgMy4xIC0+IDMuMik6?= =?utf8?q?_Null_merge_for_reverted_fix_for_=2313807=2E?= Message-ID: http://hg.python.org/cpython/rev/6b951f27f6a8 changeset: 74814:6b951f27f6a8 branch: 3.2 parent: 74812:d51ceef4b62f parent: 74744:813a34170ac5 user: Vinay Sajip date: Mon Feb 06 21:24:40 2012 +0000 summary: Null merge for reverted fix for #13807. files: -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Feb 6 22:25:55 2012 From: python-checkins at python.org (vinay.sajip) Date: Mon, 06 Feb 2012 22:25:55 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_3=2E2_-=3E_default=29?= =?utf8?q?=3A_Null_merge_for_reverted_fix_for_=2313807=2E?= Message-ID: http://hg.python.org/cpython/rev/140f7de4d2a5 changeset: 74815:140f7de4d2a5 parent: 74813:630dfddab73c parent: 74814:6b951f27f6a8 user: Vinay Sajip date: Mon Feb 06 21:25:43 2012 +0000 summary: Null merge for reverted fix for #13807. files: -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Feb 6 23:45:17 2012 From: python-checkins at python.org (victor.stinner) Date: Mon, 06 Feb 2012 23:45:17 +0100 Subject: [Python-checkins] =?utf8?q?peps=3A_PEP_410=3A_rephrase_doc_about_?= =?utf8?q?datetime=2Edatetime_and_datetime=2Etimedelta?= Message-ID: http://hg.python.org/peps/rev/bc6d1d34bcef changeset: 4041:bc6d1d34bcef user: Victor Stinner date: Mon Feb 06 23:45:48 2012 +0100 summary: PEP 410: rephrase doc about datetime.datetime and datetime.timedelta files: pep-0410.txt | 20 ++++++++++---------- 1 files changed, 10 insertions(+), 10 deletions(-) diff --git a/pep-0410.txt b/pep-0410.txt --- a/pep-0410.txt +++ b/pep-0410.txt @@ -126,14 +126,15 @@ datetime.datetime only supports microsecond resolution, but can be enhanced to support nanosecond. -datetime.datetime has issues: +datetime.datetime has issues with timezone. For example, a datetime object +without timezone and a datetime with a timezone cannot be compared. -- there is no easy way to convert it into "seconds since the epoch" -- any broken-down time has issues of time stamp ordering in the - duplicate hour of switching from DST to normal time -- time zone support is flaky-to-nonexistent in the datetime module +datetime.datetime has ordering issues with daylight saving time (DST) in the +duplicate hour of switching from DST to normal time. -datetime.datetime is also more complex than a simple number. +datetime.datetime is not as well integrated than Epoch timestamps, some +functions don't accept this type as input. For example, os.utime() expects a +tuple of Epoch timestamps. datetime.timedelta ------------------ @@ -141,10 +142,9 @@ As datetime.datetime, datetime.timedelta only supports microsecond resolution, but can be enhanced to support nanosecond. -Even if datetime.timedelta have most criteria, it was not selected because it -is more complex than a simple number and is not accepted by functions getting -timestamp inputs. - +datetime.timedelta is not as well integrated than Epoch timestamps, some +functions don't accept this type as input. For example, os.utime() expects a +tuple of Epoch timestamps. .. _tuple-integers: -- Repository URL: http://hg.python.org/peps From solipsis at pitrou.net Tue Feb 7 05:34:17 2012 From: solipsis at pitrou.net (solipsis at pitrou.net) Date: Tue, 07 Feb 2012 05:34:17 +0100 Subject: [Python-checkins] Daily reference leaks (140f7de4d2a5): sum=888 Message-ID: results for 140f7de4d2a5 on branch "default" -------------------------------------------- test_capi leaked [296, 296, 296] references, sum=888 Command line was: ['./python', '-m', 'test.regrtest', '-uall', '-R', '3:3:/home/antoine/cpython/refleaks/refloggC47QL', '-x'] From python-checkins at python.org Tue Feb 7 15:20:39 2012 From: python-checkins at python.org (brett.cannon) Date: Tue, 07 Feb 2012 15:20:39 +0100 Subject: [Python-checkins] =?utf8?q?cpython=3A_Have_importlib=2Etest=2Eben?= =?utf8?q?chmark_test_with_tabnanny_as_a_medium-sized_test=2E?= Message-ID: http://hg.python.org/cpython/rev/7d4525a96cf2 changeset: 74816:7d4525a96cf2 parent: 74809:567767a6df02 user: Brett Cannon date: Tue Feb 07 09:19:12 2012 -0500 summary: Have importlib.test.benchmark test with tabnanny as a medium-sized test. files: Lib/importlib/test/benchmark.py | 90 +++++++++++++------- 1 files changed, 58 insertions(+), 32 deletions(-) diff --git a/Lib/importlib/test/benchmark.py b/Lib/importlib/test/benchmark.py --- a/Lib/importlib/test/benchmark.py +++ b/Lib/importlib/test/benchmark.py @@ -13,6 +13,7 @@ import os import py_compile import sys +import tabnanny import timeit @@ -60,7 +61,7 @@ def source_wo_bytecode(seconds, repeat): - """Source w/o bytecode: simple""" + """Source w/o bytecode: small""" sys.dont_write_bytecode = True try: name = '__importlib_test_benchmark__' @@ -74,23 +75,30 @@ 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 _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: simple""" + """Source writing bytecode: small""" assert not sys.dont_write_bytecode name = '__importlib_test_benchmark__' with source_util.create_modules(name) as mapping: @@ -102,19 +110,27 @@ 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 _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): - """Bytecode w/ source: simple""" + """Source w/ bytecode: small""" name = '__importlib_test_benchmark__' with source_util.create_modules(name) as mapping: py_compile.compile(mapping[name]) @@ -124,13 +140,21 @@ 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 _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_, filename=None, benchmark=None): @@ -143,6 +167,8 @@ benchmarks = (from_cache, builtin_mod, source_using_bytecode, source_wo_bytecode, source_writing_bytecode, + tabnanny_using_bytecode, tabnanny_wo_bytecode, + tabnanny_writing_bytecode, decimal_using_bytecode, decimal_writing_bytecode, decimal_wo_bytecode,) if benchmark: -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Feb 7 15:20:40 2012 From: python-checkins at python.org (brett.cannon) Date: Tue, 07 Feb 2012 15:20:40 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_default_-=3E_default?= =?utf8?q?=29=3A_Merge?= Message-ID: http://hg.python.org/cpython/rev/62b183035ed6 changeset: 74817:62b183035ed6 parent: 74816:7d4525a96cf2 parent: 74815:140f7de4d2a5 user: Brett Cannon date: Tue Feb 07 09:20:20 2012 -0500 summary: Merge files: Doc/library/os.rst | 2 +- Doc/whatsnew/3.3.rst | 2 +- Lib/os.py | 2 +- Lib/test/test_os.py | 4 ++-- Lib/test/test_posix.py | 8 ++++---- Misc/NEWS | 5 ++++- Modules/posixmodule.c | 10 +++++----- 7 files changed, 18 insertions(+), 15 deletions(-) diff --git a/Doc/library/os.rst b/Doc/library/os.rst --- a/Doc/library/os.rst +++ b/Doc/library/os.rst @@ -769,7 +769,7 @@ .. versionadded:: 3.3 -.. function:: fdlistdir(fd) +.. function:: flistdir(fd) Like :func:`listdir`, but uses a file descriptor instead and always returns strings. diff --git a/Doc/whatsnew/3.3.rst b/Doc/whatsnew/3.3.rst --- a/Doc/whatsnew/3.3.rst +++ b/Doc/whatsnew/3.3.rst @@ -571,7 +571,7 @@ * Other new functions: - * :func:`~os.fdlistdir` (:issue:`10755`) + * :func:`~os.flistdir` (:issue:`10755`) * :func:`~os.getgrouplist` (:issue:`9344`) diff --git a/Lib/os.py b/Lib/os.py --- a/Lib/os.py +++ b/Lib/os.py @@ -357,7 +357,7 @@ # whether to follow symlinks flag = 0 if followlinks else AT_SYMLINK_NOFOLLOW - names = fdlistdir(topfd) + names = flistdir(topfd) dirs, nondirs = [], [] for name in names: # Here, we don't use AT_SYMLINK_NOFOLLOW to be consistent with diff --git a/Lib/test/test_os.py b/Lib/test/test_os.py --- a/Lib/test/test_os.py +++ b/Lib/test/test_os.py @@ -611,8 +611,8 @@ for root, dirs, files, rootfd in os.fwalk(*args): # check that the FD is valid os.fstat(rootfd) - # check that fdlistdir() returns consistent information - self.assertEqual(set(os.fdlistdir(rootfd)), set(dirs) | set(files)) + # check that flistdir() returns consistent information + self.assertEqual(set(os.flistdir(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: diff --git a/Lib/test/test_posix.py b/Lib/test/test_posix.py --- a/Lib/test/test_posix.py +++ b/Lib/test/test_posix.py @@ -451,18 +451,18 @@ if hasattr(posix, 'listdir'): self.assertTrue(support.TESTFN in posix.listdir()) - @unittest.skipUnless(hasattr(posix, 'fdlistdir'), "test needs posix.fdlistdir()") - def test_fdlistdir(self): + @unittest.skipUnless(hasattr(posix, 'flistdir'), "test needs posix.flistdir()") + def test_flistdir(self): f = posix.open(posix.getcwd(), posix.O_RDONLY) self.addCleanup(posix.close, f) self.assertEqual( sorted(posix.listdir('.')), - sorted(posix.fdlistdir(f)) + sorted(posix.flistdir(f)) ) # Check that the fd offset was reset (issue #13739) self.assertEqual( sorted(posix.listdir('.')), - sorted(posix.fdlistdir(f)) + sorted(posix.flistdir(f)) ) def test_access(self): diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -466,6 +466,9 @@ Library ------- +- 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. @@ -1745,7 +1748,7 @@ - Issue #11297: Add collections.ChainMap(). -- Issue #10755: Add the posix.fdlistdir() function. Patch by Ross Lagerwall. +- Issue #10755: Add the posix.flistdir() function. Patch by Ross Lagerwall. - Issue #4761: Add the *at() family of functions (openat(), etc.) to the posix module. Patch by Ross Lagerwall. diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c --- a/Modules/posixmodule.c +++ b/Modules/posixmodule.c @@ -2867,12 +2867,12 @@ } /* end of posix_listdir */ #ifdef HAVE_FDOPENDIR -PyDoc_STRVAR(posix_fdlistdir__doc__, -"fdlistdir(fd) -> list_of_strings\n\n\ +PyDoc_STRVAR(posix_flistdir__doc__, +"flistdir(fd) -> list_of_strings\n\n\ Like listdir(), but uses a file descriptor instead."); static PyObject * -posix_fdlistdir(PyObject *self, PyObject *args) +posix_flistdir(PyObject *self, PyObject *args) { PyObject *d, *v; DIR *dirp; @@ -2880,7 +2880,7 @@ int fd; errno = 0; - if (!PyArg_ParseTuple(args, "i:fdlistdir", &fd)) + if (!PyArg_ParseTuple(args, "i:flistdir", &fd)) return NULL; /* closedir() closes the FD, so we duplicate it */ fd = dup(fd); @@ -10555,7 +10555,7 @@ #endif /* HAVE_LINK */ {"listdir", posix_listdir, METH_VARARGS, posix_listdir__doc__}, #ifdef HAVE_FDOPENDIR - {"fdlistdir", posix_fdlistdir, METH_VARARGS, posix_fdlistdir__doc__}, + {"flistdir", posix_flistdir, METH_VARARGS, posix_flistdir__doc__}, #endif {"lstat", posix_lstat, METH_VARARGS, posix_lstat__doc__}, {"mkdir", posix_mkdir, METH_VARARGS, posix_mkdir__doc__}, -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Feb 7 15:41:04 2012 From: python-checkins at python.org (brett.cannon) Date: Tue, 07 Feb 2012 15:41:04 +0100 Subject: [Python-checkins] =?utf8?q?cpython=3A_Re-order_importlib_benchmar?= =?utf8?q?ks_to_be_consistent=2E_Also_print_out_what?= Message-ID: http://hg.python.org/cpython/rev/5a13dda023df changeset: 74818:5a13dda023df user: Brett Cannon date: Tue Feb 07 09:40:33 2012 -0500 summary: Re-order importlib benchmarks to be consistent. Also print out what implementation of __import__ is used. files: Lib/importlib/test/benchmark.py | 14 ++++++++------ 1 files changed, 8 insertions(+), 6 deletions(-) diff --git a/Lib/importlib/test/benchmark.py b/Lib/importlib/test/benchmark.py --- a/Lib/importlib/test/benchmark.py +++ b/Lib/importlib/test/benchmark.py @@ -165,12 +165,13 @@ prev_results = {} __builtins__.__import__ = import_ benchmarks = (from_cache, builtin_mod, - source_using_bytecode, source_wo_bytecode, source_writing_bytecode, - tabnanny_using_bytecode, tabnanny_wo_bytecode, + source_wo_bytecode, source_using_bytecode, tabnanny_writing_bytecode, - decimal_using_bytecode, decimal_writing_bytecode, - decimal_wo_bytecode,) + tabnanny_wo_bytecode, tabnanny_using_bytecode, + decimal_writing_bytecode, + decimal_wo_bytecode, decimal_using_bytecode, + ) if benchmark: for b in benchmarks: if b.__doc__ == benchmark: @@ -183,9 +184,10 @@ 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') + 'Entire benchmark run should take about {} seconds\n' + 'Using {!r} as __import__\n') print(header.format(seconds, seconds_plural, repeat, - len(benchmarks) * seconds * repeat)) + len(benchmarks) * seconds * repeat, __import__)) new_results = {} for benchmark in benchmarks: print(benchmark.__doc__, "[", end=' ') -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Feb 7 23:05:25 2012 From: python-checkins at python.org (victor.stinner) Date: Tue, 07 Feb 2012 23:05:25 +0100 Subject: [Python-checkins] =?utf8?q?cpython=3A_Backout_d2c1521ad0a1=3A_=5F?= =?utf8?q?Py=5FIDENTIFIER=28=29_uses_UTF-8_again?= Message-ID: http://hg.python.org/cpython/rev/e2e7e372c293 changeset: 74819:e2e7e372c293 user: Victor Stinner date: Tue Feb 07 23:05:55 2012 +0100 summary: Backout d2c1521ad0a1: _Py_IDENTIFIER() uses UTF-8 again files: Objects/unicodeobject.c | 5 +++-- 1 files changed, 3 insertions(+), 2 deletions(-) diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -1744,8 +1744,9 @@ _PyUnicode_FromId(_Py_Identifier *id) { if (!id->object) { - id->object = unicode_fromascii((unsigned char*)id->string, - strlen(id->string)); + id->object = PyUnicode_DecodeUTF8Stateful(id->string, + strlen(id->string), + NULL, NULL); if (!id->object) return NULL; PyUnicode_InternInPlace(&id->object); -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Feb 7 23:29:15 2012 From: python-checkins at python.org (victor.stinner) Date: Tue, 07 Feb 2012 23:29:15 +0100 Subject: [Python-checkins] =?utf8?q?cpython=3A_Issue_=2313846=3A_Add_time?= =?utf8?q?=2Emonotonic=28=29=2C_monotonic_clock=2E?= Message-ID: http://hg.python.org/cpython/rev/376ce937823c changeset: 74820:376ce937823c user: Victor Stinner date: Tue Feb 07 23:29:46 2012 +0100 summary: Issue #13846: Add time.monotonic(), monotonic clock. files: Doc/library/time.rst | 8 +++ Lib/test/test_time.py | 18 ++++++- Misc/NEWS | 2 + Modules/timemodule.c | 82 +++++++++++++++++++++++++----- 4 files changed, 94 insertions(+), 16 deletions(-) diff --git a/Doc/library/time.rst b/Doc/library/time.rst --- a/Doc/library/time.rst +++ b/Doc/library/time.rst @@ -226,6 +226,14 @@ The earliest date for which it can generate a time is platform-dependent. +.. function:: monotonic() + + Monotonic clock. The reference point of the returned value is undefined so + only the difference of consecutive calls is valid. + + .. versionadded: 3.3 + + .. function:: sleep(secs) Suspend execution for the given number of seconds. The argument may be a diff --git a/Lib/test/test_time.py b/Lib/test/test_time.py --- a/Lib/test/test_time.py +++ b/Lib/test/test_time.py @@ -331,16 +331,32 @@ pass self.assertEqual(time.strftime('%Z', tt), tzname) + @unittest.skipUnless(hasattr(time, 'monotonic'), + 'need time.monotonic()') + def test_monotonic(self): + t1 = time.monotonic() + t2 = time.monotonic() + self.assertGreaterEqual(t2, t1) + + 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) + def test_wallclock(self): t1 = time.wallclock() t2 = time.wallclock() + # may fail if the system clock was changed self.assertGreaterEqual(t2, t1) t1 = time.wallclock() time.sleep(0.1) t2 = time.wallclock() + dt = t2 - t1 + # may fail if the system clock was changed self.assertGreater(t2, t1) - dt = t2 - t1 self.assertAlmostEqual(dt, 0.1, delta=0.2) def test_localtime_failure(self): diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -466,6 +466,8 @@ Library ------- +- Issue #13846: Add time.monotonic(), monotonic clock. + - Issue #10811: Fix recursive usage of cursors. Instead of crashing, raise a ProgrammingError now. diff --git a/Modules/timemodule.c b/Modules/timemodule.c --- a/Modules/timemodule.c +++ b/Modules/timemodule.c @@ -91,39 +91,44 @@ /* Win32 has better clock replacement; we have our own version, due to Mark Hammond and Tim Peters */ static PyObject * -time_clock(PyObject *self, PyObject *unused) +win32_clock(int fallback) { - 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 pyclock(); + if (fallback) + return pyclock(); + else + return PyErr_SetFromWindowsErr(0); } - 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); + return PyFloat_FromDouble(diff / (double)cpu_frequency); } +#endif -#elif defined(HAVE_CLOCK) - +#if (defined(MS_WINDOWS) && !defined(__BORLANDC__)) || defined(HAVE_CLOCK) static PyObject * time_clock(PyObject *self, PyObject *unused) { +#if defined(MS_WINDOWS) && !defined(__BORLANDC__) + return win32_clock(1); +#else return pyclock(); +#endif } -#endif /* HAVE_CLOCK */ - -#ifdef HAVE_CLOCK PyDoc_STRVAR(clock_doc, "clock() -> floating point number\n\ \n\ @@ -767,7 +772,7 @@ time_wallclock(PyObject *self, PyObject *unused) { #if defined(MS_WINDOWS) && !defined(__BORLANDC__) - return time_clock(self, NULL); + return win32_clock(1); #elif defined(HAVE_CLOCK_GETTIME) && defined(CLOCK_MONOTONIC) static int clk_index = 0; clockid_t clk_ids[] = { @@ -809,6 +814,50 @@ of the returned value is undefined so only the difference of consecutive\n\ calls is valid."); +#if (defined(MS_WINDOWS) && !defined(__BORLANDC__)) \ + || (defined(HAVE_CLOCK_GETTIME) && defined(CLOCK_MONOTONIC)) +# define HAVE_PYTIME_MONOTONIC +#endif + +#ifdef HAVE_PYTIME_MONOTONIC +static PyObject * +time_monotonic(PyObject *self, PyObject *unused) +{ +#if defined(MS_WINDOWS) && !defined(__BORLANDC__) + return win32_clock(0); +#else + static int clk_index = 0; + clockid_t clk_ids[] = { +#ifdef CLOCK_MONOTONIC_RAW + CLOCK_MONOTONIC_RAW, +#endif + CLOCK_MONOTONIC + }; + int ret; + struct timespec tp; + + while (0 <= clk_index) { + clockid_t clk_id = clk_ids[clk_index]; + ret = clock_gettime(clk_id, &tp); + if (ret == 0) + return PyFloat_FromDouble(tp.tv_sec + tp.tv_nsec * 1e-9); + + clk_index++; + if (Py_ARRAY_LENGTH(clk_ids) <= clk_index) + clk_index = -1; + } + PyErr_SetFromErrno(PyExc_OSError); + return NULL; +#endif +} + +PyDoc_STRVAR(monotonic_doc, +"monotonic() -> float\n\ +\n\ +Monotonic clock. The reference point of the returned value is undefined so\n\ +only the difference of consecutive calls is valid."); +#endif + static void PyInit_timezone(PyObject *m) { /* This code moved from PyInit_time wholesale to allow calling it from @@ -937,6 +986,9 @@ #ifdef HAVE_MKTIME {"mktime", time_mktime, METH_O, mktime_doc}, #endif +#ifdef HAVE_PYTIME_MONOTONIC + {"monotonic", time_monotonic, METH_NOARGS, monotonic_doc}, +#endif #ifdef HAVE_STRFTIME {"strftime", time_strftime, METH_VARARGS, strftime_doc}, #endif -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Feb 7 23:40:30 2012 From: python-checkins at python.org (victor.stinner) Date: Tue, 07 Feb 2012 23:40:30 +0100 Subject: [Python-checkins] =?utf8?q?cpython=3A_Issue_=2313845=3A_time=2Eti?= =?utf8?q?me=28=29_now_uses_GetSystemTimeAsFileTime=28=29_instead_of_ftime?= =?utf8?b?KCk=?= Message-ID: http://hg.python.org/cpython/rev/bee7943d38c6 changeset: 74821:bee7943d38c6 user: Victor Stinner date: Tue Feb 07 23:41:01 2012 +0100 summary: Issue #13845: 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). files: Misc/NEWS | 4 ++++ Python/pytime.c | 37 +++++++++++++++++++++++++++---------- 2 files changed, 31 insertions(+), 10 deletions(-) diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -466,6 +466,10 @@ Library ------- +- Issue #13845: 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 #13846: Add time.monotonic(), monotonic clock. - Issue #10811: Fix recursive usage of cursors. Instead of crashing, diff --git a/Python/pytime.c b/Python/pytime.c --- a/Python/pytime.c +++ b/Python/pytime.c @@ -1,7 +1,9 @@ #include "Python.h" +#ifdef MS_WINDOWS +#include +#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,30 @@ */ # undef HAVE_FTIME #endif + +#if defined(HAVE_FTIME) && !defined(MS_WINDOWS) +#include +extern int ftime(struct timeb *); #endif -#ifdef HAVE_FTIME -#include -#if !defined(MS_WINDOWS) && !defined(PYOS_OS2) -extern int ftime(struct timeb *); -#endif /* MS_WINDOWS */ -#endif /* HAVE_FTIME */ - void _PyTime_gettimeofday(_PyTime_timeval *tp) { +#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; +#else /* There are three ways to get the time: (1) gettimeofday() -- resolution in microseconds (2) ftime() -- resolution in milliseconds @@ -30,6 +44,7 @@ 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 #ifdef GETTIMEOFDAY_NO_TZ if (gettimeofday(tp) == 0) @@ -39,6 +54,7 @@ return; #endif /* !GETTIMEOFDAY_NO_TZ */ #endif /* !HAVE_GETTIMEOFDAY */ + #if defined(HAVE_FTIME) { struct timeb t; @@ -50,7 +66,8 @@ tp->tv_sec = time(NULL); tp->tv_usec = 0; #endif /* !HAVE_FTIME */ - return; + +#endif /* MS_WINDOWS */ } void -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Feb 8 01:43:01 2012 From: python-checkins at python.org (victor.stinner) Date: Wed, 08 Feb 2012 01:43:01 +0100 Subject: [Python-checkins] =?utf8?q?cpython=3A_What=27s_New_in_3=2E3=3A_Fi?= =?utf8?q?x_time_module_doc?= Message-ID: http://hg.python.org/cpython/rev/139b699c6117 changeset: 74822:139b699c6117 user: Victor Stinner date: Wed Feb 08 01:43:34 2012 +0100 summary: What's New in 3.3: Fix time module doc files: Doc/whatsnew/3.3.rst | 6 +++--- 1 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Doc/whatsnew/3.3.rst b/Doc/whatsnew/3.3.rst --- a/Doc/whatsnew/3.3.rst +++ b/Doc/whatsnew/3.3.rst @@ -399,9 +399,9 @@ The :mod:`time` module has new functions: * :func:`~time.clock_getres` and :func:`~time.clock_gettime` functions and - ``CLOCK_xxx`` constants. :func:`~time.clock_gettime` can be used with - :data:`time.CLOCK_MONOTONIC` to get a monotonic clock. -* :func:`~time.wallclock`: monotonic clock. + ``CLOCK_xxx`` constants. +* :func:`~time.monotonic`: monotonic clock. +* :func:`~time.wallclock`. (Contributed by Victor Stinner in :issue:`10278`) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Feb 8 01:48:02 2012 From: python-checkins at python.org (victor.stinner) Date: Wed, 08 Feb 2012 01:48:02 +0100 Subject: [Python-checkins] =?utf8?q?cpython=3A_What=27s_New_in_3=2E3=3A_re?= =?utf8?q?order_modules?= Message-ID: http://hg.python.org/cpython/rev/28bc03256b4b changeset: 74823:28bc03256b4b user: Victor Stinner date: Wed Feb 08 01:48:34 2012 +0100 summary: What's New in 3.3: reorder modules Remove also duplicate functions in the "os" module section files: Doc/whatsnew/3.3.rst | 152 ++++++++++++++++-------------- 1 files changed, 79 insertions(+), 73 deletions(-) diff --git a/Doc/whatsnew/3.3.rst b/Doc/whatsnew/3.3.rst --- a/Doc/whatsnew/3.3.rst +++ b/Doc/whatsnew/3.3.rst @@ -300,6 +300,23 @@ New and 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`) + array ----- @@ -368,23 +385,6 @@ (Contributed by I?igo Serna in :issue:`6755`) -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`) - faulthandler ------------ @@ -393,19 +393,6 @@ * :envvar:`PYTHONFAULTHANDLER` * :option:`-X` ``faulthandler`` -time ----- - -The :mod:`time` module has new functions: - -* :func:`~time.clock_getres` and :func:`~time.clock_gettime` functions and - ``CLOCK_xxx`` constants. -* :func:`~time.monotonic`: monotonic clock. -* :func:`~time.wallclock`. - -(Contributed by Victor Stinner in :issue:`10278`) - - ftplib ------ @@ -508,7 +495,6 @@ * :func:`~os.fchownat` * :func:`~os.fstatat` * :func:`~os.futimesat` - * :func:`~os.futimesat` * :func:`~os.linkat` * :func:`~os.mkdirat` * :func:`~os.mkfifoat` @@ -519,7 +505,6 @@ * :func:`~os.symlinkat` * :func:`~os.unlinkat` * :func:`~os.utimensat` - * :func:`~os.utimensat` * extended attributes (:issue:`12720`): @@ -553,12 +538,9 @@ * :func:`~os.fexecve` * :func:`~os.futimens` - * :func:`~os.futimens` - * :func:`~os.futimes` * :func:`~os.futimes` * :func:`~os.lockf` * :func:`~os.lutimes` - * :func:`~os.lutimes` * :func:`~os.posix_fadvise` * :func:`~os.posix_fallocate` * :func:`~os.pread` @@ -596,13 +578,43 @@ in Python 3.2. -sys ---- +sched +----- -* The :mod:`sys` module has a new :data:`~sys.thread_info` :term:`struct - sequence` holding informations about the thread implementation. +* :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`) - (:issue:`11223`) +* :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`) + + +shutil +------ + +* The :mod:`shutil` module has these new fuctions: + + * :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`) signal @@ -627,6 +639,16 @@ * :func:`signal.signal` and :func:`signal.siginterrupt` raise an OSError, instead of a RuntimeError: OSError has an errno attribute. +smtplib +------- + +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 ------ @@ -650,6 +672,7 @@ (http://en.wikipedia.org/wiki/Reliable_Datagram_Sockets and http://oss.oracle.com/projects/rds/). + ssl --- @@ -689,25 +712,27 @@ (Contributed by Antoine Pitrou in :issue:`13634`) -shutil ------- +sys +--- -* The :mod:`shutil` module has these new fuctions: +* The :mod:`sys` module has a new :data:`~sys.thread_info` :term:`struct + sequence` holding informations about the thread implementation. - * :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`) + (:issue:`11223`) -smtplib -------- -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. +time +---- -(Contributed by Kasun Herath in :issue:`8809`) +The :mod:`time` module has new functions: + +* :func:`~time.clock_getres` and :func:`~time.clock_gettime` functions and + ``CLOCK_xxx`` constants. +* :func:`~time.monotonic`: monotonic clock. +* :func:`~time.wallclock`. + +(Contributed by Victor Stinner in :issue:`10278`) + urllib ------ @@ -720,31 +745,6 @@ (:issue:`1673007`) -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`) Optimizations ============= -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Feb 8 03:00:42 2012 From: python-checkins at python.org (victor.stinner) Date: Wed, 08 Feb 2012 03:00:42 +0100 Subject: [Python-checkins] =?utf8?q?cpython=3A_Issue_=2313964=3A_Write_tes?= =?utf8?q?ts_for_new_os=2E*utime*=28=29_functions?= Message-ID: http://hg.python.org/cpython/rev/d297f9b10c64 changeset: 74824:d297f9b10c64 user: Victor Stinner date: Wed Feb 08 03:01:11 2012 +0100 summary: Issue #13964: Write tests for new os.*utime*() functions files: Lib/test/test_os.py | 37 +++++++++++++++++++++++++++++++++ 1 files changed, 37 insertions(+), 0 deletions(-) diff --git a/Lib/test/test_os.py b/Lib/test/test_os.py --- a/Lib/test/test_os.py +++ b/Lib/test/test_os.py @@ -300,6 +300,43 @@ st2 = os.stat(support.TESTFN) self.assertAlmostEqual(st1.st_mtime, st2.st_mtime, delta=10) + def test_utime_subsecond(self): + asec, amsec = 1, 901 + atime = asec + amsec * 1e-3 + msec, mmsec = 5, 901 + mtime = msec + mmsec * 1e-3 + filename = self.fname + dirname = os.path.dirname(filename) + for func in ('utime', 'futimes', 'futimens', 'lutimes', 'utimensat'): + if not hasattr(os, func): + continue + os.utime(filename, (0, 0)) + if func == 'utime': + os.utime(filename, (atime, mtime)) + elif func == 'futimes': + with open(filename, "wb") as f: + os.futimes(f.fileno(), (atime, mtime)) + os.utime(filename, (atime, mtime)) + elif func == 'futimens': + with open(filename, "wb") as f: + os.futimens(f.fileno(), + (asec, amsec * 1000000), + (msec, mmsec * 1000000)) + elif func == 'lutimes': + os.lutimes(filename, (atime, mtime)) + else: + dirfd = os.open(dirname, os.O_RDONLY) + try: + os.utimensat(dirfd, os.path.basename(filename), + (asec, amsec * 1000000), + (msec, mmsec * 1000000)) + finally: + os.close(dirfd) + st = os.stat(filename) + self.assertAlmostEqual(st.st_atime, atime, places=3) + self.assertAlmostEqual(st.st_mtime, mtime, places=3) + + # Restrict test to Win32, since there is no guarantee other # systems support centiseconds if sys.platform == 'win32': -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Feb 8 03:06:56 2012 From: python-checkins at python.org (victor.stinner) Date: Wed, 08 Feb 2012 03:06:56 +0100 Subject: [Python-checkins] =?utf8?q?cpython=3A_Issue_=2313964=3A_Test_also?= =?utf8?b?IG9zLmZ1dGltZXNhdCgp?= Message-ID: http://hg.python.org/cpython/rev/c6e9c4d18b36 changeset: 74825:c6e9c4d18b36 user: Victor Stinner date: Wed Feb 08 03:07:25 2012 +0100 summary: Issue #13964: Test also os.futimesat() files: Lib/test/test_os.py | 9 ++++++++- 1 files changed, 8 insertions(+), 1 deletions(-) diff --git a/Lib/test/test_os.py b/Lib/test/test_os.py --- a/Lib/test/test_os.py +++ b/Lib/test/test_os.py @@ -307,7 +307,7 @@ mtime = msec + mmsec * 1e-3 filename = self.fname dirname = os.path.dirname(filename) - for func in ('utime', 'futimes', 'futimens', 'lutimes', 'utimensat'): + for func in ('utime', 'futimes', 'futimens', 'futimesat', 'lutimes', 'utimensat'): if not hasattr(os, func): continue os.utime(filename, (0, 0)) @@ -324,6 +324,13 @@ (msec, mmsec * 1000000)) elif func == 'lutimes': os.lutimes(filename, (atime, mtime)) + elif func == 'futimesat': + dirfd = os.open(dirname, os.O_RDONLY) + try: + os.futimesat(dirfd, os.path.basename(filename), + (atime, mtime)) + finally: + os.close(dirfd) else: dirfd = os.open(dirname, os.O_RDONLY) try: -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Feb 8 03:35:52 2012 From: python-checkins at python.org (victor.stinner) Date: Wed, 08 Feb 2012 03:35:52 +0100 Subject: [Python-checkins] =?utf8?q?cpython=3A_Issue_=2313964=3A_Split_os?= =?utf8?q?=2E*utime*=28=29_subsecond_tests_into_multiple_tests_to_help?= Message-ID: http://hg.python.org/cpython/rev/478fb4869c99 changeset: 74826:478fb4869c99 user: Victor Stinner date: Wed Feb 08 03:36:25 2012 +0100 summary: Issue #13964: Split os.*utime*() subsecond tests into multiple tests to help debugging files: Lib/test/test_os.py | 113 ++++++++++++++++++--------- Modules/posixmodule.c | 122 +++++++++++------------------ 2 files changed, 120 insertions(+), 115 deletions(-) diff --git a/Lib/test/test_os.py b/Lib/test/test_os.py --- a/Lib/test/test_os.py +++ b/Lib/test/test_os.py @@ -300,49 +300,86 @@ st2 = os.stat(support.TESTFN) self.assertAlmostEqual(st1.st_mtime, st2.st_mtime, delta=10) - def test_utime_subsecond(self): + def _test_utime_subsecond(self, set_time_func): asec, amsec = 1, 901 atime = asec + amsec * 1e-3 - msec, mmsec = 5, 901 + msec, mmsec = 2, 901 mtime = msec + mmsec * 1e-3 filename = self.fname - dirname = os.path.dirname(filename) - for func in ('utime', 'futimes', 'futimens', 'futimesat', 'lutimes', 'utimensat'): - if not hasattr(os, func): - continue - os.utime(filename, (0, 0)) - if func == 'utime': - os.utime(filename, (atime, mtime)) - elif func == 'futimes': - with open(filename, "wb") as f: - os.futimes(f.fileno(), (atime, mtime)) - os.utime(filename, (atime, mtime)) - elif func == 'futimens': - with open(filename, "wb") as f: - os.futimens(f.fileno(), - (asec, amsec * 1000000), - (msec, mmsec * 1000000)) - elif func == 'lutimes': - os.lutimes(filename, (atime, mtime)) - elif func == 'futimesat': - dirfd = os.open(dirname, os.O_RDONLY) - try: - os.futimesat(dirfd, os.path.basename(filename), - (atime, mtime)) - finally: - os.close(dirfd) - else: - dirfd = os.open(dirname, os.O_RDONLY) - try: - os.utimensat(dirfd, os.path.basename(filename), - (asec, amsec * 1000000), - (msec, mmsec * 1000000)) - finally: - os.close(dirfd) - st = os.stat(filename) - self.assertAlmostEqual(st.st_atime, atime, places=3) - self.assertAlmostEqual(st.st_mtime, mtime, places=3) + os.utime(filename, (0, 0)) + set_time_func(filename, atime, mtime) + 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) + + @unittest.skipUnless(hasattr(os, 'futimes'), + "os.futimes required for this test.") + def test_futimes_subsecond(self): + def set_time(filename, atime, mtime): + with open(filename, "wb") as f: + os.futimes(f.fileno(), (atime, mtime)) + self._test_utime_subsecond(set_time) + + @unittest.skipUnless(hasattr(os, 'futimens'), + "os.futimens required for this test.") + def test_futimens_subsecond(self): + def set_time(filename, atime, mtime): + with open(filename, "wb") as f: + asec, ansec = divmod(atime, 1.0) + asec = int(asec) + ansec = int(ansec * 1e9) + msec, mnsec = divmod(mtime, 1.0) + msec = int(msec) + mnsec = int(mnsec * 1e9) + os.futimens(f.fileno(), + (asec, ansec), + (msec, mnsec)) + self._test_utime_subsecond(set_time) + + @unittest.skipUnless(hasattr(os, 'futimesat'), + "os.futimesat required for this test.") + 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.futimesat(dirfd, os.path.basename(filename), + (atime, mtime)) + finally: + os.close(dirfd) + self._test_utime_subsecond(set_time) + + @unittest.skipUnless(hasattr(os, 'lutimes'), + "os.lutimes required for this test.") + def test_lutimes_subsecond(self): + def set_time(filename, atime, mtime): + os.lutimes(filename, (atime, mtime)) + self._test_utime_subsecond(set_time) + + @unittest.skipUnless(hasattr(os, 'utimensat'), + "os.utimensat required for this test.") + def test_utimensat_subsecond(self): + def set_time(filename, atime, mtime): + dirname = os.path.dirname(filename) + dirfd = os.open(dirname, os.O_RDONLY) + try: + asec, ansec = divmod(atime, 1.0) + asec = int(asec) + ansec = int(ansec * 1e9) + msec, mnsec = divmod(mtime, 1.0) + msec = int(msec) + mnsec = int(mnsec * 1e9) + os.utimensat(dirfd, os.path.basename(filename), + (asec, ansec), + (msec, mnsec)) + finally: + os.close(dirfd) + self._test_utime_subsecond(set_time) # Restrict test to Win32, since there is no guarantee other # systems support centiseconds diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c --- a/Modules/posixmodule.c +++ b/Modules/posixmodule.c @@ -187,6 +187,9 @@ #endif /* ! __WATCOMC__ || __QNX__ */ #endif /* ! __IBMC__ */ + + + #ifndef _MSC_VER #if defined(__sgi)&&_COMPILER_VERSION>=700 @@ -3525,53 +3528,18 @@ #endif /* HAVE_UNAME */ -/* - * Classic POSIX utime functions supported microseconds (1m/sec). - * Newer POSIX functions support nanoseconds (1 billion per sec). - * posixmodule now uses the new functions where possible. - * This improves accuracy in many situations, for example shutil.copy2(). - * - * The implementation isn't currently sophisticated enough to handle - * a platform where HAVE_UTIMENSAT is true but HAVE_FUTIMENS is false. - * Specifically, posix_futimes() would break. - * - * Supporting such a platform wouldn't be impossible; you'd need two - * extract_time() functions, or make its precision a parameter. - * Since such a platform seems unlikely we haven't bothered. - */ -#if defined(HAVE_UTIMENSAT) -#define EXTRACT_TIME_PRECISION (1e9) -#if !defined(HAVE_FUTIMENS) -#error You HAVE_UTIMENSAT but not HAVE_FUTIMENS... please see accompanying comment. -#endif -#else -#define EXTRACT_TIME_PRECISION (1e6) -#endif - static int -extract_time(PyObject *t, time_t* sec, long* usec) +extract_time(PyObject *t, time_t* sec, long* nsec) { 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); -#else - intval = PyLong_AsLong(intobj); -#endif - Py_DECREF(intobj); - if (intval == -1 && PyErr_Occurred()) - return -1; - *sec = intval; - - *usec = (long)((tval - intval) * EXTRACT_TIME_PRECISION); - if (*usec < 0) - /* If rounding gave us a negative number, - truncate. */ - *usec = 0; + double d = PyFloat_AsDouble(t); + double mod; + *sec = (time_t)d; + mod = fmod(d, 1.0); + mod *= 1e9; + *nsec = (long)mod; + printf("%g => (%u, %li)\n", d, *sec, *nsec); return 0; } #if SIZEOF_TIME_T > SIZEOF_LONG @@ -3582,7 +3550,7 @@ if (intval == -1 && PyErr_Occurred()) return -1; *sec = intval; - *usec = 0; + *nsec = 0; return 0; } @@ -3602,7 +3570,7 @@ const char *apath; HANDLE hFile; time_t atimesec, mtimesec; - long ausec, musec; + long ansec, mnsec; FILETIME atime, mtime; PyObject *result = NULL; @@ -3655,13 +3623,13 @@ } else { if (extract_time(PyTuple_GET_ITEM(arg, 0), - &atimesec, &ausec) == -1) + &atimesec, &ansec) == -1) goto done; - time_t_to_FILE_TIME(atimesec, 1000*ausec, &atime); + time_t_to_FILE_TIME(atimesec, ansec, &atime); if (extract_time(PyTuple_GET_ITEM(arg, 1), - &mtimesec, &musec) == -1) + &mtimesec, &mnsec) == -1) goto done; - time_t_to_FILE_TIME(mtimesec, 1000*musec, &mtime); + time_t_to_FILE_TIME(mtimesec, mnsec, &mtime); } if (!SetFileTime(hFile, NULL, &atime, &mtime)) { /* Avoid putting the file name into the error here, @@ -3681,7 +3649,7 @@ PyObject *opath; char *path; time_t atime, mtime; - long ausec, musec; + long ansec, mnsec; int res; PyObject* arg = Py_None; @@ -3703,12 +3671,12 @@ } else { if (extract_time(PyTuple_GET_ITEM(arg, 0), - &atime, &ausec) == -1) { + &atime, &ansec) == -1) { Py_DECREF(opath); return NULL; } if (extract_time(PyTuple_GET_ITEM(arg, 1), - &mtime, &musec) == -1) { + &mtime, &mnsec) == -1) { Py_DECREF(opath); return NULL; } @@ -3718,16 +3686,16 @@ #ifdef HAVE_UTIMENSAT struct timespec buf[2]; buf[0].tv_sec = atime; - buf[0].tv_nsec = ausec; + buf[0].tv_nsec = ansec; buf[1].tv_sec = mtime; - buf[1].tv_nsec = musec; + buf[1].tv_nsec = mnsec; res = utimensat(AT_FDCWD, path, buf, 0); #elif defined(HAVE_UTIMES) struct timeval buf[2]; buf[0].tv_sec = atime; - buf[0].tv_usec = ausec; + buf[0].tv_usec = ansec / 1000; buf[1].tv_sec = mtime; - buf[1].tv_usec = musec; + buf[1].tv_usec = mnsec / 1000; res = utimes(path, buf); #elif defined(HAVE_UTIME_H) /* XXX should define struct utimbuf instead, above */ @@ -3767,7 +3735,7 @@ int res, fd; PyObject* arg = Py_None; time_t atime, mtime; - long ausec, musec; + long ansec, mnsec; if (!PyArg_ParseTuple(args, "i|O:futimes", &fd, &arg)) return NULL; @@ -3785,11 +3753,11 @@ } else { if (extract_time(PyTuple_GET_ITEM(arg, 0), - &atime, &ausec) == -1) { + &atime, &ansec) == -1) { return NULL; } if (extract_time(PyTuple_GET_ITEM(arg, 1), - &mtime, &musec) == -1) { + &mtime, &mnsec) == -1) { return NULL; } Py_BEGIN_ALLOW_THREADS @@ -3797,16 +3765,16 @@ #ifdef HAVE_FUTIMENS struct timespec buf[2]; buf[0].tv_sec = atime; - buf[0].tv_nsec = ausec; + buf[0].tv_nsec = ansec; buf[1].tv_sec = mtime; - buf[1].tv_nsec = musec; + buf[1].tv_nsec = mnsec; res = futimens(fd, buf); #else struct timeval buf[2]; buf[0].tv_sec = atime; - buf[0].tv_usec = ausec; + buf[0].tv_usec = ansec / 1000; buf[1].tv_sec = mtime; - buf[1].tv_usec = musec; + buf[1].tv_usec = mnsec / 1000; res = futimes(fd, buf); #endif } @@ -3831,7 +3799,7 @@ const char *path; int res; time_t atime, mtime; - long ausec, musec; + long ansec, mnsec; if (!PyArg_ParseTuple(args, "O&|O:lutimes", PyUnicode_FSConverter, &opath, &arg)) @@ -3851,12 +3819,12 @@ } else { if (extract_time(PyTuple_GET_ITEM(arg, 0), - &atime, &ausec) == -1) { + &atime, &ansec) == -1) { Py_DECREF(opath); return NULL; } if (extract_time(PyTuple_GET_ITEM(arg, 1), - &mtime, &musec) == -1) { + &mtime, &mnsec) == -1) { Py_DECREF(opath); return NULL; } @@ -3865,16 +3833,16 @@ #ifdef HAVE_UTIMENSAT struct timespec buf[2]; buf[0].tv_sec = atime; - buf[0].tv_nsec = ausec; + buf[0].tv_nsec = ansec; buf[1].tv_sec = mtime; - buf[1].tv_nsec = musec; + buf[1].tv_nsec = mnsec; res = utimensat(AT_FDCWD, path, buf, AT_SYMLINK_NOFOLLOW); #else struct timeval buf[2]; buf[0].tv_sec = atime; - buf[0].tv_usec = ausec; + buf[0].tv_usec = ansec / 1000; buf[1].tv_sec = mtime; - buf[1].tv_usec = musec; + buf[1].tv_usec = mnsec / 1000; res = lutimes(path, buf); #endif } @@ -9712,7 +9680,7 @@ int res, dirfd; PyObject* arg = Py_None; time_t atime, mtime; - long ausec, musec; + long ansec, mnsec; if (!PyArg_ParseTuple(args, "iO&|O:futimesat", &dirfd, PyUnicode_FSConverter, &opath, &arg)) @@ -9732,12 +9700,12 @@ } else { if (extract_time(PyTuple_GET_ITEM(arg, 0), - &atime, &ausec) == -1) { + &atime, &ansec) == -1) { Py_DECREF(opath); return NULL; } if (extract_time(PyTuple_GET_ITEM(arg, 1), - &mtime, &musec) == -1) { + &mtime, &mnsec) == -1) { Py_DECREF(opath); return NULL; } @@ -9747,16 +9715,16 @@ #ifdef HAVE_UTIMENSAT struct timespec buf[2]; buf[0].tv_sec = atime; - buf[0].tv_nsec = ausec; + buf[0].tv_nsec = ansec; buf[1].tv_sec = mtime; - buf[1].tv_nsec = musec; + buf[1].tv_nsec = mnsec; res = utimensat(dirfd, path, buf, 0); #else struct timeval buf[2]; buf[0].tv_sec = atime; - buf[0].tv_usec = ausec; + buf[0].tv_usec = ansec / 1000; buf[1].tv_sec = mtime; - buf[1].tv_usec = musec; + buf[1].tv_usec = mnsec / 1000; res = futimesat(dirfd, path, buf); #endif } -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Feb 8 04:09:13 2012 From: python-checkins at python.org (victor.stinner) Date: Wed, 08 Feb 2012 04:09:13 +0100 Subject: [Python-checkins] =?utf8?q?cpython=3A_Issue_=2313964=3A_Skip_os?= =?utf8?q?=2E*utime*=28=29_tests_if_os=2Estat=28=29_doesn=27t_support_time?= =?utf8?q?stamp?= Message-ID: http://hg.python.org/cpython/rev/58bd6a58365d changeset: 74827:58bd6a58365d user: Victor Stinner date: Wed Feb 08 04:09:37 2012 +0100 summary: Issue #13964: Skip os.*utime*() tests if os.stat() doesn't support timestamp with a subsecond resolution files: Lib/test/test_os.py | 11 +++++++++++ Modules/posixmodule.c | 1 - 2 files changed, 11 insertions(+), 1 deletions(-) diff --git a/Lib/test/test_os.py b/Lib/test/test_os.py --- a/Lib/test/test_os.py +++ b/Lib/test/test_os.py @@ -27,6 +27,14 @@ except ImportError: threading = None +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 @@ -300,6 +308,8 @@ st2 = os.stat(support.TESTFN) self.assertAlmostEqual(st1.st_mtime, st2.st_mtime, delta=10) + @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 @@ -308,6 +318,7 @@ filename = self.fname os.utime(filename, (0, 0)) set_time_func(filename, atime, mtime) + 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) diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c --- a/Modules/posixmodule.c +++ b/Modules/posixmodule.c @@ -3539,7 +3539,6 @@ mod = fmod(d, 1.0); mod *= 1e9; *nsec = (long)mod; - printf("%g => (%u, %li)\n", d, *sec, *nsec); return 0; } #if SIZEOF_TIME_T > SIZEOF_LONG -- Repository URL: http://hg.python.org/cpython From solipsis at pitrou.net Wed Feb 8 05:32:49 2012 From: solipsis at pitrou.net (solipsis at pitrou.net) Date: Wed, 08 Feb 2012 05:32:49 +0100 Subject: [Python-checkins] Daily reference leaks (c6e9c4d18b36): sum=888 Message-ID: results for c6e9c4d18b36 on branch "default" -------------------------------------------- test_capi leaked [296, 296, 296] references, sum=888 Command line was: ['./python', '-m', 'test.regrtest', '-uall', '-R', '3:3:/home/antoine/cpython/refleaks/reflog9R0EMN', '-x'] From ncoghlan at gmail.com Wed Feb 8 13:46:59 2012 From: ncoghlan at gmail.com (Nick Coghlan) Date: Wed, 8 Feb 2012 22:46:59 +1000 Subject: [Python-checkins] Daily reference leaks (140f7de4d2a5): sum=888 In-Reply-To: References: Message-ID: On Tue, Feb 7, 2012 at 2:34 PM, wrote: > results for 140f7de4d2a5 on branch "default" > -------------------------------------------- > > test_capi leaked [296, 296, 296] references, sum=888 This appears to have started shortly after Benjamin's _PyExc_Init bltinmod refcounting change to fix Brett's crash when bootstrapping importlib. Perhaps we have a leak in import.c that was being masked by the DECREF in _PyExc_Init? Cheers, Nick. -- Nick Coghlan?? |?? ncoghlan at gmail.com?? |?? Brisbane, Australia From benjamin at python.org Wed Feb 8 14:11:46 2012 From: benjamin at python.org (Benjamin Peterson) Date: Wed, 8 Feb 2012 08:11:46 -0500 Subject: [Python-checkins] Daily reference leaks (140f7de4d2a5): sum=888 In-Reply-To: References: Message-ID: 2012/2/8 Nick Coghlan : > On Tue, Feb 7, 2012 at 2:34 PM, ? wrote: >> results for 140f7de4d2a5 on branch "default" >> -------------------------------------------- >> >> test_capi leaked [296, 296, 296] references, sum=888 > > This appears to have started shortly after Benjamin's _PyExc_Init > bltinmod refcounting change to fix Brett's crash when bootstrapping > importlib. Perhaps we have a leak in import.c that was being masked by > the DECREF in _PyExc_Init? According to test_capi, it's expected to leak? -- Regards, Benjamin From solipsis at pitrou.net Wed Feb 8 14:34:09 2012 From: solipsis at pitrou.net (Antoine Pitrou) Date: Wed, 8 Feb 2012 14:34:09 +0100 Subject: [Python-checkins] Daily reference leaks (140f7de4d2a5): sum=888 References: Message-ID: <20120208143409.7f5bee49@pitrou.net> On Wed, 8 Feb 2012 08:11:46 -0500 Benjamin Peterson wrote: > 2012/2/8 Nick Coghlan : > > On Tue, Feb 7, 2012 at 2:34 PM, ? wrote: > >> results for 140f7de4d2a5 on branch "default" > >> -------------------------------------------- > >> > >> test_capi leaked [296, 296, 296] references, sum=888 > > > > This appears to have started shortly after Benjamin's _PyExc_Init > > bltinmod refcounting change to fix Brett's crash when bootstrapping > > importlib. Perhaps we have a leak in import.c that was being masked by > > the DECREF in _PyExc_Init? > > According to test_capi, it's expected to leak? Hmm... It was expected to leak until I fixed it. That comment should be obsolete actually. Regards Antoine. From python-checkins at python.org Wed Feb 8 21:16:23 2012 From: python-checkins at python.org (charles-francois.natali) Date: Wed, 08 Feb 2012 21:16:23 +0100 Subject: [Python-checkins] =?utf8?q?cpython=3A_Issue_=238184=3A_multiproce?= =?utf8?q?ssing=3A_On_Windows=2C_don=27t_set_SO=5FREUSEADDR_on_Connection?= Message-ID: http://hg.python.org/cpython/rev/434301d9f664 changeset: 74828:434301d9f664 user: Charles-Fran?ois Natali date: Wed Feb 08 21:15:58 2012 +0100 summary: 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). files: Lib/multiprocessing/connection.py | 11 ++++++-- Lib/test/test_multiprocessing.py | 12 ++++++++++ Misc/NEWS | 5 ++++ Modules/_multiprocessing/win32_functions.c | 1 + 4 files changed, 26 insertions(+), 3 deletions(-) diff --git a/Lib/multiprocessing/connection.py b/Lib/multiprocessing/connection.py --- a/Lib/multiprocessing/connection.py +++ b/Lib/multiprocessing/connection.py @@ -544,7 +544,8 @@ obsize, ibsize = 0, BUFSIZE h1 = win32.CreateNamedPipe( - address, openmode | win32.FILE_FLAG_OVERLAPPED, + address, openmode | win32.FILE_FLAG_OVERLAPPED | + win32.FILE_FLAG_FIRST_PIPE_INSTANCE, win32.PIPE_TYPE_MESSAGE | win32.PIPE_READMODE_MESSAGE | win32.PIPE_WAIT, 1, obsize, ibsize, win32.NMPWAIT_WAIT_FOREVER, win32.NULL @@ -576,7 +577,10 @@ 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.bind(address) self._socket.listen(backlog) self._address = self._socket.getsockname() @@ -630,7 +634,8 @@ def __init__(self, address, backlog=None): self._address = address handle = win32.CreateNamedPipe( - address, win32.PIPE_ACCESS_DUPLEX, + address, win32.PIPE_ACCESS_DUPLEX | + win32.FILE_FLAG_FIRST_PIPE_INSTANCE, win32.PIPE_TYPE_MESSAGE | win32.PIPE_READMODE_MESSAGE | win32.PIPE_WAIT, win32.PIPE_UNLIMITED_INSTANCES, BUFSIZE, BUFSIZE, diff --git a/Lib/test/test_multiprocessing.py b/Lib/test/test_multiprocessing.py --- a/Lib/test/test_multiprocessing.py +++ b/Lib/test/test_multiprocessing.py @@ -1779,6 +1779,17 @@ self.assertRaises(RuntimeError, reduction.recv_handle, conn) p.join() +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) + class _TestListenerClient(BaseTestCase): ALLOWED_TYPES = ('processes', 'threads') @@ -1799,6 +1810,7 @@ self.assertEqual(conn.recv(), 'hello') p.join() l.close() + # # Test of sending connection and socket objects between processes # diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -472,6 +472,11 @@ - Issue #13846: Add time.monotonic(), monotonic clock. +- 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 #10811: Fix recursive usage of cursors. Instead of crashing, raise a ProgrammingError now. diff --git a/Modules/_multiprocessing/win32_functions.c b/Modules/_multiprocessing/win32_functions.c --- a/Modules/_multiprocessing/win32_functions.c +++ b/Modules/_multiprocessing/win32_functions.c @@ -784,6 +784,7 @@ 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, FILE_FLAG_FIRST_PIPE_INSTANCE); WIN32_CONSTANT(F_DWORD, FILE_FLAG_OVERLAPPED); WIN32_CONSTANT(F_DWORD, GENERIC_READ); WIN32_CONSTANT(F_DWORD, GENERIC_WRITE); -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Feb 8 21:30:34 2012 From: python-checkins at python.org (charles-francois.natali) Date: Wed, 08 Feb 2012 21:30:34 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=282=2E7=29=3A_Skip_test=5Fthr?= =?utf8?q?eading=2Etest=5Freinit=5Ftls=5Fafter=5Ffork=28=29_on_platforms_w?= =?utf8?q?here_fork=28=29?= Message-ID: http://hg.python.org/cpython/rev/a47f97bd3c33 changeset: 74829:a47f97bd3c33 branch: 2.7 parent: 74811:631e99961c5f user: Charles-Fran?ois Natali date: Wed Feb 08 21:27:56 2012 +0100 summary: Skip test_threading.test_reinit_tls_after_fork() on platforms where fork() can't be called reliably from a worker thread. files: Lib/test/test_threading.py | 1 + 1 files changed, 1 insertions(+), 0 deletions(-) diff --git a/Lib/test/test_threading.py b/Lib/test/test_threading.py --- a/Lib/test/test_threading.py +++ b/Lib/test/test_threading.py @@ -636,6 +636,7 @@ self.assertScriptHasOutput(script, output) @unittest.skipUnless(hasattr(os, 'fork'), "needs os.fork()") + @unittest.skipIf(sys.platform in platforms_to_skip, "due to known OS bug") def test_reinit_tls_after_fork(self): # Issue #13817: fork() would deadlock in a multithreaded program with # the ad-hoc TLS implementation. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Feb 8 21:30:34 2012 From: python-checkins at python.org (charles-francois.natali) Date: Wed, 08 Feb 2012 21:30:34 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=283=2E2=29=3A_Skip_test=5Fthr?= =?utf8?q?eading=2Etest=5Freinit=5Ftls=5Fafter=5Ffork=28=29_on_platforms_w?= =?utf8?q?here_fork=28=29?= Message-ID: http://hg.python.org/cpython/rev/29b83d3d40d0 changeset: 74830:29b83d3d40d0 branch: 3.2 parent: 74814:6b951f27f6a8 user: Charles-Fran?ois Natali date: Wed Feb 08 21:29:11 2012 +0100 summary: Skip test_threading.test_reinit_tls_after_fork() on platforms where fork() can't be called reliably from a worker thread. files: Lib/test/test_threading.py | 1 + 1 files changed, 1 insertions(+), 0 deletions(-) diff --git a/Lib/test/test_threading.py b/Lib/test/test_threading.py --- a/Lib/test/test_threading.py +++ b/Lib/test/test_threading.py @@ -667,6 +667,7 @@ self.assertFalse(err) @unittest.skipUnless(hasattr(os, 'fork'), "needs os.fork()") + @unittest.skipIf(sys.platform in platforms_to_skip, "due to known OS bug") def test_reinit_tls_after_fork(self): # Issue #13817: fork() would deadlock in a multithreaded program with # the ad-hoc TLS implementation. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Feb 8 21:30:35 2012 From: python-checkins at python.org (charles-francois.natali) Date: Wed, 08 Feb 2012 21:30:35 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_3=2E2_-=3E_default=29?= =?utf8?q?=3A_Skip_test=5Fthreading=2Etest=5Freinit=5Ftls=5Fafter=5Ffork?= =?utf8?q?=28=29_on_platforms_where_fork=28=29?= Message-ID: http://hg.python.org/cpython/rev/ca377b89ab6b changeset: 74831:ca377b89ab6b parent: 74828:434301d9f664 parent: 74830:29b83d3d40d0 user: Charles-Fran?ois Natali date: Wed Feb 08 21:30:02 2012 +0100 summary: Skip test_threading.test_reinit_tls_after_fork() on platforms where fork() can't be called reliably from a worker thread. files: Lib/test/test_threading.py | 1 + 1 files changed, 1 insertions(+), 0 deletions(-) diff --git a/Lib/test/test_threading.py b/Lib/test/test_threading.py --- a/Lib/test/test_threading.py +++ b/Lib/test/test_threading.py @@ -675,6 +675,7 @@ self.assertFalse(err) @unittest.skipUnless(hasattr(os, 'fork'), "needs os.fork()") + @unittest.skipIf(sys.platform in platforms_to_skip, "due to known OS bug") def test_reinit_tls_after_fork(self): # Issue #13817: fork() would deadlock in a multithreaded program with # the ad-hoc TLS implementation. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Feb 8 22:52:45 2012 From: python-checkins at python.org (victor.stinner) Date: Wed, 08 Feb 2012 22:52:45 +0100 Subject: [Python-checkins] =?utf8?q?cpython=3A_PEP_410?= Message-ID: http://hg.python.org/cpython/rev/f8409b3d6449 changeset: 74832:f8409b3d6449 user: Victor Stinner date: Wed Feb 08 14:31:50 2012 +0100 summary: PEP 410 files: Doc/library/os.rst | 43 +++- Doc/library/time.rst | 50 +++- Doc/whatsnew/3.3.rst | 36 +++ Include/pytime.h | 28 ++- Lib/test/test_os.py | 31 ++ Lib/test/test_time.py | 33 ++- Modules/posixmodule.c | 207 +++++++++++------ Modules/timemodule.c | 241 ++++++++++++++------ Python/pytime.c | 345 ++++++++++++++++++++++++++++- 9 files changed, 827 insertions(+), 187 deletions(-) diff --git a/Doc/library/os.rst b/Doc/library/os.rst --- a/Doc/library/os.rst +++ b/Doc/library/os.rst @@ -808,13 +808,16 @@ Availability: Unix. -.. function:: fstat(fd) +.. function:: fstat(fd, timestamp=None) Return status for file descriptor *fd*, like :func:`~os.stat`. Availability: Unix, Windows. -.. function:: fstatat(dirfd, path, flags=0) + .. versionchanged:: 3.3 + Added the *timestamp* argument. + +.. function:: fstatat(dirfd, path, flags=0, timestamp="float") Like :func:`stat` but if *path* is relative, it is taken as relative to *dirfd*. *flags* is optional and may be 0 or :data:`AT_SYMLINK_NOFOLLOW`. @@ -1696,7 +1699,7 @@ .. versionadded:: 3.3 -.. function:: lstat(path) +.. function:: lstat(path, timestamp=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 @@ -1706,6 +1709,9 @@ .. versionchanged:: 3.2 Added support for Windows 6.0 (Vista) symbolic links. + .. versionchanged:: 3.3 + The *timestamp* argument was added. + .. function:: lutimes(path[, times]) @@ -1969,7 +1975,7 @@ .. versionadded:: 3.3 -.. function:: stat(path) +.. function:: stat(path, timestamp=None) 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`.) @@ -1989,6 +1995,11 @@ * :attr:`st_ctime` - platform dependent; time of most recent metadata change on Unix, or the time of creation on Windows) + :attr:`st_atime`, :attr:`st_mtime` and :attr:`st_ctime` are :class:`float` + by default, or :class:`int` if :func:`os.stat_float_times` is ``False``. Set + the *timestamp* argument to get another :ref:`timestamp type + `. + On some Unix systems (such as Linux), the following attributes may also be available: @@ -2044,6 +2055,9 @@ Availability: Unix, Windows. + .. versionchanged:: 3.3 + Added the *timestamp* argument. + .. function:: stat_float_times([newvalue]) @@ -2069,6 +2083,9 @@ are processed, this application should turn the feature off until the library has been corrected. + .. deprecated:: 3.3 + Use *timestamp* argument of stat functions instead. + .. function:: statvfs(path) @@ -2859,27 +2876,39 @@ with :const:`P_NOWAIT` return suitable process handles. -.. function:: wait3([options]) +.. function:: wait3(options[, timestamp=float]) Similar to :func:`waitpid`, except no process id argument is given and a 3-element tuple containing the child's process id, exit status indication, and resource usage information is returned. Refer to :mod:`resource`.\ :func:`getrusage` for details on resource usage information. The option argument is the same as that provided to :func:`waitpid` and :func:`wait4`. + :attr:`ru_utime` and :attr:`ru_stime` attributes of the resource usage are + :class:`float` by default, set the *timestamp* argument to get another + :ref:`timestamp type `. Availability: Unix. - -.. function:: wait4(pid, options) + .. versionchanged:: 3.3 + Added the *timestamp* argument. + + +.. function:: wait4(pid, options[, timestamp=float]) Similar to :func:`waitpid`, except a 3-element tuple, containing the child's process id, exit status indication, and resource usage information is returned. Refer to :mod:`resource`.\ :func:`getrusage` for details on resource usage information. The arguments to :func:`wait4` are the same as those provided to :func:`waitpid`. + :attr:`ru_utime` and :attr:`ru_stime` attributes of the resource usage are + :class:`float` by default, set the *timestamp* argument to get another + :ref:`timestamp type `. Availability: Unix. + .. versionchanged:: 3.3 + Added the *timestamp* argument. + .. data:: WNOHANG diff --git a/Doc/library/time.rst b/Doc/library/time.rst --- a/Doc/library/time.rst +++ b/Doc/library/time.rst @@ -95,6 +95,14 @@ | local time | | | +-------------------------+-------------------------+-------------------------+ +.. _timestamp-types: + +* Python supports the following timestamp types: + + * :class:`int` + * :class:`float` + * :class:`decimal.Decimal` + The module defines the following functions and data items: @@ -119,7 +127,7 @@ trailing newline. -.. function:: clock() +.. function:: clock(timestamp=float) .. index:: single: CPU time @@ -136,16 +144,27 @@ :c:func:`QueryPerformanceCounter`. The resolution is typically better than one microsecond. + Return as a floating point number by default, set the *timestamp* argument + to get another :ref:`timestamp type `. -.. function:: clock_getres(clk_id) + .. versionchanged:: 3.3 + Added the *timestamp* argument. + + +.. function:: clock_getres(clk_id, timestamp=float) Return the resolution (precision) of the specified clock *clk_id*. + Return a floating point number by default, set the *timestamp* argument to + get another :ref:`timestamp type `. + .. versionadded:: 3.3 -.. function:: clock_gettime(clk_id) +.. function:: clock_gettime(clk_id, timestamp=float) Return the time of the specified clock *clk_id*. + Return a floating point number by default, set the *timestamp* argument to + get another :ref:`timestamp type `. .. versionadded:: 3.3 @@ -214,19 +233,22 @@ flag is set to ``1`` when DST applies to the given time. -.. function:: mktime(t) +.. function:: mktime(t, timestamp=float) This is the inverse function of :func:`localtime`. Its argument is the :class:`struct_time` or full 9-tuple (since the dst flag is needed; use ``-1`` as the dst flag if it is unknown) which expresses the time in *local* time, not - UTC. It returns a floating point number, for compatibility with :func:`time`. + It returns a floating point number by default, for compatibility with + :func:`time`, set the *timestamp* argument to get another :ref:`timestamp + type `. + If the input value cannot be represented as a valid time, either :exc:`OverflowError` or :exc:`ValueError` will be raised (which depends on whether the invalid value is caught by Python or the underlying C libraries). The earliest date for which it can generate a time is platform-dependent. -.. function:: monotonic() +.. function:: monotonic(timestamp=float) Monotonic clock. The reference point of the returned value is undefined so only the difference of consecutive calls is valid. @@ -440,15 +462,20 @@ :exc:`TypeError` is raised. -.. function:: time() +.. function:: time(timestamp=float) - Return the time as a floating point number expressed in seconds since the epoch, - in UTC. Note that even though the time is always returned as a floating point + Return the time expressed in seconds since the epoch in UTC. Return a + floating point number by default, set the *timestamp* argument to get + another :ref:`timestamp type `. + Note that even though the time is always returned as a floating point number, not all systems provide time with a better precision than 1 second. While this function normally returns non-decreasing values, it can return a lower value than a previous call if the system clock has been set back between the two calls. + .. versionchanged:: 3.3 + Added the *timestamp* argument. + .. data:: timezone @@ -546,13 +573,16 @@ ('EET', 'EEST') -.. function:: wallclock() +.. function:: wallclock(timestamp=float) .. index:: single: Wallclock single: benchmarking Return the current time in fractions of a second to the system's best ability. + Return a floating point number by default, set the *timestamp* argument to + get another :ref:`timestamp type `. + Use this when the most accurate representation of wall-clock is required, i.e. when "processor time" is inappropriate. The reference point of the returned value is undefined so only the difference of consecutive calls is valid. diff --git a/Doc/whatsnew/3.3.rst b/Doc/whatsnew/3.3.rst --- a/Doc/whatsnew/3.3.rst +++ b/Doc/whatsnew/3.3.rst @@ -270,6 +270,42 @@ '' +PEP 410: Use decimal.Decimal type for timestamps +================================================ + +:pep:`410` - Use decimal.Decimal type for timestamps + PEP written and implemented by Victor Stinner. + +The following functions have a new optional *timestamp* argument to get a +timestamp as a :class:`decimal.Decimal` instead of :class:`int` or +:class:`float`: + + * :mod:`time` module: :func:`~time.clock`, :func:`~time.clock_gettime`, + :func:`~time.clock_getres`, :func:`~time.monotonic`, :func:`~time.time` and + :func:`~time.wallclock` + * :mod:`os` module: :func:`~os.fstat`, :func:`~os.fstatat`, :func:`~os.lstat` + and :func:`~os.stat` (``st_atime``, ``st_ctime`` and ``st_mtime`` fields of + the stat structure) + +:class:`decimal.Decimal` supports a resolution of a nanosecond (10^-9) +resolution, whereas :class:`float` has only a resolution of a microsecond +(10^-6) in common cases. See the list of available :ref:`timestamp types +`. + +Example:: + + >>> import decimal, time + >>> time.time() + 1328006975.681211 + >>> time.time(timestamp=int) + 1328006979 + >>> time.time(timestamp=decimal.Decimal) + Decimal('1328006983.761119') + +:func:`os.stat_float_times` has been deprecated, use *timestamp* argument of +`os.stat` instead. + + Other Language Changes ====================== diff --git a/Include/pytime.h b/Include/pytime.h --- a/Include/pytime.h +++ b/Include/pytime.h @@ -2,7 +2,8 @@ #ifndef Py_PYTIME_H #define Py_PYTIME_H -#include "pyconfig.h" /* include for defines */ +#include "pyport.h" +#include "object.h" /************************************************************************** Symbols and macros to supply platform-independent interfaces to time related @@ -37,6 +38,31 @@ ((tv_end.tv_sec - tv_start.tv_sec) + \ (tv_end.tv_usec - tv_start.tv_usec) * 0.000001) +#if defined(HAVE_LONG_LONG) +typedef unsigned PY_LONG_LONG _PyTime_fraction_t; +#else +typedef size_t _PyTime_fraction_t; +#endif + +typedef struct +{ + /* timestamp = seconds + numerator / denominator */ + time_t seconds; + _PyTime_fraction_t numerator; + /* denominator cannot be zero */ + _PyTime_fraction_t denominator; + /* the timestamp resolution is 1/divisor */ +} _PyTime_t; + +/* Similar to POSIX gettimeofday. If system gettimeofday + fails or is not available, fall back to lower resolution clocks. */ +PyAPI_FUNC(void) _PyTime_get(_PyTime_t *tp); + +/* Convert a timestamp structure to the specified timestamp type. + + Raise a ValueError if the timestamp type is unknown. */ +PyAPI_FUNC(PyObject*) _PyTime_Convert(_PyTime_t *ts, PyObject *timestamp); + /* Dummy to force linking. */ PyAPI_FUNC(void) _PyTime_Init(void); diff --git a/Lib/test/test_os.py b/Lib/test/test_os.py --- a/Lib/test/test_os.py +++ b/Lib/test/test_os.py @@ -2,6 +2,7 @@ # does add tests for a few functions which have been determined to be more # portable than they had been thought to be. +import decimal import os import errno import unittest @@ -238,6 +239,36 @@ warnings.simplefilter("ignore", DeprecationWarning) self.check_stat_attributes(fname) + def test_stat_timestamp(self): + # test deprecation + with warnings.catch_warnings(): + warnings.simplefilter("error", DeprecationWarning) + self.assertRaises(DeprecationWarning, os.stat_float_times, False) + + with warnings.catch_warnings(): + warnings.simplefilter("ignore", DeprecationWarning) + old_value = os.stat_float_times() + try: + # test invalid timestamp types + self.assertRaises(ValueError, os.stat, self.fname, + timestamp="abc") + self.assertRaises(ValueError, os.stat, self.fname, + timestamp=decimal.Context) + + for float_times in (False, True): + os.stat_float_times(float_times) + t = os.stat(self.fname).st_mtime + if float_times: + self.assertIsInstance(t, float) + else: + self.assertIsInstance(t, int) + + for type in (int, float, decimal.Decimal): + t = os.stat(self.fname, timestamp=type).st_mtime + self.assertIsInstance(t, type) + finally: + os.stat_float_times(old_value) + def test_statvfs_attributes(self): if not hasattr(os, "statvfs"): return diff --git a/Lib/test/test_time.py b/Lib/test/test_time.py --- a/Lib/test/test_time.py +++ b/Lib/test/test_time.py @@ -1,10 +1,10 @@ +import locale +import platform +import sys +import sysconfig from test import support import time import unittest -import locale -import sysconfig -import sys -import platform # Max year is only limited by the size of C int. SIZEOF_INT = sysconfig.get_config_var('SIZEOF_INT') or 4 @@ -345,6 +345,31 @@ self.assertGreater(t2, t1) self.assertAlmostEqual(dt, 0.1, delta=0.2) + def test_timestamp(self): + import decimal + calls = [ + (time.time,), + (time.mktime, time.localtime()), + ] + if hasattr(time, 'monotonic'): + calls.append((time.monotonic,)) + if hasattr(time, 'wallclock'): + calls.append((time.wallclock,)) + if hasattr(time, 'CLOCK_REALTIME'): + if hasattr(time, 'clock_gettime'): + calls.append((time.clock_gettime, time.CLOCK_REALTIME)) + if hasattr(time, 'clock_getres'): + calls.append((time.clock_getres, time.CLOCK_REALTIME)) + for call in calls: + func, *args = call + + # test invalid timestamp + for invalid in ("int", decimal.Context): + self.assertRaises(ValueError, func, *args, timestamp=invalid) + + for type in (int, float, decimal.Decimal): + self.assertIsInstance(func(*args, timestamp=type), type) + def test_wallclock(self): t1 = time.wallclock() t2 = time.wallclock() diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c --- a/Modules/posixmodule.c +++ b/Modules/posixmodule.c @@ -1702,6 +1702,12 @@ int newval = -1; if (!PyArg_ParseTuple(args, "|i:stat_float_times", &newval)) return NULL; + if (PyErr_WarnEx(PyExc_DeprecationWarning, + "os.stat_float_times() has been deprecated, " + "use timestamp argument of os.stat() instead", + 1)) + return NULL; + if (newval == -1) /* Return old value */ return PyBool_FromLong(_stat_float_times); @@ -1711,9 +1717,12 @@ } static void -fill_time(PyObject *v, int index, time_t sec, unsigned long nsec) +fill_time(PyObject *v, int index, time_t sec, unsigned long nsec, + int has_nsec, PyObject *timestamp) { PyObject *fval,*ival; + _PyTime_t ts; + #if SIZEOF_TIME_T > SIZEOF_LONG ival = PyLong_FromLongLong((PY_LONG_LONG)sec); #else @@ -1721,9 +1730,21 @@ #endif if (!ival) return; - if (_stat_float_times) { - fval = PyFloat_FromDouble(sec + 1e-9*nsec); - } else { + if (timestamp == NULL && _stat_float_times) + timestamp = (PyObject*)&PyFloat_Type; + if (timestamp != NULL) { + ts.seconds = sec; + if (has_nsec) { + ts.numerator = nsec; + ts.denominator = 1000000000; + } + else { + ts.numerator = 0; + ts.denominator = 1; + } + fval = _PyTime_Convert(&ts, timestamp); + } + else { fval = ival; Py_INCREF(fval); } @@ -1734,9 +1755,14 @@ /* pack a system stat C structure into the Python stat tuple (used by posix_stat() and posix_fstat()) */ static PyObject* -_pystat_fromstructstat(STRUCT_STAT *st) +_pystat_fromstructstat(STRUCT_STAT *st, PyObject *timestamp) { unsigned long ansec, mnsec, cnsec; + int has_nsec; +#ifdef HAVE_STRUCT_STAT_ST_BIRTHTIME + _PyTime_t ts; +#endif + PyObject *v = PyStructSequence_New(&StatResultType); if (v == NULL) return NULL; @@ -1768,20 +1794,24 @@ ansec = st->st_atim.tv_nsec; mnsec = st->st_mtim.tv_nsec; cnsec = st->st_ctim.tv_nsec; + has_nsec = 1; #elif defined(HAVE_STAT_TV_NSEC2) ansec = st->st_atimespec.tv_nsec; mnsec = st->st_mtimespec.tv_nsec; cnsec = st->st_ctimespec.tv_nsec; + has_nsec = 1; #elif defined(HAVE_STAT_NSEC) ansec = st->st_atime_nsec; mnsec = st->st_mtime_nsec; cnsec = st->st_ctime_nsec; + has_nsec = 1; #else ansec = mnsec = cnsec = 0; -#endif - fill_time(v, 7, st->st_atime, ansec); - fill_time(v, 8, st->st_mtime, mnsec); - fill_time(v, 9, st->st_ctime, cnsec); + has_nsec = 0; +#endif + fill_time(v, 7, st->st_atime, ansec, has_nsec, timestamp); + fill_time(v, 8, st->st_mtime, mnsec, has_nsec, timestamp); + fill_time(v, 9, st->st_ctime, cnsec, has_nsec, timestamp); #ifdef HAVE_STRUCT_STAT_ST_BLKSIZE PyStructSequence_SET_ITEM(v, ST_BLKSIZE_IDX, @@ -1801,21 +1831,26 @@ #endif #ifdef HAVE_STRUCT_STAT_ST_BIRTHTIME { - PyObject *val; - unsigned long bsec,bnsec; - bsec = (long)st->st_birthtime; + PyObject *val; + ts.seconds = (long)st->st_birthtime; #ifdef HAVE_STAT_TV_NSEC2 - bnsec = st->st_birthtimespec.tv_nsec; + ts.numerator = st->st_birthtimespec.tv_nsec; + ts.denominator = 1000000000; #else - bnsec = 0; -#endif - if (_stat_float_times) { - val = PyFloat_FromDouble(bsec + 1e-9*bnsec); - } else { - val = PyLong_FromLong((long)bsec); - } - PyStructSequence_SET_ITEM(v, ST_BIRTHTIME_IDX, - val); + ts.numerator = 0; + ts.denominator = 1; +#endif + if (timestamp == NULL) { + if (_stat_float_times) + val = _PyTime_Convert(&ts, (PyObject*)&PyFloat_Type); + else + val = _PyTime_Convert(&ts, (PyObject*)&PyLong_Type); + } + else { + val = _PyTime_Convert(&ts, timestamp); + } + PyStructSequence_SET_ITEM(v, ST_BIRTHTIME_IDX, + val); } #endif #ifdef HAVE_STRUCT_STAT_ST_FLAGS @@ -1832,7 +1867,7 @@ } static PyObject * -posix_do_stat(PyObject *self, PyObject *args, +posix_do_stat(PyObject *self, PyObject *args, PyObject *kw, char *format, #ifdef __VMS int (*statfunc)(const char *, STRUCT_STAT *, ...), @@ -1842,15 +1877,18 @@ char *wformat, int (*wstatfunc)(const wchar_t *, STRUCT_STAT *)) { + static char *kwlist[] = {"path", "timestamp", NULL}; STRUCT_STAT st; PyObject *opath; char *path; int res; PyObject *result; + PyObject *timestamp = NULL; #ifdef MS_WINDOWS PyObject *po; - if (PyArg_ParseTuple(args, wformat, &po)) { + if (PyArg_ParseTupleAndKeywords(args, kw, wformat, kwlist, + &po, ×tamp)) { wchar_t *wpath = PyUnicode_AsUnicode(po); if (wpath == NULL) return NULL; @@ -1861,15 +1899,17 @@ if (res != 0) return win32_error_object("stat", po); - return _pystat_fromstructstat(&st); + return _pystat_fromstructstat(&st, timestamp); } /* Drop the argument parsing error as narrow strings are also valid. */ PyErr_Clear(); -#endif - - if (!PyArg_ParseTuple(args, format, - PyUnicode_FSConverter, &opath)) + timestamp = NULL; +#endif + + if (!PyArg_ParseTupleAndKeywords(args, kw, format, kwlist, + PyUnicode_FSConverter, &opath, + ×tamp)) return NULL; #ifdef MS_WINDOWS if (win32_warn_bytes_api()) { @@ -1890,7 +1930,7 @@ #endif } else - result = _pystat_fromstructstat(&st); + result = _pystat_fromstructstat(&st, timestamp); Py_DECREF(opath); return result; @@ -3381,16 +3421,16 @@ PyDoc_STRVAR(posix_stat__doc__, -"stat(path) -> stat result\n\n\ +"stat(path, timestamp=None) -> stat result\n\n\ Perform a stat system call on the given path."); static PyObject * -posix_stat(PyObject *self, PyObject *args) +posix_stat(PyObject *self, PyObject *args, PyObject *kw) { #ifdef MS_WINDOWS - return posix_do_stat(self, args, "O&:stat", STAT, "U:stat", win32_stat_w); + return posix_do_stat(self, args, kw, "O&|O:stat", STAT, "U|O:stat", win32_stat_w); #else - return posix_do_stat(self, args, "O&:stat", STAT, NULL, NULL); + return posix_do_stat(self, args, kw, "O&|O:stat", STAT, NULL, NULL); #endif } @@ -6118,11 +6158,12 @@ #if defined(HAVE_WAIT3) || defined(HAVE_WAIT4) static PyObject * -wait_helper(pid_t pid, int status, struct rusage *ru) +wait_helper(pid_t pid, int status, struct rusage *ru, PyObject *timestamp) { PyObject *result; static PyObject *struct_rusage; _Py_IDENTIFIER(struct_rusage); + _PyTime_t ts; if (pid == -1) return posix_error(); @@ -6146,10 +6187,17 @@ #define doubletime(TV) ((double)(TV).tv_sec + (TV).tv_usec * 0.000001) #endif + ts.seconds = ru->ru_utime.tv_sec; + ts.numerator = ru->ru_utime.tv_usec; + ts.denominator = 1000000; PyStructSequence_SET_ITEM(result, 0, - PyFloat_FromDouble(doubletime(ru->ru_utime))); + _PyTime_Convert(&ts, timestamp)); + + ts.seconds = ru->ru_stime.tv_sec; + ts.numerator = ru->ru_stime.tv_usec; + ts.denominator = 1000000; PyStructSequence_SET_ITEM(result, 1, - PyFloat_FromDouble(doubletime(ru->ru_stime))); + _PyTime_Convert(&ts, timestamp)); #define SET_INT(result, index, value)\ PyStructSequence_SET_ITEM(result, index, PyLong_FromLong(value)) SET_INT(result, 2, ru->ru_maxrss); @@ -6179,51 +6227,55 @@ #ifdef HAVE_WAIT3 PyDoc_STRVAR(posix_wait3__doc__, -"wait3(options) -> (pid, status, rusage)\n\n\ +"wait3(options[, timestamp=float]) -> (pid, status, rusage)\n\n\ Wait for completion of a child process."); static PyObject * -posix_wait3(PyObject *self, PyObject *args) -{ +posix_wait3(PyObject *self, PyObject *args, PyObject *kwargs) +{ + static char *kwlist[] = {"options", "timestamp", NULL}; pid_t pid; int options; struct rusage ru; WAIT_TYPE status; WAIT_STATUS_INT(status) = 0; - - if (!PyArg_ParseTuple(args, "i:wait3", &options)) + PyObject *timestamp = NULL; + + if (!PyArg_ParseTupleAndKeywords(args, kwargs, "i|O:wait3", kwlist, &options, ×tamp)) return NULL; Py_BEGIN_ALLOW_THREADS pid = wait3(&status, options, &ru); Py_END_ALLOW_THREADS - return wait_helper(pid, WAIT_STATUS_INT(status), &ru); + return wait_helper(pid, WAIT_STATUS_INT(status), &ru, timestamp); } #endif /* HAVE_WAIT3 */ #ifdef HAVE_WAIT4 PyDoc_STRVAR(posix_wait4__doc__, -"wait4(pid, options) -> (pid, status, rusage)\n\n\ +"wait4(pid, options[, timestamp=float]) -> (pid, status, rusage)\n\n\ Wait for completion of a given child process."); static PyObject * -posix_wait4(PyObject *self, PyObject *args) -{ +posix_wait4(PyObject *self, PyObject *args, PyObject *kwargs) +{ + static char *kwlist[] = {"pid", "options", "timestamp", NULL}; pid_t pid; int options; struct rusage ru; WAIT_TYPE status; WAIT_STATUS_INT(status) = 0; - - if (!PyArg_ParseTuple(args, _Py_PARSE_PID "i:wait4", &pid, &options)) + PyObject *timestamp = NULL; + + if (!PyArg_ParseTupleAndKeywords(args, kwargs, _Py_PARSE_PID "i|O:wait4", kwlist, &pid, &options, ×tamp)) return NULL; Py_BEGIN_ALLOW_THREADS pid = wait4(pid, &status, options, &ru); Py_END_ALLOW_THREADS - return wait_helper(pid, WAIT_STATUS_INT(status), &ru); + return wait_helper(pid, WAIT_STATUS_INT(status), &ru, timestamp); } #endif /* HAVE_WAIT4 */ @@ -6350,20 +6402,20 @@ PyDoc_STRVAR(posix_lstat__doc__, -"lstat(path) -> stat result\n\n\ +"lstat(path, timestamp=None) -> stat result\n\n\ Like stat(path), but do not follow symbolic links."); static PyObject * -posix_lstat(PyObject *self, PyObject *args) +posix_lstat(PyObject *self, PyObject *args, PyObject *kw) { #ifdef HAVE_LSTAT - return posix_do_stat(self, args, "O&:lstat", lstat, NULL, NULL); + return posix_do_stat(self, args, kw, "O&|O:lstat", lstat, NULL, NULL); #else /* !HAVE_LSTAT */ #ifdef MS_WINDOWS - return posix_do_stat(self, args, "O&:lstat", win32_lstat, "U:lstat", + return posix_do_stat(self, args, kw, "O&|O:lstat", win32_lstat, "U|O:lstat", win32_lstat_w); #else - return posix_do_stat(self, args, "O&:lstat", STAT, NULL, NULL); + return posix_do_stat(self, args, "kw, O&|O:lstat", STAT, NULL, NULL); #endif #endif /* !HAVE_LSTAT */ } @@ -7322,16 +7374,19 @@ #endif PyDoc_STRVAR(posix_fstat__doc__, -"fstat(fd) -> stat result\n\n\ +"fstat(fd, timestamp=None) -> stat result\n\n\ Like stat(), but for an open file descriptor."); static PyObject * -posix_fstat(PyObject *self, PyObject *args) -{ +posix_fstat(PyObject *self, PyObject *args, PyObject *kwargs) +{ + static char *kwlist[] = {"fd", "timestamp", NULL}; int fd; STRUCT_STAT st; int res; - if (!PyArg_ParseTuple(args, "i:fstat", &fd)) + PyObject *timestamp = NULL; + if (!PyArg_ParseTupleAndKeywords(args, kwargs, "i|O:fstat", kwlist, + &fd, ×tamp)) return NULL; #ifdef __VMS /* on OpenVMS we must ensure that all bytes are written to the file */ @@ -7350,7 +7405,7 @@ #endif } - return _pystat_fromstructstat(&st); + return _pystat_fromstructstat(&st, timestamp); } PyDoc_STRVAR(posix_isatty__doc__, @@ -9634,22 +9689,25 @@ #ifdef HAVE_FSTATAT PyDoc_STRVAR(posix_fstatat__doc__, -"fstatat(dirfd, path, flags=0) -> stat result\n\n\ +"fstatat(dirfd, path, flags=0, timestamp=None) -> stat result\n\n\ Like stat() but if path is relative, it is taken as relative to dirfd.\n\ flags is optional and may be 0 or AT_SYMLINK_NOFOLLOW.\n\ If path is relative and dirfd is the special value AT_FDCWD, then path\n\ is interpreted relative to the current working directory."); static PyObject * -posix_fstatat(PyObject *self, PyObject *args) -{ +posix_fstatat(PyObject *self, PyObject *args, PyObject *kwargs) +{ + static char *kwlist[] = {"dirfd", "path", "flags", "timestamp", NULL}; PyObject *opath; char *path; STRUCT_STAT st; int dirfd, res, flags = 0; - - if (!PyArg_ParseTuple(args, "iO&|i:fstatat", - &dirfd, PyUnicode_FSConverter, &opath, &flags)) + PyObject *timestamp = NULL; + + if (!PyArg_ParseTupleAndKeywords(args, kwargs, "iO&|iO:fstatat", kwlist, + &dirfd, PyUnicode_FSConverter, &opath, + &flags, ×tamp)) return NULL; path = PyBytes_AsString(opath); @@ -9660,7 +9718,7 @@ if (res != 0) return posix_error(); - return _pystat_fromstructstat(&st); + return _pystat_fromstructstat(&st, timestamp); } #endif @@ -10524,7 +10582,7 @@ #ifdef HAVE_FDOPENDIR {"flistdir", posix_flistdir, METH_VARARGS, posix_flistdir__doc__}, #endif - {"lstat", posix_lstat, METH_VARARGS, posix_lstat__doc__}, + {"lstat", (PyCFunction)posix_lstat, METH_VARARGS | METH_KEYWORDS, posix_lstat__doc__}, {"mkdir", posix_mkdir, METH_VARARGS, posix_mkdir__doc__}, #ifdef HAVE_NICE {"nice", posix_nice, METH_VARARGS, posix_nice__doc__}, @@ -10544,7 +10602,8 @@ {"rename", posix_rename, METH_VARARGS, posix_rename__doc__}, {"replace", posix_replace, METH_VARARGS, posix_replace__doc__}, {"rmdir", posix_rmdir, METH_VARARGS, posix_rmdir__doc__}, - {"stat", posix_stat, METH_VARARGS, posix_stat__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__}, @@ -10705,10 +10764,12 @@ {"wait", posix_wait, METH_NOARGS, posix_wait__doc__}, #endif /* HAVE_WAIT */ #ifdef HAVE_WAIT3 - {"wait3", posix_wait3, METH_VARARGS, posix_wait3__doc__}, + {"wait3", (PyCFunction)posix_wait3, + METH_VARARGS | METH_KEYWORDS, posix_wait3__doc__}, #endif /* HAVE_WAIT3 */ #ifdef HAVE_WAIT4 - {"wait4", posix_wait4, METH_VARARGS, posix_wait4__doc__}, + {"wait4", (PyCFunction)posix_wait4, + METH_VARARGS | METH_KEYWORDS, posix_wait4__doc__}, #endif /* HAVE_WAIT4 */ #if defined(HAVE_WAITID) && !defined(__APPLE__) {"waitid", posix_waitid, METH_VARARGS, posix_waitid__doc__}, @@ -10759,7 +10820,8 @@ {"sendfile", (PyCFunction)posix_sendfile, METH_VARARGS | METH_KEYWORDS, posix_sendfile__doc__}, #endif - {"fstat", posix_fstat, METH_VARARGS, posix_fstat__doc__}, + {"fstat", (PyCFunction)posix_fstat, METH_VARARGS | METH_KEYWORDS, + posix_fstat__doc__}, {"isatty", posix_isatty, METH_VARARGS, posix_isatty__doc__}, #ifdef HAVE_PIPE {"pipe", posix_pipe, METH_NOARGS, posix_pipe__doc__}, @@ -10894,7 +10956,8 @@ {"fchownat", posix_fchownat, METH_VARARGS, posix_fchownat__doc__}, #endif /* HAVE_FCHOWNAT */ #ifdef HAVE_FSTATAT - {"fstatat", posix_fstatat, METH_VARARGS, posix_fstatat__doc__}, + {"fstatat", (PyCFunction)posix_fstatat, METH_VARARGS | METH_KEYWORDS, + posix_fstatat__doc__}, #endif #ifdef HAVE_FUTIMESAT {"futimesat", posix_futimesat, METH_VARARGS, posix_futimesat__doc__}, diff --git a/Modules/timemodule.c b/Modules/timemodule.c --- a/Modules/timemodule.c +++ b/Modules/timemodule.c @@ -40,24 +40,30 @@ #include #endif +#if (defined(MS_WINDOWS) && !defined(__BORLANDC__)) || defined(HAVE_CLOCK) +# define HAVE_PYCLOCK +#endif + /* Forward declarations */ static int floatsleep(double); -static double floattime(void); static PyObject * -time_time(PyObject *self, PyObject *unused) +time_time(PyObject *self, PyObject *args, PyObject *kwargs) { - double secs; - secs = floattime(); - if (secs == 0.0) { - PyErr_SetFromErrno(PyExc_IOError); + static char *kwlist[] = {"timestamp", NULL}; + PyObject *timestamp = NULL; + _PyTime_t ts; + + if (!PyArg_ParseTupleAndKeywords(args, kwargs, "|O:time", kwlist, + ×tamp)) return NULL; - } - return PyFloat_FromDouble(secs); + + _PyTime_get(&ts); + return _PyTime_Convert(&ts, timestamp); } PyDoc_STRVAR(time_doc, -"time() -> floating point number\n\ +"time(timestamp=float) -> floating point number\n\ \n\ Return the current time in seconds since the Epoch.\n\ Fractions of a second may be present if the system clock provides them."); @@ -72,65 +78,91 @@ #endif #endif -static PyObject * -pyclock(void) +static int +pyclock(_PyTime_t *ts) { - clock_t value; - value = clock(); - if (value == (clock_t)-1) { + clock_t processor_time; + processor_time = clock(); + if (processor_time == (clock_t)-1) { PyErr_SetString(PyExc_RuntimeError, "the processor time used is not available " "or its value cannot be represented"); - return NULL; + return -1; } - return PyFloat_FromDouble((double)value / CLOCKS_PER_SEC); + ts->seconds = 0; + assert(sizeof(clock_t) <= sizeof(_PyTime_fraction_t)); + ts->numerator = Py_SAFE_DOWNCAST(processor_time, + clock_t, _PyTime_fraction_t); + ts->denominator = CLOCKS_PER_SEC; + return 0; } #endif /* HAVE_CLOCK */ #if defined(MS_WINDOWS) && !defined(__BORLANDC__) /* Win32 has better clock replacement; we have our own version, due to Mark Hammond and Tim Peters */ -static PyObject * -win32_clock(int fallback) +static int +win32_clock(_PyTime_t *ts, int fallback) { static LONGLONG cpu_frequency = 0; - static LONGLONG ctrStart; + static LONGLONG start; LARGE_INTEGER now; - double diff; + LONGLONG dt; if (cpu_frequency == 0) { LARGE_INTEGER freq; QueryPerformanceCounter(&now); - ctrStart = now.QuadPart; + start = now.QuadPart; if (!QueryPerformanceFrequency(&freq) || freq.QuadPart == 0) { /* Unlikely to happen - this works on all intel machines at least! Revert to clock() */ - if (fallback) - return pyclock(); - else - return PyErr_SetFromWindowsErr(0); + if (fallback) { + return pyclock(ts); + } + else { + PyErr_SetFromWindowsErr(0); + return -1; + } } cpu_frequency = freq.QuadPart; } QueryPerformanceCounter(&now); - diff = (double)(now.QuadPart - ctrStart); - return PyFloat_FromDouble(diff / (double)cpu_frequency); + dt = now.QuadPart - start; + + ts->seconds = 0; + assert(sizeof(LONGLONG) <= sizeof(_PyTime_fraction_t)); + ts->numerator = Py_SAFE_DOWNCAST(dt, + LONGLONG, _PyTime_fraction_t); + ts->denominator = Py_SAFE_DOWNCAST(cpu_frequency, + LONGLONG, _PyTime_fraction_t); + return 0; } #endif #if (defined(MS_WINDOWS) && !defined(__BORLANDC__)) || defined(HAVE_CLOCK) static PyObject * -time_clock(PyObject *self, PyObject *unused) +time_clock(PyObject *self, PyObject *args, PyObject *kwargs) { + static char *kwlist[] = {"timestamp", NULL}; + _PyTime_t ts; + PyObject *timestamp = NULL; + + if (!PyArg_ParseTupleAndKeywords(args, kwargs, "|O:clock", kwlist, + ×tamp)) + return NULL; + #if defined(MS_WINDOWS) && !defined(__BORLANDC__) - return win32_clock(1); + if (win32_clock(&ts, 1) == -1) + return NULL; #else - return pyclock(); + if (pyclock(&ts) == -1) + return NULL; #endif + return _PyTime_Convert(&ts, timestamp); } PyDoc_STRVAR(clock_doc, -"clock() -> floating point number\n\ +"clock(timestamp=float) -> floating point number\n\ \n\ Return the CPU time or real time since the start of the process or since\n\ the first call to clock(). This has as much precision as the system\n\ @@ -139,13 +171,17 @@ #ifdef HAVE_CLOCK_GETTIME static PyObject * -time_clock_gettime(PyObject *self, PyObject *args) +time_clock_gettime(PyObject *self, PyObject *args, PyObject *kwargs) { + static char *kwlist[] = {"clk_id", "timestamp", NULL}; + PyObject *timestamp = NULL; int ret; clockid_t clk_id; struct timespec tp; + _PyTime_t ts; - if (!PyArg_ParseTuple(args, "i:clock_gettime", &clk_id)) + if (!PyArg_ParseTupleAndKeywords(args, kwargs, "i|O:clock_gettime", kwlist, + &clk_id, ×tamp)) return NULL; ret = clock_gettime((clockid_t)clk_id, &tp); @@ -153,25 +189,31 @@ PyErr_SetFromErrno(PyExc_IOError); return NULL; } - - return PyFloat_FromDouble(tp.tv_sec + tp.tv_nsec * 1e-9); + ts.seconds = tp.tv_sec; + ts.numerator = tp.tv_nsec; + ts.denominator = 1000000000; + return _PyTime_Convert(&ts, timestamp); } PyDoc_STRVAR(clock_gettime_doc, -"clock_gettime(clk_id) -> floating point number\n\ +"clock_gettime(clk_id, timestamp=float) -> floating point number\n\ \n\ Return the time of the specified clock clk_id."); #endif #ifdef HAVE_CLOCK_GETRES static PyObject * -time_clock_getres(PyObject *self, PyObject *args) +time_clock_getres(PyObject *self, PyObject *args, PyObject *kwargs) { + static char *kwlist[] = {"clk_id", "timestamp", NULL}; + PyObject *timestamp = NULL; int ret; clockid_t clk_id; struct timespec tp; + _PyTime_t ts; - if (!PyArg_ParseTuple(args, "i:clock_getres", &clk_id)) + if (!PyArg_ParseTupleAndKeywords(args, kwargs, "i|O:clock_getres", kwlist, + &clk_id, ×tamp)) return NULL; ret = clock_getres((clockid_t)clk_id, &tp); @@ -179,12 +221,14 @@ PyErr_SetFromErrno(PyExc_IOError); return NULL; } - - return PyFloat_FromDouble(tp.tv_sec + tp.tv_nsec * 1e-9); + ts.seconds = tp.tv_sec; + ts.numerator = tp.tv_nsec; + ts.denominator = 1000000000; + return _PyTime_Convert(&ts, timestamp); } PyDoc_STRVAR(clock_getres_doc, -"clock_getres(clk_id) -> floating point number\n\ +"clock_getres(clk_id, timestamp=float) -> floating point number\n\ \n\ Return the resolution (precision) of the specified clock clk_id."); #endif @@ -707,10 +751,19 @@ #ifdef HAVE_MKTIME static PyObject * -time_mktime(PyObject *self, PyObject *tup) +time_mktime(PyObject *self, PyObject *args, PyObject *kwargs) { + static char *kwlist[] = {"t", "timestamp", NULL}; + PyObject *timestamp = NULL; + PyObject *tup; struct tm buf; time_t tt; + _PyTime_t ts; + + if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O|O:mktime", kwlist, + &tup, ×tamp)) + return NULL; + if (!gettmarg(tup, &buf)) return NULL; buf.tm_wday = -1; /* sentinel; original value ignored */ @@ -722,7 +775,10 @@ "mktime argument out of range"); return NULL; } - return PyFloat_FromDouble((double)tt); + ts.seconds = tt; + ts.numerator = 0; + ts.denominator = 1; + return _PyTime_Convert(&ts, timestamp); } PyDoc_STRVAR(mktime_doc, @@ -768,12 +824,14 @@ should not be relied on."); #endif /* HAVE_WORKING_TZSET */ -static PyObject * -time_wallclock(PyObject *self, PyObject *unused) +static int +pywallclock(_PyTime_t *ts) { #if defined(MS_WINDOWS) && !defined(__BORLANDC__) - return win32_clock(1); -#elif defined(HAVE_CLOCK_GETTIME) && defined(CLOCK_MONOTONIC) + return win32_clock(ts, 1); +#else + +#if defined(HAVE_CLOCK_GETTIME) && defined(CLOCK_MONOTONIC) static int clk_index = 0; clockid_t clk_ids[] = { #ifdef CLOCK_MONOTONIC_RAW @@ -793,20 +851,41 @@ clockid_t clk_id = clk_ids[clk_index]; ret = clock_gettime(clk_id, &tp); if (ret == 0) - return PyFloat_FromDouble(tp.tv_sec + tp.tv_nsec * 1e-9); + { + ts->seconds = tp.tv_sec; + ts->numerator = tp.tv_nsec; + ts->denominator = 1000000000; + return 0; + } clk_index++; if (Py_ARRAY_LENGTH(clk_ids) <= clk_index) clk_index = -1; } - return time_time(self, NULL); -#else - return time_time(self, NULL); +#endif /* defined(HAVE_CLOCK_GETTIME) && defined(CLOCK_MONOTONIC) */ + + _PyTime_get(ts); + return 0; #endif } +static PyObject * +time_wallclock(PyObject *self, PyObject *args, PyObject *kwargs) +{ + static char *kwlist[] = {"timestamp", NULL}; + PyObject *timestamp = NULL; + _PyTime_t ts; + + if (!PyArg_ParseTupleAndKeywords(args, kwargs, "|O:wallclock", kwlist, + ×tamp)) + return NULL; + if (pywallclock(&ts)) + return NULL; + return _PyTime_Convert(&ts, timestamp); +} + PyDoc_STRVAR(wallclock_doc, -"wallclock() -> float\n\ +"wallclock(timestamp=float)\n\ \n\ Return the current time in fractions of a second to the system's best\n\ ability. Use this when the most accurate representation of wall-clock is\n\ @@ -821,11 +900,11 @@ #ifdef HAVE_PYTIME_MONOTONIC static PyObject * -time_monotonic(PyObject *self, PyObject *unused) +time_monotonic(PyObject *self, PyObject *args, PyObject *kwargs) { -#if defined(MS_WINDOWS) && !defined(__BORLANDC__) - return win32_clock(0); -#else + static char *kwlist[] = {"timestamp", NULL}; + PyObject *timestamp = NULL; +#if defined(HAVE_CLOCK_GETTIME) && defined(CLOCK_MONOTONIC) static int clk_index = 0; clockid_t clk_ids[] = { #ifdef CLOCK_MONOTONIC_RAW @@ -835,12 +914,28 @@ }; int ret; struct timespec tp; +#endif + _PyTime_t ts; + if (!PyArg_ParseTupleAndKeywords(args, kwargs, "|O:monotonic", kwlist, + ×tamp)) + return NULL; + +#if defined(MS_WINDOWS) && !defined(__BORLANDC__) + if (win32_clock(&ts, 0) == -1) + return NULL; + return _PyTime_Convert(&ts, timestamp); +#else while (0 <= clk_index) { clockid_t clk_id = clk_ids[clk_index]; ret = clock_gettime(clk_id, &tp); if (ret == 0) - return PyFloat_FromDouble(tp.tv_sec + tp.tv_nsec * 1e-9); + { + ts.seconds = tp.tv_sec; + ts.numerator = tp.tv_nsec; + ts.denominator = 1000000000; + return _PyTime_Convert(&ts, timestamp); + } clk_index++; if (Py_ARRAY_LENGTH(clk_ids) <= clk_index) @@ -968,15 +1063,19 @@ static PyMethodDef time_methods[] = { - {"time", time_time, METH_NOARGS, time_doc}, -#if (defined(MS_WINDOWS) && !defined(__BORLANDC__)) || defined(HAVE_CLOCK) - {"clock", time_clock, METH_NOARGS, clock_doc}, + {"time", (PyCFunction)time_time, + METH_VARARGS | METH_KEYWORDS, time_doc}, +#ifdef HAVE_PYCLOCK + {"clock", (PyCFunction)time_clock, + METH_VARARGS | METH_KEYWORDS, clock_doc}, #endif #ifdef HAVE_CLOCK_GETTIME - {"clock_gettime", time_clock_gettime, METH_VARARGS, clock_gettime_doc}, + {"clock_gettime", (PyCFunction)time_clock_gettime, + METH_VARARGS | METH_KEYWORDS, clock_gettime_doc}, #endif #ifdef HAVE_CLOCK_GETRES - {"clock_getres", time_clock_getres, METH_VARARGS, clock_getres_doc}, + {"clock_getres", (PyCFunction)time_clock_getres, + METH_VARARGS | METH_KEYWORDS, clock_getres_doc}, #endif {"sleep", time_sleep, METH_VARARGS, sleep_doc}, {"gmtime", time_gmtime, METH_VARARGS, gmtime_doc}, @@ -984,10 +1083,12 @@ {"asctime", time_asctime, METH_VARARGS, asctime_doc}, {"ctime", time_ctime, METH_VARARGS, ctime_doc}, #ifdef HAVE_MKTIME - {"mktime", time_mktime, METH_O, mktime_doc}, + {"mktime", (PyCFunction)time_mktime, + METH_VARARGS | METH_KEYWORDS, mktime_doc}, #endif #ifdef HAVE_PYTIME_MONOTONIC - {"monotonic", time_monotonic, METH_NOARGS, monotonic_doc}, + {"monotonic", (PyCFunction)time_monotonic, + METH_VARARGS | METH_KEYWORDS, monotonic_doc}, #endif #ifdef HAVE_STRFTIME {"strftime", time_strftime, METH_VARARGS, strftime_doc}, @@ -996,7 +1097,8 @@ #ifdef HAVE_WORKING_TZSET {"tzset", time_tzset, METH_NOARGS, tzset_doc}, #endif - {"wallclock", time_wallclock, METH_NOARGS, wallclock_doc}, + {"wallclock", (PyCFunction)time_wallclock, + METH_VARARGS | METH_KEYWORDS, wallclock_doc}, {NULL, NULL} /* sentinel */ }; @@ -1081,15 +1183,6 @@ return m; } -static double -floattime(void) -{ - _PyTime_timeval t; - _PyTime_gettimeofday(&t); - return (double)t.tv_sec + t.tv_usec*0.000001; -} - - /* Implement floatsleep() for various platforms. When interrupted (or when another error occurs), return -1 and set an exception; else return 0. */ diff --git a/Python/pytime.c b/Python/pytime.c --- a/Python/pytime.c +++ b/Python/pytime.c @@ -18,24 +18,36 @@ extern int ftime(struct timeb *); #endif +#define MICROSECONDS 1000000 + void -_PyTime_gettimeofday(_PyTime_timeval *tp) +_PyTime_get(_PyTime_t *ts) { #ifdef MS_WINDOWS FILETIME system_time; ULARGE_INTEGER large; - ULONGLONG microseconds; + ULONGLONG value; 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 + /* 116,444,736,000,000,000: number of 100 ns 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; + value = large.QuadPart - 116444736000000000; + ts->seconds = 0; + ts->numerator = value; + ts->denominator = (_PyTime_fraction_t)10000000; #else + +#ifdef HAVE_GETTIMEOFDAY + struct timeval tv; + int err; +#endif +#if defined(HAVE_FTIME) + struct timeb t; +#endif + /* There are three ways to get the time: (1) gettimeofday() -- resolution in microseconds (2) ftime() -- resolution in milliseconds @@ -47,30 +59,325 @@ #ifdef HAVE_GETTIMEOFDAY #ifdef GETTIMEOFDAY_NO_TZ - if (gettimeofday(tp) == 0) + err = gettimeofday(&tv); +#else /* !GETTIMEOFDAY_NO_TZ */ + err = gettimeofday(&tv, (struct timezone *)NULL); +#endif /* !GETTIMEOFDAY_NO_TZ */ + if (err == 0) + { + ts->seconds = tv.tv_sec; + ts->numerator = tv.tv_usec; + ts->denominator = MICROSECONDS; return; -#else /* !GETTIMEOFDAY_NO_TZ */ - if (gettimeofday(tp, (struct timezone *)NULL) == 0) - return; -#endif /* !GETTIMEOFDAY_NO_TZ */ + } #endif /* !HAVE_GETTIMEOFDAY */ #if defined(HAVE_FTIME) - { - struct timeb t; - ftime(&t); - tp->tv_sec = t.time; - tp->tv_usec = t.millitm * 1000; - } + ftime(&t); + ts->seconds = t.time; + ts->numerator = t.millitm; + ts->denominator = 1000; #else /* !HAVE_FTIME */ - tp->tv_sec = time(NULL); - tp->tv_usec = 0; + ts->seconds = time(NULL); + ts->numerator = 0; + ts->denominator = 1; #endif /* !HAVE_FTIME */ #endif /* MS_WINDOWS */ } void +_PyTime_gettimeofday(_PyTime_timeval *tv) +{ + _PyTime_t ts; + _PyTime_fraction_t k; + time_t sec; + + _PyTime_get(&ts); + tv->tv_sec = ts.seconds; + if (ts.numerator) { + if (ts.numerator > ts.denominator) { + sec = Py_SAFE_DOWNCAST(ts.numerator / ts.denominator, + _PyTime_fraction_t, time_t); + /* ignore integer overflow because _PyTime_gettimeofday() has + no return value */ + tv->tv_sec += sec; + ts.numerator = ts.numerator % ts.denominator; + } + if (MICROSECONDS >= ts.denominator) { + k = (_PyTime_fraction_t)MICROSECONDS / ts.denominator; + tv->tv_usec = (long)(ts.numerator * k); + } + else { + k = ts.denominator / (_PyTime_fraction_t)MICROSECONDS; + tv->tv_usec = (long)(ts.numerator / k); + } + } + else { + tv->tv_usec = 0; + } +} + +static PyObject* +_PyLong_FromTime_t(time_t value) +{ +#if SIZEOF_TIME_T <= SIZEOF_LONG + return PyLong_FromLong(value); +#else + assert(sizeof(time_t) <= sizeof(PY_LONG_LONG)); + return PyLong_FromLongLong(value); +#endif +} + +#if defined(HAVE_LONG_LONG) +# define _PyLong_FromTimeFraction_t PyLong_FromLongLong +#else +# define _PyLong_FromTimeFraction_t PyLong_FromSize_t +#endif + +/* Convert a timestamp to a PyFloat object */ +static PyObject* +_PyTime_AsFloat(_PyTime_t *ts) +{ + double d; + d = (double)ts->seconds; + d += (double)ts->numerator / (double)ts->denominator; + return PyFloat_FromDouble(d); +} + +/* Convert a timestamp to a PyLong object */ +static PyObject* +_PyTime_AsLong(_PyTime_t *ts) +{ + PyObject *a, *b, *c; + + a = _PyLong_FromTime_t(ts->seconds); + if (a == NULL) + return NULL; + b = _PyLong_FromTimeFraction_t(ts->numerator / ts->denominator); + if (b == NULL) + { + Py_DECREF(a); + return NULL; + } + c = PyNumber_Add(a, b); + Py_DECREF(a); + Py_DECREF(b); + return c; +} + +/* Convert a timestamp to a decimal.Decimal object */ +static PyObject* +_PyTime_AsDecimal(_PyTime_t *ts) +{ + static PyObject* module = NULL; + static PyObject* decimal = NULL; + static PyObject* exponent_context = NULL; + static PyObject* context = NULL; + /* exponent cache, dictionary of: + int (denominator) => Decimal (1/denominator) */ + static PyObject* exponent_cache = NULL; + PyObject *t = NULL; + PyObject *key, *exponent, *quantized; + _Py_IDENTIFIER(quantize); + _Py_IDENTIFIER(__truediv__); + + if (!module) { + module = PyImport_ImportModuleNoBlock("decimal"); + if (module == NULL) + return NULL; + } + + if (!decimal) { + decimal = PyObject_GetAttrString(module, "Decimal"); + if (decimal == NULL) + return NULL; + } + + if (context == NULL) + { + /* Use 12 decimal digits to store 10,000 years in seconds + 9 + decimal digits for the floating part in nanoseconds + 1 decimal + digit to round correctly. + + context = decimal.Context(22, rounding=decimal.ROUND_HALF_EVEN) + exponent_context = decimal.Context(1, rounding=decimal.ROUND_HALF_EVEN) + */ + PyObject *context_class, *rounding; + context_class = PyObject_GetAttrString(module, "Context"); + if (context_class == NULL) + return NULL; + rounding = PyObject_GetAttrString(module, "ROUND_HALF_EVEN"); + if (rounding == NULL) + { + Py_DECREF(context_class); + return NULL; + } + context = PyObject_CallFunction(context_class, "iO", 22, rounding); + if (context == NULL) + { + Py_DECREF(context_class); + Py_DECREF(rounding); + return NULL; + } + + exponent_context = PyObject_CallFunction(context_class, "iO", 1, rounding); + Py_DECREF(context_class); + Py_DECREF(rounding); + if (exponent_context == NULL) + { + Py_CLEAR(context); + return NULL; + } + } + + /* t = decimal.Decimal(value) */ + if (ts->seconds) { + PyObject *f = _PyLong_FromTime_t(ts->seconds); + t = PyObject_CallFunction(decimal, "O", f); + Py_CLEAR(f); + } + else { + t = PyObject_CallFunction(decimal, "iO", 0, context); + } + if (t == NULL) + return NULL; + + if (ts->numerator) + { + /* t += decimal.Decimal(numerator, ctx) / decimal.Decimal(denominator, ctx) */ + PyObject *a, *b, *c, *d, *x; + + x = _PyLong_FromTimeFraction_t(ts->numerator); + if (x == NULL) + goto error; + a = PyObject_CallFunction(decimal, "OO", x, context); + Py_CLEAR(x); + if (a == NULL) + goto error; + + x = _PyLong_FromTimeFraction_t(ts->denominator); + if (x == NULL) + { + Py_DECREF(a); + goto error; + } + b = PyObject_CallFunction(decimal, "OO", x, context); + Py_CLEAR(x); + if (b == NULL) + { + Py_DECREF(a); + goto error; + } + + c = _PyObject_CallMethodId(a, &PyId___truediv__, "OO", + b, context); + Py_DECREF(a); + Py_DECREF(b); + if (c == NULL) + goto error; + + d = PyNumber_Add(t, c); + Py_DECREF(c); + if (d == NULL) + goto error; + Py_DECREF(t); + t = d; + } + + if (exponent_cache == NULL) { + exponent_cache = PyDict_New(); + if (exponent_cache == NULL) + goto error; + } + + key = _PyLong_FromTimeFraction_t(ts->denominator); + if (key == NULL) + goto error; + exponent = PyDict_GetItem(exponent_cache, key); + if (exponent == NULL) { + /* exponent = decimal.Decimal(1) / decimal.Decimal(resolution) */ + PyObject *one, *denominator; + + one = PyObject_CallFunction(decimal, "i", 1); + if (one == NULL) { + Py_DECREF(key); + goto error; + } + + denominator = PyObject_CallFunction(decimal, "O", key); + if (denominator == NULL) { + Py_DECREF(key); + Py_DECREF(one); + goto error; + } + + exponent = _PyObject_CallMethodId(one, &PyId___truediv__, "OO", + denominator, exponent_context); + Py_DECREF(one); + Py_DECREF(denominator); + if (exponent == NULL) { + Py_DECREF(key); + goto error; + } + + if (PyDict_SetItem(exponent_cache, key, exponent) < 0) { + Py_DECREF(key); + Py_DECREF(exponent); + goto error; + } + Py_DECREF(key); + } + + /* t = t.quantize(exponent, None, context) */ + quantized = _PyObject_CallMethodId(t, &PyId_quantize, "OOO", + exponent, Py_None, context); + if (quantized == NULL) + goto error; + Py_DECREF(t); + t = quantized; + + return t; + +error: + Py_XDECREF(t); + return NULL; +} + +PyObject* +_PyTime_Convert(_PyTime_t *ts, PyObject *format) +{ + assert(ts->denominator != 0); + + if (format == NULL || (PyTypeObject *)format == &PyFloat_Type) + return _PyTime_AsFloat(ts); + if ((PyTypeObject *)format == &PyLong_Type) + return _PyTime_AsLong(ts); + + if (PyType_Check(format)) + { + PyObject *module, *name; + _Py_IDENTIFIER(__name__); + _Py_IDENTIFIER(__module__); + + module = _PyObject_GetAttrId(format, &PyId___module__); + name = _PyObject_GetAttrId(format, &PyId___name__); + if (module != NULL && PyUnicode_Check(module) + && name != NULL && PyUnicode_Check(name)) + { + if (PyUnicode_CompareWithASCIIString(module, "decimal") == 0 + && PyUnicode_CompareWithASCIIString(name, "Decimal") == 0) + return _PyTime_AsDecimal(ts); + } + else + PyErr_Clear(); + } + + PyErr_Format(PyExc_ValueError, "Unknown timestamp format: %R", format); + return NULL; +} + +void _PyTime_Init() { /* Do nothing. Needed to force linking. */ -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Feb 8 22:52:46 2012 From: python-checkins at python.org (victor.stinner) Date: Wed, 08 Feb 2012 22:52:46 +0100 Subject: [Python-checkins] =?utf8?q?cpython=3A_Issue_=2313845=3A_Fix_NEWS_?= =?utf8?q?entry=2C_the_change_is_specific_to_Windows?= Message-ID: http://hg.python.org/cpython/rev/3965ed809a85 changeset: 74833:3965ed809a85 user: Victor Stinner date: Wed Feb 08 22:53:24 2012 +0100 summary: Issue #13845: Fix NEWS entry, the change is specific to Windows files: Misc/NEWS | 6 +++--- 1 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -466,9 +466,9 @@ Library ------- -- Issue #13845: 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 #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 #13846: Add time.monotonic(), monotonic clock. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Feb 8 23:02:40 2012 From: python-checkins at python.org (victor.stinner) Date: Wed, 08 Feb 2012 23:02:40 +0100 Subject: [Python-checkins] =?utf8?q?cpython=3A_Backout_f8409b3d6449=3A_the?= =?utf8?q?_PEP_410_is_not_accepted_yet?= Message-ID: http://hg.python.org/cpython/rev/90eda29a8e03 changeset: 74834:90eda29a8e03 user: Victor Stinner date: Wed Feb 08 23:03:19 2012 +0100 summary: Backout f8409b3d6449: the PEP 410 is not accepted yet files: Doc/library/os.rst | 43 +--- Doc/library/time.rst | 50 +--- Doc/whatsnew/3.3.rst | 36 --- Include/pytime.h | 28 +-- Lib/test/test_os.py | 31 -- Lib/test/test_time.py | 33 +-- Modules/posixmodule.c | 207 ++++++----------- Modules/timemodule.c | 241 ++++++-------------- Python/pytime.c | 343 +---------------------------- 9 files changed, 186 insertions(+), 826 deletions(-) diff --git a/Doc/library/os.rst b/Doc/library/os.rst --- a/Doc/library/os.rst +++ b/Doc/library/os.rst @@ -808,16 +808,13 @@ Availability: Unix. -.. function:: fstat(fd, timestamp=None) +.. function:: fstat(fd) Return status for file descriptor *fd*, like :func:`~os.stat`. Availability: Unix, Windows. - .. versionchanged:: 3.3 - Added the *timestamp* argument. - -.. function:: fstatat(dirfd, path, flags=0, timestamp="float") +.. function:: fstatat(dirfd, path, flags=0) Like :func:`stat` but if *path* is relative, it is taken as relative to *dirfd*. *flags* is optional and may be 0 or :data:`AT_SYMLINK_NOFOLLOW`. @@ -1699,7 +1696,7 @@ .. versionadded:: 3.3 -.. function:: lstat(path, timestamp=None) +.. function:: lstat(path) 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 @@ -1709,9 +1706,6 @@ .. versionchanged:: 3.2 Added support for Windows 6.0 (Vista) symbolic links. - .. versionchanged:: 3.3 - The *timestamp* argument was added. - .. function:: lutimes(path[, times]) @@ -1975,7 +1969,7 @@ .. versionadded:: 3.3 -.. function:: stat(path, timestamp=None) +.. function:: stat(path) 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`.) @@ -1995,11 +1989,6 @@ * :attr:`st_ctime` - platform dependent; time of most recent metadata change on Unix, or the time of creation on Windows) - :attr:`st_atime`, :attr:`st_mtime` and :attr:`st_ctime` are :class:`float` - by default, or :class:`int` if :func:`os.stat_float_times` is ``False``. Set - the *timestamp* argument to get another :ref:`timestamp type - `. - On some Unix systems (such as Linux), the following attributes may also be available: @@ -2055,9 +2044,6 @@ Availability: Unix, Windows. - .. versionchanged:: 3.3 - Added the *timestamp* argument. - .. function:: stat_float_times([newvalue]) @@ -2083,9 +2069,6 @@ are processed, this application should turn the feature off until the library has been corrected. - .. deprecated:: 3.3 - Use *timestamp* argument of stat functions instead. - .. function:: statvfs(path) @@ -2876,39 +2859,27 @@ with :const:`P_NOWAIT` return suitable process handles. -.. function:: wait3(options[, timestamp=float]) +.. function:: wait3([options]) Similar to :func:`waitpid`, except no process id argument is given and a 3-element tuple containing the child's process id, exit status indication, and resource usage information is returned. Refer to :mod:`resource`.\ :func:`getrusage` for details on resource usage information. The option argument is the same as that provided to :func:`waitpid` and :func:`wait4`. - :attr:`ru_utime` and :attr:`ru_stime` attributes of the resource usage are - :class:`float` by default, set the *timestamp* argument to get another - :ref:`timestamp type `. Availability: Unix. - .. versionchanged:: 3.3 - Added the *timestamp* argument. - - -.. function:: wait4(pid, options[, timestamp=float]) + +.. function:: wait4(pid, options) Similar to :func:`waitpid`, except a 3-element tuple, containing the child's process id, exit status indication, and resource usage information is returned. Refer to :mod:`resource`.\ :func:`getrusage` for details on resource usage information. The arguments to :func:`wait4` are the same as those provided to :func:`waitpid`. - :attr:`ru_utime` and :attr:`ru_stime` attributes of the resource usage are - :class:`float` by default, set the *timestamp* argument to get another - :ref:`timestamp type `. Availability: Unix. - .. versionchanged:: 3.3 - Added the *timestamp* argument. - .. data:: WNOHANG diff --git a/Doc/library/time.rst b/Doc/library/time.rst --- a/Doc/library/time.rst +++ b/Doc/library/time.rst @@ -95,14 +95,6 @@ | local time | | | +-------------------------+-------------------------+-------------------------+ -.. _timestamp-types: - -* Python supports the following timestamp types: - - * :class:`int` - * :class:`float` - * :class:`decimal.Decimal` - The module defines the following functions and data items: @@ -127,7 +119,7 @@ trailing newline. -.. function:: clock(timestamp=float) +.. function:: clock() .. index:: single: CPU time @@ -144,27 +136,16 @@ :c:func:`QueryPerformanceCounter`. The resolution is typically better than one microsecond. - Return as a floating point number by default, set the *timestamp* argument - to get another :ref:`timestamp type `. - .. versionchanged:: 3.3 - Added the *timestamp* argument. - - -.. function:: clock_getres(clk_id, timestamp=float) +.. function:: clock_getres(clk_id) Return the resolution (precision) of the specified clock *clk_id*. - Return a floating point number by default, set the *timestamp* argument to - get another :ref:`timestamp type `. - .. versionadded:: 3.3 -.. function:: clock_gettime(clk_id, timestamp=float) +.. function:: clock_gettime(clk_id) Return the time of the specified clock *clk_id*. - Return a floating point number by default, set the *timestamp* argument to - get another :ref:`timestamp type `. .. versionadded:: 3.3 @@ -233,22 +214,19 @@ flag is set to ``1`` when DST applies to the given time. -.. function:: mktime(t, timestamp=float) +.. function:: mktime(t) This is the inverse function of :func:`localtime`. Its argument is the :class:`struct_time` or full 9-tuple (since the dst flag is needed; use ``-1`` as the dst flag if it is unknown) which expresses the time in *local* time, not - It returns a floating point number by default, for compatibility with - :func:`time`, set the *timestamp* argument to get another :ref:`timestamp - type `. - + UTC. It returns a floating point number, for compatibility with :func:`time`. If the input value cannot be represented as a valid time, either :exc:`OverflowError` or :exc:`ValueError` will be raised (which depends on whether the invalid value is caught by Python or the underlying C libraries). The earliest date for which it can generate a time is platform-dependent. -.. function:: monotonic(timestamp=float) +.. function:: monotonic() Monotonic clock. The reference point of the returned value is undefined so only the difference of consecutive calls is valid. @@ -462,20 +440,15 @@ :exc:`TypeError` is raised. -.. function:: time(timestamp=float) +.. function:: time() - Return the time expressed in seconds since the epoch in UTC. Return a - floating point number by default, set the *timestamp* argument to get - another :ref:`timestamp type `. - Note that even though the time is always returned as a floating point + Return the time as a floating point number expressed in seconds since the epoch, + in UTC. Note that even though the time is always returned as a floating point number, not all systems provide time with a better precision than 1 second. While this function normally returns non-decreasing values, it can return a lower value than a previous call if the system clock has been set back between the two calls. - .. versionchanged:: 3.3 - Added the *timestamp* argument. - .. data:: timezone @@ -573,16 +546,13 @@ ('EET', 'EEST') -.. function:: wallclock(timestamp=float) +.. function:: wallclock() .. index:: single: Wallclock single: benchmarking Return the current time in fractions of a second to the system's best ability. - Return a floating point number by default, set the *timestamp* argument to - get another :ref:`timestamp type `. - Use this when the most accurate representation of wall-clock is required, i.e. when "processor time" is inappropriate. The reference point of the returned value is undefined so only the difference of consecutive calls is valid. diff --git a/Doc/whatsnew/3.3.rst b/Doc/whatsnew/3.3.rst --- a/Doc/whatsnew/3.3.rst +++ b/Doc/whatsnew/3.3.rst @@ -270,42 +270,6 @@ '' -PEP 410: Use decimal.Decimal type for timestamps -================================================ - -:pep:`410` - Use decimal.Decimal type for timestamps - PEP written and implemented by Victor Stinner. - -The following functions have a new optional *timestamp* argument to get a -timestamp as a :class:`decimal.Decimal` instead of :class:`int` or -:class:`float`: - - * :mod:`time` module: :func:`~time.clock`, :func:`~time.clock_gettime`, - :func:`~time.clock_getres`, :func:`~time.monotonic`, :func:`~time.time` and - :func:`~time.wallclock` - * :mod:`os` module: :func:`~os.fstat`, :func:`~os.fstatat`, :func:`~os.lstat` - and :func:`~os.stat` (``st_atime``, ``st_ctime`` and ``st_mtime`` fields of - the stat structure) - -:class:`decimal.Decimal` supports a resolution of a nanosecond (10^-9) -resolution, whereas :class:`float` has only a resolution of a microsecond -(10^-6) in common cases. See the list of available :ref:`timestamp types -`. - -Example:: - - >>> import decimal, time - >>> time.time() - 1328006975.681211 - >>> time.time(timestamp=int) - 1328006979 - >>> time.time(timestamp=decimal.Decimal) - Decimal('1328006983.761119') - -:func:`os.stat_float_times` has been deprecated, use *timestamp* argument of -`os.stat` instead. - - Other Language Changes ====================== diff --git a/Include/pytime.h b/Include/pytime.h --- a/Include/pytime.h +++ b/Include/pytime.h @@ -2,8 +2,7 @@ #ifndef Py_PYTIME_H #define Py_PYTIME_H -#include "pyport.h" -#include "object.h" +#include "pyconfig.h" /* include for defines */ /************************************************************************** Symbols and macros to supply platform-independent interfaces to time related @@ -38,31 +37,6 @@ ((tv_end.tv_sec - tv_start.tv_sec) + \ (tv_end.tv_usec - tv_start.tv_usec) * 0.000001) -#if defined(HAVE_LONG_LONG) -typedef unsigned PY_LONG_LONG _PyTime_fraction_t; -#else -typedef size_t _PyTime_fraction_t; -#endif - -typedef struct -{ - /* timestamp = seconds + numerator / denominator */ - time_t seconds; - _PyTime_fraction_t numerator; - /* denominator cannot be zero */ - _PyTime_fraction_t denominator; - /* the timestamp resolution is 1/divisor */ -} _PyTime_t; - -/* Similar to POSIX gettimeofday. If system gettimeofday - fails or is not available, fall back to lower resolution clocks. */ -PyAPI_FUNC(void) _PyTime_get(_PyTime_t *tp); - -/* Convert a timestamp structure to the specified timestamp type. - - Raise a ValueError if the timestamp type is unknown. */ -PyAPI_FUNC(PyObject*) _PyTime_Convert(_PyTime_t *ts, PyObject *timestamp); - /* Dummy to force linking. */ PyAPI_FUNC(void) _PyTime_Init(void); diff --git a/Lib/test/test_os.py b/Lib/test/test_os.py --- a/Lib/test/test_os.py +++ b/Lib/test/test_os.py @@ -2,7 +2,6 @@ # does add tests for a few functions which have been determined to be more # portable than they had been thought to be. -import decimal import os import errno import unittest @@ -239,36 +238,6 @@ warnings.simplefilter("ignore", DeprecationWarning) self.check_stat_attributes(fname) - def test_stat_timestamp(self): - # test deprecation - with warnings.catch_warnings(): - warnings.simplefilter("error", DeprecationWarning) - self.assertRaises(DeprecationWarning, os.stat_float_times, False) - - with warnings.catch_warnings(): - warnings.simplefilter("ignore", DeprecationWarning) - old_value = os.stat_float_times() - try: - # test invalid timestamp types - self.assertRaises(ValueError, os.stat, self.fname, - timestamp="abc") - self.assertRaises(ValueError, os.stat, self.fname, - timestamp=decimal.Context) - - for float_times in (False, True): - os.stat_float_times(float_times) - t = os.stat(self.fname).st_mtime - if float_times: - self.assertIsInstance(t, float) - else: - self.assertIsInstance(t, int) - - for type in (int, float, decimal.Decimal): - t = os.stat(self.fname, timestamp=type).st_mtime - self.assertIsInstance(t, type) - finally: - os.stat_float_times(old_value) - def test_statvfs_attributes(self): if not hasattr(os, "statvfs"): return diff --git a/Lib/test/test_time.py b/Lib/test/test_time.py --- a/Lib/test/test_time.py +++ b/Lib/test/test_time.py @@ -1,10 +1,10 @@ -import locale -import platform -import sys -import sysconfig from test import support import time import unittest +import locale +import sysconfig +import sys +import platform # Max year is only limited by the size of C int. SIZEOF_INT = sysconfig.get_config_var('SIZEOF_INT') or 4 @@ -345,31 +345,6 @@ self.assertGreater(t2, t1) self.assertAlmostEqual(dt, 0.1, delta=0.2) - def test_timestamp(self): - import decimal - calls = [ - (time.time,), - (time.mktime, time.localtime()), - ] - if hasattr(time, 'monotonic'): - calls.append((time.monotonic,)) - if hasattr(time, 'wallclock'): - calls.append((time.wallclock,)) - if hasattr(time, 'CLOCK_REALTIME'): - if hasattr(time, 'clock_gettime'): - calls.append((time.clock_gettime, time.CLOCK_REALTIME)) - if hasattr(time, 'clock_getres'): - calls.append((time.clock_getres, time.CLOCK_REALTIME)) - for call in calls: - func, *args = call - - # test invalid timestamp - for invalid in ("int", decimal.Context): - self.assertRaises(ValueError, func, *args, timestamp=invalid) - - for type in (int, float, decimal.Decimal): - self.assertIsInstance(func(*args, timestamp=type), type) - def test_wallclock(self): t1 = time.wallclock() t2 = time.wallclock() diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c --- a/Modules/posixmodule.c +++ b/Modules/posixmodule.c @@ -1702,12 +1702,6 @@ int newval = -1; if (!PyArg_ParseTuple(args, "|i:stat_float_times", &newval)) return NULL; - if (PyErr_WarnEx(PyExc_DeprecationWarning, - "os.stat_float_times() has been deprecated, " - "use timestamp argument of os.stat() instead", - 1)) - return NULL; - if (newval == -1) /* Return old value */ return PyBool_FromLong(_stat_float_times); @@ -1717,12 +1711,9 @@ } static void -fill_time(PyObject *v, int index, time_t sec, unsigned long nsec, - int has_nsec, PyObject *timestamp) +fill_time(PyObject *v, int index, time_t sec, unsigned long nsec) { PyObject *fval,*ival; - _PyTime_t ts; - #if SIZEOF_TIME_T > SIZEOF_LONG ival = PyLong_FromLongLong((PY_LONG_LONG)sec); #else @@ -1730,21 +1721,9 @@ #endif if (!ival) return; - if (timestamp == NULL && _stat_float_times) - timestamp = (PyObject*)&PyFloat_Type; - if (timestamp != NULL) { - ts.seconds = sec; - if (has_nsec) { - ts.numerator = nsec; - ts.denominator = 1000000000; - } - else { - ts.numerator = 0; - ts.denominator = 1; - } - fval = _PyTime_Convert(&ts, timestamp); - } - else { + if (_stat_float_times) { + fval = PyFloat_FromDouble(sec + 1e-9*nsec); + } else { fval = ival; Py_INCREF(fval); } @@ -1755,14 +1734,9 @@ /* pack a system stat C structure into the Python stat tuple (used by posix_stat() and posix_fstat()) */ static PyObject* -_pystat_fromstructstat(STRUCT_STAT *st, PyObject *timestamp) +_pystat_fromstructstat(STRUCT_STAT *st) { unsigned long ansec, mnsec, cnsec; - int has_nsec; -#ifdef HAVE_STRUCT_STAT_ST_BIRTHTIME - _PyTime_t ts; -#endif - PyObject *v = PyStructSequence_New(&StatResultType); if (v == NULL) return NULL; @@ -1794,24 +1768,20 @@ ansec = st->st_atim.tv_nsec; mnsec = st->st_mtim.tv_nsec; cnsec = st->st_ctim.tv_nsec; - has_nsec = 1; #elif defined(HAVE_STAT_TV_NSEC2) ansec = st->st_atimespec.tv_nsec; mnsec = st->st_mtimespec.tv_nsec; cnsec = st->st_ctimespec.tv_nsec; - has_nsec = 1; #elif defined(HAVE_STAT_NSEC) ansec = st->st_atime_nsec; mnsec = st->st_mtime_nsec; cnsec = st->st_ctime_nsec; - has_nsec = 1; #else ansec = mnsec = cnsec = 0; - has_nsec = 0; -#endif - fill_time(v, 7, st->st_atime, ansec, has_nsec, timestamp); - fill_time(v, 8, st->st_mtime, mnsec, has_nsec, timestamp); - fill_time(v, 9, st->st_ctime, cnsec, has_nsec, timestamp); +#endif + fill_time(v, 7, st->st_atime, ansec); + fill_time(v, 8, st->st_mtime, mnsec); + fill_time(v, 9, st->st_ctime, cnsec); #ifdef HAVE_STRUCT_STAT_ST_BLKSIZE PyStructSequence_SET_ITEM(v, ST_BLKSIZE_IDX, @@ -1831,26 +1801,21 @@ #endif #ifdef HAVE_STRUCT_STAT_ST_BIRTHTIME { - PyObject *val; - ts.seconds = (long)st->st_birthtime; + PyObject *val; + unsigned long bsec,bnsec; + bsec = (long)st->st_birthtime; #ifdef HAVE_STAT_TV_NSEC2 - ts.numerator = st->st_birthtimespec.tv_nsec; - ts.denominator = 1000000000; + bnsec = st->st_birthtimespec.tv_nsec; #else - ts.numerator = 0; - ts.denominator = 1; -#endif - if (timestamp == NULL) { - if (_stat_float_times) - val = _PyTime_Convert(&ts, (PyObject*)&PyFloat_Type); - else - val = _PyTime_Convert(&ts, (PyObject*)&PyLong_Type); - } - else { - val = _PyTime_Convert(&ts, timestamp); - } - PyStructSequence_SET_ITEM(v, ST_BIRTHTIME_IDX, - val); + bnsec = 0; +#endif + if (_stat_float_times) { + val = PyFloat_FromDouble(bsec + 1e-9*bnsec); + } else { + val = PyLong_FromLong((long)bsec); + } + PyStructSequence_SET_ITEM(v, ST_BIRTHTIME_IDX, + val); } #endif #ifdef HAVE_STRUCT_STAT_ST_FLAGS @@ -1867,7 +1832,7 @@ } static PyObject * -posix_do_stat(PyObject *self, PyObject *args, PyObject *kw, +posix_do_stat(PyObject *self, PyObject *args, char *format, #ifdef __VMS int (*statfunc)(const char *, STRUCT_STAT *, ...), @@ -1877,18 +1842,15 @@ char *wformat, int (*wstatfunc)(const wchar_t *, STRUCT_STAT *)) { - static char *kwlist[] = {"path", "timestamp", NULL}; STRUCT_STAT st; PyObject *opath; char *path; int res; PyObject *result; - PyObject *timestamp = NULL; #ifdef MS_WINDOWS PyObject *po; - if (PyArg_ParseTupleAndKeywords(args, kw, wformat, kwlist, - &po, ×tamp)) { + if (PyArg_ParseTuple(args, wformat, &po)) { wchar_t *wpath = PyUnicode_AsUnicode(po); if (wpath == NULL) return NULL; @@ -1899,17 +1861,15 @@ if (res != 0) return win32_error_object("stat", po); - return _pystat_fromstructstat(&st, timestamp); + return _pystat_fromstructstat(&st); } /* Drop the argument parsing error as narrow strings are also valid. */ PyErr_Clear(); - timestamp = NULL; -#endif - - if (!PyArg_ParseTupleAndKeywords(args, kw, format, kwlist, - PyUnicode_FSConverter, &opath, - ×tamp)) +#endif + + if (!PyArg_ParseTuple(args, format, + PyUnicode_FSConverter, &opath)) return NULL; #ifdef MS_WINDOWS if (win32_warn_bytes_api()) { @@ -1930,7 +1890,7 @@ #endif } else - result = _pystat_fromstructstat(&st, timestamp); + result = _pystat_fromstructstat(&st); Py_DECREF(opath); return result; @@ -3421,16 +3381,16 @@ PyDoc_STRVAR(posix_stat__doc__, -"stat(path, timestamp=None) -> stat result\n\n\ +"stat(path) -> stat result\n\n\ Perform a stat system call on the given path."); static PyObject * -posix_stat(PyObject *self, PyObject *args, PyObject *kw) +posix_stat(PyObject *self, PyObject *args) { #ifdef MS_WINDOWS - return posix_do_stat(self, args, kw, "O&|O:stat", STAT, "U|O:stat", win32_stat_w); + return posix_do_stat(self, args, "O&:stat", STAT, "U:stat", win32_stat_w); #else - return posix_do_stat(self, args, kw, "O&|O:stat", STAT, NULL, NULL); + return posix_do_stat(self, args, "O&:stat", STAT, NULL, NULL); #endif } @@ -6158,12 +6118,11 @@ #if defined(HAVE_WAIT3) || defined(HAVE_WAIT4) static PyObject * -wait_helper(pid_t pid, int status, struct rusage *ru, PyObject *timestamp) +wait_helper(pid_t pid, int status, struct rusage *ru) { PyObject *result; static PyObject *struct_rusage; _Py_IDENTIFIER(struct_rusage); - _PyTime_t ts; if (pid == -1) return posix_error(); @@ -6187,17 +6146,10 @@ #define doubletime(TV) ((double)(TV).tv_sec + (TV).tv_usec * 0.000001) #endif - ts.seconds = ru->ru_utime.tv_sec; - ts.numerator = ru->ru_utime.tv_usec; - ts.denominator = 1000000; PyStructSequence_SET_ITEM(result, 0, - _PyTime_Convert(&ts, timestamp)); - - ts.seconds = ru->ru_stime.tv_sec; - ts.numerator = ru->ru_stime.tv_usec; - ts.denominator = 1000000; + PyFloat_FromDouble(doubletime(ru->ru_utime))); PyStructSequence_SET_ITEM(result, 1, - _PyTime_Convert(&ts, timestamp)); + PyFloat_FromDouble(doubletime(ru->ru_stime))); #define SET_INT(result, index, value)\ PyStructSequence_SET_ITEM(result, index, PyLong_FromLong(value)) SET_INT(result, 2, ru->ru_maxrss); @@ -6227,55 +6179,51 @@ #ifdef HAVE_WAIT3 PyDoc_STRVAR(posix_wait3__doc__, -"wait3(options[, timestamp=float]) -> (pid, status, rusage)\n\n\ +"wait3(options) -> (pid, status, rusage)\n\n\ Wait for completion of a child process."); static PyObject * -posix_wait3(PyObject *self, PyObject *args, PyObject *kwargs) -{ - static char *kwlist[] = {"options", "timestamp", NULL}; +posix_wait3(PyObject *self, PyObject *args) +{ pid_t pid; int options; struct rusage ru; WAIT_TYPE status; WAIT_STATUS_INT(status) = 0; - PyObject *timestamp = NULL; - - if (!PyArg_ParseTupleAndKeywords(args, kwargs, "i|O:wait3", kwlist, &options, ×tamp)) + + if (!PyArg_ParseTuple(args, "i:wait3", &options)) return NULL; Py_BEGIN_ALLOW_THREADS pid = wait3(&status, options, &ru); Py_END_ALLOW_THREADS - return wait_helper(pid, WAIT_STATUS_INT(status), &ru, timestamp); + return wait_helper(pid, WAIT_STATUS_INT(status), &ru); } #endif /* HAVE_WAIT3 */ #ifdef HAVE_WAIT4 PyDoc_STRVAR(posix_wait4__doc__, -"wait4(pid, options[, timestamp=float]) -> (pid, status, rusage)\n\n\ +"wait4(pid, options) -> (pid, status, rusage)\n\n\ Wait for completion of a given child process."); static PyObject * -posix_wait4(PyObject *self, PyObject *args, PyObject *kwargs) -{ - static char *kwlist[] = {"pid", "options", "timestamp", NULL}; +posix_wait4(PyObject *self, PyObject *args) +{ pid_t pid; int options; struct rusage ru; WAIT_TYPE status; WAIT_STATUS_INT(status) = 0; - PyObject *timestamp = NULL; - - if (!PyArg_ParseTupleAndKeywords(args, kwargs, _Py_PARSE_PID "i|O:wait4", kwlist, &pid, &options, ×tamp)) + + if (!PyArg_ParseTuple(args, _Py_PARSE_PID "i:wait4", &pid, &options)) return NULL; Py_BEGIN_ALLOW_THREADS pid = wait4(pid, &status, options, &ru); Py_END_ALLOW_THREADS - return wait_helper(pid, WAIT_STATUS_INT(status), &ru, timestamp); + return wait_helper(pid, WAIT_STATUS_INT(status), &ru); } #endif /* HAVE_WAIT4 */ @@ -6402,20 +6350,20 @@ PyDoc_STRVAR(posix_lstat__doc__, -"lstat(path, timestamp=None) -> stat result\n\n\ +"lstat(path) -> stat result\n\n\ Like stat(path), but do not follow symbolic links."); static PyObject * -posix_lstat(PyObject *self, PyObject *args, PyObject *kw) +posix_lstat(PyObject *self, PyObject *args) { #ifdef HAVE_LSTAT - return posix_do_stat(self, args, kw, "O&|O:lstat", lstat, NULL, NULL); + return posix_do_stat(self, args, "O&:lstat", lstat, NULL, NULL); #else /* !HAVE_LSTAT */ #ifdef MS_WINDOWS - return posix_do_stat(self, args, kw, "O&|O:lstat", win32_lstat, "U|O:lstat", + return posix_do_stat(self, args, "O&:lstat", win32_lstat, "U:lstat", win32_lstat_w); #else - return posix_do_stat(self, args, "kw, O&|O:lstat", STAT, NULL, NULL); + return posix_do_stat(self, args, "O&:lstat", STAT, NULL, NULL); #endif #endif /* !HAVE_LSTAT */ } @@ -7374,19 +7322,16 @@ #endif PyDoc_STRVAR(posix_fstat__doc__, -"fstat(fd, timestamp=None) -> stat result\n\n\ +"fstat(fd) -> stat result\n\n\ Like stat(), but for an open file descriptor."); static PyObject * -posix_fstat(PyObject *self, PyObject *args, PyObject *kwargs) -{ - static char *kwlist[] = {"fd", "timestamp", NULL}; +posix_fstat(PyObject *self, PyObject *args) +{ int fd; STRUCT_STAT st; int res; - PyObject *timestamp = NULL; - if (!PyArg_ParseTupleAndKeywords(args, kwargs, "i|O:fstat", kwlist, - &fd, ×tamp)) + if (!PyArg_ParseTuple(args, "i:fstat", &fd)) return NULL; #ifdef __VMS /* on OpenVMS we must ensure that all bytes are written to the file */ @@ -7405,7 +7350,7 @@ #endif } - return _pystat_fromstructstat(&st, timestamp); + return _pystat_fromstructstat(&st); } PyDoc_STRVAR(posix_isatty__doc__, @@ -9689,25 +9634,22 @@ #ifdef HAVE_FSTATAT PyDoc_STRVAR(posix_fstatat__doc__, -"fstatat(dirfd, path, flags=0, timestamp=None) -> stat result\n\n\ +"fstatat(dirfd, path, flags=0) -> stat result\n\n\ Like stat() but if path is relative, it is taken as relative to dirfd.\n\ flags is optional and may be 0 or AT_SYMLINK_NOFOLLOW.\n\ If path is relative and dirfd is the special value AT_FDCWD, then path\n\ is interpreted relative to the current working directory."); static PyObject * -posix_fstatat(PyObject *self, PyObject *args, PyObject *kwargs) -{ - static char *kwlist[] = {"dirfd", "path", "flags", "timestamp", NULL}; +posix_fstatat(PyObject *self, PyObject *args) +{ PyObject *opath; char *path; STRUCT_STAT st; int dirfd, res, flags = 0; - PyObject *timestamp = NULL; - - if (!PyArg_ParseTupleAndKeywords(args, kwargs, "iO&|iO:fstatat", kwlist, - &dirfd, PyUnicode_FSConverter, &opath, - &flags, ×tamp)) + + if (!PyArg_ParseTuple(args, "iO&|i:fstatat", + &dirfd, PyUnicode_FSConverter, &opath, &flags)) return NULL; path = PyBytes_AsString(opath); @@ -9718,7 +9660,7 @@ if (res != 0) return posix_error(); - return _pystat_fromstructstat(&st, timestamp); + return _pystat_fromstructstat(&st); } #endif @@ -10582,7 +10524,7 @@ #ifdef HAVE_FDOPENDIR {"flistdir", posix_flistdir, METH_VARARGS, posix_flistdir__doc__}, #endif - {"lstat", (PyCFunction)posix_lstat, METH_VARARGS | METH_KEYWORDS, posix_lstat__doc__}, + {"lstat", posix_lstat, METH_VARARGS, posix_lstat__doc__}, {"mkdir", posix_mkdir, METH_VARARGS, posix_mkdir__doc__}, #ifdef HAVE_NICE {"nice", posix_nice, METH_VARARGS, posix_nice__doc__}, @@ -10602,8 +10544,7 @@ {"rename", posix_rename, METH_VARARGS, posix_rename__doc__}, {"replace", posix_replace, METH_VARARGS, posix_replace__doc__}, {"rmdir", posix_rmdir, METH_VARARGS, posix_rmdir__doc__}, - {"stat", (PyCFunction)posix_stat, - METH_VARARGS | METH_KEYWORDS, posix_stat__doc__}, + {"stat", posix_stat, METH_VARARGS, 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__}, @@ -10764,12 +10705,10 @@ {"wait", posix_wait, METH_NOARGS, posix_wait__doc__}, #endif /* HAVE_WAIT */ #ifdef HAVE_WAIT3 - {"wait3", (PyCFunction)posix_wait3, - METH_VARARGS | METH_KEYWORDS, posix_wait3__doc__}, + {"wait3", posix_wait3, METH_VARARGS, posix_wait3__doc__}, #endif /* HAVE_WAIT3 */ #ifdef HAVE_WAIT4 - {"wait4", (PyCFunction)posix_wait4, - METH_VARARGS | METH_KEYWORDS, posix_wait4__doc__}, + {"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__}, @@ -10820,8 +10759,7 @@ {"sendfile", (PyCFunction)posix_sendfile, METH_VARARGS | METH_KEYWORDS, posix_sendfile__doc__}, #endif - {"fstat", (PyCFunction)posix_fstat, METH_VARARGS | METH_KEYWORDS, - posix_fstat__doc__}, + {"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__}, @@ -10956,8 +10894,7 @@ {"fchownat", posix_fchownat, METH_VARARGS, posix_fchownat__doc__}, #endif /* HAVE_FCHOWNAT */ #ifdef HAVE_FSTATAT - {"fstatat", (PyCFunction)posix_fstatat, METH_VARARGS | METH_KEYWORDS, - posix_fstatat__doc__}, + {"fstatat", posix_fstatat, METH_VARARGS, posix_fstatat__doc__}, #endif #ifdef HAVE_FUTIMESAT {"futimesat", posix_futimesat, METH_VARARGS, posix_futimesat__doc__}, diff --git a/Modules/timemodule.c b/Modules/timemodule.c --- a/Modules/timemodule.c +++ b/Modules/timemodule.c @@ -40,30 +40,24 @@ #include #endif -#if (defined(MS_WINDOWS) && !defined(__BORLANDC__)) || defined(HAVE_CLOCK) -# define HAVE_PYCLOCK -#endif - /* Forward declarations */ static int floatsleep(double); +static double floattime(void); static PyObject * -time_time(PyObject *self, PyObject *args, PyObject *kwargs) +time_time(PyObject *self, PyObject *unused) { - static char *kwlist[] = {"timestamp", NULL}; - PyObject *timestamp = NULL; - _PyTime_t ts; - - if (!PyArg_ParseTupleAndKeywords(args, kwargs, "|O:time", kwlist, - ×tamp)) + double secs; + secs = floattime(); + if (secs == 0.0) { + PyErr_SetFromErrno(PyExc_IOError); return NULL; - - _PyTime_get(&ts); - return _PyTime_Convert(&ts, timestamp); + } + return PyFloat_FromDouble(secs); } PyDoc_STRVAR(time_doc, -"time(timestamp=float) -> floating point number\n\ +"time() -> floating point number\n\ \n\ Return the current time in seconds since the Epoch.\n\ Fractions of a second may be present if the system clock provides them."); @@ -78,91 +72,65 @@ #endif #endif -static int -pyclock(_PyTime_t *ts) +static PyObject * +pyclock(void) { - clock_t processor_time; - processor_time = clock(); - if (processor_time == (clock_t)-1) { + 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 -1; + return NULL; } - ts->seconds = 0; - assert(sizeof(clock_t) <= sizeof(_PyTime_fraction_t)); - ts->numerator = Py_SAFE_DOWNCAST(processor_time, - clock_t, _PyTime_fraction_t); - ts->denominator = CLOCKS_PER_SEC; - return 0; + return PyFloat_FromDouble((double)value / CLOCKS_PER_SEC); } #endif /* HAVE_CLOCK */ #if defined(MS_WINDOWS) && !defined(__BORLANDC__) /* Win32 has better clock replacement; we have our own version, due to Mark Hammond and Tim Peters */ -static int -win32_clock(_PyTime_t *ts, int fallback) +static PyObject * +win32_clock(int fallback) { static LONGLONG cpu_frequency = 0; - static LONGLONG start; + static LONGLONG ctrStart; LARGE_INTEGER now; - LONGLONG dt; + double diff; if (cpu_frequency == 0) { LARGE_INTEGER freq; QueryPerformanceCounter(&now); - start = now.QuadPart; + ctrStart = now.QuadPart; if (!QueryPerformanceFrequency(&freq) || freq.QuadPart == 0) { /* Unlikely to happen - this works on all intel machines at least! Revert to clock() */ - if (fallback) { - return pyclock(ts); - } - else { - PyErr_SetFromWindowsErr(0); - return -1; - } + if (fallback) + return pyclock(); + else + return PyErr_SetFromWindowsErr(0); } cpu_frequency = freq.QuadPart; } QueryPerformanceCounter(&now); - dt = now.QuadPart - start; - - ts->seconds = 0; - assert(sizeof(LONGLONG) <= sizeof(_PyTime_fraction_t)); - ts->numerator = Py_SAFE_DOWNCAST(dt, - LONGLONG, _PyTime_fraction_t); - ts->denominator = Py_SAFE_DOWNCAST(cpu_frequency, - LONGLONG, _PyTime_fraction_t); - return 0; + diff = (double)(now.QuadPart - ctrStart); + return PyFloat_FromDouble(diff / (double)cpu_frequency); } #endif #if (defined(MS_WINDOWS) && !defined(__BORLANDC__)) || defined(HAVE_CLOCK) static PyObject * -time_clock(PyObject *self, PyObject *args, PyObject *kwargs) +time_clock(PyObject *self, PyObject *unused) { - static char *kwlist[] = {"timestamp", NULL}; - _PyTime_t ts; - PyObject *timestamp = NULL; - - if (!PyArg_ParseTupleAndKeywords(args, kwargs, "|O:clock", kwlist, - ×tamp)) - return NULL; - #if defined(MS_WINDOWS) && !defined(__BORLANDC__) - if (win32_clock(&ts, 1) == -1) - return NULL; + return win32_clock(1); #else - if (pyclock(&ts) == -1) - return NULL; + return pyclock(); #endif - return _PyTime_Convert(&ts, timestamp); } PyDoc_STRVAR(clock_doc, -"clock(timestamp=float) -> floating point number\n\ +"clock() -> floating point number\n\ \n\ Return the CPU time or real time since the start of the process or since\n\ the first call to clock(). This has as much precision as the system\n\ @@ -171,17 +139,13 @@ #ifdef HAVE_CLOCK_GETTIME static PyObject * -time_clock_gettime(PyObject *self, PyObject *args, PyObject *kwargs) +time_clock_gettime(PyObject *self, PyObject *args) { - static char *kwlist[] = {"clk_id", "timestamp", NULL}; - PyObject *timestamp = NULL; int ret; clockid_t clk_id; struct timespec tp; - _PyTime_t ts; - if (!PyArg_ParseTupleAndKeywords(args, kwargs, "i|O:clock_gettime", kwlist, - &clk_id, ×tamp)) + if (!PyArg_ParseTuple(args, "i:clock_gettime", &clk_id)) return NULL; ret = clock_gettime((clockid_t)clk_id, &tp); @@ -189,31 +153,25 @@ PyErr_SetFromErrno(PyExc_IOError); return NULL; } - ts.seconds = tp.tv_sec; - ts.numerator = tp.tv_nsec; - ts.denominator = 1000000000; - return _PyTime_Convert(&ts, timestamp); + + return PyFloat_FromDouble(tp.tv_sec + tp.tv_nsec * 1e-9); } PyDoc_STRVAR(clock_gettime_doc, -"clock_gettime(clk_id, timestamp=float) -> floating point number\n\ +"clock_gettime(clk_id) -> floating point number\n\ \n\ Return the time of the specified clock clk_id."); #endif #ifdef HAVE_CLOCK_GETRES static PyObject * -time_clock_getres(PyObject *self, PyObject *args, PyObject *kwargs) +time_clock_getres(PyObject *self, PyObject *args) { - static char *kwlist[] = {"clk_id", "timestamp", NULL}; - PyObject *timestamp = NULL; int ret; clockid_t clk_id; struct timespec tp; - _PyTime_t ts; - if (!PyArg_ParseTupleAndKeywords(args, kwargs, "i|O:clock_getres", kwlist, - &clk_id, ×tamp)) + if (!PyArg_ParseTuple(args, "i:clock_getres", &clk_id)) return NULL; ret = clock_getres((clockid_t)clk_id, &tp); @@ -221,14 +179,12 @@ PyErr_SetFromErrno(PyExc_IOError); return NULL; } - ts.seconds = tp.tv_sec; - ts.numerator = tp.tv_nsec; - ts.denominator = 1000000000; - return _PyTime_Convert(&ts, timestamp); + + return PyFloat_FromDouble(tp.tv_sec + tp.tv_nsec * 1e-9); } PyDoc_STRVAR(clock_getres_doc, -"clock_getres(clk_id, timestamp=float) -> floating point number\n\ +"clock_getres(clk_id) -> floating point number\n\ \n\ Return the resolution (precision) of the specified clock clk_id."); #endif @@ -751,19 +707,10 @@ #ifdef HAVE_MKTIME static PyObject * -time_mktime(PyObject *self, PyObject *args, PyObject *kwargs) +time_mktime(PyObject *self, PyObject *tup) { - static char *kwlist[] = {"t", "timestamp", NULL}; - PyObject *timestamp = NULL; - PyObject *tup; struct tm buf; time_t tt; - _PyTime_t ts; - - if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O|O:mktime", kwlist, - &tup, ×tamp)) - return NULL; - if (!gettmarg(tup, &buf)) return NULL; buf.tm_wday = -1; /* sentinel; original value ignored */ @@ -775,10 +722,7 @@ "mktime argument out of range"); return NULL; } - ts.seconds = tt; - ts.numerator = 0; - ts.denominator = 1; - return _PyTime_Convert(&ts, timestamp); + return PyFloat_FromDouble((double)tt); } PyDoc_STRVAR(mktime_doc, @@ -824,14 +768,12 @@ should not be relied on."); #endif /* HAVE_WORKING_TZSET */ -static int -pywallclock(_PyTime_t *ts) +static PyObject * +time_wallclock(PyObject *self, PyObject *unused) { #if defined(MS_WINDOWS) && !defined(__BORLANDC__) - return win32_clock(ts, 1); -#else - -#if defined(HAVE_CLOCK_GETTIME) && defined(CLOCK_MONOTONIC) + return win32_clock(1); +#elif defined(HAVE_CLOCK_GETTIME) && defined(CLOCK_MONOTONIC) static int clk_index = 0; clockid_t clk_ids[] = { #ifdef CLOCK_MONOTONIC_RAW @@ -851,41 +793,20 @@ clockid_t clk_id = clk_ids[clk_index]; ret = clock_gettime(clk_id, &tp); if (ret == 0) - { - ts->seconds = tp.tv_sec; - ts->numerator = tp.tv_nsec; - ts->denominator = 1000000000; - return 0; - } + return PyFloat_FromDouble(tp.tv_sec + tp.tv_nsec * 1e-9); clk_index++; if (Py_ARRAY_LENGTH(clk_ids) <= clk_index) clk_index = -1; } -#endif /* defined(HAVE_CLOCK_GETTIME) && defined(CLOCK_MONOTONIC) */ - - _PyTime_get(ts); - return 0; + return time_time(self, NULL); +#else + return time_time(self, NULL); #endif } -static PyObject * -time_wallclock(PyObject *self, PyObject *args, PyObject *kwargs) -{ - static char *kwlist[] = {"timestamp", NULL}; - PyObject *timestamp = NULL; - _PyTime_t ts; - - if (!PyArg_ParseTupleAndKeywords(args, kwargs, "|O:wallclock", kwlist, - ×tamp)) - return NULL; - if (pywallclock(&ts)) - return NULL; - return _PyTime_Convert(&ts, timestamp); -} - PyDoc_STRVAR(wallclock_doc, -"wallclock(timestamp=float)\n\ +"wallclock() -> float\n\ \n\ Return the current time in fractions of a second to the system's best\n\ ability. Use this when the most accurate representation of wall-clock is\n\ @@ -900,11 +821,11 @@ #ifdef HAVE_PYTIME_MONOTONIC static PyObject * -time_monotonic(PyObject *self, PyObject *args, PyObject *kwargs) +time_monotonic(PyObject *self, PyObject *unused) { - static char *kwlist[] = {"timestamp", NULL}; - PyObject *timestamp = NULL; -#if defined(HAVE_CLOCK_GETTIME) && defined(CLOCK_MONOTONIC) +#if defined(MS_WINDOWS) && !defined(__BORLANDC__) + return win32_clock(0); +#else static int clk_index = 0; clockid_t clk_ids[] = { #ifdef CLOCK_MONOTONIC_RAW @@ -914,28 +835,12 @@ }; int ret; struct timespec tp; -#endif - _PyTime_t ts; - if (!PyArg_ParseTupleAndKeywords(args, kwargs, "|O:monotonic", kwlist, - ×tamp)) - return NULL; - -#if defined(MS_WINDOWS) && !defined(__BORLANDC__) - if (win32_clock(&ts, 0) == -1) - return NULL; - return _PyTime_Convert(&ts, timestamp); -#else while (0 <= clk_index) { clockid_t clk_id = clk_ids[clk_index]; ret = clock_gettime(clk_id, &tp); if (ret == 0) - { - ts.seconds = tp.tv_sec; - ts.numerator = tp.tv_nsec; - ts.denominator = 1000000000; - return _PyTime_Convert(&ts, timestamp); - } + return PyFloat_FromDouble(tp.tv_sec + tp.tv_nsec * 1e-9); clk_index++; if (Py_ARRAY_LENGTH(clk_ids) <= clk_index) @@ -1063,19 +968,15 @@ static PyMethodDef time_methods[] = { - {"time", (PyCFunction)time_time, - METH_VARARGS | METH_KEYWORDS, time_doc}, -#ifdef HAVE_PYCLOCK - {"clock", (PyCFunction)time_clock, - METH_VARARGS | METH_KEYWORDS, clock_doc}, + {"time", time_time, METH_NOARGS, time_doc}, +#if (defined(MS_WINDOWS) && !defined(__BORLANDC__)) || defined(HAVE_CLOCK) + {"clock", time_clock, METH_NOARGS, clock_doc}, #endif #ifdef HAVE_CLOCK_GETTIME - {"clock_gettime", (PyCFunction)time_clock_gettime, - METH_VARARGS | METH_KEYWORDS, clock_gettime_doc}, + {"clock_gettime", time_clock_gettime, METH_VARARGS, clock_gettime_doc}, #endif #ifdef HAVE_CLOCK_GETRES - {"clock_getres", (PyCFunction)time_clock_getres, - METH_VARARGS | METH_KEYWORDS, clock_getres_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}, @@ -1083,12 +984,10 @@ {"asctime", time_asctime, METH_VARARGS, asctime_doc}, {"ctime", time_ctime, METH_VARARGS, ctime_doc}, #ifdef HAVE_MKTIME - {"mktime", (PyCFunction)time_mktime, - METH_VARARGS | METH_KEYWORDS, mktime_doc}, + {"mktime", time_mktime, METH_O, mktime_doc}, #endif #ifdef HAVE_PYTIME_MONOTONIC - {"monotonic", (PyCFunction)time_monotonic, - METH_VARARGS | METH_KEYWORDS, monotonic_doc}, + {"monotonic", time_monotonic, METH_NOARGS, monotonic_doc}, #endif #ifdef HAVE_STRFTIME {"strftime", time_strftime, METH_VARARGS, strftime_doc}, @@ -1097,8 +996,7 @@ #ifdef HAVE_WORKING_TZSET {"tzset", time_tzset, METH_NOARGS, tzset_doc}, #endif - {"wallclock", (PyCFunction)time_wallclock, - METH_VARARGS | METH_KEYWORDS, wallclock_doc}, + {"wallclock", time_wallclock, METH_NOARGS, wallclock_doc}, {NULL, NULL} /* sentinel */ }; @@ -1183,6 +1081,15 @@ return m; } +static double +floattime(void) +{ + _PyTime_timeval t; + _PyTime_gettimeofday(&t); + return (double)t.tv_sec + t.tv_usec*0.000001; +} + + /* Implement floatsleep() for various platforms. When interrupted (or when another error occurs), return -1 and set an exception; else return 0. */ diff --git a/Python/pytime.c b/Python/pytime.c --- a/Python/pytime.c +++ b/Python/pytime.c @@ -18,36 +18,24 @@ extern int ftime(struct timeb *); #endif -#define MICROSECONDS 1000000 - void -_PyTime_get(_PyTime_t *ts) +_PyTime_gettimeofday(_PyTime_timeval *tp) { #ifdef MS_WINDOWS FILETIME system_time; ULARGE_INTEGER large; - ULONGLONG value; + ULONGLONG microseconds; GetSystemTimeAsFileTime(&system_time); large.u.LowPart = system_time.dwLowDateTime; large.u.HighPart = system_time.dwHighDateTime; - /* 116,444,736,000,000,000: number of 100 ns between + /* 11,644,473,600,000,000: number of microseconds between the 1st january 1601 and the 1st january 1970 (369 years + 89 leap days). */ - value = large.QuadPart - 116444736000000000; - ts->seconds = 0; - ts->numerator = value; - ts->denominator = (_PyTime_fraction_t)10000000; + microseconds = large.QuadPart / 10 - 11644473600000000; + tp->tv_sec = microseconds / 1000000; + tp->tv_usec = microseconds % 1000000; #else - -#ifdef HAVE_GETTIMEOFDAY - struct timeval tv; - int err; -#endif -#if defined(HAVE_FTIME) - struct timeb t; -#endif - /* There are three ways to get the time: (1) gettimeofday() -- resolution in microseconds (2) ftime() -- resolution in milliseconds @@ -59,325 +47,30 @@ #ifdef HAVE_GETTIMEOFDAY #ifdef GETTIMEOFDAY_NO_TZ - err = gettimeofday(&tv); + if (gettimeofday(tp) == 0) + return; #else /* !GETTIMEOFDAY_NO_TZ */ - err = gettimeofday(&tv, (struct timezone *)NULL); + if (gettimeofday(tp, (struct timezone *)NULL) == 0) + return; #endif /* !GETTIMEOFDAY_NO_TZ */ - if (err == 0) - { - ts->seconds = tv.tv_sec; - ts->numerator = tv.tv_usec; - ts->denominator = MICROSECONDS; - return; - } #endif /* !HAVE_GETTIMEOFDAY */ #if defined(HAVE_FTIME) - ftime(&t); - ts->seconds = t.time; - ts->numerator = t.millitm; - ts->denominator = 1000; + { + struct timeb t; + ftime(&t); + tp->tv_sec = t.time; + tp->tv_usec = t.millitm * 1000; + } #else /* !HAVE_FTIME */ - ts->seconds = time(NULL); - ts->numerator = 0; - ts->denominator = 1; + tp->tv_sec = time(NULL); + tp->tv_usec = 0; #endif /* !HAVE_FTIME */ #endif /* MS_WINDOWS */ } void -_PyTime_gettimeofday(_PyTime_timeval *tv) -{ - _PyTime_t ts; - _PyTime_fraction_t k; - time_t sec; - - _PyTime_get(&ts); - tv->tv_sec = ts.seconds; - if (ts.numerator) { - if (ts.numerator > ts.denominator) { - sec = Py_SAFE_DOWNCAST(ts.numerator / ts.denominator, - _PyTime_fraction_t, time_t); - /* ignore integer overflow because _PyTime_gettimeofday() has - no return value */ - tv->tv_sec += sec; - ts.numerator = ts.numerator % ts.denominator; - } - if (MICROSECONDS >= ts.denominator) { - k = (_PyTime_fraction_t)MICROSECONDS / ts.denominator; - tv->tv_usec = (long)(ts.numerator * k); - } - else { - k = ts.denominator / (_PyTime_fraction_t)MICROSECONDS; - tv->tv_usec = (long)(ts.numerator / k); - } - } - else { - tv->tv_usec = 0; - } -} - -static PyObject* -_PyLong_FromTime_t(time_t value) -{ -#if SIZEOF_TIME_T <= SIZEOF_LONG - return PyLong_FromLong(value); -#else - assert(sizeof(time_t) <= sizeof(PY_LONG_LONG)); - return PyLong_FromLongLong(value); -#endif -} - -#if defined(HAVE_LONG_LONG) -# define _PyLong_FromTimeFraction_t PyLong_FromLongLong -#else -# define _PyLong_FromTimeFraction_t PyLong_FromSize_t -#endif - -/* Convert a timestamp to a PyFloat object */ -static PyObject* -_PyTime_AsFloat(_PyTime_t *ts) -{ - double d; - d = (double)ts->seconds; - d += (double)ts->numerator / (double)ts->denominator; - return PyFloat_FromDouble(d); -} - -/* Convert a timestamp to a PyLong object */ -static PyObject* -_PyTime_AsLong(_PyTime_t *ts) -{ - PyObject *a, *b, *c; - - a = _PyLong_FromTime_t(ts->seconds); - if (a == NULL) - return NULL; - b = _PyLong_FromTimeFraction_t(ts->numerator / ts->denominator); - if (b == NULL) - { - Py_DECREF(a); - return NULL; - } - c = PyNumber_Add(a, b); - Py_DECREF(a); - Py_DECREF(b); - return c; -} - -/* Convert a timestamp to a decimal.Decimal object */ -static PyObject* -_PyTime_AsDecimal(_PyTime_t *ts) -{ - static PyObject* module = NULL; - static PyObject* decimal = NULL; - static PyObject* exponent_context = NULL; - static PyObject* context = NULL; - /* exponent cache, dictionary of: - int (denominator) => Decimal (1/denominator) */ - static PyObject* exponent_cache = NULL; - PyObject *t = NULL; - PyObject *key, *exponent, *quantized; - _Py_IDENTIFIER(quantize); - _Py_IDENTIFIER(__truediv__); - - if (!module) { - module = PyImport_ImportModuleNoBlock("decimal"); - if (module == NULL) - return NULL; - } - - if (!decimal) { - decimal = PyObject_GetAttrString(module, "Decimal"); - if (decimal == NULL) - return NULL; - } - - if (context == NULL) - { - /* Use 12 decimal digits to store 10,000 years in seconds + 9 - decimal digits for the floating part in nanoseconds + 1 decimal - digit to round correctly. - - context = decimal.Context(22, rounding=decimal.ROUND_HALF_EVEN) - exponent_context = decimal.Context(1, rounding=decimal.ROUND_HALF_EVEN) - */ - PyObject *context_class, *rounding; - context_class = PyObject_GetAttrString(module, "Context"); - if (context_class == NULL) - return NULL; - rounding = PyObject_GetAttrString(module, "ROUND_HALF_EVEN"); - if (rounding == NULL) - { - Py_DECREF(context_class); - return NULL; - } - context = PyObject_CallFunction(context_class, "iO", 22, rounding); - if (context == NULL) - { - Py_DECREF(context_class); - Py_DECREF(rounding); - return NULL; - } - - exponent_context = PyObject_CallFunction(context_class, "iO", 1, rounding); - Py_DECREF(context_class); - Py_DECREF(rounding); - if (exponent_context == NULL) - { - Py_CLEAR(context); - return NULL; - } - } - - /* t = decimal.Decimal(value) */ - if (ts->seconds) { - PyObject *f = _PyLong_FromTime_t(ts->seconds); - t = PyObject_CallFunction(decimal, "O", f); - Py_CLEAR(f); - } - else { - t = PyObject_CallFunction(decimal, "iO", 0, context); - } - if (t == NULL) - return NULL; - - if (ts->numerator) - { - /* t += decimal.Decimal(numerator, ctx) / decimal.Decimal(denominator, ctx) */ - PyObject *a, *b, *c, *d, *x; - - x = _PyLong_FromTimeFraction_t(ts->numerator); - if (x == NULL) - goto error; - a = PyObject_CallFunction(decimal, "OO", x, context); - Py_CLEAR(x); - if (a == NULL) - goto error; - - x = _PyLong_FromTimeFraction_t(ts->denominator); - if (x == NULL) - { - Py_DECREF(a); - goto error; - } - b = PyObject_CallFunction(decimal, "OO", x, context); - Py_CLEAR(x); - if (b == NULL) - { - Py_DECREF(a); - goto error; - } - - c = _PyObject_CallMethodId(a, &PyId___truediv__, "OO", - b, context); - Py_DECREF(a); - Py_DECREF(b); - if (c == NULL) - goto error; - - d = PyNumber_Add(t, c); - Py_DECREF(c); - if (d == NULL) - goto error; - Py_DECREF(t); - t = d; - } - - if (exponent_cache == NULL) { - exponent_cache = PyDict_New(); - if (exponent_cache == NULL) - goto error; - } - - key = _PyLong_FromTimeFraction_t(ts->denominator); - if (key == NULL) - goto error; - exponent = PyDict_GetItem(exponent_cache, key); - if (exponent == NULL) { - /* exponent = decimal.Decimal(1) / decimal.Decimal(resolution) */ - PyObject *one, *denominator; - - one = PyObject_CallFunction(decimal, "i", 1); - if (one == NULL) { - Py_DECREF(key); - goto error; - } - - denominator = PyObject_CallFunction(decimal, "O", key); - if (denominator == NULL) { - Py_DECREF(key); - Py_DECREF(one); - goto error; - } - - exponent = _PyObject_CallMethodId(one, &PyId___truediv__, "OO", - denominator, exponent_context); - Py_DECREF(one); - Py_DECREF(denominator); - if (exponent == NULL) { - Py_DECREF(key); - goto error; - } - - if (PyDict_SetItem(exponent_cache, key, exponent) < 0) { - Py_DECREF(key); - Py_DECREF(exponent); - goto error; - } - Py_DECREF(key); - } - - /* t = t.quantize(exponent, None, context) */ - quantized = _PyObject_CallMethodId(t, &PyId_quantize, "OOO", - exponent, Py_None, context); - if (quantized == NULL) - goto error; - Py_DECREF(t); - t = quantized; - - return t; - -error: - Py_XDECREF(t); - return NULL; -} - -PyObject* -_PyTime_Convert(_PyTime_t *ts, PyObject *format) -{ - assert(ts->denominator != 0); - - if (format == NULL || (PyTypeObject *)format == &PyFloat_Type) - return _PyTime_AsFloat(ts); - if ((PyTypeObject *)format == &PyLong_Type) - return _PyTime_AsLong(ts); - - if (PyType_Check(format)) - { - PyObject *module, *name; - _Py_IDENTIFIER(__name__); - _Py_IDENTIFIER(__module__); - - module = _PyObject_GetAttrId(format, &PyId___module__); - name = _PyObject_GetAttrId(format, &PyId___name__); - if (module != NULL && PyUnicode_Check(module) - && name != NULL && PyUnicode_Check(name)) - { - if (PyUnicode_CompareWithASCIIString(module, "decimal") == 0 - && PyUnicode_CompareWithASCIIString(name, "Decimal") == 0) - return _PyTime_AsDecimal(ts); - } - else - PyErr_Clear(); - } - - PyErr_Format(PyExc_ValueError, "Unknown timestamp format: %R", format); - return NULL; -} - -void _PyTime_Init() { /* Do nothing. Needed to force linking. */ -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Feb 8 23:31:30 2012 From: python-checkins at python.org (antoine.pitrou) Date: Wed, 08 Feb 2012 23:31:30 +0100 Subject: [Python-checkins] =?utf8?q?cpython=3A_Issue_=2313609=3A_Add_two_f?= =?utf8?q?unctions_to_query_the_terminal_size=3A?= Message-ID: http://hg.python.org/cpython/rev/c92f8de398ed changeset: 74835:c92f8de398ed user: Antoine Pitrou date: Wed Feb 08 23:28:36 2012 +0100 summary: 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. files: Doc/library/os.rst | 37 +++++++ Doc/library/shutil.rst | 33 +++++++ Lib/shutil.py | 43 +++++++++ Lib/test/test_os.py | 38 ++++++++ Lib/test/test_shutil.py | 48 ++++++++++- Misc/NEWS | 4 + Modules/posixmodule.c | 130 ++++++++++++++++++++++++++++ configure | 6 +- configure.in | 2 +- pyconfig.h.in | 3 + 10 files changed, 339 insertions(+), 5 deletions(-) diff --git a/Doc/library/os.rst b/Doc/library/os.rst --- a/Doc/library/os.rst +++ b/Doc/library/os.rst @@ -1411,6 +1411,43 @@ .. 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(tuple) + + A tuple of ``(columns, lines)`` for holding 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 diff --git a/Doc/library/shutil.rst b/Doc/library/shutil.rst --- a/Doc/library/shutil.rst +++ b/Doc/library/shutil.rst @@ -459,3 +459,36 @@ -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/Lib/shutil.py b/Lib/shutil.py --- a/Lib/shutil.py +++ b/Lib/shutil.py @@ -878,3 +878,46 @@ 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)) diff --git a/Lib/test/test_os.py b/Lib/test/test_os.py --- a/Lib/test/test_os.py +++ b/Lib/test/test_os.py @@ -1840,6 +1840,43 @@ os.symlink, filename, filename) + at 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 e.errno == errno.EINVAL or sys.platform == "win32": + # Under win32 a generic OSError can be thrown if the + # handle cannot be retrieved + self.skipTest("failed to query terminal size") + raise + + self.assertGreater(size.columns, 0) + self.assertGreater(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 + + actual = os.get_terminal_size(sys.__stdin__.fileno()) + self.assertEqual(expected, actual) + + @support.reap_threads def test_main(): support.run_unittest( @@ -1866,6 +1903,7 @@ ProgramPriorityTests, ExtendedAttributeTests, Win32DeprecatedBytesAPI, + TermsizeTests, ) if __name__ == "__main__": diff --git a/Lib/test/test_shutil.py b/Lib/test/test_shutil.py --- a/Lib/test/test_shutil.py +++ b/Lib/test/test_shutil.py @@ -9,6 +9,7 @@ import os.path import errno import functools +import subprocess from test import support from test.support import TESTFN from os.path import splitdrive @@ -1267,10 +1268,55 @@ finally: 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.assertGreater(size.columns, 0) + self.assertGreater(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) if __name__ == '__main__': test_main() diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -466,6 +466,10 @@ Library ------- +- 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 #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). diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c --- a/Modules/posixmodule.c +++ b/Modules/posixmodule.c @@ -125,6 +125,18 @@ #include #endif +#if defined(MS_WINDOWS) +# define TERMSIZE_USE_CONIO +#elif defined(HAVE_SYS_IOCTL_H) +# include +# if defined(HAVE_TERMIOS_H) +# include +# 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) @@ -10477,6 +10489,114 @@ #endif /* USE_XATTRS */ + +/* 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__}, #ifdef HAVE_TTYNAME @@ -10945,6 +11065,9 @@ {"llistxattr", posix_llistxattr, METH_VARARGS, posix_llistxattr__doc__}, {"flistxattr", posix_flistxattr, METH_VARARGS, posix_flistxattr__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 */ }; @@ -11539,6 +11662,10 @@ PyStructSequence_InitType(&SchedParamType, &sched_param_desc); SchedParamType.tp_new = sched_param_new; #endif + + /* initialize TerminalSize_info */ + PyStructSequence_InitType(&TerminalSizeType, &TerminalSize_desc); + Py_INCREF(&TerminalSizeType); } #if defined(HAVE_WAITID) && !defined(__APPLE__) Py_INCREF((PyObject*) &WaitidResultType); @@ -11593,6 +11720,9 @@ #endif /* __APPLE__ */ + + PyModule_AddObject(m, "terminal_size", (PyObject*) &TerminalSizeType); + return m; } diff --git a/configure b/configure --- a/configure +++ b/configure @@ -6144,7 +6144,7 @@ sched.h shadow.h signal.h stdint.h stropts.h termios.h \ unistd.h utime.h \ poll.h sys/devpoll.h sys/epoll.h sys/poll.h \ -sys/audioio.h sys/xattr.h sys/bsdtty.h sys/event.h sys/file.h \ +sys/audioio.h sys/xattr.h sys/bsdtty.h sys/event.h sys/file.h sys/ioctl.h \ sys/kern_control.h sys/loadavg.h sys/lock.h sys/mkdev.h sys/modem.h \ sys/param.h sys/select.h sys/sendfile.h sys/socket.h sys/statvfs.h \ sys/stat.h sys/syscall.h sys/sys_domain.h sys/termio.h sys/time.h \ @@ -14599,8 +14599,8 @@ cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # Files that config.status was made for. -config_files="$ac_config_files" -config_headers="$ac_config_headers" +config_files="`echo $ac_config_files`" +config_headers="`echo $ac_config_headers`" _ACEOF diff --git a/configure.in b/configure.in --- a/configure.in +++ b/configure.in @@ -1334,7 +1334,7 @@ sched.h shadow.h signal.h stdint.h stropts.h termios.h \ unistd.h utime.h \ poll.h sys/devpoll.h sys/epoll.h sys/poll.h \ -sys/audioio.h sys/xattr.h sys/bsdtty.h sys/event.h sys/file.h \ +sys/audioio.h sys/xattr.h sys/bsdtty.h sys/event.h sys/file.h sys/ioctl.h \ sys/kern_control.h sys/loadavg.h sys/lock.h sys/mkdev.h sys/modem.h \ sys/param.h sys/select.h sys/sendfile.h sys/socket.h sys/statvfs.h \ sys/stat.h sys/syscall.h sys/sys_domain.h sys/termio.h sys/time.h \ diff --git a/pyconfig.h.in b/pyconfig.h.in --- a/pyconfig.h.in +++ b/pyconfig.h.in @@ -908,6 +908,9 @@ /* Define to 1 if you have the header file. */ #undef HAVE_SYS_FILE_H +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_IOCTL_H + /* Define to 1 if you have the header file. */ #undef HAVE_SYS_KERN_CONTROL_H -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Feb 8 23:51:49 2012 From: python-checkins at python.org (antoine.pitrou) Date: Wed, 08 Feb 2012 23:51:49 +0100 Subject: [Python-checkins] =?utf8?q?cpython=3A_Relax_tests_to_fix_buildbot?= =?utf8?q?_failure?= Message-ID: http://hg.python.org/cpython/rev/5fe90c877e85 changeset: 74836:5fe90c877e85 user: Antoine Pitrou date: Wed Feb 08 23:48:59 2012 +0100 summary: Relax tests to fix buildbot failure files: Lib/test/test_os.py | 4 ++-- Lib/test/test_shutil.py | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Lib/test/test_os.py b/Lib/test/test_os.py --- a/Lib/test/test_os.py +++ b/Lib/test/test_os.py @@ -1857,8 +1857,8 @@ self.skipTest("failed to query terminal size") raise - self.assertGreater(size.columns, 0) - self.assertGreater(size.lines, 0) + self.assertGreaterEqual(size.columns, 0) + self.assertGreaterEqual(size.lines, 0) def test_stty_match(self): """Check if stty returns the same results diff --git a/Lib/test/test_shutil.py b/Lib/test/test_shutil.py --- a/Lib/test/test_shutil.py +++ b/Lib/test/test_shutil.py @@ -1276,8 +1276,8 @@ terminal, so let's check if it returns something sensible instead. """ size = shutil.get_terminal_size() - self.assertGreater(size.columns, 0) - self.assertGreater(size.lines, 0) + self.assertGreaterEqual(size.columns, 0) + self.assertGreaterEqual(size.lines, 0) def test_os_environ_first(self): "Check if environment variables have precedence" -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Feb 9 00:13:49 2012 From: python-checkins at python.org (antoine.pitrou) Date: Thu, 09 Feb 2012 00:13:49 +0100 Subject: [Python-checkins] =?utf8?q?cpython=3A_get=5Fterminal=5Fsize=28=29?= =?utf8?q?_can_also_fail_with_ENOTTY_if_the_fd_is_not_connected_to_a?= Message-ID: http://hg.python.org/cpython/rev/3ed8b4f3f309 changeset: 74837:3ed8b4f3f309 user: Antoine Pitrou date: Thu Feb 09 00:11:00 2012 +0100 summary: get_terminal_size() can also fail with ENOTTY if the fd is not connected to a terminal. files: Lib/test/test_os.py | 11 +++++++++-- 1 files changed, 9 insertions(+), 2 deletions(-) diff --git a/Lib/test/test_os.py b/Lib/test/test_os.py --- a/Lib/test/test_os.py +++ b/Lib/test/test_os.py @@ -1851,7 +1851,7 @@ try: size = os.get_terminal_size() except OSError as e: - if e.errno == errno.EINVAL or sys.platform == "win32": + 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") @@ -1873,7 +1873,14 @@ self.skipTest("stty invocation failed") expected = (int(size[1]), int(size[0])) # reversed order - actual = os.get_terminal_size(sys.__stdin__.fileno()) + 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) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Feb 9 00:55:54 2012 From: python-checkins at python.org (brett.cannon) Date: Thu, 09 Feb 2012 00:55:54 +0100 Subject: [Python-checkins] =?utf8?q?cpython=3A_Don=27t_fail_in_the_face_of?= =?utf8?q?_a_lacking_attribute_when_wrapping_a?= Message-ID: http://hg.python.org/cpython/rev/7a6fd7cd16e9 changeset: 74838:7a6fd7cd16e9 user: Brett Cannon date: Wed Feb 08 18:44:14 2012 -0500 summary: Don't fail in the face of a lacking attribute when wrapping a function. files: Lib/importlib/_bootstrap.py | 3 ++- 1 files changed, 2 insertions(+), 1 deletions(-) diff --git a/Lib/importlib/_bootstrap.py b/Lib/importlib/_bootstrap.py --- a/Lib/importlib/_bootstrap.py +++ b/Lib/importlib/_bootstrap.py @@ -170,7 +170,8 @@ def _wrap(new, old): """Simple substitute for functools.wraps.""" for replace in ['__module__', '__name__', '__qualname__', '__doc__']: - setattr(new, replace, getattr(old, replace)) + if hasattr(old, replace): + setattr(new, replace, getattr(old, replace)) new.__dict__.update(old.__dict__) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Feb 9 00:55:55 2012 From: python-checkins at python.org (brett.cannon) Date: Thu, 09 Feb 2012 00:55:55 +0100 Subject: [Python-checkins] =?utf8?q?cpython=3A_Move_setup_code_from_import?= =?utf8?b?bGliLl9faW5pdF9fIHRv?= Message-ID: http://hg.python.org/cpython/rev/322e6f818cd2 changeset: 74839:322e6f818cd2 user: Brett Cannon date: Wed Feb 08 18:50:22 2012 -0500 summary: Move setup code from importlib.__init__ to importlib._bootstrap._setup(). files: Lib/importlib/__init__.py | 30 +--------------- Lib/importlib/_bootstrap.py | 44 +++++++++++++++++++++++++ 2 files changed, 47 insertions(+), 27 deletions(-) diff --git a/Lib/importlib/__init__.py b/Lib/importlib/__init__.py --- a/Lib/importlib/__init__.py +++ b/Lib/importlib/__init__.py @@ -22,9 +22,6 @@ from . import _bootstrap -import os -import re -import tokenize # To simplify imports in test code _w_long = _bootstrap._w_long @@ -32,31 +29,10 @@ # Bootstrap help ##################################################### +import imp +import sys -# 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, _io -_bootstrap.imp = imp -_bootstrap.sys = sys -_bootstrap.marshal = marshal -_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._setup(sys, imp) # Public API ######################################################### diff --git a/Lib/importlib/_bootstrap.py b/Lib/importlib/_bootstrap.py --- a/Lib/importlib/_bootstrap.py +++ b/Lib/importlib/_bootstrap.py @@ -995,3 +995,47 @@ except ImportError: pass return module + + +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 + imp = imp_module + sys = sys_module + + 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) + + for builtin_os, path_sep in [('posix', '/'), ('nt', '\\'), ('os2', '\\')]: + 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 = '/' + break + except ImportError: + continue + else: + raise ImportError('importlib requires posix or nt') + setattr(self_module, '_os', os_module) + setattr(self_module, 'path_sep', path_sep) + -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Feb 9 00:55:56 2012 From: python-checkins at python.org (brett.cannon) Date: Thu, 09 Feb 2012 00:55:56 +0100 Subject: [Python-checkins] =?utf8?q?cpython=3A_Use_the_cwd_when_the_empty_?= =?utf8?q?string_is_found_in_sys=2Epath=2E_This_leads_to?= Message-ID: http://hg.python.org/cpython/rev/7c487140981c changeset: 74840:7c487140981c user: Brett Cannon date: Wed Feb 08 18:52:56 2012 -0500 summary: Use the cwd when the empty string is found in sys.path. This leads to __file__ being an absolute path when the module is found in the current directory. files: Lib/importlib/_bootstrap.py | 46 ++++++++++++- Lib/importlib/test/import_/test_path.py | 10 ++ Misc/NEWS | 3 + 3 files changed, 58 insertions(+), 1 deletions(-) diff --git a/Lib/importlib/_bootstrap.py b/Lib/importlib/_bootstrap.py --- a/Lib/importlib/_bootstrap.py +++ b/Lib/importlib/_bootstrap.py @@ -718,7 +718,7 @@ try: finder = sys.path_importer_cache[path] except KeyError: - finder = cls._path_hooks(path) + finder = cls._path_hooks(path if path != '' else _os.getcwd()) sys.path_importer_cache[path] = finder else: if finder is None and default: @@ -1039,3 +1039,47 @@ setattr(self_module, '_os', os_module) setattr(self_module, 'path_sep', path_sep) + + +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 + imp = imp_module + sys = sys_module + + 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) + + for builtin_os, path_sep in [('posix', '/'), ('nt', '\\'), ('os2', '\\')]: + 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 = '/' + break + except ImportError: + continue + else: + raise ImportError('importlib requires posix or nt') + setattr(self_module, '_os', os_module) + setattr(self_module, 'path_sep', path_sep) + diff --git a/Lib/importlib/test/import_/test_path.py b/Lib/importlib/test/import_/test_path.py --- a/Lib/importlib/test/import_/test_path.py +++ b/Lib/importlib/test/import_/test_path.py @@ -73,6 +73,16 @@ loader = machinery.PathFinder.find_module(module) self.assertTrue(loader is importer) + def test_path_importer_cache_empty_string(self): + # The empty string should create a finder using the cwd. + path = '' + module = '' + importer = util.mock_modules(module) + hook = import_util.mock_path_hook(os.getcwd(), importer=importer) + with util.import_state(path=[path], path_hooks=[hook]): + loader = machinery.PathFinder.find_module(module) + self.assertIs(loader, importer) + self.assertIn('', sys.path_importer_cache) class DefaultPathFinderTests(unittest.TestCase): diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -466,6 +466,9 @@ Library ------- +- When '' is a path (e.g. in sys.path), make sure __file__ uses the current + working directory instead of ''. + - 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. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Feb 9 00:55:56 2012 From: python-checkins at python.org (brett.cannon) Date: Thu, 09 Feb 2012 00:55:56 +0100 Subject: [Python-checkins] =?utf8?q?cpython=3A_Clarify_a_NEWS_entry=2E?= Message-ID: http://hg.python.org/cpython/rev/f49470a26c8e changeset: 74841:f49470a26c8e user: Brett Cannon date: Wed Feb 08 18:53:46 2012 -0500 summary: Clarify a NEWS entry. files: Misc/NEWS | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -467,7 +467,7 @@ ------- - When '' is a path (e.g. in sys.path), make sure __file__ uses the current - working directory instead of ''. + working directory instead of '' in importlib. - Issue #13609: Add two functions to query the terminal size: os.get_terminal_size (low level) and shutil.get_terminal_size (high level). -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Feb 9 00:55:57 2012 From: python-checkins at python.org (brett.cannon) Date: Thu, 09 Feb 2012 00:55:57 +0100 Subject: [Python-checkins] =?utf8?q?cpython=3A_Whitespace_normalization=2E?= Message-ID: http://hg.python.org/cpython/rev/5f75af16a952 changeset: 74842:5f75af16a952 user: Brett Cannon date: Wed Feb 08 18:55:37 2012 -0500 summary: Whitespace normalization. files: Lib/importlib/_bootstrap.py | 1 - 1 files changed, 0 insertions(+), 1 deletions(-) diff --git a/Lib/importlib/_bootstrap.py b/Lib/importlib/_bootstrap.py --- a/Lib/importlib/_bootstrap.py +++ b/Lib/importlib/_bootstrap.py @@ -1082,4 +1082,3 @@ raise ImportError('importlib requires posix or nt') setattr(self_module, '_os', os_module) setattr(self_module, 'path_sep', path_sep) - -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Feb 9 01:11:58 2012 From: python-checkins at python.org (brett.cannon) Date: Thu, 09 Feb 2012 01:11:58 +0100 Subject: [Python-checkins] =?utf8?q?cpython=3A_Undo_a_bad_mq_management_th?= =?utf8?q?ingy=2E?= Message-ID: http://hg.python.org/cpython/rev/aba513307f78 changeset: 74843:aba513307f78 user: Brett Cannon date: Wed Feb 08 19:11:53 2012 -0500 summary: Undo a bad mq management thingy. files: Lib/importlib/_bootstrap.py | 44 ------------------------- 1 files changed, 0 insertions(+), 44 deletions(-) diff --git a/Lib/importlib/_bootstrap.py b/Lib/importlib/_bootstrap.py --- a/Lib/importlib/_bootstrap.py +++ b/Lib/importlib/_bootstrap.py @@ -1038,47 +1038,3 @@ raise ImportError('importlib requires posix or nt') setattr(self_module, '_os', os_module) setattr(self_module, 'path_sep', path_sep) - - - -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 - imp = imp_module - sys = sys_module - - 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) - - for builtin_os, path_sep in [('posix', '/'), ('nt', '\\'), ('os2', '\\')]: - 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 = '/' - break - except ImportError: - continue - else: - raise ImportError('importlib requires posix or nt') - setattr(self_module, '_os', os_module) - setattr(self_module, 'path_sep', path_sep) -- Repository URL: http://hg.python.org/cpython From solipsis at pitrou.net Thu Feb 9 05:31:23 2012 From: solipsis at pitrou.net (solipsis at pitrou.net) Date: Thu, 09 Feb 2012 05:31:23 +0100 Subject: [Python-checkins] Daily reference leaks (aba513307f78): sum=888 Message-ID: results for aba513307f78 on branch "default" -------------------------------------------- test_capi leaked [296, 296, 296] references, sum=888 Command line was: ['./python', '-m', 'test.regrtest', '-uall', '-R', '3:3:/home/antoine/cpython/refleaks/reflogYrJnKg', '-x'] From ncoghlan at gmail.com Thu Feb 9 05:48:22 2012 From: ncoghlan at gmail.com (Nick Coghlan) Date: Thu, 9 Feb 2012 14:48:22 +1000 Subject: [Python-checkins] cpython: PEP 410 In-Reply-To: References: Message-ID: On Thu, Feb 9, 2012 at 7:52 AM, victor.stinner wrote: > http://hg.python.org/cpython/rev/f8409b3d6449 > changeset: ? 74832:f8409b3d6449 > user: ? ? ? ?Victor Stinner > date: ? ? ? ?Wed Feb 08 14:31:50 2012 +0100 > summary: > ?PEP 410 Ah, even when written by a core dev, a PEP should still be at Accepted before we check anything in. PEP 410 is still at Draft. Did Guido accept this one by private email? (He never made me his delegate, and without that, my agreement doesn't count as acceptance of the PEP). Cheers, Nick. -- Nick Coghlan?? |?? ncoghlan at gmail.com?? |?? Brisbane, Australia From ncoghlan at gmail.com Thu Feb 9 05:49:22 2012 From: ncoghlan at gmail.com (Nick Coghlan) Date: Thu, 9 Feb 2012 14:49:22 +1000 Subject: [Python-checkins] cpython: PEP 410 In-Reply-To: References: Message-ID: On Thu, Feb 9, 2012 at 2:48 PM, Nick Coghlan wrote: > On Thu, Feb 9, 2012 at 7:52 AM, victor.stinner > wrote: >> http://hg.python.org/cpython/rev/f8409b3d6449 >> changeset: ? 74832:f8409b3d6449 >> user: ? ? ? ?Victor Stinner >> date: ? ? ? ?Wed Feb 08 14:31:50 2012 +0100 >> summary: >> ?PEP 410 > > Ah, even when written by a core dev, a PEP should still be at Accepted > before we check anything in. PEP 410 is still at Draft. Never mind, I just saw the checkin that reverted the change. Cheers, Nick. -- Nick Coghlan?? |?? ncoghlan at gmail.com?? |?? Brisbane, Australia From victor.stinner at haypocalc.com Thu Feb 9 10:32:29 2012 From: victor.stinner at haypocalc.com (Victor Stinner) Date: Thu, 9 Feb 2012 10:32:29 +0100 Subject: [Python-checkins] cpython: PEP 410 In-Reply-To: References: Message-ID: >>> changeset: ? 74832:f8409b3d6449 >>> user: ? ? ? ?Victor Stinner >>> date: ? ? ? ?Wed Feb 08 14:31:50 2012 +0100 >>> summary: >>> ?PEP 410 >> >> Ah, even when written by a core dev, a PEP should still be at Accepted >> before we check anything in. PEP 410 is still at Draft. > > Never mind, I just saw the checkin that reverted the change. Yeah, I should use a clone of the repository instead of always working in the same repository. I pushed the commit by mistake. It is difficult to manipulate such huge patch. I just created a clone on my computer to avoid similar mistakes :-) Victor From python-checkins at python.org Thu Feb 9 10:44:47 2012 From: python-checkins at python.org (senthil.kumaran) Date: Thu, 09 Feb 2012 10:44:47 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=282=2E7=29=3A_Fix_Issue_=2360?= =?utf8?q?05=3A_Examples_in_the_socket_library_documentation_use_sendall?= =?utf8?q?=2C?= Message-ID: http://hg.python.org/cpython/rev/aa6415d1e160 changeset: 74844:aa6415d1e160 branch: 2.7 parent: 74829:a47f97bd3c33 user: Senthil Kumaran date: Thu Feb 09 17:43:31 2012 +0800 summary: Fix Issue #6005: Examples in the socket library documentation use sendall, where relevant, instead send method. Patch contributed by Brian Brazil. files: Doc/howto/sockets.rst | 2 ++ Doc/library/socket.rst | 13 +++++++------ Doc/library/socketserver.rst | 10 +++++----- Misc/NEWS | 3 +++ 4 files changed, 17 insertions(+), 11 deletions(-) diff --git a/Doc/howto/sockets.rst b/Doc/howto/sockets.rst --- a/Doc/howto/sockets.rst +++ b/Doc/howto/sockets.rst @@ -1,3 +1,5 @@ +.. _socket-howto: + **************************** Socket Programming HOWTO **************************** diff --git a/Doc/library/socket.rst b/Doc/library/socket.rst --- a/Doc/library/socket.rst +++ b/Doc/library/socket.rst @@ -725,7 +725,8 @@ optional *flags* argument has the same meaning as for :meth:`recv` above. Returns the number of bytes sent. Applications are responsible for checking that all data has been sent; if only some of the data was transmitted, the - application needs to attempt delivery of the remaining data. + application needs to attempt delivery of the remaining data. For further + information on this concept, consult the :ref:`socket-howto`. .. method:: socket.sendall(string[, flags]) @@ -863,8 +864,8 @@ :meth:`~socket.bind`, :meth:`~socket.listen`, :meth:`~socket.accept` (possibly repeating the :meth:`~socket.accept` to service more than one client), while a client only needs the sequence :func:`socket`, :meth:`~socket.connect`. Also -note that the server does not :meth:`~socket.send`/:meth:`~socket.recv` on the -socket it is listening on but on the new socket returned by +note that the server does not :meth:`~socket.sendall`/:meth:`~socket.recv` on +the socket it is listening on but on the new socket returned by :meth:`~socket.accept`. The first two examples support IPv4 only. :: @@ -882,7 +883,7 @@ while 1: data = conn.recv(1024) if not data: break - conn.send(data) + conn.sendall(data) conn.close() :: @@ -894,7 +895,7 @@ PORT = 50007 # The same port as used by the server s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.connect((HOST, PORT)) - s.send('Hello, world') + s.sendall('Hello, world') data = s.recv(1024) s.close() print 'Received', repr(data) @@ -966,7 +967,7 @@ if s is None: print 'could not open socket' sys.exit(1) - s.send('Hello, world') + s.sendall('Hello, world') data = s.recv(1024) s.close() print 'Received', repr(data) diff --git a/Doc/library/socketserver.rst b/Doc/library/socketserver.rst --- a/Doc/library/socketserver.rst +++ b/Doc/library/socketserver.rst @@ -360,7 +360,7 @@ print "{} wrote:".format(self.client_address[0]) print self.data # just send back the same data, but upper-cased - self.request.send(self.data.upper()) + self.request.sendall(self.data.upper()) if __name__ == "__main__": HOST, PORT = "localhost", 9999 @@ -390,7 +390,7 @@ The difference is that the ``readline()`` call in the second handler will call ``recv()`` multiple times until it encounters a newline character, while the single ``recv()`` call in the first handler will just return what has been sent -from the client in one ``send()`` call. +from the client in one ``sendall()`` call. This is the client side:: @@ -407,7 +407,7 @@ try: # Connect to server and send data sock.connect((HOST, PORT)) - sock.send(data + "\n") + sock.sendall(data + "\n") # Receive data from the server and shut down received = sock.recv(1024) @@ -505,7 +505,7 @@ data = self.request.recv(1024) cur_thread = threading.current_thread() response = "{}: {}".format(cur_thread.name, data) - self.request.send(response) + self.request.sendall(response) class ThreadedTCPServer(SocketServer.ThreadingMixIn, SocketServer.TCPServer): pass @@ -514,7 +514,7 @@ sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.connect((ip, port)) try: - sock.send(message) + sock.sendall(message) response = sock.recv(1024) print "Received: {}".format(response) finally: diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -90,6 +90,9 @@ Library ------- +- 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. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Feb 9 10:56:30 2012 From: python-checkins at python.org (senthil.kumaran) Date: Thu, 09 Feb 2012 10:56:30 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=283=2E2=29=3A_Fix_Issue_=2360?= =?utf8?q?05=3A_Examples_in_the_socket_library_documentation_use_sendall?= =?utf8?q?=2C?= Message-ID: http://hg.python.org/cpython/rev/2aae44aa041a changeset: 74845:2aae44aa041a branch: 3.2 parent: 74830:29b83d3d40d0 user: Senthil Kumaran date: Thu Feb 09 17:54:17 2012 +0800 summary: Fix Issue #6005: Examples in the socket library documentation use sendall, where relevant, instead send method. files: Doc/howto/sockets.rst | 2 ++ Doc/library/socket.rst | 13 +++++++------ Doc/library/socketserver.rst | 10 +++++----- Misc/NEWS | 3 +++ 4 files changed, 17 insertions(+), 11 deletions(-) diff --git a/Doc/howto/sockets.rst b/Doc/howto/sockets.rst --- a/Doc/howto/sockets.rst +++ b/Doc/howto/sockets.rst @@ -1,3 +1,5 @@ +.. _socket-howto: + **************************** Socket Programming HOWTO **************************** diff --git a/Doc/library/socket.rst b/Doc/library/socket.rst --- a/Doc/library/socket.rst +++ b/Doc/library/socket.rst @@ -731,7 +731,8 @@ optional *flags* argument has the same meaning as for :meth:`recv` above. Returns the number of bytes sent. Applications are responsible for checking that all data has been sent; if only some of the data was transmitted, the - application needs to attempt delivery of the remaining data. + application needs to attempt delivery of the remaining data. For further + information on this topic, consult the :ref:`socket-howto`. .. method:: socket.sendall(bytes[, flags]) @@ -886,8 +887,8 @@ :meth:`~socket.bind`, :meth:`~socket.listen`, :meth:`~socket.accept` (possibly repeating the :meth:`~socket.accept` to service more than one client), while a client only needs the sequence :func:`socket`, :meth:`~socket.connect`. Also -note that the server does not :meth:`~socket.send`/:meth:`~socket.recv` on the -socket it is listening on but on the new socket returned by +note that the server does not :meth:`~socket.sendall`/:meth:`~socket.recv` on +the socket it is listening on but on the new socket returned by :meth:`~socket.accept`. The first two examples support IPv4 only. :: @@ -905,7 +906,7 @@ while True: data = conn.recv(1024) if not data: break - conn.send(data) + conn.sendall(data) conn.close() :: @@ -917,7 +918,7 @@ PORT = 50007 # The same port as used by the server s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.connect((HOST, PORT)) - s.send(b'Hello, world') + s.sendall(b'Hello, world') data = s.recv(1024) s.close() print('Received', repr(data)) @@ -989,7 +990,7 @@ if s is None: print('could not open socket') sys.exit(1) - s.send(b'Hello, world') + s.sendall(b'Hello, world') data = s.recv(1024) s.close() print('Received', repr(data)) diff --git a/Doc/library/socketserver.rst b/Doc/library/socketserver.rst --- a/Doc/library/socketserver.rst +++ b/Doc/library/socketserver.rst @@ -353,7 +353,7 @@ print("{} wrote:".format(self.client_address[0])) print(self.data) # just send back the same data, but upper-cased - self.request.send(self.data.upper()) + self.request.sendall(self.data.upper()) if __name__ == "__main__": HOST, PORT = "localhost", 9999 @@ -383,7 +383,7 @@ The difference is that the ``readline()`` call in the second handler will call ``recv()`` multiple times until it encounters a newline character, while the single ``recv()`` call in the first handler will just return what has been sent -from the client in one ``send()`` call. +from the client in one ``sendall()`` call. This is the client side:: @@ -400,7 +400,7 @@ try: # Connect to server and send data sock.connect((HOST, PORT)) - sock.send(bytes(data + "\n", "utf-8")) + sock.sendall(bytes(data + "\n", "utf-8")) # Receive data from the server and shut down received = str(sock.recv(1024), "utf-8") @@ -498,7 +498,7 @@ data = str(self.request.recv(1024), 'ascii') cur_thread = threading.current_thread() response = bytes("{}: {}".format(cur_thread.name, data), 'ascii') - self.request.send(response) + self.request.sendall(response) class ThreadedTCPServer(socketserver.ThreadingMixIn, socketserver.TCPServer): pass @@ -507,7 +507,7 @@ sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.connect((ip, port)) try: - sock.send(bytes(message, 'ascii')) + sock.sendall(bytes(message, 'ascii')) response = str(sock.recv(1024), 'ascii') print("Received: {}".format(response)) finally: diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -113,6 +113,9 @@ Library ------- +- 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. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Feb 9 10:56:31 2012 From: python-checkins at python.org (senthil.kumaran) Date: Thu, 09 Feb 2012 10:56:31 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_3=2E2_-=3E_default=29?= =?utf8?q?=3A_merged_from_3=2E2?= Message-ID: http://hg.python.org/cpython/rev/e9c3df45920e changeset: 74846:e9c3df45920e parent: 74843:aba513307f78 parent: 74845:2aae44aa041a user: Senthil Kumaran date: Thu Feb 09 17:55:56 2012 +0800 summary: merged from 3.2 Issue #6005: Examples in the socket library documentation use sendall, where relevant, instead send method. files: Doc/howto/sockets.rst | 2 ++ Doc/library/socket.rst | 13 +++++++------ Doc/library/socketserver.rst | 10 +++++----- Misc/NEWS | 3 +++ 4 files changed, 17 insertions(+), 11 deletions(-) diff --git a/Doc/howto/sockets.rst b/Doc/howto/sockets.rst --- a/Doc/howto/sockets.rst +++ b/Doc/howto/sockets.rst @@ -1,3 +1,5 @@ +.. _socket-howto: + **************************** Socket Programming HOWTO **************************** diff --git a/Doc/library/socket.rst b/Doc/library/socket.rst --- a/Doc/library/socket.rst +++ b/Doc/library/socket.rst @@ -981,7 +981,8 @@ optional *flags* argument has the same meaning as for :meth:`recv` above. Returns the number of bytes sent. Applications are responsible for checking that all data has been sent; if only some of the data was transmitted, the - application needs to attempt delivery of the remaining data. + application needs to attempt delivery of the remaining data. For further + information on this topic, consult the :ref:`socket-howto`. .. method:: socket.sendall(bytes[, flags]) @@ -1169,8 +1170,8 @@ :meth:`~socket.bind`, :meth:`~socket.listen`, :meth:`~socket.accept` (possibly repeating the :meth:`~socket.accept` to service more than one client), while a client only needs the sequence :func:`socket`, :meth:`~socket.connect`. Also -note that the server does not :meth:`~socket.send`/:meth:`~socket.recv` on the -socket it is listening on but on the new socket returned by +note that the server does not :meth:`~socket.sendall`/:meth:`~socket.recv` on +the socket it is listening on but on the new socket returned by :meth:`~socket.accept`. The first two examples support IPv4 only. :: @@ -1188,7 +1189,7 @@ while True: data = conn.recv(1024) if not data: break - conn.send(data) + conn.sendall(data) conn.close() :: @@ -1200,7 +1201,7 @@ PORT = 50007 # The same port as used by the server s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.connect((HOST, PORT)) - s.send(b'Hello, world') + s.sendall(b'Hello, world') data = s.recv(1024) s.close() print('Received', repr(data)) @@ -1272,7 +1273,7 @@ if s is None: print('could not open socket') sys.exit(1) - s.send(b'Hello, world') + s.sendall(b'Hello, world') data = s.recv(1024) s.close() print('Received', repr(data)) diff --git a/Doc/library/socketserver.rst b/Doc/library/socketserver.rst --- a/Doc/library/socketserver.rst +++ b/Doc/library/socketserver.rst @@ -365,7 +365,7 @@ print("{} wrote:".format(self.client_address[0])) print(self.data) # just send back the same data, but upper-cased - self.request.send(self.data.upper()) + self.request.sendall(self.data.upper()) if __name__ == "__main__": HOST, PORT = "localhost", 9999 @@ -395,7 +395,7 @@ The difference is that the ``readline()`` call in the second handler will call ``recv()`` multiple times until it encounters a newline character, while the single ``recv()`` call in the first handler will just return what has been sent -from the client in one ``send()`` call. +from the client in one ``sendall()`` call. This is the client side:: @@ -412,7 +412,7 @@ try: # Connect to server and send data sock.connect((HOST, PORT)) - sock.send(bytes(data + "\n", "utf-8")) + sock.sendall(bytes(data + "\n", "utf-8")) # Receive data from the server and shut down received = str(sock.recv(1024), "utf-8") @@ -510,7 +510,7 @@ data = str(self.request.recv(1024), 'ascii') cur_thread = threading.current_thread() response = bytes("{}: {}".format(cur_thread.name, data), 'ascii') - self.request.send(response) + self.request.sendall(response) class ThreadedTCPServer(socketserver.ThreadingMixIn, socketserver.TCPServer): pass @@ -519,7 +519,7 @@ sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.connect((ip, port)) try: - sock.send(bytes(message, 'ascii')) + sock.sendall(bytes(message, 'ascii')) response = str(sock.recv(1024), 'ascii') print("Received: {}".format(response)) finally: diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -484,6 +484,9 @@ make sure two listeners can't bind to the same socket/pipe (or any existing socket/pipe). +- 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. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Feb 9 11:22:59 2012 From: python-checkins at python.org (senthil.kumaran) Date: Thu, 09 Feb 2012 11:22:59 +0100 Subject: [Python-checkins] =?utf8?b?Y3B5dGhvbiAoMi43KTogSXNzdWUgIzkwMjE6?= =?utf8?q?_Add_an_introduction_to_the_copy_module=2E_Doc_changes_suggested?= =?utf8?q?_by?= Message-ID: http://hg.python.org/cpython/rev/0e050b38e92b changeset: 74847:0e050b38e92b branch: 2.7 parent: 74844:aa6415d1e160 user: Senthil Kumaran date: Thu Feb 09 18:22:01 2012 +0800 summary: Issue #9021: Add an introduction to the copy module. Doc changes suggested by Terry Reedy. files: Doc/library/copy.rst | 6 +++++- Misc/NEWS | 2 ++ 2 files changed, 7 insertions(+), 1 deletions(-) diff --git a/Doc/library/copy.rst b/Doc/library/copy.rst --- a/Doc/library/copy.rst +++ b/Doc/library/copy.rst @@ -4,7 +4,11 @@ .. module:: copy :synopsis: Shallow and deep copy operations. -This module provides generic (shallow and deep) copying operations. +Assignment statements in Python do not copy objects, they create bindings +between a target and an object. For collections that are mutable or contain +mutable items, a copy is sometimes needed so one can change one copy without +changing the other. This module provides generic shallow and deep copy +operations (explained below). Interface summary: diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -90,6 +90,8 @@ Library ------- +- 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. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Feb 9 11:28:08 2012 From: python-checkins at python.org (senthil.kumaran) Date: Thu, 09 Feb 2012 11:28:08 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=283=2E2=29=3A_Issue_=239021_-?= =?utf8?q?_Introduce_copy_module_better=2E_Doc_changes_suggested_by_Terry?= Message-ID: http://hg.python.org/cpython/rev/a352e24b9907 changeset: 74848:a352e24b9907 branch: 3.2 parent: 74845:2aae44aa041a user: Senthil Kumaran date: Thu Feb 09 18:26:59 2012 +0800 summary: Issue #9021 - Introduce copy module better. Doc changes suggested by Terry Reedy. files: Doc/library/copy.rst | 6 +++++- Misc/NEWS | 2 ++ 2 files changed, 7 insertions(+), 1 deletions(-) diff --git a/Doc/library/copy.rst b/Doc/library/copy.rst --- a/Doc/library/copy.rst +++ b/Doc/library/copy.rst @@ -4,7 +4,11 @@ .. module:: copy :synopsis: Shallow and deep copy operations. -This module provides generic (shallow and deep) copying operations. +Assignment statements in Python do not copy objects, they create bindings +between a target and an object. For collections that are mutable or contain +mutable items, a copy is sometimes needed so one can change one copy without +changing the other. This module provides generic shallow and deep copy +operations (explained below). Interface summary: diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -113,6 +113,8 @@ Library ------- +- 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. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Feb 9 11:28:08 2012 From: python-checkins at python.org (senthil.kumaran) Date: Thu, 09 Feb 2012 11:28:08 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_3=2E2_-=3E_default=29?= =?utf8?q?=3A_merge_from_3=2E2?= Message-ID: http://hg.python.org/cpython/rev/bf6f306ad5cf changeset: 74849:bf6f306ad5cf parent: 74846:e9c3df45920e parent: 74848:a352e24b9907 user: Senthil Kumaran date: Thu Feb 09 18:27:48 2012 +0800 summary: merge from 3.2 Issue #9021 - Introduce copy module better in the docs. files: Doc/library/copy.rst | 6 +++++- Misc/NEWS | 2 ++ 2 files changed, 7 insertions(+), 1 deletions(-) diff --git a/Doc/library/copy.rst b/Doc/library/copy.rst --- a/Doc/library/copy.rst +++ b/Doc/library/copy.rst @@ -4,7 +4,11 @@ .. module:: copy :synopsis: Shallow and deep copy operations. -This module provides generic (shallow and deep) copying operations. +Assignment statements in Python do not copy objects, they create bindings +between a target and an object. For collections that are mutable or contain +mutable items, a copy is sometimes needed so one can change one copy without +changing the other. This module provides generic shallow and deep copy +operations (explained below). Interface summary: diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -484,6 +484,8 @@ make sure two listeners can't bind to the same socket/pipe (or any existing socket/pipe). +- 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. -- Repository URL: http://hg.python.org/cpython From ncoghlan at gmail.com Thu Feb 9 13:40:41 2012 From: ncoghlan at gmail.com (Nick Coghlan) Date: Thu, 9 Feb 2012 22:40:41 +1000 Subject: [Python-checkins] cpython: PEP 410 In-Reply-To: References: Message-ID: On Thu, Feb 9, 2012 at 7:32 PM, Victor Stinner wrote: >>>> changeset: ? 74832:f8409b3d6449 >>>> user: ? ? ? ?Victor Stinner >>>> date: ? ? ? ?Wed Feb 08 14:31:50 2012 +0100 >>>> summary: >>>> ?PEP 410 >>> >>> Ah, even when written by a core dev, a PEP should still be at Accepted >>> before we check anything in. PEP 410 is still at Draft. >> >> Never mind, I just saw the checkin that reverted the change. > > Yeah, I should use a clone of the repository instead of always working > in the same repository. I pushed the commit by mistake. It is > difficult to manipulate such huge patch. I just created a clone on my > computer to avoid similar mistakes :-) I maintain a separate sandbox clone for the same reason. I think I'm finally starting to get the hang of the mq extension for working with smaller "not yet ready" changes, too. Cheers, Nick. -- Nick Coghlan?? |?? ncoghlan at gmail.com?? |?? Brisbane, Australia From python-checkins at python.org Thu Feb 9 20:11:07 2012 From: python-checkins at python.org (petri.lehtinen) Date: Thu, 09 Feb 2012 20:11:07 +0100 Subject: [Python-checkins] =?utf8?q?cpython=3A_Undocument_and_clean_up_sql?= =?utf8?q?ite3=2EOptimizedUnicode?= Message-ID: http://hg.python.org/cpython/rev/0fc10a33eb4c changeset: 74850:0fc10a33eb4c user: Petri Lehtinen date: Thu Feb 09 21:09:03 2012 +0200 summary: Undocument and clean up sqlite3.OptimizedUnicode Closes #13921. files: Doc/includes/sqlite3/text_factory.py | 11 -------- Doc/library/sqlite3.rst | 4 --- Lib/sqlite3/test/factory.py | 2 + Misc/NEWS | 4 +++ Modules/_sqlite/connection.h | 3 +- Modules/_sqlite/cursor.c | 20 ++------------- Modules/_sqlite/module.c | 16 ++++++------ Modules/_sqlite/module.h | 2 - Modules/_sqlite/statement.c | 8 +++--- Modules/_sqlite/statement.h | 4 +- 10 files changed, 24 insertions(+), 50 deletions(-) diff --git a/Doc/includes/sqlite3/text_factory.py b/Doc/includes/sqlite3/text_factory.py --- a/Doc/includes/sqlite3/text_factory.py +++ b/Doc/includes/sqlite3/text_factory.py @@ -30,14 +30,3 @@ "\xe4\xf6\xfc".encode("latin1"),)) row = cur.fetchone() assert type(row[0]) == str - -# sqlite3 offers a built-in optimized text_factory that will return bytestring -# objects, if the data is in ASCII only, and otherwise return unicode objects -con.text_factory = sqlite3.OptimizedUnicode -cur.execute("select ?", (AUSTRIA,)) -row = cur.fetchone() -assert type(row[0]) == str - -cur.execute("select ?", ("Germany",)) -row = cur.fetchone() -assert type(row[0]) == str diff --git a/Doc/library/sqlite3.rst b/Doc/library/sqlite3.rst --- a/Doc/library/sqlite3.rst +++ b/Doc/library/sqlite3.rst @@ -436,10 +436,6 @@ :mod:`sqlite3` module will return Unicode objects for ``TEXT``. If you want to return bytestrings instead, you can set it to :class:`bytes`. - For efficiency reasons, there's also a way to return :class:`str` objects - only for non-ASCII data, and :class:`bytes` otherwise. To activate it, set - this attribute to :const:`sqlite3.OptimizedUnicode`. - You can also set it to any other callable that accepts a single bytestring parameter and returns the resulting object. diff --git a/Lib/sqlite3/test/factory.py b/Lib/sqlite3/test/factory.py --- a/Lib/sqlite3/test/factory.py +++ b/Lib/sqlite3/test/factory.py @@ -178,6 +178,8 @@ 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/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -466,6 +466,10 @@ Library ------- +- Issue #13921: Undocument and clean up sqlite3.OptimizedUnicode, + which is obsolete in Python 3.x. It's now aliased to str for + backwards compatibility. + - When '' is a path (e.g. in sys.path), make sure __file__ uses the current working directory instead of '' in importlib. diff --git a/Modules/_sqlite/connection.h b/Modules/_sqlite/connection.h --- a/Modules/_sqlite/connection.h +++ b/Modules/_sqlite/connection.h @@ -83,8 +83,7 @@ /* 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 --- a/Modules/_sqlite/cursor.c +++ b/Modules/_sqlite/cursor.c @@ -267,11 +267,6 @@ } } -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 * @@ -355,12 +350,8 @@ } 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) { @@ -459,7 +450,6 @@ int statement_type; PyObject* descriptor; PyObject* second_argument = NULL; - int allow_8bit_chars; if (!check_cursor(self)) { goto error; @@ -468,10 +458,6 @@ 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; @@ -630,7 +616,7 @@ 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; } diff --git a/Modules/_sqlite/module.c b/Modules/_sqlite/module.c --- 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; @@ -407,13 +407,13 @@ } 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 --- a/Modules/_sqlite/module.h +++ b/Modules/_sqlite/module.h @@ -38,8 +38,6 @@ 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/statement.c b/Modules/_sqlite/statement.c --- a/Modules/_sqlite/statement.c +++ b/Modules/_sqlite/statement.c @@ -87,7 +87,7 @@ 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 @@ } } -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 @@ } } - 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 @@ } } - 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) { diff --git a/Modules/_sqlite/statement.h b/Modules/_sqlite/statement.h --- a/Modules/_sqlite/statement.h +++ b/Modules/_sqlite/statement.h @@ -46,8 +46,8 @@ 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); -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Fri Feb 10 05:11:17 2012 From: python-checkins at python.org (eric.araujo) Date: Fri, 10 Feb 2012 05:11:17 +0100 Subject: [Python-checkins] =?utf8?q?distutils2=3A_Remove_unneeded_import?= Message-ID: http://hg.python.org/distutils2/rev/cfdf8964c3dc changeset: 1276:cfdf8964c3dc user: ?ric Araujo date: Thu Feb 09 02:04:02 2012 +0100 summary: Remove unneeded import files: distutils2/util.py | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/distutils2/util.py b/distutils2/util.py --- a/distutils2/util.py +++ b/distutils2/util.py @@ -1058,7 +1058,6 @@ SETUP_TEMPLATE = """\ # This script was automatically generated by distutils2 -import os import codecs from distutils.core import setup try: @@ -1066,6 +1065,7 @@ except ImportError: from configparser import RawConfigParser + %(split_multiline)s %(cfg_to_args)s -- Repository URL: http://hg.python.org/distutils2 From python-checkins at python.org Fri Feb 10 05:11:17 2012 From: python-checkins at python.org (eric.araujo) Date: Fri, 10 Feb 2012 05:11:17 +0100 Subject: [Python-checkins] =?utf8?q?distutils2=3A_Group_commands_by_topic_?= =?utf8?q?in_=E2=80=9Cpysetup_run_--list-commands=E2=80=9D_output=2E?= Message-ID: http://hg.python.org/distutils2/rev/8cb9b0f90ed8 changeset: 1278:8cb9b0f90ed8 parent: 1276:cfdf8964c3dc user: ?ric Araujo date: Thu Feb 09 14:42:02 2012 +0100 summary: Group commands by topic in ?pysetup run --list-commands? output. This fixes a regression from distutils, where ?setup.py --help-commands? prints out commands grouped by topic (i.e. building vs. installing), which is more useful than using sorted. files: distutils2/command/__init__.py | 48 ++++++++------------- distutils2/run.py | 9 +-- distutils2/tests/test_run.py | 28 +++++++++++- 3 files changed, 46 insertions(+), 39 deletions(-) diff --git a/distutils2/command/__init__.py b/distutils2/command/__init__.py --- a/distutils2/command/__init__.py +++ b/distutils2/command/__init__.py @@ -6,38 +6,28 @@ __all__ = ['get_command_names', 'set_command', 'get_command_class', 'STANDARD_COMMANDS'] -_COMMANDS = { - 'check': 'distutils2.command.check.check', - 'test': 'distutils2.command.test.test', - 'build': 'distutils2.command.build.build', - 'build_py': 'distutils2.command.build_py.build_py', - 'build_ext': 'distutils2.command.build_ext.build_ext', - 'build_clib': 'distutils2.command.build_clib.build_clib', - 'build_scripts': 'distutils2.command.build_scripts.build_scripts', - 'clean': 'distutils2.command.clean.clean', - 'install_dist': 'distutils2.command.install_dist.install_dist', - 'install_lib': 'distutils2.command.install_lib.install_lib', - 'install_headers': 'distutils2.command.install_headers.install_headers', - 'install_scripts': 'distutils2.command.install_scripts.install_scripts', - 'install_data': 'distutils2.command.install_data.install_data', - 'install_distinfo': - 'distutils2.command.install_distinfo.install_distinfo', - 'sdist': 'distutils2.command.sdist.sdist', - 'bdist': 'distutils2.command.bdist.bdist', - 'bdist_dumb': 'distutils2.command.bdist_dumb.bdist_dumb', - 'bdist_wininst': 'distutils2.command.bdist_wininst.bdist_wininst', - 'register': 'distutils2.command.register.register', - 'upload': 'distutils2.command.upload.upload', - 'upload_docs': 'distutils2.command.upload_docs.upload_docs', -} -# XXX this is crappy +STANDARD_COMMANDS = [ + # packaging + 'check', 'test', + # building + 'build', 'build_py', 'build_ext', 'build_clib', 'build_scripts', 'clean', + # installing + 'install_dist', 'install_lib', 'install_headers', 'install_scripts', + 'install_data', 'install_distinfo', + # distributing + 'sdist', 'bdist', 'bdist_dumb', 'bdist_wininst', + 'register', 'upload', 'upload_docs', + ] + if os.name == 'nt': - _COMMANDS['bdist_msi'] = 'distutils2.command.bdist_msi.bdist_msi' + STANDARD_COMMANDS.insert(STANDARD_COMMANDS.index('bdist_wininst'), + 'bdist_msi') -# XXX use OrderedDict to preserve the grouping (build-related, install-related, -# distribution-related) -STANDARD_COMMANDS = set(_COMMANDS) +# XXX maybe we need more than one registry, so that --list-comands can display +# standard, custom and overriden standard commands differently +_COMMANDS = dict((name, 'distutils2.command.%s.%s' % (name, name)) + for name in STANDARD_COMMANDS) def get_command_names(): diff --git a/distutils2/run.py b/distutils2/run.py --- a/distutils2/run.py +++ b/distutils2/run.py @@ -254,16 +254,13 @@ parser = dispatcher.parser args = args[1:] - commands = STANDARD_COMMANDS # + extra commands + commands = STANDARD_COMMANDS # FIXME display extra commands if args == ['--list-commands']: print 'List of available commands:' - cmds = sorted(commands) - - for cmd in cmds: + for cmd in commands: cls = dispatcher.cmdclass.get(cmd) or get_command_class(cmd) - desc = getattr(cls, 'description', - '(no description available)') + desc = getattr(cls, 'description', '(no description available)') print ' %s: %s' % (cmd, desc) return diff --git a/distutils2/tests/test_run.py b/distutils2/tests/test_run.py --- a/distutils2/tests/test_run.py +++ b/distutils2/tests/test_run.py @@ -60,22 +60,42 @@ os.chmod(install_path, old_mod) install.get_path = old_get_path - def test_show_help(self): - # smoke test, just makes sure some help is displayed + def get_pythonpath(self): pythonpath = os.environ.get('PYTHONPATH') d2parent = os.path.dirname(os.path.dirname(__file__)) if pythonpath is not None: - pythonpath = os.pathsep.join((pythonpath, d2parent)) + pythonpath = os.pathsep.join((pythonpath, d2parent)) else: pythonpath = d2parent + return pythonpath + def test_show_help(self): + # smoke test, just makes sure some help is displayed status, out, err = assert_python_ok( '-c', 'from distutils2.run import main; main()', '--help', - PYTHONPATH=pythonpath) + PYTHONPATH=self.get_pythonpath()) self.assertEqual(status, 0) self.assertGreater(out, '') self.assertEqual(err, '') + def test_list_commands(self): + status, out, err = assert_python_ok( + '-c', 'from distutils2.run import main; main()', 'run', + '--list-commands', PYTHONPATH=self.get_pythonpath()) + # check that something is displayed + self.assertEqual(status, 0) + self.assertGreater(out, '') + self.assertEqual(err, '') + + # make sure the manual grouping of commands is respected + check_position = out.find(' check: ') + build_position = out.find(' build: ') + self.assertTrue(check_position, out) # "out" printed as debugging aid + self.assertTrue(build_position, out) + self.assertLess(check_position, build_position, out) + + # TODO test that custom commands don't break --list-commands + def test_suite(): return unittest.makeSuite(RunTestCase) -- Repository URL: http://hg.python.org/distutils2 From python-checkins at python.org Fri Feb 10 05:11:17 2012 From: python-checkins at python.org (eric.araujo) Date: Fri, 10 Feb 2012 05:11:17 +0100 Subject: [Python-checkins] =?utf8?q?distutils2=3A_More_boolean_tests_for_m?= =?utf8?q?etadata_environment_markers?= Message-ID: http://hg.python.org/distutils2/rev/0d519c01b850 changeset: 1279:0d519c01b850 user: ?ric Araujo date: Thu Feb 09 18:43:25 2012 +0100 summary: More boolean tests for metadata environment markers files: distutils2/tests/test_markers.py | 10 +++++++--- 1 files changed, 7 insertions(+), 3 deletions(-) diff --git a/distutils2/tests/test_markers.py b/distutils2/tests/test_markers.py --- a/distutils2/tests/test_markers.py +++ b/distutils2/tests/test_markers.py @@ -22,8 +22,6 @@ self.assertTrue(interpret("sys.platform == '%s'" % sys_platform)) self.assertTrue(interpret( - "sys.platform == '%s' or python_version == '2.4'" % sys_platform)) - self.assertTrue(interpret( "sys.platform == '%s' and python_full_version == '%s'" % (sys_platform, version))) self.assertTrue(interpret("'%s' == sys.platform" % sys_platform)) @@ -42,12 +40,18 @@ # combined operations OP = 'os.name == "%s"' % os_name + FALSEOP = 'os.name == "buuuu"' AND = ' and ' OR = ' or ' self.assertTrue(interpret(OP + AND + OP)) self.assertTrue(interpret(OP + AND + OP + AND + OP)) self.assertTrue(interpret(OP + OR + OP)) - self.assertTrue(interpret(OP + OR + OP + OR + OP)) + self.assertTrue(interpret(OP + OR + FALSEOP)) + self.assertTrue(interpret(OP + OR + OP + OR + FALSEOP)) + self.assertTrue(interpret(OP + OR + FALSEOP + OR + FALSEOP)) + self.assertTrue(interpret(FALSEOP + OR + OP)) + self.assertFalse(interpret(FALSEOP + AND + FALSEOP)) + self.assertFalse(interpret(FALSEOP + OR + FALSEOP)) # other operators self.assertTrue(interpret("os.name != 'buuuu'")) -- Repository URL: http://hg.python.org/distutils2 From python-checkins at python.org Fri Feb 10 05:11:17 2012 From: python-checkins at python.org (eric.araujo) Date: Fri, 10 Feb 2012 05:11:17 +0100 Subject: [Python-checkins] =?utf8?q?distutils2=3A_Start_improving_2to3_cod?= =?utf8?b?ZSAoIzEzNDYyKS4=?= Message-ID: http://hg.python.org/distutils2/rev/b024621a1be6 changeset: 1277:b024621a1be6 user: ?ric Araujo date: Thu Feb 09 17:29:38 2012 +0100 summary: Start improving 2to3 code (#13462). - Change the fixers used in tests to something not provided by lib2to3 - Test conversion of doctests in text files - Factor out test boilerplate into a common method files: distutils2/compat.py | 17 +- distutils2/tests/fixer/fix_echo.py | 16 + distutils2/tests/fixer/fix_echo2.py | 16 + distutils2/tests/fixer/fix_idioms.py | 134 --------------- distutils2/tests/test_mixin2to3.py | 106 +++++------ distutils2/util.py | 18 +- 6 files changed, 99 insertions(+), 208 deletions(-) diff --git a/distutils2/compat.py b/distutils2/compat.py --- a/distutils2/compat.py +++ b/distutils2/compat.py @@ -25,7 +25,7 @@ """ if _CONVERT: - def _run_2to3(self, files, doctests=[], fixers=[]): + def _run_2to3(self, files=[], doctests=[], fixers=[]): """ Takes a list of files and doctests, and performs conversion on those. - First, the files which contain the code(`files`) are converted. @@ -35,17 +35,16 @@ if fixers: self.fixer_names = fixers - logger.info('converting Python code') - _KLASS.run_2to3(self, files) + if files: + logger.info('converting Python code and doctests') + _KLASS.run_2to3(self, files) + _KLASS.run_2to3(self, files, doctests_only=True) - logger.info('converting doctests in Python files') - _KLASS.run_2to3(self, files, doctests_only=True) - - if doctests != []: - logger.info('converting doctest in text files') + if doctests: + logger.info('converting doctests in text files') _KLASS.run_2to3(self, doctests, doctests_only=True) else: # If run on Python 2.x, there is nothing to do. - def _run_2to3(self, files, doctests=[], fixers=[]): + def _run_2to3(self, files=[], doctests=[], fixers=[]): pass diff --git a/distutils2/tests/fixer/fix_echo.py b/distutils2/tests/fixer/fix_echo.py new file mode 100644 --- /dev/null +++ b/distutils2/tests/fixer/fix_echo.py @@ -0,0 +1,16 @@ +# Example custom fixer, derived from fix_raw_input by Andre Roberge + +from lib2to3 import fixer_base +from lib2to3.fixer_util import Name + + +class FixEcho(fixer_base.BaseFix): + + BM_compatible = True + PATTERN = """ + power< name='echo' trailer< '(' [any] ')' > any* > + """ + + def transform(self, node, results): + name = results['name'] + name.replace(Name(u'print', prefix=name.prefix)) diff --git a/distutils2/tests/fixer/fix_echo2.py b/distutils2/tests/fixer/fix_echo2.py new file mode 100644 --- /dev/null +++ b/distutils2/tests/fixer/fix_echo2.py @@ -0,0 +1,16 @@ +# Example custom fixer, derived from fix_raw_input by Andre Roberge + +from lib2to3 import fixer_base +from lib2to3.fixer_util import Name + + +class FixEcho2(fixer_base.BaseFix): + + BM_compatible = True + PATTERN = """ + power< name='echo2' trailer< '(' [any] ')' > any* > + """ + + def transform(self, node, results): + name = results['name'] + name.replace(Name(u'print', prefix=name.prefix)) diff --git a/distutils2/tests/fixer/fix_idioms.py b/distutils2/tests/fixer/fix_idioms.py deleted file mode 100644 --- a/distutils2/tests/fixer/fix_idioms.py +++ /dev/null @@ -1,134 +0,0 @@ -"""Adjust some old Python 2 idioms to their modern counterparts. - -* Change some type comparisons to isinstance() calls: - type(x) == T -> isinstance(x, T) - type(x) is T -> isinstance(x, T) - type(x) != T -> not isinstance(x, T) - type(x) is not T -> not isinstance(x, T) - -* Change "while 1:" into "while True:". - -* Change both - - v = list(EXPR) - v.sort() - foo(v) - -and the more general - - v = EXPR - v.sort() - foo(v) - -into - - v = sorted(EXPR) - foo(v) -""" -# Author: Jacques Frechet, Collin Winter - -# Local imports -from lib2to3 import fixer_base -from lib2to3.fixer_util import Call, Comma, Name, Node, syms - -CMP = "(n='!=' | '==' | 'is' | n=comp_op< 'is' 'not' >)" -TYPE = "power< 'type' trailer< '(' x=any ')' > >" - -class FixIdioms(fixer_base.BaseFix): - - explicit = False # The user must ask for this fixer - - PATTERN = r""" - isinstance=comparison< %s %s T=any > - | - isinstance=comparison< T=any %s %s > - | - while_stmt< 'while' while='1' ':' any+ > - | - sorted=any< - any* - simple_stmt< - expr_stmt< id1=any '=' - power< list='list' trailer< '(' (not arglist) any ')' > > - > - '\n' - > - sort= - simple_stmt< - power< id2=any - trailer< '.' 'sort' > trailer< '(' ')' > - > - '\n' - > - next=any* - > - | - sorted=any< - any* - simple_stmt< expr_stmt< id1=any '=' expr=any > '\n' > - sort= - simple_stmt< - power< id2=any - trailer< '.' 'sort' > trailer< '(' ')' > - > - '\n' - > - next=any* - > - """ % (TYPE, CMP, CMP, TYPE) - - def match(self, node): - r = super(FixIdioms, self).match(node) - # If we've matched one of the sort/sorted subpatterns above, we - # want to reject matches where the initial assignment and the - # subsequent .sort() call involve different identifiers. - if r and "sorted" in r: - if r["id1"] == r["id2"]: - return r - return None - return r - - def transform(self, node, results): - if "isinstance" in results: - return self.transform_isinstance(node, results) - elif "while" in results: - return self.transform_while(node, results) - elif "sorted" in results: - return self.transform_sort(node, results) - else: - raise RuntimeError("Invalid match") - - def transform_isinstance(self, node, results): - x = results["x"].clone() # The thing inside of type() - T = results["T"].clone() # The type being compared against - x.prefix = "" - T.prefix = " " - test = Call(Name("isinstance"), [x, Comma(), T]) - if "n" in results: - test.prefix = " " - test = Node(syms.not_test, [Name("not"), test]) - test.prefix = getattr(node, 'prefix', ' ') - return test - - def transform_while(self, node, results): - one = results["while"] - one.replace(Name("True", prefix=one.prefix)) - - def transform_sort(self, node, results): - sort_stmt = results["sort"] - next_stmt = results["next"] - list_call = results.get("list") - simple_expr = results.get("expr") - - if list_call: - list_call.replace(Name("sorted", prefix=list_call.prefix)) - elif simple_expr: - new = simple_expr.clone() - new.prefix = "" - simple_expr.replace(Call(Name("sorted"), [new], - prefix=simple_expr.prefix)) - else: - raise RuntimeError("should not have reached here") - sort_stmt.remove() - if next_stmt: - next_stmt[0].prefix = sort_stmt._prefix diff --git a/distutils2/tests/test_mixin2to3.py b/distutils2/tests/test_mixin2to3.py --- a/distutils2/tests/test_mixin2to3.py +++ b/distutils2/tests/test_mixin2to3.py @@ -9,91 +9,85 @@ support.LoggingCatcher, unittest.TestCase): - @unittest.skipIf(sys.version < '2.6', 'requires Python 2.6 or higher') - @support.skip_2to3_optimize - def test_convert_code_only(self): - # used to check if code gets converted properly. - code = "print 'test'" + def setUp(self): + super(Mixin2to3TestCase, self).setUp() + self.filename = self.mktempfile().name - fp = self.mktempfile() + def check(self, source, wanted, **kwargs): + source = textwrap.dedent(source) + fp = open(self.filename, 'w') try: - fp.write(code) + fp.write(source) finally: fp.close() - mixin2to3 = Mixin2to3() - mixin2to3._run_2to3([fp.name]) - expected = "print('test')" + Mixin2to3()._run_2to3(**kwargs) - fp = open(fp.name) + fp = open(self.filename) + wanted = textwrap.dedent(wanted) try: converted = fp.read() finally: fp.close() - - self.assertEqual(expected, converted) + self.assertMultiLineEqual(wanted, converted) @unittest.skipIf(sys.version < '2.6', 'requires Python 2.6 or higher') - def test_doctests_only(self): - # used to check if doctests gets converted properly. - doctest = textwrap.dedent('''\ + def test_conversion(self): + # check that code and doctests get converted + self.check('''\ """Example docstring. >>> print test test It works. - """''') - - fp = self.mktempfile() - try: - fp.write(doctest) - finally: - fp.close() - - mixin2to3 = Mixin2to3() - mixin2to3._run_2to3([fp.name]) - expected = textwrap.dedent('''\ + """ + print 'test' + ''', + '''\ """Example docstring. >>> print(test) test It works. - """\n''') + """ + print('test') - fp = open(fp.name) - try: - converted = fp.read() - finally: - fp.close() + ''', # 2to3 adds a newline here + files=[self.filename]) - self.assertEqual(expected, converted) + @unittest.skipIf(sys.version < '2.6', 'requires Python 2.6 or higher') + def test_doctests_conversion(self): + # check that doctest files are converted + self.check('''\ + Welcome to the doc. + + >>> print test + test + ''', + '''\ + Welcome to the doc. + + >>> print(test) + test + + ''', + doctests=[self.filename]) @unittest.skipIf(sys.version < '2.6', 'requires Python 2.6 or higher') def test_additional_fixers(self): - # used to check if use_2to3_fixers works - code = 'type(x) is not T' - - fp = self.mktempfile() - try: - fp.write(code) - finally: - fp.close() - - mixin2to3 = Mixin2to3() - mixin2to3._run_2to3(files=[fp.name], doctests=[fp.name], - fixers=['distutils2.tests.fixer']) - - expected = 'not isinstance(x, T)' - - fp = open(fp.name) - try: - converted = fp.read() - finally: - fp.close() - - self.assertEqual(expected, converted) + # make sure the fixers argument works + self.check("""\ + echo('42') + echo2('oh no') + """, + """\ + print('42') + print('oh no') + """, + files=[self.filename], + fixers=['distutils2.tests.fixer']) def test_suite(): diff --git a/distutils2/util.py b/distutils2/util.py --- a/distutils2/util.py +++ b/distutils2/util.py @@ -862,13 +862,11 @@ # Make this class local, to delay import of 2to3 from lib2to3.refactor import get_fixers_from_package, RefactoringTool - fixers = [] fixers = get_fixers_from_package('lib2to3.fixes') if fixer_names: for fixername in fixer_names: - fixers.extend(fixer for fixer in - get_fixers_from_package(fixername)) + fixers.extend(get_fixers_from_package(fixername)) r = RefactoringTool(fixers, options=options) r.refactor(files, write=True, doctests_only=doctests_only) @@ -879,21 +877,23 @@ the class variables, or inherit from this class to override how 2to3 is invoked. """ - # provide list of fixers to run. - # defaults to all from lib2to3.fixers + # list of fixers to run; defaults to all implicit from lib2to3.fixers fixer_names = None - - # options dictionary + # dict of options options = None - - # list of fixers to invoke even though they are marked as explicit + # list of extra fixers to invoke explicit = None + # TODO need a better way to add just one fixer from a package + # TODO need a way to exclude individual fixers def run_2to3(self, files, doctests_only=False): """ Issues a call to util.run_2to3. """ return run_2to3(files, doctests_only, self.fixer_names, self.options, self.explicit) + # TODO provide initialize/finalize_options + + RICH_GLOB = re.compile(r'\{([^}]*)\}') _CHECK_RECURSIVE_GLOB = re.compile(r'[^/\\,{]\*\*|\*\*[^/\\,}]') _CHECK_MISMATCH_SET = re.compile(r'^[^{]*\}|\{[^}]*$') -- Repository URL: http://hg.python.org/distutils2 From python-checkins at python.org Fri Feb 10 05:11:17 2012 From: python-checkins at python.org (eric.araujo) Date: Fri, 10 Feb 2012 05:11:17 +0100 Subject: [Python-checkins] =?utf8?q?distutils2_=28merge_default_-=3E_defau?= =?utf8?q?lt=29=3A_Branch_merge?= Message-ID: http://hg.python.org/distutils2/rev/8aca92f2fc25 changeset: 1280:8aca92f2fc25 parent: 1277:b024621a1be6 parent: 1279:0d519c01b850 user: ?ric Araujo date: Thu Feb 09 18:45:37 2012 +0100 summary: Branch merge files: distutils2/command/__init__.py | 48 +++++++------------ distutils2/run.py | 9 +-- distutils2/tests/test_markers.py | 10 ++- distutils2/tests/test_run.py | 28 ++++++++++- 4 files changed, 53 insertions(+), 42 deletions(-) diff --git a/distutils2/command/__init__.py b/distutils2/command/__init__.py --- a/distutils2/command/__init__.py +++ b/distutils2/command/__init__.py @@ -6,38 +6,28 @@ __all__ = ['get_command_names', 'set_command', 'get_command_class', 'STANDARD_COMMANDS'] -_COMMANDS = { - 'check': 'distutils2.command.check.check', - 'test': 'distutils2.command.test.test', - 'build': 'distutils2.command.build.build', - 'build_py': 'distutils2.command.build_py.build_py', - 'build_ext': 'distutils2.command.build_ext.build_ext', - 'build_clib': 'distutils2.command.build_clib.build_clib', - 'build_scripts': 'distutils2.command.build_scripts.build_scripts', - 'clean': 'distutils2.command.clean.clean', - 'install_dist': 'distutils2.command.install_dist.install_dist', - 'install_lib': 'distutils2.command.install_lib.install_lib', - 'install_headers': 'distutils2.command.install_headers.install_headers', - 'install_scripts': 'distutils2.command.install_scripts.install_scripts', - 'install_data': 'distutils2.command.install_data.install_data', - 'install_distinfo': - 'distutils2.command.install_distinfo.install_distinfo', - 'sdist': 'distutils2.command.sdist.sdist', - 'bdist': 'distutils2.command.bdist.bdist', - 'bdist_dumb': 'distutils2.command.bdist_dumb.bdist_dumb', - 'bdist_wininst': 'distutils2.command.bdist_wininst.bdist_wininst', - 'register': 'distutils2.command.register.register', - 'upload': 'distutils2.command.upload.upload', - 'upload_docs': 'distutils2.command.upload_docs.upload_docs', -} -# XXX this is crappy +STANDARD_COMMANDS = [ + # packaging + 'check', 'test', + # building + 'build', 'build_py', 'build_ext', 'build_clib', 'build_scripts', 'clean', + # installing + 'install_dist', 'install_lib', 'install_headers', 'install_scripts', + 'install_data', 'install_distinfo', + # distributing + 'sdist', 'bdist', 'bdist_dumb', 'bdist_wininst', + 'register', 'upload', 'upload_docs', + ] + if os.name == 'nt': - _COMMANDS['bdist_msi'] = 'distutils2.command.bdist_msi.bdist_msi' + STANDARD_COMMANDS.insert(STANDARD_COMMANDS.index('bdist_wininst'), + 'bdist_msi') -# XXX use OrderedDict to preserve the grouping (build-related, install-related, -# distribution-related) -STANDARD_COMMANDS = set(_COMMANDS) +# XXX maybe we need more than one registry, so that --list-comands can display +# standard, custom and overriden standard commands differently +_COMMANDS = dict((name, 'distutils2.command.%s.%s' % (name, name)) + for name in STANDARD_COMMANDS) def get_command_names(): diff --git a/distutils2/run.py b/distutils2/run.py --- a/distutils2/run.py +++ b/distutils2/run.py @@ -254,16 +254,13 @@ parser = dispatcher.parser args = args[1:] - commands = STANDARD_COMMANDS # + extra commands + commands = STANDARD_COMMANDS # FIXME display extra commands if args == ['--list-commands']: print 'List of available commands:' - cmds = sorted(commands) - - for cmd in cmds: + for cmd in commands: cls = dispatcher.cmdclass.get(cmd) or get_command_class(cmd) - desc = getattr(cls, 'description', - '(no description available)') + desc = getattr(cls, 'description', '(no description available)') print ' %s: %s' % (cmd, desc) return diff --git a/distutils2/tests/test_markers.py b/distutils2/tests/test_markers.py --- a/distutils2/tests/test_markers.py +++ b/distutils2/tests/test_markers.py @@ -22,8 +22,6 @@ self.assertTrue(interpret("sys.platform == '%s'" % sys_platform)) self.assertTrue(interpret( - "sys.platform == '%s' or python_version == '2.4'" % sys_platform)) - self.assertTrue(interpret( "sys.platform == '%s' and python_full_version == '%s'" % (sys_platform, version))) self.assertTrue(interpret("'%s' == sys.platform" % sys_platform)) @@ -42,12 +40,18 @@ # combined operations OP = 'os.name == "%s"' % os_name + FALSEOP = 'os.name == "buuuu"' AND = ' and ' OR = ' or ' self.assertTrue(interpret(OP + AND + OP)) self.assertTrue(interpret(OP + AND + OP + AND + OP)) self.assertTrue(interpret(OP + OR + OP)) - self.assertTrue(interpret(OP + OR + OP + OR + OP)) + self.assertTrue(interpret(OP + OR + FALSEOP)) + self.assertTrue(interpret(OP + OR + OP + OR + FALSEOP)) + self.assertTrue(interpret(OP + OR + FALSEOP + OR + FALSEOP)) + self.assertTrue(interpret(FALSEOP + OR + OP)) + self.assertFalse(interpret(FALSEOP + AND + FALSEOP)) + self.assertFalse(interpret(FALSEOP + OR + FALSEOP)) # other operators self.assertTrue(interpret("os.name != 'buuuu'")) diff --git a/distutils2/tests/test_run.py b/distutils2/tests/test_run.py --- a/distutils2/tests/test_run.py +++ b/distutils2/tests/test_run.py @@ -60,22 +60,42 @@ os.chmod(install_path, old_mod) install.get_path = old_get_path - def test_show_help(self): - # smoke test, just makes sure some help is displayed + def get_pythonpath(self): pythonpath = os.environ.get('PYTHONPATH') d2parent = os.path.dirname(os.path.dirname(__file__)) if pythonpath is not None: - pythonpath = os.pathsep.join((pythonpath, d2parent)) + pythonpath = os.pathsep.join((pythonpath, d2parent)) else: pythonpath = d2parent + return pythonpath + def test_show_help(self): + # smoke test, just makes sure some help is displayed status, out, err = assert_python_ok( '-c', 'from distutils2.run import main; main()', '--help', - PYTHONPATH=pythonpath) + PYTHONPATH=self.get_pythonpath()) self.assertEqual(status, 0) self.assertGreater(out, '') self.assertEqual(err, '') + def test_list_commands(self): + status, out, err = assert_python_ok( + '-c', 'from distutils2.run import main; main()', 'run', + '--list-commands', PYTHONPATH=self.get_pythonpath()) + # check that something is displayed + self.assertEqual(status, 0) + self.assertGreater(out, '') + self.assertEqual(err, '') + + # make sure the manual grouping of commands is respected + check_position = out.find(' check: ') + build_position = out.find(' build: ') + self.assertTrue(check_position, out) # "out" printed as debugging aid + self.assertTrue(build_position, out) + self.assertLess(check_position, build_position, out) + + # TODO test that custom commands don't break --list-commands + def test_suite(): return unittest.makeSuite(RunTestCase) -- Repository URL: http://hg.python.org/distutils2 From python-checkins at python.org Fri Feb 10 05:11:17 2012 From: python-checkins at python.org (eric.araujo) Date: Fri, 10 Feb 2012 05:11:17 +0100 Subject: [Python-checkins] =?utf8?q?distutils2=3A_Add_fixup_for_compiling_?= =?utf8?q?C_in_tests_with_an_uninstalled_Python_=282=2E7=29?= Message-ID: http://hg.python.org/distutils2/rev/9e3c60f3216b changeset: 1281:9e3c60f3216b user: ?ric Araujo date: Thu Feb 09 19:27:01 2012 +0100 summary: Add fixup for compiling C in tests with an uninstalled Python (2.7) files: distutils2/tests/support.py | 9 ++++++++- 1 files changed, 8 insertions(+), 1 deletions(-) diff --git a/distutils2/tests/support.py b/distutils2/tests/support.py --- a/distutils2/tests/support.py +++ b/distutils2/tests/support.py @@ -365,7 +365,9 @@ need their debug attribute set, and it is not done automatically for some reason. - This function handles both of these things. Example use: + This function handles both of these things, and also fixes + cmd.distribution.include_dirs if the running Python is an uninstalled + build. Example use: cmd = build_ext(dist) support.fixup_build_ext(cmd) @@ -388,6 +390,11 @@ name, equals, value = runshared.partition('=') cmd.library_dirs = value.split(os.pathsep) + # Allow tests to run with an uninstalled Python + if sysconfig.is_python_build(): + pysrcdir = sysconfig.get_config_var('projectbase') + cmd.distribution.include_dirs.append(os.path.join(pysrcdir, 'Include')) + try: from test.test_support import skip_unless_symlink -- Repository URL: http://hg.python.org/distutils2 From python-checkins at python.org Fri Feb 10 05:11:17 2012 From: python-checkins at python.org (eric.araujo) Date: Fri, 10 Feb 2012 05:11:17 +0100 Subject: [Python-checkins] =?utf8?q?distutils2_=28merge_default_-=3E_pytho?= =?utf8?q?n3=29=3A_Merge_touch-ups_from_default?= Message-ID: http://hg.python.org/distutils2/rev/a22859e3ebb9 changeset: 1283:a22859e3ebb9 branch: python3 parent: 1274:ea717d8e71d0 parent: 1276:cfdf8964c3dc user: ?ric Araujo date: Thu Feb 09 02:09:07 2012 +0100 summary: Merge touch-ups from default files: distutils2/util.py | 2 +- distutils2/version.py | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/distutils2/util.py b/distutils2/util.py --- a/distutils2/util.py +++ b/distutils2/util.py @@ -1049,7 +1049,6 @@ SETUP_TEMPLATE = """\ # This script was automatically generated by distutils2 -import os import codecs from distutils.core import setup try: @@ -1057,6 +1056,7 @@ except ImportError: from configparser import RawConfigParser + %(split_multiline)s %(cfg_to_args)s diff --git a/distutils2/version.py b/distutils2/version.py --- a/distutils2/version.py +++ b/distutils2/version.py @@ -293,12 +293,12 @@ # The 'r' and the '-' tags are post release tags # 0.4a1.r10 -> 0.4a1.post10 - # 0.9.33-17222 -> 0.9.3.post17222 - # 0.9.33-r17222 -> 0.9.3.post17222 + # 0.9.33-17222 -> 0.9.33.post17222 + # 0.9.33-r17222 -> 0.9.33.post17222 rs = re.sub(r"\.?(r|-|-r)\.?(\d+)$", r".post\2", rs) # Clean 'r' instead of 'dev' usage: - # 0.9.33+r17222 -> 0.9.3.dev17222 + # 0.9.33+r17222 -> 0.9.33.dev17222 # 1.0dev123 -> 1.0.dev123 # 1.0.git123 -> 1.0.dev123 # 1.0.bzr123 -> 1.0.dev123 -- Repository URL: http://hg.python.org/distutils2 From python-checkins at python.org Fri Feb 10 05:11:17 2012 From: python-checkins at python.org (eric.araujo) Date: Fri, 10 Feb 2012 05:11:17 +0100 Subject: [Python-checkins] =?utf8?q?distutils2=3A_Use_sys=2Eversion=5Finfo?= =?utf8?q?_instead_of_sys=2Eversion=2E?= Message-ID: http://hg.python.org/distutils2/rev/0cc1fbbb473d changeset: 1282:0cc1fbbb473d user: ?ric Araujo date: Thu Feb 09 19:41:19 2012 +0100 summary: Use sys.version_info instead of sys.version. The contents of this attribute are an implementation detail, as documented for #9442, so we should not parse it, to support non-CPython VMs in the future. Unfortunately, one use comes directly from PEP 345, so an edit will have to be agreed before fixing the code (see comment in d2.markers). Other remaining uses are found in d2.compiler and could be replaced by the platform module (which also parses sys.version, but then it wouldn?t be my fault :) files: distutils2/command/bdist_msi.py | 2 +- distutils2/command/bdist_wininst.py | 2 +- distutils2/command/build.py | 6 +++--- distutils2/command/install_dist.py | 2 +- distutils2/compiler/cygwinccompiler.py | 4 ++++ distutils2/create.py | 2 +- distutils2/markers.py | 4 +++- distutils2/pypi/simple.py | 4 ++-- distutils2/tests/support.py | 6 ++++-- distutils2/tests/test_command_build.py | 5 +++-- distutils2/tests/test_command_build_ext.py | 6 +++--- distutils2/tests/test_command_install_dist.py | 4 ++-- distutils2/tests/test_mixin2to3.py | 8 ++++---- distutils2/tests/test_util.py | 4 ++-- runtests.py | 2 +- setup.py | 2 +- 16 files changed, 36 insertions(+), 27 deletions(-) diff --git a/distutils2/command/bdist_msi.py b/distutils2/command/bdist_msi.py --- a/distutils2/command/bdist_msi.py +++ b/distutils2/command/bdist_msi.py @@ -203,7 +203,7 @@ target_version = self.target_version if not target_version: assert self.skip_build, "Should have already checked this" - target_version = sys.version[0:3] + target_version = '%s.%s' % sys.version_info[:2] plat_specifier = ".%s-%s" % (self.plat_name, target_version) build = self.get_finalized_command('build') build.build_lib = os.path.join(build.build_base, diff --git a/distutils2/command/bdist_wininst.py b/distutils2/command/bdist_wininst.py --- a/distutils2/command/bdist_wininst.py +++ b/distutils2/command/bdist_wininst.py @@ -137,7 +137,7 @@ target_version = self.target_version if not target_version: assert self.skip_build, "Should have already checked this" - target_version = sys.version[0:3] + target_version = '%s.%s' % sys.version_info[:2] plat_specifier = ".%s-%s" % (self.plat_name, target_version) build = self.get_finalized_command('build') build.build_lib = os.path.join(build.build_base, diff --git a/distutils2/command/build.py b/distutils2/command/build.py --- a/distutils2/command/build.py +++ b/distutils2/command/build.py @@ -82,8 +82,8 @@ raise PackagingOptionError( "--plat-name only supported on Windows (try " "using './configure --help' on your platform)") - - plat_specifier = ".%s-%s" % (self.plat_name, sys.version[0:3]) + pyversion = '%s.%s' % sys.version_info[:2] + plat_specifier = ".%s-%s" % (self.plat_name, pyversion) # Make it so Python 2.x and Python 2.x with --with-pydebug don't # share the same build directories. Doing so confuses the build @@ -116,7 +116,7 @@ 'temp' + plat_specifier) if self.build_scripts is None: self.build_scripts = os.path.join(self.build_base, - 'scripts-' + sys.version[0:3]) + 'scripts-' + pyversion) if self.executable is None: self.executable = os.path.normpath(sys.executable) diff --git a/distutils2/command/install_dist.py b/distutils2/command/install_dist.py --- a/distutils2/command/install_dist.py +++ b/distutils2/command/install_dist.py @@ -255,7 +255,7 @@ # $platbase in the other installation directories and not worry # about needing recursive variable expansion (shudder). - py_version = sys.version.split()[0] + py_version = '%s.%s' % sys.version_info[:2] prefix, exec_prefix, srcdir, projectbase = get_config_vars( 'prefix', 'exec_prefix', 'srcdir', 'projectbase') diff --git a/distutils2/compiler/cygwinccompiler.py b/distutils2/compiler/cygwinccompiler.py --- a/distutils2/compiler/cygwinccompiler.py +++ b/distutils2/compiler/cygwinccompiler.py @@ -56,6 +56,10 @@ from distutils2.util import get_compiler_versions from distutils2._backport import sysconfig +# TODO use platform instead of sys.version +# (platform does unholy sys.version parsing too, but at least it gives other +# VMs a chance to override the returned values) + def get_msvcr(): """Include the appropriate MSVC runtime library if Python was built diff --git a/distutils2/create.py b/distutils2/create.py --- a/distutils2/create.py +++ b/distutils2/create.py @@ -377,7 +377,7 @@ ('long_description', 'description'), ('url', 'home_page'), ('platforms', 'platform')) - if sys.version >= '2.5': + if sys.version_info[:2] >= (2, 5): labels += ( ('provides', 'provides-dist'), ('obsoletes', 'obsoletes-dist'), diff --git a/distutils2/markers.py b/distutils2/markers.py --- a/distutils2/markers.py +++ b/distutils2/markers.py @@ -28,7 +28,9 @@ # restricted set of variables _VARS = {'sys.platform': sys.platform, - 'python_version': sys.version[:3], + 'python_version': '%s.%s' % sys.version_info[:2], + # FIXME parsing sys.platform is not reliable, but there is no other + # way to get e.g. 2.7.2+, and the PEP is defined with sys.version 'python_full_version': sys.version.split(' ', 1)[0], 'os.name': os.name, 'platform.version': platform.version(), diff --git a/distutils2/pypi/simple.py b/distutils2/pypi/simple.py --- a/distutils2/pypi/simple.py +++ b/distutils2/pypi/simple.py @@ -34,8 +34,8 @@ DEFAULT_SIMPLE_INDEX_URL = "http://a.pypi.python.org/simple/" DEFAULT_HOSTS = ("*",) SOCKET_TIMEOUT = 15 -USER_AGENT = "Python-urllib/%s distutils2/%s" % ( - sys.version[:3], distutils2_version) +USER_AGENT = "Python-urllib/%s.%s distutils2/%s" % ( + sys.version_info[0], sys.version_info[1], distutils2_version) # -- Regexps ------------------------------------------------- EGG_FRAGMENT = re.compile(r'^egg=([-A-Za-z0-9_.]+)$') diff --git a/distutils2/tests/support.py b/distutils2/tests/support.py --- a/distutils2/tests/support.py +++ b/distutils2/tests/support.py @@ -63,8 +63,9 @@ # misc. functions and decorators 'fake_dec', 'create_distribution', 'use_command', 'copy_xxmodule_c', 'fixup_build_ext', + 'requires_py26_min', 'skip_2to3_optimize', # imported from this module for backport purposes - 'unittest', 'requires_zlib', 'skip_2to3_optimize', 'skip_unless_symlink', + 'unittest', 'requires_zlib', 'skip_unless_symlink', ] @@ -402,10 +403,11 @@ skip_unless_symlink = unittest.skip( 'requires test.test_support.skip_unless_symlink') - skip_2to3_optimize = unittest.skipUnless(__debug__, "2to3 doesn't work under -O") +requires_py26_min = unittest.skipIf(sys.version_info[:2] < (2, 6), + 'requires Python 2.6 or higher') requires_zlib = unittest.skipUnless(zlib, 'requires zlib') diff --git a/distutils2/tests/test_command_build.py b/distutils2/tests/test_command_build.py --- a/distutils2/tests/test_command_build.py +++ b/distutils2/tests/test_command_build.py @@ -26,7 +26,8 @@ # build_platlib is 'build/lib.platform-x.x[-pydebug]' # examples: # build/lib.macosx-10.3-i386-2.7 - plat_spec = '.%s-%s' % (cmd.plat_name, sys.version[0:3]) + pyversion = '%s.%s' % sys.version_info[:2] + plat_spec = '.%s-%s' % (cmd.plat_name, pyversion) if hasattr(sys, 'gettotalrefcount'): self.assertTrue(cmd.build_platlib.endswith('-pydebug')) plat_spec += '-pydebug' @@ -41,7 +42,7 @@ self.assertEqual(cmd.build_temp, wanted) # build_scripts is build/scripts-x.x - wanted = os.path.join(cmd.build_base, 'scripts-' + sys.version[0:3]) + wanted = os.path.join(cmd.build_base, 'scripts-' + pyversion) self.assertEqual(cmd.build_scripts, wanted) # executable is os.path.normpath(sys.executable) diff --git a/distutils2/tests/test_command_build_ext.py b/distutils2/tests/test_command_build_ext.py --- a/distutils2/tests/test_command_build_ext.py +++ b/distutils2/tests/test_command_build_ext.py @@ -19,12 +19,12 @@ def setUp(self): super(BuildExtTestCase, self).setUp() self.tmp_dir = self.mkdtemp() - if sys.version > "2.6": + if sys.version_info[:2] >= (2, 6): self.old_user_base = site.USER_BASE site.USER_BASE = self.mkdtemp() def tearDown(self): - if sys.version > "2.6": + if sys.version_info[:2] >= (2, 6): site.USER_BASE = self.old_user_base super(BuildExtTestCase, self).tearDown() @@ -85,7 +85,7 @@ # make sure we get some library dirs under solaris self.assertGreater(len(cmd.library_dirs), 0) - @unittest.skipIf(sys.version < '2.6', 'requires Python 2.6 or higher') + @support.requires_py26_min def test_user_site(self): dist = Distribution({'name': 'xx'}) cmd = build_ext(dist) diff --git a/distutils2/tests/test_command_install_dist.py b/distutils2/tests/test_command_install_dist.py --- a/distutils2/tests/test_command_install_dist.py +++ b/distutils2/tests/test_command_install_dist.py @@ -72,7 +72,7 @@ check_path(cmd.install_scripts, os.path.join(destination, "bin")) check_path(cmd.install_data, destination) - @unittest.skipIf(sys.version < '2.6', 'requires Python 2.6 or higher') + @support.requires_py26_min def test_user_site(self): # test install with --user # preparing the environment for the test @@ -172,7 +172,7 @@ cmd.home = 'home' self.assertRaises(PackagingOptionError, cmd.finalize_options) - if sys.version >= '2.6': + if sys.version_info[:2] >= (2, 6): # can't combine user with with prefix/exec_prefix/home or # install_(plat)base cmd.prefix = None diff --git a/distutils2/tests/test_mixin2to3.py b/distutils2/tests/test_mixin2to3.py --- a/distutils2/tests/test_mixin2to3.py +++ b/distutils2/tests/test_mixin2to3.py @@ -29,9 +29,9 @@ converted = fp.read() finally: fp.close() - self.assertMultiLineEqual(wanted, converted) + self.assertMultiLineEqual(converted, wanted) - @unittest.skipIf(sys.version < '2.6', 'requires Python 2.6 or higher') + @support.requires_py26_min def test_conversion(self): # check that code and doctests get converted self.check('''\ @@ -57,7 +57,7 @@ ''', # 2to3 adds a newline here files=[self.filename]) - @unittest.skipIf(sys.version < '2.6', 'requires Python 2.6 or higher') + @support.requires_py26_min def test_doctests_conversion(self): # check that doctest files are converted self.check('''\ @@ -75,7 +75,7 @@ ''', doctests=[self.filename]) - @unittest.skipIf(sys.version < '2.6', 'requires Python 2.6 or higher') + @support.requires_py26_min def test_additional_fixers(self): # make sure the fixers argument works self.check("""\ diff --git a/distutils2/tests/test_util.py b/distutils2/tests/test_util.py --- a/distutils2/tests/test_util.py +++ b/distutils2/tests/test_util.py @@ -417,7 +417,7 @@ self.assertRaises(ImportError, resolve_name, 'a.b.Spam') self.assertRaises(ImportError, resolve_name, 'a.b.c.Spam') - @unittest.skipIf(sys.version < '2.6', 'requires Python 2.6 or higher') + @support.requires_py26_min @support.skip_2to3_optimize def test_run_2to3_on_code(self): content = "print 'test'" @@ -432,7 +432,7 @@ file_handle.close() self.assertEqual(new_content, converted_content) - @unittest.skipIf(sys.version < '2.6', 'requires Python 2.6 or higher') + @support.requires_py26_min @support.skip_2to3_optimize def test_run_2to3_on_doctests(self): # to check if text files containing doctests only get converted. diff --git a/runtests.py b/runtests.py --- a/runtests.py +++ b/runtests.py @@ -215,7 +215,7 @@ if __name__ == "__main__": - if sys.version < '2.5': + if sys.version_info[:2] < (2, 5): try: from distutils2._backport import hashlib except ImportError: diff --git a/setup.py b/setup.py --- a/setup.py +++ b/setup.py @@ -208,6 +208,6 @@ return exts setup_kwargs = cfg_to_args('setup.cfg') -if sys.version < '2.5': +if sys.version_info[:2] < (2, 5): setup_kwargs['ext_modules'] = prepare_hashlib_extensions() setup(**setup_kwargs) -- Repository URL: http://hg.python.org/distutils2 From python-checkins at python.org Fri Feb 10 05:11:17 2012 From: python-checkins at python.org (eric.araujo) Date: Fri, 10 Feb 2012 05:11:17 +0100 Subject: [Python-checkins] =?utf8?q?distutils2_=28merge_default_-=3E_pytho?= =?utf8?q?n3=29=3A_Merge_fixes_for_=2313462_and_others_from_default?= Message-ID: http://hg.python.org/distutils2/rev/cc0f4d208193 changeset: 1284:cc0f4d208193 branch: python3 parent: 1283:a22859e3ebb9 parent: 1282:0cc1fbbb473d user: ?ric Araujo date: Thu Feb 09 21:05:47 2012 +0100 summary: Merge fixes for #13462 and others from default files: distutils2/command/__init__.py | 48 +-- distutils2/command/bdist_msi.py | 2 +- distutils2/command/bdist_wininst.py | 2 +- distutils2/command/build.py | 6 +- distutils2/command/install_dist.py | 2 +- distutils2/compat.py | 17 +- distutils2/compiler/cygwinccompiler.py | 4 + distutils2/markers.py | 4 +- distutils2/pypi/simple.py | 4 +- distutils2/run.py | 9 +- distutils2/tests/fixer/fix_echo.py | 16 + distutils2/tests/fixer/fix_echo2.py | 16 + distutils2/tests/fixer/fix_idioms.py | 134 ---------- distutils2/tests/support.py | 18 +- distutils2/tests/test_command_bdist_dumb.py | 2 +- distutils2/tests/test_command_build.py | 5 +- distutils2/tests/test_command_build_py.py | 8 +- distutils2/tests/test_command_install_dist.py | 2 +- distutils2/tests/test_command_install_lib.py | 2 +- distutils2/tests/test_markers.py | 10 +- distutils2/tests/test_mixin2to3.py | 92 +++--- distutils2/tests/test_pypi_simple.py | 2 +- distutils2/tests/test_run.py | 29 +- distutils2/util.py | 18 +- 24 files changed, 185 insertions(+), 267 deletions(-) diff --git a/distutils2/command/__init__.py b/distutils2/command/__init__.py --- a/distutils2/command/__init__.py +++ b/distutils2/command/__init__.py @@ -6,38 +6,28 @@ __all__ = ['get_command_names', 'set_command', 'get_command_class', 'STANDARD_COMMANDS'] -_COMMANDS = { - 'check': 'distutils2.command.check.check', - 'test': 'distutils2.command.test.test', - 'build': 'distutils2.command.build.build', - 'build_py': 'distutils2.command.build_py.build_py', - 'build_ext': 'distutils2.command.build_ext.build_ext', - 'build_clib': 'distutils2.command.build_clib.build_clib', - 'build_scripts': 'distutils2.command.build_scripts.build_scripts', - 'clean': 'distutils2.command.clean.clean', - 'install_dist': 'distutils2.command.install_dist.install_dist', - 'install_lib': 'distutils2.command.install_lib.install_lib', - 'install_headers': 'distutils2.command.install_headers.install_headers', - 'install_scripts': 'distutils2.command.install_scripts.install_scripts', - 'install_data': 'distutils2.command.install_data.install_data', - 'install_distinfo': - 'distutils2.command.install_distinfo.install_distinfo', - 'sdist': 'distutils2.command.sdist.sdist', - 'bdist': 'distutils2.command.bdist.bdist', - 'bdist_dumb': 'distutils2.command.bdist_dumb.bdist_dumb', - 'bdist_wininst': 'distutils2.command.bdist_wininst.bdist_wininst', - 'register': 'distutils2.command.register.register', - 'upload': 'distutils2.command.upload.upload', - 'upload_docs': 'distutils2.command.upload_docs.upload_docs', -} -# XXX this is crappy +STANDARD_COMMANDS = [ + # packaging + 'check', 'test', + # building + 'build', 'build_py', 'build_ext', 'build_clib', 'build_scripts', 'clean', + # installing + 'install_dist', 'install_lib', 'install_headers', 'install_scripts', + 'install_data', 'install_distinfo', + # distributing + 'sdist', 'bdist', 'bdist_dumb', 'bdist_wininst', + 'register', 'upload', 'upload_docs', + ] + if os.name == 'nt': - _COMMANDS['bdist_msi'] = 'distutils2.command.bdist_msi.bdist_msi' + STANDARD_COMMANDS.insert(STANDARD_COMMANDS.index('bdist_wininst'), + 'bdist_msi') -# XXX use OrderedDict to preserve the grouping (build-related, install-related, -# distribution-related) -STANDARD_COMMANDS = set(_COMMANDS) +# XXX maybe we need more than one registry, so that --list-comands can display +# standard, custom and overriden standard commands differently +_COMMANDS = dict((name, 'distutils2.command.%s.%s' % (name, name)) + for name in STANDARD_COMMANDS) def get_command_names(): diff --git a/distutils2/command/bdist_msi.py b/distutils2/command/bdist_msi.py --- a/distutils2/command/bdist_msi.py +++ b/distutils2/command/bdist_msi.py @@ -203,7 +203,7 @@ target_version = self.target_version if not target_version: assert self.skip_build, "Should have already checked this" - target_version = sys.version[0:3] + target_version = '%s.%s' % sys.version_info[:2] plat_specifier = ".%s-%s" % (self.plat_name, target_version) build = self.get_finalized_command('build') build.build_lib = os.path.join(build.build_base, diff --git a/distutils2/command/bdist_wininst.py b/distutils2/command/bdist_wininst.py --- a/distutils2/command/bdist_wininst.py +++ b/distutils2/command/bdist_wininst.py @@ -136,7 +136,7 @@ target_version = self.target_version if not target_version: assert self.skip_build, "Should have already checked this" - target_version = sys.version[0:3] + target_version = '%s.%s' % sys.version_info[:2] plat_specifier = ".%s-%s" % (self.plat_name, target_version) build = self.get_finalized_command('build') build.build_lib = os.path.join(build.build_base, diff --git a/distutils2/command/build.py b/distutils2/command/build.py --- a/distutils2/command/build.py +++ b/distutils2/command/build.py @@ -82,8 +82,8 @@ raise PackagingOptionError( "--plat-name only supported on Windows (try " "using './configure --help' on your platform)") - - plat_specifier = ".%s-%s" % (self.plat_name, sys.version[0:3]) + pyversion = '%s.%s' % sys.version_info[:2] + plat_specifier = ".%s-%s" % (self.plat_name, pyversion) # Make it so Python 2.x and Python 2.x with --with-pydebug don't # share the same build directories. Doing so confuses the build @@ -116,7 +116,7 @@ 'temp' + plat_specifier) if self.build_scripts is None: self.build_scripts = os.path.join(self.build_base, - 'scripts-' + sys.version[0:3]) + 'scripts-' + pyversion) if self.executable is None: self.executable = os.path.normpath(sys.executable) diff --git a/distutils2/command/install_dist.py b/distutils2/command/install_dist.py --- a/distutils2/command/install_dist.py +++ b/distutils2/command/install_dist.py @@ -242,7 +242,7 @@ # $platbase in the other installation directories and not worry # about needing recursive variable expansion (shudder). - py_version = sys.version.split()[0] + py_version = '%s.%s' % sys.version_info[:2] prefix, exec_prefix, srcdir, projectbase = get_config_vars( 'prefix', 'exec_prefix', 'srcdir', 'projectbase') diff --git a/distutils2/compat.py b/distutils2/compat.py --- a/distutils2/compat.py +++ b/distutils2/compat.py @@ -25,7 +25,7 @@ """ if _CONVERT: - def _run_2to3(self, files, doctests=[], fixers=[]): + def _run_2to3(self, files=[], doctests=[], fixers=[]): """ Takes a list of files and doctests, and performs conversion on those. - First, the files which contain the code(`files`) are converted. @@ -35,17 +35,16 @@ if fixers: self.fixer_names = fixers - logger.info('converting Python code') - _KLASS.run_2to3(self, files) + if files: + logger.info('converting Python code and doctests') + _KLASS.run_2to3(self, files) + _KLASS.run_2to3(self, files, doctests_only=True) - logger.info('converting doctests in Python files') - _KLASS.run_2to3(self, files, doctests_only=True) - - if doctests != []: - logger.info('converting doctest in text files') + if doctests: + logger.info('converting doctests in text files') _KLASS.run_2to3(self, doctests, doctests_only=True) else: # If run on Python 2.x, there is nothing to do. - def _run_2to3(self, files, doctests=[], fixers=[]): + def _run_2to3(self, files=[], doctests=[], fixers=[]): pass diff --git a/distutils2/compiler/cygwinccompiler.py b/distutils2/compiler/cygwinccompiler.py --- a/distutils2/compiler/cygwinccompiler.py +++ b/distutils2/compiler/cygwinccompiler.py @@ -56,6 +56,10 @@ from distutils2.util import get_compiler_versions from distutils2._backport import sysconfig +# TODO use platform instead of sys.version +# (platform does unholy sys.version parsing too, but at least it gives other +# VMs a chance to override the returned values) + def get_msvcr(): """Include the appropriate MSVC runtime library if Python was built diff --git a/distutils2/markers.py b/distutils2/markers.py --- a/distutils2/markers.py +++ b/distutils2/markers.py @@ -26,7 +26,9 @@ # restricted set of variables _VARS = {'sys.platform': sys.platform, - 'python_version': sys.version[:3], + 'python_version': '%s.%s' % sys.version_info[:2], + # FIXME parsing sys.platform is not reliable, but there is no other + # way to get e.g. 2.7.2+, and the PEP is defined with sys.version 'python_full_version': sys.version.split(' ', 1)[0], 'os.name': os.name, 'platform.version': platform.version(), diff --git a/distutils2/pypi/simple.py b/distutils2/pypi/simple.py --- a/distutils2/pypi/simple.py +++ b/distutils2/pypi/simple.py @@ -35,8 +35,8 @@ DEFAULT_SIMPLE_INDEX_URL = "http://a.pypi.python.org/simple/" DEFAULT_HOSTS = ("*",) SOCKET_TIMEOUT = 15 -USER_AGENT = "Python-urllib/%s distutils2/%s" % ( - sys.version[:3], distutils2_version) +USER_AGENT = "Python-urllib/%s.%s distutils2/%s" % ( + sys.version_info[0], sys.version_info[1], distutils2_version) # -- Regexps ------------------------------------------------- EGG_FRAGMENT = re.compile(r'^egg=([-A-Za-z0-9_.]+)$') diff --git a/distutils2/run.py b/distutils2/run.py --- a/distutils2/run.py +++ b/distutils2/run.py @@ -255,16 +255,13 @@ parser = dispatcher.parser args = args[1:] - commands = STANDARD_COMMANDS # + extra commands + commands = STANDARD_COMMANDS # FIXME display extra commands if args == ['--list-commands']: print('List of available commands:') - cmds = sorted(commands) - - for cmd in cmds: + for cmd in commands: cls = dispatcher.cmdclass.get(cmd) or get_command_class(cmd) - desc = getattr(cls, 'description', - '(no description available)') + desc = getattr(cls, 'description', '(no description available)') print(' %s: %s' % (cmd, desc)) return diff --git a/distutils2/tests/fixer/fix_echo.py b/distutils2/tests/fixer/fix_echo.py new file mode 100644 --- /dev/null +++ b/distutils2/tests/fixer/fix_echo.py @@ -0,0 +1,16 @@ +# Example custom fixer, derived from fix_raw_input by Andre Roberge + +from lib2to3 import fixer_base +from lib2to3.fixer_util import Name + + +class FixEcho(fixer_base.BaseFix): + + BM_compatible = True + PATTERN = """ + power< name='echo' trailer< '(' [any] ')' > any* > + """ + + def transform(self, node, results): + name = results['name'] + name.replace(Name('print', prefix=name.prefix)) diff --git a/distutils2/tests/fixer/fix_echo2.py b/distutils2/tests/fixer/fix_echo2.py new file mode 100644 --- /dev/null +++ b/distutils2/tests/fixer/fix_echo2.py @@ -0,0 +1,16 @@ +# Example custom fixer, derived from fix_raw_input by Andre Roberge + +from lib2to3 import fixer_base +from lib2to3.fixer_util import Name + + +class FixEcho2(fixer_base.BaseFix): + + BM_compatible = True + PATTERN = """ + power< name='echo2' trailer< '(' [any] ')' > any* > + """ + + def transform(self, node, results): + name = results['name'] + name.replace(Name('print', prefix=name.prefix)) diff --git a/distutils2/tests/fixer/fix_idioms.py b/distutils2/tests/fixer/fix_idioms.py deleted file mode 100644 --- a/distutils2/tests/fixer/fix_idioms.py +++ /dev/null @@ -1,134 +0,0 @@ -"""Adjust some old Python 2 idioms to their modern counterparts. - -* Change some type comparisons to isinstance() calls: - type(x) == T -> isinstance(x, T) - type(x) is T -> isinstance(x, T) - type(x) != T -> not isinstance(x, T) - type(x) is not T -> not isinstance(x, T) - -* Change "while 1:" into "while True:". - -* Change both - - v = list(EXPR) - v.sort() - foo(v) - -and the more general - - v = EXPR - v.sort() - foo(v) - -into - - v = sorted(EXPR) - foo(v) -""" -# Author: Jacques Frechet, Collin Winter - -# Local imports -from lib2to3 import fixer_base -from lib2to3.fixer_util import Call, Comma, Name, Node, syms - -CMP = "(n='!=' | '==' | 'is' | n=comp_op< 'is' 'not' >)" -TYPE = "power< 'type' trailer< '(' x=any ')' > >" - -class FixIdioms(fixer_base.BaseFix): - - explicit = False # The user must ask for this fixer - - PATTERN = r""" - isinstance=comparison< %s %s T=any > - | - isinstance=comparison< T=any %s %s > - | - while_stmt< 'while' while='1' ':' any+ > - | - sorted=any< - any* - simple_stmt< - expr_stmt< id1=any '=' - power< list='list' trailer< '(' (not arglist) any ')' > > - > - '\n' - > - sort= - simple_stmt< - power< id2=any - trailer< '.' 'sort' > trailer< '(' ')' > - > - '\n' - > - next=any* - > - | - sorted=any< - any* - simple_stmt< expr_stmt< id1=any '=' expr=any > '\n' > - sort= - simple_stmt< - power< id2=any - trailer< '.' 'sort' > trailer< '(' ')' > - > - '\n' - > - next=any* - > - """ % (TYPE, CMP, CMP, TYPE) - - def match(self, node): - r = super(FixIdioms, self).match(node) - # If we've matched one of the sort/sorted subpatterns above, we - # want to reject matches where the initial assignment and the - # subsequent .sort() call involve different identifiers. - if r and "sorted" in r: - if r["id1"] == r["id2"]: - return r - return None - return r - - def transform(self, node, results): - if "isinstance" in results: - return self.transform_isinstance(node, results) - elif "while" in results: - return self.transform_while(node, results) - elif "sorted" in results: - return self.transform_sort(node, results) - else: - raise RuntimeError("Invalid match") - - def transform_isinstance(self, node, results): - x = results["x"].clone() # The thing inside of type() - T = results["T"].clone() # The type being compared against - x.prefix = "" - T.prefix = " " - test = Call(Name("isinstance"), [x, Comma(), T]) - if "n" in results: - test.prefix = " " - test = Node(syms.not_test, [Name("not"), test]) - test.prefix = getattr(node, 'prefix', ' ') - return test - - def transform_while(self, node, results): - one = results["while"] - one.replace(Name("True", prefix=one.prefix)) - - def transform_sort(self, node, results): - sort_stmt = results["sort"] - next_stmt = results["next"] - list_call = results.get("list") - simple_expr = results.get("expr") - - if list_call: - list_call.replace(Name("sorted", prefix=list_call.prefix)) - elif simple_expr: - new = simple_expr.clone() - new.prefix = "" - simple_expr.replace(Call(Name("sorted"), [new], - prefix=simple_expr.prefix)) - else: - raise RuntimeError("should not have reached here") - sort_stmt.remove() - if next_stmt: - next_stmt[0].prefix = sort_stmt._prefix diff --git a/distutils2/tests/support.py b/distutils2/tests/support.py --- a/distutils2/tests/support.py +++ b/distutils2/tests/support.py @@ -62,8 +62,9 @@ # misc. functions and decorators 'fake_dec', 'create_distribution', 'use_command', 'copy_xxmodule_c', 'fixup_build_ext', + 'skip_2to3_optimize', # imported from this module for backport purposes - 'unittest', 'requires_zlib', 'skip_2to3_optimize', 'skip_unless_symlink', + 'unittest', 'requires_zlib', 'skip_unless_symlink', ] @@ -361,16 +362,13 @@ need their debug attribute set, and it is not done automatically for some reason. - This function handles both of these things. Example use: + This function handles both of these things, and also fixes + cmd.distribution.include_dirs if the running Python is an uninstalled + build. Example use: cmd = build_ext(dist) support.fixup_build_ext(cmd) cmd.ensure_finalized() - - In addition, this function also fixes cmd.distribution.include_dirs if - the running Python is an uninstalled Python 3.3. (This fix is not done in - packaging, which does not need it, nor in distutils2 for Python 2, which - has no in-development version that can't be expected to be installed.) """ if os.name == 'nt': cmd.debug = sys.executable.endswith('_d.exe') @@ -389,8 +387,8 @@ name, equals, value = runshared.partition('=') cmd.library_dirs = value.split(os.pathsep) - # Allow tests to run with an uninstalled Python 3.3 - if sys.version_info[:2] == (3, 3) and sysconfig.is_python_build(): + # Allow tests to run with an uninstalled Python + if sysconfig.is_python_build(): pysrcdir = sysconfig.get_config_var('projectbase') cmd.distribution.include_dirs.append(os.path.join(pysrcdir, 'Include')) @@ -401,11 +399,9 @@ skip_unless_symlink = unittest.skip( 'requires test.support.skip_unless_symlink') - skip_2to3_optimize = unittest.skipIf(sys.flags.optimize, "2to3 doesn't work under -O") - requires_zlib = unittest.skipUnless(zlib, 'requires zlib') diff --git a/distutils2/tests/test_command_bdist_dumb.py b/distutils2/tests/test_command_bdist_dumb.py --- a/distutils2/tests/test_command_bdist_dumb.py +++ b/distutils2/tests/test_command_bdist_dumb.py @@ -65,7 +65,7 @@ finally: fp.close - if sys.version_info[1] == 1: + if sys.version_info[:2] == (3, 1): pyc = 'foo.pyc' else: pyc = 'foo.%s.pyc' % imp.get_tag() diff --git a/distutils2/tests/test_command_build.py b/distutils2/tests/test_command_build.py --- a/distutils2/tests/test_command_build.py +++ b/distutils2/tests/test_command_build.py @@ -26,7 +26,8 @@ # build_platlib is 'build/lib.platform-x.x[-pydebug]' # examples: # build/lib.macosx-10.3-i386-2.7 - plat_spec = '.%s-%s' % (cmd.plat_name, sys.version[0:3]) + pyversion = '%s.%s' % sys.version_info[:2] + plat_spec = '.%s-%s' % (cmd.plat_name, pyversion) if hasattr(sys, 'gettotalrefcount'): self.assertTrue(cmd.build_platlib.endswith('-pydebug')) plat_spec += '-pydebug' @@ -41,7 +42,7 @@ self.assertEqual(cmd.build_temp, wanted) # build_scripts is build/scripts-x.x - wanted = os.path.join(cmd.build_base, 'scripts-' + sys.version[0:3]) + wanted = os.path.join(cmd.build_base, 'scripts-' + pyversion) self.assertEqual(cmd.build_scripts, wanted) # executable is os.path.normpath(sys.executable) diff --git a/distutils2/tests/test_command_build_py.py b/distutils2/tests/test_command_build_py.py --- a/distutils2/tests/test_command_build_py.py +++ b/distutils2/tests/test_command_build_py.py @@ -69,12 +69,12 @@ pkgdest = os.path.join(destination, "pkg") files = os.listdir(pkgdest) wanted = ["__init__.py", "HACKING.txt", "README.txt"] - if sys.version_info[1] == 1: + if sys.version_info[:2] == (3, 1): wanted.append("__init__.pyc") else: wanted.append("__pycache__") self.assertEqual(sorted(files), sorted(wanted)) - if sys.version_info[1] >= 2: + if sys.version_info[:2] >= (3, 2): pycache_dir = os.path.join(pkgdest, "__pycache__") pyc_files = os.listdir(pycache_dir) self.assertEqual(["__init__.%s.pyc" % imp.get_tag()], pyc_files) @@ -113,7 +113,7 @@ cmd.run() found = os.listdir(cmd.build_lib) - if sys.version_info[1] == 1: + if sys.version_info[:2] == (3, 1): self.assertEqual(sorted(found), ['boiledeggs.py', 'boiledeggs.pyc']) else: @@ -133,7 +133,7 @@ cmd.run() found = os.listdir(cmd.build_lib) - if sys.version_info[1] == 1: + if sys.version_info[:2] == (3, 1): self.assertEqual(sorted(found), ['boiledeggs.py', 'boiledeggs.pyc', 'boiledeggs.pyo']) else: diff --git a/distutils2/tests/test_command_install_dist.py b/distutils2/tests/test_command_install_dist.py --- a/distutils2/tests/test_command_install_dist.py +++ b/distutils2/tests/test_command_install_dist.py @@ -197,7 +197,7 @@ with open(cmd.record) as f: content = f.read() - if sys.version_info[1] == 1: + if sys.version_info[:2] == (3, 1): pyc = 'hello.pyc' else: pyc = 'hello.%s.pyc' % imp.get_tag() diff --git a/distutils2/tests/test_command_install_lib.py b/distutils2/tests/test_command_install_lib.py --- a/distutils2/tests/test_command_install_lib.py +++ b/distutils2/tests/test_command_install_lib.py @@ -44,7 +44,7 @@ f = os.path.join(project_dir, 'foo.py') self.write_file(f, '# python file') cmd.byte_compile([f]) - if sys.version_info[1] == 1: + if sys.version_info[:2] == (3, 1): pyc_file = 'foo.pyc' pyo_file = 'foo.pyo' else: diff --git a/distutils2/tests/test_markers.py b/distutils2/tests/test_markers.py --- a/distutils2/tests/test_markers.py +++ b/distutils2/tests/test_markers.py @@ -21,8 +21,6 @@ self.assertTrue(interpret("sys.platform == '%s'" % sys_platform)) self.assertTrue(interpret( - "sys.platform == '%s' or python_version == '2.4'" % sys_platform)) - self.assertTrue(interpret( "sys.platform == '%s' and python_full_version == '%s'" % (sys_platform, version))) self.assertTrue(interpret("'%s' == sys.platform" % sys_platform)) @@ -41,12 +39,18 @@ # combined operations OP = 'os.name == "%s"' % os_name + FALSEOP = 'os.name == "buuuu"' AND = ' and ' OR = ' or ' self.assertTrue(interpret(OP + AND + OP)) self.assertTrue(interpret(OP + AND + OP + AND + OP)) self.assertTrue(interpret(OP + OR + OP)) - self.assertTrue(interpret(OP + OR + OP + OR + OP)) + self.assertTrue(interpret(OP + OR + FALSEOP)) + self.assertTrue(interpret(OP + OR + OP + OR + FALSEOP)) + self.assertTrue(interpret(OP + OR + FALSEOP + OR + FALSEOP)) + self.assertTrue(interpret(FALSEOP + OR + OP)) + self.assertFalse(interpret(FALSEOP + AND + FALSEOP)) + self.assertFalse(interpret(FALSEOP + OR + FALSEOP)) # other operators self.assertTrue(interpret("os.name != 'buuuu'")) diff --git a/distutils2/tests/test_mixin2to3.py b/distutils2/tests/test_mixin2to3.py --- a/distutils2/tests/test_mixin2to3.py +++ b/distutils2/tests/test_mixin2to3.py @@ -8,70 +8,76 @@ support.LoggingCatcher, unittest.TestCase): - @support.skip_2to3_optimize - def test_convert_code_only(self): - # used to check if code gets converted properly. - code = "print 'test'" + def setUp(self): + super(Mixin2to3TestCase, self).setUp() + self.filename = self.mktempfile().name - with self.mktempfile() as fp: - fp.write(code) + def check(self, source, wanted, **kwargs): + source = textwrap.dedent(source) + with open(self.filename, 'w') as fp: + fp.write(source) - mixin2to3 = Mixin2to3() - mixin2to3._run_2to3([fp.name]) - expected = "print('test')" + Mixin2to3()._run_2to3(**kwargs) - with open(fp.name) as fp: + wanted = textwrap.dedent(wanted) + with open(self.filename) as fp: converted = fp.read() + self.assertMultiLineEqual(converted, wanted) - self.assertEqual(expected, converted) - - def test_doctests_only(self): - # used to check if doctests gets converted properly. - doctest = textwrap.dedent('''\ + def test_conversion(self): + # check that code and doctests get converted + self.check('''\ """Example docstring. >>> print test test It works. - """''') - - with self.mktempfile() as fp: - fp.write(doctest) - - mixin2to3 = Mixin2to3() - mixin2to3._run_2to3([fp.name]) - expected = textwrap.dedent('''\ + """ + print 'test' + ''', + '''\ """Example docstring. >>> print(test) test It works. - """\n''') + """ + print('test') - with open(fp.name) as fp: - converted = fp.read() + ''', # 2to3 adds a newline here + files=[self.filename]) - self.assertEqual(expected, converted) + def test_doctests_conversion(self): + # check that doctest files are converted + self.check('''\ + Welcome to the doc. + + >>> print test + test + ''', + '''\ + Welcome to the doc. + + >>> print(test) + test + + ''', + doctests=[self.filename]) def test_additional_fixers(self): - # used to check if use_2to3_fixers works - code = 'type(x) is not T' - - with self.mktempfile() as fp: - fp.write(code) - - mixin2to3 = Mixin2to3() - mixin2to3._run_2to3(files=[fp.name], doctests=[fp.name], - fixers=['distutils2.tests.fixer']) - - expected = 'not isinstance(x, T)' - - with open(fp.name) as fp: - converted = fp.read() - - self.assertEqual(expected, converted) + # make sure the fixers argument works + self.check("""\ + echo('42') + echo2('oh no') + """, + """\ + print('42') + print('oh no') + """, + files=[self.filename], + fixers=['distutils2.tests.fixer']) def test_suite(): diff --git a/distutils2/tests/test_pypi_simple.py b/distutils2/tests/test_pypi_simple.py --- a/distutils2/tests/test_pypi_simple.py +++ b/distutils2/tests/test_pypi_simple.py @@ -87,7 +87,7 @@ try: crawler._open_url(url) except Exception as v: - if sys.version_info[:2] < (3, 2, 3): + if sys.version_info[:3] < (3, 2, 3): # XXX check versions again wanted = 'nonnumeric port' else: wanted = 'Download error' diff --git a/distutils2/tests/test_run.py b/distutils2/tests/test_run.py --- a/distutils2/tests/test_run.py +++ b/distutils2/tests/test_run.py @@ -60,21 +60,42 @@ os.chmod(install_path, old_mod) install.get_path = old_get_path - def test_show_help(self): - # smoke test, just makes sure some help is displayed + def get_pythonpath(self): pythonpath = os.environ.get('PYTHONPATH') d2parent = os.path.dirname(os.path.dirname(__file__)) if pythonpath is not None: pythonpath = os.pathsep.join((pythonpath, d2parent)) else: pythonpath = d2parent + return pythonpath - status, out, err = assert_python_ok('-m', 'distutils2.run', '--help', - PYTHONPATH=pythonpath) + def test_show_help(self): + # smoke test, just makes sure some help is displayed + status, out, err = assert_python_ok( + '-m', 'distutils2.run', '--help', + PYTHONPATH=self.get_pythonpath()) self.assertEqual(status, 0) self.assertGreater(out, b'') self.assertEqual(err, b'') + def test_list_commands(self): + status, out, err = assert_python_ok( + '-m', 'distutils2.run', 'run', + '--list-commands', PYTHONPATH=self.get_pythonpath()) + # check that something is displayed + self.assertEqual(status, 0) + self.assertGreater(out, b'') + self.assertEqual(err, b'') + + # make sure the manual grouping of commands is respected + check_position = out.find(b' check: ') + build_position = out.find(b' build: ') + self.assertTrue(check_position, out) # "out" printed as debugging aid + self.assertTrue(build_position, out) + self.assertLess(check_position, build_position, out) + + # TODO test that custom commands don't break --list-commands + def test_suite(): return unittest.makeSuite(RunTestCase) diff --git a/distutils2/util.py b/distutils2/util.py --- a/distutils2/util.py +++ b/distutils2/util.py @@ -853,13 +853,11 @@ # Make this class local, to delay import of 2to3 from lib2to3.refactor import get_fixers_from_package, RefactoringTool - fixers = [] fixers = get_fixers_from_package('lib2to3.fixes') if fixer_names: for fixername in fixer_names: - fixers.extend(fixer for fixer in - get_fixers_from_package(fixername)) + fixers.extend(get_fixers_from_package(fixername)) r = RefactoringTool(fixers, options=options) r.refactor(files, write=True, doctests_only=doctests_only) @@ -870,21 +868,23 @@ the class variables, or inherit from this class to override how 2to3 is invoked. """ - # provide list of fixers to run. - # defaults to all from lib2to3.fixers + # list of fixers to run; defaults to all implicit from lib2to3.fixers fixer_names = None - - # options dictionary + # dict of options options = None - - # list of fixers to invoke even though they are marked as explicit + # list of extra fixers to invoke explicit = None + # TODO need a better way to add just one fixer from a package + # TODO need a way to exclude individual fixers def run_2to3(self, files, doctests_only=False): """ Issues a call to util.run_2to3. """ return run_2to3(files, doctests_only, self.fixer_names, self.options, self.explicit) + # TODO provide initialize/finalize_options + + RICH_GLOB = re.compile(r'\{([^}]*)\}') _CHECK_RECURSIVE_GLOB = re.compile(r'[^/\\,{]\*\*|\*\*[^/\\,}]') _CHECK_MISMATCH_SET = re.compile(r'^[^{]*\}|\{[^}]*$') -- Repository URL: http://hg.python.org/distutils2 From python-checkins at python.org Fri Feb 10 05:13:04 2012 From: python-checkins at python.org (eric.araujo) Date: Fri, 10 Feb 2012 05:13:04 +0100 Subject: [Python-checkins] =?utf8?q?cpython=3A_Group_commands_by_topic_in_?= =?utf8?q?=E2=80=9Cpysetup_run_--list-commands=E2=80=9D_output=2E?= Message-ID: http://hg.python.org/cpython/rev/699265a57211 changeset: 74851:699265a57211 parent: 74827:58bd6a58365d user: ?ric Araujo date: Thu Feb 09 14:29:11 2012 +0100 summary: Group commands by topic in ?pysetup run --list-commands? output. This fixes a regression from distutils, where ?setup.py --help-commands? prints out commands grouped by topic (i.e. building vs. installing), which is more useful than using sorted. files: Lib/packaging/command/__init__.py | 48 +++++++----------- Lib/packaging/run.py | 9 +-- Lib/packaging/tests/test_run.py | 17 ++++++ 3 files changed, 39 insertions(+), 35 deletions(-) diff --git a/Lib/packaging/command/__init__.py b/Lib/packaging/command/__init__.py --- a/Lib/packaging/command/__init__.py +++ b/Lib/packaging/command/__init__.py @@ -6,38 +6,28 @@ __all__ = ['get_command_names', 'set_command', 'get_command_class', 'STANDARD_COMMANDS'] -_COMMANDS = { - 'check': 'packaging.command.check.check', - 'test': 'packaging.command.test.test', - 'build': 'packaging.command.build.build', - 'build_py': 'packaging.command.build_py.build_py', - 'build_ext': 'packaging.command.build_ext.build_ext', - 'build_clib': 'packaging.command.build_clib.build_clib', - 'build_scripts': 'packaging.command.build_scripts.build_scripts', - 'clean': 'packaging.command.clean.clean', - 'install_dist': 'packaging.command.install_dist.install_dist', - 'install_lib': 'packaging.command.install_lib.install_lib', - 'install_headers': 'packaging.command.install_headers.install_headers', - 'install_scripts': 'packaging.command.install_scripts.install_scripts', - 'install_data': 'packaging.command.install_data.install_data', - 'install_distinfo': - 'packaging.command.install_distinfo.install_distinfo', - 'sdist': 'packaging.command.sdist.sdist', - 'bdist': 'packaging.command.bdist.bdist', - 'bdist_dumb': 'packaging.command.bdist_dumb.bdist_dumb', - 'bdist_wininst': 'packaging.command.bdist_wininst.bdist_wininst', - 'register': 'packaging.command.register.register', - 'upload': 'packaging.command.upload.upload', - 'upload_docs': 'packaging.command.upload_docs.upload_docs', -} -# XXX this is crappy +STANDARD_COMMANDS = [ + # packaging + 'check', 'test', + # building + 'build', 'build_py', 'build_ext', 'build_clib', 'build_scripts', 'clean', + # installing + 'install_dist', 'install_lib', 'install_headers', 'install_scripts', + 'install_data', 'install_distinfo', + # distributing + 'sdist', 'bdist', 'bdist_dumb', 'bdist_wininst', + 'register', 'upload', 'upload_docs', + ] + if os.name == 'nt': - _COMMANDS['bdist_msi'] = 'packaging.command.bdist_msi.bdist_msi' + STANDARD_COMMANDS.insert(STANDARD_COMMANDS.index('bdist_wininst'), + 'bdist_msi') -# XXX use OrderedDict to preserve the grouping (build-related, install-related, -# distribution-related) -STANDARD_COMMANDS = set(_COMMANDS) +# XXX maybe we need more than one registry, so that --list-comands can display +# standard, custom and overriden standard commands differently +_COMMANDS = dict((name, 'packaging.command.%s.%s' % (name, name)) + for name in STANDARD_COMMANDS) def get_command_names(): diff --git a/Lib/packaging/run.py b/Lib/packaging/run.py --- a/Lib/packaging/run.py +++ b/Lib/packaging/run.py @@ -254,16 +254,13 @@ parser = dispatcher.parser args = args[1:] - commands = STANDARD_COMMANDS # + extra commands + commands = STANDARD_COMMANDS # FIXME display extra commands if args == ['--list-commands']: print('List of available commands:') - cmds = sorted(commands) - - for cmd in cmds: + for cmd in commands: cls = dispatcher.cmdclass.get(cmd) or get_command_class(cmd) - desc = getattr(cls, 'description', - '(no description available)') + desc = getattr(cls, 'description', '(no description available)') print(' %s: %s' % (cmd, desc)) return diff --git a/Lib/packaging/tests/test_run.py b/Lib/packaging/tests/test_run.py --- a/Lib/packaging/tests/test_run.py +++ b/Lib/packaging/tests/test_run.py @@ -67,6 +67,23 @@ self.assertGreater(out, b'') self.assertEqual(err, b'') + def test_list_commands(self): + status, out, err = assert_python_ok('-m', 'packaging.run', 'run', + '--list-commands') + # check that something is displayed + self.assertEqual(status, 0) + self.assertGreater(out, b'') + self.assertEqual(err, b'') + + # make sure the manual grouping of commands is respected + check_position = out.find(b' check: ') + build_position = out.find(b' build: ') + self.assertTrue(check_position, out) # "out" printed as debugging aid + self.assertTrue(build_position, out) + self.assertLess(check_position, build_position, out) + + # TODO test that custom commands don't break --list-commands + def test_suite(): return unittest.makeSuite(RunTestCase) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Fri Feb 10 05:13:05 2012 From: python-checkins at python.org (eric.araujo) Date: Fri, 10 Feb 2012 05:13:05 +0100 Subject: [Python-checkins] =?utf8?q?cpython=3A_Remove_unneeded_import?= Message-ID: http://hg.python.org/cpython/rev/89d6a6df10b0 changeset: 74852:89d6a6df10b0 user: ?ric Araujo date: Thu Feb 09 21:17:46 2012 +0100 summary: Remove unneeded import files: Lib/packaging/util.py | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Lib/packaging/util.py b/Lib/packaging/util.py --- a/Lib/packaging/util.py +++ b/Lib/packaging/util.py @@ -1049,7 +1049,6 @@ SETUP_TEMPLATE = """\ # This script was automatically generated by packaging -import os import codecs from distutils.core import setup try: @@ -1057,6 +1056,7 @@ except ImportError: from configparser import RawConfigParser + %(split_multiline)s %(cfg_to_args)s -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Fri Feb 10 05:13:07 2012 From: python-checkins at python.org (eric.araujo) Date: Fri, 10 Feb 2012 05:13:07 +0100 Subject: [Python-checkins] =?utf8?q?cpython=3A_More_boolean_tests_for_pack?= =?utf8?q?aging_metadata_environment_markers?= Message-ID: http://hg.python.org/cpython/rev/b58bf3d74f49 changeset: 74853:b58bf3d74f49 user: ?ric Araujo date: Thu Feb 09 21:18:26 2012 +0100 summary: More boolean tests for packaging metadata environment markers files: Lib/packaging/tests/test_markers.py | 10 +++++++--- 1 files changed, 7 insertions(+), 3 deletions(-) diff --git a/Lib/packaging/tests/test_markers.py b/Lib/packaging/tests/test_markers.py --- a/Lib/packaging/tests/test_markers.py +++ b/Lib/packaging/tests/test_markers.py @@ -21,8 +21,6 @@ self.assertTrue(interpret("sys.platform == '%s'" % sys_platform)) self.assertTrue(interpret( - "sys.platform == '%s' or python_version == '2.4'" % sys_platform)) - self.assertTrue(interpret( "sys.platform == '%s' and python_full_version == '%s'" % (sys_platform, version))) self.assertTrue(interpret("'%s' == sys.platform" % sys_platform)) @@ -41,12 +39,18 @@ # combined operations OP = 'os.name == "%s"' % os_name + FALSEOP = 'os.name == "buuuu"' AND = ' and ' OR = ' or ' self.assertTrue(interpret(OP + AND + OP)) self.assertTrue(interpret(OP + AND + OP + AND + OP)) self.assertTrue(interpret(OP + OR + OP)) - self.assertTrue(interpret(OP + OR + OP + OR + OP)) + self.assertTrue(interpret(OP + OR + FALSEOP)) + self.assertTrue(interpret(OP + OR + OP + OR + FALSEOP)) + self.assertTrue(interpret(OP + OR + FALSEOP + OR + FALSEOP)) + self.assertTrue(interpret(FALSEOP + OR + OP)) + self.assertFalse(interpret(FALSEOP + AND + FALSEOP)) + self.assertFalse(interpret(FALSEOP + OR + FALSEOP)) # other operators self.assertTrue(interpret("os.name != 'buuuu'")) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Fri Feb 10 05:13:08 2012 From: python-checkins at python.org (eric.araujo) Date: Fri, 10 Feb 2012 05:13:08 +0100 Subject: [Python-checkins] =?utf8?q?cpython=3A_Synchronize_packaging=2Etes?= =?utf8?q?ts=2Esupport_with_distutils2?= Message-ID: http://hg.python.org/cpython/rev/b0e2d6592a1f changeset: 74854:b0e2d6592a1f user: ?ric Araujo date: Thu Feb 09 21:30:25 2012 +0100 summary: Synchronize packaging.tests.support with distutils2 files: Lib/packaging/tests/support.py | 41 +++++++++++---------- 1 files changed, 22 insertions(+), 19 deletions(-) diff --git a/Lib/packaging/tests/support.py b/Lib/packaging/tests/support.py --- a/Lib/packaging/tests/support.py +++ b/Lib/packaging/tests/support.py @@ -56,8 +56,9 @@ # misc. functions and decorators 'fake_dec', 'create_distribution', 'use_command', 'copy_xxmodule_c', 'fixup_build_ext', + 'skip_2to3_optimize', # imported from this module for backport purposes - 'unittest', 'requires_zlib', 'skip_2to3_optimize', 'skip_unless_symlink', + 'unittest', 'requires_zlib', 'skip_unless_symlink', ] @@ -332,22 +333,18 @@ """ filename = _get_xxmodule_path() if filename is None: - raise unittest.SkipTest('cannot find xxmodule.c (test must run in ' - 'the python build dir)') + raise unittest.SkipTest('cannot find xxmodule.c') shutil.copy(filename, directory) def _get_xxmodule_path(): - srcdir = sysconfig.get_config_var('srcdir') - candidates = [ - # use installed copy if available - os.path.join(os.path.dirname(__file__), 'xxmodule.c'), - # otherwise try using copy from build directory - os.path.join(srcdir, 'Modules', 'xxmodule.c'), - ] - for path in candidates: - if os.path.exists(path): - return path + if sysconfig.is_python_build(): + srcdir = sysconfig.get_config_var('projectbase') + path = os.path.join(os.getcwd(), srcdir, 'Modules', 'xxmodule.c') + else: + os.path.join(os.path.dirname(__file__), 'xxmodule.c') + if os.path.exists(path): + return path def fixup_build_ext(cmd): @@ -355,20 +352,21 @@ When Python was built with --enable-shared on Unix, -L. is not enough to find libpython.so, because regrtest runs in a tempdir, not in the - source directory where the .so lives. + source directory where the .so lives. (Mac OS X embeds absolute paths + to shared libraries into executables, so the fixup is a no-op on that + platform.) When Python was built with in debug mode on Windows, build_ext commands need their debug attribute set, and it is not done automatically for some reason. - This function handles both of these things. Example use: + This function handles both of these things, and also fixes + cmd.distribution.include_dirs if the running Python is an uninstalled + build. Example use: cmd = build_ext(dist) support.fixup_build_ext(cmd) cmd.ensure_finalized() - - Unlike most other Unix platforms, Mac OS X embeds absolute paths - to shared libraries into executables, so the fixup is not needed there. """ if os.name == 'nt': cmd.debug = sys.executable.endswith('_d.exe') @@ -386,12 +384,17 @@ name, equals, value = runshared.partition('=') cmd.library_dirs = value.split(os.pathsep) + # Allow tests to run with an uninstalled Python + if sysconfig.is_python_build(): + pysrcdir = sysconfig.get_config_var('projectbase') + cmd.distribution.include_dirs.append(os.path.join(pysrcdir, 'Include')) + + try: from test.support import skip_unless_symlink except ImportError: skip_unless_symlink = unittest.skip( 'requires test.support.skip_unless_symlink') - skip_2to3_optimize = unittest.skipIf(sys.flags.optimize, "2to3 doesn't work under -O") -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Fri Feb 10 05:13:09 2012 From: python-checkins at python.org (eric.araujo) Date: Fri, 10 Feb 2012 05:13:09 +0100 Subject: [Python-checkins] =?utf8?q?cpython=3A_Start_improving_2to3_code_i?= =?utf8?b?biBwYWNrYWdpbmcgKCMxMzQ2Miku?= Message-ID: http://hg.python.org/cpython/rev/7243c3f18769 changeset: 74855:7243c3f18769 user: ?ric Araujo date: Thu Feb 09 21:37:14 2012 +0100 summary: Start improving 2to3 code in packaging (#13462). - Change the fixers used in tests to something not provided by lib2to3 - Test conversion of doctests in text files - Factor out test boilerplate into a common method files: Lib/packaging/compat.py | 19 +- Lib/packaging/tests/fixer/fix_echo.py | 16 + Lib/packaging/tests/fixer/fix_echo2.py | 16 + Lib/packaging/tests/fixer/fix_idioms.py | 134 ------------ Lib/packaging/tests/test_mixin2to3.py | 92 ++++--- Lib/packaging/util.py | 18 +- 6 files changed, 99 insertions(+), 196 deletions(-) diff --git a/Lib/packaging/compat.py b/Lib/packaging/compat.py --- a/Lib/packaging/compat.py +++ b/Lib/packaging/compat.py @@ -1,4 +1,4 @@ -"""Compatibility helpers.""" +"""Support for build-time 2to3 conversion.""" from packaging import logger @@ -25,7 +25,7 @@ """ if _CONVERT: - def _run_2to3(self, files, doctests=[], fixers=[]): + def _run_2to3(self, files=[], doctests=[], fixers=[]): """ Takes a list of files and doctests, and performs conversion on those. - First, the files which contain the code(`files`) are converted. @@ -35,17 +35,16 @@ if fixers: self.fixer_names = fixers - logger.info('converting Python code') - _KLASS.run_2to3(self, files) + if files: + logger.info('converting Python code and doctests') + _KLASS.run_2to3(self, files) + _KLASS.run_2to3(self, files, doctests_only=True) - logger.info('converting doctests in Python files') - _KLASS.run_2to3(self, files, doctests_only=True) - - if doctests != []: - logger.info('converting doctest in text files') + if doctests: + logger.info('converting doctests in text files') _KLASS.run_2to3(self, doctests, doctests_only=True) else: # If run on Python 2.x, there is nothing to do. - def _run_2to3(self, files, doctests=[], fixers=[]): + def _run_2to3(self, files=[], doctests=[], fixers=[]): pass diff --git a/Lib/packaging/tests/fixer/fix_echo.py b/Lib/packaging/tests/fixer/fix_echo.py new file mode 100644 --- /dev/null +++ b/Lib/packaging/tests/fixer/fix_echo.py @@ -0,0 +1,16 @@ +# Example custom fixer, derived from fix_raw_input by Andre Roberge + +from lib2to3 import fixer_base +from lib2to3.fixer_util import Name + + +class FixEcho(fixer_base.BaseFix): + + BM_compatible = True + PATTERN = """ + power< name='echo' trailer< '(' [any] ')' > any* > + """ + + def transform(self, node, results): + name = results['name'] + name.replace(Name('print', prefix=name.prefix)) diff --git a/Lib/packaging/tests/fixer/fix_echo2.py b/Lib/packaging/tests/fixer/fix_echo2.py new file mode 100644 --- /dev/null +++ b/Lib/packaging/tests/fixer/fix_echo2.py @@ -0,0 +1,16 @@ +# Example custom fixer, derived from fix_raw_input by Andre Roberge + +from lib2to3 import fixer_base +from lib2to3.fixer_util import Name + + +class FixEcho2(fixer_base.BaseFix): + + BM_compatible = True + PATTERN = """ + power< name='echo2' trailer< '(' [any] ')' > any* > + """ + + def transform(self, node, results): + name = results['name'] + name.replace(Name('print', prefix=name.prefix)) diff --git a/Lib/packaging/tests/fixer/fix_idioms.py b/Lib/packaging/tests/fixer/fix_idioms.py deleted file mode 100644 --- a/Lib/packaging/tests/fixer/fix_idioms.py +++ /dev/null @@ -1,134 +0,0 @@ -"""Adjust some old Python 2 idioms to their modern counterparts. - -* Change some type comparisons to isinstance() calls: - type(x) == T -> isinstance(x, T) - type(x) is T -> isinstance(x, T) - type(x) != T -> not isinstance(x, T) - type(x) is not T -> not isinstance(x, T) - -* Change "while 1:" into "while True:". - -* Change both - - v = list(EXPR) - v.sort() - foo(v) - -and the more general - - v = EXPR - v.sort() - foo(v) - -into - - v = sorted(EXPR) - foo(v) -""" -# Author: Jacques Frechet, Collin Winter - -# Local imports -from lib2to3 import fixer_base -from lib2to3.fixer_util import Call, Comma, Name, Node, syms - -CMP = "(n='!=' | '==' | 'is' | n=comp_op< 'is' 'not' >)" -TYPE = "power< 'type' trailer< '(' x=any ')' > >" - -class FixIdioms(fixer_base.BaseFix): - - explicit = False # The user must ask for this fixer - - PATTERN = r""" - isinstance=comparison< %s %s T=any > - | - isinstance=comparison< T=any %s %s > - | - while_stmt< 'while' while='1' ':' any+ > - | - sorted=any< - any* - simple_stmt< - expr_stmt< id1=any '=' - power< list='list' trailer< '(' (not arglist) any ')' > > - > - '\n' - > - sort= - simple_stmt< - power< id2=any - trailer< '.' 'sort' > trailer< '(' ')' > - > - '\n' - > - next=any* - > - | - sorted=any< - any* - simple_stmt< expr_stmt< id1=any '=' expr=any > '\n' > - sort= - simple_stmt< - power< id2=any - trailer< '.' 'sort' > trailer< '(' ')' > - > - '\n' - > - next=any* - > - """ % (TYPE, CMP, CMP, TYPE) - - def match(self, node): - r = super(FixIdioms, self).match(node) - # If we've matched one of the sort/sorted subpatterns above, we - # want to reject matches where the initial assignment and the - # subsequent .sort() call involve different identifiers. - if r and "sorted" in r: - if r["id1"] == r["id2"]: - return r - return None - return r - - def transform(self, node, results): - if "isinstance" in results: - return self.transform_isinstance(node, results) - elif "while" in results: - return self.transform_while(node, results) - elif "sorted" in results: - return self.transform_sort(node, results) - else: - raise RuntimeError("Invalid match") - - def transform_isinstance(self, node, results): - x = results["x"].clone() # The thing inside of type() - T = results["T"].clone() # The type being compared against - x.prefix = "" - T.prefix = " " - test = Call(Name("isinstance"), [x, Comma(), T]) - if "n" in results: - test.prefix = " " - test = Node(syms.not_test, [Name("not"), test]) - test.prefix = node.prefix - return test - - def transform_while(self, node, results): - one = results["while"] - one.replace(Name("True", prefix=one.prefix)) - - def transform_sort(self, node, results): - sort_stmt = results["sort"] - next_stmt = results["next"] - list_call = results.get("list") - simple_expr = results.get("expr") - - if list_call: - list_call.replace(Name("sorted", prefix=list_call.prefix)) - elif simple_expr: - new = simple_expr.clone() - new.prefix = "" - simple_expr.replace(Call(Name("sorted"), [new], - prefix=simple_expr.prefix)) - else: - raise RuntimeError("should not have reached here") - sort_stmt.remove() - if next_stmt: - next_stmt[0].prefix = sort_stmt._prefix diff --git a/Lib/packaging/tests/test_mixin2to3.py b/Lib/packaging/tests/test_mixin2to3.py --- a/Lib/packaging/tests/test_mixin2to3.py +++ b/Lib/packaging/tests/test_mixin2to3.py @@ -8,70 +8,76 @@ support.LoggingCatcher, unittest.TestCase): - @support.skip_2to3_optimize - def test_convert_code_only(self): - # used to check if code gets converted properly. - code = "print 'test'" + def setUp(self): + super(Mixin2to3TestCase, self).setUp() + self.filename = self.mktempfile().name - with self.mktempfile() as fp: - fp.write(code) + def check(self, source, wanted, **kwargs): + source = textwrap.dedent(source) + with open(self.filename, 'w') as fp: + fp.write(source) - mixin2to3 = Mixin2to3() - mixin2to3._run_2to3([fp.name]) - expected = "print('test')" + Mixin2to3()._run_2to3(**kwargs) - with open(fp.name) as fp: + wanted = textwrap.dedent(wanted) + with open(self.filename) as fp: converted = fp.read() + self.assertMultiLineEqual(converted, wanted) - self.assertEqual(expected, converted) - - def test_doctests_only(self): - # used to check if doctests gets converted properly. - doctest = textwrap.dedent('''\ + def test_conversion(self): + # check that code and doctests get converted + self.check('''\ """Example docstring. >>> print test test It works. - """''') - - with self.mktempfile() as fp: - fp.write(doctest) - - mixin2to3 = Mixin2to3() - mixin2to3._run_2to3([fp.name]) - expected = textwrap.dedent('''\ + """ + print 'test' + ''', + '''\ """Example docstring. >>> print(test) test It works. - """\n''') + """ + print('test') - with open(fp.name) as fp: - converted = fp.read() + ''', # 2to3 adds a newline here + files=[self.filename]) - self.assertEqual(expected, converted) + def test_doctests_conversion(self): + # check that doctest files are converted + self.check('''\ + Welcome to the doc. + + >>> print test + test + ''', + '''\ + Welcome to the doc. + + >>> print(test) + test + + ''', + doctests=[self.filename]) def test_additional_fixers(self): - # used to check if use_2to3_fixers works - code = 'type(x) is not T' - - with self.mktempfile() as fp: - fp.write(code) - - mixin2to3 = Mixin2to3() - mixin2to3._run_2to3(files=[fp.name], doctests=[fp.name], - fixers=['packaging.tests.fixer']) - - expected = 'not isinstance(x, T)' - - with open(fp.name) as fp: - converted = fp.read() - - self.assertEqual(expected, converted) + # make sure the fixers argument works + self.check("""\ + echo('42') + echo2('oh no') + """, + """\ + print('42') + print('oh no') + """, + files=[self.filename], + fixers=['packaging.tests.fixer']) def test_suite(): diff --git a/Lib/packaging/util.py b/Lib/packaging/util.py --- a/Lib/packaging/util.py +++ b/Lib/packaging/util.py @@ -853,13 +853,11 @@ # Make this class local, to delay import of 2to3 from lib2to3.refactor import get_fixers_from_package, RefactoringTool - fixers = [] fixers = get_fixers_from_package('lib2to3.fixes') if fixer_names: for fixername in fixer_names: - fixers.extend(fixer for fixer in - get_fixers_from_package(fixername)) + fixers.extend(get_fixers_from_package(fixername)) r = RefactoringTool(fixers, options=options) r.refactor(files, write=True, doctests_only=doctests_only) @@ -870,21 +868,23 @@ the class variables, or inherit from this class to override how 2to3 is invoked. """ - # provide list of fixers to run. - # defaults to all from lib2to3.fixers + # list of fixers to run; defaults to all implicit from lib2to3.fixers fixer_names = None - - # options dictionary + # dict of options options = None - - # list of fixers to invoke even though they are marked as explicit + # list of extra fixers to invoke explicit = None + # TODO need a better way to add just one fixer from a package + # TODO need a way to exclude individual fixers def run_2to3(self, files, doctests_only=False): """ Issues a call to util.run_2to3. """ return run_2to3(files, doctests_only, self.fixer_names, self.options, self.explicit) + # TODO provide initialize/finalize_options + + RICH_GLOB = re.compile(r'\{([^}]*)\}') _CHECK_RECURSIVE_GLOB = re.compile(r'[^/\\,{]\*\*|\*\*[^/\\,}]') _CHECK_MISMATCH_SET = re.compile(r'^[^{]*\}|\{[^}]*$') -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Fri Feb 10 05:13:09 2012 From: python-checkins at python.org (eric.araujo) Date: Fri, 10 Feb 2012 05:13:09 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_default_-=3E_default?= =?utf8?q?=29=3A_Branch_merge?= Message-ID: http://hg.python.org/cpython/rev/d1f5eb429b25 changeset: 74856:d1f5eb429b25 parent: 74850:0fc10a33eb4c parent: 74855:7243c3f18769 user: ?ric Araujo date: Fri Feb 10 05:12:58 2012 +0100 summary: Branch merge files: Lib/packaging/command/__init__.py | 48 +-- Lib/packaging/compat.py | 19 +- Lib/packaging/run.py | 9 +- Lib/packaging/tests/fixer/fix_echo.py | 16 + Lib/packaging/tests/fixer/fix_echo2.py | 16 + Lib/packaging/tests/fixer/fix_idioms.py | 134 ------------ Lib/packaging/tests/support.py | 41 +- Lib/packaging/tests/test_markers.py | 10 +- Lib/packaging/tests/test_mixin2to3.py | 92 ++++--- Lib/packaging/tests/test_run.py | 17 + Lib/packaging/util.py | 20 +- 11 files changed, 168 insertions(+), 254 deletions(-) diff --git a/Lib/packaging/command/__init__.py b/Lib/packaging/command/__init__.py --- a/Lib/packaging/command/__init__.py +++ b/Lib/packaging/command/__init__.py @@ -6,38 +6,28 @@ __all__ = ['get_command_names', 'set_command', 'get_command_class', 'STANDARD_COMMANDS'] -_COMMANDS = { - 'check': 'packaging.command.check.check', - 'test': 'packaging.command.test.test', - 'build': 'packaging.command.build.build', - 'build_py': 'packaging.command.build_py.build_py', - 'build_ext': 'packaging.command.build_ext.build_ext', - 'build_clib': 'packaging.command.build_clib.build_clib', - 'build_scripts': 'packaging.command.build_scripts.build_scripts', - 'clean': 'packaging.command.clean.clean', - 'install_dist': 'packaging.command.install_dist.install_dist', - 'install_lib': 'packaging.command.install_lib.install_lib', - 'install_headers': 'packaging.command.install_headers.install_headers', - 'install_scripts': 'packaging.command.install_scripts.install_scripts', - 'install_data': 'packaging.command.install_data.install_data', - 'install_distinfo': - 'packaging.command.install_distinfo.install_distinfo', - 'sdist': 'packaging.command.sdist.sdist', - 'bdist': 'packaging.command.bdist.bdist', - 'bdist_dumb': 'packaging.command.bdist_dumb.bdist_dumb', - 'bdist_wininst': 'packaging.command.bdist_wininst.bdist_wininst', - 'register': 'packaging.command.register.register', - 'upload': 'packaging.command.upload.upload', - 'upload_docs': 'packaging.command.upload_docs.upload_docs', -} -# XXX this is crappy +STANDARD_COMMANDS = [ + # packaging + 'check', 'test', + # building + 'build', 'build_py', 'build_ext', 'build_clib', 'build_scripts', 'clean', + # installing + 'install_dist', 'install_lib', 'install_headers', 'install_scripts', + 'install_data', 'install_distinfo', + # distributing + 'sdist', 'bdist', 'bdist_dumb', 'bdist_wininst', + 'register', 'upload', 'upload_docs', + ] + if os.name == 'nt': - _COMMANDS['bdist_msi'] = 'packaging.command.bdist_msi.bdist_msi' + STANDARD_COMMANDS.insert(STANDARD_COMMANDS.index('bdist_wininst'), + 'bdist_msi') -# XXX use OrderedDict to preserve the grouping (build-related, install-related, -# distribution-related) -STANDARD_COMMANDS = set(_COMMANDS) +# XXX maybe we need more than one registry, so that --list-comands can display +# standard, custom and overriden standard commands differently +_COMMANDS = dict((name, 'packaging.command.%s.%s' % (name, name)) + for name in STANDARD_COMMANDS) def get_command_names(): diff --git a/Lib/packaging/compat.py b/Lib/packaging/compat.py --- a/Lib/packaging/compat.py +++ b/Lib/packaging/compat.py @@ -1,4 +1,4 @@ -"""Compatibility helpers.""" +"""Support for build-time 2to3 conversion.""" from packaging import logger @@ -25,7 +25,7 @@ """ if _CONVERT: - def _run_2to3(self, files, doctests=[], fixers=[]): + def _run_2to3(self, files=[], doctests=[], fixers=[]): """ Takes a list of files and doctests, and performs conversion on those. - First, the files which contain the code(`files`) are converted. @@ -35,17 +35,16 @@ if fixers: self.fixer_names = fixers - logger.info('converting Python code') - _KLASS.run_2to3(self, files) + if files: + logger.info('converting Python code and doctests') + _KLASS.run_2to3(self, files) + _KLASS.run_2to3(self, files, doctests_only=True) - logger.info('converting doctests in Python files') - _KLASS.run_2to3(self, files, doctests_only=True) - - if doctests != []: - logger.info('converting doctest in text files') + if doctests: + logger.info('converting doctests in text files') _KLASS.run_2to3(self, doctests, doctests_only=True) else: # If run on Python 2.x, there is nothing to do. - def _run_2to3(self, files, doctests=[], fixers=[]): + def _run_2to3(self, files=[], doctests=[], fixers=[]): pass diff --git a/Lib/packaging/run.py b/Lib/packaging/run.py --- a/Lib/packaging/run.py +++ b/Lib/packaging/run.py @@ -254,16 +254,13 @@ parser = dispatcher.parser args = args[1:] - commands = STANDARD_COMMANDS # + extra commands + commands = STANDARD_COMMANDS # FIXME display extra commands if args == ['--list-commands']: print('List of available commands:') - cmds = sorted(commands) - - for cmd in cmds: + for cmd in commands: cls = dispatcher.cmdclass.get(cmd) or get_command_class(cmd) - desc = getattr(cls, 'description', - '(no description available)') + desc = getattr(cls, 'description', '(no description available)') print(' %s: %s' % (cmd, desc)) return diff --git a/Lib/packaging/tests/fixer/fix_echo.py b/Lib/packaging/tests/fixer/fix_echo.py new file mode 100644 --- /dev/null +++ b/Lib/packaging/tests/fixer/fix_echo.py @@ -0,0 +1,16 @@ +# Example custom fixer, derived from fix_raw_input by Andre Roberge + +from lib2to3 import fixer_base +from lib2to3.fixer_util import Name + + +class FixEcho(fixer_base.BaseFix): + + BM_compatible = True + PATTERN = """ + power< name='echo' trailer< '(' [any] ')' > any* > + """ + + def transform(self, node, results): + name = results['name'] + name.replace(Name('print', prefix=name.prefix)) diff --git a/Lib/packaging/tests/fixer/fix_echo2.py b/Lib/packaging/tests/fixer/fix_echo2.py new file mode 100644 --- /dev/null +++ b/Lib/packaging/tests/fixer/fix_echo2.py @@ -0,0 +1,16 @@ +# Example custom fixer, derived from fix_raw_input by Andre Roberge + +from lib2to3 import fixer_base +from lib2to3.fixer_util import Name + + +class FixEcho2(fixer_base.BaseFix): + + BM_compatible = True + PATTERN = """ + power< name='echo2' trailer< '(' [any] ')' > any* > + """ + + def transform(self, node, results): + name = results['name'] + name.replace(Name('print', prefix=name.prefix)) diff --git a/Lib/packaging/tests/fixer/fix_idioms.py b/Lib/packaging/tests/fixer/fix_idioms.py deleted file mode 100644 --- a/Lib/packaging/tests/fixer/fix_idioms.py +++ /dev/null @@ -1,134 +0,0 @@ -"""Adjust some old Python 2 idioms to their modern counterparts. - -* Change some type comparisons to isinstance() calls: - type(x) == T -> isinstance(x, T) - type(x) is T -> isinstance(x, T) - type(x) != T -> not isinstance(x, T) - type(x) is not T -> not isinstance(x, T) - -* Change "while 1:" into "while True:". - -* Change both - - v = list(EXPR) - v.sort() - foo(v) - -and the more general - - v = EXPR - v.sort() - foo(v) - -into - - v = sorted(EXPR) - foo(v) -""" -# Author: Jacques Frechet, Collin Winter - -# Local imports -from lib2to3 import fixer_base -from lib2to3.fixer_util import Call, Comma, Name, Node, syms - -CMP = "(n='!=' | '==' | 'is' | n=comp_op< 'is' 'not' >)" -TYPE = "power< 'type' trailer< '(' x=any ')' > >" - -class FixIdioms(fixer_base.BaseFix): - - explicit = False # The user must ask for this fixer - - PATTERN = r""" - isinstance=comparison< %s %s T=any > - | - isinstance=comparison< T=any %s %s > - | - while_stmt< 'while' while='1' ':' any+ > - | - sorted=any< - any* - simple_stmt< - expr_stmt< id1=any '=' - power< list='list' trailer< '(' (not arglist) any ')' > > - > - '\n' - > - sort= - simple_stmt< - power< id2=any - trailer< '.' 'sort' > trailer< '(' ')' > - > - '\n' - > - next=any* - > - | - sorted=any< - any* - simple_stmt< expr_stmt< id1=any '=' expr=any > '\n' > - sort= - simple_stmt< - power< id2=any - trailer< '.' 'sort' > trailer< '(' ')' > - > - '\n' - > - next=any* - > - """ % (TYPE, CMP, CMP, TYPE) - - def match(self, node): - r = super(FixIdioms, self).match(node) - # If we've matched one of the sort/sorted subpatterns above, we - # want to reject matches where the initial assignment and the - # subsequent .sort() call involve different identifiers. - if r and "sorted" in r: - if r["id1"] == r["id2"]: - return r - return None - return r - - def transform(self, node, results): - if "isinstance" in results: - return self.transform_isinstance(node, results) - elif "while" in results: - return self.transform_while(node, results) - elif "sorted" in results: - return self.transform_sort(node, results) - else: - raise RuntimeError("Invalid match") - - def transform_isinstance(self, node, results): - x = results["x"].clone() # The thing inside of type() - T = results["T"].clone() # The type being compared against - x.prefix = "" - T.prefix = " " - test = Call(Name("isinstance"), [x, Comma(), T]) - if "n" in results: - test.prefix = " " - test = Node(syms.not_test, [Name("not"), test]) - test.prefix = node.prefix - return test - - def transform_while(self, node, results): - one = results["while"] - one.replace(Name("True", prefix=one.prefix)) - - def transform_sort(self, node, results): - sort_stmt = results["sort"] - next_stmt = results["next"] - list_call = results.get("list") - simple_expr = results.get("expr") - - if list_call: - list_call.replace(Name("sorted", prefix=list_call.prefix)) - elif simple_expr: - new = simple_expr.clone() - new.prefix = "" - simple_expr.replace(Call(Name("sorted"), [new], - prefix=simple_expr.prefix)) - else: - raise RuntimeError("should not have reached here") - sort_stmt.remove() - if next_stmt: - next_stmt[0].prefix = sort_stmt._prefix diff --git a/Lib/packaging/tests/support.py b/Lib/packaging/tests/support.py --- a/Lib/packaging/tests/support.py +++ b/Lib/packaging/tests/support.py @@ -56,8 +56,9 @@ # misc. functions and decorators 'fake_dec', 'create_distribution', 'use_command', 'copy_xxmodule_c', 'fixup_build_ext', + 'skip_2to3_optimize', # imported from this module for backport purposes - 'unittest', 'requires_zlib', 'skip_2to3_optimize', 'skip_unless_symlink', + 'unittest', 'requires_zlib', 'skip_unless_symlink', ] @@ -332,22 +333,18 @@ """ filename = _get_xxmodule_path() if filename is None: - raise unittest.SkipTest('cannot find xxmodule.c (test must run in ' - 'the python build dir)') + raise unittest.SkipTest('cannot find xxmodule.c') shutil.copy(filename, directory) def _get_xxmodule_path(): - srcdir = sysconfig.get_config_var('srcdir') - candidates = [ - # use installed copy if available - os.path.join(os.path.dirname(__file__), 'xxmodule.c'), - # otherwise try using copy from build directory - os.path.join(srcdir, 'Modules', 'xxmodule.c'), - ] - for path in candidates: - if os.path.exists(path): - return path + if sysconfig.is_python_build(): + srcdir = sysconfig.get_config_var('projectbase') + path = os.path.join(os.getcwd(), srcdir, 'Modules', 'xxmodule.c') + else: + os.path.join(os.path.dirname(__file__), 'xxmodule.c') + if os.path.exists(path): + return path def fixup_build_ext(cmd): @@ -355,20 +352,21 @@ When Python was built with --enable-shared on Unix, -L. is not enough to find libpython.so, because regrtest runs in a tempdir, not in the - source directory where the .so lives. + source directory where the .so lives. (Mac OS X embeds absolute paths + to shared libraries into executables, so the fixup is a no-op on that + platform.) When Python was built with in debug mode on Windows, build_ext commands need their debug attribute set, and it is not done automatically for some reason. - This function handles both of these things. Example use: + This function handles both of these things, and also fixes + cmd.distribution.include_dirs if the running Python is an uninstalled + build. Example use: cmd = build_ext(dist) support.fixup_build_ext(cmd) cmd.ensure_finalized() - - Unlike most other Unix platforms, Mac OS X embeds absolute paths - to shared libraries into executables, so the fixup is not needed there. """ if os.name == 'nt': cmd.debug = sys.executable.endswith('_d.exe') @@ -386,12 +384,17 @@ name, equals, value = runshared.partition('=') cmd.library_dirs = value.split(os.pathsep) + # Allow tests to run with an uninstalled Python + if sysconfig.is_python_build(): + pysrcdir = sysconfig.get_config_var('projectbase') + cmd.distribution.include_dirs.append(os.path.join(pysrcdir, 'Include')) + + try: from test.support import skip_unless_symlink except ImportError: skip_unless_symlink = unittest.skip( 'requires test.support.skip_unless_symlink') - skip_2to3_optimize = unittest.skipIf(sys.flags.optimize, "2to3 doesn't work under -O") diff --git a/Lib/packaging/tests/test_markers.py b/Lib/packaging/tests/test_markers.py --- a/Lib/packaging/tests/test_markers.py +++ b/Lib/packaging/tests/test_markers.py @@ -21,8 +21,6 @@ self.assertTrue(interpret("sys.platform == '%s'" % sys_platform)) self.assertTrue(interpret( - "sys.platform == '%s' or python_version == '2.4'" % sys_platform)) - self.assertTrue(interpret( "sys.platform == '%s' and python_full_version == '%s'" % (sys_platform, version))) self.assertTrue(interpret("'%s' == sys.platform" % sys_platform)) @@ -41,12 +39,18 @@ # combined operations OP = 'os.name == "%s"' % os_name + FALSEOP = 'os.name == "buuuu"' AND = ' and ' OR = ' or ' self.assertTrue(interpret(OP + AND + OP)) self.assertTrue(interpret(OP + AND + OP + AND + OP)) self.assertTrue(interpret(OP + OR + OP)) - self.assertTrue(interpret(OP + OR + OP + OR + OP)) + self.assertTrue(interpret(OP + OR + FALSEOP)) + self.assertTrue(interpret(OP + OR + OP + OR + FALSEOP)) + self.assertTrue(interpret(OP + OR + FALSEOP + OR + FALSEOP)) + self.assertTrue(interpret(FALSEOP + OR + OP)) + self.assertFalse(interpret(FALSEOP + AND + FALSEOP)) + self.assertFalse(interpret(FALSEOP + OR + FALSEOP)) # other operators self.assertTrue(interpret("os.name != 'buuuu'")) diff --git a/Lib/packaging/tests/test_mixin2to3.py b/Lib/packaging/tests/test_mixin2to3.py --- a/Lib/packaging/tests/test_mixin2to3.py +++ b/Lib/packaging/tests/test_mixin2to3.py @@ -8,70 +8,76 @@ support.LoggingCatcher, unittest.TestCase): - @support.skip_2to3_optimize - def test_convert_code_only(self): - # used to check if code gets converted properly. - code = "print 'test'" + def setUp(self): + super(Mixin2to3TestCase, self).setUp() + self.filename = self.mktempfile().name - with self.mktempfile() as fp: - fp.write(code) + def check(self, source, wanted, **kwargs): + source = textwrap.dedent(source) + with open(self.filename, 'w') as fp: + fp.write(source) - mixin2to3 = Mixin2to3() - mixin2to3._run_2to3([fp.name]) - expected = "print('test')" + Mixin2to3()._run_2to3(**kwargs) - with open(fp.name) as fp: + wanted = textwrap.dedent(wanted) + with open(self.filename) as fp: converted = fp.read() + self.assertMultiLineEqual(converted, wanted) - self.assertEqual(expected, converted) - - def test_doctests_only(self): - # used to check if doctests gets converted properly. - doctest = textwrap.dedent('''\ + def test_conversion(self): + # check that code and doctests get converted + self.check('''\ """Example docstring. >>> print test test It works. - """''') - - with self.mktempfile() as fp: - fp.write(doctest) - - mixin2to3 = Mixin2to3() - mixin2to3._run_2to3([fp.name]) - expected = textwrap.dedent('''\ + """ + print 'test' + ''', + '''\ """Example docstring. >>> print(test) test It works. - """\n''') + """ + print('test') - with open(fp.name) as fp: - converted = fp.read() + ''', # 2to3 adds a newline here + files=[self.filename]) - self.assertEqual(expected, converted) + def test_doctests_conversion(self): + # check that doctest files are converted + self.check('''\ + Welcome to the doc. + + >>> print test + test + ''', + '''\ + Welcome to the doc. + + >>> print(test) + test + + ''', + doctests=[self.filename]) def test_additional_fixers(self): - # used to check if use_2to3_fixers works - code = 'type(x) is not T' - - with self.mktempfile() as fp: - fp.write(code) - - mixin2to3 = Mixin2to3() - mixin2to3._run_2to3(files=[fp.name], doctests=[fp.name], - fixers=['packaging.tests.fixer']) - - expected = 'not isinstance(x, T)' - - with open(fp.name) as fp: - converted = fp.read() - - self.assertEqual(expected, converted) + # make sure the fixers argument works + self.check("""\ + echo('42') + echo2('oh no') + """, + """\ + print('42') + print('oh no') + """, + files=[self.filename], + fixers=['packaging.tests.fixer']) def test_suite(): diff --git a/Lib/packaging/tests/test_run.py b/Lib/packaging/tests/test_run.py --- a/Lib/packaging/tests/test_run.py +++ b/Lib/packaging/tests/test_run.py @@ -67,6 +67,23 @@ self.assertGreater(out, b'') self.assertEqual(err, b'') + def test_list_commands(self): + status, out, err = assert_python_ok('-m', 'packaging.run', 'run', + '--list-commands') + # check that something is displayed + self.assertEqual(status, 0) + self.assertGreater(out, b'') + self.assertEqual(err, b'') + + # make sure the manual grouping of commands is respected + check_position = out.find(b' check: ') + build_position = out.find(b' build: ') + self.assertTrue(check_position, out) # "out" printed as debugging aid + self.assertTrue(build_position, out) + self.assertLess(check_position, build_position, out) + + # TODO test that custom commands don't break --list-commands + def test_suite(): return unittest.makeSuite(RunTestCase) diff --git a/Lib/packaging/util.py b/Lib/packaging/util.py --- a/Lib/packaging/util.py +++ b/Lib/packaging/util.py @@ -853,13 +853,11 @@ # Make this class local, to delay import of 2to3 from lib2to3.refactor import get_fixers_from_package, RefactoringTool - fixers = [] fixers = get_fixers_from_package('lib2to3.fixes') if fixer_names: for fixername in fixer_names: - fixers.extend(fixer for fixer in - get_fixers_from_package(fixername)) + fixers.extend(get_fixers_from_package(fixername)) r = RefactoringTool(fixers, options=options) r.refactor(files, write=True, doctests_only=doctests_only) @@ -870,21 +868,23 @@ the class variables, or inherit from this class to override how 2to3 is invoked. """ - # provide list of fixers to run. - # defaults to all from lib2to3.fixers + # list of fixers to run; defaults to all implicit from lib2to3.fixers fixer_names = None - - # options dictionary + # dict of options options = None - - # list of fixers to invoke even though they are marked as explicit + # list of extra fixers to invoke explicit = None + # TODO need a better way to add just one fixer from a package + # TODO need a way to exclude individual fixers def run_2to3(self, files, doctests_only=False): """ Issues a call to util.run_2to3. """ return run_2to3(files, doctests_only, self.fixer_names, self.options, self.explicit) + # TODO provide initialize/finalize_options + + RICH_GLOB = re.compile(r'\{([^}]*)\}') _CHECK_RECURSIVE_GLOB = re.compile(r'[^/\\,{]\*\*|\*\*[^/\\,}]') _CHECK_MISMATCH_SET = re.compile(r'^[^{]*\}|\{[^}]*$') @@ -1049,7 +1049,6 @@ SETUP_TEMPLATE = """\ # This script was automatically generated by packaging -import os import codecs from distutils.core import setup try: @@ -1057,6 +1056,7 @@ except ImportError: from configparser import RawConfigParser + %(split_multiline)s %(cfg_to_args)s -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Fri Feb 10 05:21:00 2012 From: python-checkins at python.org (eric.araujo) Date: Fri, 10 Feb 2012 05:21:00 +0100 Subject: [Python-checkins] =?utf8?q?cpython=3A_Use_sys=2Eversion=5Finfo_in?= =?utf8?q?stead_of_sys=2Eversion_in_packaging=2E?= Message-ID: http://hg.python.org/cpython/rev/6fdcfe348435 changeset: 74857:6fdcfe348435 user: ?ric Araujo date: Fri Feb 10 05:20:53 2012 +0100 summary: Use sys.version_info instead of sys.version in packaging. The contents of this attribute are an implementation detail, as documented for #9442, so we should not parse it, to support non-CPython VMs with distutils2 in the future. Unfortunately, one use comes directly from PEP 345, so an edit will have to be agreed before fixing the code (see comment in p7g.markers). Other remaining uses are found in p7g.compiler and could be replaced by the platform module (which also parses sys.version, but then it wouldn?t be my fault :) files: Lib/packaging/command/bdist_msi.py | 5 +-- Lib/packaging/command/bdist_wininst.py | 2 +- Lib/packaging/command/build.py | 6 ++-- Lib/packaging/command/install_dist.py | 2 +- Lib/packaging/compiler/cygwinccompiler.py | 4 +++ Lib/packaging/markers.py | 12 ++++++---- Lib/packaging/pypi/simple.py | 4 +- Lib/packaging/tests/test_command_build.py | 5 ++- 8 files changed, 23 insertions(+), 17 deletions(-) diff --git a/Lib/packaging/command/bdist_msi.py b/Lib/packaging/command/bdist_msi.py --- a/Lib/packaging/command/bdist_msi.py +++ b/Lib/packaging/command/bdist_msi.py @@ -7,9 +7,8 @@ import os import msilib - +from shutil import rmtree from sysconfig import get_python_version -from shutil import rmtree from packaging.command.cmd import Command from packaging.version import NormalizedVersion from packaging.errors import PackagingOptionError @@ -204,7 +203,7 @@ target_version = self.target_version if not target_version: assert self.skip_build, "Should have already checked this" - target_version = sys.version[0:3] + target_version = '%s.%s' % sys.version_info[:2] plat_specifier = ".%s-%s" % (self.plat_name, target_version) build = self.get_finalized_command('build') build.build_lib = os.path.join(build.build_base, diff --git a/Lib/packaging/command/bdist_wininst.py b/Lib/packaging/command/bdist_wininst.py --- a/Lib/packaging/command/bdist_wininst.py +++ b/Lib/packaging/command/bdist_wininst.py @@ -136,7 +136,7 @@ target_version = self.target_version if not target_version: assert self.skip_build, "Should have already checked this" - target_version = sys.version[0:3] + target_version = '%s.%s' % sys.version_info[:2] plat_specifier = ".%s-%s" % (self.plat_name, target_version) build = self.get_finalized_command('build') build.build_lib = os.path.join(build.build_base, diff --git a/Lib/packaging/command/build.py b/Lib/packaging/command/build.py --- a/Lib/packaging/command/build.py +++ b/Lib/packaging/command/build.py @@ -82,8 +82,8 @@ raise PackagingOptionError( "--plat-name only supported on Windows (try " "using './configure --help' on your platform)") - - plat_specifier = ".%s-%s" % (self.plat_name, sys.version[0:3]) + pyversion = '%s.%s' % sys.version_info[:2] + plat_specifier = ".%s-%s" % (self.plat_name, pyversion) # Make it so Python 2.x and Python 2.x with --with-pydebug don't # share the same build directories. Doing so confuses the build @@ -116,7 +116,7 @@ 'temp' + plat_specifier) if self.build_scripts is None: self.build_scripts = os.path.join(self.build_base, - 'scripts-' + sys.version[0:3]) + 'scripts-' + pyversion) if self.executable is None: self.executable = os.path.normpath(sys.executable) diff --git a/Lib/packaging/command/install_dist.py b/Lib/packaging/command/install_dist.py --- a/Lib/packaging/command/install_dist.py +++ b/Lib/packaging/command/install_dist.py @@ -242,7 +242,7 @@ # $platbase in the other installation directories and not worry # about needing recursive variable expansion (shudder). - py_version = sys.version.split()[0] + py_version = '%s.%s' % sys.version_info[:2] prefix, exec_prefix, srcdir, projectbase = get_config_vars( 'prefix', 'exec_prefix', 'srcdir', 'projectbase') diff --git a/Lib/packaging/compiler/cygwinccompiler.py b/Lib/packaging/compiler/cygwinccompiler.py --- a/Lib/packaging/compiler/cygwinccompiler.py +++ b/Lib/packaging/compiler/cygwinccompiler.py @@ -56,6 +56,10 @@ from packaging.util import get_compiler_versions import sysconfig +# TODO use platform instead of sys.version +# (platform does unholy sys.version parsing too, but at least it gives other +# VMs a chance to override the returned values) + def get_msvcr(): """Include the appropriate MSVC runtime library if Python was built diff --git a/Lib/packaging/markers.py b/Lib/packaging/markers.py --- a/Lib/packaging/markers.py +++ b/Lib/packaging/markers.py @@ -1,11 +1,10 @@ """Parser for the environment markers micro-language defined in PEP 345.""" +import os import sys import platform -import os - +from io import BytesIO from tokenize import tokenize, NAME, OP, STRING, ENDMARKER, ENCODING -from io import BytesIO __all__ = ['interpret'] @@ -27,12 +26,15 @@ # restricted set of variables _VARS = {'sys.platform': sys.platform, - 'python_version': sys.version[:3], + 'python_version': '%s.%s' % sys.version_info[:2], + # FIXME parsing sys.platform is not reliable, but there is no other + # way to get e.g. 2.7.2+, and the PEP is defined with sys.version 'python_full_version': sys.version.split(' ', 1)[0], 'os.name': os.name, 'platform.version': platform.version(), 'platform.machine': platform.machine(), - 'platform.python_implementation': platform.python_implementation()} + 'platform.python_implementation': platform.python_implementation(), + } class _Operation: diff --git a/Lib/packaging/pypi/simple.py b/Lib/packaging/pypi/simple.py --- a/Lib/packaging/pypi/simple.py +++ b/Lib/packaging/pypi/simple.py @@ -35,8 +35,8 @@ DEFAULT_SIMPLE_INDEX_URL = "http://a.pypi.python.org/simple/" DEFAULT_HOSTS = ("*",) SOCKET_TIMEOUT = 15 -USER_AGENT = "Python-urllib/%s packaging/%s" % ( - sys.version[:3], packaging_version) +USER_AGENT = "Python-urllib/%s.%s packaging/%s" % ( + sys.version_info[0], sys.version_info[1], packaging_version) # -- Regexps ------------------------------------------------- EGG_FRAGMENT = re.compile(r'^egg=([-A-Za-z0-9_.]+)$') diff --git a/Lib/packaging/tests/test_command_build.py b/Lib/packaging/tests/test_command_build.py --- a/Lib/packaging/tests/test_command_build.py +++ b/Lib/packaging/tests/test_command_build.py @@ -26,7 +26,8 @@ # build_platlib is 'build/lib.platform-x.x[-pydebug]' # examples: # build/lib.macosx-10.3-i386-2.7 - plat_spec = '.%s-%s' % (cmd.plat_name, sys.version[0:3]) + pyversion = '%s.%s' % sys.version_info[:2] + plat_spec = '.%s-%s' % (cmd.plat_name, pyversion) if hasattr(sys, 'gettotalrefcount'): self.assertTrue(cmd.build_platlib.endswith('-pydebug')) plat_spec += '-pydebug' @@ -41,7 +42,7 @@ self.assertEqual(cmd.build_temp, wanted) # build_scripts is build/scripts-x.x - wanted = os.path.join(cmd.build_base, 'scripts-' + sys.version[0:3]) + wanted = os.path.join(cmd.build_base, 'scripts-' + pyversion) self.assertEqual(cmd.build_scripts, wanted) # executable is os.path.normpath(sys.executable) -- Repository URL: http://hg.python.org/cpython From solipsis at pitrou.net Fri Feb 10 05:31:13 2012 From: solipsis at pitrou.net (solipsis at pitrou.net) Date: Fri, 10 Feb 2012 05:31:13 +0100 Subject: [Python-checkins] Daily reference leaks (0fc10a33eb4c): sum=888 Message-ID: results for 0fc10a33eb4c on branch "default" -------------------------------------------- test_capi leaked [296, 296, 296] references, sum=888 Command line was: ['./python', '-m', 'test.regrtest', '-uall', '-R', '3:3:/home/antoine/cpython/refleaks/reflog3aQ3o5', '-x'] From python-checkins at python.org Fri Feb 10 05:32:19 2012 From: python-checkins at python.org (eric.araujo) Date: Fri, 10 Feb 2012 05:32:19 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=282=2E7=29=3A_distutils_2=2E7?= =?utf8?q?=E2=80=99s_Extension_does_not_support_optional_=28=2313865=29=2E?= Message-ID: http://hg.python.org/cpython/rev/cf1c466ee9e0 changeset: 74858:cf1c466ee9e0 branch: 2.7 parent: 74847:0e050b38e92b user: ?ric Araujo date: Fri Feb 10 05:31:28 2012 +0100 summary: distutils 2.7?s Extension does not support optional (#13865). Reported by Miki Tebeka. files: Doc/distutils/apiref.rst | 5 ----- Doc/distutils/setupscript.rst | 4 ---- 2 files changed, 0 insertions(+), 9 deletions(-) diff --git a/Doc/distutils/apiref.rst b/Doc/distutils/apiref.rst --- a/Doc/distutils/apiref.rst +++ b/Doc/distutils/apiref.rst @@ -261,11 +261,6 @@ | | from the source extensions if | | | | not provided. | | +------------------------+--------------------------------+---------------------------+ - | *optional* | specifies that a build failure | a boolean | - | | in the extension should not | | - | | abort the build process, but | | - | | simply skip the extension. | | - +------------------------+--------------------------------+---------------------------+ .. class:: Distribution diff --git a/Doc/distutils/setupscript.rst b/Doc/distutils/setupscript.rst --- a/Doc/distutils/setupscript.rst +++ b/Doc/distutils/setupscript.rst @@ -334,10 +334,6 @@ There are still some other options which can be used to handle special cases. -The :option:`optional` option is a boolean; if it is true, -a build failure in the extension will not abort the build process, but -instead simply not install the failing extension. - The :option:`extra_objects` option is a list of object files to be passed to the linker. These files must not have extensions, as the default extension for the compiler is used. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Fri Feb 10 06:10:32 2012 From: python-checkins at python.org (eli.bendersky) Date: Fri, 10 Feb 2012 06:10:32 +0100 Subject: [Python-checkins] =?utf8?q?peps=3A_PEP_411_-_Provisional_packages?= =?utf8?q?_in_the_Python_standard_library=2E_Initial_draft?= Message-ID: http://hg.python.org/peps/rev/0ce078bc98d9 changeset: 4042:0ce078bc98d9 user: Eli Bendersky date: Fri Feb 10 07:10:16 2012 +0200 summary: PEP 411 - Provisional packages in the Python standard library. Initial draft files: pep-0411.txt | 185 +++++++++++++++++++++++++++++++++++++++ 1 files changed, 185 insertions(+), 0 deletions(-) diff --git a/pep-0411.txt b/pep-0411.txt new file mode 100644 --- /dev/null +++ b/pep-0411.txt @@ -0,0 +1,185 @@ +PEP: 411 +Title: Provisional packages in the Python standard library +Version: $Revision$ +Last-Modified: $Date$ +Author: Nick Coghlan , + Eli Bendersky +Status: Draft +Type: Informational +Content-Type: text/x-rst +Created: 2012-02-10 +Python-Version: 3.3 +Post-History: 2012-02-xx FIXME + + +Abstract +======== + +The process of including a new package into the Python standard library is +hindered by the API lock-in and promise of backward compatibility implied by +a package being formally part of Python. This PEP describes a methodology +for marking a standard library package "provisional" for the period of a single +minor release. A provisional package may have its API modified prior to +"graduating" into a "stable" state. On one hand, this state provides the +package with the benefits of being formally part of the Python distribution. +On the other hand, the core development team explicitly states that no promises +are made with regards to the the stability of the package's API, which may +change for the next release. While it is considered an unlikely outcome, +such packages may even be removed from the standard library without a +deprecation period if the concerns regarding their API or maintenante prove +well-founded. + + +Proposal - a documented provisional state +========================================= + +Whenever the Python core development team decides that a new package should be +included into the standard library, but isn't entirely sure about whether the +package's API is optimal, the package can be included and placed in a special +"provisional" state. + +In the next minor release, the package may either be "graduated" into a normal +"stable" state in the standard library, or be rejected and removed entirely +from the Python source tree. If the package ends up graduating into the +stable state after being provisional for a minor release, its API may be +changed according to accumulated feedback. The core development team +explicitly makes no guarantees about API stability and backward compatibility +of provisional packages. + +Marking a package provisional +----------------------------- + +A package will be marked provisional by including the following paragraph as +a note at the top of its documentation page: + + The package has been included in the standard library on a + provisional basis. While major changes are not anticipated, as long as + this notice remains in place, backwards incompatible changes are + permitted if deemed necessary by the standard library developers. Such + changes will not be made gratuitously - they will occur only if + serious API flaws are uncovered that were missed prior to inclusion of + the package. + +Which packages should go through the provisional state +------------------------------------------------------ + +We expect most packages proposed for addition into the Python standard library +to go through a minor release in the provisional state. There may, however, +be some exceptions, such as packages that use a pre-defined API (for example +``lzma``, which generally follows the API of the existing ``bz2`` package), +or packages with an API that has wide acceptance in the Python development +community. + +In any case, packages that are proposed to be added to the standard library, +whether via the provisional state or directly, must fulfill the acceptance +conditions set by PEP 2. + +Criteria for "graduation" +------------------------- + +In principle, most provisional packages should eventually graduate to the +stable standard library. Some reasons for not graduating are: + +* The package may prove to be unstable or fragile, without sufficient developer + support to maintain it. +* A much better alternative package may be found during the preview release + +Essentially, the decision will be made by the core developers on a per-case +basis. The point to emphasize here is that a packages's inclusion in the +standard library as "provisional" in some release does not guarantee it will +continue being part of Python in the next release. + + +Rationale +========= + +Benefits for the core development team +-------------------------------------- + +Currently, the core developers are really reluctant to add new interfaces to +the standard library. This is because as soon as they're published in a +release, API design mistakes get locked in due to backward compatibility +concerns. + +By gating all major API additions through some kind of a provisional mechanism +for a full release, we get one full release cycle of community feedback +before we lock in the APIs with our standard backward compatibility guarantee. + +We can also start integrating provisional packages with the rest of the standard +library early, so long as we make it clear to packagers that the provisional +packages should not be considered optional. The only difference between +provisional APIs and the rest of the standard library is that provisional APIs +are explicitly exempted from the usual backward compatibility guarantees. + +Benefits for end users +---------------------- + +For future end users, the broadest benefit lies in a better "out-of-the-box" +experience - rather than being told "oh, the standard library tools for task X +are horrible, download this 3rd party library instead", those superior tools +are more likely to be just be an import away. + +For environments where developers are required to conduct due diligence on +their upstream dependencies (severely harming the cost-effectiveness of, or +even ruling out entirely, much of the material on PyPI), the key benefit lies +in ensuring that all modules in the provisional state are clearly under +python-dev's aegis from at least the following perspectives: + +* Licensing: Redistributed by the PSF under a Contributor Licensing Agreement. +* Documentation: The documentation of the package is published and organized via + the standard Python documentation tools (i.e. ReST source, output generated + with Sphinx and published on http://docs.python.org). +* Testing: The package test suites are run on the python.org buildbot fleet + and results published via http://www.python.org/dev/buildbot. +* Issue management: Bugs and feature requests are handled on + http://bugs.python.org +* Source control: The master repository for the software is published + on http://hg.python.org. + + +Candidates for provisional inclusion into the standard library +============================================================== + +For Python 3.3, there are a number of clear current candidates: + +* ``regex`` (http://pypi.python.org/pypi/regex) - approved by Guido [#]_. +* ``daemon`` (PEP 3143) +* ``ipaddr`` (PEP 3144) + +Other possible future use cases include: + +* Improved HTTP modules (e.g. ``requests``) +* HTML 5 parsing support (e.g. ``html5lib``) +* Improved URL/URI/IRI parsing +* A standard image API (PEP 368) +* Encapsulation of the import state (PEP 368) +* Standard event loop API (PEP 3153) +* A binary version of WSGI for Python 3 (e.g. PEP 444) +* Generic function support (e.g. ``simplegeneric``) + + +Rejected alternatives and variations +==================================== + +See PEP 408. + + +References +========== + +.. [#] http://mail.python.org/pipermail/python-dev/2012-January/115962.html + +Copyright +========= + +This document has been placed in the public domain. + + +.. + Local Variables: + mode: indented-text + indent-tabs-mode: nil + sentence-end-double-space: t + fill-column: 70 + coding: utf-8 + End: -- Repository URL: http://hg.python.org/peps From python-checkins at python.org Fri Feb 10 06:15:01 2012 From: python-checkins at python.org (eli.bendersky) Date: Fri, 10 Feb 2012 06:15:01 +0100 Subject: [Python-checkins] =?utf8?q?peps=3A_fixes_and_cleanups?= Message-ID: http://hg.python.org/peps/rev/e39ae2497e70 changeset: 4043:e39ae2497e70 user: Eli Bendersky date: Fri Feb 10 07:14:46 2012 +0200 summary: fixes and cleanups files: pep-0411.txt | 13 +++++++++---- 1 files changed, 9 insertions(+), 4 deletions(-) diff --git a/pep-0411.txt b/pep-0411.txt --- a/pep-0411.txt +++ b/pep-0411.txt @@ -35,8 +35,8 @@ Whenever the Python core development team decides that a new package should be included into the standard library, but isn't entirely sure about whether the -package's API is optimal, the package can be included and placed in a special -"provisional" state. +package's API is optimal, the package can be included and marked as +"provisional". In the next minor release, the package may either be "graduated" into a normal "stable" state in the standard library, or be rejected and removed entirely @@ -46,6 +46,7 @@ explicitly makes no guarantees about API stability and backward compatibility of provisional packages. + Marking a package provisional ----------------------------- @@ -60,6 +61,10 @@ serious API flaws are uncovered that were missed prior to inclusion of the package. +Moving a package from the provisional to the stable state simply implies +removing this note from its documentation page. + + Which packages should go through the provisional state ------------------------------------------------------ @@ -82,7 +87,7 @@ * The package may prove to be unstable or fragile, without sufficient developer support to maintain it. -* A much better alternative package may be found during the preview release +* A much better alternative package may be found during the preview release. Essentially, the decision will be made by the core developers on a per-case basis. The point to emphasize here is that a packages's inclusion in the @@ -122,7 +127,7 @@ For environments where developers are required to conduct due diligence on their upstream dependencies (severely harming the cost-effectiveness of, or even ruling out entirely, much of the material on PyPI), the key benefit lies -in ensuring that all modules in the provisional state are clearly under +in ensuring that all packages in the provisional state are clearly under python-dev's aegis from at least the following perspectives: * Licensing: Redistributed by the PSF under a Contributor Licensing Agreement. -- Repository URL: http://hg.python.org/peps From python-checkins at python.org Fri Feb 10 09:51:05 2012 From: python-checkins at python.org (ezio.melotti) Date: Fri, 10 Feb 2012 09:51:05 +0100 Subject: [Python-checkins] =?utf8?b?Y3B5dGhvbiAoMy4yKTogIzEzOTYwOiBIVE1M?= =?utf8?q?Parser_is_now_able_to_handle_broken_comments_when_strict=3DFalse?= =?utf8?q?=2E?= Message-ID: http://hg.python.org/cpython/rev/242b697449d8 changeset: 74859:242b697449d8 branch: 3.2 parent: 74848:a352e24b9907 user: Ezio Melotti date: Fri Feb 10 10:45:44 2012 +0200 summary: #13960: HTMLParser is now able to handle broken comments when strict=False. files: Lib/html/parser.py | 25 ++++++++++++++++++++- Lib/test/test_htmlparser.py | 30 +++++++++++++++++++++++++ Misc/NEWS | 5 +++- 3 files changed, 58 insertions(+), 2 deletions(-) diff --git a/Lib/html/parser.py b/Lib/html/parser.py --- a/Lib/html/parser.py +++ b/Lib/html/parser.py @@ -184,7 +184,17 @@ elif startswith(" or + # . When strict is True an + # error is raised, when it's False they will be considered + # as bogus comments and parsed (see parse_bogus_comment). + if self.strict: + k = self.parse_declaration(i) + else: + try: + k = self.parse_declaration(i) + except HTMLParseError: + k = self.parse_bogus_comment(i) elif (i + 1) < n: self.handle_data("<") k = i + 1 @@ -256,6 +266,19 @@ i = self.updatepos(i, n) self.rawdata = rawdata[i:] + # Internal -- parse bogus comment, return length or -1 if not terminated + # 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] != '', i+2) + if pos == -1: + return -1 + if report: + self.handle_comment(rawdata[i+2:pos]) + return pos + 1 + # Internal -- parse processing instr, return end or -1 if not terminated def parse_pi(self, i): rawdata = self.rawdata diff --git a/Lib/test/test_htmlparser.py b/Lib/test/test_htmlparser.py --- a/Lib/test/test_htmlparser.py +++ b/Lib/test/test_htmlparser.py @@ -323,6 +323,23 @@ ("endtag", element_lower)], collector=Collector()) + def test_comments(self): + html = ("" + '' + '' + '' + '' + '' + '') + expected = [('comment', " I'm a valid comment "), + ('comment', 'me too!'), + ('comment', '--'), + ('comment', ''), + ('comment', '--I have many hyphens--'), + ('comment', ' I have a > in the middle '), + ('comment', ' and I have -- in the middle! ')] + self._run_check(html, expected) + def test_condcoms(self): html = ('' '' @@ -426,6 +443,19 @@ # see #12888 self.assertEqual(p.unescape('{ ' * 1050), '{ ' * 1050) + def test_broken_comments(self): + html = ('' + '' + '' + '') + expected = [ + ('comment', ' not really a comment '), + ('comment', ' not a comment either --'), + ('comment', ' -- close enough --'), + ('comment', '!! another bogus comment !!!'), + ] + self._run_check(html, expected) + def test_broken_condcoms(self): # these condcoms are missing the '--' after '' html = ('broken condcom' diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -113,6 +113,9 @@ Library ------- +- 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 @@ -123,7 +126,7 @@ - Issue #10881: Fix test_site failure with OS X framework builds. -- Issue #964437 Make IDLE help window non-modal. +- 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. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Fri Feb 10 09:51:06 2012 From: python-checkins at python.org (ezio.melotti) Date: Fri, 10 Feb 2012 09:51:06 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_3=2E2_-=3E_default=29?= =?utf8?q?=3A_=2313960=3A_merge_with_3=2E2=2E?= Message-ID: http://hg.python.org/cpython/rev/44366541dd86 changeset: 74860:44366541dd86 parent: 74857:6fdcfe348435 parent: 74859:242b697449d8 user: Ezio Melotti date: Fri Feb 10 10:50:49 2012 +0200 summary: #13960: merge with 3.2. files: Lib/html/parser.py | 25 ++++++++++++++++++++- Lib/test/test_htmlparser.py | 30 +++++++++++++++++++++++++ Misc/NEWS | 5 +++- 3 files changed, 58 insertions(+), 2 deletions(-) diff --git a/Lib/html/parser.py b/Lib/html/parser.py --- a/Lib/html/parser.py +++ b/Lib/html/parser.py @@ -184,7 +184,17 @@ elif startswith(" or + # . When strict is True an + # error is raised, when it's False they will be considered + # as bogus comments and parsed (see parse_bogus_comment). + if self.strict: + k = self.parse_declaration(i) + else: + try: + k = self.parse_declaration(i) + except HTMLParseError: + k = self.parse_bogus_comment(i) elif (i + 1) < n: self.handle_data("<") k = i + 1 @@ -256,6 +266,19 @@ i = self.updatepos(i, n) self.rawdata = rawdata[i:] + # Internal -- parse bogus comment, return length or -1 if not terminated + # 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] != '', i+2) + if pos == -1: + return -1 + if report: + self.handle_comment(rawdata[i+2:pos]) + return pos + 1 + # Internal -- parse processing instr, return end or -1 if not terminated def parse_pi(self, i): rawdata = self.rawdata diff --git a/Lib/test/test_htmlparser.py b/Lib/test/test_htmlparser.py --- a/Lib/test/test_htmlparser.py +++ b/Lib/test/test_htmlparser.py @@ -323,6 +323,23 @@ ("endtag", element_lower)], collector=Collector()) + def test_comments(self): + html = ("" + '' + '' + '' + '' + '' + '') + expected = [('comment', " I'm a valid comment "), + ('comment', 'me too!'), + ('comment', '--'), + ('comment', ''), + ('comment', '--I have many hyphens--'), + ('comment', ' I have a > in the middle '), + ('comment', ' and I have -- in the middle! ')] + self._run_check(html, expected) + def test_condcoms(self): html = ('' '' @@ -426,6 +443,19 @@ # see #12888 self.assertEqual(p.unescape('{ ' * 1050), '{ ' * 1050) + def test_broken_comments(self): + html = ('' + '' + '' + '') + expected = [ + ('comment', ' not really a comment '), + ('comment', ' not a comment either --'), + ('comment', ' -- close enough --'), + ('comment', '!! another bogus comment !!!'), + ] + self._run_check(html, expected) + def test_broken_condcoms(self): # these condcoms are missing the '--' after '' html = ('broken condcom' diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -466,6 +466,9 @@ Library ------- +- Issue #13960: HTMLParser is now able to handle broken comments when + strict=False. + - Issue #13921: Undocument and clean up sqlite3.OptimizedUnicode, which is obsolete in Python 3.x. It's now aliased to str for backwards compatibility. @@ -498,7 +501,7 @@ - Issue #10881: Fix test_site failure with OS X framework builds. -- Issue #964437 Make IDLE help window non-modal. +- Issue #964437: Make IDLE help window non-modal. Patch by Guilherme Polo and Roger Serwy. - Issue #13734: Add os.fwalk(), a directory walking function yielding file -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Fri Feb 10 13:09:26 2012 From: python-checkins at python.org (ned.deily) Date: Fri, 10 Feb 2012 13:09:26 +0100 Subject: [Python-checkins] =?utf8?b?Y3B5dGhvbiAoMi43KTogSXNzdWUgIzEzNTkw?= =?utf8?q?=3A_On_OS_X_10=2E7_and_10=2E6_with_Xcode_4=2E2=2C_building?= Message-ID: http://hg.python.org/cpython/rev/29507a2acdb5 changeset: 74861:29507a2acdb5 branch: 2.7 parent: 74858:cf1c466ee9e0 user: Ned Deily date: Fri Feb 10 12:59:06 2012 +0100 summary: 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.) files: Lib/distutils/sysconfig.py | 33 +++++++++++++++++++++++++- Misc/NEWS | 13 ++++++++++ 2 files changed, 45 insertions(+), 1 deletions(-) diff --git a/Lib/distutils/sysconfig.py b/Lib/distutils/sysconfig.py --- a/Lib/distutils/sysconfig.py +++ b/Lib/distutils/sysconfig.py @@ -141,6 +141,7 @@ "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. @@ -153,8 +154,38 @@ get_config_vars('CC', 'CXX', 'OPT', 'CFLAGS', 'CCSHARED', 'LDSHARED', 'SO') + newcc = None if 'CC' in os.environ: - cc = os.environ['CC'] + 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 if 'CXX' in os.environ: cxx = os.environ['CXX'] if 'LDSHARED' in os.environ: diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -90,6 +90,19 @@ Library ------- +- 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 #9021: Add an introduction to the copy module documentation. - Issue #6005: Examples in the socket library documentation use sendall, where -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Fri Feb 10 13:09:27 2012 From: python-checkins at python.org (ned.deily) Date: Fri, 10 Feb 2012 13:09:27 +0100 Subject: [Python-checkins] =?utf8?b?Y3B5dGhvbiAoMy4yKTogSXNzdWUgIzEzNTkw?= =?utf8?q?=3A_On_OS_X_10=2E7_and_10=2E6_with_Xcode_4=2E2=2C_building?= Message-ID: http://hg.python.org/cpython/rev/5c784b0f263d changeset: 74862:5c784b0f263d branch: 3.2 parent: 74859:242b697449d8 user: Ned Deily date: Fri Feb 10 13:01:08 2012 +0100 summary: 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.) files: Lib/distutils/sysconfig.py | 33 +++++++++++++++++++++++++- Misc/NEWS | 13 ++++++++++ 2 files changed, 45 insertions(+), 1 deletions(-) diff --git a/Lib/distutils/sysconfig.py b/Lib/distutils/sysconfig.py --- a/Lib/distutils/sysconfig.py +++ b/Lib/distutils/sysconfig.py @@ -146,6 +146,7 @@ "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. @@ -158,8 +159,38 @@ get_config_vars('CC', 'CXX', 'OPT', 'CFLAGS', 'CCSHARED', 'LDSHARED', 'SO', 'AR', 'ARFLAGS') + newcc = None if 'CC' in os.environ: - cc = os.environ['CC'] + 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 if 'CXX' in os.environ: cxx = os.environ['CXX'] if 'LDSHARED' in os.environ: diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -113,6 +113,19 @@ Library ------- +- 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. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Fri Feb 10 13:09:28 2012 From: python-checkins at python.org (ned.deily) Date: Fri, 10 Feb 2012 13:09:28 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_3=2E2_-=3E_default=29?= =?utf8?q?=3A_Issue_=2313590=3A_merge?= Message-ID: http://hg.python.org/cpython/rev/35bd40b16a91 changeset: 74863:35bd40b16a91 parent: 74860:44366541dd86 parent: 74862:5c784b0f263d user: Ned Deily date: Fri Feb 10 13:08:44 2012 +0100 summary: Issue #13590: merge files: Lib/distutils/sysconfig.py | 33 +++++++++++++++++++++++++- Misc/NEWS | 13 ++++++++++ 2 files changed, 45 insertions(+), 1 deletions(-) diff --git a/Lib/distutils/sysconfig.py b/Lib/distutils/sysconfig.py --- a/Lib/distutils/sysconfig.py +++ b/Lib/distutils/sysconfig.py @@ -146,6 +146,7 @@ "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. @@ -158,8 +159,38 @@ get_config_vars('CC', 'CXX', 'OPT', 'CFLAGS', 'CCSHARED', 'LDSHARED', 'SO', 'AR', 'ARFLAGS') + newcc = None if 'CC' in os.environ: - cc = os.environ['CC'] + 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 if 'CXX' in os.environ: cxx = os.environ['CXX'] if 'LDSHARED' in os.environ: diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -466,6 +466,19 @@ Library ------- +- 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. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Fri Feb 10 14:02:34 2012 From: python-checkins at python.org (nick.coghlan) Date: Fri, 10 Feb 2012 14:02:34 +0100 Subject: [Python-checkins] =?utf8?q?peps=3A_Update_PEP_360_to_record_the_c?= =?utf8?q?hange_in_ElementTree=27s_status=2C_and_tweak_the?= Message-ID: http://hg.python.org/peps/rev/24e56f5e9cfd changeset: 4044:24e56f5e9cfd user: Nick Coghlan date: Fri Feb 10 23:02:15 2012 +1000 summary: Update PEP 360 to record the change in ElementTree's status, and tweak the header to make it appear in the Historical PEP section files: pep-0360.txt | 28 ++++++++++++++-------------- 1 files changed, 14 insertions(+), 14 deletions(-) diff --git a/pep-0360.txt b/pep-0360.txt --- a/pep-0360.txt +++ b/pep-0360.txt @@ -3,8 +3,8 @@ Version: $Revision$ Last-Modified: $Date$ Author: Brett Cannon -Status: Active -Type: Informational +Status: Final +Type: Process Content-Type: text/x-rst Created: 30-May-2006 Post-History: @@ -13,7 +13,7 @@ .. warning:: No new modules are to be added to this PEP. It has been deemed dangerous to codify external maintenance of any code checked into Python's code repository. Code - contributers should expect Python's development + contributors should expect Python's development methodology to be used for any and all code checked into Python's code repository. @@ -66,11 +66,8 @@ :Contact person: Fredrik Lundh -Patches should not be directly applied to Python HEAD, but instead -reported to the Python tracker [#python-tracker]_ (critical bug fixes -are the exception). Bugs should also be reported to the Python -tracker. Both bugs and patches should be assigned to Fredrik Lundh. - +Fredrik has ceded ElementTree maintenance to the core Python development +team [#element-tree]_. Expat XML parser ---------------- @@ -83,6 +80,7 @@ :Contact person: None + Optik ----- @@ -93,7 +91,9 @@ :Contact person: Greg Ward -External development seems to have ceased. +External development seems to have ceased. For new applications, optparse +itself has been largely superseded by argparse. + wsgiref ------- @@ -104,16 +104,16 @@ :Contact Person: Phillip J. Eby -Bugs and patches should pass through the Web-SIG mailing list [#web-sig]_ -before being applied to HEAD. External maintenance seems to have -ceased. +This module is maintained in the standard library, but significant bug +reports and patches should pass through the Web-SIG mailing list +[#web-sig]_ for discussion. References ========== -.. [#python-tracker] Python tracker - (http://sourceforge.net/tracker/?group_id=5470) +.. [#element-tree] Fredrik's handing over of ElementTree + (http://mail.python.org/pipermail/python-dev/2012-February/116389.html) .. [#web-sig] Web-SIG mailing list (http://mail.python.org/mailman/listinfo/web-sig) -- Repository URL: http://hg.python.org/peps From python-checkins at python.org Fri Feb 10 14:10:46 2012 From: python-checkins at python.org (nick.coghlan) Date: Fri, 10 Feb 2012 14:10:46 +0100 Subject: [Python-checkins] =?utf8?q?peps=3A_Tweak_the_headers_on_a_few_PEP?= =?utf8?q?s_so_they_appear_in_the_Historical_PEPs_section?= Message-ID: http://hg.python.org/peps/rev/b3ac12f7cf76 changeset: 4045:b3ac12f7cf76 user: Nick Coghlan date: Fri Feb 10 23:10:37 2012 +1000 summary: Tweak the headers on a few PEPs so they appear in the Historical PEPs section rather than at the top of the PEP index files: pep-0042.txt | 4 ++-- pep-0374.txt | 2 +- pep-0375.txt | 2 +- pep-0385.txt | 2 +- pep-3000.txt | 2 +- pep-3003.txt | 2 +- pep-3099.txt | 2 +- pep-3100.txt | 4 ++-- 8 files changed, 10 insertions(+), 10 deletions(-) diff --git a/pep-0042.txt b/pep-0042.txt --- a/pep-0042.txt +++ b/pep-0042.txt @@ -3,8 +3,8 @@ Version: $Revision$ Last-Modified: $Date$ Author: Jeremy Hylton -Status: Active -Type: Informational +Status: Final +Type: Process Created: 12-Sep-2000 Post-History: diff --git a/pep-0374.txt b/pep-0374.txt --- a/pep-0374.txt +++ b/pep-0374.txt @@ -7,7 +7,7 @@ Alexandre Vassalotti , Barry Warsaw , Dirkjan Ochtman -Status: Active +Status: Final Type: Process Content-Type: text/x-rst Created: 07-Nov-2008 diff --git a/pep-0375.txt b/pep-0375.txt --- a/pep-0375.txt +++ b/pep-0375.txt @@ -3,7 +3,7 @@ Version: $Revision$ Last-Modified: $Date$ Author: Benjamin Peterson -Status: Active +Status: Final Type: Informational Content-Type: text/x-rst Created: 8-Feb-2009 diff --git a/pep-0385.txt b/pep-0385.txt --- a/pep-0385.txt +++ b/pep-0385.txt @@ -5,7 +5,7 @@ Author: Dirkjan Ochtman , Antoine Pitrou , Georg Brandl -Status: Active +Status: Final Type: Process Content-Type: text/x-rst Created: 25-May-2009 diff --git a/pep-3000.txt b/pep-3000.txt --- a/pep-3000.txt +++ b/pep-3000.txt @@ -3,7 +3,7 @@ Version: $Revision$ Last-Modified: $Date$ Author: Guido van Rossum -Status: Active +Status: Final Type: Process Content-Type: text/x-rst Created: 05-Apr-2006 diff --git a/pep-3003.txt b/pep-3003.txt --- a/pep-3003.txt +++ b/pep-3003.txt @@ -3,7 +3,7 @@ Version: $Revision$ Last-Modified: $Date$ Author: Brett Cannon, Jesse Noller, Guido van Rossum -Status: Active +Status: Final Type: Process Content-Type: text/x-rst Created: 21-Oct-2009 diff --git a/pep-3099.txt b/pep-3099.txt --- a/pep-3099.txt +++ b/pep-3099.txt @@ -3,7 +3,7 @@ Version: $Revision$ Last-Modified: $Date$ Author: Georg Brandl -Status: Active +Status: Final Type: Process Content-Type: text/x-rst Created: 04-Apr-2006 diff --git a/pep-3100.txt b/pep-3100.txt --- a/pep-3100.txt +++ b/pep-3100.txt @@ -3,8 +3,8 @@ Version: $Revision$ Last-Modified: $Date$ Author: Brett Cannon -Status: Active -Type: Informational +Status: Final +Type: Process Content-Type: text/x-rst Created: 20-Aug-2004 Post-History: -- Repository URL: http://hg.python.org/peps From python-checkins at python.org Fri Feb 10 14:12:15 2012 From: python-checkins at python.org (nick.coghlan) Date: Fri, 10 Feb 2012 14:12:15 +0100 Subject: [Python-checkins] =?utf8?q?peps=3A_Missed_one?= Message-ID: http://hg.python.org/peps/rev/b5d7f8ac1bbf changeset: 4046:b5d7f8ac1bbf user: Nick Coghlan date: Fri Feb 10 23:12:07 2012 +1000 summary: Missed one files: pep-3002.txt | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/pep-3002.txt b/pep-3002.txt --- a/pep-3002.txt +++ b/pep-3002.txt @@ -3,7 +3,7 @@ Version: $Revision$ Last-Modified: $Date$ Author: Steven Bethard -Status: Draft +Status: Final Type: Process Content-Type: text/x-rst Created: 27-Mar-2006 -- Repository URL: http://hg.python.org/peps From python-checkins at python.org Fri Feb 10 14:17:32 2012 From: python-checkins at python.org (nick.coghlan) Date: Fri, 10 Feb 2012 14:17:32 +0100 Subject: [Python-checkins] =?utf8?q?peps=3A_All_Draft_PEPs_should_be_in_th?= =?utf8?q?e_=27Open_PEPs=27_section=2C_even_Process_ones?= Message-ID: http://hg.python.org/peps/rev/cd49f7164b82 changeset: 4047:cd49f7164b82 user: Nick Coghlan date: Fri Feb 10 23:17:22 2012 +1000 summary: All Draft PEPs should be in the 'Open PEPs' section, even Process ones files: pep0/output.py | 8 ++++---- 1 files changed, 4 insertions(+), 4 deletions(-) diff --git a/pep0/output.py b/pep0/output.py --- a/pep0/output.py +++ b/pep0/output.py @@ -36,15 +36,15 @@ for pep in peps: # Order of 'if' statement important. Key Status values take precedence # over Type value, and vice-versa. - if pep.type_ == 'Process': - if pep.status in ("Active", "Draft"): + if pep.status == 'Draft': + open_.append(pep) + elif pep.type_ == 'Process': + if pep.status == "Active": meta.append(pep) elif pep.status in ("Withdrawn", "Rejected"): dead.append(pep) else: historical.append(pep) - elif pep.status == 'Draft': - open_.append(pep) elif pep.status == 'Deferred': deferred.append(pep) elif pep.status in ('Rejected', 'Withdrawn', -- Repository URL: http://hg.python.org/peps From python-checkins at python.org Fri Feb 10 14:49:00 2012 From: python-checkins at python.org (benjamin.peterson) Date: Fri, 10 Feb 2012 14:49:00 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=283=2E2=29=3A_this_is_only_a_?= =?utf8?q?borrowed_ref_in_Brett=27s_branch?= Message-ID: http://hg.python.org/cpython/rev/6ee07935e635 changeset: 74864:6ee07935e635 branch: 3.2 parent: 74862:5c784b0f263d user: Benjamin Peterson date: Fri Feb 10 08:46:54 2012 -0500 summary: this is only a borrowed ref in Brett's branch files: Objects/exceptions.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Objects/exceptions.c b/Objects/exceptions.c --- a/Objects/exceptions.c +++ b/Objects/exceptions.c @@ -2126,7 +2126,7 @@ Py_DECREF(args_tuple); } } - + Py_DECREF(bltinmod); } void -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Fri Feb 10 14:49:01 2012 From: python-checkins at python.org (benjamin.peterson) Date: Fri, 10 Feb 2012 14:49:01 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_3=2E2_-=3E_default=29?= =?utf8?q?=3A_merge_3=2E2?= Message-ID: http://hg.python.org/cpython/rev/705b56512287 changeset: 74865:705b56512287 parent: 74863:35bd40b16a91 parent: 74864:6ee07935e635 user: Benjamin Peterson date: Fri Feb 10 08:47:04 2012 -0500 summary: merge 3.2 files: Objects/exceptions.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Objects/exceptions.c b/Objects/exceptions.c --- a/Objects/exceptions.c +++ b/Objects/exceptions.c @@ -2474,7 +2474,7 @@ Py_DECREF(args_tuple); } } - + Py_DECREF(bltinmod); } void -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Fri Feb 10 14:49:01 2012 From: python-checkins at python.org (benjamin.peterson) Date: Fri, 10 Feb 2012 14:49:01 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=282=2E7=29=3A_this_is_only_a_?= =?utf8?q?borrowed_ref_in_Brett=27s_branch?= Message-ID: http://hg.python.org/cpython/rev/adf555991f8b changeset: 74866:adf555991f8b branch: 2.7 parent: 74861:29507a2acdb5 user: Benjamin Peterson date: Fri Feb 10 08:46:54 2012 -0500 summary: this is only a borrowed ref in Brett's branch files: Objects/exceptions.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Objects/exceptions.c b/Objects/exceptions.c --- a/Objects/exceptions.c +++ b/Objects/exceptions.c @@ -2209,7 +2209,7 @@ Py_FatalError("init of pre-allocated RuntimeError failed"); Py_DECREF(args_tuple); } - + Py_DECREF(bltinmod); } void -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Fri Feb 10 14:58:41 2012 From: python-checkins at python.org (eli.bendersky) Date: Fri, 10 Feb 2012 14:58:41 +0100 Subject: [Python-checkins] =?utf8?q?peps=3A_fix_post_date_for_411?= Message-ID: http://hg.python.org/peps/rev/09f9ab5666ad changeset: 4048:09f9ab5666ad user: Eli Bendersky date: Fri Feb 10 15:58:24 2012 +0200 summary: fix post date for 411 files: pep-0411.txt | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/pep-0411.txt b/pep-0411.txt --- a/pep-0411.txt +++ b/pep-0411.txt @@ -9,7 +9,7 @@ Content-Type: text/x-rst Created: 2012-02-10 Python-Version: 3.3 -Post-History: 2012-02-xx FIXME +Post-History: 2012-02-10 Abstract -- Repository URL: http://hg.python.org/peps From python-checkins at python.org Fri Feb 10 20:48:27 2012 From: python-checkins at python.org (philip.jenvey) Date: Fri, 10 Feb 2012 20:48:27 +0100 Subject: [Python-checkins] =?utf8?q?cpython=3A_simplify?= Message-ID: http://hg.python.org/cpython/rev/2857c4a3a26d changeset: 74867:2857c4a3a26d parent: 74865:705b56512287 user: Philip Jenvey date: Fri Feb 10 11:45:03 2012 -0800 summary: simplify files: Lib/importlib/_bootstrap.py | 5 +---- 1 files changed, 1 insertions(+), 4 deletions(-) diff --git a/Lib/importlib/_bootstrap.py b/Lib/importlib/_bootstrap.py --- a/Lib/importlib/_bootstrap.py +++ b/Lib/importlib/_bootstrap.py @@ -36,10 +36,7 @@ b'PYTHONCASEOK' not in _os.environ): if not directory: directory = '.' - if check in _os.listdir(directory): - return True - else: - return False + return check in _os.listdir(directory) else: return True -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sat Feb 11 04:04:31 2012 From: python-checkins at python.org (eli.bendersky) Date: Sat, 11 Feb 2012 04:04:31 +0100 Subject: [Python-checkins] =?utf8?q?peps=3A_fix_a_couple_of_typos?= Message-ID: http://hg.python.org/peps/rev/175aaec7a946 changeset: 4049:175aaec7a946 user: Eli Bendersky date: Sat Feb 11 05:04:13 2012 +0200 summary: fix a couple of typos files: pep-0411.txt | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) diff --git a/pep-0411.txt b/pep-0411.txt --- a/pep-0411.txt +++ b/pep-0411.txt @@ -26,7 +26,7 @@ are made with regards to the the stability of the package's API, which may change for the next release. While it is considered an unlikely outcome, such packages may even be removed from the standard library without a -deprecation period if the concerns regarding their API or maintenante prove +deprecation period if the concerns regarding their API or maintenance prove well-founded. @@ -90,7 +90,7 @@ * A much better alternative package may be found during the preview release. Essentially, the decision will be made by the core developers on a per-case -basis. The point to emphasize here is that a packages's inclusion in the +basis. The point to emphasize here is that a package's inclusion in the standard library as "provisional" in some release does not guarantee it will continue being part of Python in the next release. -- Repository URL: http://hg.python.org/peps From python-checkins at python.org Sat Feb 11 04:08:20 2012 From: python-checkins at python.org (eli.bendersky) Date: Sat, 11 Feb 2012 04:08:20 +0100 Subject: [Python-checkins] =?utf8?q?peps=3A_fixed_PEP_reference?= Message-ID: http://hg.python.org/peps/rev/4d5d1c1fd634 changeset: 4050:4d5d1c1fd634 user: Eli Bendersky date: Sat Feb 11 05:08:02 2012 +0200 summary: fixed PEP reference files: pep-0411.txt | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/pep-0411.txt b/pep-0411.txt --- a/pep-0411.txt +++ b/pep-0411.txt @@ -157,7 +157,7 @@ * HTML 5 parsing support (e.g. ``html5lib``) * Improved URL/URI/IRI parsing * A standard image API (PEP 368) -* Encapsulation of the import state (PEP 368) +* Improved encapsulation of import state (PEP 406) * Standard event loop API (PEP 3153) * A binary version of WSGI for Python 3 (e.g. PEP 444) * Generic function support (e.g. ``simplegeneric``) -- Repository URL: http://hg.python.org/peps From solipsis at pitrou.net Sat Feb 11 05:33:16 2012 From: solipsis at pitrou.net (solipsis at pitrou.net) Date: Sat, 11 Feb 2012 05:33:16 +0100 Subject: [Python-checkins] Daily reference leaks (2857c4a3a26d): sum=0 Message-ID: results for 2857c4a3a26d on branch "default" -------------------------------------------- Command line was: ['./python', '-m', 'test.regrtest', '-uall', '-R', '3:3:/home/antoine/cpython/refleaks/reflogcppWnu', '-x'] From python-checkins at python.org Sat Feb 11 08:52:51 2012 From: python-checkins at python.org (eli.bendersky) Date: Sat, 11 Feb 2012 08:52:51 +0100 Subject: [Python-checkins] =?utf8?q?cpython=3A_fix_Sphinx_error_in_os=2Ers?= =?utf8?q?t?= Message-ID: http://hg.python.org/cpython/rev/dc0336725e44 changeset: 74868:dc0336725e44 user: Eli Bendersky date: Sat Feb 11 09:52:29 2012 +0200 summary: fix Sphinx error in os.rst files: Doc/library/os.rst | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Doc/library/os.rst b/Doc/library/os.rst --- a/Doc/library/os.rst +++ b/Doc/library/os.rst @@ -2294,8 +2294,8 @@ single: directory; walking single: directory; traversal - This behaves exactly like :func:`walk`, except that it yields a 4-tuple - ``(dirpath, dirnames, filenames, dirfd)``. + This behaves exactly like :func:`walk`, except that it yields a 4-tuple + ``(dirpath, dirnames, filenames, dirfd)``. *dirpath*, *dirnames* and *filenames* are identical to :func:`walk` output, and *dirfd* is a file descriptor referring to the directory *dirpath*. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sat Feb 11 09:27:53 2012 From: python-checkins at python.org (eli.bendersky) Date: Sat, 11 Feb 2012 09:27:53 +0100 Subject: [Python-checkins] =?utf8?q?cpython=3A_fix_Doc/extending/extending?= =?utf8?q?=2Erst_typo?= Message-ID: http://hg.python.org/cpython/rev/3f3496d57233 changeset: 74869:3f3496d57233 user: Eli Bendersky date: Sat Feb 11 10:27:31 2012 +0200 summary: fix Doc/extending/extending.rst typo files: Doc/extending/extending.rst | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Doc/extending/extending.rst b/Doc/extending/extending.rst --- a/Doc/extending/extending.rst +++ b/Doc/extending/extending.rst @@ -321,7 +321,7 @@ 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. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sat Feb 11 11:29:54 2012 From: python-checkins at python.org (florent.xicluna) Date: Sat, 11 Feb 2012 11:29:54 +0100 Subject: [Python-checkins] =?utf8?q?cpython=3A_Issue_=2313988=3A_move_the_?= =?utf8?q?python_bootstrap_code_to_cElementTree=2Epy=2C_and_remove?= Message-ID: http://hg.python.org/cpython/rev/31dfb4be934d changeset: 74870:31dfb4be934d user: Florent Xicluna date: Sat Feb 11 11:28:16 2012 +0100 summary: Issue #13988: move the python bootstrap code to cElementTree.py, and remove obsolete code for Python 2.4 and 2.5. files: Lib/xml/etree/cElementTree.py | 150 ++++++++++++++ Modules/_elementtree.c | 234 +--------------------- 2 files changed, 152 insertions(+), 232 deletions(-) diff --git a/Lib/xml/etree/cElementTree.py b/Lib/xml/etree/cElementTree.py --- a/Lib/xml/etree/cElementTree.py +++ b/Lib/xml/etree/cElementTree.py @@ -1,3 +1,153 @@ # Wrapper module for _elementtree +from xml.etree.ElementTree import (ElementTree, dump, iselement, QName, + fromstringlist, + tostring, tostringlist, VERSION) +# These ones are not in ElementTree.__all__ +from xml.etree.ElementTree import ElementPath, register_namespace + +# Import the C accelerators: +# Element, SubElement, TreeBuilder, XMLParser, ParseError from _elementtree import * + + +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 + + +# ============================================================================= +# +# Everything below this line can be removed +# after cElementTree is folded behind ElementTree. +# +# ============================================================================= + +from xml.etree.ElementTree import Comment as _Comment, PI as _PI + + +def parse(source, parser=None): + tree = ElementTree() + tree.parse(source, parser) + return tree + + +def XML(text, parser=None): + if not parser: + parser = XMLParser() + parser = XMLParser() + parser.feed(text) + return parser.close() + + +def XMLID(text, parser=None): + tree = XML(text, parser=parser) + ids = {} + for elem in tree.iter(): + id = elem.get('id') + if id: + ids[id] = elem + return tree, ids + + +class CommentProxy: + + def __call__(self, text=None): + element = Element(_Comment) + element.text = text + return element + + def __eq__(self, other): + return _Comment == other + + +class PIProxy: + + def __call__(self, target, text=None): + element = Element(_PI) + element.text = target + if text: + element.text = element.text + ' ' + text + return element + + def __eq__(self, other): + return _PI == other + + +Comment = CommentProxy() +PI = ProcessingInstruction = PIProxy() +del CommentProxy, PIProxy + +# Aliases +fromstring = XML +XMLTreeBuilder = XMLParser diff --git a/Modules/_elementtree.c b/Modules/_elementtree.c --- a/Modules/_elementtree.c +++ b/Modules/_elementtree.c @@ -94,25 +94,6 @@ #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 @@ -123,7 +104,6 @@ /* 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; @@ -1128,31 +1108,6 @@ } 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; @@ -1260,13 +1215,8 @@ { 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; @@ -1317,13 +1267,8 @@ { 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; @@ -1364,13 +1309,8 @@ 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; @@ -1470,18 +1410,6 @@ {"__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}, - {NULL, NULL} }; @@ -2878,7 +2806,6 @@ {"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} }; @@ -2933,54 +2860,8 @@ 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" + "from copy import deepcopy\n" + "from xml.etree import ElementPath\n" "def iter(node, tag=None):\n" /* helper */ " if tag == '*':\n" @@ -3000,123 +2881,12 @@ " 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(); - elementtree_deepcopy_obj = PyDict_GetItemString(g, "deepcopy"); elementtree_iter_obj = PyDict_GetItemString(g, "iter"); elementtree_itertext_obj = PyDict_GetItemString(g, "itertext"); -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sat Feb 11 20:42:37 2012 From: python-checkins at python.org (ned.deily) Date: Sat, 11 Feb 2012 20:42:37 +0100 Subject: [Python-checkins] =?utf8?b?Y3B5dGhvbiAoMi43KTogSXNzdWUgIzEzOTk0?= =?utf8?q?=3A_Earler_partial_revert_of_Distutils_enhancements_in_2=2E7?= Message-ID: http://hg.python.org/cpython/rev/6240ff5dfebe changeset: 74871:6240ff5dfebe branch: 2.7 parent: 74866:adf555991f8b user: Ned Deily date: Sat Feb 11 20:40:24 2012 +0100 summary: Issue #13994: Earler partial revert of Distutils enhancements in 2.7 has left two versions of customize_compiler, the original in distutils.sysconfig and another copy in distutils.ccompiler, with some parts of distutils calling one and others using the other. Complete the revert back to only having one in distutils.sysconfig as is the case in 3.x. files: Lib/distutils/ccompiler.py | 52 -------------- Lib/distutils/command/build_clib.py | 2 +- Lib/distutils/command/config.py | 2 +- Lib/distutils/sysconfig.py | 14 ++- Lib/distutils/tests/test_build_clib.py | 3 +- Lib/distutils/tests/test_ccompiler.py | 3 +- Misc/NEWS | 7 + 7 files changed, 24 insertions(+), 59 deletions(-) diff --git a/Lib/distutils/ccompiler.py b/Lib/distutils/ccompiler.py --- a/Lib/distutils/ccompiler.py +++ b/Lib/distutils/ccompiler.py @@ -18,58 +18,6 @@ from distutils.util import split_quoted, execute from distutils import log -_sysconfig = __import__('sysconfig') - -def customize_compiler(compiler): - """Do any platform-specific customization of a CCompiler instance. - - Mainly needed on Unix, so we can plug in the information that - varies across Unices and is stored in Python's Makefile. - """ - if compiler.compiler_type == "unix": - (cc, cxx, opt, cflags, ccshared, ldshared, so_ext, ar, ar_flags) = \ - _sysconfig.get_config_vars('CC', 'CXX', 'OPT', 'CFLAGS', - 'CCSHARED', 'LDSHARED', 'SO', 'AR', - 'ARFLAGS') - - if 'CC' in os.environ: - cc = os.environ['CC'] - if 'CXX' in os.environ: - cxx = os.environ['CXX'] - if 'LDSHARED' in os.environ: - ldshared = os.environ['LDSHARED'] - if 'CPP' in os.environ: - cpp = os.environ['CPP'] - else: - cpp = cc + " -E" # not always - if 'LDFLAGS' in os.environ: - ldshared = ldshared + ' ' + os.environ['LDFLAGS'] - if 'CFLAGS' in os.environ: - cflags = opt + ' ' + os.environ['CFLAGS'] - ldshared = ldshared + ' ' + os.environ['CFLAGS'] - if 'CPPFLAGS' in os.environ: - cpp = cpp + ' ' + os.environ['CPPFLAGS'] - cflags = cflags + ' ' + os.environ['CPPFLAGS'] - ldshared = ldshared + ' ' + os.environ['CPPFLAGS'] - if 'AR' in os.environ: - ar = os.environ['AR'] - if 'ARFLAGS' in os.environ: - archiver = ar + ' ' + os.environ['ARFLAGS'] - else: - archiver = ar + ' ' + ar_flags - - cc_cmd = cc + ' ' + cflags - compiler.set_executables( - preprocessor=cpp, - compiler=cc_cmd, - compiler_so=cc_cmd + ' ' + ccshared, - compiler_cxx=cxx, - linker_so=ldshared, - linker_exe=cc, - archiver=archiver) - - compiler.shared_lib_extension = so_ext - class CCompiler: """Abstract base class to define the interface that must be implemented by real compiler classes. Also has some utility methods used by diff --git a/Lib/distutils/command/build_clib.py b/Lib/distutils/command/build_clib.py --- a/Lib/distutils/command/build_clib.py +++ b/Lib/distutils/command/build_clib.py @@ -19,7 +19,7 @@ import os from distutils.core import Command from distutils.errors import DistutilsSetupError -from distutils.ccompiler import customize_compiler +from distutils.sysconfig import customize_compiler from distutils import log def show_compilers(): diff --git a/Lib/distutils/command/config.py b/Lib/distutils/command/config.py --- a/Lib/distutils/command/config.py +++ b/Lib/distutils/command/config.py @@ -16,7 +16,7 @@ from distutils.core import Command from distutils.errors import DistutilsExecError -from distutils.ccompiler import customize_compiler +from distutils.sysconfig import customize_compiler from distutils import log LANG_EXT = {'c': '.c', 'c++': '.cxx'} diff --git a/Lib/distutils/sysconfig.py b/Lib/distutils/sysconfig.py --- a/Lib/distutils/sysconfig.py +++ b/Lib/distutils/sysconfig.py @@ -150,9 +150,10 @@ varies across Unices and is stored in Python's Makefile. """ if compiler.compiler_type == "unix": - (cc, cxx, opt, cflags, ccshared, ldshared, so_ext) = \ + (cc, cxx, opt, cflags, ccshared, ldshared, so_ext, ar, ar_flags) = \ get_config_vars('CC', 'CXX', 'OPT', 'CFLAGS', - 'CCSHARED', 'LDSHARED', 'SO') + 'CCSHARED', 'LDSHARED', 'SO', 'AR', + 'ARFLAGS') newcc = None if 'CC' in os.environ: @@ -203,6 +204,12 @@ cpp = cpp + ' ' + os.environ['CPPFLAGS'] cflags = cflags + ' ' + os.environ['CPPFLAGS'] ldshared = ldshared + ' ' + os.environ['CPPFLAGS'] + if 'AR' in os.environ: + ar = os.environ['AR'] + if 'ARFLAGS' in os.environ: + archiver = ar + ' ' + os.environ['ARFLAGS'] + else: + archiver = ar + ' ' + ar_flags cc_cmd = cc + ' ' + cflags compiler.set_executables( @@ -211,7 +218,8 @@ compiler_so=cc_cmd + ' ' + ccshared, compiler_cxx=cxx, linker_so=ldshared, - linker_exe=cc) + linker_exe=cc, + archiver=archiver) compiler.shared_lib_extension = so_ext diff --git a/Lib/distutils/tests/test_build_clib.py b/Lib/distutils/tests/test_build_clib.py --- a/Lib/distutils/tests/test_build_clib.py +++ b/Lib/distutils/tests/test_build_clib.py @@ -122,7 +122,8 @@ # before we run the command, we want to make sure # all commands are present on the system # by creating a compiler and checking its executables - from distutils.ccompiler import new_compiler, customize_compiler + from distutils.ccompiler import new_compiler + from distutils.sysconfig import customize_compiler compiler = new_compiler() customize_compiler(compiler) diff --git a/Lib/distutils/tests/test_ccompiler.py b/Lib/distutils/tests/test_ccompiler.py --- a/Lib/distutils/tests/test_ccompiler.py +++ b/Lib/distutils/tests/test_ccompiler.py @@ -4,7 +4,8 @@ from test.test_support import captured_stdout from distutils.ccompiler import (gen_lib_options, CCompiler, - get_default_compiler, customize_compiler) + get_default_compiler) +from distutils.sysconfig import customize_compiler from distutils import debug from distutils.tests import support diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -90,6 +90,13 @@ Library ------- +- Issue #13994: Earler partial revert of Distutils enhancements in 2.7 + has left two versions of customize_compiler, the original in + distutils.sysconfig and another copy in distutils.ccompiler, with some + parts of distutils calling one and others using the other. + Complete the revert back to only having one in distutils.sysconfig as + is the case in 3.x. + - 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 -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sat Feb 11 23:06:31 2012 From: python-checkins at python.org (nadeem.vawda) Date: Sat, 11 Feb 2012 23:06:31 +0100 Subject: [Python-checkins] =?utf8?b?Y3B5dGhvbiAoMy4yKTogSXNzdWUgIzEzOTg5?= =?utf8?q?=3A_Document_that_GzipFile_does_not_support_text_mode=2E?= Message-ID: http://hg.python.org/cpython/rev/4b32309631da changeset: 74872:4b32309631da branch: 3.2 parent: 74864:6ee07935e635 user: Nadeem Vawda date: Sat Feb 11 23:45:10 2012 +0200 summary: Issue #13989: Document that GzipFile does not support text mode. Also, give a more helpful error message when opened with an invalid mode string. files: Doc/library/gzip.rst | 8 +++++--- Lib/gzip.py | 11 +++++++---- Misc/NEWS | 3 +++ 3 files changed, 15 insertions(+), 7 deletions(-) diff --git a/Doc/library/gzip.rst b/Doc/library/gzip.rst --- a/Doc/library/gzip.rst +++ b/Doc/library/gzip.rst @@ -44,9 +44,11 @@ The *mode* argument can be any of ``'r'``, ``'rb'``, ``'a'``, ``'ab'``, ``'w'``, 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'``. If - not given, the 'b' flag will be added to the mode to ensure the file is opened - in binary mode for cross-platform portability. + 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`. The *compresslevel* argument is an integer from ``1`` to ``9`` controlling the level of compression; ``1`` is fastest and produces the least compression, and diff --git a/Lib/gzip.py b/Lib/gzip.py --- a/Lib/gzip.py +++ b/Lib/gzip.py @@ -105,6 +105,9 @@ """The GzipFile class simulates most of the methods of a file object with 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. + """ myfileobj = None @@ -131,8 +134,8 @@ The mode argument can be any of 'r', 'rb', 'a', 'ab', 'w', 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'. - Be aware that only the 'rb', 'ab', and 'wb' values should be used - for cross-platform portability. + A mode of 'r' is equivalent to one of 'rb', and similarly for 'w' and + 'wb', and 'a' and 'ab'. The compresslevel argument is an integer from 1 to 9 controlling the level of compression; 1 is fastest and produces the least compression, @@ -149,8 +152,8 @@ """ - # guarantee the file is opened in binary mode on platforms - # that care about that sort of thing + if mode and ('t' in mode or 'U' in mode): + raise IOError("Mode " + mode + " not supported") if mode and 'b' not in mode: mode += 'b' if fileobj is None: diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -113,6 +113,9 @@ Library ------- +- 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 -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sat Feb 11 23:06:32 2012 From: python-checkins at python.org (nadeem.vawda) Date: Sat, 11 Feb 2012 23:06:32 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_3=2E2_-=3E_default=29?= =?utf8?q?=3A_Merge=3A_=2313989=3A_Document_that_GzipFile_does_not_support?= =?utf8?q?_text_mode=2E?= Message-ID: http://hg.python.org/cpython/rev/8dbe8faea0e7 changeset: 74873:8dbe8faea0e7 parent: 74870:31dfb4be934d parent: 74872:4b32309631da user: Nadeem Vawda date: Sat Feb 11 23:54:51 2012 +0200 summary: Merge: #13989: Document that GzipFile does not support text mode. files: Doc/library/gzip.rst | 8 +++++--- Lib/gzip.py | 11 +++++++---- Misc/NEWS | 3 +++ 3 files changed, 15 insertions(+), 7 deletions(-) diff --git a/Doc/library/gzip.rst b/Doc/library/gzip.rst --- a/Doc/library/gzip.rst +++ b/Doc/library/gzip.rst @@ -44,9 +44,11 @@ The *mode* argument can be any of ``'r'``, ``'rb'``, ``'a'``, ``'ab'``, ``'w'``, 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'``. If - not given, the 'b' flag will be added to the mode to ensure the file is opened - in binary mode for cross-platform portability. + 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`. The *compresslevel* argument is an integer from ``1`` to ``9`` controlling the level of compression; ``1`` is fastest and produces the least compression, and diff --git a/Lib/gzip.py b/Lib/gzip.py --- a/Lib/gzip.py +++ b/Lib/gzip.py @@ -93,6 +93,9 @@ """The GzipFile class simulates most of the methods of a file object with 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. + """ myfileobj = None @@ -119,8 +122,8 @@ The mode argument can be any of 'r', 'rb', 'a', 'ab', 'w', 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'. - Be aware that only the 'rb', 'ab', and 'wb' values should be used - for cross-platform portability. + A mode of 'r' is equivalent to one of 'rb', and similarly for 'w' and + 'wb', and 'a' and 'ab'. The compresslevel argument is an integer from 1 to 9 controlling the level of compression; 1 is fastest and produces the least compression, @@ -137,8 +140,8 @@ """ - # guarantee the file is opened in binary mode on platforms - # that care about that sort of thing + if mode and ('t' in mode or 'U' in mode): + raise IOError("Mode " + mode + " not supported") if mode and 'b' not in mode: mode += 'b' if fileobj is None: diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -466,6 +466,9 @@ Library ------- +- 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 -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sat Feb 11 23:06:33 2012 From: python-checkins at python.org (nadeem.vawda) Date: Sat, 11 Feb 2012 23:06:33 +0100 Subject: [Python-checkins] =?utf8?q?cpython=3A_Clean_up_GzipFile_mode_stri?= =?utf8?q?ng_handling_code=2E?= Message-ID: http://hg.python.org/cpython/rev/6231b507540a changeset: 74874:6231b507540a user: Nadeem Vawda date: Sun Feb 12 00:06:02 2012 +0200 summary: Clean up GzipFile mode string handling code. files: Lib/gzip.py | 11 +++++------ 1 files changed, 5 insertions(+), 6 deletions(-) diff --git a/Lib/gzip.py b/Lib/gzip.py --- a/Lib/gzip.py +++ b/Lib/gzip.py @@ -141,7 +141,7 @@ """ 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: @@ -152,10 +152,9 @@ else: 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 @@ -170,7 +169,7 @@ 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, @@ -179,7 +178,7 @@ 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 -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Feb 12 00:34:50 2012 From: python-checkins at python.org (nadeem.vawda) Date: Sun, 12 Feb 2012 00:34:50 +0100 Subject: [Python-checkins] =?utf8?q?cpython=3A_Fix_typo_in_whatsnew/3=2E3?= =?utf8?q?=2E?= Message-ID: http://hg.python.org/cpython/rev/e5cc016519ac changeset: 74875:e5cc016519ac user: Nadeem Vawda date: Sun Feb 12 00:30:54 2012 +0200 summary: Fix typo in whatsnew/3.3. files: Doc/whatsnew/3.3.rst | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Doc/whatsnew/3.3.rst b/Doc/whatsnew/3.3.rst --- a/Doc/whatsnew/3.3.rst +++ b/Doc/whatsnew/3.3.rst @@ -329,7 +329,7 @@ codecs ------ -The :mod:`~encodings.mbcs` codec has be rewritten to handle correclty +The :mod:`~encodings.mbcs` codec has be 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. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Feb 12 00:34:51 2012 From: python-checkins at python.org (nadeem.vawda) Date: Sun, 12 Feb 2012 00:34:51 +0100 Subject: [Python-checkins] =?utf8?q?cpython=3A_Add_section_on_bz2_module_t?= =?utf8?q?o_whatsnew/3=2E3=2E?= Message-ID: http://hg.python.org/cpython/rev/b03c459d8d6b changeset: 74876:b03c459d8d6b user: Nadeem Vawda date: Sun Feb 12 01:34:18 2012 +0200 summary: Add section on bz2 module to whatsnew/3.3. files: Doc/whatsnew/3.3.rst | 22 ++++++++++++++++++++++ 1 files changed, 22 insertions(+), 0 deletions(-) diff --git a/Doc/whatsnew/3.3.rst b/Doc/whatsnew/3.3.rst --- a/Doc/whatsnew/3.3.rst +++ b/Doc/whatsnew/3.3.rst @@ -326,6 +326,28 @@ (Contributed by Oren Tirosh and Hirokazu Yamamoto in :issue:`1172711`) +bz2 +--- + +The :mod:`bz2` module has been rewritten from scratch. In the process, several +new features have been added: + +* :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 ------ -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Feb 12 01:02:39 2012 From: python-checkins at python.org (nadeem.vawda) Date: Sun, 12 Feb 2012 01:02:39 +0100 Subject: [Python-checkins] =?utf8?q?cpython=3A_Fix_seekable=28=29_in_BZ2Fi?= =?utf8?q?le_and_LZMAFile_to_check_whether_the_underlying_file?= Message-ID: http://hg.python.org/cpython/rev/444eb9789cae changeset: 74877:444eb9789cae user: Nadeem Vawda date: Sun Feb 12 01:51:38 2012 +0200 summary: Fix seekable() in BZ2File and LZMAFile to check whether the underlying file supports seek(). files: Lib/bz2.py | 7 +++++-- Lib/lzma.py | 7 +++++-- Lib/test/test_bz2.py | 9 +++++++++ Lib/test/test_lzma.py | 9 +++++++++ 4 files changed, 28 insertions(+), 4 deletions(-) diff --git a/Lib/bz2.py b/Lib/bz2.py --- a/Lib/bz2.py +++ b/Lib/bz2.py @@ -138,7 +138,7 @@ def seekable(self): """Return whether the file supports seeking.""" - return self.readable() + return self.readable() and self._fp.seekable() def readable(self): """Return whether the file was opened for reading.""" @@ -165,9 +165,12 @@ raise io.UnsupportedOperation("File not open for writing") def _check_can_seek(self): - if not self.seekable(): + 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): diff --git a/Lib/lzma.py b/Lib/lzma.py --- a/Lib/lzma.py +++ b/Lib/lzma.py @@ -165,7 +165,7 @@ def seekable(self): """Return whether the file supports seeking.""" - return self.readable() + return self.readable() and self._fp.seekable() def readable(self): """Return whether the file was opened for reading.""" @@ -192,9 +192,12 @@ raise io.UnsupportedOperation("File not open for writing") def _check_can_seek(self): - if not self.seekable(): + 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): diff --git a/Lib/test/test_bz2.py b/Lib/test/test_bz2.py --- a/Lib/test/test_bz2.py +++ b/Lib/test/test_bz2.py @@ -372,6 +372,15 @@ bz2f.close() self.assertRaises(ValueError, bz2f.seekable) + src = BytesIO(self.DATA) + src.seekable = lambda: False + bz2f = BZ2File(fileobj=src) + try: + self.assertFalse(bz2f.seekable()) + finally: + bz2f.close() + self.assertRaises(ValueError, bz2f.seekable) + def testReadable(self): bz2f = BZ2File(fileobj=BytesIO(self.DATA)) try: diff --git a/Lib/test/test_lzma.py b/Lib/test/test_lzma.py --- a/Lib/test/test_lzma.py +++ b/Lib/test/test_lzma.py @@ -525,6 +525,15 @@ f.close() self.assertRaises(ValueError, f.seekable) + src = BytesIO(COMPRESSED_XZ) + src.seekable = lambda: False + f = LZMAFile(fileobj=src) + try: + self.assertFalse(f.seekable()) + finally: + f.close() + self.assertRaises(ValueError, f.seekable) + def test_readable(self): f = LZMAFile(fileobj=BytesIO(COMPRESSED_XZ)) try: -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Feb 12 02:15:46 2012 From: python-checkins at python.org (antoine.pitrou) Date: Sun, 12 Feb 2012 02:15:46 +0100 Subject: [Python-checkins] =?utf8?q?cpython=3A_What=27s_new_typo?= Message-ID: http://hg.python.org/cpython/rev/f2323ee5d6c7 changeset: 74878:f2323ee5d6c7 user: Antoine Pitrou date: Sun Feb 12 02:12:47 2012 +0100 summary: What's new typo files: Doc/whatsnew/3.3.rst | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Doc/whatsnew/3.3.rst b/Doc/whatsnew/3.3.rst --- a/Doc/whatsnew/3.3.rst +++ b/Doc/whatsnew/3.3.rst @@ -351,7 +351,7 @@ codecs ------ -The :mod:`~encodings.mbcs` codec has be rewritten to handle correctly +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. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Feb 12 04:44:54 2012 From: python-checkins at python.org (eric.araujo) Date: Sun, 12 Feb 2012 04:44:54 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=282=2E7=29=3A_Fix_distutils?= =?utf8?q?=2Efilelist=2EFileList_under_Windows_=28=2313193=29=2E?= Message-ID: http://hg.python.org/cpython/rev/c566a3447ba1 changeset: 74879:c566a3447ba1 branch: 2.7 parent: 74871:6240ff5dfebe user: ?ric Araujo date: Sun Feb 12 04:41:36 2012 +0100 summary: Fix distutils.filelist.FileList under Windows (#13193). The code used to call os.path.join to build a regex but without escaping the backslash, which lead to test failures on Windows. Antoine Pitrou fixed it in 557a973709de by enhancing the code to accept both / and \, with proper escaping, but in my opinion this goes against the distutils feature freeze, hence this change. files: Lib/distutils/filelist.py | 6 ++---- Misc/NEWS | 3 +-- 2 files changed, 3 insertions(+), 6 deletions(-) diff --git a/Lib/distutils/filelist.py b/Lib/distutils/filelist.py --- a/Lib/distutils/filelist.py +++ b/Lib/distutils/filelist.py @@ -328,10 +328,8 @@ # ditch end of pattern character empty_pattern = glob_to_re('') prefix_re = glob_to_re(prefix)[:-len(empty_pattern)] - # match both path separators, as in Postel's principle - sep_pat = "[" + re.escape(os.path.sep + os.path.altsep - if os.path.altsep else os.path.sep) + "]" - pattern_re = "^" + sep_pat.join([prefix_re, ".*" + pattern_re]) + # paths should always use / in manifest templates + pattern_re = "^%s/.*%s" % (prefix_re, pattern_re) else: # no prefix -- respect anchor flag if anchor: pattern_re = "^" + pattern_re diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -210,8 +210,7 @@ - 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. The - "recursive-include" directive now recognizes both legal path separators. +- Issue #13193: Fix distutils.filelist.FileList under Windows. - Issue #13373: multiprocessing.Queue.get() could sometimes block indefinitely when called with a timeout. Patch by Arnaud Ysmal. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Feb 12 05:02:03 2012 From: python-checkins at python.org (eric.araujo) Date: Sun, 12 Feb 2012 05:02:03 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=282=2E7=29=3A_Update_mention_?= =?utf8?q?of_Subversion_repo_in_the_FAQ?= Message-ID: http://hg.python.org/cpython/rev/71faa83b075c changeset: 74880:71faa83b075c branch: 2.7 user: ?ric Araujo date: Sun Feb 12 04:54:43 2012 +0100 summary: Update mention of Subversion repo in the FAQ files: Doc/faq/general.rst | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Doc/faq/general.rst b/Doc/faq/general.rst --- a/Doc/faq/general.rst +++ b/Doc/faq/general.rst @@ -157,7 +157,7 @@ The latest Python source distribution is always available from python.org, at http://www.python.org/download/. The latest development sources can be obtained -via anonymous Subversion at http://svn.python.org/projects/python/trunk. +via anonymous Mercurial access at http://hg.python.org/cpython. The source distribution is a gzipped tar file containing the complete C source, Sphinx-formatted documentation, Python library modules, example programs, and -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Feb 12 05:26:25 2012 From: python-checkins at python.org (eric.araujo) Date: Sun, 12 Feb 2012 05:26:25 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=283=2E2=29=3A_Update_mention_?= =?utf8?q?of_Subversion_in_the_FAQ=2E?= Message-ID: http://hg.python.org/cpython/rev/2167e617db87 changeset: 74881:2167e617db87 branch: 3.2 parent: 74872:4b32309631da user: ?ric Araujo date: Sun Feb 12 04:49:45 2012 +0100 summary: Update mention of Subversion in the FAQ. If I grepped correctly, this was the last outdated place. files: Doc/faq/general.rst | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Doc/faq/general.rst b/Doc/faq/general.rst --- a/Doc/faq/general.rst +++ b/Doc/faq/general.rst @@ -157,7 +157,7 @@ The latest Python source distribution is always available from python.org, at http://www.python.org/download/. The latest development sources can be obtained -via anonymous Subversion at http://svn.python.org/projects/python/trunk. +via anonymous Mercurial access at http://hg.python.org/cpython. The source distribution is a gzipped tar file containing the complete C source, Sphinx-formatted documentation, Python library modules, example programs, and -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Feb 12 05:26:26 2012 From: python-checkins at python.org (eric.araujo) Date: Sun, 12 Feb 2012 05:26:26 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=283=2E2=29=3A_Fix_distutils?= =?utf8?q?=2Efilelist=2EFileList_under_Windows_=28=2313193=29=2E?= Message-ID: http://hg.python.org/cpython/rev/90b30d62caf2 changeset: 74882:90b30d62caf2 branch: 3.2 user: ?ric Araujo date: Sun Feb 12 04:52:21 2012 +0100 summary: Fix distutils.filelist.FileList under Windows (#13193). The code used to call os.path.join to build a regex but without escaping the backslash, which lead to test failures on Windows. Antoine Pitrou fixed it in 0a94e2f807c7 by enhancing the code to accept both / and \, with proper escaping, but in my opinion this goes against the distutils feature freeze, hence this change. files: Lib/distutils/filelist.py | 6 ++---- Misc/NEWS | 3 +-- 2 files changed, 3 insertions(+), 6 deletions(-) diff --git a/Lib/distutils/filelist.py b/Lib/distutils/filelist.py --- a/Lib/distutils/filelist.py +++ b/Lib/distutils/filelist.py @@ -313,10 +313,8 @@ # ditch end of pattern character empty_pattern = glob_to_re('') prefix_re = (glob_to_re(prefix))[:-len(empty_pattern)] - # match both path separators, as in Postel's principle - sep_pat = "[" + re.escape(os.path.sep + os.path.altsep - if os.path.altsep else os.path.sep) + "]" - pattern_re = "^" + sep_pat.join([prefix_re, ".*" + pattern_re]) + # paths should always use / in manifest templates + pattern_re = "^%s/.*%s" % (prefix_re, pattern_re) else: # no prefix -- respect anchor flag if anchor: pattern_re = "^" + pattern_re diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -282,8 +282,7 @@ - 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. The - "recursive-include" directive now recognizes both legal path separators. +- Issue #13193: Fix distutils.filelist.FileList under Windows. - Issue #13384: Remove unnecessary __future__ import in Lib/random.py -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Feb 12 05:26:30 2012 From: python-checkins at python.org (eric.araujo) Date: Sun, 12 Feb 2012 05:26:30 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_3=2E2_-=3E_default=29?= =?utf8?q?=3A_Merge_fixes_for_=2313193_and_FAQ_from_3=2E2?= Message-ID: http://hg.python.org/cpython/rev/68347f8430ec changeset: 74883:68347f8430ec parent: 74878:f2323ee5d6c7 parent: 74882:90b30d62caf2 user: ?ric Araujo date: Sun Feb 12 04:58:46 2012 +0100 summary: Merge fixes for #13193 and FAQ from 3.2 files: Doc/faq/general.rst | 2 +- Lib/distutils/filelist.py | 6 ++---- Misc/NEWS | 4 +--- 3 files changed, 4 insertions(+), 8 deletions(-) diff --git a/Doc/faq/general.rst b/Doc/faq/general.rst --- a/Doc/faq/general.rst +++ b/Doc/faq/general.rst @@ -157,7 +157,7 @@ The latest Python source distribution is always available from python.org, at http://www.python.org/download/. The latest development sources can be obtained -via anonymous Subversion at http://svn.python.org/projects/python/trunk. +via anonymous Mercurial access at http://hg.python.org/cpython. The source distribution is a gzipped tar file containing the complete C source, Sphinx-formatted documentation, Python library modules, example programs, and diff --git a/Lib/distutils/filelist.py b/Lib/distutils/filelist.py --- a/Lib/distutils/filelist.py +++ b/Lib/distutils/filelist.py @@ -313,10 +313,8 @@ # ditch end of pattern character empty_pattern = glob_to_re('') prefix_re = (glob_to_re(prefix))[:-len(empty_pattern)] - # match both path separators, as in Postel's principle - sep_pat = "[" + re.escape(os.path.sep + os.path.altsep - if os.path.altsep else os.path.sep) + "]" - pattern_re = "^" + sep_pat.join([prefix_re, ".*" + pattern_re]) + # paths should always use / in manifest templates + pattern_re = "^%s/.*%s" % (prefix_re, pattern_re) else: # no prefix -- respect anchor flag if anchor: pattern_re = "^" + pattern_re diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -777,9 +777,7 @@ - Issues #1745761, #755670, #13357, #12629, #1200313: HTMLParser now correctly handles non-valid attributes, including adjacent and unquoted attributes. -- Issue #13193: Fix distutils.filelist.FileList and - packaging.manifest.Manifest under Windows. The "recursive-include" - directive now recognizes both legal path separators. +- Issue #13193: Fix distutils.filelist.FileList under Windows. - Issue #13384: Remove unnecessary __future__ import in Lib/random.py -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Feb 12 05:26:33 2012 From: python-checkins at python.org (eric.araujo) Date: Sun, 12 Feb 2012 05:26:33 +0100 Subject: [Python-checkins] =?utf8?q?cpython=3A_Port_the_fix_for_=2313193_t?= =?utf8?q?o_packaging?= Message-ID: http://hg.python.org/cpython/rev/f06effb61cde changeset: 74884:f06effb61cde user: ?ric Araujo date: Sun Feb 12 05:01:42 2012 +0100 summary: Port the fix for #13193 to packaging files: Lib/packaging/manifest.py | 6 ++---- Misc/NEWS | 3 ++- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/Lib/packaging/manifest.py b/Lib/packaging/manifest.py --- a/Lib/packaging/manifest.py +++ b/Lib/packaging/manifest.py @@ -366,10 +366,8 @@ # ditch end of pattern character empty_pattern = _glob_to_re('') prefix_re = _glob_to_re(prefix)[:-len(empty_pattern)] - # match both path separators, as in Postel's principle - sep_pat = "[" + re.escape(os.path.sep + os.path.altsep - if os.path.altsep else os.path.sep) + "]" - pattern_re = "^" + sep_pat.join([prefix_re, ".*" + pattern_re]) + # paths should always use / in manifest templates + pattern_re = "^%s/.*%s" % (prefix_re, pattern_re) else: # no prefix -- respect anchor flag if anchor: pattern_re = "^" + pattern_re diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -777,7 +777,8 @@ - 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 #13193: Fix distutils.filelist.FileList and packaging.manifest.Manifest + under Windows. - Issue #13384: Remove unnecessary __future__ import in Lib/random.py -- Repository URL: http://hg.python.org/cpython From solipsis at pitrou.net Sun Feb 12 05:34:40 2012 From: solipsis at pitrou.net (solipsis at pitrou.net) Date: Sun, 12 Feb 2012 05:34:40 +0100 Subject: [Python-checkins] Daily reference leaks (f2323ee5d6c7): sum=0 Message-ID: results for f2323ee5d6c7 on branch "default" -------------------------------------------- Command line was: ['./python', '-m', 'test.regrtest', '-uall', '-R', '3:3:/home/antoine/cpython/refleaks/reflogDgrJUX', '-x'] From python-checkins at python.org Sun Feb 12 09:52:05 2012 From: python-checkins at python.org (nick.coghlan) Date: Sun, 12 Feb 2012 09:52:05 +0100 Subject: [Python-checkins] =?utf8?q?peps=3A_Add_tracker_reference_for_PEP_?= =?utf8?q?394?= Message-ID: http://hg.python.org/peps/rev/78b94f8648fa changeset: 4051:78b94f8648fa user: Nick Coghlan date: Sun Feb 12 18:51:57 2012 +1000 summary: Add tracker reference for PEP 394 files: pep-0394.txt | 4 +++- 1 files changed, 3 insertions(+), 1 deletions(-) diff --git a/pep-0394.txt b/pep-0394.txt --- a/pep-0394.txt +++ b/pep-0394.txt @@ -165,7 +165,7 @@ As implementation of these features in the default installers does not alter the recommendations in this PEP, the implementation progress is managed on the -tracker as issue . +tracker as issue #12627 [3]. Impact on PYTHON* Environment Variables @@ -198,6 +198,8 @@ [2] Rebooting PEP 394 (aka Support the /usr/bin/python2 symlink upstream) (http://mail.python.org/pipermail/python-dev/2011-July/112322.html) +[3] Implement PEP 394 in the CPython Makefile + (http://bugs.python.org/issue12627) Copyright =========== -- Repository URL: http://hg.python.org/peps From python-checkins at python.org Sun Feb 12 10:15:29 2012 From: python-checkins at python.org (ross.lagerwall) Date: Sun, 12 Feb 2012 10:15:29 +0100 Subject: [Python-checkins] =?utf8?q?cpython=3A_Attempt_to_speed_up_some_su?= =?utf8?q?bprocess_tests_=28and_hopefully_keep_them_reliable=29=2E?= Message-ID: http://hg.python.org/cpython/rev/834650d63130 changeset: 74885:834650d63130 parent: 74850:0fc10a33eb4c user: Ross Lagerwall date: Sun Feb 12 09:01:30 2012 +0200 summary: Attempt to speed up some subprocess tests (and hopefully keep them reliable). files: Lib/test/test_subprocess.py | 45 +++++++++++------------- 1 files changed, 21 insertions(+), 24 deletions(-) diff --git a/Lib/test/test_subprocess.py b/Lib/test/test_subprocess.py --- a/Lib/test/test_subprocess.py +++ b/Lib/test/test_subprocess.py @@ -686,26 +686,19 @@ 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(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) @@ -797,25 +790,29 @@ 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() -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Feb 12 10:15:29 2012 From: python-checkins at python.org (ross.lagerwall) Date: Sun, 12 Feb 2012 10:15:29 +0100 Subject: [Python-checkins] =?utf8?q?cpython=3A_Fix_a_typo=2E?= Message-ID: http://hg.python.org/cpython/rev/b27a28a30612 changeset: 74886:b27a28a30612 user: Ross Lagerwall date: Sun Feb 12 09:02:01 2012 +0200 summary: Fix a typo. files: Lib/test/test_subprocess.py | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Lib/test/test_subprocess.py b/Lib/test/test_subprocess.py --- a/Lib/test/test_subprocess.py +++ b/Lib/test/test_subprocess.py @@ -471,7 +471,7 @@ self.assertStderrEqual(stderr.encode(), b"pineapple\npear\n") def test_communicate_timeout_large_ouput(self): - # Test a expring timeout while the child is outputting lots of data. + # 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));' -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Feb 12 10:15:30 2012 From: python-checkins at python.org (ross.lagerwall) Date: Sun, 12 Feb 2012 10:15:30 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_default_-=3E_default?= =?utf8?q?=29=3A_Merge_with_remote=2E?= Message-ID: http://hg.python.org/cpython/rev/29dbd42970ff changeset: 74887:29dbd42970ff parent: 74886:b27a28a30612 parent: 74884:f06effb61cde user: Ross Lagerwall date: Sun Feb 12 11:13:06 2012 +0200 summary: Merge with remote. files: Doc/extending/extending.rst | 2 +- Doc/faq/general.rst | 2 +- Doc/library/gzip.rst | 8 +- Doc/library/os.rst | 4 +- Doc/whatsnew/3.3.rst | 24 +- Lib/bz2.py | 7 +- Lib/distutils/filelist.py | 6 +- Lib/distutils/sysconfig.py | 33 +- Lib/gzip.py | 20 +- Lib/html/parser.py | 25 +- Lib/importlib/_bootstrap.py | 5 +- Lib/lzma.py | 7 +- Lib/packaging/command/__init__.py | 48 +- Lib/packaging/command/bdist_msi.py | 5 +- Lib/packaging/command/bdist_wininst.py | 2 +- Lib/packaging/command/build.py | 6 +- Lib/packaging/command/install_dist.py | 2 +- Lib/packaging/compat.py | 19 +- Lib/packaging/compiler/cygwinccompiler.py | 4 + Lib/packaging/manifest.py | 6 +- Lib/packaging/markers.py | 12 +- Lib/packaging/pypi/simple.py | 4 +- Lib/packaging/run.py | 9 +- Lib/packaging/tests/fixer/fix_echo.py | 16 + Lib/packaging/tests/fixer/fix_echo2.py | 16 + Lib/packaging/tests/fixer/fix_idioms.py | 134 ----- Lib/packaging/tests/support.py | 41 +- Lib/packaging/tests/test_command_build.py | 5 +- Lib/packaging/tests/test_markers.py | 10 +- Lib/packaging/tests/test_mixin2to3.py | 92 ++- Lib/packaging/tests/test_run.py | 17 + Lib/packaging/util.py | 20 +- Lib/test/test_bz2.py | 9 + Lib/test/test_htmlparser.py | 30 + Lib/test/test_lzma.py | 9 + Lib/xml/etree/cElementTree.py | 150 ++++++ Misc/NEWS | 26 +- Modules/_elementtree.c | 234 +--------- Objects/exceptions.c | 2 +- 39 files changed, 528 insertions(+), 543 deletions(-) diff --git a/Doc/extending/extending.rst b/Doc/extending/extending.rst --- a/Doc/extending/extending.rst +++ b/Doc/extending/extending.rst @@ -321,7 +321,7 @@ 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. diff --git a/Doc/faq/general.rst b/Doc/faq/general.rst --- a/Doc/faq/general.rst +++ b/Doc/faq/general.rst @@ -157,7 +157,7 @@ The latest Python source distribution is always available from python.org, at http://www.python.org/download/. The latest development sources can be obtained -via anonymous Subversion at http://svn.python.org/projects/python/trunk. +via anonymous Mercurial access at http://hg.python.org/cpython. The source distribution is a gzipped tar file containing the complete C source, Sphinx-formatted documentation, Python library modules, example programs, and diff --git a/Doc/library/gzip.rst b/Doc/library/gzip.rst --- a/Doc/library/gzip.rst +++ b/Doc/library/gzip.rst @@ -44,9 +44,11 @@ The *mode* argument can be any of ``'r'``, ``'rb'``, ``'a'``, ``'ab'``, ``'w'``, 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'``. If - not given, the 'b' flag will be added to the mode to ensure the file is opened - in binary mode for cross-platform portability. + 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`. The *compresslevel* argument is an integer from ``1`` to ``9`` controlling the level of compression; ``1`` is fastest and produces the least compression, and diff --git a/Doc/library/os.rst b/Doc/library/os.rst --- a/Doc/library/os.rst +++ b/Doc/library/os.rst @@ -2294,8 +2294,8 @@ single: directory; walking single: directory; traversal - This behaves exactly like :func:`walk`, except that it yields a 4-tuple - ``(dirpath, dirnames, filenames, dirfd)``. + This behaves exactly like :func:`walk`, except that it yields a 4-tuple + ``(dirpath, dirnames, filenames, dirfd)``. *dirpath*, *dirnames* and *filenames* are identical to :func:`walk` output, and *dirfd* is a file descriptor referring to the directory *dirpath*. diff --git a/Doc/whatsnew/3.3.rst b/Doc/whatsnew/3.3.rst --- a/Doc/whatsnew/3.3.rst +++ b/Doc/whatsnew/3.3.rst @@ -326,10 +326,32 @@ (Contributed by Oren Tirosh and Hirokazu Yamamoto in :issue:`1172711`) +bz2 +--- + +The :mod:`bz2` module has been rewritten from scratch. In the process, several +new features have been added: + +* :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 be rewritten to handle correclty +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. diff --git a/Lib/bz2.py b/Lib/bz2.py --- a/Lib/bz2.py +++ b/Lib/bz2.py @@ -138,7 +138,7 @@ def seekable(self): """Return whether the file supports seeking.""" - return self.readable() + return self.readable() and self._fp.seekable() def readable(self): """Return whether the file was opened for reading.""" @@ -165,9 +165,12 @@ raise io.UnsupportedOperation("File not open for writing") def _check_can_seek(self): - if not self.seekable(): + 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): diff --git a/Lib/distutils/filelist.py b/Lib/distutils/filelist.py --- a/Lib/distutils/filelist.py +++ b/Lib/distutils/filelist.py @@ -313,10 +313,8 @@ # ditch end of pattern character empty_pattern = glob_to_re('') prefix_re = (glob_to_re(prefix))[:-len(empty_pattern)] - # match both path separators, as in Postel's principle - sep_pat = "[" + re.escape(os.path.sep + os.path.altsep - if os.path.altsep else os.path.sep) + "]" - pattern_re = "^" + sep_pat.join([prefix_re, ".*" + pattern_re]) + # paths should always use / in manifest templates + pattern_re = "^%s/.*%s" % (prefix_re, pattern_re) else: # no prefix -- respect anchor flag if anchor: pattern_re = "^" + pattern_re diff --git a/Lib/distutils/sysconfig.py b/Lib/distutils/sysconfig.py --- a/Lib/distutils/sysconfig.py +++ b/Lib/distutils/sysconfig.py @@ -146,6 +146,7 @@ "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. @@ -158,8 +159,38 @@ get_config_vars('CC', 'CXX', 'OPT', 'CFLAGS', 'CCSHARED', 'LDSHARED', 'SO', 'AR', 'ARFLAGS') + newcc = None if 'CC' in os.environ: - cc = os.environ['CC'] + 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 if 'CXX' in os.environ: cxx = os.environ['CXX'] if 'LDSHARED' in os.environ: diff --git a/Lib/gzip.py b/Lib/gzip.py --- a/Lib/gzip.py +++ b/Lib/gzip.py @@ -93,6 +93,9 @@ """The GzipFile class simulates most of the methods of a file object with 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. + """ myfileobj = None @@ -119,8 +122,8 @@ The mode argument can be any of 'r', 'rb', 'a', 'ab', 'w', 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'. - Be aware that only the 'rb', 'ab', and 'wb' values should be used - for cross-platform portability. + A mode of 'r' is equivalent to one of 'rb', and similarly for 'w' and + 'wb', and 'a' and 'ab'. The compresslevel argument is an integer from 1 to 9 controlling the level of compression; 1 is fastest and produces the least compression, @@ -137,8 +140,8 @@ """ - # guarantee the file is opened in binary mode on platforms - # that care about that sort of thing + if mode and ('t' in mode or 'U' in mode): + raise ValueError("Invalid mode: {!r}".format(mode)) if mode and 'b' not in mode: mode += 'b' if fileobj is None: @@ -149,10 +152,9 @@ else: 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 @@ -167,7 +169,7 @@ 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, @@ -176,7 +178,7 @@ 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 diff --git a/Lib/html/parser.py b/Lib/html/parser.py --- a/Lib/html/parser.py +++ b/Lib/html/parser.py @@ -184,7 +184,17 @@ elif startswith(" or + # . When strict is True an + # error is raised, when it's False they will be considered + # as bogus comments and parsed (see parse_bogus_comment). + if self.strict: + k = self.parse_declaration(i) + else: + try: + k = self.parse_declaration(i) + except HTMLParseError: + k = self.parse_bogus_comment(i) elif (i + 1) < n: self.handle_data("<") k = i + 1 @@ -256,6 +266,19 @@ i = self.updatepos(i, n) self.rawdata = rawdata[i:] + # Internal -- parse bogus comment, return length or -1 if not terminated + # 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] != '', i+2) + if pos == -1: + return -1 + if report: + self.handle_comment(rawdata[i+2:pos]) + return pos + 1 + # Internal -- parse processing instr, return end or -1 if not terminated def parse_pi(self, i): rawdata = self.rawdata diff --git a/Lib/importlib/_bootstrap.py b/Lib/importlib/_bootstrap.py --- a/Lib/importlib/_bootstrap.py +++ b/Lib/importlib/_bootstrap.py @@ -36,10 +36,7 @@ b'PYTHONCASEOK' not in _os.environ): if not directory: directory = '.' - if check in _os.listdir(directory): - return True - else: - return False + return check in _os.listdir(directory) else: return True diff --git a/Lib/lzma.py b/Lib/lzma.py --- a/Lib/lzma.py +++ b/Lib/lzma.py @@ -165,7 +165,7 @@ def seekable(self): """Return whether the file supports seeking.""" - return self.readable() + return self.readable() and self._fp.seekable() def readable(self): """Return whether the file was opened for reading.""" @@ -192,9 +192,12 @@ raise io.UnsupportedOperation("File not open for writing") def _check_can_seek(self): - if not self.seekable(): + 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): diff --git a/Lib/packaging/command/__init__.py b/Lib/packaging/command/__init__.py --- a/Lib/packaging/command/__init__.py +++ b/Lib/packaging/command/__init__.py @@ -6,38 +6,28 @@ __all__ = ['get_command_names', 'set_command', 'get_command_class', 'STANDARD_COMMANDS'] -_COMMANDS = { - 'check': 'packaging.command.check.check', - 'test': 'packaging.command.test.test', - 'build': 'packaging.command.build.build', - 'build_py': 'packaging.command.build_py.build_py', - 'build_ext': 'packaging.command.build_ext.build_ext', - 'build_clib': 'packaging.command.build_clib.build_clib', - 'build_scripts': 'packaging.command.build_scripts.build_scripts', - 'clean': 'packaging.command.clean.clean', - 'install_dist': 'packaging.command.install_dist.install_dist', - 'install_lib': 'packaging.command.install_lib.install_lib', - 'install_headers': 'packaging.command.install_headers.install_headers', - 'install_scripts': 'packaging.command.install_scripts.install_scripts', - 'install_data': 'packaging.command.install_data.install_data', - 'install_distinfo': - 'packaging.command.install_distinfo.install_distinfo', - 'sdist': 'packaging.command.sdist.sdist', - 'bdist': 'packaging.command.bdist.bdist', - 'bdist_dumb': 'packaging.command.bdist_dumb.bdist_dumb', - 'bdist_wininst': 'packaging.command.bdist_wininst.bdist_wininst', - 'register': 'packaging.command.register.register', - 'upload': 'packaging.command.upload.upload', - 'upload_docs': 'packaging.command.upload_docs.upload_docs', -} -# XXX this is crappy +STANDARD_COMMANDS = [ + # packaging + 'check', 'test', + # building + 'build', 'build_py', 'build_ext', 'build_clib', 'build_scripts', 'clean', + # installing + 'install_dist', 'install_lib', 'install_headers', 'install_scripts', + 'install_data', 'install_distinfo', + # distributing + 'sdist', 'bdist', 'bdist_dumb', 'bdist_wininst', + 'register', 'upload', 'upload_docs', + ] + if os.name == 'nt': - _COMMANDS['bdist_msi'] = 'packaging.command.bdist_msi.bdist_msi' + STANDARD_COMMANDS.insert(STANDARD_COMMANDS.index('bdist_wininst'), + 'bdist_msi') -# XXX use OrderedDict to preserve the grouping (build-related, install-related, -# distribution-related) -STANDARD_COMMANDS = set(_COMMANDS) +# XXX maybe we need more than one registry, so that --list-comands can display +# standard, custom and overriden standard commands differently +_COMMANDS = dict((name, 'packaging.command.%s.%s' % (name, name)) + for name in STANDARD_COMMANDS) def get_command_names(): diff --git a/Lib/packaging/command/bdist_msi.py b/Lib/packaging/command/bdist_msi.py --- a/Lib/packaging/command/bdist_msi.py +++ b/Lib/packaging/command/bdist_msi.py @@ -7,9 +7,8 @@ import os import msilib - +from shutil import rmtree from sysconfig import get_python_version -from shutil import rmtree from packaging.command.cmd import Command from packaging.version import NormalizedVersion from packaging.errors import PackagingOptionError @@ -204,7 +203,7 @@ target_version = self.target_version if not target_version: assert self.skip_build, "Should have already checked this" - target_version = sys.version[0:3] + target_version = '%s.%s' % sys.version_info[:2] plat_specifier = ".%s-%s" % (self.plat_name, target_version) build = self.get_finalized_command('build') build.build_lib = os.path.join(build.build_base, diff --git a/Lib/packaging/command/bdist_wininst.py b/Lib/packaging/command/bdist_wininst.py --- a/Lib/packaging/command/bdist_wininst.py +++ b/Lib/packaging/command/bdist_wininst.py @@ -136,7 +136,7 @@ target_version = self.target_version if not target_version: assert self.skip_build, "Should have already checked this" - target_version = sys.version[0:3] + target_version = '%s.%s' % sys.version_info[:2] plat_specifier = ".%s-%s" % (self.plat_name, target_version) build = self.get_finalized_command('build') build.build_lib = os.path.join(build.build_base, diff --git a/Lib/packaging/command/build.py b/Lib/packaging/command/build.py --- a/Lib/packaging/command/build.py +++ b/Lib/packaging/command/build.py @@ -82,8 +82,8 @@ raise PackagingOptionError( "--plat-name only supported on Windows (try " "using './configure --help' on your platform)") - - plat_specifier = ".%s-%s" % (self.plat_name, sys.version[0:3]) + pyversion = '%s.%s' % sys.version_info[:2] + plat_specifier = ".%s-%s" % (self.plat_name, pyversion) # Make it so Python 2.x and Python 2.x with --with-pydebug don't # share the same build directories. Doing so confuses the build @@ -116,7 +116,7 @@ 'temp' + plat_specifier) if self.build_scripts is None: self.build_scripts = os.path.join(self.build_base, - 'scripts-' + sys.version[0:3]) + 'scripts-' + pyversion) if self.executable is None: self.executable = os.path.normpath(sys.executable) diff --git a/Lib/packaging/command/install_dist.py b/Lib/packaging/command/install_dist.py --- a/Lib/packaging/command/install_dist.py +++ b/Lib/packaging/command/install_dist.py @@ -242,7 +242,7 @@ # $platbase in the other installation directories and not worry # about needing recursive variable expansion (shudder). - py_version = sys.version.split()[0] + py_version = '%s.%s' % sys.version_info[:2] prefix, exec_prefix, srcdir, projectbase = get_config_vars( 'prefix', 'exec_prefix', 'srcdir', 'projectbase') diff --git a/Lib/packaging/compat.py b/Lib/packaging/compat.py --- a/Lib/packaging/compat.py +++ b/Lib/packaging/compat.py @@ -1,4 +1,4 @@ -"""Compatibility helpers.""" +"""Support for build-time 2to3 conversion.""" from packaging import logger @@ -25,7 +25,7 @@ """ if _CONVERT: - def _run_2to3(self, files, doctests=[], fixers=[]): + def _run_2to3(self, files=[], doctests=[], fixers=[]): """ Takes a list of files and doctests, and performs conversion on those. - First, the files which contain the code(`files`) are converted. @@ -35,17 +35,16 @@ if fixers: self.fixer_names = fixers - logger.info('converting Python code') - _KLASS.run_2to3(self, files) + if files: + logger.info('converting Python code and doctests') + _KLASS.run_2to3(self, files) + _KLASS.run_2to3(self, files, doctests_only=True) - logger.info('converting doctests in Python files') - _KLASS.run_2to3(self, files, doctests_only=True) - - if doctests != []: - logger.info('converting doctest in text files') + if doctests: + logger.info('converting doctests in text files') _KLASS.run_2to3(self, doctests, doctests_only=True) else: # If run on Python 2.x, there is nothing to do. - def _run_2to3(self, files, doctests=[], fixers=[]): + def _run_2to3(self, files=[], doctests=[], fixers=[]): pass diff --git a/Lib/packaging/compiler/cygwinccompiler.py b/Lib/packaging/compiler/cygwinccompiler.py --- a/Lib/packaging/compiler/cygwinccompiler.py +++ b/Lib/packaging/compiler/cygwinccompiler.py @@ -56,6 +56,10 @@ from packaging.util import get_compiler_versions import sysconfig +# TODO use platform instead of sys.version +# (platform does unholy sys.version parsing too, but at least it gives other +# VMs a chance to override the returned values) + def get_msvcr(): """Include the appropriate MSVC runtime library if Python was built diff --git a/Lib/packaging/manifest.py b/Lib/packaging/manifest.py --- a/Lib/packaging/manifest.py +++ b/Lib/packaging/manifest.py @@ -366,10 +366,8 @@ # ditch end of pattern character empty_pattern = _glob_to_re('') prefix_re = _glob_to_re(prefix)[:-len(empty_pattern)] - # match both path separators, as in Postel's principle - sep_pat = "[" + re.escape(os.path.sep + os.path.altsep - if os.path.altsep else os.path.sep) + "]" - pattern_re = "^" + sep_pat.join([prefix_re, ".*" + pattern_re]) + # paths should always use / in manifest templates + pattern_re = "^%s/.*%s" % (prefix_re, pattern_re) else: # no prefix -- respect anchor flag if anchor: pattern_re = "^" + pattern_re diff --git a/Lib/packaging/markers.py b/Lib/packaging/markers.py --- a/Lib/packaging/markers.py +++ b/Lib/packaging/markers.py @@ -1,11 +1,10 @@ """Parser for the environment markers micro-language defined in PEP 345.""" +import os import sys import platform -import os - +from io import BytesIO from tokenize import tokenize, NAME, OP, STRING, ENDMARKER, ENCODING -from io import BytesIO __all__ = ['interpret'] @@ -27,12 +26,15 @@ # restricted set of variables _VARS = {'sys.platform': sys.platform, - 'python_version': sys.version[:3], + 'python_version': '%s.%s' % sys.version_info[:2], + # FIXME parsing sys.platform is not reliable, but there is no other + # way to get e.g. 2.7.2+, and the PEP is defined with sys.version 'python_full_version': sys.version.split(' ', 1)[0], 'os.name': os.name, 'platform.version': platform.version(), 'platform.machine': platform.machine(), - 'platform.python_implementation': platform.python_implementation()} + 'platform.python_implementation': platform.python_implementation(), + } class _Operation: diff --git a/Lib/packaging/pypi/simple.py b/Lib/packaging/pypi/simple.py --- a/Lib/packaging/pypi/simple.py +++ b/Lib/packaging/pypi/simple.py @@ -35,8 +35,8 @@ DEFAULT_SIMPLE_INDEX_URL = "http://a.pypi.python.org/simple/" DEFAULT_HOSTS = ("*",) SOCKET_TIMEOUT = 15 -USER_AGENT = "Python-urllib/%s packaging/%s" % ( - sys.version[:3], packaging_version) +USER_AGENT = "Python-urllib/%s.%s packaging/%s" % ( + sys.version_info[0], sys.version_info[1], packaging_version) # -- Regexps ------------------------------------------------- EGG_FRAGMENT = re.compile(r'^egg=([-A-Za-z0-9_.]+)$') diff --git a/Lib/packaging/run.py b/Lib/packaging/run.py --- a/Lib/packaging/run.py +++ b/Lib/packaging/run.py @@ -254,16 +254,13 @@ parser = dispatcher.parser args = args[1:] - commands = STANDARD_COMMANDS # + extra commands + commands = STANDARD_COMMANDS # FIXME display extra commands if args == ['--list-commands']: print('List of available commands:') - cmds = sorted(commands) - - for cmd in cmds: + for cmd in commands: cls = dispatcher.cmdclass.get(cmd) or get_command_class(cmd) - desc = getattr(cls, 'description', - '(no description available)') + desc = getattr(cls, 'description', '(no description available)') print(' %s: %s' % (cmd, desc)) return diff --git a/Lib/packaging/tests/fixer/fix_echo.py b/Lib/packaging/tests/fixer/fix_echo.py new file mode 100644 --- /dev/null +++ b/Lib/packaging/tests/fixer/fix_echo.py @@ -0,0 +1,16 @@ +# Example custom fixer, derived from fix_raw_input by Andre Roberge + +from lib2to3 import fixer_base +from lib2to3.fixer_util import Name + + +class FixEcho(fixer_base.BaseFix): + + BM_compatible = True + PATTERN = """ + power< name='echo' trailer< '(' [any] ')' > any* > + """ + + def transform(self, node, results): + name = results['name'] + name.replace(Name('print', prefix=name.prefix)) diff --git a/Lib/packaging/tests/fixer/fix_echo2.py b/Lib/packaging/tests/fixer/fix_echo2.py new file mode 100644 --- /dev/null +++ b/Lib/packaging/tests/fixer/fix_echo2.py @@ -0,0 +1,16 @@ +# Example custom fixer, derived from fix_raw_input by Andre Roberge + +from lib2to3 import fixer_base +from lib2to3.fixer_util import Name + + +class FixEcho2(fixer_base.BaseFix): + + BM_compatible = True + PATTERN = """ + power< name='echo2' trailer< '(' [any] ')' > any* > + """ + + def transform(self, node, results): + name = results['name'] + name.replace(Name('print', prefix=name.prefix)) diff --git a/Lib/packaging/tests/fixer/fix_idioms.py b/Lib/packaging/tests/fixer/fix_idioms.py deleted file mode 100644 --- a/Lib/packaging/tests/fixer/fix_idioms.py +++ /dev/null @@ -1,134 +0,0 @@ -"""Adjust some old Python 2 idioms to their modern counterparts. - -* Change some type comparisons to isinstance() calls: - type(x) == T -> isinstance(x, T) - type(x) is T -> isinstance(x, T) - type(x) != T -> not isinstance(x, T) - type(x) is not T -> not isinstance(x, T) - -* Change "while 1:" into "while True:". - -* Change both - - v = list(EXPR) - v.sort() - foo(v) - -and the more general - - v = EXPR - v.sort() - foo(v) - -into - - v = sorted(EXPR) - foo(v) -""" -# Author: Jacques Frechet, Collin Winter - -# Local imports -from lib2to3 import fixer_base -from lib2to3.fixer_util import Call, Comma, Name, Node, syms - -CMP = "(n='!=' | '==' | 'is' | n=comp_op< 'is' 'not' >)" -TYPE = "power< 'type' trailer< '(' x=any ')' > >" - -class FixIdioms(fixer_base.BaseFix): - - explicit = False # The user must ask for this fixer - - PATTERN = r""" - isinstance=comparison< %s %s T=any > - | - isinstance=comparison< T=any %s %s > - | - while_stmt< 'while' while='1' ':' any+ > - | - sorted=any< - any* - simple_stmt< - expr_stmt< id1=any '=' - power< list='list' trailer< '(' (not arglist) any ')' > > - > - '\n' - > - sort= - simple_stmt< - power< id2=any - trailer< '.' 'sort' > trailer< '(' ')' > - > - '\n' - > - next=any* - > - | - sorted=any< - any* - simple_stmt< expr_stmt< id1=any '=' expr=any > '\n' > - sort= - simple_stmt< - power< id2=any - trailer< '.' 'sort' > trailer< '(' ')' > - > - '\n' - > - next=any* - > - """ % (TYPE, CMP, CMP, TYPE) - - def match(self, node): - r = super(FixIdioms, self).match(node) - # If we've matched one of the sort/sorted subpatterns above, we - # want to reject matches where the initial assignment and the - # subsequent .sort() call involve different identifiers. - if r and "sorted" in r: - if r["id1"] == r["id2"]: - return r - return None - return r - - def transform(self, node, results): - if "isinstance" in results: - return self.transform_isinstance(node, results) - elif "while" in results: - return self.transform_while(node, results) - elif "sorted" in results: - return self.transform_sort(node, results) - else: - raise RuntimeError("Invalid match") - - def transform_isinstance(self, node, results): - x = results["x"].clone() # The thing inside of type() - T = results["T"].clone() # The type being compared against - x.prefix = "" - T.prefix = " " - test = Call(Name("isinstance"), [x, Comma(), T]) - if "n" in results: - test.prefix = " " - test = Node(syms.not_test, [Name("not"), test]) - test.prefix = node.prefix - return test - - def transform_while(self, node, results): - one = results["while"] - one.replace(Name("True", prefix=one.prefix)) - - def transform_sort(self, node, results): - sort_stmt = results["sort"] - next_stmt = results["next"] - list_call = results.get("list") - simple_expr = results.get("expr") - - if list_call: - list_call.replace(Name("sorted", prefix=list_call.prefix)) - elif simple_expr: - new = simple_expr.clone() - new.prefix = "" - simple_expr.replace(Call(Name("sorted"), [new], - prefix=simple_expr.prefix)) - else: - raise RuntimeError("should not have reached here") - sort_stmt.remove() - if next_stmt: - next_stmt[0].prefix = sort_stmt._prefix diff --git a/Lib/packaging/tests/support.py b/Lib/packaging/tests/support.py --- a/Lib/packaging/tests/support.py +++ b/Lib/packaging/tests/support.py @@ -56,8 +56,9 @@ # misc. functions and decorators 'fake_dec', 'create_distribution', 'use_command', 'copy_xxmodule_c', 'fixup_build_ext', + 'skip_2to3_optimize', # imported from this module for backport purposes - 'unittest', 'requires_zlib', 'skip_2to3_optimize', 'skip_unless_symlink', + 'unittest', 'requires_zlib', 'skip_unless_symlink', ] @@ -332,22 +333,18 @@ """ filename = _get_xxmodule_path() if filename is None: - raise unittest.SkipTest('cannot find xxmodule.c (test must run in ' - 'the python build dir)') + raise unittest.SkipTest('cannot find xxmodule.c') shutil.copy(filename, directory) def _get_xxmodule_path(): - srcdir = sysconfig.get_config_var('srcdir') - candidates = [ - # use installed copy if available - os.path.join(os.path.dirname(__file__), 'xxmodule.c'), - # otherwise try using copy from build directory - os.path.join(srcdir, 'Modules', 'xxmodule.c'), - ] - for path in candidates: - if os.path.exists(path): - return path + if sysconfig.is_python_build(): + srcdir = sysconfig.get_config_var('projectbase') + path = os.path.join(os.getcwd(), srcdir, 'Modules', 'xxmodule.c') + else: + os.path.join(os.path.dirname(__file__), 'xxmodule.c') + if os.path.exists(path): + return path def fixup_build_ext(cmd): @@ -355,20 +352,21 @@ When Python was built with --enable-shared on Unix, -L. is not enough to find libpython.so, because regrtest runs in a tempdir, not in the - source directory where the .so lives. + source directory where the .so lives. (Mac OS X embeds absolute paths + to shared libraries into executables, so the fixup is a no-op on that + platform.) When Python was built with in debug mode on Windows, build_ext commands need their debug attribute set, and it is not done automatically for some reason. - This function handles both of these things. Example use: + This function handles both of these things, and also fixes + cmd.distribution.include_dirs if the running Python is an uninstalled + build. Example use: cmd = build_ext(dist) support.fixup_build_ext(cmd) cmd.ensure_finalized() - - Unlike most other Unix platforms, Mac OS X embeds absolute paths - to shared libraries into executables, so the fixup is not needed there. """ if os.name == 'nt': cmd.debug = sys.executable.endswith('_d.exe') @@ -386,12 +384,17 @@ name, equals, value = runshared.partition('=') cmd.library_dirs = value.split(os.pathsep) + # Allow tests to run with an uninstalled Python + if sysconfig.is_python_build(): + pysrcdir = sysconfig.get_config_var('projectbase') + cmd.distribution.include_dirs.append(os.path.join(pysrcdir, 'Include')) + + try: from test.support import skip_unless_symlink except ImportError: skip_unless_symlink = unittest.skip( 'requires test.support.skip_unless_symlink') - skip_2to3_optimize = unittest.skipIf(sys.flags.optimize, "2to3 doesn't work under -O") diff --git a/Lib/packaging/tests/test_command_build.py b/Lib/packaging/tests/test_command_build.py --- a/Lib/packaging/tests/test_command_build.py +++ b/Lib/packaging/tests/test_command_build.py @@ -26,7 +26,8 @@ # build_platlib is 'build/lib.platform-x.x[-pydebug]' # examples: # build/lib.macosx-10.3-i386-2.7 - plat_spec = '.%s-%s' % (cmd.plat_name, sys.version[0:3]) + pyversion = '%s.%s' % sys.version_info[:2] + plat_spec = '.%s-%s' % (cmd.plat_name, pyversion) if hasattr(sys, 'gettotalrefcount'): self.assertTrue(cmd.build_platlib.endswith('-pydebug')) plat_spec += '-pydebug' @@ -41,7 +42,7 @@ self.assertEqual(cmd.build_temp, wanted) # build_scripts is build/scripts-x.x - wanted = os.path.join(cmd.build_base, 'scripts-' + sys.version[0:3]) + wanted = os.path.join(cmd.build_base, 'scripts-' + pyversion) self.assertEqual(cmd.build_scripts, wanted) # executable is os.path.normpath(sys.executable) diff --git a/Lib/packaging/tests/test_markers.py b/Lib/packaging/tests/test_markers.py --- a/Lib/packaging/tests/test_markers.py +++ b/Lib/packaging/tests/test_markers.py @@ -21,8 +21,6 @@ self.assertTrue(interpret("sys.platform == '%s'" % sys_platform)) self.assertTrue(interpret( - "sys.platform == '%s' or python_version == '2.4'" % sys_platform)) - self.assertTrue(interpret( "sys.platform == '%s' and python_full_version == '%s'" % (sys_platform, version))) self.assertTrue(interpret("'%s' == sys.platform" % sys_platform)) @@ -41,12 +39,18 @@ # combined operations OP = 'os.name == "%s"' % os_name + FALSEOP = 'os.name == "buuuu"' AND = ' and ' OR = ' or ' self.assertTrue(interpret(OP + AND + OP)) self.assertTrue(interpret(OP + AND + OP + AND + OP)) self.assertTrue(interpret(OP + OR + OP)) - self.assertTrue(interpret(OP + OR + OP + OR + OP)) + self.assertTrue(interpret(OP + OR + FALSEOP)) + self.assertTrue(interpret(OP + OR + OP + OR + FALSEOP)) + self.assertTrue(interpret(OP + OR + FALSEOP + OR + FALSEOP)) + self.assertTrue(interpret(FALSEOP + OR + OP)) + self.assertFalse(interpret(FALSEOP + AND + FALSEOP)) + self.assertFalse(interpret(FALSEOP + OR + FALSEOP)) # other operators self.assertTrue(interpret("os.name != 'buuuu'")) diff --git a/Lib/packaging/tests/test_mixin2to3.py b/Lib/packaging/tests/test_mixin2to3.py --- a/Lib/packaging/tests/test_mixin2to3.py +++ b/Lib/packaging/tests/test_mixin2to3.py @@ -8,70 +8,76 @@ support.LoggingCatcher, unittest.TestCase): - @support.skip_2to3_optimize - def test_convert_code_only(self): - # used to check if code gets converted properly. - code = "print 'test'" + def setUp(self): + super(Mixin2to3TestCase, self).setUp() + self.filename = self.mktempfile().name - with self.mktempfile() as fp: - fp.write(code) + def check(self, source, wanted, **kwargs): + source = textwrap.dedent(source) + with open(self.filename, 'w') as fp: + fp.write(source) - mixin2to3 = Mixin2to3() - mixin2to3._run_2to3([fp.name]) - expected = "print('test')" + Mixin2to3()._run_2to3(**kwargs) - with open(fp.name) as fp: + wanted = textwrap.dedent(wanted) + with open(self.filename) as fp: converted = fp.read() + self.assertMultiLineEqual(converted, wanted) - self.assertEqual(expected, converted) - - def test_doctests_only(self): - # used to check if doctests gets converted properly. - doctest = textwrap.dedent('''\ + def test_conversion(self): + # check that code and doctests get converted + self.check('''\ """Example docstring. >>> print test test It works. - """''') - - with self.mktempfile() as fp: - fp.write(doctest) - - mixin2to3 = Mixin2to3() - mixin2to3._run_2to3([fp.name]) - expected = textwrap.dedent('''\ + """ + print 'test' + ''', + '''\ """Example docstring. >>> print(test) test It works. - """\n''') + """ + print('test') - with open(fp.name) as fp: - converted = fp.read() + ''', # 2to3 adds a newline here + files=[self.filename]) - self.assertEqual(expected, converted) + def test_doctests_conversion(self): + # check that doctest files are converted + self.check('''\ + Welcome to the doc. + + >>> print test + test + ''', + '''\ + Welcome to the doc. + + >>> print(test) + test + + ''', + doctests=[self.filename]) def test_additional_fixers(self): - # used to check if use_2to3_fixers works - code = 'type(x) is not T' - - with self.mktempfile() as fp: - fp.write(code) - - mixin2to3 = Mixin2to3() - mixin2to3._run_2to3(files=[fp.name], doctests=[fp.name], - fixers=['packaging.tests.fixer']) - - expected = 'not isinstance(x, T)' - - with open(fp.name) as fp: - converted = fp.read() - - self.assertEqual(expected, converted) + # make sure the fixers argument works + self.check("""\ + echo('42') + echo2('oh no') + """, + """\ + print('42') + print('oh no') + """, + files=[self.filename], + fixers=['packaging.tests.fixer']) def test_suite(): diff --git a/Lib/packaging/tests/test_run.py b/Lib/packaging/tests/test_run.py --- a/Lib/packaging/tests/test_run.py +++ b/Lib/packaging/tests/test_run.py @@ -67,6 +67,23 @@ self.assertGreater(out, b'') self.assertEqual(err, b'') + def test_list_commands(self): + status, out, err = assert_python_ok('-m', 'packaging.run', 'run', + '--list-commands') + # check that something is displayed + self.assertEqual(status, 0) + self.assertGreater(out, b'') + self.assertEqual(err, b'') + + # make sure the manual grouping of commands is respected + check_position = out.find(b' check: ') + build_position = out.find(b' build: ') + self.assertTrue(check_position, out) # "out" printed as debugging aid + self.assertTrue(build_position, out) + self.assertLess(check_position, build_position, out) + + # TODO test that custom commands don't break --list-commands + def test_suite(): return unittest.makeSuite(RunTestCase) diff --git a/Lib/packaging/util.py b/Lib/packaging/util.py --- a/Lib/packaging/util.py +++ b/Lib/packaging/util.py @@ -853,13 +853,11 @@ # Make this class local, to delay import of 2to3 from lib2to3.refactor import get_fixers_from_package, RefactoringTool - fixers = [] fixers = get_fixers_from_package('lib2to3.fixes') if fixer_names: for fixername in fixer_names: - fixers.extend(fixer for fixer in - get_fixers_from_package(fixername)) + fixers.extend(get_fixers_from_package(fixername)) r = RefactoringTool(fixers, options=options) r.refactor(files, write=True, doctests_only=doctests_only) @@ -870,21 +868,23 @@ the class variables, or inherit from this class to override how 2to3 is invoked. """ - # provide list of fixers to run. - # defaults to all from lib2to3.fixers + # list of fixers to run; defaults to all implicit from lib2to3.fixers fixer_names = None - - # options dictionary + # dict of options options = None - - # list of fixers to invoke even though they are marked as explicit + # list of extra fixers to invoke explicit = None + # TODO need a better way to add just one fixer from a package + # TODO need a way to exclude individual fixers def run_2to3(self, files, doctests_only=False): """ Issues a call to util.run_2to3. """ return run_2to3(files, doctests_only, self.fixer_names, self.options, self.explicit) + # TODO provide initialize/finalize_options + + RICH_GLOB = re.compile(r'\{([^}]*)\}') _CHECK_RECURSIVE_GLOB = re.compile(r'[^/\\,{]\*\*|\*\*[^/\\,}]') _CHECK_MISMATCH_SET = re.compile(r'^[^{]*\}|\{[^}]*$') @@ -1049,7 +1049,6 @@ SETUP_TEMPLATE = """\ # This script was automatically generated by packaging -import os import codecs from distutils.core import setup try: @@ -1057,6 +1056,7 @@ except ImportError: from configparser import RawConfigParser + %(split_multiline)s %(cfg_to_args)s diff --git a/Lib/test/test_bz2.py b/Lib/test/test_bz2.py --- a/Lib/test/test_bz2.py +++ b/Lib/test/test_bz2.py @@ -372,6 +372,15 @@ bz2f.close() self.assertRaises(ValueError, bz2f.seekable) + src = BytesIO(self.DATA) + src.seekable = lambda: False + bz2f = BZ2File(fileobj=src) + try: + self.assertFalse(bz2f.seekable()) + finally: + bz2f.close() + self.assertRaises(ValueError, bz2f.seekable) + def testReadable(self): bz2f = BZ2File(fileobj=BytesIO(self.DATA)) try: diff --git a/Lib/test/test_htmlparser.py b/Lib/test/test_htmlparser.py --- a/Lib/test/test_htmlparser.py +++ b/Lib/test/test_htmlparser.py @@ -323,6 +323,23 @@ ("endtag", element_lower)], collector=Collector()) + def test_comments(self): + html = ("" + '' + '' + '' + '' + '' + '') + expected = [('comment', " I'm a valid comment "), + ('comment', 'me too!'), + ('comment', '--'), + ('comment', ''), + ('comment', '--I have many hyphens--'), + ('comment', ' I have a > in the middle '), + ('comment', ' and I have -- in the middle! ')] + self._run_check(html, expected) + def test_condcoms(self): html = ('' '' @@ -426,6 +443,19 @@ # see #12888 self.assertEqual(p.unescape('{ ' * 1050), '{ ' * 1050) + def test_broken_comments(self): + html = ('' + '' + '' + '') + expected = [ + ('comment', ' not really a comment '), + ('comment', ' not a comment either --'), + ('comment', ' -- close enough --'), + ('comment', '!! another bogus comment !!!'), + ] + self._run_check(html, expected) + def test_broken_condcoms(self): # these condcoms are missing the '--' after '' html = ('broken condcom' diff --git a/Lib/test/test_lzma.py b/Lib/test/test_lzma.py --- a/Lib/test/test_lzma.py +++ b/Lib/test/test_lzma.py @@ -525,6 +525,15 @@ f.close() self.assertRaises(ValueError, f.seekable) + src = BytesIO(COMPRESSED_XZ) + src.seekable = lambda: False + f = LZMAFile(fileobj=src) + try: + self.assertFalse(f.seekable()) + finally: + f.close() + self.assertRaises(ValueError, f.seekable) + def test_readable(self): f = LZMAFile(fileobj=BytesIO(COMPRESSED_XZ)) try: diff --git a/Lib/xml/etree/cElementTree.py b/Lib/xml/etree/cElementTree.py --- a/Lib/xml/etree/cElementTree.py +++ b/Lib/xml/etree/cElementTree.py @@ -1,3 +1,153 @@ # Wrapper module for _elementtree +from xml.etree.ElementTree import (ElementTree, dump, iselement, QName, + fromstringlist, + tostring, tostringlist, VERSION) +# These ones are not in ElementTree.__all__ +from xml.etree.ElementTree import ElementPath, register_namespace + +# Import the C accelerators: +# Element, SubElement, TreeBuilder, XMLParser, ParseError from _elementtree import * + + +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 + + +# ============================================================================= +# +# Everything below this line can be removed +# after cElementTree is folded behind ElementTree. +# +# ============================================================================= + +from xml.etree.ElementTree import Comment as _Comment, PI as _PI + + +def parse(source, parser=None): + tree = ElementTree() + tree.parse(source, parser) + return tree + + +def XML(text, parser=None): + if not parser: + parser = XMLParser() + parser = XMLParser() + parser.feed(text) + return parser.close() + + +def XMLID(text, parser=None): + tree = XML(text, parser=parser) + ids = {} + for elem in tree.iter(): + id = elem.get('id') + if id: + ids[id] = elem + return tree, ids + + +class CommentProxy: + + def __call__(self, text=None): + element = Element(_Comment) + element.text = text + return element + + def __eq__(self, other): + return _Comment == other + + +class PIProxy: + + def __call__(self, target, text=None): + element = Element(_PI) + element.text = target + if text: + element.text = element.text + ' ' + text + return element + + def __eq__(self, other): + return _PI == other + + +Comment = CommentProxy() +PI = ProcessingInstruction = PIProxy() +del CommentProxy, PIProxy + +# Aliases +fromstring = XML +XMLTreeBuilder = XMLParser diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -466,6 +466,25 @@ Library ------- +- 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 #13921: Undocument and clean up sqlite3.OptimizedUnicode, which is obsolete in Python 3.x. It's now aliased to str for backwards compatibility. @@ -498,7 +517,7 @@ - Issue #10881: Fix test_site failure with OS X framework builds. -- Issue #964437 Make IDLE help window non-modal. +- Issue #964437: Make IDLE help window non-modal. Patch by Guilherme Polo and Roger Serwy. - Issue #13734: Add os.fwalk(), a directory walking function yielding file @@ -758,9 +777,8 @@ - Issues #1745761, #755670, #13357, #12629, #1200313: HTMLParser now correctly handles non-valid attributes, including adjacent and unquoted attributes. -- Issue #13193: Fix distutils.filelist.FileList and - packaging.manifest.Manifest under Windows. The "recursive-include" - directive now recognizes both legal path separators. +- Issue #13193: Fix distutils.filelist.FileList and packaging.manifest.Manifest + under Windows. - Issue #13384: Remove unnecessary __future__ import in Lib/random.py diff --git a/Modules/_elementtree.c b/Modules/_elementtree.c --- a/Modules/_elementtree.c +++ b/Modules/_elementtree.c @@ -94,25 +94,6 @@ #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 @@ -123,7 +104,6 @@ /* 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; @@ -1128,31 +1108,6 @@ } 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; @@ -1260,13 +1215,8 @@ { 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; @@ -1317,13 +1267,8 @@ { 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; @@ -1364,13 +1309,8 @@ 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; @@ -1470,18 +1410,6 @@ {"__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}, - {NULL, NULL} }; @@ -2878,7 +2806,6 @@ {"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} }; @@ -2933,54 +2860,8 @@ 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" + "from copy import deepcopy\n" + "from xml.etree import ElementPath\n" "def iter(node, tag=None):\n" /* helper */ " if tag == '*':\n" @@ -3000,123 +2881,12 @@ " 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(); - elementtree_deepcopy_obj = PyDict_GetItemString(g, "deepcopy"); elementtree_iter_obj = PyDict_GetItemString(g, "iter"); elementtree_itertext_obj = PyDict_GetItemString(g, "itertext"); diff --git a/Objects/exceptions.c b/Objects/exceptions.c --- a/Objects/exceptions.c +++ b/Objects/exceptions.c @@ -2474,7 +2474,7 @@ Py_DECREF(args_tuple); } } - + Py_DECREF(bltinmod); } void -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Feb 12 14:49:32 2012 From: python-checkins at python.org (florent.xicluna) Date: Sun, 12 Feb 2012 14:49:32 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=282=2E7=29=3A_Typo_in_Misc/NE?= =?utf8?b?V1Mu?= Message-ID: http://hg.python.org/cpython/rev/e0c353a43c7d changeset: 74888:e0c353a43c7d branch: 2.7 parent: 74880:71faa83b075c user: Florent Xicluna date: Sun Feb 12 14:49:03 2012 +0100 summary: Typo in Misc/NEWS. files: Misc/NEWS | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -90,7 +90,7 @@ Library ------- -- Issue #13994: Earler partial revert of Distutils enhancements in 2.7 +- Issue #13994: Earlier partial revert of Distutils enhancements in 2.7 has left two versions of customize_compiler, the original in distutils.sysconfig and another copy in distutils.ccompiler, with some parts of distutils calling one and others using the other. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Feb 12 16:55:26 2012 From: python-checkins at python.org (antoine.pitrou) Date: Sun, 12 Feb 2012 16:55:26 +0100 Subject: [Python-checkins] =?utf8?q?benchmarks=3A_Remove_tabs?= Message-ID: http://hg.python.org/benchmarks/rev/c4aa1183dd37 changeset: 155:c4aa1183dd37 user: Antoine Pitrou date: Sun Feb 12 16:42:27 2012 +0100 summary: Remove tabs files: perf.py | 16 ++++++++-------- 1 files changed, 8 insertions(+), 8 deletions(-) diff --git a/perf.py b/perf.py --- a/perf.py +++ b/perf.py @@ -1342,14 +1342,14 @@ def MeasureRietveld(python, options): PYTHONPATH = os.pathsep.join([DJANGO_DIR, - # These paths are lifted from - # lib/google_appengine.appcfg.py. Note that we use - # our own version of Django instead of Appengine's. - Relative("lib/google_appengine"), - Relative("lib/google_appengine/lib/antlr3"), - Relative("lib/google_appengine/lib/webob"), - Relative("lib/google_appengine/lib/yaml/lib"), - Relative("lib/rietveld")]) + # These paths are lifted from + # lib/google_appengine.appcfg.py. Note that we use + # our own version of Django instead of Appengine's. + Relative("lib/google_appengine"), + Relative("lib/google_appengine/lib/antlr3"), + Relative("lib/google_appengine/lib/webob"), + Relative("lib/google_appengine/lib/yaml/lib"), + Relative("lib/rietveld")]) bm_path = Relative("performance/bm_rietveld.py") bm_env = {"PYTHONPATH": PYTHONPATH, "DJANGO_SETTINGS_MODULE": "settings"} -- Repository URL: http://hg.python.org/benchmarks From python-checkins at python.org Sun Feb 12 17:11:25 2012 From: python-checkins at python.org (antoine.pitrou) Date: Sun, 12 Feb 2012 17:11:25 +0100 Subject: [Python-checkins] =?utf8?q?benchmarks=3A_Make_perf=2Epy_3=2Ex-com?= =?utf8?q?patible?= Message-ID: http://hg.python.org/benchmarks/rev/a49e6b66cf50 changeset: 156:a49e6b66cf50 user: Antoine Pitrou date: Sun Feb 12 17:08:26 2012 +0100 summary: Make perf.py 3.x-compatible files: perf.py | 24 ++++++++++++++---------- 1 files changed, 14 insertions(+), 10 deletions(-) diff --git a/perf.py b/perf.py --- a/perf.py +++ b/perf.py @@ -67,7 +67,11 @@ import tempfile import time import threading -import urllib2 +try: + from urllib.request import urlopen + from urllib.error import URLError +except ImportError: + from urllib2 import urlopen, URLError try: import multiprocessing except ImportError: @@ -706,7 +710,7 @@ *args, **kwargs) base_data = benchmark_function(base_python, options, *args, **kwargs) - except subprocess.CalledProcessError, e: + except subprocess.CalledProcessError as e: return BenchmarkError(e) return CompareBenchmarkData(base_data, changed_data, options) @@ -791,8 +795,8 @@ """ tinyurl_api = "http://tinyurl.com/api-create.php?url=" try: - url = urllib2.urlopen(tinyurl_api + url).read() - except urllib2.URLError: + url = urlopen(tinyurl_api + url).read() + except URLError: info("failed to call out to tinyurl.com") return url @@ -851,7 +855,7 @@ def LogCall(command): - command = map(str, command) + command = list(map(str, command)) info("Running %s", " ".join(command)) return command @@ -1050,7 +1054,7 @@ future = MemoryUsageFuture(subproc.pid) stdout, stderr = subproc.communicate() if subproc.returncode != 0: - raise RuntimeError(u"Benchmark died: " + unicode(stderr, 'ascii')) + raise RuntimeError("Benchmark died: " + stderr.decode('latin1')) if track_memory: mem_usage = future.GetMemoryUsage() return stdout, stderr, mem_usage @@ -1181,7 +1185,7 @@ result, err = comparer.communicate() if comparer.returncode != 0: return BenchmarkError("pybench died: " + err) - except subprocess.CalledProcessError, e: + except subprocess.CalledProcessError as e: return BenchmarkError(e) if options.verbose: @@ -1460,7 +1464,7 @@ spitfire_env, extra_args) base_data = MeasureSpitfire(base_python, options, spitfire_env, extra_args) - except subprocess.CalledProcessError, e: + except subprocess.CalledProcessError as e: return str(e) return CompareBenchmarkData(base_data, changed_data, options) @@ -1667,7 +1671,7 @@ command = python + cmd_opts + ["-c", work] mem_usage = [] info("Running `%s` %d times", command, num_loops * 20) - for _ in xrange(num_loops): + for _ in range(num_loops): t0 = time.time() _StartupPython(command, mem_usage, track_memory, inherit_env) _StartupPython(command, mem_usage, track_memory, inherit_env) @@ -1957,7 +1961,7 @@ def _FindAllBenchmarks(namespace): return dict((name[3:].lower(), func) - for (name, func) in sorted(namespace.iteritems()) + for (name, func) in sorted(namespace.items()) if name.startswith("BM_")) BENCH_FUNCS = _FindAllBenchmarks(globals()) -- Repository URL: http://hg.python.org/benchmarks From python-checkins at python.org Sun Feb 12 19:18:12 2012 From: python-checkins at python.org (antoine.pitrou) Date: Sun, 12 Feb 2012 19:18:12 +0100 Subject: [Python-checkins] =?utf8?b?Y3B5dGhvbiAoMy4yKTogSXNzdWUgIzEwMjg3?= =?utf8?q?=3A_nntplib_now_queries_the_server=27s_CAPABILITIES_again_after?= Message-ID: http://hg.python.org/cpython/rev/d789f453387d changeset: 74889:d789f453387d branch: 3.2 parent: 74882:90b30d62caf2 user: Antoine Pitrou date: Sun Feb 12 19:14:17 2012 +0100 summary: 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. files: Lib/nntplib.py | 5 +- Lib/test/test_nntplib.py | 62 +++++++++++++++++++++++++-- Misc/NEWS | 4 + 3 files changed, 65 insertions(+), 6 deletions(-) diff --git a/Lib/nntplib.py b/Lib/nntplib.py --- a/Lib/nntplib.py +++ b/Lib/nntplib.py @@ -364,7 +364,7 @@ self.nntp_implementation = None try: resp, caps = self.capabilities() - except NNTPPermanentError: + except (NNTPPermanentError, NNTPTemporaryError): # Server doesn't support capabilities self._caps = {} else: @@ -941,6 +941,9 @@ resp = self._shortcmd('authinfo pass ' + password) if not resp.startswith('281'): raise NNTPPermanentError(resp) + # Capabilities might have changed after login + self._caps = None + self.getcapabilities() # Attempt to send mode reader if it was requested after login. if self.readermode_afterauth: self._setreadermode() diff --git a/Lib/test/test_nntplib.py b/Lib/test/test_nntplib.py --- a/Lib/test/test_nntplib.py +++ b/Lib/test/test_nntplib.py @@ -374,6 +374,8 @@ self.allow_posting = True self._readline = readline self._push_data = push_data + self._logged_in = False + self._user_sent = False # Our welcome self.handle_welcome() @@ -666,27 +668,56 @@ self.push_lit(self.sample_body) self.push_lit(".") + def handle_AUTHINFO(self, cred_type, data): + if self._logged_in: + self.push_lit('502 Already Logged In') + elif cred_type == 'user': + if self._user_sent: + self.push_lit('482 User Credential Already Sent') + else: + self.push_lit('381 Password Required') + self._user_sent = True + elif cred_type == 'pass': + self.push_lit('281 Login Successful') + self._logged_in = True + else: + raise Exception('Unknown cred type {}'.format(cred_type)) + class NNTPv2Handler(NNTPv1Handler): """A handler for RFC 3977 (NNTP "v2")""" def handle_CAPABILITIES(self): - self.push_lit("""\ + fmt = """\ 101 Capability list: VERSION 2 3 - IMPLEMENTATION INN 2.5.1 - AUTHINFO USER + IMPLEMENTATION INN 2.5.1{} HDR LIST ACTIVE ACTIVE.TIMES DISTRIB.PATS HEADERS NEWSGROUPS OVERVIEW.FMT OVER POST READER - .""") + .""" + + if not self._logged_in: + self.push_lit(fmt.format('\n AUTHINFO USER')) + else: + self.push_lit(fmt.format('')) def handle_OVER(self, message_spec=None): return self.handle_XOVER(message_spec) +class CapsAfterLoginNNTPv2Handler(NNTPv2Handler): + """A handler that allows CAPABILITIES only after login""" + + def handle_CAPABILITIES(self): + if not self._logged_in: + self.push_lit('480 You must log in.') + else: + super().handle_CAPABILITIES() + + class NNTPv1v2TestsMixin: def setUp(self): @@ -695,6 +726,14 @@ def test_welcome(self): self.assertEqual(self.server.welcome, self.handler.welcome) + def test_authinfo(self): + if self.nntp_version == 2: + self.assertIn('AUTHINFO', self.server._caps) + self.server.login('testuser', 'testpw') + # if AUTHINFO is gone from _caps we also know that getcapabilities() + # has been called after login as it should + self.assertNotIn('AUTHINFO', self.server._caps) + def test_date(self): resp, date = self.server.date() self.assertEqual(resp, "111 20100914001155") @@ -1073,6 +1112,18 @@ self.assertEqual(self.server.nntp_implementation, 'INN 2.5.1') +class CapsAfterLoginNNTPv2Tests(MockedNNTPTestsMixin, unittest.TestCase): + """Tests a probably NNTP v2 server with capabilities only after login.""" + + nntp_version = 2 + handler_class = CapsAfterLoginNNTPv2Handler + + def test_caps_only_after_login(self): + self.assertEqual(self.server._caps, {}) + self.server.login('testuser', 'testpw') + self.assertIn('VERSION', self.server._caps) + + class MiscTests(unittest.TestCase): def test_decode_header(self): @@ -1232,7 +1283,8 @@ def test_main(): - tests = [MiscTests, NNTPv1Tests, NNTPv2Tests, NetworkedNNTPTests] + tests = [MiscTests, NNTPv1Tests, NNTPv2Tests, CapsAfterLoginNNTPv2Tests, + NetworkedNNTPTests] if _have_ssl: tests.append(NetworkedNNTP_SSLTests) support.run_unittest(*tests) diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -113,6 +113,10 @@ Library ------- +- 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. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Feb 12 19:18:13 2012 From: python-checkins at python.org (antoine.pitrou) Date: Sun, 12 Feb 2012 19:18:13 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_3=2E2_-=3E_default=29?= =?utf8?q?=3A_Issue_=2310287=3A_nntplib_now_queries_the_server=27s_CAPABIL?= =?utf8?q?ITIES_again_after?= Message-ID: http://hg.python.org/cpython/rev/98ad67529241 changeset: 74890:98ad67529241 parent: 74887:29dbd42970ff parent: 74889:d789f453387d user: Antoine Pitrou date: Sun Feb 12 19:15:09 2012 +0100 summary: 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. files: Lib/nntplib.py | 5 +- Lib/test/test_nntplib.py | 62 +++++++++++++++++++++++++-- Misc/NEWS | 4 + 3 files changed, 65 insertions(+), 6 deletions(-) diff --git a/Lib/nntplib.py b/Lib/nntplib.py --- a/Lib/nntplib.py +++ b/Lib/nntplib.py @@ -378,7 +378,7 @@ self.nntp_implementation = None try: resp, caps = self.capabilities() - except NNTPPermanentError: + except (NNTPPermanentError, NNTPTemporaryError): # Server doesn't support capabilities self._caps = {} else: @@ -955,6 +955,9 @@ resp = self._shortcmd('authinfo pass ' + password) if not resp.startswith('281'): raise NNTPPermanentError(resp) + # Capabilities might have changed after login + self._caps = None + self.getcapabilities() # Attempt to send mode reader if it was requested after login. if self.readermode_afterauth: self._setreadermode() diff --git a/Lib/test/test_nntplib.py b/Lib/test/test_nntplib.py --- a/Lib/test/test_nntplib.py +++ b/Lib/test/test_nntplib.py @@ -395,6 +395,8 @@ self.allow_posting = True self._readline = readline self._push_data = push_data + self._logged_in = False + self._user_sent = False # Our welcome self.handle_welcome() @@ -687,27 +689,56 @@ self.push_lit(self.sample_body) self.push_lit(".") + def handle_AUTHINFO(self, cred_type, data): + if self._logged_in: + self.push_lit('502 Already Logged In') + elif cred_type == 'user': + if self._user_sent: + self.push_lit('482 User Credential Already Sent') + else: + self.push_lit('381 Password Required') + self._user_sent = True + elif cred_type == 'pass': + self.push_lit('281 Login Successful') + self._logged_in = True + else: + raise Exception('Unknown cred type {}'.format(cred_type)) + class NNTPv2Handler(NNTPv1Handler): """A handler for RFC 3977 (NNTP "v2")""" def handle_CAPABILITIES(self): - self.push_lit("""\ + fmt = """\ 101 Capability list: VERSION 2 3 - IMPLEMENTATION INN 2.5.1 - AUTHINFO USER + IMPLEMENTATION INN 2.5.1{} HDR LIST ACTIVE ACTIVE.TIMES DISTRIB.PATS HEADERS NEWSGROUPS OVERVIEW.FMT OVER POST READER - .""") + .""" + + if not self._logged_in: + self.push_lit(fmt.format('\n AUTHINFO USER')) + else: + self.push_lit(fmt.format('')) def handle_OVER(self, message_spec=None): return self.handle_XOVER(message_spec) +class CapsAfterLoginNNTPv2Handler(NNTPv2Handler): + """A handler that allows CAPABILITIES only after login""" + + def handle_CAPABILITIES(self): + if not self._logged_in: + self.push_lit('480 You must log in.') + else: + super().handle_CAPABILITIES() + + class NNTPv1v2TestsMixin: def setUp(self): @@ -716,6 +747,14 @@ def test_welcome(self): self.assertEqual(self.server.welcome, self.handler.welcome) + def test_authinfo(self): + if self.nntp_version == 2: + self.assertIn('AUTHINFO', self.server._caps) + self.server.login('testuser', 'testpw') + # if AUTHINFO is gone from _caps we also know that getcapabilities() + # has been called after login as it should + self.assertNotIn('AUTHINFO', self.server._caps) + def test_date(self): resp, date = self.server.date() self.assertEqual(resp, "111 20100914001155") @@ -1094,6 +1133,18 @@ self.assertEqual(self.server.nntp_implementation, 'INN 2.5.1') +class CapsAfterLoginNNTPv2Tests(MockedNNTPTestsMixin, unittest.TestCase): + """Tests a probably NNTP v2 server with capabilities only after login.""" + + nntp_version = 2 + handler_class = CapsAfterLoginNNTPv2Handler + + def test_caps_only_after_login(self): + self.assertEqual(self.server._caps, {}) + self.server.login('testuser', 'testpw') + self.assertIn('VERSION', self.server._caps) + + class MiscTests(unittest.TestCase): def test_decode_header(self): @@ -1253,7 +1304,8 @@ def test_main(): - tests = [MiscTests, NNTPv1Tests, NNTPv2Tests, NetworkedNNTPTests] + tests = [MiscTests, NNTPv1Tests, NNTPv2Tests, CapsAfterLoginNNTPv2Tests, + NetworkedNNTPTests] if _have_ssl: tests.append(NetworkedNNTP_SSLTests) support.run_unittest(*tests) diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -466,6 +466,10 @@ Library ------- +- 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. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Feb 12 20:09:40 2012 From: python-checkins at python.org (petri.lehtinen) Date: Sun, 12 Feb 2012 20:09:40 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=282=2E7=29=3A_Fix_sqlite3=2EC?= =?utf8?q?onnection=2Eiterdump_on_tables/fields_with_reserved_names_or_quo?= =?utf8?q?tes?= Message-ID: http://hg.python.org/cpython/rev/60aa7dacb605 changeset: 74891:60aa7dacb605 branch: 2.7 parent: 74888:e0c353a43c7d user: Petri Lehtinen date: Sun Feb 12 21:03:02 2012 +0200 summary: Fix sqlite3.Connection.iterdump on tables/fields with reserved names or quotes Closes #9750 files: Lib/sqlite3/dump.py | 50 +++++++++++++++------------ Lib/sqlite3/test/dump.py | 8 ++++ Misc/ACKS | 1 + Misc/NEWS | 4 ++ 4 files changed, 41 insertions(+), 22 deletions(-) diff --git a/Lib/sqlite3/dump.py b/Lib/sqlite3/dump.py --- a/Lib/sqlite3/dump.py +++ b/Lib/sqlite3/dump.py @@ -1,6 +1,12 @@ # Mimic the sqlite3 console shell's .dump command # Author: Paul Kippes +# Every identifier in sql is quoted based on a comment in sqlite +# documentation "SQLite adds new keywords from time to time when it +# takes on new features. So to prevent your code from being broken by +# future enhancements, you should normally quote any identifier that +# is an English language word, even if you do not have to." + def _iterdump(connection): """ Returns an iterator to the dump of the database in an SQL text format. @@ -15,49 +21,49 @@ # sqlite_master table contains the SQL CREATE statements for the database. q = """ - SELECT name, type, sql - FROM sqlite_master - WHERE sql NOT NULL AND - type == 'table' + SELECT "name", "type", "sql" + FROM "sqlite_master" + WHERE "sql" NOT NULL AND + "type" == 'table' """ schema_res = cu.execute(q) - for table_name, type, sql in schema_res.fetchall(): + for table_name, type, sql in sorted(schema_res.fetchall()): if table_name == 'sqlite_sequence': - yield('DELETE FROM sqlite_sequence;') + yield('DELETE FROM "sqlite_sequence";') elif table_name == 'sqlite_stat1': - yield('ANALYZE sqlite_master;') + yield('ANALYZE "sqlite_master";') elif table_name.startswith('sqlite_'): continue # NOTE: Virtual table support not implemented #elif sql.startswith('CREATE VIRTUAL TABLE'): # qtable = table_name.replace("'", "''") # yield("INSERT INTO sqlite_master(type,name,tbl_name,rootpage,sql)"\ - # "VALUES('table','%s','%s',0,'%s');" % + # "VALUES('table','{0}','{0}',0,'{1}');".format( # qtable, - # qtable, - # sql.replace("''")) + # sql.replace("''"))) else: - yield('%s;' % sql) + yield('{0};'.format(sql)) # Build the insert statement for each row of the current table - res = cu.execute("PRAGMA table_info('%s')" % table_name) + table_name_ident = table_name.replace('"', '""') + res = cu.execute('PRAGMA table_info("{0}")'.format(table_name_ident)) column_names = [str(table_info[1]) for table_info in res.fetchall()] - q = "SELECT 'INSERT INTO \"%(tbl_name)s\" VALUES(" - q += ",".join(["'||quote(" + col + ")||'" for col in column_names]) - q += ")' FROM '%(tbl_name)s'" - query_res = cu.execute(q % {'tbl_name': table_name}) + q = """SELECT 'INSERT INTO "{0}" VALUES({1})' FROM "{0}";""".format( + table_name_ident, + ",".join("""'||quote("{0}")||'""".format(col.replace('"', '""')) for col in column_names)) + query_res = cu.execute(q) for row in query_res: - yield("%s;" % row[0]) + yield("{0};".format(row[0])) # Now when the type is 'index', 'trigger', or 'view' q = """ - SELECT name, type, sql - FROM sqlite_master - WHERE sql NOT NULL AND - type IN ('index', 'trigger', 'view') + SELECT "name", "type", "sql" + FROM "sqlite_master" + WHERE "sql" NOT NULL AND + "type" IN ('index', 'trigger', 'view') """ schema_res = cu.execute(q) for name, type, sql in schema_res.fetchall(): - yield('%s;' % sql) + yield('{0};'.format(sql)) yield('COMMIT;') diff --git a/Lib/sqlite3/test/dump.py b/Lib/sqlite3/test/dump.py --- a/Lib/sqlite3/test/dump.py +++ b/Lib/sqlite3/test/dump.py @@ -13,6 +13,14 @@ def CheckTableDump(self): expected_sqls = [ + """CREATE TABLE "index"("index" blob);""" + , + """INSERT INTO "index" VALUES(X'01');""" + , + """CREATE TABLE "quoted""table"("quoted""field" text);""" + , + """INSERT INTO "quoted""table" VALUES('quoted''value');""" + , "CREATE TABLE t1(id integer primary key, s1 text, " \ "t1_i1 integer not null, i2 integer, unique (s1), " \ "constraint t1_idx1 unique (i2));" diff --git a/Misc/ACKS b/Misc/ACKS --- a/Misc/ACKS +++ b/Misc/ACKS @@ -457,6 +457,7 @@ Pat Knight Greg Kochanski Damon Kohler +Marko Kohtala Joseph Koshy Maksim Kozyarchuk Stefan Krah diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -90,6 +90,10 @@ Library ------- +- 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 #13994: Earlier partial revert of Distutils enhancements in 2.7 has left two versions of customize_compiler, the original in distutils.sysconfig and another copy in distutils.ccompiler, with some -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Feb 12 20:09:41 2012 From: python-checkins at python.org (petri.lehtinen) Date: Sun, 12 Feb 2012 20:09:41 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=283=2E2=29=3A_Fix_sqlite3=2EC?= =?utf8?q?onnection=2Eiterdump_on_tables/fields_with_reserved_names_or_quo?= =?utf8?q?tes?= Message-ID: http://hg.python.org/cpython/rev/4b105d328fe7 changeset: 74892:4b105d328fe7 branch: 3.2 parent: 74889:d789f453387d user: Petri Lehtinen date: Sun Feb 12 21:05:31 2012 +0200 summary: Fix sqlite3.Connection.iterdump on tables/fields with reserved names or quotes Closes #9750 files: Lib/sqlite3/dump.py | 50 +++++++++++++++------------ Lib/sqlite3/test/dump.py | 8 ++++ Misc/ACKS | 1 + Misc/NEWS | 4 ++ 4 files changed, 41 insertions(+), 22 deletions(-) diff --git a/Lib/sqlite3/dump.py b/Lib/sqlite3/dump.py --- a/Lib/sqlite3/dump.py +++ b/Lib/sqlite3/dump.py @@ -1,6 +1,12 @@ # Mimic the sqlite3 console shell's .dump command # Author: Paul Kippes +# Every identifier in sql is quoted based on a comment in sqlite +# documentation "SQLite adds new keywords from time to time when it +# takes on new features. So to prevent your code from being broken by +# future enhancements, you should normally quote any identifier that +# is an English language word, even if you do not have to." + def _iterdump(connection): """ Returns an iterator to the dump of the database in an SQL text format. @@ -15,49 +21,49 @@ # sqlite_master table contains the SQL CREATE statements for the database. q = """ - SELECT name, type, sql - FROM sqlite_master - WHERE sql NOT NULL AND - type == 'table' + SELECT "name", "type", "sql" + FROM "sqlite_master" + WHERE "sql" NOT NULL AND + "type" == 'table' """ schema_res = cu.execute(q) - for table_name, type, sql in schema_res.fetchall(): + for table_name, type, sql in sorted(schema_res.fetchall()): if table_name == 'sqlite_sequence': - yield('DELETE FROM sqlite_sequence;') + yield('DELETE FROM "sqlite_sequence";') elif table_name == 'sqlite_stat1': - yield('ANALYZE sqlite_master;') + yield('ANALYZE "sqlite_master";') elif table_name.startswith('sqlite_'): continue # NOTE: Virtual table support not implemented #elif sql.startswith('CREATE VIRTUAL TABLE'): # qtable = table_name.replace("'", "''") # yield("INSERT INTO sqlite_master(type,name,tbl_name,rootpage,sql)"\ - # "VALUES('table','%s','%s',0,'%s');" % + # "VALUES('table','{0}','{0}',0,'{1}');".format( # qtable, - # qtable, - # sql.replace("''")) + # sql.replace("''"))) else: - yield('%s;' % sql) + yield('{0};'.format(sql)) # Build the insert statement for each row of the current table - res = cu.execute("PRAGMA table_info('%s')" % table_name) + table_name_ident = table_name.replace('"', '""') + res = cu.execute('PRAGMA table_info("{0}")'.format(table_name_ident)) column_names = [str(table_info[1]) for table_info in res.fetchall()] - q = "SELECT 'INSERT INTO \"%(tbl_name)s\" VALUES(" - q += ",".join(["'||quote(" + col + ")||'" for col in column_names]) - q += ")' FROM '%(tbl_name)s'" - query_res = cu.execute(q % {'tbl_name': table_name}) + q = """SELECT 'INSERT INTO "{0}" VALUES({1})' FROM "{0}";""".format( + table_name_ident, + ",".join("""'||quote("{0}")||'""".format(col.replace('"', '""')) for col in column_names)) + query_res = cu.execute(q) for row in query_res: - yield("%s;" % row[0]) + yield("{0};".format(row[0])) # Now when the type is 'index', 'trigger', or 'view' q = """ - SELECT name, type, sql - FROM sqlite_master - WHERE sql NOT NULL AND - type IN ('index', 'trigger', 'view') + SELECT "name", "type", "sql" + FROM "sqlite_master" + WHERE "sql" NOT NULL AND + "type" IN ('index', 'trigger', 'view') """ schema_res = cu.execute(q) for name, type, sql in schema_res.fetchall(): - yield('%s;' % sql) + yield('{0};'.format(sql)) yield('COMMIT;') diff --git a/Lib/sqlite3/test/dump.py b/Lib/sqlite3/test/dump.py --- a/Lib/sqlite3/test/dump.py +++ b/Lib/sqlite3/test/dump.py @@ -13,6 +13,14 @@ def CheckTableDump(self): expected_sqls = [ + """CREATE TABLE "index"("index" blob);""" + , + """INSERT INTO "index" VALUES(X'01');""" + , + """CREATE TABLE "quoted""table"("quoted""field" text);""" + , + """INSERT INTO "quoted""table" VALUES('quoted''value');""" + , "CREATE TABLE t1(id integer primary key, s1 text, " \ "t1_i1 integer not null, i2 integer, unique (s1), " \ "constraint t1_idx1 unique (i2));" diff --git a/Misc/ACKS b/Misc/ACKS --- a/Misc/ACKS +++ b/Misc/ACKS @@ -503,6 +503,7 @@ Pat Knight Greg Kochanski Damon Kohler +Marko Kohtala Vlad Korolev Joseph Koshy Maksim Kozyarchuk diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -113,6 +113,10 @@ Library ------- +- 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. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Feb 12 20:09:42 2012 From: python-checkins at python.org (petri.lehtinen) Date: Sun, 12 Feb 2012 20:09:42 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_3=2E2_-=3E_default=29?= =?utf8?q?=3A_Merge_branch_=273=2E2=27?= Message-ID: http://hg.python.org/cpython/rev/5d0f7b275fe9 changeset: 74893:5d0f7b275fe9 parent: 74890:98ad67529241 parent: 74892:4b105d328fe7 user: Petri Lehtinen date: Sun Feb 12 21:06:57 2012 +0200 summary: Merge branch '3.2' Closes #9750 files: Lib/sqlite3/dump.py | 50 +++++++++++++++------------ Lib/sqlite3/test/dump.py | 8 ++++ Misc/ACKS | 1 + Misc/NEWS | 4 ++ 4 files changed, 41 insertions(+), 22 deletions(-) diff --git a/Lib/sqlite3/dump.py b/Lib/sqlite3/dump.py --- a/Lib/sqlite3/dump.py +++ b/Lib/sqlite3/dump.py @@ -1,6 +1,12 @@ # Mimic the sqlite3 console shell's .dump command # Author: Paul Kippes +# Every identifier in sql is quoted based on a comment in sqlite +# documentation "SQLite adds new keywords from time to time when it +# takes on new features. So to prevent your code from being broken by +# future enhancements, you should normally quote any identifier that +# is an English language word, even if you do not have to." + def _iterdump(connection): """ Returns an iterator to the dump of the database in an SQL text format. @@ -15,49 +21,49 @@ # sqlite_master table contains the SQL CREATE statements for the database. q = """ - SELECT name, type, sql - FROM sqlite_master - WHERE sql NOT NULL AND - type == 'table' + SELECT "name", "type", "sql" + FROM "sqlite_master" + WHERE "sql" NOT NULL AND + "type" == 'table' """ schema_res = cu.execute(q) - for table_name, type, sql in schema_res.fetchall(): + for table_name, type, sql in sorted(schema_res.fetchall()): if table_name == 'sqlite_sequence': - yield('DELETE FROM sqlite_sequence;') + yield('DELETE FROM "sqlite_sequence";') elif table_name == 'sqlite_stat1': - yield('ANALYZE sqlite_master;') + yield('ANALYZE "sqlite_master";') elif table_name.startswith('sqlite_'): continue # NOTE: Virtual table support not implemented #elif sql.startswith('CREATE VIRTUAL TABLE'): # qtable = table_name.replace("'", "''") # yield("INSERT INTO sqlite_master(type,name,tbl_name,rootpage,sql)"\ - # "VALUES('table','%s','%s',0,'%s');" % + # "VALUES('table','{0}','{0}',0,'{1}');".format( # qtable, - # qtable, - # sql.replace("''")) + # sql.replace("''"))) else: - yield('%s;' % sql) + yield('{0};'.format(sql)) # Build the insert statement for each row of the current table - res = cu.execute("PRAGMA table_info('%s')" % table_name) + table_name_ident = table_name.replace('"', '""') + res = cu.execute('PRAGMA table_info("{0}")'.format(table_name_ident)) column_names = [str(table_info[1]) for table_info in res.fetchall()] - q = "SELECT 'INSERT INTO \"%(tbl_name)s\" VALUES(" - q += ",".join(["'||quote(" + col + ")||'" for col in column_names]) - q += ")' FROM '%(tbl_name)s'" - query_res = cu.execute(q % {'tbl_name': table_name}) + q = """SELECT 'INSERT INTO "{0}" VALUES({1})' FROM "{0}";""".format( + table_name_ident, + ",".join("""'||quote("{0}")||'""".format(col.replace('"', '""')) for col in column_names)) + query_res = cu.execute(q) for row in query_res: - yield("%s;" % row[0]) + yield("{0};".format(row[0])) # Now when the type is 'index', 'trigger', or 'view' q = """ - SELECT name, type, sql - FROM sqlite_master - WHERE sql NOT NULL AND - type IN ('index', 'trigger', 'view') + SELECT "name", "type", "sql" + FROM "sqlite_master" + WHERE "sql" NOT NULL AND + "type" IN ('index', 'trigger', 'view') """ schema_res = cu.execute(q) for name, type, sql in schema_res.fetchall(): - yield('%s;' % sql) + yield('{0};'.format(sql)) yield('COMMIT;') diff --git a/Lib/sqlite3/test/dump.py b/Lib/sqlite3/test/dump.py --- a/Lib/sqlite3/test/dump.py +++ b/Lib/sqlite3/test/dump.py @@ -13,6 +13,14 @@ def CheckTableDump(self): expected_sqls = [ + """CREATE TABLE "index"("index" blob);""" + , + """INSERT INTO "index" VALUES(X'01');""" + , + """CREATE TABLE "quoted""table"("quoted""field" text);""" + , + """INSERT INTO "quoted""table" VALUES('quoted''value');""" + , "CREATE TABLE t1(id integer primary key, s1 text, " \ "t1_i1 integer not null, i2 integer, unique (s1), " \ "constraint t1_idx1 unique (i2));" diff --git a/Misc/ACKS b/Misc/ACKS --- a/Misc/ACKS +++ b/Misc/ACKS @@ -543,6 +543,7 @@ Pat Knight Greg Kochanski Damon Kohler +Marko Kohtala Jacek Konieczny ???? ????????? Arkady Koplyarov diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -466,6 +466,10 @@ Library ------- +- 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. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Feb 12 20:13:13 2012 From: python-checkins at python.org (petri.lehtinen) Date: Sun, 12 Feb 2012 20:13:13 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=282=2E7=29=3A_Add_myself_to_M?= =?utf8?q?isc/ACKS?= Message-ID: http://hg.python.org/cpython/rev/7502fe6b6049 changeset: 74894:7502fe6b6049 branch: 2.7 parent: 74891:60aa7dacb605 user: Petri Lehtinen date: Sun Feb 12 21:11:38 2012 +0200 summary: Add myself to Misc/ACKS files: Misc/ACKS | 1 + 1 files changed, 1 insertions(+), 0 deletions(-) diff --git a/Misc/ACKS b/Misc/ACKS --- a/Misc/ACKS +++ b/Misc/ACKS @@ -494,6 +494,7 @@ Kip Lehman Joerg Lehmann Robert Lehmann +Petri Lehtinen Luke Kenneth Casson Leighton Marc-Andre Lemburg John Lenton -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Feb 13 01:00:28 2012 From: python-checkins at python.org (gregory.p.smith) Date: Mon, 13 Feb 2012 01:00:28 +0100 Subject: [Python-checkins] =?utf8?b?Y3B5dGhvbiAoMy4yKTogSXNzdWUgIzEzOTMw?= =?utf8?q?=3A_Adds_ability_for_2to3_to_write_its_output_to_a_different?= Message-ID: http://hg.python.org/cpython/rev/ceea9ebfe003 changeset: 74895:ceea9ebfe003 branch: 3.2 parent: 74892:4b105d328fe7 user: Gregory P. Smith date: Sun Feb 12 15:50:21 2012 -0800 summary: Issue #13930: Adds ability for 2to3 to write its output to a different directory tree instead of overwriting the input files. Adds three command line options: -o/--output-dir, -W/--write-unchanged-files and --add-suffix. Feature backports into stable release branches for 2to3 are allowed by a special exemption: http://mail.python.org/pipermail/python-dev/2011-December/115089.html files: Doc/library/2to3.rst | 32 +++++ Lib/lib2to3/main.py | 93 +++++++++++++++- Lib/lib2to3/refactor.py | 20 ++- Lib/lib2to3/tests/test_main.py | 100 ++++++++++++++++- Lib/lib2to3/tests/test_refactor.py | 36 +++++- Misc/NEWS | 5 + 6 files changed, 271 insertions(+), 15 deletions(-) diff --git a/Doc/library/2to3.rst b/Doc/library/2to3.rst --- a/Doc/library/2to3.rst +++ b/Doc/library/2to3.rst @@ -94,6 +94,38 @@ :option:`-p` to run fixers on code that already has had its print statements converted. +The :option:`-o` or :option:`--output-dir` option allows specification of an +alternate directory for processed output files to be written to. The +:option:`-n` flag is required when using this as backup files do not make sense +when not overwriting the input files. + +.. versionadded:: 3.2.3 + The :option:`-o` option was added. + +The :option:`-W` or :option:`--write-unchanged-files` flag tells 2to3 to always +write output files even if no changes were required to the file. This is most +useful with :option:`-o` so that an entire Python source tree is copied with +translation from one directory to another. +This option implies the :option:`-w` flag as it would not make sense otherwise. + +.. versionadded:: 3.2.3 + The :option:`-W` flag was added. + +The :option:`--add-suffix` option specifies a string to append to all output +filenames. The :option:`-n` flag is required when specifying this as backups +are not necessary when writing to different filenames. Example:: + + $ 2to3 -n -W --add-suffix=3 example.py + +Will cause a converted file named ``example.py3`` to be written. + +.. versionadded:: 3.2.3 + The :option:`--add-suffix` option was added. + +To translate an entire project from one directory tree to another use:: + + $ 2to3 --output-dir=python3-version/mycode -W -n python2-version/mycode + .. _2to3-fixers: diff --git a/Lib/lib2to3/main.py b/Lib/lib2to3/main.py --- a/Lib/lib2to3/main.py +++ b/Lib/lib2to3/main.py @@ -25,12 +25,41 @@ class StdoutRefactoringTool(refactor.MultiprocessRefactoringTool): """ + A refactoring tool that can avoid overwriting its input files. Prints output to stdout. + + Output files can optionally be written to a different directory and or + have an extra file suffix appended to their name for use in situations + where you do not want to replace the input files. """ - def __init__(self, fixers, options, explicit, nobackups, show_diffs): + def __init__(self, fixers, options, explicit, nobackups, show_diffs, + input_base_dir='', output_dir='', append_suffix=''): + """ + Args: + fixers: A list of fixers to import. + options: A dict with RefactoringTool configuration. + explicit: A list of fixers to run even if they are explicit. + nobackups: If true no backup '.bak' files will be created for those + files that are being refactored. + show_diffs: Should diffs of the refactoring be printed to stdout? + input_base_dir: The base directory for all input files. This class + will strip this path prefix off of filenames before substituting + it with output_dir. Only meaningful if output_dir is supplied. + All files processed by refactor() must start with this path. + output_dir: If supplied, all converted files will be written into + this directory tree instead of input_base_dir. + append_suffix: If supplied, all files output by this tool will have + this appended to their filename. Useful for changing .py to + .py3 for example by passing append_suffix='3'. + """ self.nobackups = nobackups self.show_diffs = show_diffs + if input_base_dir and not input_base_dir.endswith(os.sep): + input_base_dir += os.sep + self._input_base_dir = input_base_dir + self._output_dir = output_dir + self._append_suffix = append_suffix super(StdoutRefactoringTool, self).__init__(fixers, options, explicit) def log_error(self, msg, *args, **kwargs): @@ -38,6 +67,23 @@ self.logger.error(msg, *args, **kwargs) def write_file(self, new_text, filename, old_text, encoding): + orig_filename = filename + if self._output_dir: + if filename.startswith(self._input_base_dir): + filename = os.path.join(self._output_dir, + filename[len(self._input_base_dir):]) + else: + raise ValueError('filename %s does not start with the ' + 'input_base_dir %s' % ( + filename, self._input_base_dir)) + if self._append_suffix: + filename += self._append_suffix + if orig_filename != filename: + output_dir = os.path.dirname(filename) + if not os.path.isdir(output_dir): + os.makedirs(output_dir) + self.log_message('Writing converted %s to %s.', orig_filename, + filename) if not self.nobackups: # Make backup backup = filename + ".bak" @@ -55,6 +101,9 @@ write(new_text, filename, old_text, encoding) if not self.nobackups: shutil.copymode(backup, filename) + if orig_filename != filename: + # Preserve the file mode in the new output directory. + shutil.copymode(orig_filename, filename) def print_output(self, old, new, filename, equal): if equal: @@ -113,11 +162,33 @@ help="Write back modified files") parser.add_option("-n", "--nobackups", action="store_true", default=False, help="Don't write backups for modified files") + parser.add_option("-o", "--output-dir", action="store", type="str", + default="", help="Put output files in this directory " + "instead of overwriting the input files. Requires -n.") + parser.add_option("-W", "--write-unchanged-files", action="store_true", + help="Also write files even if no changes were required" + " (useful with --output-dir); implies -w.") + parser.add_option("--add-suffix", action="store", type="str", default="", + help="Append this string to all output filenames." + " Requires -n if non-empty. " + "ex: --add-suffix='3' will generate .py3 files.") # Parse command line arguments refactor_stdin = False flags = {} options, args = parser.parse_args(args) + if options.write_unchanged_files: + flags["write_unchanged_files"] = True + if not options.write: + warn("--write-unchanged-files/-W implies -w.") + options.write = True + # If we allowed these, the original files would be renamed to backup names + # but not replaced. + if options.output_dir and not options.nobackups: + parser.error("Can't use --output-dir/-o without -n.") + if options.add_suffix and not options.nobackups: + parser.error("Can't use --add-suffix without -n.") + if not options.write and options.no_diffs: warn("not writing files and not printing diffs; that's not very useful") if not options.write and options.nobackups: @@ -143,6 +214,7 @@ # Set up logging handler level = logging.DEBUG if options.verbose else logging.INFO logging.basicConfig(format='%(name)s: %(message)s', level=level) + logger = logging.getLogger('lib2to3.main') # Initialize the refactoring tool avail_fixes = set(refactor.get_fixers_from_package(fixer_pkg)) @@ -159,8 +231,23 @@ else: requested = avail_fixes.union(explicit) fixer_names = requested.difference(unwanted_fixes) - rt = StdoutRefactoringTool(sorted(fixer_names), flags, sorted(explicit), - options.nobackups, not options.no_diffs) + input_base_dir = os.path.commonprefix(args) + if (input_base_dir and not input_base_dir.endswith(os.sep) + and not os.path.isdir(input_base_dir)): + # One or more similar names were passed, their directory is the base. + # os.path.commonprefix() is ignorant of path elements, this corrects + # for that weird API. + input_base_dir = os.path.dirname(input_base_dir) + if options.output_dir: + input_base_dir = input_base_dir.rstrip(os.sep) + logger.info('Output in %r will mirror the input directory %r layout.', + options.output_dir, input_base_dir) + rt = StdoutRefactoringTool( + sorted(fixer_names), flags, sorted(explicit), + options.nobackups, not options.no_diffs, + input_base_dir=input_base_dir, + output_dir=options.output_dir, + append_suffix=options.add_suffix) # Refactor all files and directories passed as arguments if not rt.errors: diff --git a/Lib/lib2to3/refactor.py b/Lib/lib2to3/refactor.py --- a/Lib/lib2to3/refactor.py +++ b/Lib/lib2to3/refactor.py @@ -173,7 +173,8 @@ class RefactoringTool(object): - _default_options = {"print_function" : False} + _default_options = {"print_function" : False, + "write_unchanged_files" : False} CLASS_PREFIX = "Fix" # The prefix for fixer classes FILE_PREFIX = "fix_" # The prefix for modules with a fixer within @@ -195,6 +196,10 @@ self.grammar = pygram.python_grammar_no_print_statement else: self.grammar = pygram.python_grammar + # When this is True, the refactor*() methods will call write_file() for + # files processed even if they were not changed during refactoring. If + # and only if the refactor method's write parameter was True. + self.write_unchanged_files = self.options.get("write_unchanged_files") self.errors = [] self.logger = logging.getLogger("RefactoringTool") self.fixer_log = [] @@ -341,13 +346,13 @@ if doctests_only: self.log_debug("Refactoring doctests in %s", filename) output = self.refactor_docstring(input, filename) - if output != input: + if self.write_unchanged_files or output != input: self.processed_file(output, filename, input, write, encoding) else: self.log_debug("No doctest changes in %s", filename) else: tree = self.refactor_string(input, filename) - if tree and tree.was_changed: + if self.write_unchanged_files or (tree and tree.was_changed): # The [:-1] is to take off the \n we added earlier self.processed_file(str(tree)[:-1], filename, write=write, encoding=encoding) @@ -386,13 +391,13 @@ if doctests_only: self.log_debug("Refactoring doctests in stdin") output = self.refactor_docstring(input, "") - if output != input: + if self.write_unchanged_files or output != input: self.processed_file(output, "", input) else: self.log_debug("No doctest changes in stdin") else: tree = self.refactor_string(input, "") - if tree and tree.was_changed: + if self.write_unchanged_files or (tree and tree.was_changed): self.processed_file(str(tree), "", input) else: self.log_debug("No changes in stdin") @@ -502,7 +507,7 @@ def processed_file(self, new_text, filename, old_text=None, write=False, encoding=None): """ - Called when a file has been refactored, and there are changes. + Called when a file has been refactored and there may be changes. """ self.files.append(filename) if old_text is None: @@ -513,7 +518,8 @@ self.print_output(old_text, new_text, filename, equal) if equal: self.log_debug("No changes to %s", filename) - return + if not self.write_unchanged_files: + return if write: self.write_file(new_text, filename, old_text, encoding) else: diff --git a/Lib/lib2to3/tests/test_main.py b/Lib/lib2to3/tests/test_main.py --- a/Lib/lib2to3/tests/test_main.py +++ b/Lib/lib2to3/tests/test_main.py @@ -1,18 +1,30 @@ # -*- coding: utf-8 -*- +import codecs +import io +import logging +import os +import shutil import sys -import codecs -import logging -import io +import tempfile import unittest from lib2to3 import main +TEST_DATA_DIR = os.path.join(os.path.dirname(__file__), "data") +PY2_TEST_MODULE = os.path.join(TEST_DATA_DIR, "py2_test_grammar.py") + + class TestMain(unittest.TestCase): + def setUp(self): + self.temp_dir = None # tearDown() will rmtree this directory if set. + def tearDown(self): # Clean up logging configuration down by main. del logging.root.handlers[:] + if self.temp_dir: + shutil.rmtree(self.temp_dir) def run_2to3_capture(self, args, in_capture, out_capture, err_capture): save_stdin = sys.stdin @@ -39,3 +51,85 @@ self.assertTrue("-print 'nothing'" in output) self.assertTrue("WARNING: couldn't encode 's diff for " "your terminal" in err.getvalue()) + + def setup_test_source_trees(self): + """Setup a test source tree and output destination tree.""" + self.temp_dir = tempfile.mkdtemp() # tearDown() cleans this up. + self.py2_src_dir = os.path.join(self.temp_dir, "python2_project") + self.py3_dest_dir = os.path.join(self.temp_dir, "python3_project") + os.mkdir(self.py2_src_dir) + os.mkdir(self.py3_dest_dir) + # Turn it into a package with a few files. + self.setup_files = [] + open(os.path.join(self.py2_src_dir, "__init__.py"), "w").close() + self.setup_files.append("__init__.py") + shutil.copy(PY2_TEST_MODULE, self.py2_src_dir) + self.setup_files.append(os.path.basename(PY2_TEST_MODULE)) + self.trivial_py2_file = os.path.join(self.py2_src_dir, "trivial.py") + self.init_py2_file = os.path.join(self.py2_src_dir, "__init__.py") + with open(self.trivial_py2_file, "w") as trivial: + trivial.write("print 'I need a simple conversion.'") + self.setup_files.append("trivial.py") + + def test_filename_changing_on_output_single_dir(self): + """2to3 a single directory with a new output dir and suffix.""" + self.setup_test_source_trees() + out = io.StringIO() + err = io.StringIO() + suffix = "TEST" + ret = self.run_2to3_capture( + ["-n", "--add-suffix", suffix, "--write-unchanged-files", + "--no-diffs", "--output-dir", + self.py3_dest_dir, self.py2_src_dir], + io.StringIO(""), out, err) + self.assertEqual(ret, 0) + stderr = err.getvalue() + self.assertIn(" implies -w.", stderr) + self.assertIn( + "Output in %r will mirror the input directory %r layout" % ( + self.py3_dest_dir, self.py2_src_dir), stderr) + self.assertEqual(set(name+suffix for name in self.setup_files), + set(os.listdir(self.py3_dest_dir))) + for name in self.setup_files: + self.assertIn("Writing converted %s to %s" % ( + os.path.join(self.py2_src_dir, name), + os.path.join(self.py3_dest_dir, name+suffix)), stderr) + self.assertRegexpMatches(stderr, r"No changes to .*/__init__\.py") + self.assertNotRegex(stderr, r"No changes to .*/trivial\.py") + + def test_filename_changing_on_output_two_files(self): + """2to3 two files in one directory with a new output dir.""" + self.setup_test_source_trees() + err = io.StringIO() + py2_files = [self.trivial_py2_file, self.init_py2_file] + expected_files = set(os.path.basename(name) for name in py2_files) + ret = self.run_2to3_capture( + ["-n", "-w", "--write-unchanged-files", + "--no-diffs", "--output-dir", self.py3_dest_dir] + py2_files, + io.StringIO(""), io.StringIO(), err) + self.assertEqual(ret, 0) + stderr = err.getvalue() + self.assertIn( + "Output in %r will mirror the input directory %r layout" % ( + self.py3_dest_dir, self.py2_src_dir), stderr) + self.assertEqual(expected_files, set(os.listdir(self.py3_dest_dir))) + + def test_filename_changing_on_output_single_file(self): + """2to3 a single file with a new output dir.""" + self.setup_test_source_trees() + err = io.StringIO() + ret = self.run_2to3_capture( + ["-n", "-w", "--no-diffs", "--output-dir", self.py3_dest_dir, + self.trivial_py2_file], + io.StringIO(""), io.StringIO(), err) + self.assertEqual(ret, 0) + stderr = err.getvalue() + self.assertIn( + "Output in %r will mirror the input directory %r layout" % ( + self.py3_dest_dir, self.py2_src_dir), stderr) + self.assertEqual(set([os.path.basename(self.trivial_py2_file)]), + set(os.listdir(self.py3_dest_dir))) + + +if __name__ == '__main__': + unittest.main() diff --git a/Lib/lib2to3/tests/test_refactor.py b/Lib/lib2to3/tests/test_refactor.py --- a/Lib/lib2to3/tests/test_refactor.py +++ b/Lib/lib2to3/tests/test_refactor.py @@ -53,6 +53,12 @@ self.assertTrue(rt.driver.grammar is pygram.python_grammar_no_print_statement) + def test_write_unchanged_files_option(self): + rt = self.rt() + self.assertFalse(rt.write_unchanged_files) + rt = self.rt({"write_unchanged_files" : True}) + self.assertTrue(rt.write_unchanged_files) + def test_fixer_loading_helpers(self): contents = ["explicit", "first", "last", "parrot", "preorder"] non_prefixed = refactor.get_all_fix_names("myfixes") @@ -176,7 +182,9 @@ "", False] self.assertEqual(results, expected) - def check_file_refactoring(self, test_file, fixers=_2TO3_FIXERS): + def check_file_refactoring(self, test_file, fixers=_2TO3_FIXERS, + options=None, mock_log_debug=None, + actually_write=True): tmpdir = tempfile.mkdtemp(prefix="2to3-test_refactor") self.addCleanup(shutil.rmtree, tmpdir) # make a copy of the tested file that we can write to @@ -189,11 +197,15 @@ return fp.read() old_contents = read_file() - rt = self.rt(fixers=fixers) + rt = self.rt(fixers=fixers, options=options) + if mock_log_debug: + rt.log_debug = mock_log_debug rt.refactor_file(test_file) self.assertEqual(old_contents, read_file()) + if not actually_write: + return rt.refactor_file(test_file, True) new_contents = read_file() self.assertNotEqual(old_contents, new_contents) @@ -203,6 +215,26 @@ test_file = os.path.join(FIXER_DIR, "parrot_example.py") self.check_file_refactoring(test_file, _DEFAULT_FIXERS) + def test_refactor_file_write_unchanged_file(self): + test_file = os.path.join(FIXER_DIR, "parrot_example.py") + debug_messages = [] + def recording_log_debug(msg, *args): + debug_messages.append(msg % args) + self.check_file_refactoring(test_file, fixers=(), + options={"write_unchanged_files": True}, + mock_log_debug=recording_log_debug, + actually_write=False) + # Testing that it logged this message when write=False was passed is + # sufficient to see that it did not bail early after "No changes". + message_regex = r"Not writing changes to .*%s%s" % ( + os.sep, os.path.basename(test_file)) + for message in debug_messages: + if "Not writing changes" in message: + self.assertRegexpMatches(message, message_regex) + break + else: + self.fail("%r not matched in %r" % (message_regex, debug_messages)) + def test_refactor_dir(self): def check(structure, expected): def mock_refactor_file(self, f, *args): diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -443,6 +443,11 @@ Tools/Demos ----------- +- 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. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Feb 13 01:00:29 2012 From: python-checkins at python.org (gregory.p.smith) Date: Mon, 13 Feb 2012 01:00:29 +0100 Subject: [Python-checkins] =?utf8?b?Y3B5dGhvbiAoMi43KTogSXNzdWUgIzEzOTMw?= =?utf8?q?=3A_Adds_ability_for_2to3_to_write_its_output_to_a_different?= Message-ID: http://hg.python.org/cpython/rev/9f583700d27f changeset: 74896:9f583700d27f branch: 2.7 parent: 74894:7502fe6b6049 user: Gregory P. Smith date: Sun Feb 12 15:51:21 2012 -0800 summary: Issue #13930: Adds ability for 2to3 to write its output to a different directory tree instead of overwriting the input files. Adds three command line options: -o/--output-dir, -W/--write-unchanged-files and --add-suffix. Feature backports into stable release branches for 2to3 are allowed by a special exemption: http://mail.python.org/pipermail/python-dev/2011-December/115089.html files: Doc/library/2to3.rst | 32 +++++ Lib/lib2to3/main.py | 93 ++++++++++++++- Lib/lib2to3/refactor.py | 20 ++- Lib/lib2to3/tests/test_main.py | 104 +++++++++++++++++ Lib/lib2to3/tests/test_refactor.py | 36 +++++- Misc/NEWS | 7 +- 6 files changed, 278 insertions(+), 14 deletions(-) diff --git a/Doc/library/2to3.rst b/Doc/library/2to3.rst --- a/Doc/library/2to3.rst +++ b/Doc/library/2to3.rst @@ -94,6 +94,38 @@ :option:`-p` to run fixers on code that already has had its print statements converted. +The :option:`-o` or :option:`--output-dir` option allows specification of an +alternate directory for processed output files to be written to. The +:option:`-n` flag is required when using this as backup files do not make sense +when not overwriting the input files. + +.. versionadded:: 2.7.3 + The :option:`-o` option was added. + +The :option:`-W` or :option:`--write-unchanged-files` flag tells 2to3 to always +write output files even if no changes were required to the file. This is most +useful with :option:`-o` so that an entire Python source tree is copied with +translation from one directory to another. +This option implies the :option:`-w` flag as it would not make sense otherwise. + +.. versionadded:: 2.7.3 + The :option:`-W` flag was added. + +The :option:`--add-suffix` option specifies a string to append to all output +filenames. The :option:`-n` flag is required when specifying this as backups +are not necessary when writing to different filenames. Example:: + + $ 2to3 -n -W --add-suffix=3 example.py + +Will cause a converted file named ``example.py3`` to be written. + +.. versionadded:: 2.7.3 + The :option:`--add-suffix` option was added. + +To translate an entire project from one directory tree to another use:: + + $ 2to3 --output-dir=python3-version/mycode -W -n python2-version/mycode + .. _2to3-fixers: diff --git a/Lib/lib2to3/main.py b/Lib/lib2to3/main.py --- a/Lib/lib2to3/main.py +++ b/Lib/lib2to3/main.py @@ -25,12 +25,41 @@ class StdoutRefactoringTool(refactor.MultiprocessRefactoringTool): """ + A refactoring tool that can avoid overwriting its input files. Prints output to stdout. + + Output files can optionally be written to a different directory and or + have an extra file suffix appended to their name for use in situations + where you do not want to replace the input files. """ - def __init__(self, fixers, options, explicit, nobackups, show_diffs): + def __init__(self, fixers, options, explicit, nobackups, show_diffs, + input_base_dir='', output_dir='', append_suffix=''): + """ + Args: + fixers: A list of fixers to import. + options: A dict with RefactoringTool configuration. + explicit: A list of fixers to run even if they are explicit. + nobackups: If true no backup '.bak' files will be created for those + files that are being refactored. + show_diffs: Should diffs of the refactoring be printed to stdout? + input_base_dir: The base directory for all input files. This class + will strip this path prefix off of filenames before substituting + it with output_dir. Only meaningful if output_dir is supplied. + All files processed by refactor() must start with this path. + output_dir: If supplied, all converted files will be written into + this directory tree instead of input_base_dir. + append_suffix: If supplied, all files output by this tool will have + this appended to their filename. Useful for changing .py to + .py3 for example by passing append_suffix='3'. + """ self.nobackups = nobackups self.show_diffs = show_diffs + if input_base_dir and not input_base_dir.endswith(os.sep): + input_base_dir += os.sep + self._input_base_dir = input_base_dir + self._output_dir = output_dir + self._append_suffix = append_suffix super(StdoutRefactoringTool, self).__init__(fixers, options, explicit) def log_error(self, msg, *args, **kwargs): @@ -38,6 +67,23 @@ self.logger.error(msg, *args, **kwargs) def write_file(self, new_text, filename, old_text, encoding): + orig_filename = filename + if self._output_dir: + if filename.startswith(self._input_base_dir): + filename = os.path.join(self._output_dir, + filename[len(self._input_base_dir):]) + else: + raise ValueError('filename %s does not start with the ' + 'input_base_dir %s' % ( + filename, self._input_base_dir)) + if self._append_suffix: + filename += self._append_suffix + if orig_filename != filename: + output_dir = os.path.dirname(filename) + if not os.path.isdir(output_dir): + os.makedirs(output_dir) + self.log_message('Writing converted %s to %s.', orig_filename, + filename) if not self.nobackups: # Make backup backup = filename + ".bak" @@ -55,6 +101,9 @@ write(new_text, filename, old_text, encoding) if not self.nobackups: shutil.copymode(backup, filename) + if orig_filename != filename: + # Preserve the file mode in the new output directory. + shutil.copymode(orig_filename, filename) def print_output(self, old, new, filename, equal): if equal: @@ -114,11 +163,33 @@ help="Write back modified files") parser.add_option("-n", "--nobackups", action="store_true", default=False, help="Don't write backups for modified files") + parser.add_option("-o", "--output-dir", action="store", type="str", + default="", help="Put output files in this directory " + "instead of overwriting the input files. Requires -n.") + parser.add_option("-W", "--write-unchanged-files", action="store_true", + help="Also write files even if no changes were required" + " (useful with --output-dir); implies -w.") + parser.add_option("--add-suffix", action="store", type="str", default="", + help="Append this string to all output filenames." + " Requires -n if non-empty. " + "ex: --add-suffix='3' will generate .py3 files.") # Parse command line arguments refactor_stdin = False flags = {} options, args = parser.parse_args(args) + if options.write_unchanged_files: + flags["write_unchanged_files"] = True + if not options.write: + warn("--write-unchanged-files/-W implies -w.") + options.write = True + # If we allowed these, the original files would be renamed to backup names + # but not replaced. + if options.output_dir and not options.nobackups: + parser.error("Can't use --output-dir/-o without -n.") + if options.add_suffix and not options.nobackups: + parser.error("Can't use --add-suffix without -n.") + if not options.write and options.no_diffs: warn("not writing files and not printing diffs; that's not very useful") if not options.write and options.nobackups: @@ -144,6 +215,7 @@ # Set up logging handler level = logging.DEBUG if options.verbose else logging.INFO logging.basicConfig(format='%(name)s: %(message)s', level=level) + logger = logging.getLogger('lib2to3.main') # Initialize the refactoring tool avail_fixes = set(refactor.get_fixers_from_package(fixer_pkg)) @@ -160,8 +232,23 @@ else: requested = avail_fixes.union(explicit) fixer_names = requested.difference(unwanted_fixes) - rt = StdoutRefactoringTool(sorted(fixer_names), flags, sorted(explicit), - options.nobackups, not options.no_diffs) + input_base_dir = os.path.commonprefix(args) + if (input_base_dir and not input_base_dir.endswith(os.sep) + and not os.path.isdir(input_base_dir)): + # One or more similar names were passed, their directory is the base. + # os.path.commonprefix() is ignorant of path elements, this corrects + # for that weird API. + input_base_dir = os.path.dirname(input_base_dir) + if options.output_dir: + input_base_dir = input_base_dir.rstrip(os.sep) + logger.info('Output in %r will mirror the input directory %r layout.', + options.output_dir, input_base_dir) + rt = StdoutRefactoringTool( + sorted(fixer_names), flags, sorted(explicit), + options.nobackups, not options.no_diffs, + input_base_dir=input_base_dir, + output_dir=options.output_dir, + append_suffix=options.add_suffix) # Refactor all files and directories passed as arguments if not rt.errors: diff --git a/Lib/lib2to3/refactor.py b/Lib/lib2to3/refactor.py --- a/Lib/lib2to3/refactor.py +++ b/Lib/lib2to3/refactor.py @@ -173,7 +173,8 @@ class RefactoringTool(object): - _default_options = {"print_function" : False} + _default_options = {"print_function" : False, + "write_unchanged_files" : False} CLASS_PREFIX = "Fix" # The prefix for fixer classes FILE_PREFIX = "fix_" # The prefix for modules with a fixer within @@ -195,6 +196,10 @@ self.grammar = pygram.python_grammar_no_print_statement else: self.grammar = pygram.python_grammar + # When this is True, the refactor*() methods will call write_file() for + # files processed even if they were not changed during refactoring. If + # and only if the refactor method's write parameter was True. + self.write_unchanged_files = self.options.get("write_unchanged_files") self.errors = [] self.logger = logging.getLogger("RefactoringTool") self.fixer_log = [] @@ -341,13 +346,13 @@ if doctests_only: self.log_debug("Refactoring doctests in %s", filename) output = self.refactor_docstring(input, filename) - if output != input: + if self.write_unchanged_files or output != input: self.processed_file(output, filename, input, write, encoding) else: self.log_debug("No doctest changes in %s", filename) else: tree = self.refactor_string(input, filename) - if tree and tree.was_changed: + if self.write_unchanged_files or (tree and tree.was_changed): # The [:-1] is to take off the \n we added earlier self.processed_file(unicode(tree)[:-1], filename, write=write, encoding=encoding) @@ -386,13 +391,13 @@ if doctests_only: self.log_debug("Refactoring doctests in stdin") output = self.refactor_docstring(input, "") - if output != input: + if self.write_unchanged_files or output != input: self.processed_file(output, "", input) else: self.log_debug("No doctest changes in stdin") else: tree = self.refactor_string(input, "") - if tree and tree.was_changed: + if self.write_unchanged_files or (tree and tree.was_changed): self.processed_file(unicode(tree), "", input) else: self.log_debug("No changes in stdin") @@ -502,7 +507,7 @@ def processed_file(self, new_text, filename, old_text=None, write=False, encoding=None): """ - Called when a file has been refactored, and there are changes. + Called when a file has been refactored and there may be changes. """ self.files.append(filename) if old_text is None: @@ -513,7 +518,8 @@ self.print_output(old_text, new_text, filename, equal) if equal: self.log_debug("No changes to %s", filename) - return + if not self.write_unchanged_files: + return if write: self.write_file(new_text, filename, old_text, encoding) else: diff --git a/Lib/lib2to3/tests/test_main.py b/Lib/lib2to3/tests/test_main.py --- a/Lib/lib2to3/tests/test_main.py +++ b/Lib/lib2to3/tests/test_main.py @@ -2,17 +2,39 @@ import sys import codecs import logging +import os +import shutil import StringIO +import sys +import tempfile import unittest from lib2to3 import main +TEST_DATA_DIR = os.path.join(os.path.dirname(__file__), "data") +PY2_TEST_MODULE = os.path.join(TEST_DATA_DIR, "py2_test_grammar.py") + + class TestMain(unittest.TestCase): + if not hasattr(unittest.TestCase, 'assertNotRegex'): + # This method was only introduced in 3.2. + def assertNotRegex(self, text, regexp, msg=None): + import re + if not hasattr(regexp, 'search'): + regexp = re.compile(regexp) + if regexp.search(text): + self.fail("regexp %s MATCHED text %r" % (regexp.pattern, text)) + + def setUp(self): + self.temp_dir = None # tearDown() will rmtree this directory if set. + def tearDown(self): # Clean up logging configuration down by main. del logging.root.handlers[:] + if self.temp_dir: + shutil.rmtree(self.temp_dir) def run_2to3_capture(self, args, in_capture, out_capture, err_capture): save_stdin = sys.stdin @@ -39,3 +61,85 @@ self.assertTrue("-print 'nothing'" in output) self.assertTrue("WARNING: couldn't encode 's diff for " "your terminal" in err.getvalue()) + + def setup_test_source_trees(self): + """Setup a test source tree and output destination tree.""" + self.temp_dir = tempfile.mkdtemp() # tearDown() cleans this up. + self.py2_src_dir = os.path.join(self.temp_dir, "python2_project") + self.py3_dest_dir = os.path.join(self.temp_dir, "python3_project") + os.mkdir(self.py2_src_dir) + os.mkdir(self.py3_dest_dir) + # Turn it into a package with a few files. + self.setup_files = [] + open(os.path.join(self.py2_src_dir, "__init__.py"), "w").close() + self.setup_files.append("__init__.py") + shutil.copy(PY2_TEST_MODULE, self.py2_src_dir) + self.setup_files.append(os.path.basename(PY2_TEST_MODULE)) + self.trivial_py2_file = os.path.join(self.py2_src_dir, "trivial.py") + self.init_py2_file = os.path.join(self.py2_src_dir, "__init__.py") + with open(self.trivial_py2_file, "w") as trivial: + trivial.write("print 'I need a simple conversion.'") + self.setup_files.append("trivial.py") + + def test_filename_changing_on_output_single_dir(self): + """2to3 a single directory with a new output dir and suffix.""" + self.setup_test_source_trees() + out = StringIO.StringIO() + err = StringIO.StringIO() + suffix = "TEST" + ret = self.run_2to3_capture( + ["-n", "--add-suffix", suffix, "--write-unchanged-files", + "--no-diffs", "--output-dir", + self.py3_dest_dir, self.py2_src_dir], + StringIO.StringIO(""), out, err) + self.assertEqual(ret, 0) + stderr = err.getvalue() + self.assertIn(" implies -w.", stderr) + self.assertIn( + "Output in %r will mirror the input directory %r layout" % ( + self.py3_dest_dir, self.py2_src_dir), stderr) + self.assertEqual(set(name+suffix for name in self.setup_files), + set(os.listdir(self.py3_dest_dir))) + for name in self.setup_files: + self.assertIn("Writing converted %s to %s" % ( + os.path.join(self.py2_src_dir, name), + os.path.join(self.py3_dest_dir, name+suffix)), stderr) + self.assertRegexpMatches(stderr, r"No changes to .*/__init__\.py") + self.assertNotRegex(stderr, r"No changes to .*/trivial\.py") + + def test_filename_changing_on_output_two_files(self): + """2to3 two files in one directory with a new output dir.""" + self.setup_test_source_trees() + err = StringIO.StringIO() + py2_files = [self.trivial_py2_file, self.init_py2_file] + expected_files = set(os.path.basename(name) for name in py2_files) + ret = self.run_2to3_capture( + ["-n", "-w", "--write-unchanged-files", + "--no-diffs", "--output-dir", self.py3_dest_dir] + py2_files, + StringIO.StringIO(""), StringIO.StringIO(), err) + self.assertEqual(ret, 0) + stderr = err.getvalue() + self.assertIn( + "Output in %r will mirror the input directory %r layout" % ( + self.py3_dest_dir, self.py2_src_dir), stderr) + self.assertEqual(expected_files, set(os.listdir(self.py3_dest_dir))) + + def test_filename_changing_on_output_single_file(self): + """2to3 a single file with a new output dir.""" + self.setup_test_source_trees() + err = StringIO.StringIO() + ret = self.run_2to3_capture( + ["-n", "-w", "--no-diffs", "--output-dir", self.py3_dest_dir, + self.trivial_py2_file], + StringIO.StringIO(""), StringIO.StringIO(), err) + self.assertEqual(ret, 0) + stderr = err.getvalue() + self.assertIn( + "Output in %r will mirror the input directory %r layout" % ( + self.py3_dest_dir, self.py2_src_dir), stderr) + self.assertEqual(set([os.path.basename(self.trivial_py2_file)]), + set(os.listdir(self.py3_dest_dir))) + + +if __name__ == '__main__': + unittest.main() diff --git a/Lib/lib2to3/tests/test_refactor.py b/Lib/lib2to3/tests/test_refactor.py --- a/Lib/lib2to3/tests/test_refactor.py +++ b/Lib/lib2to3/tests/test_refactor.py @@ -53,6 +53,12 @@ self.assertTrue(rt.driver.grammar is pygram.python_grammar_no_print_statement) + def test_write_unchanged_files_option(self): + rt = self.rt() + self.assertFalse(rt.write_unchanged_files) + rt = self.rt({"write_unchanged_files" : True}) + self.assertTrue(rt.write_unchanged_files) + def test_fixer_loading_helpers(self): contents = ["explicit", "first", "last", "parrot", "preorder"] non_prefixed = refactor.get_all_fix_names("myfixes") @@ -176,7 +182,9 @@ "", False] self.assertEqual(results, expected) - def check_file_refactoring(self, test_file, fixers=_2TO3_FIXERS): + def check_file_refactoring(self, test_file, fixers=_2TO3_FIXERS, + options=None, mock_log_debug=None, + actually_write=True): tmpdir = tempfile.mkdtemp(prefix="2to3-test_refactor") self.addCleanup(shutil.rmtree, tmpdir) # make a copy of the tested file that we can write to @@ -189,11 +197,15 @@ return fp.read() old_contents = read_file() - rt = self.rt(fixers=fixers) + rt = self.rt(fixers=fixers, options=options) + if mock_log_debug: + rt.log_debug = mock_log_debug rt.refactor_file(test_file) self.assertEqual(old_contents, read_file()) + if not actually_write: + return rt.refactor_file(test_file, True) new_contents = read_file() self.assertNotEqual(old_contents, new_contents) @@ -203,6 +215,26 @@ test_file = os.path.join(FIXER_DIR, "parrot_example.py") self.check_file_refactoring(test_file, _DEFAULT_FIXERS) + def test_refactor_file_write_unchanged_file(self): + test_file = os.path.join(FIXER_DIR, "parrot_example.py") + debug_messages = [] + def recording_log_debug(msg, *args): + debug_messages.append(msg % args) + self.check_file_refactoring(test_file, fixers=(), + options={"write_unchanged_files": True}, + mock_log_debug=recording_log_debug, + actually_write=False) + # Testing that it logged this message when write=False was passed is + # sufficient to see that it did not bail early after "No changes". + message_regex = r"Not writing changes to .*%s%s" % ( + os.sep, os.path.basename(test_file)) + for message in debug_messages: + if "Not writing changes" in message: + self.assertRegexpMatches(message, message_regex) + break + else: + self.fail("%r not matched in %r" % (message_regex, debug_messages)) + def test_refactor_dir(self): def check(structure, expected): def mock_refactor_file(self, f, *args): diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -489,12 +489,14 @@ Tools/Demos ----------- +- 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 #10639: reindent.py no longer converts newlines and will raise an error if attempting to convert a file with mixed newlines. -Tools/Demos ------------ - - Issue #13628: python-gdb.py is now able to retrieve more frames in the Python traceback if Python is optimized. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Feb 13 01:00:29 2012 From: python-checkins at python.org (gregory.p.smith) Date: Mon, 13 Feb 2012 01:00:29 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_3=2E2_-=3E_default=29?= =?utf8?q?=3A_Issue_=2313930=3A_Adds_ability_for_2to3_to_write_its_output_?= =?utf8?q?to_a_different?= Message-ID: http://hg.python.org/cpython/rev/4b791e513c2c changeset: 74897:4b791e513c2c parent: 74893:5d0f7b275fe9 parent: 74895:ceea9ebfe003 user: Gregory P. Smith date: Sun Feb 12 15:56:49 2012 -0800 summary: Issue #13930: Adds ability for 2to3 to write its output to a different directory tree instead of overwriting the input files. Adds three command line options: -o/--output-dir, -W/--write-unchanged-files and --add-suffix. files: Doc/library/2to3.rst | 32 +++++ Lib/lib2to3/main.py | 93 +++++++++++++++- Lib/lib2to3/refactor.py | 20 ++- Lib/lib2to3/tests/test_main.py | 100 ++++++++++++++++- Lib/lib2to3/tests/test_refactor.py | 36 +++++- Misc/NEWS | 9 + 6 files changed, 275 insertions(+), 15 deletions(-) diff --git a/Doc/library/2to3.rst b/Doc/library/2to3.rst --- a/Doc/library/2to3.rst +++ b/Doc/library/2to3.rst @@ -94,6 +94,38 @@ :option:`-p` to run fixers on code that already has had its print statements converted. +The :option:`-o` or :option:`--output-dir` option allows specification of an +alternate directory for processed output files to be written to. The +:option:`-n` flag is required when using this as backup files do not make sense +when not overwriting the input files. + +.. versionadded:: 3.2.3 + The :option:`-o` option was added. + +The :option:`-W` or :option:`--write-unchanged-files` flag tells 2to3 to always +write output files even if no changes were required to the file. This is most +useful with :option:`-o` so that an entire Python source tree is copied with +translation from one directory to another. +This option implies the :option:`-w` flag as it would not make sense otherwise. + +.. versionadded:: 3.2.3 + The :option:`-W` flag was added. + +The :option:`--add-suffix` option specifies a string to append to all output +filenames. The :option:`-n` flag is required when specifying this as backups +are not necessary when writing to different filenames. Example:: + + $ 2to3 -n -W --add-suffix=3 example.py + +Will cause a converted file named ``example.py3`` to be written. + +.. versionadded:: 3.2.3 + The :option:`--add-suffix` option was added. + +To translate an entire project from one directory tree to another use:: + + $ 2to3 --output-dir=python3-version/mycode -W -n python2-version/mycode + .. _2to3-fixers: diff --git a/Lib/lib2to3/main.py b/Lib/lib2to3/main.py --- a/Lib/lib2to3/main.py +++ b/Lib/lib2to3/main.py @@ -25,12 +25,41 @@ class StdoutRefactoringTool(refactor.MultiprocessRefactoringTool): """ + A refactoring tool that can avoid overwriting its input files. Prints output to stdout. + + Output files can optionally be written to a different directory and or + have an extra file suffix appended to their name for use in situations + where you do not want to replace the input files. """ - def __init__(self, fixers, options, explicit, nobackups, show_diffs): + def __init__(self, fixers, options, explicit, nobackups, show_diffs, + input_base_dir='', output_dir='', append_suffix=''): + """ + Args: + fixers: A list of fixers to import. + options: A dict with RefactoringTool configuration. + explicit: A list of fixers to run even if they are explicit. + nobackups: If true no backup '.bak' files will be created for those + files that are being refactored. + show_diffs: Should diffs of the refactoring be printed to stdout? + input_base_dir: The base directory for all input files. This class + will strip this path prefix off of filenames before substituting + it with output_dir. Only meaningful if output_dir is supplied. + All files processed by refactor() must start with this path. + output_dir: If supplied, all converted files will be written into + this directory tree instead of input_base_dir. + append_suffix: If supplied, all files output by this tool will have + this appended to their filename. Useful for changing .py to + .py3 for example by passing append_suffix='3'. + """ self.nobackups = nobackups self.show_diffs = show_diffs + if input_base_dir and not input_base_dir.endswith(os.sep): + input_base_dir += os.sep + self._input_base_dir = input_base_dir + self._output_dir = output_dir + self._append_suffix = append_suffix super(StdoutRefactoringTool, self).__init__(fixers, options, explicit) def log_error(self, msg, *args, **kwargs): @@ -38,6 +67,23 @@ self.logger.error(msg, *args, **kwargs) def write_file(self, new_text, filename, old_text, encoding): + orig_filename = filename + if self._output_dir: + if filename.startswith(self._input_base_dir): + filename = os.path.join(self._output_dir, + filename[len(self._input_base_dir):]) + else: + raise ValueError('filename %s does not start with the ' + 'input_base_dir %s' % ( + filename, self._input_base_dir)) + if self._append_suffix: + filename += self._append_suffix + if orig_filename != filename: + output_dir = os.path.dirname(filename) + if not os.path.isdir(output_dir): + os.makedirs(output_dir) + self.log_message('Writing converted %s to %s.', orig_filename, + filename) if not self.nobackups: # Make backup backup = filename + ".bak" @@ -55,6 +101,9 @@ write(new_text, filename, old_text, encoding) if not self.nobackups: shutil.copymode(backup, filename) + if orig_filename != filename: + # Preserve the file mode in the new output directory. + shutil.copymode(orig_filename, filename) def print_output(self, old, new, filename, equal): if equal: @@ -113,11 +162,33 @@ help="Write back modified files") parser.add_option("-n", "--nobackups", action="store_true", default=False, help="Don't write backups for modified files") + parser.add_option("-o", "--output-dir", action="store", type="str", + default="", help="Put output files in this directory " + "instead of overwriting the input files. Requires -n.") + parser.add_option("-W", "--write-unchanged-files", action="store_true", + help="Also write files even if no changes were required" + " (useful with --output-dir); implies -w.") + parser.add_option("--add-suffix", action="store", type="str", default="", + help="Append this string to all output filenames." + " Requires -n if non-empty. " + "ex: --add-suffix='3' will generate .py3 files.") # Parse command line arguments refactor_stdin = False flags = {} options, args = parser.parse_args(args) + if options.write_unchanged_files: + flags["write_unchanged_files"] = True + if not options.write: + warn("--write-unchanged-files/-W implies -w.") + options.write = True + # If we allowed these, the original files would be renamed to backup names + # but not replaced. + if options.output_dir and not options.nobackups: + parser.error("Can't use --output-dir/-o without -n.") + if options.add_suffix and not options.nobackups: + parser.error("Can't use --add-suffix without -n.") + if not options.write and options.no_diffs: warn("not writing files and not printing diffs; that's not very useful") if not options.write and options.nobackups: @@ -143,6 +214,7 @@ # Set up logging handler level = logging.DEBUG if options.verbose else logging.INFO logging.basicConfig(format='%(name)s: %(message)s', level=level) + logger = logging.getLogger('lib2to3.main') # Initialize the refactoring tool avail_fixes = set(refactor.get_fixers_from_package(fixer_pkg)) @@ -159,8 +231,23 @@ else: requested = avail_fixes.union(explicit) fixer_names = requested.difference(unwanted_fixes) - rt = StdoutRefactoringTool(sorted(fixer_names), flags, sorted(explicit), - options.nobackups, not options.no_diffs) + input_base_dir = os.path.commonprefix(args) + if (input_base_dir and not input_base_dir.endswith(os.sep) + and not os.path.isdir(input_base_dir)): + # One or more similar names were passed, their directory is the base. + # os.path.commonprefix() is ignorant of path elements, this corrects + # for that weird API. + input_base_dir = os.path.dirname(input_base_dir) + if options.output_dir: + input_base_dir = input_base_dir.rstrip(os.sep) + logger.info('Output in %r will mirror the input directory %r layout.', + options.output_dir, input_base_dir) + rt = StdoutRefactoringTool( + sorted(fixer_names), flags, sorted(explicit), + options.nobackups, not options.no_diffs, + input_base_dir=input_base_dir, + output_dir=options.output_dir, + append_suffix=options.add_suffix) # Refactor all files and directories passed as arguments if not rt.errors: diff --git a/Lib/lib2to3/refactor.py b/Lib/lib2to3/refactor.py --- a/Lib/lib2to3/refactor.py +++ b/Lib/lib2to3/refactor.py @@ -173,7 +173,8 @@ class RefactoringTool(object): - _default_options = {"print_function" : False} + _default_options = {"print_function" : False, + "write_unchanged_files" : False} CLASS_PREFIX = "Fix" # The prefix for fixer classes FILE_PREFIX = "fix_" # The prefix for modules with a fixer within @@ -195,6 +196,10 @@ self.grammar = pygram.python_grammar_no_print_statement else: self.grammar = pygram.python_grammar + # When this is True, the refactor*() methods will call write_file() for + # files processed even if they were not changed during refactoring. If + # and only if the refactor method's write parameter was True. + self.write_unchanged_files = self.options.get("write_unchanged_files") self.errors = [] self.logger = logging.getLogger("RefactoringTool") self.fixer_log = [] @@ -341,13 +346,13 @@ if doctests_only: self.log_debug("Refactoring doctests in %s", filename) output = self.refactor_docstring(input, filename) - if output != input: + if self.write_unchanged_files or output != input: self.processed_file(output, filename, input, write, encoding) else: self.log_debug("No doctest changes in %s", filename) else: tree = self.refactor_string(input, filename) - if tree and tree.was_changed: + if self.write_unchanged_files or (tree and tree.was_changed): # The [:-1] is to take off the \n we added earlier self.processed_file(str(tree)[:-1], filename, write=write, encoding=encoding) @@ -386,13 +391,13 @@ if doctests_only: self.log_debug("Refactoring doctests in stdin") output = self.refactor_docstring(input, "") - if output != input: + if self.write_unchanged_files or output != input: self.processed_file(output, "", input) else: self.log_debug("No doctest changes in stdin") else: tree = self.refactor_string(input, "") - if tree and tree.was_changed: + if self.write_unchanged_files or (tree and tree.was_changed): self.processed_file(str(tree), "", input) else: self.log_debug("No changes in stdin") @@ -502,7 +507,7 @@ def processed_file(self, new_text, filename, old_text=None, write=False, encoding=None): """ - Called when a file has been refactored, and there are changes. + Called when a file has been refactored and there may be changes. """ self.files.append(filename) if old_text is None: @@ -513,7 +518,8 @@ self.print_output(old_text, new_text, filename, equal) if equal: self.log_debug("No changes to %s", filename) - return + if not self.write_unchanged_files: + return if write: self.write_file(new_text, filename, old_text, encoding) else: diff --git a/Lib/lib2to3/tests/test_main.py b/Lib/lib2to3/tests/test_main.py --- a/Lib/lib2to3/tests/test_main.py +++ b/Lib/lib2to3/tests/test_main.py @@ -1,18 +1,30 @@ # -*- coding: utf-8 -*- +import codecs +import io +import logging +import os +import shutil import sys -import codecs -import logging -import io +import tempfile import unittest from lib2to3 import main +TEST_DATA_DIR = os.path.join(os.path.dirname(__file__), "data") +PY2_TEST_MODULE = os.path.join(TEST_DATA_DIR, "py2_test_grammar.py") + + class TestMain(unittest.TestCase): + def setUp(self): + self.temp_dir = None # tearDown() will rmtree this directory if set. + def tearDown(self): # Clean up logging configuration down by main. del logging.root.handlers[:] + if self.temp_dir: + shutil.rmtree(self.temp_dir) def run_2to3_capture(self, args, in_capture, out_capture, err_capture): save_stdin = sys.stdin @@ -39,3 +51,85 @@ self.assertTrue("-print 'nothing'" in output) self.assertTrue("WARNING: couldn't encode 's diff for " "your terminal" in err.getvalue()) + + def setup_test_source_trees(self): + """Setup a test source tree and output destination tree.""" + self.temp_dir = tempfile.mkdtemp() # tearDown() cleans this up. + self.py2_src_dir = os.path.join(self.temp_dir, "python2_project") + self.py3_dest_dir = os.path.join(self.temp_dir, "python3_project") + os.mkdir(self.py2_src_dir) + os.mkdir(self.py3_dest_dir) + # Turn it into a package with a few files. + self.setup_files = [] + open(os.path.join(self.py2_src_dir, "__init__.py"), "w").close() + self.setup_files.append("__init__.py") + shutil.copy(PY2_TEST_MODULE, self.py2_src_dir) + self.setup_files.append(os.path.basename(PY2_TEST_MODULE)) + self.trivial_py2_file = os.path.join(self.py2_src_dir, "trivial.py") + self.init_py2_file = os.path.join(self.py2_src_dir, "__init__.py") + with open(self.trivial_py2_file, "w") as trivial: + trivial.write("print 'I need a simple conversion.'") + self.setup_files.append("trivial.py") + + def test_filename_changing_on_output_single_dir(self): + """2to3 a single directory with a new output dir and suffix.""" + self.setup_test_source_trees() + out = io.StringIO() + err = io.StringIO() + suffix = "TEST" + ret = self.run_2to3_capture( + ["-n", "--add-suffix", suffix, "--write-unchanged-files", + "--no-diffs", "--output-dir", + self.py3_dest_dir, self.py2_src_dir], + io.StringIO(""), out, err) + self.assertEqual(ret, 0) + stderr = err.getvalue() + self.assertIn(" implies -w.", stderr) + self.assertIn( + "Output in %r will mirror the input directory %r layout" % ( + self.py3_dest_dir, self.py2_src_dir), stderr) + self.assertEqual(set(name+suffix for name in self.setup_files), + set(os.listdir(self.py3_dest_dir))) + for name in self.setup_files: + self.assertIn("Writing converted %s to %s" % ( + os.path.join(self.py2_src_dir, name), + os.path.join(self.py3_dest_dir, name+suffix)), stderr) + self.assertRegexpMatches(stderr, r"No changes to .*/__init__\.py") + self.assertNotRegex(stderr, r"No changes to .*/trivial\.py") + + def test_filename_changing_on_output_two_files(self): + """2to3 two files in one directory with a new output dir.""" + self.setup_test_source_trees() + err = io.StringIO() + py2_files = [self.trivial_py2_file, self.init_py2_file] + expected_files = set(os.path.basename(name) for name in py2_files) + ret = self.run_2to3_capture( + ["-n", "-w", "--write-unchanged-files", + "--no-diffs", "--output-dir", self.py3_dest_dir] + py2_files, + io.StringIO(""), io.StringIO(), err) + self.assertEqual(ret, 0) + stderr = err.getvalue() + self.assertIn( + "Output in %r will mirror the input directory %r layout" % ( + self.py3_dest_dir, self.py2_src_dir), stderr) + self.assertEqual(expected_files, set(os.listdir(self.py3_dest_dir))) + + def test_filename_changing_on_output_single_file(self): + """2to3 a single file with a new output dir.""" + self.setup_test_source_trees() + err = io.StringIO() + ret = self.run_2to3_capture( + ["-n", "-w", "--no-diffs", "--output-dir", self.py3_dest_dir, + self.trivial_py2_file], + io.StringIO(""), io.StringIO(), err) + self.assertEqual(ret, 0) + stderr = err.getvalue() + self.assertIn( + "Output in %r will mirror the input directory %r layout" % ( + self.py3_dest_dir, self.py2_src_dir), stderr) + self.assertEqual(set([os.path.basename(self.trivial_py2_file)]), + set(os.listdir(self.py3_dest_dir))) + + +if __name__ == '__main__': + unittest.main() diff --git a/Lib/lib2to3/tests/test_refactor.py b/Lib/lib2to3/tests/test_refactor.py --- a/Lib/lib2to3/tests/test_refactor.py +++ b/Lib/lib2to3/tests/test_refactor.py @@ -53,6 +53,12 @@ self.assertTrue(rt.driver.grammar is pygram.python_grammar_no_print_statement) + def test_write_unchanged_files_option(self): + rt = self.rt() + self.assertFalse(rt.write_unchanged_files) + rt = self.rt({"write_unchanged_files" : True}) + self.assertTrue(rt.write_unchanged_files) + def test_fixer_loading_helpers(self): contents = ["explicit", "first", "last", "parrot", "preorder"] non_prefixed = refactor.get_all_fix_names("myfixes") @@ -176,7 +182,9 @@ "", False] self.assertEqual(results, expected) - def check_file_refactoring(self, test_file, fixers=_2TO3_FIXERS): + def check_file_refactoring(self, test_file, fixers=_2TO3_FIXERS, + options=None, mock_log_debug=None, + actually_write=True): tmpdir = tempfile.mkdtemp(prefix="2to3-test_refactor") self.addCleanup(shutil.rmtree, tmpdir) # make a copy of the tested file that we can write to @@ -189,11 +197,15 @@ return fp.read() old_contents = read_file() - rt = self.rt(fixers=fixers) + rt = self.rt(fixers=fixers, options=options) + if mock_log_debug: + rt.log_debug = mock_log_debug rt.refactor_file(test_file) self.assertEqual(old_contents, read_file()) + if not actually_write: + return rt.refactor_file(test_file, True) new_contents = read_file() self.assertNotEqual(old_contents, new_contents) @@ -203,6 +215,26 @@ test_file = os.path.join(FIXER_DIR, "parrot_example.py") self.check_file_refactoring(test_file, _DEFAULT_FIXERS) + def test_refactor_file_write_unchanged_file(self): + test_file = os.path.join(FIXER_DIR, "parrot_example.py") + debug_messages = [] + def recording_log_debug(msg, *args): + debug_messages.append(msg % args) + self.check_file_refactoring(test_file, fixers=(), + options={"write_unchanged_files": True}, + mock_log_debug=recording_log_debug, + actually_write=False) + # Testing that it logged this message when write=False was passed is + # sufficient to see that it did not bail early after "No changes". + message_regex = r"Not writing changes to .*%s%s" % ( + os.sep, os.path.basename(test_file)) + for message in debug_messages: + if "Not writing changes" in message: + self.assertRegexpMatches(message, message_regex) + break + else: + self.fail("%r not matched in %r" % (message_regex, debug_messages)) + def test_refactor_dir(self): def check(structure, expected): def mock_refactor_file(self, f, *args): diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -466,6 +466,10 @@ Library ------- +- 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 #9750: Fix sqlite3.Connection.iterdump on tables and fields with a name that is a keyword or contains quotes. Patch by Marko Kohtala. @@ -1927,6 +1931,11 @@ Tools/Demos ----------- +- 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. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Feb 13 01:00:31 2012 From: python-checkins at python.org (gregory.p.smith) Date: Mon, 13 Feb 2012 01:00:31 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=283=2E2=29=3A_fix_whitespace_?= =?utf8?q?normalization_before_pushing=2E?= Message-ID: http://hg.python.org/cpython/rev/ea9f663d94d3 changeset: 74898:ea9f663d94d3 branch: 3.2 parent: 74895:ceea9ebfe003 user: Gregory P. Smith date: Sun Feb 12 15:58:36 2012 -0800 summary: fix whitespace normalization before pushing. files: Lib/lib2to3/main.py | 10 +++++----- 1 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Lib/lib2to3/main.py b/Lib/lib2to3/main.py --- a/Lib/lib2to3/main.py +++ b/Lib/lib2to3/main.py @@ -79,11 +79,11 @@ if self._append_suffix: filename += self._append_suffix if orig_filename != filename: - output_dir = os.path.dirname(filename) - if not os.path.isdir(output_dir): - os.makedirs(output_dir) - self.log_message('Writing converted %s to %s.', orig_filename, - filename) + output_dir = os.path.dirname(filename) + if not os.path.isdir(output_dir): + os.makedirs(output_dir) + self.log_message('Writing converted %s to %s.', orig_filename, + filename) if not self.nobackups: # Make backup backup = filename + ".bak" -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Feb 13 01:00:31 2012 From: python-checkins at python.org (gregory.p.smith) Date: Mon, 13 Feb 2012 01:00:31 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_3=2E2_-=3E_default=29?= =?utf8?q?=3A_fix_whitespace_normalization_before_pushing=2E?= Message-ID: http://hg.python.org/cpython/rev/0be50d7c4ae1 changeset: 74899:0be50d7c4ae1 parent: 74897:4b791e513c2c parent: 74898:ea9f663d94d3 user: Gregory P. Smith date: Sun Feb 12 15:59:00 2012 -0800 summary: fix whitespace normalization before pushing. files: Lib/lib2to3/main.py | 10 +++++----- 1 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Lib/lib2to3/main.py b/Lib/lib2to3/main.py --- a/Lib/lib2to3/main.py +++ b/Lib/lib2to3/main.py @@ -79,11 +79,11 @@ if self._append_suffix: filename += self._append_suffix if orig_filename != filename: - output_dir = os.path.dirname(filename) - if not os.path.isdir(output_dir): - os.makedirs(output_dir) - self.log_message('Writing converted %s to %s.', orig_filename, - filename) + output_dir = os.path.dirname(filename) + if not os.path.isdir(output_dir): + os.makedirs(output_dir) + self.log_message('Writing converted %s to %s.', orig_filename, + filename) if not self.nobackups: # Make backup backup = filename + ".bak" -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Feb 13 01:00:35 2012 From: python-checkins at python.org (gregory.p.smith) Date: Mon, 13 Feb 2012 01:00:35 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=282=2E7=29=3A_fix_whitespace_?= =?utf8?q?normalization_before_pushing=2E?= Message-ID: http://hg.python.org/cpython/rev/6653328a02d0 changeset: 74900:6653328a02d0 branch: 2.7 parent: 74896:9f583700d27f user: Gregory P. Smith date: Sun Feb 12 15:59:35 2012 -0800 summary: fix whitespace normalization before pushing. files: Lib/lib2to3/main.py | 10 +++++----- 1 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Lib/lib2to3/main.py b/Lib/lib2to3/main.py --- a/Lib/lib2to3/main.py +++ b/Lib/lib2to3/main.py @@ -79,11 +79,11 @@ if self._append_suffix: filename += self._append_suffix if orig_filename != filename: - output_dir = os.path.dirname(filename) - if not os.path.isdir(output_dir): - os.makedirs(output_dir) - self.log_message('Writing converted %s to %s.', orig_filename, - filename) + output_dir = os.path.dirname(filename) + if not os.path.isdir(output_dir): + os.makedirs(output_dir) + self.log_message('Writing converted %s to %s.', orig_filename, + filename) if not self.nobackups: # Make backup backup = filename + ".bak" -- Repository URL: http://hg.python.org/cpython From solipsis at pitrou.net Mon Feb 13 05:32:50 2012 From: solipsis at pitrou.net (solipsis at pitrou.net) Date: Mon, 13 Feb 2012 05:32:50 +0100 Subject: [Python-checkins] Daily reference leaks (0be50d7c4ae1): sum=0 Message-ID: results for 0be50d7c4ae1 on branch "default" -------------------------------------------- Command line was: ['./python', '-m', 'test.regrtest', '-uall', '-R', '3:3:/home/antoine/cpython/refleaks/reflogmJHaR8', '-x'] From python-checkins at python.org Mon Feb 13 10:42:38 2012 From: python-checkins at python.org (ezio.melotti) Date: Mon, 13 Feb 2012 10:42:38 +0100 Subject: [Python-checkins] =?utf8?b?Y3B5dGhvbiAoMy4yKTogIzEzOTkzOiBIVE1M?= =?utf8?q?Parser_is_now_able_to_handle_broken_end_tags_when_strict=3DFalse?= =?utf8?q?=2E?= Message-ID: http://hg.python.org/cpython/rev/df5e5eea7833 changeset: 74901:df5e5eea7833 branch: 3.2 parent: 74898:ea9f663d94d3 user: Ezio Melotti date: Mon Feb 13 11:24:50 2012 +0200 summary: #13993: HTMLParser is now able to handle broken end tags when strict=False. files: Lib/html/parser.py | 42 +++++++++++++++-------- Lib/test/test_htmlparser.py | 43 +++++++++++++++++++++++- Misc/NEWS | 3 + 3 files changed, 71 insertions(+), 17 deletions(-) diff --git a/Lib/html/parser.py b/Lib/html/parser.py --- a/Lib/html/parser.py +++ b/Lib/html/parser.py @@ -23,6 +23,9 @@ piclose = re.compile('>') commentclose = re.compile(r'--\s*>') tagfind = re.compile('[a-zA-Z][-.a-zA-Z0-9:_]*') +# see http://www.w3.org/TR/html5/tokenization.html#tag-open-state +# and http://www.w3.org/TR/html5/tokenization.html#tag-name-state +tagfind_tolerant = re.compile('[a-zA-Z][^\t\n\r\f />\x00]*') # Note, the strict one of this pair isn't really strict, but we can't # make it correctly strict without breaking backward compatibility. attrfind = re.compile( @@ -270,7 +273,7 @@ # 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] != '', i+2) if pos == -1: @@ -398,31 +401,40 @@ match = endendtag.search(rawdata, i+1) # > if not match: return -1 - j = match.end() + gtpos = match.end() match = endtagfind.match(rawdata, i) # if not match: if self.cdata_elem is not None: - self.handle_data(rawdata[i:j]) - return j + self.handle_data(rawdata[i:gtpos]) + return gtpos if self.strict: - self.error("bad end tag: %r" % (rawdata[i:j],)) - k = rawdata.find('<', i + 1, j) - if k > i: - j = k - if j <= i: - j = i + 1 - self.handle_data(rawdata[i:j]) - return j + self.error("bad end tag: %r" % (rawdata[i:gtpos],)) + # find the name: w3.org/TR/html5/tokenization.html#tag-name-state + namematch = tagfind_tolerant.match(rawdata, i+2) + if not namematch: + # w3.org/TR/html5/tokenization.html#end-tag-open-state + if rawdata[i:i+3] == '': + return i+3 + else: + return self.parse_bogus_comment(i) + tagname = namematch.group().lower() + # consume and ignore other stuff between the name and the > + # Note: this is not 100% correct, since we might have things like + # , but looking for > after tha name should cover + # most of the cases and is much simpler + gtpos = rawdata.find('>', namematch.end()) + self.handle_endtag(tagname) + return gtpos+1 elem = match.group(1).lower() # script or style if self.cdata_elem is not None: if elem != self.cdata_elem: - self.handle_data(rawdata[i:j]) - return j + self.handle_data(rawdata[i:gtpos]) + return gtpos self.handle_endtag(elem.lower()) self.clear_cdata_mode() - return j + return gtpos # Overridable -- finish processing of start+end tag: def handle_startendtag(self, tag, attrs): diff --git a/Lib/test/test_htmlparser.py b/Lib/test/test_htmlparser.py --- a/Lib/test/test_htmlparser.py +++ b/Lib/test/test_htmlparser.py @@ -364,8 +364,9 @@ ('data', '<'), + ('comment', '/img'), + ('endtag', 'html<')]) def test_with_unquoted_attributes(self): # see #12008 @@ -403,6 +404,44 @@ ('starttag', 'form', [('action', 'bogus|&#()value')])]) + def test_invalid_end_tags(self): + # A collection of broken end tags.
is used as separator. + # see http://www.w3.org/TR/html5/tokenization.html#end-tag-open-state + # and #13993 + html = ('



' + '


') + expected = [('starttag', 'br', []), + # < is part of the name, / is discarded, p is an attribute + ('endtag', 'label<'), + ('starttag', 'br', []), + # text and attributes are discarded + ('endtag', 'div'), + ('starttag', 'br', []), + # comment because the first char after is ignored + ('starttag', 'br', [])] + self._run_check(html, expected) + + def test_broken_invalid_end_tag(self): + # This is technically wrong (the "> shouldn't be included in the 'data') + # but is probably not worth fixing it (in addition to all the cases of + # the previous test, it would require a full attribute parsing). + # see #13993 + html = 'This confuses the parser' + expected = [('starttag', 'b', []), + ('data', 'This'), + ('endtag', 'b'), + ('data', '"> confuses the parser')] + self._run_check(html, expected) + def test_correct_detection_of_start_tags(self): # see #13273 html = ('
The rain ' diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -113,6 +113,9 @@ Library ------- +- 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. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Feb 13 10:42:39 2012 From: python-checkins at python.org (ezio.melotti) Date: Mon, 13 Feb 2012 10:42:39 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_3=2E2_-=3E_default=29?= =?utf8?q?=3A_=2313993=3A_merge_with_3=2E2=2E?= Message-ID: http://hg.python.org/cpython/rev/2e66baa1d86a changeset: 74902:2e66baa1d86a parent: 74899:0be50d7c4ae1 parent: 74901:df5e5eea7833 user: Ezio Melotti date: Mon Feb 13 11:42:29 2012 +0200 summary: #13993: merge with 3.2. files: Lib/html/parser.py | 42 +++++++++++++++-------- Lib/test/test_htmlparser.py | 43 +++++++++++++++++++++++- Misc/NEWS | 3 + 3 files changed, 71 insertions(+), 17 deletions(-) diff --git a/Lib/html/parser.py b/Lib/html/parser.py --- a/Lib/html/parser.py +++ b/Lib/html/parser.py @@ -23,6 +23,9 @@ piclose = re.compile('>') commentclose = re.compile(r'--\s*>') tagfind = re.compile('[a-zA-Z][-.a-zA-Z0-9:_]*') +# see http://www.w3.org/TR/html5/tokenization.html#tag-open-state +# and http://www.w3.org/TR/html5/tokenization.html#tag-name-state +tagfind_tolerant = re.compile('[a-zA-Z][^\t\n\r\f />\x00]*') # Note, the strict one of this pair isn't really strict, but we can't # make it correctly strict without breaking backward compatibility. attrfind = re.compile( @@ -270,7 +273,7 @@ # 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] != '', i+2) if pos == -1: @@ -398,31 +401,40 @@ match = endendtag.search(rawdata, i+1) # > if not match: return -1 - j = match.end() + gtpos = match.end() match = endtagfind.match(rawdata, i) # if not match: if self.cdata_elem is not None: - self.handle_data(rawdata[i:j]) - return j + self.handle_data(rawdata[i:gtpos]) + return gtpos if self.strict: - self.error("bad end tag: %r" % (rawdata[i:j],)) - k = rawdata.find('<', i + 1, j) - if k > i: - j = k - if j <= i: - j = i + 1 - self.handle_data(rawdata[i:j]) - return j + self.error("bad end tag: %r" % (rawdata[i:gtpos],)) + # find the name: w3.org/TR/html5/tokenization.html#tag-name-state + namematch = tagfind_tolerant.match(rawdata, i+2) + if not namematch: + # w3.org/TR/html5/tokenization.html#end-tag-open-state + if rawdata[i:i+3] == '': + return i+3 + else: + return self.parse_bogus_comment(i) + tagname = namematch.group().lower() + # consume and ignore other stuff between the name and the > + # Note: this is not 100% correct, since we might have things like + # , but looking for > after tha name should cover + # most of the cases and is much simpler + gtpos = rawdata.find('>', namematch.end()) + self.handle_endtag(tagname) + return gtpos+1 elem = match.group(1).lower() # script or style if self.cdata_elem is not None: if elem != self.cdata_elem: - self.handle_data(rawdata[i:j]) - return j + self.handle_data(rawdata[i:gtpos]) + return gtpos self.handle_endtag(elem.lower()) self.clear_cdata_mode() - return j + return gtpos # Overridable -- finish processing of start+end tag: def handle_startendtag(self, tag, attrs): diff --git a/Lib/test/test_htmlparser.py b/Lib/test/test_htmlparser.py --- a/Lib/test/test_htmlparser.py +++ b/Lib/test/test_htmlparser.py @@ -364,8 +364,9 @@ ('data', '<'), + ('comment', '/img'), + ('endtag', 'html<')]) def test_with_unquoted_attributes(self): # see #12008 @@ -403,6 +404,44 @@ ('starttag', 'form', [('action', 'bogus|&#()value')])]) + def test_invalid_end_tags(self): + # A collection of broken end tags.
is used as separator. + # see http://www.w3.org/TR/html5/tokenization.html#end-tag-open-state + # and #13993 + html = ('



' + '


') + expected = [('starttag', 'br', []), + # < is part of the name, / is discarded, p is an attribute + ('endtag', 'label<'), + ('starttag', 'br', []), + # text and attributes are discarded + ('endtag', 'div'), + ('starttag', 'br', []), + # comment because the first char after is ignored + ('starttag', 'br', [])] + self._run_check(html, expected) + + def test_broken_invalid_end_tag(self): + # This is technically wrong (the "> shouldn't be included in the 'data') + # but is probably not worth fixing it (in addition to all the cases of + # the previous test, it would require a full attribute parsing). + # see #13993 + html = 'This confuses the parser' + expected = [('starttag', 'b', []), + ('data', 'This'), + ('endtag', 'b'), + ('data', '"> confuses the parser')] + self._run_check(html, expected) + def test_correct_detection_of_start_tags(self): # see #13273 html = ('
The rain ' diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -466,6 +466,9 @@ Library ------- +- Issue #13993: HTMLParser is now able to handle broken end tags when + strict=False. + - Issue #13930: lib2to3 now supports writing converted output files to another directory tree as well as copying unchanged files and altering the file suffix. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Feb 13 11:04:53 2012 From: python-checkins at python.org (florent.xicluna) Date: Mon, 13 Feb 2012 11:04:53 +0100 Subject: [Python-checkins] =?utf8?q?cpython=3A_Issue_=2313988=3A_cElementT?= =?utf8?q?ree_is_deprecated_and_the_=5Felementtree_accelerator_is?= Message-ID: http://hg.python.org/cpython/rev/65fc79fb4eb2 changeset: 74903:65fc79fb4eb2 user: Florent Xicluna date: Mon Feb 13 11:03:30 2012 +0100 summary: Issue #13988: cElementTree is deprecated and the _elementtree accelerator is automatically used whenever available. files: Doc/library/xml.etree.elementtree.rst | 9 +- Doc/whatsnew/3.3.rst | 2 + Lib/test/test_xml_etree.py | 49 ++-- Lib/test/test_xml_etree_c.py | 23 +- Lib/xml/etree/ElementTree.py | 90 +++++++- Lib/xml/etree/cElementTree.py | 154 +------------- Misc/NEWS | 3 + Modules/_elementtree.c | 6 +- 8 files changed, 133 insertions(+), 203 deletions(-) diff --git a/Doc/library/xml.etree.elementtree.rst b/Doc/library/xml.etree.elementtree.rst --- a/Doc/library/xml.etree.elementtree.rst +++ b/Doc/library/xml.etree.elementtree.rst @@ -32,17 +32,18 @@ The :class:`ElementTree` class can be used to wrap an element structure, and convert it from and to XML. -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. +docs. .. versionchanged:: 3.2 The ElementTree API is updated to 1.3. For more information, see `Introducing ElementTree 1.3 `_. +.. versionchanged:: 3.3 + This module will use a fast implementation whenever available. + The :mod:`xml.etree.cElementTree` module is deprecated. + .. _elementtree-functions: diff --git a/Doc/whatsnew/3.3.rst b/Doc/whatsnew/3.3.rst --- a/Doc/whatsnew/3.3.rst +++ b/Doc/whatsnew/3.3.rst @@ -842,6 +842,8 @@ * :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. Deprecated functions and types of the C API diff --git a/Lib/test/test_xml_etree.py b/Lib/test/test_xml_etree.py --- a/Lib/test/test_xml_etree.py +++ b/Lib/test/test_xml_etree.py @@ -16,9 +16,9 @@ import unittest from test import support -from test.support import findfile +from test.support import findfile, import_fresh_module -from xml.etree import ElementTree as ET +pyET = import_fresh_module('xml.etree.ElementTree', blocked=['_elementtree']) SIMPLE_XMLFILE = findfile("simple.xml", subdir="xmltestdata") try: @@ -275,7 +275,7 @@ """ Test find methods using the elementpath fallback. - >>> from xml.etree import ElementTree + >>> ElementTree = pyET >>> CurrentElementPath = ElementTree.ElementPath >>> ElementTree.ElementPath = ElementTree._SimpleElementPath() @@ -460,17 +460,19 @@ """ 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 """ @@ -1879,37 +1881,38 @@ 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 + if hasattr(ET, '_namespace_map'): + self._nsmap = ET._namespace_map + else: + # when testing the cElementTree alias + from xml.etree.ElementTree import _namespace_map + self._nsmap = _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'): +def test_main(module=pyET): from test import test_xml_etree - 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 + test_xml_etree.ET = module # XXX the C module should give the same warnings as the Python module - with CleanContext(quiet=not use_py_module): + with CleanContext(quiet=(module is not pyET)): support.run_doctest(test_xml_etree, verbosity=True) - # 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 --- a/Lib/test/test_xml_etree_c.py +++ b/Lib/test/test_xml_etree_c.py @@ -1,10 +1,9 @@ # xml.etree test for cElementTree from test import support -from test.support import bigmemtest, _2G import unittest -cET = support.import_module('xml.etree.cElementTree') +from xml.etree import ElementTree as cET, cElementTree as cET_alias # cElementTree specific tests @@ -13,10 +12,9 @@ r""" Import sanity. - >>> from xml.etree import cElementTree - Issue #6697. + >>> cElementTree = cET >>> e = cElementTree.Element('a') >>> getattr(e, '\uD800') # doctest: +ELLIPSIS Traceback (most recent call last): @@ -55,19 +53,10 @@ 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__ + # Run the same test suite as the Python module + test_xml_etree.test_main(module=cET) + # Exercise the deprecated alias + test_xml_etree.test_main(module=cET_alias) if __name__ == '__main__': test_main() diff --git a/Lib/xml/etree/ElementTree.py b/Lib/xml/etree/ElementTree.py --- a/Lib/xml/etree/ElementTree.py +++ b/Lib/xml/etree/ElementTree.py @@ -68,8 +68,9 @@ "tostring", "tostringlist", "TreeBuilder", "VERSION", - "XML", + "XML", "XMLID", "XMLParser", "XMLTreeBuilder", + "register_namespace", ] VERSION = "1.3.0" @@ -148,9 +149,9 @@ # @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 @@ -1684,6 +1685,87 @@ del self.target, self._parser # get rid of circular references return tree + +# 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 --- a/Lib/xml/etree/cElementTree.py +++ b/Lib/xml/etree/cElementTree.py @@ -1,153 +1,3 @@ -# Wrapper module for _elementtree +# Deprecated alias for xml.etree.ElementTree -from xml.etree.ElementTree import (ElementTree, dump, iselement, QName, - fromstringlist, - tostring, tostringlist, VERSION) -# These ones are not in ElementTree.__all__ -from xml.etree.ElementTree import ElementPath, register_namespace - -# Import the C accelerators: -# Element, SubElement, TreeBuilder, XMLParser, ParseError -from _elementtree import * - - -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 - - -# ============================================================================= -# -# Everything below this line can be removed -# after cElementTree is folded behind ElementTree. -# -# ============================================================================= - -from xml.etree.ElementTree import Comment as _Comment, PI as _PI - - -def parse(source, parser=None): - tree = ElementTree() - tree.parse(source, parser) - return tree - - -def XML(text, parser=None): - if not parser: - parser = XMLParser() - parser = XMLParser() - parser.feed(text) - return parser.close() - - -def XMLID(text, parser=None): - tree = XML(text, parser=parser) - ids = {} - for elem in tree.iter(): - id = elem.get('id') - if id: - ids[id] = elem - return tree, ids - - -class CommentProxy: - - def __call__(self, text=None): - element = Element(_Comment) - element.text = text - return element - - def __eq__(self, other): - return _Comment == other - - -class PIProxy: - - def __call__(self, target, text=None): - element = Element(_PI) - element.text = target - if text: - element.text = element.text + ' ' + text - return element - - def __eq__(self, other): - return _PI == other - - -Comment = CommentProxy() -PI = ProcessingInstruction = PIProxy() -del CommentProxy, PIProxy - -# Aliases -fromstring = XML -XMLTreeBuilder = XMLParser +from xml.etree.ElementTree import * diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -1886,6 +1886,9 @@ - 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 ----- diff --git a/Modules/_elementtree.c b/Modules/_elementtree.c --- a/Modules/_elementtree.c +++ b/Modules/_elementtree.c @@ -70,7 +70,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. */ @@ -2649,7 +2649,7 @@ 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; @@ -2906,7 +2906,7 @@ #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); -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Feb 13 12:15:17 2012 From: python-checkins at python.org (florent.xicluna) Date: Mon, 13 Feb 2012 12:15:17 +0100 Subject: [Python-checkins] =?utf8?q?cpython=3A_Fix_xml=5Fetree=5Fc_test_er?= =?utf8?q?ror_=28follow_up_of_issue_=2313988=29=2E?= Message-ID: http://hg.python.org/cpython/rev/e9cf34d56ff1 changeset: 74904:e9cf34d56ff1 user: Florent Xicluna date: Mon Feb 13 12:14:52 2012 +0100 summary: Fix xml_etree_c test error (follow up of issue #13988). files: Lib/test/test_xml_etree_c.py | 4 +++- 1 files changed, 3 insertions(+), 1 deletions(-) diff --git a/Lib/test/test_xml_etree_c.py b/Lib/test/test_xml_etree_c.py --- a/Lib/test/test_xml_etree_c.py +++ b/Lib/test/test_xml_etree_c.py @@ -1,9 +1,11 @@ # xml.etree test for cElementTree from test import support +from test.support import import_fresh_module import unittest -from xml.etree import ElementTree as cET, cElementTree as cET_alias +cET = import_fresh_module('xml.etree.ElementTree', fresh=['_elementtree']) +cET_alias = import_fresh_module('xml.etree.cElementTree', fresh=['_elementtree']) # cElementTree specific tests -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Feb 13 14:52:36 2012 From: python-checkins at python.org (ezio.melotti) Date: Mon, 13 Feb 2012 14:52:36 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=283=2E2=29=3A_Fix_htmlparser_?= =?utf8?q?tests_to_always_use_the_right_collector=2E?= Message-ID: http://hg.python.org/cpython/rev/3f9531a4ef09 changeset: 74905:3f9531a4ef09 branch: 3.2 parent: 74901:df5e5eea7833 user: Ezio Melotti date: Mon Feb 13 14:11:27 2012 +0200 summary: Fix htmlparser tests to always use the right collector. files: Lib/test/test_htmlparser.py | 28 +++++++++++++++++++++++- 1 files changed, 26 insertions(+), 2 deletions(-) diff --git a/Lib/test/test_htmlparser.py b/Lib/test/test_htmlparser.py --- a/Lib/test/test_htmlparser.py +++ b/Lib/test/test_htmlparser.py @@ -93,7 +93,7 @@ def _parse_error(self, source): def parse(source=source): - parser = html.parser.HTMLParser() + parser = self.get_collector() parser.feed(source) parser.close() self.assertRaises(html.parser.HTMLParseError, parse) @@ -368,6 +368,30 @@ ('comment', '/img'), ('endtag', 'html<')]) + def test_starttag_junk_chars(self): + self._run_check("", []) + self._run_check("", [('comment', '$')]) + self._run_check("", [('data', '", [('endtag', 'a'", [('data', "', + [('comment', 'spacer type="block" height="25"')]) + def test_with_unquoted_attributes(self): # see #12008 html = ("" @@ -476,7 +500,7 @@ self._run_check(html, expected) def test_unescape_function(self): - p = html.parser.HTMLParser() + p = self.get_collector() self.assertEqual(p.unescape('&#bad;'),'&#bad;') self.assertEqual(p.unescape('&'),'&') # see #12888 -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Feb 13 14:52:36 2012 From: python-checkins at python.org (ezio.melotti) Date: Mon, 13 Feb 2012 14:52:36 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=283=2E2=29=3A_Improve_handlin?= =?utf8?q?g_of_declarations_in_HTMLParser=2E?= Message-ID: http://hg.python.org/cpython/rev/4c4ff9fd19b6 changeset: 74906:4c4ff9fd19b6 branch: 3.2 user: Ezio Melotti date: Mon Feb 13 15:50:37 2012 +0200 summary: Improve handling of declarations in HTMLParser. files: Lib/html/parser.py | 30 +++++++++++---- Lib/test/test_htmlparser.py | 50 ++++++++++++++---------- 2 files changed, 51 insertions(+), 29 deletions(-) diff --git a/Lib/html/parser.py b/Lib/html/parser.py --- a/Lib/html/parser.py +++ b/Lib/html/parser.py @@ -187,17 +187,10 @@ elif startswith(" or - # . When strict is True an - # error is raised, when it's False they will be considered - # as bogus comments and parsed (see parse_bogus_comment). if self.strict: k = self.parse_declaration(i) else: - try: - k = self.parse_declaration(i) - except HTMLParseError: - k = self.parse_bogus_comment(i) + k = self.parse_html_declaration(i) elif (i + 1) < n: self.handle_data("<") k = i + 1 @@ -269,6 +262,27 @@ i = self.updatepos(i, n) self.rawdata = rawdata[i:] + # Internal -- parse html declarations, return length or -1 if not terminated + # See w3.org/TR/html5/tokenization.html#markup-declaration-open-state + # See also parse_declaration in _markupbase + def parse_html_declaration(self, i): + rawdata = self.rawdata + if rawdata[i:i+2] != ' + gtpos = rawdata.find('>', 9) + if gtpos == -1: + return -1 + self.handle_decl(rawdata[i+2:gtpos]) + return gtpos+1 + else: + return self.parse_bogus_comment(i) + # Internal -- parse bogus comment, return length or -1 if not terminated # see http://www.w3.org/TR/html5/tokenization.html#bogus-comment-state def parse_bogus_comment(self, i, report=1): diff --git a/Lib/test/test_htmlparser.py b/Lib/test/test_htmlparser.py --- a/Lib/test/test_htmlparser.py +++ b/Lib/test/test_htmlparser.py @@ -122,7 +122,7 @@ sample text “ - + """, [ ("data", "\n"), @@ -157,24 +157,6 @@ ("data", " foo"), ]) - def test_doctype_decl(self): - inside = """\ -DOCTYPE html [ - - - - - - - %paramEntity; - -]""" - self._run_check("" % inside, [ - ("decl", inside), - ]) - def test_bad_nesting(self): # Strangely, this *is* supposed to test that overlapping # elements are allowed. HTMLParser is more geared toward @@ -247,6 +229,30 @@ self._parse_error("" % dtd, + [('decl', 'DOCTYPE ' + dtd)]) + def test_declaration_junk_chars(self): self._parse_error("") @@ -384,8 +390,7 @@ self._run_check("", [('decl', 'DOCTYPE foo $ ')]) def test_illegal_declarations(self): # XXX this might be wrong @@ -510,11 +515,14 @@ html = ('' '' '' + '' '') expected = [ ('comment', ' not really a comment '), ('comment', ' not a comment either --'), ('comment', ' -- close enough --'), + ('comment', ''), + ('comment', '<-- this was an empty comment'), ('comment', '!! another bogus comment !!!'), ] self._run_check(html, expected) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Feb 13 14:52:37 2012 From: python-checkins at python.org (ezio.melotti) Date: Mon, 13 Feb 2012 14:52:37 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_3=2E2_-=3E_default=29?= =?utf8?q?=3A_Merge_fix_for_HTMLParser_and_improvements_in_declarations_ha?= =?utf8?q?ndling=2E?= Message-ID: http://hg.python.org/cpython/rev/06a6fed0da56 changeset: 74907:06a6fed0da56 parent: 74904:e9cf34d56ff1 parent: 74906:4c4ff9fd19b6 user: Ezio Melotti date: Mon Feb 13 15:52:25 2012 +0200 summary: Merge fix for HTMLParser and improvements in declarations handling. files: Lib/html/parser.py | 30 +++++++-- Lib/test/test_htmlparser.py | 74 +++++++++++++++++------- 2 files changed, 75 insertions(+), 29 deletions(-) diff --git a/Lib/html/parser.py b/Lib/html/parser.py --- a/Lib/html/parser.py +++ b/Lib/html/parser.py @@ -187,17 +187,10 @@ elif startswith(" or - # . When strict is True an - # error is raised, when it's False they will be considered - # as bogus comments and parsed (see parse_bogus_comment). if self.strict: k = self.parse_declaration(i) else: - try: - k = self.parse_declaration(i) - except HTMLParseError: - k = self.parse_bogus_comment(i) + k = self.parse_html_declaration(i) elif (i + 1) < n: self.handle_data("<") k = i + 1 @@ -269,6 +262,27 @@ i = self.updatepos(i, n) self.rawdata = rawdata[i:] + # Internal -- parse html declarations, return length or -1 if not terminated + # See w3.org/TR/html5/tokenization.html#markup-declaration-open-state + # See also parse_declaration in _markupbase + def parse_html_declaration(self, i): + rawdata = self.rawdata + if rawdata[i:i+2] != ' + gtpos = rawdata.find('>', 9) + if gtpos == -1: + return -1 + self.handle_decl(rawdata[i+2:gtpos]) + return gtpos+1 + else: + return self.parse_bogus_comment(i) + # Internal -- parse bogus comment, return length or -1 if not terminated # see http://www.w3.org/TR/html5/tokenization.html#bogus-comment-state def parse_bogus_comment(self, i, report=1): diff --git a/Lib/test/test_htmlparser.py b/Lib/test/test_htmlparser.py --- a/Lib/test/test_htmlparser.py +++ b/Lib/test/test_htmlparser.py @@ -93,7 +93,7 @@ def _parse_error(self, source): def parse(source=source): - parser = html.parser.HTMLParser() + parser = self.get_collector() parser.feed(source) parser.close() self.assertRaises(html.parser.HTMLParseError, parse) @@ -122,7 +122,7 @@ sample text “ - + """, [ ("data", "\n"), @@ -157,24 +157,6 @@ ("data", " foo"), ]) - def test_doctype_decl(self): - inside = """\ -DOCTYPE html [ - - - - - - - %paramEntity; - -]""" - self._run_check("" % inside, [ - ("decl", inside), - ]) - def test_bad_nesting(self): # Strangely, this *is* supposed to test that overlapping # elements are allowed. HTMLParser is more geared toward @@ -247,6 +229,30 @@ self._parse_error("" % dtd, + [('decl', 'DOCTYPE ' + dtd)]) + def test_declaration_junk_chars(self): self._parse_error("") @@ -368,6 +374,29 @@ ('comment', '/img'), ('endtag', 'html<')]) + def test_starttag_junk_chars(self): + self._run_check("", []) + self._run_check("", [('comment', '$')]) + self._run_check("", [('data', '", [('endtag', 'a'", [('data', "', + [('comment', 'spacer type="block" height="25"')]) + def test_with_unquoted_attributes(self): # see #12008 html = ("" @@ -476,7 +505,7 @@ self._run_check(html, expected) def test_unescape_function(self): - p = html.parser.HTMLParser() + p = self.get_collector() self.assertEqual(p.unescape('&#bad;'),'&#bad;') self.assertEqual(p.unescape('&'),'&') # see #12888 @@ -486,11 +515,14 @@ html = ('' '' '' + '' '') expected = [ ('comment', ' not really a comment '), ('comment', ' not a comment either --'), ('comment', ' -- close enough --'), + ('comment', ''), + ('comment', '<-- this was an empty comment'), ('comment', '!! another bogus comment !!!'), ] self._run_check(html, expected) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Feb 13 15:10:58 2012 From: python-checkins at python.org (ezio.melotti) Date: Mon, 13 Feb 2012 15:10:58 +0100 Subject: [Python-checkins] =?utf8?b?Y3B5dGhvbiAoMi43KTogIzEzOTYwOiBIVE1M?= =?utf8?q?Parser_is_now_able_to_handle_broken_comments=2E?= Message-ID: http://hg.python.org/cpython/rev/333e3acf2008 changeset: 74908:333e3acf2008 branch: 2.7 parent: 74900:6653328a02d0 user: Ezio Melotti date: Mon Feb 13 16:10:44 2012 +0200 summary: #13960: HTMLParser is now able to handle broken comments. files: Lib/HTMLParser.py | 36 +++++++++++++++- Lib/test/test_htmlparser.py | 58 +++++++++++++++--------- Misc/NEWS | 2 + 3 files changed, 74 insertions(+), 22 deletions(-) diff --git a/Lib/HTMLParser.py b/Lib/HTMLParser.py --- a/Lib/HTMLParser.py +++ b/Lib/HTMLParser.py @@ -160,7 +160,7 @@ elif startswith(" + gtpos = rawdata.find('>', 9) + if gtpos == -1: + return -1 + self.handle_decl(rawdata[i+2:gtpos]) + return gtpos+1 + else: + return self.parse_bogus_comment(i) + + # Internal -- parse bogus comment, return length or -1 if not terminated + # 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] != '', i+2) + if pos == -1: + return -1 + if report: + self.handle_comment(rawdata[i+2:pos]) + return pos + 1 + # Internal -- parse processing instr, return end or -1 if not terminated def parse_pi(self, i): rawdata = self.rawdata diff --git a/Lib/test/test_htmlparser.py b/Lib/test/test_htmlparser.py --- a/Lib/test/test_htmlparser.py +++ b/Lib/test/test_htmlparser.py @@ -114,7 +114,7 @@ sample text “ - + """, [ ("data", "\n"), @@ -142,24 +142,6 @@ ("data", " foo"), ]) - def test_doctype_decl(self): - inside = """\ -DOCTYPE html [ - - - - - - - %paramEntity; - -]""" - self._run_check("" % inside, [ - ("decl", inside), - ]) - def test_bad_nesting(self): # Strangely, this *is* supposed to test that overlapping # elements are allowed. HTMLParser is more geared toward @@ -182,7 +164,8 @@ ]) def test_illegal_declarations(self): - self._parse_error('') + self._run_check('', + [('comment', 'spacer type="block" height="25"')]) def test_starttag_end_boundary(self): self._run_check("""""", [("starttag", "a", [("b", "<")])]) @@ -233,7 +216,7 @@ self._parse_error("", [ @@ -449,6 +432,39 @@ [("href", "http://www.example.org/\">;")]), ("data", "spam"), ("endtag", "a")]) + def test_comments(self): + html = ("" + '' + '' + '' + '' + '' + '') + expected = [('comment', " I'm a valid comment "), + ('comment', 'me too!'), + ('comment', '--'), + ('comment', ''), + ('comment', '--I have many hyphens--'), + ('comment', ' I have a > in the middle '), + ('comment', ' and I have -- in the middle! ')] + self._run_check(html, expected) + + def test_broken_comments(self): + html = ('' + '' + '' + '' + '') + expected = [ + ('comment', ' not really a comment '), + ('comment', ' not a comment either --'), + ('comment', ' -- close enough --'), + ('comment', ''), + ('comment', '<-- this was an empty comment'), + ('comment', '!! another bogus comment !!!'), + ] + self._run_check(html, expected) + def test_condcoms(self): html = ('' '' diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -90,6 +90,8 @@ Library ------- +- Issue #13960: HTMLParser is now able to handle broken comments. + - Issue #9750: Fix sqlite3.Connection.iterdump on tables and fields with a name that is a keyword or contains quotes. Patch by Marko Kohtala. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Feb 13 15:29:04 2012 From: python-checkins at python.org (ezio.melotti) Date: Mon, 13 Feb 2012 15:29:04 +0100 Subject: [Python-checkins] =?utf8?b?Y3B5dGhvbiAoMi43KTogIzEzOTkzOiBIVE1M?= =?utf8?q?Parser_is_now_able_to_handle_broken_end_tags=2E?= Message-ID: http://hg.python.org/cpython/rev/a349448474ea changeset: 74909:a349448474ea branch: 2.7 user: Ezio Melotti date: Mon Feb 13 16:28:54 2012 +0200 summary: #13993: HTMLParser is now able to handle broken end tags. files: Lib/HTMLParser.py | 34 ++++++++++++++---- Lib/test/test_htmlparser.py | 44 +++++++++++++++++++++++- Misc/NEWS | 2 + 3 files changed, 69 insertions(+), 11 deletions(-) diff --git a/Lib/HTMLParser.py b/Lib/HTMLParser.py --- a/Lib/HTMLParser.py +++ b/Lib/HTMLParser.py @@ -23,6 +23,9 @@ piclose = re.compile('>') commentclose = re.compile(r'--\s*>') tagfind = re.compile('[a-zA-Z][-.a-zA-Z0-9:_]*') +# see http://www.w3.org/TR/html5/tokenization.html#tag-open-state +# and http://www.w3.org/TR/html5/tokenization.html#tag-name-state +tagfind_tolerant = re.compile('[a-zA-Z][^\t\n\r\f />\x00]*') attrfind = re.compile( r'\s*((?<=[\'"\s])[^\s/>][^\s/=>]*)(\s*=+\s*' @@ -243,7 +246,7 @@ # 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] != '', i+2) if pos == -1: @@ -353,23 +356,38 @@ match = endendtag.search(rawdata, i+1) # > if not match: return -1 - j = match.end() + gtpos = match.end() match = endtagfind.match(rawdata, i) # if not match: if self.cdata_elem is not None: - self.handle_data(rawdata[i:j]) - return j - self.error("bad end tag: %r" % (rawdata[i:j],)) + self.handle_data(rawdata[i:gtpos]) + return gtpos + # find the name: w3.org/TR/html5/tokenization.html#tag-name-state + namematch = tagfind_tolerant.match(rawdata, i+2) + if not namematch: + # w3.org/TR/html5/tokenization.html#end-tag-open-state + if rawdata[i:i+3] == '': + return i+3 + else: + return self.parse_bogus_comment(i) + tagname = namematch.group().lower() + # consume and ignore other stuff between the name and the > + # Note: this is not 100% correct, since we might have things like + # , but looking for > after tha name should cover + # most of the cases and is much simpler + gtpos = rawdata.find('>', namematch.end()) + self.handle_endtag(tagname) + return gtpos+1 elem = match.group(1).lower() # script or style if self.cdata_elem is not None: if elem != self.cdata_elem: - self.handle_data(rawdata[i:j]) - return j + self.handle_data(rawdata[i:gtpos]) + return gtpos self.handle_endtag(elem) self.clear_cdata_mode() - return j + return gtpos # Overridable -- finish processing of start+end tag: def handle_startendtag(self, tag, attrs): diff --git a/Lib/test/test_htmlparser.py b/Lib/test/test_htmlparser.py --- a/Lib/test/test_htmlparser.py +++ b/Lib/test/test_htmlparser.py @@ -202,12 +202,12 @@ self._run_check(["", ""], output) def test_starttag_junk_chars(self): - self._parse_error("") - self._parse_error("") + self._run_check("", []) + self._run_check("", [('comment', '$')]) self._parse_error("") - self._parse_error("") + self._run_check("", [('endtag', 'a is used as separator. + # see http://www.w3.org/TR/html5/tokenization.html#end-tag-open-state + # and #13993 + html = ('



' + '


') + expected = [('starttag', 'br', []), + # < is part of the name, / is discarded, p is an attribute + ('endtag', 'label<'), + ('starttag', 'br', []), + # text and attributes are discarded + ('endtag', 'div'), + ('starttag', 'br', []), + # comment because the first char after is ignored + ('starttag', 'br', [])] + self._run_check(html, expected) + + def test_broken_invalid_end_tag(self): + # This is technically wrong (the "> shouldn't be included in the 'data') + # but is probably not worth fixing it (in addition to all the cases of + # the previous test, it would require a full attribute parsing). + # see #13993 + html = 'This confuses the parser' + expected = [('starttag', 'b', []), + ('data', 'This'), + ('endtag', 'b'), + ('data', '"> confuses the parser')] + self._run_check(html, expected) + def test_get_starttag_text(self): s = """""" self._run_check_extra(s, [ diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -90,6 +90,8 @@ Library ------- +- Issue #13993: HTMLParser is now able to handle broken end tags. + - Issue #13960: HTMLParser is now able to handle broken comments. - Issue #9750: Fix sqlite3.Connection.iterdump on tables and fields -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Feb 13 16:36:02 2012 From: python-checkins at python.org (senthil.kumaran) Date: Mon, 13 Feb 2012 16:36:02 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=282=2E7=29=3A_shutil_copy_mod?= =?utf8?q?ule_reference_doc_fix=2E?= Message-ID: http://hg.python.org/cpython/rev/ad3a68b95359 changeset: 74910:ad3a68b95359 branch: 2.7 user: Senthil Kumaran date: Mon Feb 13 23:17:45 2012 +0800 summary: shutil copy module reference doc fix. files: Doc/library/shutil.rst | 30 +++++++++++++++--------------- 1 files changed, 15 insertions(+), 15 deletions(-) diff --git a/Doc/library/shutil.rst b/Doc/library/shutil.rst --- a/Doc/library/shutil.rst +++ b/Doc/library/shutil.rst @@ -21,8 +21,8 @@ .. warning:: - Even the higher-level file copying functions (:func:`copy`, :func:`copy2`) - can't copy all file metadata. + Even the higher-level file copying functions (:func:`shutil.copy`, + :func:`shutil.copy2`) can't copy all file metadata. On POSIX platforms, this means that file owner and group are lost as well as ACLs. On Mac OS, the resource fork and other metadata are not used. @@ -47,10 +47,10 @@ .. function:: copyfile(src, dst) - 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:`copy` for a copy that - accepts a target directory path. If *src* and *dst* are the same files, - :exc:`Error` is raised. + 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 @@ -80,9 +80,9 @@ .. function:: copy2(src, dst) - Similar to :func:`copy`, but metadata is copied as well -- in fact, this is just - :func:`copy` followed by :func:`copystat`. This is similar to the - Unix command :program:`cp -p`. + 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`. .. function:: ignore_patterns(\*patterns) @@ -97,10 +97,10 @@ .. function:: copytree(src, dst[, symlinks=False[, ignore=None]]) Recursively copy an entire directory tree rooted at *src*. 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:`copy2`. + 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 @@ -170,8 +170,8 @@ :func:`os.rename` semantics. If the destination is on the current filesystem, then :func:`os.rename` is - used. Otherwise, *src* is copied (using :func:`copy2`) to *dst* and then - removed. + used. Otherwise, *src* is copied (using :func:`shutil.copy2`) to *dst* and + then removed. .. versionadded:: 2.3 -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Feb 13 16:36:03 2012 From: python-checkins at python.org (senthil.kumaran) Date: Mon, 13 Feb 2012 16:36:03 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=283=2E2=29=3A_shutil_copy_mod?= =?utf8?q?ule_reference_doc_fix=2E?= Message-ID: http://hg.python.org/cpython/rev/282a0eca40b1 changeset: 74911:282a0eca40b1 branch: 3.2 parent: 74906:4c4ff9fd19b6 user: Senthil Kumaran date: Mon Feb 13 23:30:47 2012 +0800 summary: shutil copy module reference doc fix. files: Doc/library/shutil.rst | 38 +++++++++++++++--------------- 1 files changed, 19 insertions(+), 19 deletions(-) diff --git a/Doc/library/shutil.rst b/Doc/library/shutil.rst --- a/Doc/library/shutil.rst +++ b/Doc/library/shutil.rst @@ -21,8 +21,8 @@ .. warning:: - Even the higher-level file copying functions (:func:`copy`, :func:`copy2`) - cannot copy all file metadata. + Even the higher-level file copying functions (:func:`shutil.copy`, + :func:`shutil.copy2`) cannot copy all file metadata. On POSIX platforms, this means that file owner and group are lost as well as ACLs. On Mac OS, the resource fork and other metadata are not used. @@ -49,10 +49,10 @@ .. function:: copyfile(src, dst) - 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:`copy` for a copy that - accepts a target directory path. If *src* and *dst* are the same files, - :exc:`Error` is raised. + 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 @@ -82,9 +82,9 @@ .. function:: copy2(src, dst) - Similar to :func:`copy`, but metadata is copied as well -- in fact, this is just - :func:`copy` followed by :func:`copystat`. This is similar to the - Unix command :program:`cp -p`. + 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`. .. function:: ignore_patterns(\*patterns) @@ -97,10 +97,10 @@ .. 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 - 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:`copy2`. + 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 @@ -126,10 +126,10 @@ If exception(s) occur, an :exc:`Error` is raised with a list of reasons. - 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:`copy2` is used, but any - function that supports the same signature (like :func:`copy`) can be used. + 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. .. versionchanged:: 3.2 Added the *copy_function* argument to be able to provide a custom copy @@ -172,8 +172,8 @@ :func:`os.rename` semantics. If the destination is on the current filesystem, then :func:`os.rename` is - used. Otherwise, *src* is copied (using :func:`copy2`) to *dst* and then - removed. + used. Otherwise, *src* is copied (using :func:`shutil.copy2`) to *dst* and + then removed. .. exception:: Error -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Feb 13 16:36:04 2012 From: python-checkins at python.org (senthil.kumaran) Date: Mon, 13 Feb 2012 16:36:04 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_3=2E2_-=3E_default=29?= =?utf8?q?=3A_shutil_copy_module_reference_doc_fix=2E?= Message-ID: http://hg.python.org/cpython/rev/e1301a2e2316 changeset: 74912:e1301a2e2316 parent: 74907:06a6fed0da56 parent: 74911:282a0eca40b1 user: Senthil Kumaran date: Mon Feb 13 23:35:44 2012 +0800 summary: shutil copy module reference doc fix. files: Doc/library/shutil.rst | 44 +++++++++++++++-------------- 1 files changed, 23 insertions(+), 21 deletions(-) diff --git a/Doc/library/shutil.rst b/Doc/library/shutil.rst --- a/Doc/library/shutil.rst +++ b/Doc/library/shutil.rst @@ -21,8 +21,8 @@ .. warning:: - Even the higher-level file copying functions (:func:`copy`, :func:`copy2`) - cannot copy all file metadata. + Even the higher-level file copying functions (:func:`shutil.copy`, + :func:`shutil.copy2`) cannot copy all file metadata. On POSIX platforms, this means that file owner and group are lost as well as ACLs. On Mac OS, the resource fork and other metadata are not used. @@ -49,10 +49,11 @@ .. function:: copyfile(src, dst[, symlinks=False]) - 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:`copy` for a copy that - accepts a target directory path. If *src* and *dst* are the same files, - :exc:`Error` is raised. + 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:`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 @@ -101,10 +102,11 @@ .. function:: copy2(src, dst[, symlinks=False]) - Similar to :func:`copy`, but metadata is copied as well -- in fact, this is just - :func:`copy` followed by :func:`copystat`. This is similar to the - Unix command :program:`cp -p`. If *symlinks* is true, symbolic links won't - be followed but recreated instead -- this resembles GNU's :program:`cp -P`. + 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 *symlinks* is true, + symbolic links won't be followed but recreated instead -- this resembles + GNU's :program:`cp -P`. .. versionchanged:: 3.3 Added *symlinks* argument. @@ -119,10 +121,10 @@ .. 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 - 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:`copy2`. + 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 and the metadata of the original links will @@ -148,10 +150,10 @@ If exception(s) occur, an :exc:`Error` is raised with a list of reasons. - 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:`copy2` is used, but any - function that supports the same signature (like :func:`copy`) can be used. + 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:`shutil.copy`) can be used. .. versionchanged:: 3.2 Added the *copy_function* argument to be able to provide a custom copy @@ -197,9 +199,9 @@ :func:`os.rename` semantics. If the destination is on the current filesystem, then :func:`os.rename` is - used. Otherwise, *src* is copied (using :func:`copy2`) to *dst* and 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. + used. Otherwise, *src* is copied (using :func:`shutil.copy2`) to *dst* and + 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 -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Feb 13 19:29:05 2012 From: python-checkins at python.org (ezio.melotti) Date: Mon, 13 Feb 2012 19:29:05 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=283=2E2=29=3A_Fix_an_index_an?= =?utf8?q?d_clean_up_comments=2E?= Message-ID: http://hg.python.org/cpython/rev/586d688dcf7f changeset: 74913:586d688dcf7f branch: 3.2 parent: 74911:282a0eca40b1 user: Ezio Melotti date: Mon Feb 13 20:20:00 2012 +0200 summary: Fix an index and clean up comments. files: Lib/html/parser.py | 3 ++- Lib/test/test_htmlparser.py | 1 - 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Lib/html/parser.py b/Lib/html/parser.py --- a/Lib/html/parser.py +++ b/Lib/html/parser.py @@ -270,12 +270,13 @@ if rawdata[i:i+2] != ' - gtpos = rawdata.find('>', 9) + gtpos = rawdata.find('>', i+9) if gtpos == -1: return -1 self.handle_decl(rawdata[i+2:gtpos]) diff --git a/Lib/test/test_htmlparser.py b/Lib/test/test_htmlparser.py --- a/Lib/test/test_htmlparser.py +++ b/Lib/test/test_htmlparser.py @@ -393,7 +393,6 @@ self._run_check("", [('decl', 'DOCTYPE foo $ ')]) def test_illegal_declarations(self): - # XXX this might be wrong self._run_check('', [('comment', 'spacer type="block" height="25"')]) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Feb 13 19:29:06 2012 From: python-checkins at python.org (ezio.melotti) Date: Mon, 13 Feb 2012 19:29:06 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_3=2E2_-=3E_default=29?= =?utf8?q?=3A_Merge_the_indexfix__and_comments_clean_up=2E?= Message-ID: http://hg.python.org/cpython/rev/80a50b7ad88f changeset: 74914:80a50b7ad88f parent: 74912:e1301a2e2316 parent: 74913:586d688dcf7f user: Ezio Melotti date: Mon Feb 13 20:28:46 2012 +0200 summary: Merge the indexfix and comments clean up. files: Lib/html/parser.py | 3 ++- Lib/test/test_htmlparser.py | 1 - 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Lib/html/parser.py b/Lib/html/parser.py --- a/Lib/html/parser.py +++ b/Lib/html/parser.py @@ -270,12 +270,13 @@ if rawdata[i:i+2] != ' - gtpos = rawdata.find('>', 9) + gtpos = rawdata.find('>', i+9) if gtpos == -1: return -1 self.handle_decl(rawdata[i+2:gtpos]) diff --git a/Lib/test/test_htmlparser.py b/Lib/test/test_htmlparser.py --- a/Lib/test/test_htmlparser.py +++ b/Lib/test/test_htmlparser.py @@ -393,7 +393,6 @@ self._run_check("", [('decl', 'DOCTYPE foo $ ')]) def test_illegal_declarations(self): - # XXX this might be wrong self._run_check('', [('comment', 'spacer type="block" height="25"')]) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Feb 13 19:37:03 2012 From: python-checkins at python.org (ezio.melotti) Date: Mon, 13 Feb 2012 19:37:03 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=282=2E7=29=3A_Fix_an_index=2C?= =?utf8?q?_add_more_tests=2C_avoid_raising_errors_for_unknown_declarations?= =?utf8?q?=2C?= Message-ID: http://hg.python.org/cpython/rev/4743a3a1e669 changeset: 74915:4743a3a1e669 branch: 2.7 parent: 74910:ad3a68b95359 user: Ezio Melotti date: Mon Feb 13 20:36:55 2012 +0200 summary: Fix an index, add more tests, avoid raising errors for unknown declarations, and clean up comments. files: Lib/HTMLParser.py | 5 +++-- Lib/test/test_htmlparser.py | 24 ++++++++++++++++++++++++ 2 files changed, 27 insertions(+), 2 deletions(-) diff --git a/Lib/HTMLParser.py b/Lib/HTMLParser.py --- a/Lib/HTMLParser.py +++ b/Lib/HTMLParser.py @@ -229,12 +229,13 @@ if rawdata[i:i+2] != ' - gtpos = rawdata.find('>', 9) + gtpos = rawdata.find('>', i+9) if gtpos == -1: return -1 self.handle_decl(rawdata[i+2:gtpos]) @@ -427,7 +428,7 @@ pass def unknown_decl(self, data): - self.error("unknown declaration: %r" % (data,)) + pass # Internal -- helper to remove special character quoting entitydefs = None diff --git a/Lib/test/test_htmlparser.py b/Lib/test/test_htmlparser.py --- a/Lib/test/test_htmlparser.py +++ b/Lib/test/test_htmlparser.py @@ -215,6 +215,30 @@ self._parse_error("
" % dtd, + [('decl', 'DOCTYPE ' + dtd)]) + def test_declaration_junk_chars(self): self._run_check("", [('decl', 'DOCTYPE foo $ ')]) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Feb 13 20:34:19 2012 From: python-checkins at python.org (nadeem.vawda) Date: Mon, 13 Feb 2012 20:34:19 +0100 Subject: [Python-checkins] =?utf8?b?Y3B5dGhvbiAoMi43KTogSXNzdWUgIzEzMTkz?= =?utf8?q?=3A_Fix_distutils=2Efilelist_tests_to_always_use_/_as_path_separ?= =?utf8?q?ator=2E?= Message-ID: http://hg.python.org/cpython/rev/3925081a7ca0 changeset: 74916:3925081a7ca0 branch: 2.7 user: Nadeem Vawda date: Mon Feb 13 21:33:51 2012 +0200 summary: Issue #13193: Fix distutils.filelist tests to always use / as path separator. files: Lib/distutils/tests/test_filelist.py | 24 +++++++-------- 1 files changed, 11 insertions(+), 13 deletions(-) diff --git a/Lib/distutils/tests/test_filelist.py b/Lib/distutils/tests/test_filelist.py --- a/Lib/distutils/tests/test_filelist.py +++ b/Lib/distutils/tests/test_filelist.py @@ -1,7 +1,6 @@ """Tests for distutils.filelist.""" import re import unittest -from os.path import join from distutils import debug from distutils.log import WARN from distutils.errors import DistutilsTemplateError @@ -54,15 +53,15 @@ # simulated file list file_list.allfiles = ['foo.tmp', 'ok', 'xo', 'four.txt', - join('global', 'one.txt'), - join('global', 'two.txt'), - join('global', 'files.x'), - join('global', 'here.tmp'), - join('f', 'o', 'f.oo'), - join('dir', 'graft-one'), - join('dir', 'dir2', 'graft2'), - join('dir3', 'ok'), - join('dir3', 'sub', 'ok.txt'), + 'global/one.txt', + 'global/two.txt', + 'global/files.x', + 'global/here.tmp', + 'f/o/f.oo', + 'dir/graft-one', + 'dir/dir2/graft2', + 'dir3/ok', + 'dir3/sub/ok.txt', ] for line in MANIFEST_IN.split('\n'): @@ -70,9 +69,8 @@ continue file_list.process_template_line(line) - wanted = ['ok', 'four.txt', join('global', 'one.txt'), - join('global', 'two.txt'), join('f', 'o', 'f.oo'), - join('dir', 'graft-one'), join('dir', 'dir2', 'graft2')] + wanted = ['ok', 'four.txt', 'global/one.txt', 'global/two.txt', + 'f/o/f.oo', 'dir/graft-one', 'dir/dir2/graft2'] self.assertEqual(file_list.files, wanted) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Feb 13 22:12:54 2012 From: python-checkins at python.org (victor.stinner) Date: Mon, 13 Feb 2012 22:12:54 +0100 Subject: [Python-checkins] =?utf8?q?peps=3A_PEP_410=3A_drop_int_type=2C_ad?= =?utf8?q?d_an_argument_against_the_datetime_type?= Message-ID: http://hg.python.org/peps/rev/c04f52d60af9 changeset: 4052:c04f52d60af9 user: Victor Stinner date: Mon Feb 13 22:12:45 2012 +0100 summary: PEP 410: drop int type, add an argument against the datetime type files: pep-0410.txt | 9 ++++++--- 1 files changed, 6 insertions(+), 3 deletions(-) diff --git a/pep-0410.txt b/pep-0410.txt --- a/pep-0410.txt +++ b/pep-0410.txt @@ -53,9 +53,8 @@ * time module: clock(), clock_gettime(), clock_getres(), time() and wallclock() -The *timestamp* argument is a type, there are three supported types: +The *timestamp* argument is a type, there are two supported types: - * int * float * decimal.Decimal @@ -68,7 +67,8 @@ * time.gmtime(), time.localtime() * os.utimensat(), os.futimens() -The os.stat_float_times() is deprecated: use timestamp=int argument instead. +The os.stat_float_times() is deprecated: use an explicit cast using int() +instead. .. note:: The decimal module is implemented in Python and is slow, but there is a C @@ -123,6 +123,9 @@ datetime.datetime ----------------- +Most functions returning timestamps don't have a known starting point or +timezone information, and so cannot be converted to datetime.datetime. + datetime.datetime only supports microsecond resolution, but can be enhanced to support nanosecond. -- Repository URL: http://hg.python.org/peps From python-checkins at python.org Mon Feb 13 23:35:53 2012 From: python-checkins at python.org (victor.stinner) Date: Mon, 13 Feb 2012 23:35:53 +0100 Subject: [Python-checkins] =?utf8?q?cpython=3A_lib2to3_tests=3A_Don=27t_us?= =?utf8?q?e_deprecated_API=2C_switch_to_assertRegex=28=29?= Message-ID: http://hg.python.org/cpython/rev/76dfd1f08025 changeset: 74917:76dfd1f08025 parent: 74914:80a50b7ad88f user: Victor Stinner date: Mon Feb 13 23:31:26 2012 +0100 summary: lib2to3 tests: Don't use deprecated API, switch to assertRegex() files: Lib/lib2to3/tests/test_main.py | 2 +- Lib/lib2to3/tests/test_refactor.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Lib/lib2to3/tests/test_main.py b/Lib/lib2to3/tests/test_main.py --- a/Lib/lib2to3/tests/test_main.py +++ b/Lib/lib2to3/tests/test_main.py @@ -94,7 +94,7 @@ self.assertIn("Writing converted %s to %s" % ( os.path.join(self.py2_src_dir, name), os.path.join(self.py3_dest_dir, name+suffix)), stderr) - self.assertRegexpMatches(stderr, r"No changes to .*/__init__\.py") + self.assertRegex(stderr, r"No changes to .*/__init__\.py") self.assertNotRegex(stderr, r"No changes to .*/trivial\.py") def test_filename_changing_on_output_two_files(self): diff --git a/Lib/lib2to3/tests/test_refactor.py b/Lib/lib2to3/tests/test_refactor.py --- a/Lib/lib2to3/tests/test_refactor.py +++ b/Lib/lib2to3/tests/test_refactor.py @@ -230,7 +230,7 @@ os.sep, os.path.basename(test_file)) for message in debug_messages: if "Not writing changes" in message: - self.assertRegexpMatches(message, message_regex) + self.assertRegex(message, message_regex) break else: self.fail("%r not matched in %r" % (message_regex, debug_messages)) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Feb 14 01:17:35 2012 From: python-checkins at python.org (victor.stinner) Date: Tue, 14 Feb 2012 01:17:35 +0100 Subject: [Python-checkins] =?utf8?b?Y3B5dGhvbiAoMy4yKTogSXNzdWUgIzEzOTEz?= =?utf8?q?=3A_normalize_utf-8_codec_name_in_UTF-8_decoder?= Message-ID: http://hg.python.org/cpython/rev/c861c0a7f40c changeset: 74918:c861c0a7f40c branch: 3.2 parent: 74913:586d688dcf7f user: Victor Stinner date: Tue Feb 14 01:17:45 2012 +0100 summary: Issue #13913: normalize utf-8 codec name in UTF-8 decoder files: Objects/unicodeobject.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -2763,7 +2763,7 @@ outpos = p-PyUnicode_AS_UNICODE(unicode); if (unicode_decode_call_errorhandler( errors, &errorHandler, - "utf8", errmsg, + "utf-8", errmsg, &starts, &e, &startinpos, &endinpos, &exc, &s, &unicode, &outpos, &p)) goto onError; -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Feb 14 01:17:36 2012 From: python-checkins at python.org (victor.stinner) Date: Tue, 14 Feb 2012 01:17:36 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_3=2E2_-=3E_default=29?= =?utf8?q?=3A_=28Merge_3=2E2=29_Issue_=2313913=3A_normalize_utf-8_codec_na?= =?utf8?q?me_in_UTF-8_decoder?= Message-ID: http://hg.python.org/cpython/rev/af1a9508f7fa changeset: 74919:af1a9508f7fa parent: 74917:76dfd1f08025 parent: 74918:c861c0a7f40c user: Victor Stinner date: Tue Feb 14 01:18:10 2012 +0100 summary: (Merge 3.2) Issue #13913: normalize utf-8 codec name in UTF-8 decoder files: Objects/unicodeobject.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -4794,7 +4794,7 @@ utf8Error: if (unicode_decode_call_errorhandler( errors, &errorHandler, - "utf8", errmsg, + "utf-8", errmsg, &starts, &e, &startinpos, &endinpos, &exc, &s, &unicode, &i)) goto onError; -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Feb 14 01:29:36 2012 From: python-checkins at python.org (gregory.p.smith) Date: Tue, 14 Feb 2012 01:29:36 +0100 Subject: [Python-checkins] =?utf8?b?Y3B5dGhvbiAoMy4yKTogSXNzdWUgIzEzOTMw?= =?utf8?q?=3A_fix_a_/_to_use_os=2Esep_so_that_the_test_works_on_Windows=2E?= Message-ID: http://hg.python.org/cpython/rev/6fd16782ecb8 changeset: 74920:6fd16782ecb8 branch: 3.2 parent: 74918:c861c0a7f40c user: Gregory P. Smith date: Mon Feb 13 16:24:46 2012 -0800 summary: Issue #13930: fix a / to use os.sep so that the test works on Windows. files: Lib/lib2to3/tests/test_main.py | 6 ++++-- 1 files changed, 4 insertions(+), 2 deletions(-) diff --git a/Lib/lib2to3/tests/test_main.py b/Lib/lib2to3/tests/test_main.py --- a/Lib/lib2to3/tests/test_main.py +++ b/Lib/lib2to3/tests/test_main.py @@ -94,8 +94,10 @@ self.assertIn("Writing converted %s to %s" % ( os.path.join(self.py2_src_dir, name), os.path.join(self.py3_dest_dir, name+suffix)), stderr) - self.assertRegexpMatches(stderr, r"No changes to .*/__init__\.py") - self.assertNotRegex(stderr, r"No changes to .*/trivial\.py") + self.assertRegex( + stderr, r"No changes to .*/__init__\.py".replace("/", os.sep)) + self.assertNotRegex( + stderr, r"No changes to .*/trivial\.py".replace("/", os.sep)) def test_filename_changing_on_output_two_files(self): """2to3 two files in one directory with a new output dir.""" -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Feb 14 01:29:37 2012 From: python-checkins at python.org (gregory.p.smith) Date: Tue, 14 Feb 2012 01:29:37 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_3=2E2_-=3E_default=29?= =?utf8?q?=3A_Issue_=2313930=3A_fix_a_/_to_use_os=2Esep_so_that_the_test_w?= =?utf8?q?orks_on_Windows=2E?= Message-ID: http://hg.python.org/cpython/rev/f13fbd848d50 changeset: 74921:f13fbd848d50 parent: 74919:af1a9508f7fa parent: 74920:6fd16782ecb8 user: Gregory P. Smith date: Mon Feb 13 16:26:50 2012 -0800 summary: Issue #13930: fix a / to use os.sep so that the test works on Windows. files: Lib/lib2to3/tests/test_main.py | 6 ++++-- 1 files changed, 4 insertions(+), 2 deletions(-) diff --git a/Lib/lib2to3/tests/test_main.py b/Lib/lib2to3/tests/test_main.py --- a/Lib/lib2to3/tests/test_main.py +++ b/Lib/lib2to3/tests/test_main.py @@ -94,8 +94,10 @@ self.assertIn("Writing converted %s to %s" % ( os.path.join(self.py2_src_dir, name), os.path.join(self.py3_dest_dir, name+suffix)), stderr) - self.assertRegex(stderr, r"No changes to .*/__init__\.py") - self.assertNotRegex(stderr, r"No changes to .*/trivial\.py") + self.assertRegex( + stderr, r"No changes to .*/__init__\.py".replace("/", os.sep)) + self.assertNotRegex( + stderr, r"No changes to .*/trivial\.py".replace("/", os.sep)) def test_filename_changing_on_output_two_files(self): """2to3 two files in one directory with a new output dir.""" -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Feb 14 01:29:38 2012 From: python-checkins at python.org (gregory.p.smith) Date: Tue, 14 Feb 2012 01:29:38 +0100 Subject: [Python-checkins] =?utf8?b?Y3B5dGhvbiAoMi43KTogSXNzdWUgIzEzOTMw?= =?utf8?q?=3A_fix_a_/_to_use_os=2Esep_so_that_the_test_works_on_Windows=2E?= Message-ID: http://hg.python.org/cpython/rev/34445738954b changeset: 74922:34445738954b branch: 2.7 parent: 74916:3925081a7ca0 user: Gregory P. Smith date: Mon Feb 13 16:28:54 2012 -0800 summary: Issue #13930: fix a / to use os.sep so that the test works on Windows. files: Lib/lib2to3/tests/test_main.py | 6 ++++-- 1 files changed, 4 insertions(+), 2 deletions(-) diff --git a/Lib/lib2to3/tests/test_main.py b/Lib/lib2to3/tests/test_main.py --- a/Lib/lib2to3/tests/test_main.py +++ b/Lib/lib2to3/tests/test_main.py @@ -104,8 +104,10 @@ self.assertIn("Writing converted %s to %s" % ( os.path.join(self.py2_src_dir, name), os.path.join(self.py3_dest_dir, name+suffix)), stderr) - self.assertRegexpMatches(stderr, r"No changes to .*/__init__\.py") - self.assertNotRegex(stderr, r"No changes to .*/trivial\.py") + self.assertRegexpMatches( + stderr, r"No changes to .*/__init__\.py".replace("/", os.sep)) + self.assertNotRegex( + stderr, r"No changes to .*/trivial\.py".replace("/", os.sep)) def test_filename_changing_on_output_two_files(self): """2to3 two files in one directory with a new output dir.""" -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Feb 14 01:46:16 2012 From: python-checkins at python.org (gregory.p.smith) Date: Tue, 14 Feb 2012 01:46:16 +0100 Subject: [Python-checkins] =?utf8?b?Y3B5dGhvbiAoMy4yKTogcmUuZXNjYXBlIG9z?= =?utf8?q?=2Esep_so_that_=5C_is_interpreted_properly_in_the_regex=2E?= Message-ID: http://hg.python.org/cpython/rev/7d8a1497b835 changeset: 74923:7d8a1497b835 branch: 3.2 parent: 74920:6fd16782ecb8 user: Gregory P. Smith date: Mon Feb 13 16:38:37 2012 -0800 summary: re.escape os.sep so that \ is interpreted properly in the regex. files: Lib/lib2to3/tests/test_main.py | 5 +++-- 1 files changed, 3 insertions(+), 2 deletions(-) diff --git a/Lib/lib2to3/tests/test_main.py b/Lib/lib2to3/tests/test_main.py --- a/Lib/lib2to3/tests/test_main.py +++ b/Lib/lib2to3/tests/test_main.py @@ -94,10 +94,11 @@ self.assertIn("Writing converted %s to %s" % ( os.path.join(self.py2_src_dir, name), os.path.join(self.py3_dest_dir, name+suffix)), stderr) + sep = re.escape(os.sep) self.assertRegex( - stderr, r"No changes to .*/__init__\.py".replace("/", os.sep)) + stderr, r"No changes to .*/__init__\.py".replace("/", sep)) self.assertNotRegex( - stderr, r"No changes to .*/trivial\.py".replace("/", os.sep)) + stderr, r"No changes to .*/trivial\.py".replace("/", sep)) def test_filename_changing_on_output_two_files(self): """2to3 two files in one directory with a new output dir.""" -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Feb 14 01:46:16 2012 From: python-checkins at python.org (gregory.p.smith) Date: Tue, 14 Feb 2012 01:46:16 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=283=2E2=29=3A_import_re_for_t?= =?utf8?q?he_previous_commit=2E?= Message-ID: http://hg.python.org/cpython/rev/d8904aff9442 changeset: 74924:d8904aff9442 branch: 3.2 user: Gregory P. Smith date: Mon Feb 13 16:41:20 2012 -0800 summary: import re for the previous commit. files: Lib/lib2to3/tests/test_main.py | 1 + 1 files changed, 1 insertions(+), 0 deletions(-) diff --git a/Lib/lib2to3/tests/test_main.py b/Lib/lib2to3/tests/test_main.py --- a/Lib/lib2to3/tests/test_main.py +++ b/Lib/lib2to3/tests/test_main.py @@ -3,6 +3,7 @@ import io import logging import os +import re import shutil import sys import tempfile -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Feb 14 01:46:17 2012 From: python-checkins at python.org (gregory.p.smith) Date: Tue, 14 Feb 2012 01:46:17 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_3=2E2_-=3E_default=29?= =?utf8?q?=3A_re=2Eescape_os=2Esep_so_that_=5C_is_interpreted_properly_in_?= =?utf8?q?the_regex=2E?= Message-ID: http://hg.python.org/cpython/rev/a32b55a15d26 changeset: 74925:a32b55a15d26 parent: 74921:f13fbd848d50 parent: 74923:7d8a1497b835 user: Gregory P. Smith date: Mon Feb 13 16:43:55 2012 -0800 summary: re.escape os.sep so that \ is interpreted properly in the regex. files: Lib/lib2to3/tests/test_main.py | 6 ++++-- 1 files changed, 4 insertions(+), 2 deletions(-) diff --git a/Lib/lib2to3/tests/test_main.py b/Lib/lib2to3/tests/test_main.py --- a/Lib/lib2to3/tests/test_main.py +++ b/Lib/lib2to3/tests/test_main.py @@ -3,6 +3,7 @@ import io import logging import os +import re import shutil import sys import tempfile @@ -94,10 +95,11 @@ self.assertIn("Writing converted %s to %s" % ( os.path.join(self.py2_src_dir, name), os.path.join(self.py3_dest_dir, name+suffix)), stderr) + sep = re.escape(os.sep) self.assertRegex( - stderr, r"No changes to .*/__init__\.py".replace("/", os.sep)) + stderr, r"No changes to .*/__init__\.py".replace("/", sep)) self.assertNotRegex( - stderr, r"No changes to .*/trivial\.py".replace("/", os.sep)) + stderr, r"No changes to .*/trivial\.py".replace("/", sep)) def test_filename_changing_on_output_two_files(self): """2to3 two files in one directory with a new output dir.""" -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Feb 14 01:46:18 2012 From: python-checkins at python.org (gregory.p.smith) Date: Tue, 14 Feb 2012 01:46:18 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_3=2E2_-=3E_default=29?= =?utf8?q?=3A_merge_the_import_re_=28already_in_this_branch=29=2E?= Message-ID: http://hg.python.org/cpython/rev/9ccf25774f7b changeset: 74926:9ccf25774f7b parent: 74925:a32b55a15d26 parent: 74924:d8904aff9442 user: Gregory P. Smith date: Mon Feb 13 16:44:18 2012 -0800 summary: merge the import re (already in this branch). files: -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Feb 14 01:46:19 2012 From: python-checkins at python.org (gregory.p.smith) Date: Tue, 14 Feb 2012 01:46:19 +0100 Subject: [Python-checkins] =?utf8?b?Y3B5dGhvbiAoMi43KTogcmUuZXNjYXBlIG9z?= =?utf8?q?=2Esep_so_that_=5C_is_interpreted_properly_in_the_regex=2E?= Message-ID: http://hg.python.org/cpython/rev/3b796bd78e81 changeset: 74927:3b796bd78e81 branch: 2.7 parent: 74922:34445738954b user: Gregory P. Smith date: Mon Feb 13 16:45:47 2012 -0800 summary: re.escape os.sep so that \ is interpreted properly in the regex. files: Lib/lib2to3/tests/test_main.py | 6 ++++-- 1 files changed, 4 insertions(+), 2 deletions(-) diff --git a/Lib/lib2to3/tests/test_main.py b/Lib/lib2to3/tests/test_main.py --- a/Lib/lib2to3/tests/test_main.py +++ b/Lib/lib2to3/tests/test_main.py @@ -3,6 +3,7 @@ import codecs import logging import os +import re import shutil import StringIO import sys @@ -104,10 +105,11 @@ self.assertIn("Writing converted %s to %s" % ( os.path.join(self.py2_src_dir, name), os.path.join(self.py3_dest_dir, name+suffix)), stderr) + sep = re.escape(os.sep) self.assertRegexpMatches( - stderr, r"No changes to .*/__init__\.py".replace("/", os.sep)) + stderr, r"No changes to .*/__init__\.py".replace("/", sep)) self.assertNotRegex( - stderr, r"No changes to .*/trivial\.py".replace("/", os.sep)) + stderr, r"No changes to .*/trivial\.py".replace("/", sep)) def test_filename_changing_on_output_two_files(self): """2to3 two files in one directory with a new output dir.""" -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Feb 14 02:32:57 2012 From: python-checkins at python.org (victor.stinner) Date: Tue, 14 Feb 2012 02:32:57 +0100 Subject: [Python-checkins] =?utf8?q?cpython=3A_PyUnicode=5FDecodeLocale=28?= =?utf8?q?=29_second_argument_is_now_a_char*=2C_no_more_an_int?= Message-ID: http://hg.python.org/cpython/rev/182b4a81bedb changeset: 74928:182b4a81bedb parent: 74926:9ccf25774f7b user: Victor Stinner date: Tue Feb 14 02:33:38 2012 +0100 summary: PyUnicode_DecodeLocale() second argument is now a char*, no more an int files: Modules/_localemodule.c | 20 ++++++++++---------- 1 files changed, 10 insertions(+), 10 deletions(-) diff --git a/Modules/_localemodule.c b/Modules/_localemodule.c --- a/Modules/_localemodule.c +++ b/Modules/_localemodule.c @@ -112,7 +112,7 @@ PyErr_SetString(Error, "unsupported locale setting"); return NULL; } - result_object = PyUnicode_DecodeLocale(result, 0); + result_object = PyUnicode_DecodeLocale(result, NULL); if (!result_object) return NULL; } else { @@ -122,7 +122,7 @@ PyErr_SetString(Error, "locale query failed"); return NULL; } - result_object = PyUnicode_DecodeLocale(result, 0); + result_object = PyUnicode_DecodeLocale(result, NULL); } return result_object; } @@ -148,7 +148,7 @@ involved herein */ #define RESULT_STRING(s)\ - x = PyUnicode_DecodeLocale(l->s, 0); \ + x = PyUnicode_DecodeLocale(l->s, NULL); \ if (!x) goto failed;\ PyDict_SetItemString(result, #s, x);\ Py_XDECREF(x) @@ -439,7 +439,7 @@ instead of an empty string for nl_langinfo(ERA). */ const char *result = nl_langinfo(item); result = result != NULL ? result : ""; - return PyUnicode_DecodeLocale(result, 0); + return PyUnicode_DecodeLocale(result, NULL); } PyErr_SetString(PyExc_ValueError, "unsupported langinfo constant"); return NULL; @@ -458,7 +458,7 @@ char *in; if (!PyArg_ParseTuple(args, "s", &in)) return 0; - return PyUnicode_DecodeLocale(gettext(in), 0); + return PyUnicode_DecodeLocale(gettext(in), NULL); } PyDoc_STRVAR(dgettext__doc__, @@ -471,7 +471,7 @@ char *domain, *in; if (!PyArg_ParseTuple(args, "zs", &domain, &in)) return 0; - return PyUnicode_DecodeLocale(dgettext(domain, in), 0); + return PyUnicode_DecodeLocale(dgettext(domain, in), NULL); } PyDoc_STRVAR(dcgettext__doc__, @@ -485,7 +485,7 @@ int category; if (!PyArg_ParseTuple(args, "zsi", &domain, &msgid, &category)) return 0; - return PyUnicode_DecodeLocale(dcgettext(domain,msgid,category), 0); + return PyUnicode_DecodeLocale(dcgettext(domain,msgid,category), NULL); } PyDoc_STRVAR(textdomain__doc__, @@ -503,7 +503,7 @@ PyErr_SetFromErrno(PyExc_OSError); return NULL; } - return PyUnicode_DecodeLocale(domain, 0); + return PyUnicode_DecodeLocale(domain, NULL); } PyDoc_STRVAR(bindtextdomain__doc__, @@ -535,7 +535,7 @@ PyErr_SetFromErrno(PyExc_OSError); return NULL; } - result = PyUnicode_DecodeLocale(current_dirname, 0); + result = PyUnicode_DecodeLocale(current_dirname, NULL); Py_XDECREF(dirname_bytes); return result; } @@ -553,7 +553,7 @@ return NULL; codeset = bind_textdomain_codeset(domain, codeset); if (codeset) - return PyUnicode_DecodeLocale(codeset, 0); + return PyUnicode_DecodeLocale(codeset, NULL); Py_RETURN_NONE; } #endif -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Feb 14 02:41:40 2012 From: python-checkins at python.org (victor.stinner) Date: Tue, 14 Feb 2012 02:41:40 +0100 Subject: [Python-checkins] =?utf8?q?cpython=3A_Time_module_doc=3A_Fix_reST?= =?utf8?q?_syntax?= Message-ID: http://hg.python.org/cpython/rev/f5f140ef48fa changeset: 74929:f5f140ef48fa user: Victor Stinner date: Tue Feb 14 02:42:21 2012 +0100 summary: Time module doc: Fix reST syntax files: Doc/library/time.rst | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Doc/library/time.rst b/Doc/library/time.rst --- a/Doc/library/time.rst +++ b/Doc/library/time.rst @@ -231,7 +231,7 @@ Monotonic clock. The reference point of the returned value is undefined so only the difference of consecutive calls is valid. - .. versionadded: 3.3 + .. versionadded:: 3.3 .. function:: sleep(secs) @@ -557,7 +557,7 @@ when "processor time" is inappropriate. The reference point of the returned value is undefined so only the difference of consecutive calls is valid. - .. versionadded: 3.3 + .. versionadded:: 3.3 .. seealso:: -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Feb 14 05:25:47 2012 From: python-checkins at python.org (meador.inge) Date: Tue, 14 Feb 2012 05:25:47 +0100 Subject: [Python-checkins] =?utf8?b?Y3B5dGhvbiAoMy4yKTogSXNzdWUgIzEzOTc5?= =?utf8?q?=3A_Fix_ctypes=2Eutil=2Efind=5Flibrary_ldconfig_regex?= Message-ID: http://hg.python.org/cpython/rev/ac362fb3b86b changeset: 74930:ac362fb3b86b branch: 3.2 parent: 74924:d8904aff9442 user: Meador Inge date: Mon Feb 13 22:08:39 2012 -0600 summary: Issue #13979: Fix ctypes.util.find_library ldconfig regex files: Lib/ctypes/util.py | 19 +------------------ Misc/NEWS | 3 +++ 2 files changed, 4 insertions(+), 18 deletions(-) diff --git a/Lib/ctypes/util.py b/Lib/ctypes/util.py --- a/Lib/ctypes/util.py +++ b/Lib/ctypes/util.py @@ -171,22 +171,6 @@ else: - def _findLib_ldconfig(name): - # XXX assuming GLIBC's ldconfig (with option -p) - expr = r'/[^\(\)\s]*lib%s\.[^\(\)\s]*' % re.escape(name) - with contextlib.closing(os.popen('/sbin/ldconfig -p 2>/dev/null')) as f: - data = f.read() - res = re.search(expr, data) - if not res: - # Hm, this works only for libs needed by the python executable. - cmd = 'ldd %s 2>/dev/null' % sys.executable - with contextlib.closing(os.popen(cmd)) as f: - data = f.read() - res = re.search(expr, data) - if not res: - return None - return res.group(0) - def _findSoname_ldconfig(name): import struct if struct.calcsize('l') == 4: @@ -203,8 +187,7 @@ abi_type = mach_map.get(machine, 'libc6') # XXX assuming GLIBC's ldconfig (with option -p) - expr = r'(\S+)\s+\((%s(?:, OS ABI:[^\)]*)?)\)[^/]*(/[^\(\)\s]*lib%s\.[^\(\)\s]*)' \ - % (abi_type, re.escape(name)) + 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) diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -113,6 +113,9 @@ Library ------- +- Issue #13979: A bug in ctypes.util.find_library that caused + the wrong library name to be returned has been fixed. + - Issue #13993: HTMLParser is now able to handle broken end tags when strict=False. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Feb 14 05:25:50 2012 From: python-checkins at python.org (meador.inge) Date: Tue, 14 Feb 2012 05:25:50 +0100 Subject: [Python-checkins] =?utf8?b?Y3B5dGhvbiAoMi43KTogSXNzdWUgIzEzOTc5?= =?utf8?q?=3A_Fix_ctypes=2Eutil=2Efind=5Flibrary_ldconfig_regex?= Message-ID: http://hg.python.org/cpython/rev/be41abd74949 changeset: 74931:be41abd74949 branch: 2.7 parent: 74927:3b796bd78e81 user: Meador Inge date: Mon Feb 13 22:22:06 2012 -0600 summary: Issue #13979: Fix ctypes.util.find_library ldconfig regex files: Lib/ctypes/util.py | 25 +------------------------ Misc/NEWS | 3 +++ 2 files changed, 4 insertions(+), 24 deletions(-) diff --git a/Lib/ctypes/util.py b/Lib/ctypes/util.py --- a/Lib/ctypes/util.py +++ b/Lib/ctypes/util.py @@ -182,28 +182,6 @@ else: - def _findLib_ldconfig(name): - # XXX assuming GLIBC's ldconfig (with option -p) - expr = r'/[^\(\)\s]*lib%s\.[^\(\)\s]*' % re.escape(name) - f = os.popen('LC_ALL=C LANG=C /sbin/ldconfig -p 2>/dev/null') - try: - data = f.read() - finally: - f.close() - res = re.search(expr, data) - if not res: - # Hm, this works only for libs needed by the python executable. - cmd = 'ldd %s 2>/dev/null' % sys.executable - f = os.popen(cmd) - try: - data = f.read() - finally: - f.close() - res = re.search(expr, data) - if not res: - return None - return res.group(0) - def _findSoname_ldconfig(name): import struct if struct.calcsize('l') == 4: @@ -220,8 +198,7 @@ abi_type = mach_map.get(machine, 'libc6') # XXX assuming GLIBC's ldconfig (with option -p) - expr = r'(\S+)\s+\((%s(?:, OS ABI:[^\)]*)?)\)[^/]*(/[^\(\)\s]*lib%s\.[^\(\)\s]*)' \ - % (abi_type, re.escape(name)) + expr = r'\s+(lib%s\.[^\s]+)\s+\(%s' % (re.escape(name), abi_type) f = os.popen('/sbin/ldconfig -p 2>/dev/null') try: data = f.read() diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -90,6 +90,9 @@ Library ------- +- Issue #13979: A bug in ctypes.util.find_library that caused + the wrong library name to be returned has been fixed. + - Issue #13993: HTMLParser is now able to handle broken end tags. - Issue #13960: HTMLParser is now able to handle broken comments. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Feb 14 05:25:57 2012 From: python-checkins at python.org (meador.inge) Date: Tue, 14 Feb 2012 05:25:57 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_3=2E2_-=3E_default=29?= =?utf8?q?=3A_Issue_=2313979=3A_Fix_ctypes=2Eutil=2Efind=5Flibrary_ldconfi?= =?utf8?q?g_regex?= Message-ID: http://hg.python.org/cpython/rev/096e856a01aa changeset: 74932:096e856a01aa parent: 74929:f5f140ef48fa parent: 74930:ac362fb3b86b user: Meador Inge date: Mon Feb 13 22:23:59 2012 -0600 summary: Issue #13979: Fix ctypes.util.find_library ldconfig regex files: -- Repository URL: http://hg.python.org/cpython From solipsis at pitrou.net Tue Feb 14 05:28:42 2012 From: solipsis at pitrou.net (solipsis at pitrou.net) Date: Tue, 14 Feb 2012 05:28:42 +0100 Subject: [Python-checkins] Daily reference leaks (f5f140ef48fa): sum=0 Message-ID: results for f5f140ef48fa on branch "default" -------------------------------------------- Command line was: ['./python', '-m', 'test.regrtest', '-uall', '-R', '3:3:/home/antoine/cpython/refleaks/reflogxZkW4F', '-x'] From python-checkins at python.org Tue Feb 14 13:55:00 2012 From: python-checkins at python.org (victor.stinner) Date: Tue, 14 Feb 2012 13:55:00 +0100 Subject: [Python-checkins] =?utf8?q?peps=3A_PEP_410=3A_complete_datetime?= =?utf8?q?=2C_timedelta_and_boolean_flag_sections?= Message-ID: http://hg.python.org/peps/rev/2fe0070a511c changeset: 4053:2fe0070a511c user: Victor Stinner date: Tue Feb 14 13:54:59 2012 +0100 summary: PEP 410: complete datetime, timedelta and boolean flag sections files: pep-0410.txt | 18 +++++++++++++----- 1 files changed, 13 insertions(+), 5 deletions(-) diff --git a/pep-0410.txt b/pep-0410.txt --- a/pep-0410.txt +++ b/pep-0410.txt @@ -135,9 +135,10 @@ datetime.datetime has ordering issues with daylight saving time (DST) in the duplicate hour of switching from DST to normal time. -datetime.datetime is not as well integrated than Epoch timestamps, some -functions don't accept this type as input. For example, os.utime() expects a -tuple of Epoch timestamps. +datetime.datetime is not as well integrated than Epoch timestamps: there is no +datetime.datetime.totimestamp() function. Most functions expecting tiemstamps +don't support datime.datetime. For example, os.utime() expects a tuple of Epoch +timestamps. datetime.timedelta ------------------ @@ -146,8 +147,11 @@ but can be enhanced to support nanosecond. datetime.timedelta is not as well integrated than Epoch timestamps, some -functions don't accept this type as input. For example, os.utime() expects a -tuple of Epoch timestamps. +functions don't accept this type as input. Converting a timedelta object to a +float (number of seconds) requires to call an explicit method, +timedelta.toseconds(). Supporting timedelta would need to change every +functions getting timestamps, whereas all functions supporting float already +accept Decimal because Decimal can be casted to float. .. _tuple-integers: @@ -255,6 +259,9 @@ Because we only need one new type, decimal.Decimal, a simple boolean flag can be added. For example, time.time(decimal=True) or time.time(hires=True). +Such flag would require to do an hidden import which is considered as a bad +practice. + The boolean argument API was rejected because it is not "pythonic". Changing the return type with a parameter value is preferred over a boolean parameter (a flag). @@ -279,6 +286,7 @@ * `Issue #11457: os.stat(): add new fields to get timestamps as Decimal objects with nanosecond resolution `_ * `Issue #13882: Add format argument for time.time(), time.clock(), ... to get a timestamp as a Decimal object `_ * `[Python-Dev] Store timestamps as decimal.Decimal objects `_ + * `Issue #7652: Merge C version of decimal into py3k `_ (cdecimal) Copyright -- Repository URL: http://hg.python.org/peps From python-checkins at python.org Tue Feb 14 23:33:47 2012 From: python-checkins at python.org (antoine.pitrou) Date: Tue, 14 Feb 2012 23:33:47 +0100 Subject: [Python-checkins] =?utf8?b?Y3B5dGhvbiAoMy4yKTogSXNzdWUgIzEwMjg3?= =?utf8?q?=3A_nntplib_now_queries_the_server=27s_CAPABILITIES_first_before?= Message-ID: http://hg.python.org/cpython/rev/a7f1ffd741d6 changeset: 74933:a7f1ffd741d6 branch: 3.2 parent: 74930:ac362fb3b86b user: Antoine Pitrou date: Tue Feb 14 23:29:34 2012 +0100 summary: 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. files: Lib/nntplib.py | 21 ++++++++--- Lib/test/test_nntplib.py | 51 +++++++++++++++++++++++++++- Misc/NEWS | 4 ++ 3 files changed, 69 insertions(+), 7 deletions(-) diff --git a/Lib/nntplib.py b/Lib/nntplib.py --- a/Lib/nntplib.py +++ b/Lib/nntplib.py @@ -324,25 +324,30 @@ self.debugging = 0 self.welcome = self._getresp() + # Inquire about capabilities (RFC 3977). + self._caps = None + self.getcapabilities() + # 'MODE READER' is sometimes necessary to enable 'reader' mode. # However, the order in which 'MODE READER' and 'AUTHINFO' need to # arrive differs between some NNTP servers. If _setreadermode() fails # with an authorization failed error, it will set this to True; # the login() routine will interpret that as a request to try again # after performing its normal function. + # Enable only if we're not already in READER mode anyway. self.readermode_afterauth = False - if readermode: + if readermode and 'READER' not in self._caps: self._setreadermode() + if not self.readermode_afterauth: + # Capabilities might have changed after MODE READER + self._caps = None + self.getcapabilities() # RFC 4642 2.2.2: Both the client and the server MUST know if there is # a TLS session active. A client MUST NOT attempt to start a TLS # session if a TLS session is already active. self.tls_on = False - # Inquire about capabilities (RFC 3977). - self._caps = None - self.getcapabilities() - # Log in and encryption setup order is left to subclasses. self.authenticated = False @@ -945,8 +950,12 @@ self._caps = None self.getcapabilities() # Attempt to send mode reader if it was requested after login. - if self.readermode_afterauth: + # Only do so if we're not in reader mode already. + if self.readermode_afterauth and 'READER' not in self._caps: self._setreadermode() + # Capabilities might have changed after MODE READER + self._caps = None + self.getcapabilities() def _setreadermode(self): try: diff --git a/Lib/test/test_nntplib.py b/Lib/test/test_nntplib.py --- a/Lib/test/test_nntplib.py +++ b/Lib/test/test_nntplib.py @@ -364,6 +364,12 @@ return self.server +class MockedNNTPWithReaderModeMixin(MockedNNTPTestsMixin): + def setUp(self): + super().setUp() + self.make_server(readermode=True) + + class NNTPv1Handler: """A handler for RFC 977""" @@ -704,6 +710,9 @@ else: self.push_lit(fmt.format('')) + def handle_MODE(self, _): + raise Exception('MODE READER sent despite READER has been advertised') + def handle_OVER(self, message_spec=None): return self.handle_XOVER(message_spec) @@ -718,6 +727,34 @@ super().handle_CAPABILITIES() +class ModeSwitchingNNTPv2Handler(NNTPv2Handler): + """A server that starts in transit mode""" + + def __init__(self): + self._switched = False + + def handle_CAPABILITIES(self): + fmt = """\ + 101 Capability list: + VERSION 2 3 + IMPLEMENTATION INN 2.5.1 + HDR + LIST ACTIVE ACTIVE.TIMES DISTRIB.PATS HEADERS NEWSGROUPS OVERVIEW.FMT + OVER + POST + {}READER + .""" + if self._switched: + self.push_lit(fmt.format('')) + else: + self.push_lit(fmt.format('MODE-')) + + def handle_MODE(self, what): + assert not self._switched and what == 'reader' + self._switched = True + self.push_lit('200 Posting allowed') + + class NNTPv1v2TestsMixin: def setUp(self): @@ -1124,6 +1161,18 @@ self.assertIn('VERSION', self.server._caps) +class SendReaderNNTPv2Tests(MockedNNTPWithReaderModeMixin, + unittest.TestCase): + """Same tests as for v2 but we tell NTTP to send MODE READER to a server + that isn't in READER mode by default.""" + + nntp_version = 2 + handler_class = ModeSwitchingNNTPv2Handler + + def test_we_are_in_reader_mode_after_connect(self): + self.assertIn('READER', self.server._caps) + + class MiscTests(unittest.TestCase): def test_decode_header(self): @@ -1284,7 +1333,7 @@ def test_main(): tests = [MiscTests, NNTPv1Tests, NNTPv2Tests, CapsAfterLoginNNTPv2Tests, - NetworkedNNTPTests] + SendReaderNNTPv2Tests, NetworkedNNTPTests] if _have_ssl: tests.append(NetworkedNNTP_SSLTests) support.run_unittest(*tests) diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -113,6 +113,10 @@ Library ------- +- 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 #13979: A bug in ctypes.util.find_library that caused the wrong library name to be returned has been fixed. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Feb 14 23:33:49 2012 From: python-checkins at python.org (antoine.pitrou) Date: Tue, 14 Feb 2012 23:33:49 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_3=2E2_-=3E_default=29?= =?utf8?q?=3A_Issue_=2310287=3A_nntplib_now_queries_the_server=27s_CAPABIL?= =?utf8?q?ITIES_first_before?= Message-ID: http://hg.python.org/cpython/rev/03019bb62d83 changeset: 74934:03019bb62d83 parent: 74932:096e856a01aa parent: 74933:a7f1ffd741d6 user: Antoine Pitrou date: Tue Feb 14 23:30:35 2012 +0100 summary: 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. files: Lib/nntplib.py | 21 ++++++++--- Lib/test/test_nntplib.py | 51 +++++++++++++++++++++++++++- Misc/NEWS | 4 ++ 3 files changed, 69 insertions(+), 7 deletions(-) diff --git a/Lib/nntplib.py b/Lib/nntplib.py --- a/Lib/nntplib.py +++ b/Lib/nntplib.py @@ -324,25 +324,30 @@ self.debugging = 0 self.welcome = self._getresp() + # Inquire about capabilities (RFC 3977). + self._caps = None + self.getcapabilities() + # 'MODE READER' is sometimes necessary to enable 'reader' mode. # However, the order in which 'MODE READER' and 'AUTHINFO' need to # arrive differs between some NNTP servers. If _setreadermode() fails # with an authorization failed error, it will set this to True; # the login() routine will interpret that as a request to try again # after performing its normal function. + # Enable only if we're not already in READER mode anyway. self.readermode_afterauth = False - if readermode: + if readermode and 'READER' not in self._caps: self._setreadermode() + if not self.readermode_afterauth: + # Capabilities might have changed after MODE READER + self._caps = None + self.getcapabilities() # RFC 4642 2.2.2: Both the client and the server MUST know if there is # a TLS session active. A client MUST NOT attempt to start a TLS # session if a TLS session is already active. self.tls_on = False - # Inquire about capabilities (RFC 3977). - self._caps = None - self.getcapabilities() - # Log in and encryption setup order is left to subclasses. self.authenticated = False @@ -959,8 +964,12 @@ self._caps = None self.getcapabilities() # Attempt to send mode reader if it was requested after login. - if self.readermode_afterauth: + # Only do so if we're not in reader mode already. + if self.readermode_afterauth and 'READER' not in self._caps: self._setreadermode() + # Capabilities might have changed after MODE READER + self._caps = None + self.getcapabilities() def _setreadermode(self): try: diff --git a/Lib/test/test_nntplib.py b/Lib/test/test_nntplib.py --- a/Lib/test/test_nntplib.py +++ b/Lib/test/test_nntplib.py @@ -385,6 +385,12 @@ return self.server +class MockedNNTPWithReaderModeMixin(MockedNNTPTestsMixin): + def setUp(self): + super().setUp() + self.make_server(readermode=True) + + class NNTPv1Handler: """A handler for RFC 977""" @@ -725,6 +731,9 @@ else: self.push_lit(fmt.format('')) + def handle_MODE(self, _): + raise Exception('MODE READER sent despite READER has been advertised') + def handle_OVER(self, message_spec=None): return self.handle_XOVER(message_spec) @@ -739,6 +748,34 @@ super().handle_CAPABILITIES() +class ModeSwitchingNNTPv2Handler(NNTPv2Handler): + """A server that starts in transit mode""" + + def __init__(self): + self._switched = False + + def handle_CAPABILITIES(self): + fmt = """\ + 101 Capability list: + VERSION 2 3 + IMPLEMENTATION INN 2.5.1 + HDR + LIST ACTIVE ACTIVE.TIMES DISTRIB.PATS HEADERS NEWSGROUPS OVERVIEW.FMT + OVER + POST + {}READER + .""" + if self._switched: + self.push_lit(fmt.format('')) + else: + self.push_lit(fmt.format('MODE-')) + + def handle_MODE(self, what): + assert not self._switched and what == 'reader' + self._switched = True + self.push_lit('200 Posting allowed') + + class NNTPv1v2TestsMixin: def setUp(self): @@ -1145,6 +1182,18 @@ self.assertIn('VERSION', self.server._caps) +class SendReaderNNTPv2Tests(MockedNNTPWithReaderModeMixin, + unittest.TestCase): + """Same tests as for v2 but we tell NTTP to send MODE READER to a server + that isn't in READER mode by default.""" + + nntp_version = 2 + handler_class = ModeSwitchingNNTPv2Handler + + def test_we_are_in_reader_mode_after_connect(self): + self.assertIn('READER', self.server._caps) + + class MiscTests(unittest.TestCase): def test_decode_header(self): @@ -1305,7 +1354,7 @@ def test_main(): tests = [MiscTests, NNTPv1Tests, NNTPv2Tests, CapsAfterLoginNNTPv2Tests, - NetworkedNNTPTests] + SendReaderNNTPv2Tests, NetworkedNNTPTests] if _have_ssl: tests.append(NetworkedNNTP_SSLTests) support.run_unittest(*tests) diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -466,6 +466,10 @@ Library ------- +- 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 #13993: HTMLParser is now able to handle broken end tags when strict=False. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Feb 15 00:38:36 2012 From: python-checkins at python.org (brett.cannon) Date: Wed, 15 Feb 2012 00:38:36 +0100 Subject: [Python-checkins] =?utf8?q?cpython=3A_Bring_importlib_in_line_w/_?= =?utf8?q?changes_made_in_my_personal_bootstrap_branch_in_the?= Message-ID: http://hg.python.org/cpython/rev/81f3bb5efa40 changeset: 74935:81f3bb5efa40 user: Brett Cannon date: Tue Feb 14 18:38:11 2012 -0500 summary: Bring importlib in line w/ changes made in my personal bootstrap branch in the sandbox. files: Lib/importlib/_bootstrap.py | 16 +++++++++++++++- 1 files changed, 15 insertions(+), 1 deletions(-) diff --git a/Lib/importlib/_bootstrap.py b/Lib/importlib/_bootstrap.py --- a/Lib/importlib/_bootstrap.py +++ b/Lib/importlib/_bootstrap.py @@ -10,6 +10,7 @@ # Injected modules are '_warnings', 'imp', 'sys', 'marshal', '_io', # and '_os' (a.k.a. 'posix', 'nt' or 'os2'). # Injected attribute is path_sep. +# Most injection is handled by _setup(). # # 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 @@ -999,7 +1000,7 @@ 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. + modules, those two modules must be explicitly passed in. """ global imp, sys @@ -1035,3 +1036,16 @@ raise ImportError('importlib requires posix or nt') setattr(self_module, '_os', os_module) setattr(self_module, 'path_sep', path_sep) + + +def _install(sys_module, imp_module): + """Install importlib as the implementation of import. + + It is assumed that imp and sys have been imported and injected into the + global namespace for the module prior to calling this function. + + """ + _setup(sys_module, imp_module) + orig_import = builtins.__import__ + builtins.__import__ = __import__ + builtins.__original_import__ = orig_import -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Feb 15 02:50:02 2012 From: python-checkins at python.org (antoine.pitrou) Date: Wed, 15 Feb 2012 02:50:02 +0100 Subject: [Python-checkins] =?utf8?b?Y3B5dGhvbiAoMy4yKTogSXNzdWUgIzEzMDE1?= =?utf8?q?=3A_Fix_a_possible_reference_leak_in_defaultdict=2E=5F=5Frepr=5F?= =?utf8?b?Xy4=?= Message-ID: http://hg.python.org/cpython/rev/86adb5c7a9d4 changeset: 74936:86adb5c7a9d4 branch: 3.2 parent: 74933:a7f1ffd741d6 user: Antoine Pitrou date: Wed Feb 15 02:42:46 2012 +0100 summary: Issue #13015: Fix a possible reference leak in defaultdict.__repr__. Patch by Suman Saha. files: Misc/NEWS | 3 +++ Modules/_collectionsmodule.c | 4 +++- 2 files changed, 6 insertions(+), 1 deletions(-) diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -113,6 +113,9 @@ Library ------- +- Issue #13015: Fix a possible reference leak in defaultdict.__repr__. + Patch by Suman Saha. + - 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. diff --git a/Modules/_collectionsmodule.c b/Modules/_collectionsmodule.c --- a/Modules/_collectionsmodule.c +++ b/Modules/_collectionsmodule.c @@ -1401,8 +1401,10 @@ { int status = Py_ReprEnter(dd->default_factory); if (status != 0) { - if (status < 0) + if (status < 0) { + Py_DECREF(baserepr); return NULL; + } defrepr = PyUnicode_FromString("..."); } else -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Feb 15 02:50:03 2012 From: python-checkins at python.org (antoine.pitrou) Date: Wed, 15 Feb 2012 02:50:03 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_3=2E2_-=3E_default=29?= =?utf8?q?=3A_Issue_=2313015=3A_Fix_a_possible_reference_leak_in_defaultdi?= =?utf8?b?Y3QuX19yZXByX18u?= Message-ID: http://hg.python.org/cpython/rev/7cfce717ceee changeset: 74937:7cfce717ceee parent: 74935:81f3bb5efa40 parent: 74936:86adb5c7a9d4 user: Antoine Pitrou date: Wed Feb 15 02:43:47 2012 +0100 summary: Issue #13015: Fix a possible reference leak in defaultdict.__repr__. Patch by Suman Saha. files: Misc/NEWS | 3 +++ Modules/_collectionsmodule.c | 4 +++- 2 files changed, 6 insertions(+), 1 deletions(-) diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -466,6 +466,9 @@ Library ------- +- Issue #13015: Fix a possible reference leak in defaultdict.__repr__. + Patch by Suman Saha. + - 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. diff --git a/Modules/_collectionsmodule.c b/Modules/_collectionsmodule.c --- a/Modules/_collectionsmodule.c +++ b/Modules/_collectionsmodule.c @@ -1403,8 +1403,10 @@ { int status = Py_ReprEnter(dd->default_factory); if (status != 0) { - if (status < 0) + if (status < 0) { + Py_DECREF(baserepr); return NULL; + } defrepr = PyUnicode_FromString("..."); } else -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Feb 15 02:50:04 2012 From: python-checkins at python.org (antoine.pitrou) Date: Wed, 15 Feb 2012 02:50:04 +0100 Subject: [Python-checkins] =?utf8?b?Y3B5dGhvbiAoMi43KTogSXNzdWUgIzEzMDE1?= =?utf8?q?=3A_Fix_a_possible_reference_leak_in_defaultdict=2E=5F=5Frepr=5F?= =?utf8?b?Xy4=?= Message-ID: http://hg.python.org/cpython/rev/7611fb3e19c6 changeset: 74938:7611fb3e19c6 branch: 2.7 parent: 74931:be41abd74949 user: Antoine Pitrou date: Wed Feb 15 02:42:46 2012 +0100 summary: Issue #13015: Fix a possible reference leak in defaultdict.__repr__. Patch by Suman Saha. files: Misc/NEWS | 3 +++ Modules/_collectionsmodule.c | 4 +++- 2 files changed, 6 insertions(+), 1 deletions(-) diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -90,6 +90,9 @@ Library ------- +- Issue #13015: Fix a possible reference leak in defaultdict.__repr__. + Patch by Suman Saha. + - Issue #13979: A bug in ctypes.util.find_library that caused the wrong library name to be returned has been fixed. diff --git a/Modules/_collectionsmodule.c b/Modules/_collectionsmodule.c --- a/Modules/_collectionsmodule.c +++ b/Modules/_collectionsmodule.c @@ -1475,8 +1475,10 @@ { int status = Py_ReprEnter(dd->default_factory); if (status != 0) { - if (status < 0) + if (status < 0) { + Py_DECREF(baserepr); return NULL; + } defrepr = PyString_FromString("..."); } else -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Feb 15 03:00:52 2012 From: python-checkins at python.org (antoine.pitrou) Date: Wed, 15 Feb 2012 03:00:52 +0100 Subject: [Python-checkins] =?utf8?b?Y3B5dGhvbiAoMy4yKTogSXNzdWUgIzEzMDIw?= =?utf8?q?=3A_Fix_a_reference_leak_when_allocating_a_structsequence_object?= Message-ID: http://hg.python.org/cpython/rev/6454e5de7c34 changeset: 74939:6454e5de7c34 branch: 3.2 parent: 74936:86adb5c7a9d4 user: Antoine Pitrou date: Wed Feb 15 02:51:43 2012 +0100 summary: Issue #13020: Fix a reference leak when allocating a structsequence object fails. Patch by Suman Saha. files: Misc/NEWS | 3 +++ Objects/structseq.c | 1 + 2 files changed, 4 insertions(+), 0 deletions(-) diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -10,6 +10,9 @@ Core and Builtins ----------------- +- 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 diff --git a/Objects/structseq.c b/Objects/structseq.c --- a/Objects/structseq.c +++ b/Objects/structseq.c @@ -129,6 +129,7 @@ res = (PyStructSequence*) PyStructSequence_New(type); if (res == NULL) { + Py_DECREF(arg); return NULL; } for (i = 0; i < len; ++i) { -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Feb 15 03:00:52 2012 From: python-checkins at python.org (antoine.pitrou) Date: Wed, 15 Feb 2012 03:00:52 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=283=2E2=29=3A_Fix_indentation?= Message-ID: http://hg.python.org/cpython/rev/7f267a650a1d changeset: 74940:7f267a650a1d branch: 3.2 user: Antoine Pitrou date: Wed Feb 15 02:52:58 2012 +0100 summary: Fix indentation files: Objects/structseq.c | 24 ++++++++++++------------ 1 files changed, 12 insertions(+), 12 deletions(-) diff --git a/Objects/structseq.c b/Objects/structseq.c --- a/Objects/structseq.c +++ b/Objects/structseq.c @@ -103,27 +103,27 @@ if (min_len != max_len) { if (len < min_len) { PyErr_Format(PyExc_TypeError, - "%.500s() takes an at least %zd-sequence (%zd-sequence given)", - type->tp_name, min_len, len); - Py_DECREF(arg); - return NULL; + "%.500s() takes an at least %zd-sequence (%zd-sequence given)", + type->tp_name, min_len, len); + Py_DECREF(arg); + return NULL; } if (len > max_len) { PyErr_Format(PyExc_TypeError, - "%.500s() takes an at most %zd-sequence (%zd-sequence given)", - type->tp_name, max_len, len); - Py_DECREF(arg); - return NULL; + "%.500s() takes an at most %zd-sequence (%zd-sequence given)", + type->tp_name, max_len, len); + Py_DECREF(arg); + return NULL; } } else { if (len != min_len) { PyErr_Format(PyExc_TypeError, - "%.500s() takes a %zd-sequence (%zd-sequence given)", - type->tp_name, min_len, len); - Py_DECREF(arg); - return NULL; + "%.500s() takes a %zd-sequence (%zd-sequence given)", + type->tp_name, min_len, len); + Py_DECREF(arg); + return NULL; } } -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Feb 15 03:00:54 2012 From: python-checkins at python.org (antoine.pitrou) Date: Wed, 15 Feb 2012 03:00:54 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_3=2E2_-=3E_default=29?= =?utf8?q?=3A_Issue_=2313020=3A_Fix_a_reference_leak_when_allocating_a_str?= =?utf8?q?uctsequence_object?= Message-ID: http://hg.python.org/cpython/rev/5e0085d67f65 changeset: 74941:5e0085d67f65 parent: 74937:7cfce717ceee parent: 74940:7f267a650a1d user: Antoine Pitrou date: Wed Feb 15 02:54:33 2012 +0100 summary: Issue #13020: Fix a reference leak when allocating a structsequence object fails. Patch by Suman Saha. files: Misc/NEWS | 3 +++ Objects/structseq.c | 25 +++++++++++++------------ 2 files changed, 16 insertions(+), 12 deletions(-) diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -10,6 +10,9 @@ Core and Builtins ----------------- +- Issue #13020: Fix a reference leak when allocating a structsequence object + fails. Patch by Suman Saha. + - Issue #13777: Add PF_SYSTEM sockets on OS X. Patch by Michael Goderbauer. diff --git a/Objects/structseq.c b/Objects/structseq.c --- a/Objects/structseq.c +++ b/Objects/structseq.c @@ -103,32 +103,33 @@ if (min_len != max_len) { if (len < min_len) { PyErr_Format(PyExc_TypeError, - "%.500s() takes an at least %zd-sequence (%zd-sequence given)", - type->tp_name, min_len, len); - Py_DECREF(arg); - return NULL; + "%.500s() takes an at least %zd-sequence (%zd-sequence given)", + type->tp_name, min_len, len); + Py_DECREF(arg); + return NULL; } if (len > max_len) { PyErr_Format(PyExc_TypeError, - "%.500s() takes an at most %zd-sequence (%zd-sequence given)", - type->tp_name, max_len, len); - Py_DECREF(arg); - return NULL; + "%.500s() takes an at most %zd-sequence (%zd-sequence given)", + type->tp_name, max_len, len); + Py_DECREF(arg); + return NULL; } } else { if (len != min_len) { PyErr_Format(PyExc_TypeError, - "%.500s() takes a %zd-sequence (%zd-sequence given)", - type->tp_name, min_len, len); - Py_DECREF(arg); - return NULL; + "%.500s() takes a %zd-sequence (%zd-sequence given)", + type->tp_name, min_len, len); + Py_DECREF(arg); + return NULL; } } res = (PyStructSequence*) PyStructSequence_New(type); if (res == NULL) { + Py_DECREF(arg); return NULL; } for (i = 0; i < len; ++i) { -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Feb 15 03:00:55 2012 From: python-checkins at python.org (antoine.pitrou) Date: Wed, 15 Feb 2012 03:00:55 +0100 Subject: [Python-checkins] =?utf8?q?cpython=3A_Move_NEWS_entry_to_correct_?= =?utf8?q?section=2E?= Message-ID: http://hg.python.org/cpython/rev/491f909f19fb changeset: 74942:491f909f19fb user: Antoine Pitrou date: Wed Feb 15 02:54:54 2012 +0100 summary: Move NEWS entry to correct section. files: Misc/NEWS | 6 +++--- 1 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -13,9 +13,6 @@ - Issue #13020: Fix a reference leak when allocating a structsequence object fails. Patch by Suman Saha. -- Issue #13777: Add PF_SYSTEM sockets on OS X. - Patch by Michael Goderbauer. - - Issue #13908: Ready types returned from PyType_FromSpec. - Issue #11235: Fix OverflowError when trying to import a source file whose @@ -469,6 +466,9 @@ Library ------- +- Issue #13777: Add PF_SYSTEM sockets on OS X. + Patch by Michael Goderbauer. + - Issue #13015: Fix a possible reference leak in defaultdict.__repr__. Patch by Suman Saha. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Feb 15 03:00:56 2012 From: python-checkins at python.org (antoine.pitrou) Date: Wed, 15 Feb 2012 03:00:56 +0100 Subject: [Python-checkins] =?utf8?b?Y3B5dGhvbiAoMi43KTogSXNzdWUgIzEzMDIw?= =?utf8?q?=3A_Fix_a_reference_leak_when_allocating_a_structsequence_object?= Message-ID: http://hg.python.org/cpython/rev/08a85fc85bf2 changeset: 74943:08a85fc85bf2 branch: 2.7 parent: 74938:7611fb3e19c6 user: Antoine Pitrou date: Wed Feb 15 02:51:43 2012 +0100 summary: Issue #13020: Fix a reference leak when allocating a structsequence object fails. Patch by Suman Saha. files: Misc/NEWS | 3 +++ Objects/structseq.c | 1 + 2 files changed, 4 insertions(+), 0 deletions(-) diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -9,6 +9,9 @@ Core and Builtins ----------------- +- Issue #13020: Fix a reference leak when allocating a structsequence object + fails. Patch by Suman Saha. + - Issue #11235: Fix OverflowError when trying to import a source file whose modification time doesn't fit in a 32-bit timestamp. diff --git a/Objects/structseq.c b/Objects/structseq.c --- a/Objects/structseq.c +++ b/Objects/structseq.c @@ -201,6 +201,7 @@ res = (PyStructSequence*) PyStructSequence_New(type); if (res == NULL) { + Py_DECREF(arg); return NULL; } for (i = 0; i < len; ++i) { -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Feb 15 03:00:57 2012 From: python-checkins at python.org (antoine.pitrou) Date: Wed, 15 Feb 2012 03:00:57 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=282=2E7=29=3A_Fix_indentation?= =?utf8?q?=2E?= Message-ID: http://hg.python.org/cpython/rev/d40e1e133039 changeset: 74944:d40e1e133039 branch: 2.7 user: Antoine Pitrou date: Wed Feb 15 02:57:19 2012 +0100 summary: Fix indentation. files: Objects/structseq.c | 24 ++++++++++++------------ 1 files changed, 12 insertions(+), 12 deletions(-) diff --git a/Objects/structseq.c b/Objects/structseq.c --- a/Objects/structseq.c +++ b/Objects/structseq.c @@ -175,27 +175,27 @@ if (min_len != max_len) { if (len < min_len) { PyErr_Format(PyExc_TypeError, - "%.500s() takes an at least %zd-sequence (%zd-sequence given)", - type->tp_name, min_len, len); - Py_DECREF(arg); - return NULL; + "%.500s() takes an at least %zd-sequence (%zd-sequence given)", + type->tp_name, min_len, len); + Py_DECREF(arg); + return NULL; } if (len > max_len) { PyErr_Format(PyExc_TypeError, - "%.500s() takes an at most %zd-sequence (%zd-sequence given)", - type->tp_name, max_len, len); - Py_DECREF(arg); - return NULL; + "%.500s() takes an at most %zd-sequence (%zd-sequence given)", + type->tp_name, max_len, len); + Py_DECREF(arg); + return NULL; } } else { if (len != min_len) { PyErr_Format(PyExc_TypeError, - "%.500s() takes a %zd-sequence (%zd-sequence given)", - type->tp_name, min_len, len); - Py_DECREF(arg); - return NULL; + "%.500s() takes a %zd-sequence (%zd-sequence given)", + type->tp_name, min_len, len); + Py_DECREF(arg); + return NULL; } } -- Repository URL: http://hg.python.org/cpython From solipsis at pitrou.net Wed Feb 15 05:31:23 2012 From: solipsis at pitrou.net (solipsis at pitrou.net) Date: Wed, 15 Feb 2012 05:31:23 +0100 Subject: [Python-checkins] Daily reference leaks (491f909f19fb): sum=0 Message-ID: results for 491f909f19fb on branch "default" -------------------------------------------- Command line was: ['./python', '-m', 'test.regrtest', '-uall', '-R', '3:3:/home/antoine/cpython/refleaks/reflogFzznGR', '-x'] From python-checkins at python.org Wed Feb 15 11:44:34 2012 From: python-checkins at python.org (ezio.melotti) Date: Wed, 15 Feb 2012 11:44:34 +0100 Subject: [Python-checkins] =?utf8?b?Y3B5dGhvbiAoMi43KTogIzEzOTg3OiBIVE1M?= =?utf8?q?Parser_is_now_able_to_handle_EOFs_in_the_middle_of_a_construct?= =?utf8?q?=2E?= Message-ID: http://hg.python.org/cpython/rev/11a31eb5da93 changeset: 74945:11a31eb5da93 branch: 2.7 user: Ezio Melotti date: Wed Feb 15 12:44:23 2012 +0200 summary: #13987: HTMLParser is now able to handle EOFs in the middle of a construct. files: Lib/HTMLParser.py | 13 ++++++++++--- Lib/test/test_htmlparser.py | 16 ++++++++-------- Misc/NEWS | 3 +++ 3 files changed, 21 insertions(+), 11 deletions(-) diff --git a/Lib/HTMLParser.py b/Lib/HTMLParser.py --- a/Lib/HTMLParser.py +++ b/Lib/HTMLParser.py @@ -170,9 +170,16 @@ else: break if k < 0: - if end: - self.error("EOF in middle of construct") - break + if not end: + break + k = rawdata.find('>', i + 1) + if k < 0: + k = rawdata.find('<', i + 1) + if k < 0: + k = i + 1 + else: + k += 1 + self.handle_data(rawdata[i:k]) i = self.updatepos(i, k) elif startswith("&#", i): match = charref.match(rawdata, i) diff --git a/Lib/test/test_htmlparser.py b/Lib/test/test_htmlparser.py --- a/Lib/test/test_htmlparser.py +++ b/Lib/test/test_htmlparser.py @@ -204,16 +204,16 @@ def test_starttag_junk_chars(self): self._run_check("", []) self._run_check("", [('comment', '$')]) - self._parse_error("") self._run_check("", [('endtag', 'a'") - self._parse_error("'", [('data', "'): # XHTML-style empty tag: self.handle_startendtag(tag, attrs) @@ -353,8 +353,10 @@ # end of input in or before attribute value, or we have the # '/' from a '/>' ending return -1 - self.updatepos(i, j) - self.error("malformed start tag") + if j > i: + return j + else: + return i + 1 raise AssertionError("we should not get here!") # Internal -- parse endtag, return end or -1 if incomplete diff --git a/Lib/test/test_htmlparser.py b/Lib/test/test_htmlparser.py --- a/Lib/test/test_htmlparser.py +++ b/Lib/test/test_htmlparser.py @@ -206,7 +206,8 @@ self._run_check("", [('comment', '$')]) self._run_check("") + # XXX this might be wrong + self._run_check("", [('data', '", [('endtag', 'a http://hg.python.org/cpython/rev/53df93a9c002 changeset: 74947:53df93a9c002 branch: 3.2 parent: 74940:7f267a650a1d user: ?ric Araujo date: Wed Feb 15 16:44:37 2012 +0100 summary: Fix parsing of build_ext --libraries option (#1326113) files: Lib/distutils/command/build_ext.py | 3 +-- Lib/distutils/tests/test_build_ext.py | 12 ++++++------ Misc/NEWS | 3 +++ 3 files changed, 10 insertions(+), 8 deletions(-) diff --git a/Lib/distutils/command/build_ext.py b/Lib/distutils/command/build_ext.py --- a/Lib/distutils/command/build_ext.py +++ b/Lib/distutils/command/build_ext.py @@ -165,8 +165,7 @@ if plat_py_include != py_include: self.include_dirs.append(plat_py_include) - if isinstance(self.libraries, str): - self.libraries = [self.libraries] + self.ensure_string_list('libraries') # Life is easier if we're not forever checking for None, so # simplify these options to empty lists if unset diff --git a/Lib/distutils/tests/test_build_ext.py b/Lib/distutils/tests/test_build_ext.py --- a/Lib/distutils/tests/test_build_ext.py +++ b/Lib/distutils/tests/test_build_ext.py @@ -178,21 +178,21 @@ # make sure cmd.libraries is turned into a list # if it's a string cmd = build_ext(dist) - cmd.libraries = 'my_lib' + cmd.libraries = 'my_lib, other_lib lastlib' cmd.finalize_options() - self.assertEqual(cmd.libraries, ['my_lib']) + self.assertEqual(cmd.libraries, ['my_lib', 'other_lib', 'lastlib']) # make sure cmd.library_dirs is turned into a list # if it's a string cmd = build_ext(dist) - cmd.library_dirs = 'my_lib_dir' + cmd.library_dirs = 'my_lib_dir%sother_lib_dir' % os.pathsep cmd.finalize_options() - self.assertTrue('my_lib_dir' in cmd.library_dirs) + self.assertEqual(cmd.library_dirs, ['my_lib_dir', 'other_lib_dir']) # make sure rpath is turned into a list - # if it's a list of os.pathsep's paths + # if it's a string cmd = build_ext(dist) - cmd.rpath = os.pathsep.join(['one', 'two']) + cmd.rpath = 'one%stwo' % os.pathsep cmd.finalize_options() self.assertEqual(cmd.rpath, ['one', 'two']) diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -119,6 +119,9 @@ - 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. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Feb 15 17:15:07 2012 From: python-checkins at python.org (eric.araujo) Date: Wed, 15 Feb 2012 17:15:07 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=283=2E2=29=3A_Improve_doc_for?= =?utf8?q?_atexit=2Eregister_and_unregister_=28=2312297=29?= Message-ID: http://hg.python.org/cpython/rev/55fc092dad72 changeset: 74948:55fc092dad72 branch: 3.2 user: ?ric Araujo date: Wed Feb 15 17:07:49 2012 +0100 summary: Improve doc for atexit.register and unregister (#12297) files: Doc/library/atexit.rst | 17 +++++++++-------- 1 files changed, 9 insertions(+), 8 deletions(-) diff --git a/Doc/library/atexit.rst b/Doc/library/atexit.rst --- a/Doc/library/atexit.rst +++ b/Doc/library/atexit.rst @@ -22,7 +22,8 @@ Register *func* as a function to be executed at termination. Any optional arguments that are to be passed to *func* must be passed as arguments to - :func:`register`. + :func:`register`. It is possible to register the same function and arguments + more than once. At normal program termination (for instance, if :func:`sys.exit` is called or the main module's execution completes), all functions registered are called in @@ -35,15 +36,17 @@ saved. After all exit handlers have had a chance to run the last exception to be raised is re-raised. - This function returns *func* which makes it possible to use it as a decorator - without binding the original name to ``None``. + This function returns *func*, which makes it possible to use it as a + decorator. .. function:: unregister(func) - Remove a function *func* from the list of functions to be run at interpreter- + Remove *func* from the list of functions to be run at interpreter shutdown. After calling :func:`unregister`, *func* is guaranteed not to be - called when the interpreter shuts down. + called when the interpreter shuts down, even if it was registered more than + once. :func:`unregister` silently does nothing if *func* was not previously + registered. .. seealso:: @@ -98,6 +101,4 @@ def goodbye(): print("You are now leaving the Python sector.") -This obviously only works with functions that don't take arguments. - - +This only works with functions that can be called without arguments. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Feb 15 17:15:09 2012 From: python-checkins at python.org (eric.araujo) Date: Wed, 15 Feb 2012 17:15:09 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_3=2E2_-=3E_default=29?= =?utf8?q?=3A_Merge_fixes_for_=231326113_and_=2312297_from_3=2E2?= Message-ID: http://hg.python.org/cpython/rev/f7163afecb97 changeset: 74949:f7163afecb97 parent: 74942:491f909f19fb parent: 74948:55fc092dad72 user: ?ric Araujo date: Wed Feb 15 17:13:26 2012 +0100 summary: Merge fixes for #1326113 and #12297 from 3.2 files: Doc/library/atexit.rst | 17 +++++++------- Lib/distutils/command/build_ext.py | 3 +- Lib/distutils/tests/test_build_ext.py | 12 +++++----- Misc/NEWS | 3 ++ 4 files changed, 19 insertions(+), 16 deletions(-) diff --git a/Doc/library/atexit.rst b/Doc/library/atexit.rst --- a/Doc/library/atexit.rst +++ b/Doc/library/atexit.rst @@ -22,7 +22,8 @@ Register *func* as a function to be executed at termination. Any optional arguments that are to be passed to *func* must be passed as arguments to - :func:`register`. + :func:`register`. It is possible to register the same function and arguments + more than once. At normal program termination (for instance, if :func:`sys.exit` is called or the main module's execution completes), all functions registered are called in @@ -35,15 +36,17 @@ saved. After all exit handlers have had a chance to run the last exception to be raised is re-raised. - This function returns *func* which makes it possible to use it as a decorator - without binding the original name to ``None``. + This function returns *func*, which makes it possible to use it as a + decorator. .. function:: unregister(func) - Remove a function *func* from the list of functions to be run at interpreter- + Remove *func* from the list of functions to be run at interpreter shutdown. After calling :func:`unregister`, *func* is guaranteed not to be - called when the interpreter shuts down. + called when the interpreter shuts down, even if it was registered more than + once. :func:`unregister` silently does nothing if *func* was not previously + registered. .. seealso:: @@ -100,6 +103,4 @@ def goodbye(): print("You are now leaving the Python sector.") -This obviously only works with functions that don't take arguments. - - +This only works with functions that can be called without arguments. diff --git a/Lib/distutils/command/build_ext.py b/Lib/distutils/command/build_ext.py --- a/Lib/distutils/command/build_ext.py +++ b/Lib/distutils/command/build_ext.py @@ -165,8 +165,7 @@ if plat_py_include != py_include: self.include_dirs.append(plat_py_include) - if isinstance(self.libraries, str): - self.libraries = [self.libraries] + self.ensure_string_list('libraries') # Life is easier if we're not forever checking for None, so # simplify these options to empty lists if unset diff --git a/Lib/distutils/tests/test_build_ext.py b/Lib/distutils/tests/test_build_ext.py --- a/Lib/distutils/tests/test_build_ext.py +++ b/Lib/distutils/tests/test_build_ext.py @@ -178,21 +178,21 @@ # make sure cmd.libraries is turned into a list # if it's a string cmd = build_ext(dist) - cmd.libraries = 'my_lib' + cmd.libraries = 'my_lib, other_lib lastlib' cmd.finalize_options() - self.assertEqual(cmd.libraries, ['my_lib']) + self.assertEqual(cmd.libraries, ['my_lib', 'other_lib', 'lastlib']) # make sure cmd.library_dirs is turned into a list # if it's a string cmd = build_ext(dist) - cmd.library_dirs = 'my_lib_dir' + cmd.library_dirs = 'my_lib_dir%sother_lib_dir' % os.pathsep cmd.finalize_options() - self.assertTrue('my_lib_dir' in cmd.library_dirs) + self.assertEqual(cmd.library_dirs, ['my_lib_dir', 'other_lib_dir']) # make sure rpath is turned into a list - # if it's a list of os.pathsep's paths + # if it's a string cmd = build_ext(dist) - cmd.rpath = os.pathsep.join(['one', 'two']) + cmd.rpath = 'one%stwo' % os.pathsep cmd.finalize_options() self.assertEqual(cmd.rpath, ['one', 'two']) diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -472,6 +472,9 @@ - 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. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Feb 15 17:15:54 2012 From: python-checkins at python.org (eric.araujo) Date: Wed, 15 Feb 2012 17:15:54 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=282=2E7=29=3A_Fix_parsing_of_?= =?utf8?q?build=5Fext_--libraries_option_=28=231326113=29?= Message-ID: http://hg.python.org/cpython/rev/96f5718bf005 changeset: 74950:96f5718bf005 branch: 2.7 parent: 74946:3d7904e3f4b9 user: ?ric Araujo date: Wed Feb 15 16:28:20 2012 +0100 summary: Fix parsing of build_ext --libraries option (#1326113) files: Lib/distutils/command/build_ext.py | 3 +-- Lib/distutils/tests/test_build_ext.py | 12 ++++++------ Misc/NEWS | 3 +++ 3 files changed, 10 insertions(+), 8 deletions(-) diff --git a/Lib/distutils/command/build_ext.py b/Lib/distutils/command/build_ext.py --- a/Lib/distutils/command/build_ext.py +++ b/Lib/distutils/command/build_ext.py @@ -160,8 +160,7 @@ if plat_py_include != py_include: self.include_dirs.append(plat_py_include) - if isinstance(self.libraries, str): - self.libraries = [self.libraries] + self.ensure_string_list('libraries') # Life is easier if we're not forever checking for None, so # simplify these options to empty lists if unset diff --git a/Lib/distutils/tests/test_build_ext.py b/Lib/distutils/tests/test_build_ext.py --- a/Lib/distutils/tests/test_build_ext.py +++ b/Lib/distutils/tests/test_build_ext.py @@ -150,21 +150,21 @@ # make sure cmd.libraries is turned into a list # if it's a string cmd = build_ext(dist) - cmd.libraries = 'my_lib' + cmd.libraries = 'my_lib, other_lib lastlib' cmd.finalize_options() - self.assertEqual(cmd.libraries, ['my_lib']) + self.assertEqual(cmd.libraries, ['my_lib', 'other_lib', 'lastlib']) # make sure cmd.library_dirs is turned into a list # if it's a string cmd = build_ext(dist) - cmd.library_dirs = 'my_lib_dir' + cmd.library_dirs = 'my_lib_dir%sother_lib_dir' % os.pathsep cmd.finalize_options() - self.assertTrue('my_lib_dir' in cmd.library_dirs) + self.assertEqual(cmd.library_dirs, ['my_lib_dir', 'other_lib_dir']) # make sure rpath is turned into a list - # if it's a list of os.pathsep's paths + # if it's a string cmd = build_ext(dist) - cmd.rpath = os.pathsep.join(['one', 'two']) + cmd.rpath = 'one%stwo' % os.pathsep cmd.finalize_options() self.assertEqual(cmd.rpath, ['one', 'two']) diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -102,6 +102,9 @@ - Issue #13979: A bug in ctypes.util.find_library that caused the wrong library name to be returned has been fixed. +- Issue #1326113: distutils' build_ext command --libraries option now + correctly parses multiple values separated by whitespace or commas. + - Issue #13993: HTMLParser is now able to handle broken end tags. - Issue #13960: HTMLParser is now able to handle broken comments. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Feb 15 17:15:55 2012 From: python-checkins at python.org (eric.araujo) Date: Wed, 15 Feb 2012 17:15:55 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=282=2E7=29=3A_Improve_doc_for?= =?utf8?q?_atexit=2Eregister_=28=2312297=29?= Message-ID: http://hg.python.org/cpython/rev/a99632426af5 changeset: 74951:a99632426af5 branch: 2.7 user: ?ric Araujo date: Wed Feb 15 17:08:34 2012 +0100 summary: Improve doc for atexit.register (#12297) files: Doc/library/atexit.rst | 12 ++++++------ 1 files changed, 6 insertions(+), 6 deletions(-) diff --git a/Doc/library/atexit.rst b/Doc/library/atexit.rst --- a/Doc/library/atexit.rst +++ b/Doc/library/atexit.rst @@ -26,7 +26,7 @@ .. index:: single: exitfunc (in sys) This is an alternate interface to the functionality provided by the -``sys.exitfunc`` variable. +:func:`sys.exitfunc` variable. Note: This module is unlikely to work correctly when used with other code that sets ``sys.exitfunc``. In particular, other core Python modules are free to use @@ -40,7 +40,8 @@ Register *func* as a function to be executed at termination. Any optional arguments that are to be passed to *func* must be passed as arguments to - :func:`register`. + :func:`register`. It is possible to register the same function and arguments + more than once. At normal program termination (for instance, if :func:`sys.exit` is called or the main module's execution completes), all functions registered are called in @@ -54,8 +55,8 @@ be raised is re-raised. .. versionchanged:: 2.6 - This function now returns *func* which makes it possible to use it as a - decorator without binding the original name to ``None``. + This function now returns *func*, which makes it possible to use it as a + decorator. .. seealso:: @@ -109,5 +110,4 @@ def goodbye(): print "You are now leaving the Python sector." -This obviously only works with functions that don't take arguments. - +This only works with functions that can be called without arguments. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Feb 15 17:25:33 2012 From: python-checkins at python.org (eric.araujo) Date: Wed, 15 Feb 2012 17:25:33 +0100 Subject: [Python-checkins] =?utf8?q?cpython=3A_Fix_parsing_of_packaging?= =?utf8?q?=E2=80=99s_build=5Fext_--libraries_option_=28=231326113=29?= Message-ID: http://hg.python.org/cpython/rev/4ba43318e56b changeset: 74952:4ba43318e56b parent: 74949:f7163afecb97 user: ?ric Araujo date: Wed Feb 15 17:25:25 2012 +0100 summary: Fix parsing of packaging?s build_ext --libraries option (#1326113) files: Lib/packaging/command/build_ext.py | 3 +- Lib/packaging/tests/test_command_build_ext.py | 12 +++++----- Misc/NEWS | 5 ++- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/Lib/packaging/command/build_ext.py b/Lib/packaging/command/build_ext.py --- a/Lib/packaging/command/build_ext.py +++ b/Lib/packaging/command/build_ext.py @@ -159,8 +159,7 @@ if plat_py_include != py_include: self.include_dirs.append(plat_py_include) - if isinstance(self.libraries, str): - self.libraries = [self.libraries] + self.ensure_string_list('libraries') # Life is easier if we're not forever checking for None, so # simplify these options to empty lists if unset diff --git a/Lib/packaging/tests/test_command_build_ext.py b/Lib/packaging/tests/test_command_build_ext.py --- a/Lib/packaging/tests/test_command_build_ext.py +++ b/Lib/packaging/tests/test_command_build_ext.py @@ -141,21 +141,21 @@ # make sure cmd.libraries is turned into a list # if it's a string cmd = build_ext(dist) - cmd.libraries = 'my_lib' + cmd.libraries = 'my_lib, other_lib lastlib' cmd.finalize_options() - self.assertEqual(cmd.libraries, ['my_lib']) + self.assertEqual(cmd.libraries, ['my_lib', 'other_lib', 'lastlib']) # make sure cmd.library_dirs is turned into a list # if it's a string cmd = build_ext(dist) - cmd.library_dirs = 'my_lib_dir' + cmd.library_dirs = 'my_lib_dir%sother_lib_dir' % os.pathsep cmd.finalize_options() - self.assertIn('my_lib_dir', cmd.library_dirs) + self.assertEqual(cmd.library_dirs, ['my_lib_dir', 'other_lib_dir']) # make sure rpath is turned into a list - # if it's a list of os.pathsep's paths + # if it's a string cmd = build_ext(dist) - cmd.rpath = os.pathsep.join(['one', 'two']) + cmd.rpath = 'one%stwo' % os.pathsep cmd.finalize_options() self.assertEqual(cmd.rpath, ['one', 'two']) diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -472,8 +472,9 @@ - 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 #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 #10287: nntplib now queries the server's CAPABILITIES first before sending MODE READER, and only sends it if not already in READER mode. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Feb 15 17:39:57 2012 From: python-checkins at python.org (eric.araujo) Date: Wed, 15 Feb 2012 17:39:57 +0100 Subject: [Python-checkins] =?utf8?q?distutils2=3A_Fix_parsing_of_build=5Fe?= =?utf8?q?xt_--libraries_option_=28=231326113=29?= Message-ID: http://hg.python.org/distutils2/rev/60dd0041c9bc changeset: 1285:60dd0041c9bc parent: 1282:0cc1fbbb473d user: ?ric Araujo date: Wed Feb 15 17:34:16 2012 +0100 summary: Fix parsing of build_ext --libraries option (#1326113) files: CHANGES.txt | 2 + distutils2/command/build_ext.py | 3 +- distutils2/tests/test_command_build_ext.py | 12 +++++----- 3 files changed, 9 insertions(+), 8 deletions(-) diff --git a/CHANGES.txt b/CHANGES.txt --- a/CHANGES.txt +++ b/CHANGES.txt @@ -164,6 +164,8 @@ - #11805: Add multiple value syntax for package_data in setup.cfg [?ric] - #13712: Don't map package_data to extra_files when converting a setup.py script with pysetup create [?ric] +- #1326113: build_ext now correctly parses multiple values given to the + --libraries option [?ric] 1.0a3 - 2010-10-08 diff --git a/distutils2/command/build_ext.py b/distutils2/command/build_ext.py --- a/distutils2/command/build_ext.py +++ b/distutils2/command/build_ext.py @@ -167,8 +167,7 @@ if plat_py_include != py_include: self.include_dirs.append(plat_py_include) - if isinstance(self.libraries, basestring): - self.libraries = [self.libraries] + self.ensure_string_list('libraries') # Life is easier if we're not forever checking for None, so # simplify these options to empty lists if unset diff --git a/distutils2/tests/test_command_build_ext.py b/distutils2/tests/test_command_build_ext.py --- a/distutils2/tests/test_command_build_ext.py +++ b/distutils2/tests/test_command_build_ext.py @@ -147,21 +147,21 @@ # make sure cmd.libraries is turned into a list # if it's a string cmd = build_ext(dist) - cmd.libraries = 'my_lib' + cmd.libraries = 'my_lib, other_lib lastlib' cmd.finalize_options() - self.assertEqual(cmd.libraries, ['my_lib']) + self.assertEqual(cmd.libraries, ['my_lib', 'other_lib', 'lastlib']) # make sure cmd.library_dirs is turned into a list # if it's a string cmd = build_ext(dist) - cmd.library_dirs = 'my_lib_dir' + cmd.library_dirs = 'my_lib_dir%sother_lib_dir' % os.pathsep cmd.finalize_options() - self.assertIn('my_lib_dir', cmd.library_dirs) + self.assertEqual(cmd.library_dirs, ['my_lib_dir', 'other_lib_dir']) # make sure rpath is turned into a list - # if it's a list of os.pathsep's paths + # if it's a string cmd = build_ext(dist) - cmd.rpath = os.pathsep.join(['one', 'two']) + cmd.rpath = 'one%stwo' % os.pathsep cmd.finalize_options() self.assertEqual(cmd.rpath, ['one', 'two']) -- Repository URL: http://hg.python.org/distutils2 From python-checkins at python.org Wed Feb 15 17:39:57 2012 From: python-checkins at python.org (eric.araujo) Date: Wed, 15 Feb 2012 17:39:57 +0100 Subject: [Python-checkins] =?utf8?q?distutils2_=28merge_default_-=3E_pytho?= =?utf8?q?n3=29=3A_Merge_=231326113_fix_from_default?= Message-ID: http://hg.python.org/distutils2/rev/158697fd8fa1 changeset: 1286:158697fd8fa1 branch: python3 parent: 1284:cc0f4d208193 parent: 1285:60dd0041c9bc user: ?ric Araujo date: Wed Feb 15 17:39:48 2012 +0100 summary: Merge #1326113 fix from default files: CHANGES.txt | 2 + distutils2/command/build_ext.py | 3 +- distutils2/tests/test_command_build_ext.py | 12 +++++----- 3 files changed, 9 insertions(+), 8 deletions(-) diff --git a/CHANGES.txt b/CHANGES.txt --- a/CHANGES.txt +++ b/CHANGES.txt @@ -164,6 +164,8 @@ - #11805: Add multiple value syntax for package_data in setup.cfg [?ric] - #13712: Don't map package_data to extra_files when converting a setup.py script with pysetup create [?ric] +- #1326113: build_ext now correctly parses multiple values given to the + --libraries option [?ric] 1.0a3 - 2010-10-08 diff --git a/distutils2/command/build_ext.py b/distutils2/command/build_ext.py --- a/distutils2/command/build_ext.py +++ b/distutils2/command/build_ext.py @@ -159,8 +159,7 @@ if plat_py_include != py_include: self.include_dirs.append(plat_py_include) - if isinstance(self.libraries, str): - self.libraries = [self.libraries] + self.ensure_string_list('libraries') # Life is easier if we're not forever checking for None, so # simplify these options to empty lists if unset diff --git a/distutils2/tests/test_command_build_ext.py b/distutils2/tests/test_command_build_ext.py --- a/distutils2/tests/test_command_build_ext.py +++ b/distutils2/tests/test_command_build_ext.py @@ -141,21 +141,21 @@ # make sure cmd.libraries is turned into a list # if it's a string cmd = build_ext(dist) - cmd.libraries = 'my_lib' + cmd.libraries = 'my_lib, other_lib lastlib' cmd.finalize_options() - self.assertEqual(cmd.libraries, ['my_lib']) + self.assertEqual(cmd.libraries, ['my_lib', 'other_lib', 'lastlib']) # make sure cmd.library_dirs is turned into a list # if it's a string cmd = build_ext(dist) - cmd.library_dirs = 'my_lib_dir' + cmd.library_dirs = 'my_lib_dir%sother_lib_dir' % os.pathsep cmd.finalize_options() - self.assertIn('my_lib_dir', cmd.library_dirs) + self.assertEqual(cmd.library_dirs, ['my_lib_dir', 'other_lib_dir']) # make sure rpath is turned into a list - # if it's a list of os.pathsep's paths + # if it's a string cmd = build_ext(dist) - cmd.rpath = os.pathsep.join(['one', 'two']) + cmd.rpath = 'one%stwo' % os.pathsep cmd.finalize_options() self.assertEqual(cmd.rpath, ['one', 'two']) -- Repository URL: http://hg.python.org/distutils2 From python-checkins at python.org Wed Feb 15 18:13:12 2012 From: python-checkins at python.org (eric.araujo) Date: Wed, 15 Feb 2012 18:13:12 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=283=2E2=29=3A_Fix_test_failur?= =?utf8?q?e_for_shared_builds_caused_by_=231326113_fix?= Message-ID: http://hg.python.org/cpython/rev/77ac369fbbf1 changeset: 74953:77ac369fbbf1 branch: 3.2 parent: 74948:55fc092dad72 user: ?ric Araujo date: Wed Feb 15 18:12:12 2012 +0100 summary: Fix test failure for shared builds caused by #1326113 fix files: Lib/distutils/tests/test_build_ext.py | 3 ++- 1 files changed, 2 insertions(+), 1 deletions(-) diff --git a/Lib/distutils/tests/test_build_ext.py b/Lib/distutils/tests/test_build_ext.py --- a/Lib/distutils/tests/test_build_ext.py +++ b/Lib/distutils/tests/test_build_ext.py @@ -187,7 +187,8 @@ cmd = build_ext(dist) cmd.library_dirs = 'my_lib_dir%sother_lib_dir' % os.pathsep cmd.finalize_options() - self.assertEqual(cmd.library_dirs, ['my_lib_dir', 'other_lib_dir']) + self.assertIn('my_lib_dir', cmd.library_dirs) + self.assertIn('other_lib_dir', cmd.library_dirs) # make sure rpath is turned into a list # if it's a string -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Feb 15 18:13:13 2012 From: python-checkins at python.org (eric.araujo) Date: Wed, 15 Feb 2012 18:13:13 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_3=2E2_-=3E_default=29?= =?utf8?q?=3A_Merge_fix_from_3=2E2?= Message-ID: http://hg.python.org/cpython/rev/b136e22daa37 changeset: 74954:b136e22daa37 parent: 74952:4ba43318e56b parent: 74953:77ac369fbbf1 user: ?ric Araujo date: Wed Feb 15 18:13:00 2012 +0100 summary: Merge fix from 3.2 files: Lib/distutils/tests/test_build_ext.py | 3 ++- 1 files changed, 2 insertions(+), 1 deletions(-) diff --git a/Lib/distutils/tests/test_build_ext.py b/Lib/distutils/tests/test_build_ext.py --- a/Lib/distutils/tests/test_build_ext.py +++ b/Lib/distutils/tests/test_build_ext.py @@ -187,7 +187,8 @@ cmd = build_ext(dist) cmd.library_dirs = 'my_lib_dir%sother_lib_dir' % os.pathsep cmd.finalize_options() - self.assertEqual(cmd.library_dirs, ['my_lib_dir', 'other_lib_dir']) + self.assertIn('my_lib_dir', cmd.library_dirs) + self.assertIn('other_lib_dir', cmd.library_dirs) # make sure rpath is turned into a list # if it's a string -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Feb 15 18:14:56 2012 From: python-checkins at python.org (eric.araujo) Date: Wed, 15 Feb 2012 18:14:56 +0100 Subject: [Python-checkins] =?utf8?q?cpython=3A_Fix_for_packaging_test_fail?= =?utf8?q?ure_on_shared_builds_=28=231326113=29?= Message-ID: http://hg.python.org/cpython/rev/98fb1c0fc7a0 changeset: 74955:98fb1c0fc7a0 user: ?ric Araujo date: Wed Feb 15 18:14:50 2012 +0100 summary: Fix for packaging test failure on shared builds (#1326113) files: Lib/packaging/tests/test_command_build_ext.py | 3 ++- 1 files changed, 2 insertions(+), 1 deletions(-) diff --git a/Lib/packaging/tests/test_command_build_ext.py b/Lib/packaging/tests/test_command_build_ext.py --- a/Lib/packaging/tests/test_command_build_ext.py +++ b/Lib/packaging/tests/test_command_build_ext.py @@ -150,7 +150,8 @@ cmd = build_ext(dist) cmd.library_dirs = 'my_lib_dir%sother_lib_dir' % os.pathsep cmd.finalize_options() - self.assertEqual(cmd.library_dirs, ['my_lib_dir', 'other_lib_dir']) + self.assertIn('my_lib_dir', cmd.library_dirs) + self.assertIn('other_lib_dir', cmd.library_dirs) # make sure rpath is turned into a list # if it's a string -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Feb 15 18:15:02 2012 From: python-checkins at python.org (eric.araujo) Date: Wed, 15 Feb 2012 18:15:02 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=282=2E7=29=3A_Fix_test_failur?= =?utf8?q?e_for_shared_builds_caused_by_=231326113_fix?= Message-ID: http://hg.python.org/cpython/rev/db1c52aa4d2a changeset: 74956:db1c52aa4d2a branch: 2.7 parent: 74951:a99632426af5 user: ?ric Araujo date: Wed Feb 15 18:13:45 2012 +0100 summary: Fix test failure for shared builds caused by #1326113 fix files: Lib/distutils/tests/test_build_ext.py | 3 ++- 1 files changed, 2 insertions(+), 1 deletions(-) diff --git a/Lib/distutils/tests/test_build_ext.py b/Lib/distutils/tests/test_build_ext.py --- a/Lib/distutils/tests/test_build_ext.py +++ b/Lib/distutils/tests/test_build_ext.py @@ -159,7 +159,8 @@ cmd = build_ext(dist) cmd.library_dirs = 'my_lib_dir%sother_lib_dir' % os.pathsep cmd.finalize_options() - self.assertEqual(cmd.library_dirs, ['my_lib_dir', 'other_lib_dir']) + self.assertIn('my_lib_dir', cmd.library_dirs) + self.assertIn('other_lib_dir', cmd.library_dirs) # make sure rpath is turned into a list # if it's a string -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Feb 15 18:57:02 2012 From: python-checkins at python.org (antoine.pitrou) Date: Wed, 15 Feb 2012 18:57:02 +0100 Subject: [Python-checkins] =?utf8?b?Y3B5dGhvbiAoMy4yKTogSXNzdWUgIzc2NDQ6?= =?utf8?q?_Add_tests_for_the_file_argument_of_NNTP=2Ehead=28=29_and_NNTP?= =?utf8?b?LmJvZHkoKS4=?= Message-ID: http://hg.python.org/cpython/rev/f1401d20bc6d changeset: 74957:f1401d20bc6d branch: 3.2 parent: 74953:77ac369fbbf1 user: Antoine Pitrou date: Wed Feb 15 18:53:18 2012 +0100 summary: Issue #7644: Add tests for the file argument of NNTP.head() and NNTP.body(). Patch by Hynek Schlawack. files: Lib/test/test_nntplib.py | 40 ++++++++++++++++++++++++++++ 1 files changed, 40 insertions(+), 0 deletions(-) diff --git a/Lib/test/test_nntplib.py b/Lib/test/test_nntplib.py --- a/Lib/test/test_nntplib.py +++ b/Lib/test/test_nntplib.py @@ -979,6 +979,26 @@ self.server.head("") self.assertEqual(cm.exception.response, "430 No Such Article Found") + def test_head_file(self): + f = io.BytesIO() + resp, info = self.server.head(file=f) + self.assertEqual(resp, "221 3000237 <45223423 at example.com>") + art_num, message_id, lines = info + self.assertEqual(art_num, 3000237) + self.assertEqual(message_id, "<45223423 at example.com>") + self.assertEqual(lines, []) + data = f.getvalue() + self.assertTrue(data.startswith( + b'From: "Demo User" \r\n' + b'Subject: I am just a test article\r\n' + ), ascii(data)) + self.assertFalse(data.endswith( + b'This is just a test article.\r\n' + b'.Here is a dot-starting line.\r\n' + b'\r\n' + b'-- Signed by Andr\xc3\xa9.\r\n' + ), ascii(data)) + def test_body(self): # BODY resp, info = self.server.body() @@ -1006,6 +1026,26 @@ self.server.body("") self.assertEqual(cm.exception.response, "430 No Such Article Found") + def test_body_file(self): + f = io.BytesIO() + resp, info = self.server.body(file=f) + self.assertEqual(resp, "222 3000237 <45223423 at example.com>") + art_num, message_id, lines = info + self.assertEqual(art_num, 3000237) + self.assertEqual(message_id, "<45223423 at example.com>") + self.assertEqual(lines, []) + data = f.getvalue() + self.assertFalse(data.startswith( + b'From: "Demo User" \r\n' + b'Subject: I am just a test article\r\n' + ), ascii(data)) + self.assertTrue(data.endswith( + b'This is just a test article.\r\n' + b'.Here is a dot-starting line.\r\n' + b'\r\n' + b'-- Signed by Andr\xc3\xa9.\r\n' + ), ascii(data)) + def check_over_xover_resp(self, resp, overviews): self.assertTrue(resp.startswith("224 "), resp) self.assertEqual(len(overviews), 3) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Feb 15 18:57:03 2012 From: python-checkins at python.org (antoine.pitrou) Date: Wed, 15 Feb 2012 18:57:03 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_3=2E2_-=3E_default=29?= =?utf8?q?=3A_Issue_=237644=3A_Add_tests_for_the_file_argument_of_NNTP=2Eh?= =?utf8?b?ZWFkKCkgYW5kIE5OVFAuYm9keSgpLg==?= Message-ID: http://hg.python.org/cpython/rev/096b31e0f8ea changeset: 74958:096b31e0f8ea parent: 74955:98fb1c0fc7a0 parent: 74957:f1401d20bc6d user: Antoine Pitrou date: Wed Feb 15 18:53:49 2012 +0100 summary: Issue #7644: Add tests for the file argument of NNTP.head() and NNTP.body(). Patch by Hynek Schlawack. files: Lib/test/test_nntplib.py | 40 ++++++++++++++++++++++++++++ 1 files changed, 40 insertions(+), 0 deletions(-) diff --git a/Lib/test/test_nntplib.py b/Lib/test/test_nntplib.py --- a/Lib/test/test_nntplib.py +++ b/Lib/test/test_nntplib.py @@ -1000,6 +1000,26 @@ self.server.head("") self.assertEqual(cm.exception.response, "430 No Such Article Found") + def test_head_file(self): + f = io.BytesIO() + resp, info = self.server.head(file=f) + self.assertEqual(resp, "221 3000237 <45223423 at example.com>") + art_num, message_id, lines = info + self.assertEqual(art_num, 3000237) + self.assertEqual(message_id, "<45223423 at example.com>") + self.assertEqual(lines, []) + data = f.getvalue() + self.assertTrue(data.startswith( + b'From: "Demo User" \r\n' + b'Subject: I am just a test article\r\n' + ), ascii(data)) + self.assertFalse(data.endswith( + b'This is just a test article.\r\n' + b'.Here is a dot-starting line.\r\n' + b'\r\n' + b'-- Signed by Andr\xc3\xa9.\r\n' + ), ascii(data)) + def test_body(self): # BODY resp, info = self.server.body() @@ -1027,6 +1047,26 @@ self.server.body("") self.assertEqual(cm.exception.response, "430 No Such Article Found") + def test_body_file(self): + f = io.BytesIO() + resp, info = self.server.body(file=f) + self.assertEqual(resp, "222 3000237 <45223423 at example.com>") + art_num, message_id, lines = info + self.assertEqual(art_num, 3000237) + self.assertEqual(message_id, "<45223423 at example.com>") + self.assertEqual(lines, []) + data = f.getvalue() + self.assertFalse(data.startswith( + b'From: "Demo User" \r\n' + b'Subject: I am just a test article\r\n' + ), ascii(data)) + self.assertTrue(data.endswith( + b'This is just a test article.\r\n' + b'.Here is a dot-starting line.\r\n' + b'\r\n' + b'-- Signed by Andr\xc3\xa9.\r\n' + ), ascii(data)) + def check_over_xover_resp(self, resp, overviews): self.assertTrue(resp.startswith("224 "), resp) self.assertEqual(len(overviews), 3) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Feb 15 21:26:11 2012 From: python-checkins at python.org (petri.lehtinen) Date: Wed, 15 Feb 2012 21:26:11 +0100 Subject: [Python-checkins] =?utf8?b?Y3B5dGhvbiAoMy4yKTogSXNzdWUgIzEzNDkx?= =?utf8?q?=3A_Fix_many_errors_in_sqlite3_documentation?= Message-ID: http://hg.python.org/cpython/rev/9eb77d455be1 changeset: 74959:9eb77d455be1 branch: 3.2 parent: 74957:f1401d20bc6d user: Petri Lehtinen date: Wed Feb 15 22:17:21 2012 +0200 summary: Issue #13491: Fix many errors in sqlite3 documentation Initial patch by Johannes Vogel. files: Doc/includes/sqlite3/converter_point.py | 4 +- Doc/includes/sqlite3/execute_1.py | 11 +++- Doc/includes/sqlite3/execute_2.py | 12 ----- Doc/includes/sqlite3/executemany_2.py | 4 +- Doc/includes/sqlite3/md5func.py | 2 +- Doc/includes/sqlite3/rowclass.py | 8 +- Doc/includes/sqlite3/text_factory.py | 28 ++---------- Doc/library/sqlite3.rst | 8 +-- Misc/ACKS | 1 + Misc/NEWS | 3 + 10 files changed, 29 insertions(+), 52 deletions(-) diff --git a/Doc/includes/sqlite3/converter_point.py b/Doc/includes/sqlite3/converter_point.py --- a/Doc/includes/sqlite3/converter_point.py +++ b/Doc/includes/sqlite3/converter_point.py @@ -8,10 +8,10 @@ return "(%f;%f)" % (self.x, self.y) def adapt_point(point): - return "%f;%f" % (point.x, point.y) + return ("%f;%f" % (point.x, point.y)).encode('ascii') def convert_point(s): - x, y = list(map(float, s.split(";"))) + x, y = list(map(float, s.split(b";"))) return Point(x, y) # Register the adapter diff --git a/Doc/includes/sqlite3/execute_1.py b/Doc/includes/sqlite3/execute_1.py --- a/Doc/includes/sqlite3/execute_1.py +++ b/Doc/includes/sqlite3/execute_1.py @@ -1,11 +1,16 @@ import sqlite3 -con = sqlite3.connect("mydb") - +con = sqlite3.connect(":memory:") cur = con.cursor() +cur.execute("create table people (name_last, age)") who = "Yeltsin" age = 72 -cur.execute("select name_last, age from people where name_last=? and age=?", (who, age)) +# This is the qmark style: +cur.execute("insert into people values (?, ?)", (who, age)) + +# And this is the named style: +cur.execute("select * from people where name_last=:who and age=:age", {"who": who, "age": age}) + print(cur.fetchone()) diff --git a/Doc/includes/sqlite3/execute_2.py b/Doc/includes/sqlite3/execute_2.py deleted file mode 100644 --- a/Doc/includes/sqlite3/execute_2.py +++ /dev/null @@ -1,12 +0,0 @@ -import sqlite3 - -con = sqlite3.connect("mydb") - -cur = con.cursor() - -who = "Yeltsin" -age = 72 - -cur.execute("select name_last, age from people where name_last=:who and age=:age", - {"who": who, "age": age}) -print(cur.fetchone()) diff --git a/Doc/includes/sqlite3/executemany_2.py b/Doc/includes/sqlite3/executemany_2.py --- a/Doc/includes/sqlite3/executemany_2.py +++ b/Doc/includes/sqlite3/executemany_2.py @@ -1,8 +1,8 @@ import sqlite3 +import string def char_generator(): - import string - for c in string.letters[:26]: + for c in string.ascii_lowercase: yield (c,) con = sqlite3.connect(":memory:") diff --git a/Doc/includes/sqlite3/md5func.py b/Doc/includes/sqlite3/md5func.py --- a/Doc/includes/sqlite3/md5func.py +++ b/Doc/includes/sqlite3/md5func.py @@ -7,5 +7,5 @@ con = sqlite3.connect(":memory:") con.create_function("md5", 1, md5sum) cur = con.cursor() -cur.execute("select md5(?)", ("foo",)) +cur.execute("select md5(?)", (b"foo",)) print(cur.fetchone()[0]) diff --git a/Doc/includes/sqlite3/rowclass.py b/Doc/includes/sqlite3/rowclass.py --- a/Doc/includes/sqlite3/rowclass.py +++ b/Doc/includes/sqlite3/rowclass.py @@ -1,12 +1,12 @@ import sqlite3 -con = sqlite3.connect("mydb") +con = sqlite3.connect(":memory:") con.row_factory = sqlite3.Row cur = con.cursor() -cur.execute("select name_last, age from people") +cur.execute("select 'John' as name, 42 as age") for row in cur: - assert row[0] == row["name_last"] - assert row["name_last"] == row["nAmE_lAsT"] + assert row[0] == row["name"] + assert row["name"] == row["nAmE"] assert row[1] == row["age"] assert row[1] == row["AgE"] diff --git a/Doc/includes/sqlite3/text_factory.py b/Doc/includes/sqlite3/text_factory.py --- a/Doc/includes/sqlite3/text_factory.py +++ b/Doc/includes/sqlite3/text_factory.py @@ -3,9 +3,6 @@ con = sqlite3.connect(":memory:") cur = con.cursor() -# Create the table -con.execute("create table person(lastname, firstname)") - AUSTRIA = "\xd6sterreich" # by default, rows are returned as Unicode @@ -14,30 +11,17 @@ assert row[0] == AUSTRIA # but we can make sqlite3 always return bytestrings ... -con.text_factory = str +con.text_factory = bytes cur.execute("select ?", (AUSTRIA,)) row = cur.fetchone() -assert type(row[0]) == str +assert type(row[0]) is bytes # the bytestrings will be encoded in UTF-8, unless you stored garbage in the # database ... assert row[0] == AUSTRIA.encode("utf-8") # we can also implement a custom text_factory ... -# here we implement one that will ignore Unicode characters that cannot be -# decoded from UTF-8 -con.text_factory = lambda x: str(x, "utf-8", "ignore") -cur.execute("select ?", ("this is latin1 and would normally create errors" + - "\xe4\xf6\xfc".encode("latin1"),)) +# here we implement one that appends "foo" to all strings +con.text_factory = lambda x: x.decode("utf-8") + "foo" +cur.execute("select ?", ("bar",)) row = cur.fetchone() -assert type(row[0]) == str - -# sqlite3 offers a built-in optimized text_factory that will return bytestring -# objects, if the data is in ASCII only, and otherwise return unicode objects -con.text_factory = sqlite3.OptimizedUnicode -cur.execute("select ?", (AUSTRIA,)) -row = cur.fetchone() -assert type(row[0]) == str - -cur.execute("select ?", ("Germany",)) -row = cur.fetchone() -assert type(row[0]) == str +assert row[0] == "barfoo" diff --git a/Doc/library/sqlite3.rst b/Doc/library/sqlite3.rst --- a/Doc/library/sqlite3.rst +++ b/Doc/library/sqlite3.rst @@ -472,14 +472,10 @@ kinds of placeholders: question marks (qmark style) and named placeholders (named style). - This example shows how to use parameters with qmark style: + Here's an example of both styles: .. literalinclude:: ../includes/sqlite3/execute_1.py - This example shows how to use the named style: - - .. literalinclude:: ../includes/sqlite3/execute_2.py - :meth:`execute` will only execute a single SQL statement. If you try to execute more than one statement with it, it will raise a Warning. Use :meth:`executescript` if you want to execute multiple SQL statements with one @@ -761,7 +757,7 @@ :: def convert_point(s): - x, y = map(float, s.split(";")) + x, y = map(float, s.split(b";")) return Point(x, y) Now you need to make the :mod:`sqlite3` module know that what you select from diff --git a/Misc/ACKS b/Misc/ACKS --- a/Misc/ACKS +++ b/Misc/ACKS @@ -956,6 +956,7 @@ Kurt Vile Norman Vine Frank Visser +Johannes Vogel Sjoerd de Vries Niki W. Waibel Wojtek Walczak diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -524,6 +524,9 @@ Documentation ------------- +- Issue #13491: Fix many errors in sqlite3 documentation. Initial + patch by Johannes Vogel. + - Issue #13402: Document absoluteness of sys.executable. - Issue #13883: PYTHONCASEOK also used on OS X and OS/2. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Feb 15 21:26:12 2012 From: python-checkins at python.org (petri.lehtinen) Date: Wed, 15 Feb 2012 21:26:12 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_3=2E2_-=3E_default=29?= =?utf8?q?=3A_Merge_branch_=273=2E2=27?= Message-ID: http://hg.python.org/cpython/rev/ba5b337ecc27 changeset: 74960:ba5b337ecc27 parent: 74958:096b31e0f8ea parent: 74959:9eb77d455be1 user: Petri Lehtinen date: Wed Feb 15 22:22:34 2012 +0200 summary: Merge branch '3.2' Issue #13491. files: Doc/includes/sqlite3/converter_point.py | 4 +- Doc/includes/sqlite3/execute_1.py | 11 ++++++-- Doc/includes/sqlite3/execute_2.py | 12 --------- Doc/includes/sqlite3/executemany_2.py | 4 +- Doc/includes/sqlite3/md5func.py | 2 +- Doc/includes/sqlite3/rowclass.py | 8 +++--- Doc/includes/sqlite3/text_factory.py | 17 ++++-------- Doc/library/sqlite3.rst | 8 +---- Misc/ACKS | 1 + Misc/NEWS | 3 ++ 10 files changed, 29 insertions(+), 41 deletions(-) diff --git a/Doc/includes/sqlite3/converter_point.py b/Doc/includes/sqlite3/converter_point.py --- a/Doc/includes/sqlite3/converter_point.py +++ b/Doc/includes/sqlite3/converter_point.py @@ -8,10 +8,10 @@ return "(%f;%f)" % (self.x, self.y) def adapt_point(point): - return "%f;%f" % (point.x, point.y) + return ("%f;%f" % (point.x, point.y)).encode('ascii') def convert_point(s): - x, y = list(map(float, s.split(";"))) + x, y = list(map(float, s.split(b";"))) return Point(x, y) # Register the adapter diff --git a/Doc/includes/sqlite3/execute_1.py b/Doc/includes/sqlite3/execute_1.py --- a/Doc/includes/sqlite3/execute_1.py +++ b/Doc/includes/sqlite3/execute_1.py @@ -1,11 +1,16 @@ import sqlite3 -con = sqlite3.connect("mydb") - +con = sqlite3.connect(":memory:") cur = con.cursor() +cur.execute("create table people (name_last, age)") who = "Yeltsin" age = 72 -cur.execute("select name_last, age from people where name_last=? and age=?", (who, age)) +# This is the qmark style: +cur.execute("insert into people values (?, ?)", (who, age)) + +# And this is the named style: +cur.execute("select * from people where name_last=:who and age=:age", {"who": who, "age": age}) + print(cur.fetchone()) diff --git a/Doc/includes/sqlite3/execute_2.py b/Doc/includes/sqlite3/execute_2.py deleted file mode 100644 --- a/Doc/includes/sqlite3/execute_2.py +++ /dev/null @@ -1,12 +0,0 @@ -import sqlite3 - -con = sqlite3.connect("mydb") - -cur = con.cursor() - -who = "Yeltsin" -age = 72 - -cur.execute("select name_last, age from people where name_last=:who and age=:age", - {"who": who, "age": age}) -print(cur.fetchone()) diff --git a/Doc/includes/sqlite3/executemany_2.py b/Doc/includes/sqlite3/executemany_2.py --- a/Doc/includes/sqlite3/executemany_2.py +++ b/Doc/includes/sqlite3/executemany_2.py @@ -1,8 +1,8 @@ import sqlite3 +import string def char_generator(): - import string - for c in string.letters[:26]: + for c in string.ascii_lowercase: yield (c,) con = sqlite3.connect(":memory:") diff --git a/Doc/includes/sqlite3/md5func.py b/Doc/includes/sqlite3/md5func.py --- a/Doc/includes/sqlite3/md5func.py +++ b/Doc/includes/sqlite3/md5func.py @@ -7,5 +7,5 @@ con = sqlite3.connect(":memory:") con.create_function("md5", 1, md5sum) cur = con.cursor() -cur.execute("select md5(?)", ("foo",)) +cur.execute("select md5(?)", (b"foo",)) print(cur.fetchone()[0]) diff --git a/Doc/includes/sqlite3/rowclass.py b/Doc/includes/sqlite3/rowclass.py --- a/Doc/includes/sqlite3/rowclass.py +++ b/Doc/includes/sqlite3/rowclass.py @@ -1,12 +1,12 @@ import sqlite3 -con = sqlite3.connect("mydb") +con = sqlite3.connect(":memory:") con.row_factory = sqlite3.Row cur = con.cursor() -cur.execute("select name_last, age from people") +cur.execute("select 'John' as name, 42 as age") for row in cur: - assert row[0] == row["name_last"] - assert row["name_last"] == row["nAmE_lAsT"] + assert row[0] == row["name"] + assert row["name"] == row["nAmE"] assert row[1] == row["age"] assert row[1] == row["AgE"] diff --git a/Doc/includes/sqlite3/text_factory.py b/Doc/includes/sqlite3/text_factory.py --- a/Doc/includes/sqlite3/text_factory.py +++ b/Doc/includes/sqlite3/text_factory.py @@ -3,9 +3,6 @@ con = sqlite3.connect(":memory:") cur = con.cursor() -# Create the table -con.execute("create table person(lastname, firstname)") - AUSTRIA = "\xd6sterreich" # by default, rows are returned as Unicode @@ -14,19 +11,17 @@ assert row[0] == AUSTRIA # but we can make sqlite3 always return bytestrings ... -con.text_factory = str +con.text_factory = bytes cur.execute("select ?", (AUSTRIA,)) row = cur.fetchone() -assert type(row[0]) == str +assert type(row[0]) is bytes # the bytestrings will be encoded in UTF-8, unless you stored garbage in the # database ... assert row[0] == AUSTRIA.encode("utf-8") # we can also implement a custom text_factory ... -# here we implement one that will ignore Unicode characters that cannot be -# decoded from UTF-8 -con.text_factory = lambda x: str(x, "utf-8", "ignore") -cur.execute("select ?", ("this is latin1 and would normally create errors" + - "\xe4\xf6\xfc".encode("latin1"),)) +# here we implement one that appends "foo" to all strings +con.text_factory = lambda x: x.decode("utf-8") + "foo" +cur.execute("select ?", ("bar",)) row = cur.fetchone() -assert type(row[0]) == str +assert row[0] == "barfoo" diff --git a/Doc/library/sqlite3.rst b/Doc/library/sqlite3.rst --- a/Doc/library/sqlite3.rst +++ b/Doc/library/sqlite3.rst @@ -484,14 +484,10 @@ kinds of placeholders: question marks (qmark style) and named placeholders (named style). - This example shows how to use parameters with qmark style: + Here's an example of both styles: .. literalinclude:: ../includes/sqlite3/execute_1.py - This example shows how to use the named style: - - .. literalinclude:: ../includes/sqlite3/execute_2.py - :meth:`execute` will only execute a single SQL statement. If you try to execute more than one statement with it, it will raise a Warning. Use :meth:`executescript` if you want to execute multiple SQL statements with one @@ -773,7 +769,7 @@ :: def convert_point(s): - x, y = map(float, s.split(";")) + x, y = map(float, s.split(b";")) return Point(x, y) Now you need to make the :mod:`sqlite3` module know that what you select from diff --git a/Misc/ACKS b/Misc/ACKS --- a/Misc/ACKS +++ b/Misc/ACKS @@ -1041,6 +1041,7 @@ Kurt Vile Norman Vine Frank Visser +Johannes Vogel Sjoerd de Vries Niki W. Waibel Wojtek Walczak diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -2254,6 +2254,9 @@ Documentation ------------- +- Issue #13491: Fix many errors in sqlite3 documentation. Initial + patch by Johannes Vogel. + - Issue #13402: Document absoluteness of sys.executable. - Issue #13883: PYTHONCASEOK also works on OS X. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Feb 15 22:25:01 2012 From: python-checkins at python.org (victor.stinner) Date: Wed, 15 Feb 2012 22:25:01 +0100 Subject: [Python-checkins] =?utf8?b?Y3B5dGhvbiAoMy4yKTogSXNzdWUgIzEzOTEz?= =?utf8?q?=3A_Fix_test=5Fpep3120_for_the_UTF-8_codec_name?= Message-ID: http://hg.python.org/cpython/rev/5b8f146103fa changeset: 74961:5b8f146103fa branch: 3.2 parent: 74959:9eb77d455be1 user: Victor Stinner date: Wed Feb 15 22:24:17 2012 +0100 summary: Issue #13913: Fix test_pep3120 for the UTF-8 codec name files: Lib/test/test_pep3120.py | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Lib/test/test_pep3120.py b/Lib/test/test_pep3120.py --- a/Lib/test/test_pep3120.py +++ b/Lib/test/test_pep3120.py @@ -20,7 +20,7 @@ import test.badsyntax_pep3120 except SyntaxError as msg: msg = str(msg) - self.assertTrue('UTF-8' in msg or 'utf8' in msg) + self.assertTrue('Non-UTF-8 code starting with' in msg) else: self.fail("expected exception didn't occur") -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Feb 15 22:25:03 2012 From: python-checkins at python.org (victor.stinner) Date: Wed, 15 Feb 2012 22:25:03 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_3=2E2_-=3E_default=29?= =?utf8?q?=3A_=28Merge_3=2E2=29_Issue_=2313913=3A_Fix_test=5Fpep3120_for_t?= =?utf8?q?he_UTF-8_codec_name?= Message-ID: http://hg.python.org/cpython/rev/170a224ce01e changeset: 74962:170a224ce01e parent: 74960:ba5b337ecc27 parent: 74961:5b8f146103fa user: Victor Stinner date: Wed Feb 15 22:25:51 2012 +0100 summary: (Merge 3.2) Issue #13913: Fix test_pep3120 for the UTF-8 codec name files: Lib/test/test_pep3120.py | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Lib/test/test_pep3120.py b/Lib/test/test_pep3120.py --- a/Lib/test/test_pep3120.py +++ b/Lib/test/test_pep3120.py @@ -19,8 +19,8 @@ try: import test.badsyntax_pep3120 except SyntaxError as msg: - msg = str(msg).lower() - self.assertTrue('utf-8' in msg or 'utf8' in msg) + msg = str(msg) + self.assertTrue('Non-UTF-8 code starting with' in msg) else: self.fail("expected exception didn't occur") -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Feb 15 22:34:39 2012 From: python-checkins at python.org (antoine.pitrou) Date: Wed, 15 Feb 2012 22:34:39 +0100 Subject: [Python-checkins] =?utf8?b?Y3B5dGhvbiAoMy4yKTogSXNzdWUgIzEzMDE0?= =?utf8?q?=3A_Fix_a_possible_reference_leak_in_SSLSocket=2Egetpeercert=28?= =?utf8?b?KS4=?= Message-ID: http://hg.python.org/cpython/rev/f3a4c2b34973 changeset: 74963:f3a4c2b34973 branch: 3.2 parent: 74959:9eb77d455be1 user: Antoine Pitrou date: Wed Feb 15 22:25:27 2012 +0100 summary: Issue #13014: Fix a possible reference leak in SSLSocket.getpeercert(). files: Misc/NEWS | 2 ++ Modules/_ssl.c | 23 ++++++++++++++--------- 2 files changed, 16 insertions(+), 9 deletions(-) diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -116,6 +116,8 @@ Library ------- +- Issue #13014: Fix a possible reference leak in SSLSocket.getpeercert(). + - Issue #13015: Fix a possible reference leak in defaultdict.__repr__. Patch by Suman Saha. diff --git a/Modules/_ssl.c b/Modules/_ssl.c --- a/Modules/_ssl.c +++ b/Modules/_ssl.c @@ -519,15 +519,20 @@ goto fail1; } /* now, there's typically a dangling RDN */ - if ((rdn != NULL) && (PyList_Size(rdn) > 0)) { - rdnt = PyList_AsTuple(rdn); - Py_DECREF(rdn); - if (rdnt == NULL) - goto fail0; - retcode = PyList_Append(dn, rdnt); - Py_DECREF(rdnt); - if (retcode < 0) - goto fail0; + if (rdn != NULL) { + if (PyList_GET_SIZE(rdn) > 0) { + rdnt = PyList_AsTuple(rdn); + Py_DECREF(rdn); + if (rdnt == NULL) + goto fail0; + retcode = PyList_Append(dn, rdnt); + Py_DECREF(rdnt); + if (retcode < 0) + goto fail0; + } + else { + Py_DECREF(rdn); + } } /* convert list to tuple */ -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Feb 15 22:34:40 2012 From: python-checkins at python.org (antoine.pitrou) Date: Wed, 15 Feb 2012 22:34:40 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_3=2E2_-=3E_default=29?= =?utf8?q?=3A_Issue_=2313014=3A_Fix_a_possible_reference_leak_in_SSLSocket?= =?utf8?b?LmdldHBlZXJjZXJ0KCku?= Message-ID: http://hg.python.org/cpython/rev/9ab501b3e22d changeset: 74964:9ab501b3e22d parent: 74960:ba5b337ecc27 parent: 74963:f3a4c2b34973 user: Antoine Pitrou date: Wed Feb 15 22:28:21 2012 +0100 summary: Issue #13014: Fix a possible reference leak in SSLSocket.getpeercert(). files: Misc/NEWS | 2 ++ Modules/_ssl.c | 23 ++++++++++++++--------- 2 files changed, 16 insertions(+), 9 deletions(-) diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -466,6 +466,8 @@ Library ------- +- Issue #13014: Fix a possible reference leak in SSLSocket.getpeercert(). + - Issue #13777: Add PF_SYSTEM sockets on OS X. Patch by Michael Goderbauer. diff --git a/Modules/_ssl.c b/Modules/_ssl.c --- a/Modules/_ssl.c +++ b/Modules/_ssl.c @@ -547,15 +547,20 @@ goto fail1; } /* now, there's typically a dangling RDN */ - if ((rdn != NULL) && (PyList_Size(rdn) > 0)) { - rdnt = PyList_AsTuple(rdn); - Py_DECREF(rdn); - if (rdnt == NULL) - goto fail0; - retcode = PyList_Append(dn, rdnt); - Py_DECREF(rdnt); - if (retcode < 0) - goto fail0; + if (rdn != NULL) { + if (PyList_GET_SIZE(rdn) > 0) { + rdnt = PyList_AsTuple(rdn); + Py_DECREF(rdn); + if (rdnt == NULL) + goto fail0; + retcode = PyList_Append(dn, rdnt); + Py_DECREF(rdnt); + if (retcode < 0) + goto fail0; + } + else { + Py_DECREF(rdn); + } } /* convert list to tuple */ -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Feb 15 22:34:41 2012 From: python-checkins at python.org (antoine.pitrou) Date: Wed, 15 Feb 2012 22:34:41 +0100 Subject: [Python-checkins] =?utf8?b?Y3B5dGhvbiAoMi43KTogSXNzdWUgIzEzMDE0?= =?utf8?q?=3A_Fix_a_possible_reference_leak_in_SSLSocket=2Egetpeercert=28?= =?utf8?b?KS4=?= Message-ID: http://hg.python.org/cpython/rev/111dcae41ff7 changeset: 74965:111dcae41ff7 branch: 2.7 parent: 74956:db1c52aa4d2a user: Antoine Pitrou date: Wed Feb 15 22:25:27 2012 +0100 summary: Issue #13014: Fix a possible reference leak in SSLSocket.getpeercert(). files: Misc/NEWS | 2 ++ Modules/_ssl.c | 23 ++++++++++++++--------- 2 files changed, 16 insertions(+), 9 deletions(-) diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -93,6 +93,8 @@ Library ------- +- Issue #13014: Fix a possible reference leak in SSLSocket.getpeercert(). + - Issue #13987: HTMLParser is now able to handle EOFs in the middle of a construct and malformed start tags. diff --git a/Modules/_ssl.c b/Modules/_ssl.c --- a/Modules/_ssl.c +++ b/Modules/_ssl.c @@ -644,15 +644,20 @@ goto fail1; } /* now, there's typically a dangling RDN */ - if ((rdn != NULL) && (PyList_Size(rdn) > 0)) { - rdnt = PyList_AsTuple(rdn); - Py_DECREF(rdn); - if (rdnt == NULL) - goto fail0; - retcode = PyList_Append(dn, rdnt); - Py_DECREF(rdnt); - if (retcode < 0) - goto fail0; + if (rdn != NULL) { + if (PyList_GET_SIZE(rdn) > 0) { + rdnt = PyList_AsTuple(rdn); + Py_DECREF(rdn); + if (rdnt == NULL) + goto fail0; + retcode = PyList_Append(dn, rdnt); + Py_DECREF(rdnt); + if (retcode < 0) + goto fail0; + } + else { + Py_DECREF(rdn); + } } /* convert list to tuple */ -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Feb 15 22:34:41 2012 From: python-checkins at python.org (antoine.pitrou) Date: Wed, 15 Feb 2012 22:34:41 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_default_-=3E_default?= =?utf8?q?=29=3A_Merge?= Message-ID: http://hg.python.org/cpython/rev/e9d01c5c92ed changeset: 74966:e9d01c5c92ed parent: 74964:9ab501b3e22d parent: 74962:170a224ce01e user: Antoine Pitrou date: Wed Feb 15 22:30:29 2012 +0100 summary: Merge files: Lib/test/test_pep3120.py | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Lib/test/test_pep3120.py b/Lib/test/test_pep3120.py --- a/Lib/test/test_pep3120.py +++ b/Lib/test/test_pep3120.py @@ -19,8 +19,8 @@ try: import test.badsyntax_pep3120 except SyntaxError as msg: - msg = str(msg).lower() - self.assertTrue('utf-8' in msg or 'utf8' in msg) + msg = str(msg) + self.assertTrue('Non-UTF-8 code starting with' in msg) else: self.fail("expected exception didn't occur") -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Feb 15 22:34:42 2012 From: python-checkins at python.org (antoine.pitrou) Date: Wed, 15 Feb 2012 22:34:42 +0100 Subject: [Python-checkins] =?utf8?b?Y3B5dGhvbiAobWVyZ2UgMy4yIC0+IDMuMik6?= =?utf8?q?_Merge?= Message-ID: http://hg.python.org/cpython/rev/49edc16fddb6 changeset: 74967:49edc16fddb6 branch: 3.2 parent: 74963:f3a4c2b34973 parent: 74961:5b8f146103fa user: Antoine Pitrou date: Wed Feb 15 22:31:23 2012 +0100 summary: Merge files: Lib/test/test_pep3120.py | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Lib/test/test_pep3120.py b/Lib/test/test_pep3120.py --- a/Lib/test/test_pep3120.py +++ b/Lib/test/test_pep3120.py @@ -20,7 +20,7 @@ import test.badsyntax_pep3120 except SyntaxError as msg: msg = str(msg) - self.assertTrue('UTF-8' in msg or 'utf8' in msg) + self.assertTrue('Non-UTF-8 code starting with' in msg) else: self.fail("expected exception didn't occur") -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Feb 15 23:32:01 2012 From: python-checkins at python.org (sandro.tosi) Date: Wed, 15 Feb 2012 23:32:01 +0100 Subject: [Python-checkins] =?utf8?b?Y3B5dGhvbiAoMi43KTogSXNzdWUgIzExODM2?= =?utf8?q?=3A_document_multiprocessing=2Equeues=2ESimpleQueue?= Message-ID: http://hg.python.org/cpython/rev/3b127a415643 changeset: 74968:3b127a415643 branch: 2.7 parent: 74965:111dcae41ff7 user: Sandro Tosi date: Wed Feb 15 22:39:52 2012 +0100 summary: Issue #11836: document multiprocessing.queues.SimpleQueue files: Doc/library/multiprocessing.rst | 19 ++++++++++++++++++- 1 files changed, 18 insertions(+), 1 deletions(-) diff --git a/Doc/library/multiprocessing.rst b/Doc/library/multiprocessing.rst --- a/Doc/library/multiprocessing.rst +++ b/Doc/library/multiprocessing.rst @@ -464,7 +464,7 @@ 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` and :class:`JoinableQueue` types are multi-producer, +The :class:`Queue`, :class:`multiprocessing.queues.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 @@ -610,6 +610,23 @@ exits -- see :meth:`join_thread`. +.. class:: multiprocessing.queues.SimpleQueue() + + It is a simplified :class:`Queue` type, very close to a locked :class:`Pipe`. + + .. method:: empty() + + Return ``True`` if the queue is empty, ``False`` otherwise. + + .. method:: get() + + Remove and return an item from the queue. + + .. method:: put(item) + + Put *item* into the queue. + + .. class:: JoinableQueue([maxsize]) :class:`JoinableQueue`, a :class:`Queue` subclass, is a queue which -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Feb 15 23:32:02 2012 From: python-checkins at python.org (sandro.tosi) Date: Wed, 15 Feb 2012 23:32:02 +0100 Subject: [Python-checkins] =?utf8?b?Y3B5dGhvbiAoMy4yKTogSXNzdWUgIzExODM2?= =?utf8?q?=3A_document_multiprocessing=2Equeues=2ESimpleQueue?= Message-ID: http://hg.python.org/cpython/rev/fe5eb6d35025 changeset: 74969:fe5eb6d35025 branch: 3.2 parent: 74967:49edc16fddb6 user: Sandro Tosi date: Wed Feb 15 23:14:21 2012 +0100 summary: Issue #11836: document multiprocessing.queues.SimpleQueue files: Doc/library/multiprocessing.rst | 19 ++++++++++++++++++- 1 files changed, 18 insertions(+), 1 deletions(-) diff --git a/Doc/library/multiprocessing.rst b/Doc/library/multiprocessing.rst --- a/Doc/library/multiprocessing.rst +++ b/Doc/library/multiprocessing.rst @@ -464,7 +464,7 @@ 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` and :class:`JoinableQueue` types are multi-producer, +The :class:`Queue`, :class:`multiprocessing.queues.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 @@ -610,6 +610,23 @@ exits -- see :meth:`join_thread`. +.. class:: multiprocessing.queues.SimpleQueue() + + It is a simplified :class:`Queue` type, very close to a locked :class:`Pipe`. + + .. method:: empty() + + Return ``True`` if the queue is empty, ``False`` otherwise. + + .. method:: get() + + Remove and return an item from the queue. + + .. method:: put(item) + + Put *item* into the queue. + + .. class:: JoinableQueue([maxsize]) :class:`JoinableQueue`, a :class:`Queue` subclass, is a queue which -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Feb 15 23:32:03 2012 From: python-checkins at python.org (sandro.tosi) Date: Wed, 15 Feb 2012 23:32:03 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_3=2E2_-=3E_default=29?= =?utf8?q?=3A_Issue_=2311836=3A_document_and_expose_multiprocessing=2ESimp?= =?utf8?q?leQueue?= Message-ID: http://hg.python.org/cpython/rev/bf536b46d7f2 changeset: 74970:bf536b46d7f2 parent: 74966:e9d01c5c92ed parent: 74969:fe5eb6d35025 user: Sandro Tosi date: Wed Feb 15 23:27:00 2012 +0100 summary: Issue #11836: document and expose multiprocessing.SimpleQueue files: Doc/library/multiprocessing.rst | 19 ++++++++++++++++++- Lib/multiprocessing/__init__.py | 9 ++++++++- 2 files changed, 26 insertions(+), 2 deletions(-) diff --git a/Doc/library/multiprocessing.rst b/Doc/library/multiprocessing.rst --- a/Doc/library/multiprocessing.rst +++ b/Doc/library/multiprocessing.rst @@ -483,7 +483,7 @@ 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` 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 @@ -629,6 +629,23 @@ exits -- see :meth:`join_thread`. +.. class:: SimpleQueue() + + It is a simplified :class:`Queue` type, very close to a locked :class:`Pipe`. + + .. method:: empty() + + Return ``True`` if the queue is empty, ``False`` otherwise. + + .. method:: get() + + Remove and return an item from the queue. + + .. method:: put(item) + + Put *item* into the queue. + + .. class:: JoinableQueue([maxsize]) :class:`JoinableQueue`, a :class:`Queue` subclass, is a queue which diff --git a/Lib/multiprocessing/__init__.py b/Lib/multiprocessing/__init__.py --- a/Lib/multiprocessing/__init__.py +++ b/Lib/multiprocessing/__init__.py @@ -48,7 +48,7 @@ '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', + 'Event', 'Queue', 'SimpleQueue', 'JoinableQueue', 'Pool', 'Value', 'Array', 'RawValue', 'RawArray', 'SUBDEBUG', 'SUBWARNING', ] @@ -223,6 +223,13 @@ 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 -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Feb 15 23:44:39 2012 From: python-checkins at python.org (victor.stinner) Date: Wed, 15 Feb 2012 23:44:39 +0100 Subject: [Python-checkins] =?utf8?b?Y3B5dGhvbiAoMy4yKTogSXNzdWUgIzEzOTEz?= =?utf8?q?=3A_Another_fix_test=5Fpep3120_for_the_UTF-8_codec_name?= Message-ID: http://hg.python.org/cpython/rev/824ddf6a30f2 changeset: 74971:824ddf6a30f2 branch: 3.2 parent: 74969:fe5eb6d35025 user: Victor Stinner date: Wed Feb 15 23:44:03 2012 +0100 summary: Issue #13913: Another fix test_pep3120 for the UTF-8 codec name files: Lib/test/test_pep3120.py | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Lib/test/test_pep3120.py b/Lib/test/test_pep3120.py --- a/Lib/test/test_pep3120.py +++ b/Lib/test/test_pep3120.py @@ -19,8 +19,8 @@ try: import test.badsyntax_pep3120 except SyntaxError as msg: - msg = str(msg) - self.assertTrue('Non-UTF-8 code starting with' in msg) + msg = str(msg).lower() + self.assertTrue('utf-8' in msg) else: self.fail("expected exception didn't occur") -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Feb 15 23:44:40 2012 From: python-checkins at python.org (victor.stinner) Date: Wed, 15 Feb 2012 23:44:40 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_3=2E2_-=3E_default=29?= =?utf8?q?=3A_=28Merge_3=2E2=29_Issue_=2313913=3A_Another_fix_test=5Fpep31?= =?utf8?q?20_for_the_UTF-8_codec_name?= Message-ID: http://hg.python.org/cpython/rev/2cfba214c243 changeset: 74972:2cfba214c243 parent: 74970:bf536b46d7f2 parent: 74971:824ddf6a30f2 user: Victor Stinner date: Wed Feb 15 23:45:34 2012 +0100 summary: (Merge 3.2) Issue #13913: Another fix test_pep3120 for the UTF-8 codec name files: Lib/test/test_pep3120.py | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Lib/test/test_pep3120.py b/Lib/test/test_pep3120.py --- a/Lib/test/test_pep3120.py +++ b/Lib/test/test_pep3120.py @@ -19,8 +19,8 @@ try: import test.badsyntax_pep3120 except SyntaxError as msg: - msg = str(msg) - self.assertTrue('Non-UTF-8 code starting with' in msg) + msg = str(msg).lower() + self.assertTrue('utf-8' in msg) else: self.fail("expected exception didn't occur") -- Repository URL: http://hg.python.org/cpython From solipsis at pitrou.net Thu Feb 16 05:31:58 2012 From: solipsis at pitrou.net (solipsis at pitrou.net) Date: Thu, 16 Feb 2012 05:31:58 +0100 Subject: [Python-checkins] Daily reference leaks (2cfba214c243): sum=0 Message-ID: results for 2cfba214c243 on branch "default" -------------------------------------------- Command line was: ['./python', '-m', 'test.regrtest', '-uall', '-R', '3:3:/home/antoine/cpython/refleaks/reflogBZJDzn', '-x'] From python-checkins at python.org Thu Feb 16 05:53:17 2012 From: python-checkins at python.org (eli.bendersky) Date: Thu, 16 Feb 2012 05:53:17 +0100 Subject: [Python-checkins] =?utf8?q?cpython=3A_in_the_tests_of_ElementTree?= =?utf8?q?=2C_verify_that_the_C_accelerator_is_imported_or_not?= Message-ID: http://hg.python.org/cpython/rev/ce0e8d238157 changeset: 74973:ce0e8d238157 user: Eli Bendersky date: Thu Feb 16 06:52:39 2012 +0200 summary: in the tests of ElementTree, verify that the C accelerator is imported or not imported as expected files: Lib/test/test_xml_etree.py | 10 ++++++++++ Lib/test/test_xml_etree_c.py | 12 +++++++++++- 2 files changed, 21 insertions(+), 1 deletions(-) diff --git a/Lib/test/test_xml_etree.py b/Lib/test/test_xml_etree.py --- a/Lib/test/test_xml_etree.py +++ b/Lib/test/test_xml_etree.py @@ -1904,12 +1904,22 @@ self.checkwarnings.__exit__(*args) +class TestAcceleratorNotImported(unittest.TestCase): + # Test that the C accelerator was not imported for pyET + def test_correct_import_pyET(self): + # In the C accelerator, Element is just a factory function, not an + # actual class. In the Python version it's a class. + self.assertIsInstance(pyET.Element, type) + + def test_main(module=pyET): from test import test_xml_etree # The same doctests are used for both the Python and the C implementations test_xml_etree.ET = module + support.run_unittest(TestAcceleratorNotImported) + # XXX the C module should give the same warnings as the Python module with CleanContext(quiet=(module is not pyET)): support.run_doctest(test_xml_etree, verbosity=True) diff --git a/Lib/test/test_xml_etree_c.py b/Lib/test/test_xml_etree_c.py --- a/Lib/test/test_xml_etree_c.py +++ b/Lib/test/test_xml_etree_c.py @@ -46,6 +46,16 @@ finally: data = None +class TestAcceleratorImported(unittest.TestCase): + # Test that the C accelerator was imported, as expected + def test_correct_import_cET(self): + # In the C accelerator, Element is just a factory function, not an + # actual class. In the Python version it's a class. + self.assertNotIsInstance(cET.Element, type) + + def test_correct_import_cET_alias(self): + self.assertNotIsInstance(cET_alias.Element, type) + def test_main(): from test import test_xml_etree, test_xml_etree_c @@ -53,7 +63,7 @@ # Run the tests specific to the C implementation support.run_doctest(test_xml_etree_c, verbosity=True) - support.run_unittest(MiscTests) + support.run_unittest(MiscTests, TestAcceleratorImported) # Run the same test suite as the Python module test_xml_etree.test_main(module=cET) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Feb 16 09:37:38 2012 From: python-checkins at python.org (martin.v.loewis) Date: Thu, 16 Feb 2012 09:37:38 +0100 Subject: [Python-checkins] =?utf8?q?peps=3A_Dummy_commit_to_check_PEP_buil?= =?utf8?q?d_process=2E?= Message-ID: http://hg.python.org/peps/rev/706c7a7401c6 changeset: 4054:706c7a7401c6 user: Martin v. L?wis date: Thu Feb 16 09:37:35 2012 +0100 summary: Dummy commit to check PEP build process. files: pep-0394.txt | 1 + 1 files changed, 1 insertions(+), 0 deletions(-) diff --git a/pep-0394.txt b/pep-0394.txt --- a/pep-0394.txt +++ b/pep-0394.txt @@ -204,3 +204,4 @@ Copyright =========== This document has been placed in the public domain. + -- Repository URL: http://hg.python.org/peps From python-checkins at python.org Thu Feb 16 09:40:37 2012 From: python-checkins at python.org (gregory.p.smith) Date: Thu, 16 Feb 2012 09:40:37 +0100 Subject: [Python-checkins] =?utf8?b?Y3B5dGhvbiAoMy4yKTogSXNzdWUgIzI0ODk6?= =?utf8?q?_Fix_bug_in_=5Fcopy_loop_that_could_consume_100=25_cpu_on_EOF=2E?= Message-ID: http://hg.python.org/cpython/rev/994659efa292 changeset: 74974:994659efa292 branch: 3.2 parent: 74971:824ddf6a30f2 user: Gregory P. Smith date: Thu Feb 16 00:29:12 2012 -0800 summary: Issue #2489: Fix bug in _copy loop that could consume 100% cpu on EOF. files: Lib/pty.py | 16 +++- Lib/test/test_pty.py | 91 +++++++++++++++++++++++++++++++- 2 files changed, 101 insertions(+), 6 deletions(-) diff --git a/Lib/pty.py b/Lib/pty.py --- a/Lib/pty.py +++ b/Lib/pty.py @@ -142,15 +142,21 @@ Copies pty master -> standard output (master_read) standard input -> pty master (stdin_read)""" - while 1: - rfds, wfds, xfds = select( - [master_fd, STDIN_FILENO], [], []) + fds = [master_fd, STDIN_FILENO] + while True: + rfds, wfds, xfds = select(fds, [], []) if master_fd in rfds: data = master_read(master_fd) - os.write(STDOUT_FILENO, data) + if not data: # Reached EOF. + fds.remove(master_fd) + else: + os.write(STDOUT_FILENO, data) if STDIN_FILENO in rfds: data = stdin_read(STDIN_FILENO) - _writen(master_fd, data) + if not data: + fds.remove(STDIN_FILENO) + else: + _writen(master_fd, data) def spawn(argv, master_read=_read, stdin_read=_read): """Create a spawned process.""" diff --git a/Lib/test/test_pty.py b/Lib/test/test_pty.py --- a/Lib/test/test_pty.py +++ b/Lib/test/test_pty.py @@ -8,7 +8,9 @@ import pty import os import sys +import select import signal +import socket import unittest TEST_STRING_1 = b"I wish to buy a fish license.\n" @@ -194,9 +196,96 @@ # pty.fork() passed. + +class SmallPtyTests(unittest.TestCase): + """These tests don't spawn children or hang.""" + + def setUp(self): + self.orig_stdin_fileno = pty.STDIN_FILENO + self.orig_stdout_fileno = pty.STDOUT_FILENO + self.orig_pty_select = pty.select + self.fds = [] # A list of file descriptors to close. + self.select_rfds_lengths = [] + self.select_rfds_results = [] + + def tearDown(self): + pty.STDIN_FILENO = self.orig_stdin_fileno + pty.STDOUT_FILENO = self.orig_stdout_fileno + pty.select = self.orig_pty_select + for fd in self.fds: + try: + os.close(fd) + except: + pass + + def _pipe(self): + pipe_fds = os.pipe() + self.fds.extend(pipe_fds) + return pipe_fds + + 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)) + return self.select_rfds_results.pop(0), [], [] + + def test__copy_to_each(self): + """Test the normal data case on both master_fd and stdin.""" + read_from_stdout_fd, mock_stdout_fd = self._pipe() + pty.STDOUT_FILENO = mock_stdout_fd + mock_stdin_fd, write_to_stdin_fd = self._pipe() + pty.STDIN_FILENO = mock_stdin_fd + socketpair = socket.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') + os.write(write_to_stdin_fd, b'from stdin') + + # Expect two select calls, the last one will cause IndexError + pty.select = self._mock_select + self.select_rfds_lengths.append(2) + self.select_rfds_results.append([mock_stdin_fd, masters[0]]) + self.select_rfds_lengths.append(2) + + with self.assertRaises(IndexError): + pty._copy(masters[0]) + + # Test that the right data went to the right places. + rfds = select.select([read_from_stdout_fd, masters[1]], [], [], 0)[0] + self.assertSameElements([read_from_stdout_fd, masters[1]], rfds) + self.assertEqual(os.read(read_from_stdout_fd, 20), b'from master') + self.assertEqual(os.read(masters[1], 20), b'from stdin') + + def test__copy_eof_on_all(self): + """Test the empty read EOF case on both master_fd and stdin.""" + read_from_stdout_fd, mock_stdout_fd = self._pipe() + pty.STDOUT_FILENO = mock_stdout_fd + mock_stdin_fd, write_to_stdin_fd = self._pipe() + pty.STDIN_FILENO = mock_stdin_fd + socketpair = socket.socketpair() + masters = [s.fileno() for s in socketpair] + self.fds.extend(masters) + + os.close(masters[1]) + socketpair[1].close() + os.close(write_to_stdin_fd) + + # Expect two select calls, the last one will cause IndexError + pty.select = self._mock_select + self.select_rfds_lengths.append(2) + self.select_rfds_results.append([mock_stdin_fd, masters[0]]) + # We expect that both fds were removed from the fds list as they + # both encountered an EOF before the second select call. + self.select_rfds_lengths.append(0) + + with self.assertRaises(IndexError): + pty._copy(masters[0]) + + def test_main(verbose=None): try: - run_unittest(PtyTest) + run_unittest(SmallPtyTests, PtyTest) finally: reap_children() -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Feb 16 09:40:40 2012 From: python-checkins at python.org (gregory.p.smith) Date: Thu, 16 Feb 2012 09:40:40 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=283=2E2=29=3A_NEWS_entry_for_?= =?utf8?q?previous_commit=2E?= Message-ID: http://hg.python.org/cpython/rev/72c8b54c1050 changeset: 74975:72c8b54c1050 branch: 3.2 user: Gregory P. Smith date: Thu Feb 16 00:30:50 2012 -0800 summary: NEWS entry for previous commit. files: Misc/NEWS | 2 ++ 1 files changed, 2 insertions(+), 0 deletions(-) diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -116,6 +116,8 @@ Library ------- +- 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__. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Feb 16 09:40:45 2012 From: python-checkins at python.org (gregory.p.smith) Date: Thu, 16 Feb 2012 09:40:45 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=283=2E2=29=3A_don=27t_use_ass?= =?utf8?q?ertSameElements=2E?= Message-ID: http://hg.python.org/cpython/rev/7a73f6d55d5c changeset: 74976:7a73f6d55d5c branch: 3.2 user: Gregory P. Smith date: Thu Feb 16 00:34:12 2012 -0800 summary: don't use assertSameElements. files: Lib/test/test_pty.py | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Lib/test/test_pty.py b/Lib/test/test_pty.py --- a/Lib/test/test_pty.py +++ b/Lib/test/test_pty.py @@ -253,7 +253,7 @@ # Test that the right data went to the right places. rfds = select.select([read_from_stdout_fd, masters[1]], [], [], 0)[0] - self.assertSameElements([read_from_stdout_fd, masters[1]], rfds) + self.assertEqual([read_from_stdout_fd, masters[1]], rfds) self.assertEqual(os.read(read_from_stdout_fd, 20), b'from master') self.assertEqual(os.read(masters[1], 20), b'from stdin') -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Feb 16 09:40:45 2012 From: python-checkins at python.org (gregory.p.smith) Date: Thu, 16 Feb 2012 09:40:45 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_3=2E2_-=3E_default=29?= =?utf8?q?=3A_Issue_=232489=3A_Fix_bug_in_=5Fcopy_loop_that_could_consume_?= =?utf8?q?100=25_cpu_on_EOF=2E?= Message-ID: http://hg.python.org/cpython/rev/c7338f62f956 changeset: 74977:c7338f62f956 parent: 74973:ce0e8d238157 parent: 74975:72c8b54c1050 user: Gregory P. Smith date: Thu Feb 16 00:35:43 2012 -0800 summary: Issue #2489: Fix bug in _copy loop that could consume 100% cpu on EOF. files: Lib/pty.py | 16 +++- Lib/test/test_pty.py | 91 +++++++++++++++++++++++++++++++- Misc/NEWS | 2 + 3 files changed, 103 insertions(+), 6 deletions(-) diff --git a/Lib/pty.py b/Lib/pty.py --- a/Lib/pty.py +++ b/Lib/pty.py @@ -142,15 +142,21 @@ Copies pty master -> standard output (master_read) standard input -> pty master (stdin_read)""" - while 1: - rfds, wfds, xfds = select( - [master_fd, STDIN_FILENO], [], []) + fds = [master_fd, STDIN_FILENO] + while True: + rfds, wfds, xfds = select(fds, [], []) if master_fd in rfds: data = master_read(master_fd) - os.write(STDOUT_FILENO, data) + if not data: # Reached EOF. + fds.remove(master_fd) + else: + os.write(STDOUT_FILENO, data) if STDIN_FILENO in rfds: data = stdin_read(STDIN_FILENO) - _writen(master_fd, data) + if not data: + fds.remove(STDIN_FILENO) + else: + _writen(master_fd, data) def spawn(argv, master_read=_read, stdin_read=_read): """Create a spawned process.""" diff --git a/Lib/test/test_pty.py b/Lib/test/test_pty.py --- a/Lib/test/test_pty.py +++ b/Lib/test/test_pty.py @@ -8,7 +8,9 @@ import pty import os import sys +import select import signal +import socket import unittest TEST_STRING_1 = b"I wish to buy a fish license.\n" @@ -194,9 +196,96 @@ # pty.fork() passed. + +class SmallPtyTests(unittest.TestCase): + """These tests don't spawn children or hang.""" + + def setUp(self): + self.orig_stdin_fileno = pty.STDIN_FILENO + self.orig_stdout_fileno = pty.STDOUT_FILENO + self.orig_pty_select = pty.select + self.fds = [] # A list of file descriptors to close. + self.select_rfds_lengths = [] + self.select_rfds_results = [] + + def tearDown(self): + pty.STDIN_FILENO = self.orig_stdin_fileno + pty.STDOUT_FILENO = self.orig_stdout_fileno + pty.select = self.orig_pty_select + for fd in self.fds: + try: + os.close(fd) + except: + pass + + def _pipe(self): + pipe_fds = os.pipe() + self.fds.extend(pipe_fds) + return pipe_fds + + 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)) + return self.select_rfds_results.pop(0), [], [] + + def test__copy_to_each(self): + """Test the normal data case on both master_fd and stdin.""" + read_from_stdout_fd, mock_stdout_fd = self._pipe() + pty.STDOUT_FILENO = mock_stdout_fd + mock_stdin_fd, write_to_stdin_fd = self._pipe() + pty.STDIN_FILENO = mock_stdin_fd + socketpair = socket.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') + os.write(write_to_stdin_fd, b'from stdin') + + # Expect two select calls, the last one will cause IndexError + pty.select = self._mock_select + self.select_rfds_lengths.append(2) + self.select_rfds_results.append([mock_stdin_fd, masters[0]]) + self.select_rfds_lengths.append(2) + + with self.assertRaises(IndexError): + pty._copy(masters[0]) + + # Test that the right data went to the right places. + rfds = select.select([read_from_stdout_fd, masters[1]], [], [], 0)[0] + self.assertEqual([read_from_stdout_fd, masters[1]], rfds) + self.assertEqual(os.read(read_from_stdout_fd, 20), b'from master') + self.assertEqual(os.read(masters[1], 20), b'from stdin') + + def test__copy_eof_on_all(self): + """Test the empty read EOF case on both master_fd and stdin.""" + read_from_stdout_fd, mock_stdout_fd = self._pipe() + pty.STDOUT_FILENO = mock_stdout_fd + mock_stdin_fd, write_to_stdin_fd = self._pipe() + pty.STDIN_FILENO = mock_stdin_fd + socketpair = socket.socketpair() + masters = [s.fileno() for s in socketpair] + self.fds.extend(masters) + + os.close(masters[1]) + socketpair[1].close() + os.close(write_to_stdin_fd) + + # Expect two select calls, the last one will cause IndexError + pty.select = self._mock_select + self.select_rfds_lengths.append(2) + self.select_rfds_results.append([mock_stdin_fd, masters[0]]) + # We expect that both fds were removed from the fds list as they + # both encountered an EOF before the second select call. + self.select_rfds_lengths.append(0) + + with self.assertRaises(IndexError): + pty._copy(masters[0]) + + def test_main(verbose=None): try: - run_unittest(PtyTest) + run_unittest(SmallPtyTests, PtyTest) finally: reap_children() diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -466,6 +466,8 @@ Library ------- +- Issue #2489: pty.spawn could consume 100% cpu when it encountered an EOF. + - Issue #13014: Fix a possible reference leak in SSLSocket.getpeercert(). - Issue #13777: Add PF_SYSTEM sockets on OS X. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Feb 16 09:40:47 2012 From: python-checkins at python.org (gregory.p.smith) Date: Thu, 16 Feb 2012 09:40:47 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_3=2E2_-=3E_default=29?= =?utf8?q?=3A_merge=2E?= Message-ID: http://hg.python.org/cpython/rev/76f8d824eb84 changeset: 74978:76f8d824eb84 parent: 74977:c7338f62f956 parent: 74976:7a73f6d55d5c user: Gregory P. Smith date: Thu Feb 16 00:36:04 2012 -0800 summary: merge. files: -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Feb 16 09:40:49 2012 From: python-checkins at python.org (gregory.p.smith) Date: Thu, 16 Feb 2012 09:40:49 +0100 Subject: [Python-checkins] =?utf8?b?Y3B5dGhvbiAoMi43KTogSXNzdWUgIzI0ODk6?= =?utf8?q?_Fix_bug_in_=5Fcopy_loop_that_could_consume_100=25_cpu_on_EOF=2E?= Message-ID: http://hg.python.org/cpython/rev/f889458c65cc changeset: 74979:f889458c65cc branch: 2.7 parent: 74968:3b127a415643 user: Gregory P. Smith date: Thu Feb 16 00:40:03 2012 -0800 summary: Issue #2489: Fix bug in _copy loop that could consume 100% cpu on EOF. files: Lib/pty.py | 16 +++- Lib/test/test_pty.py | 91 +++++++++++++++++++++++++++++++- 2 files changed, 101 insertions(+), 6 deletions(-) diff --git a/Lib/pty.py b/Lib/pty.py --- a/Lib/pty.py +++ b/Lib/pty.py @@ -142,15 +142,21 @@ Copies pty master -> standard output (master_read) standard input -> pty master (stdin_read)""" - while 1: - rfds, wfds, xfds = select( - [master_fd, STDIN_FILENO], [], []) + fds = [master_fd, STDIN_FILENO] + while True: + rfds, wfds, xfds = select(fds, [], []) if master_fd in rfds: data = master_read(master_fd) - os.write(STDOUT_FILENO, data) + if not data: # Reached EOF. + fds.remove(master_fd) + else: + os.write(STDOUT_FILENO, data) if STDIN_FILENO in rfds: data = stdin_read(STDIN_FILENO) - _writen(master_fd, data) + if not data: + fds.remove(STDIN_FILENO) + else: + _writen(master_fd, data) def spawn(argv, master_read=_read, stdin_read=_read): """Create a spawned process.""" diff --git a/Lib/test/test_pty.py b/Lib/test/test_pty.py --- a/Lib/test/test_pty.py +++ b/Lib/test/test_pty.py @@ -8,7 +8,9 @@ import pty import os import sys +import select import signal +import socket import unittest TEST_STRING_1 = "I wish to buy a fish license.\n" @@ -193,8 +195,95 @@ # pty.fork() passed. + +class SmallPtyTests(unittest.TestCase): + """These tests don't spawn children or hang.""" + + def setUp(self): + self.orig_stdin_fileno = pty.STDIN_FILENO + self.orig_stdout_fileno = pty.STDOUT_FILENO + self.orig_pty_select = pty.select + self.fds = [] # A list of file descriptors to close. + self.select_rfds_lengths = [] + self.select_rfds_results = [] + + def tearDown(self): + pty.STDIN_FILENO = self.orig_stdin_fileno + pty.STDOUT_FILENO = self.orig_stdout_fileno + pty.select = self.orig_pty_select + for fd in self.fds: + try: + os.close(fd) + except: + pass + + def _pipe(self): + pipe_fds = os.pipe() + self.fds.extend(pipe_fds) + return pipe_fds + + 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)) + return self.select_rfds_results.pop(0), [], [] + + def test__copy_to_each(self): + """Test the normal data case on both master_fd and stdin.""" + read_from_stdout_fd, mock_stdout_fd = self._pipe() + pty.STDOUT_FILENO = mock_stdout_fd + mock_stdin_fd, write_to_stdin_fd = self._pipe() + pty.STDIN_FILENO = mock_stdin_fd + socketpair = socket.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') + os.write(write_to_stdin_fd, b'from stdin') + + # Expect two select calls, the last one will cause IndexError + pty.select = self._mock_select + self.select_rfds_lengths.append(2) + self.select_rfds_results.append([mock_stdin_fd, masters[0]]) + self.select_rfds_lengths.append(2) + + with self.assertRaises(IndexError): + pty._copy(masters[0]) + + # Test that the right data went to the right places. + rfds = select.select([read_from_stdout_fd, masters[1]], [], [], 0)[0] + self.assertEqual([read_from_stdout_fd, masters[1]], rfds) + self.assertEqual(os.read(read_from_stdout_fd, 20), b'from master') + self.assertEqual(os.read(masters[1], 20), b'from stdin') + + def test__copy_eof_on_all(self): + """Test the empty read EOF case on both master_fd and stdin.""" + read_from_stdout_fd, mock_stdout_fd = self._pipe() + pty.STDOUT_FILENO = mock_stdout_fd + mock_stdin_fd, write_to_stdin_fd = self._pipe() + pty.STDIN_FILENO = mock_stdin_fd + socketpair = socket.socketpair() + masters = [s.fileno() for s in socketpair] + self.fds.extend(masters) + + os.close(masters[1]) + socketpair[1].close() + os.close(write_to_stdin_fd) + + # Expect two select calls, the last one will cause IndexError + pty.select = self._mock_select + self.select_rfds_lengths.append(2) + self.select_rfds_results.append([mock_stdin_fd, masters[0]]) + # We expect that both fds were removed from the fds list as they + # both encountered an EOF before the second select call. + self.select_rfds_lengths.append(0) + + with self.assertRaises(IndexError): + pty._copy(masters[0]) + + def test_main(verbose=None): - run_unittest(PtyTest) + run_unittest(SmallPtyTests, PtyTest) if __name__ == "__main__": test_main() -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Feb 16 09:45:34 2012 From: python-checkins at python.org (gregory.p.smith) Date: Thu, 16 Feb 2012 09:45:34 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=282=2E7=29=3A_news_entry_for_?= =?utf8?q?previous_commit?= Message-ID: http://hg.python.org/cpython/rev/d2b08b5896d9 changeset: 74980:d2b08b5896d9 branch: 2.7 user: Gregory P. Smith date: Thu Feb 16 00:44:50 2012 -0800 summary: news entry for previous commit files: Misc/NEWS | 2 ++ 1 files changed, 2 insertions(+), 0 deletions(-) diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -93,6 +93,8 @@ Library ------- +- Issue #2489: pty.spawn could consume 100% cpu when it encountered an EOF. + - Issue #13014: Fix a possible reference leak in SSLSocket.getpeercert(). - Issue #13987: HTMLParser is now able to handle EOFs in the middle of a -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Feb 16 09:47:54 2012 From: python-checkins at python.org (martin.v.loewis) Date: Thu, 16 Feb 2012 09:47:54 +0100 Subject: [Python-checkins] =?utf8?q?peps=3A_Fix_typo?= Message-ID: http://hg.python.org/peps/rev/7b11a76ae9c5 changeset: 4055:7b11a76ae9c5 user: Martin v. L?wis date: Thu Feb 16 09:47:50 2012 +0100 summary: Fix typo files: pep-0410.txt | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/pep-0410.txt b/pep-0410.txt --- a/pep-0410.txt +++ b/pep-0410.txt @@ -6,7 +6,7 @@ Status: Draft Type: Standards Track Content-Type: text/x-rst -Created: 01-Feburary-2012 +Created: 01-February-2012 Python-Version: 3.3 -- Repository URL: http://hg.python.org/peps From python-checkins at python.org Thu Feb 16 12:43:04 2012 From: python-checkins at python.org (nick.coghlan) Date: Thu, 16 Feb 2012 12:43:04 +0100 Subject: [Python-checkins] =?utf8?q?peps=3A_Update_PEP_394_for_latest_roun?= =?utf8?q?d_of_python-dev_discussions?= Message-ID: http://hg.python.org/peps/rev/a15bca819234 changeset: 4056:a15bca819234 user: Nick Coghlan date: Thu Feb 16 21:37:46 2012 +1000 summary: Update PEP 394 for latest round of python-dev discussions files: pep-0394.txt | 94 +++++++++++++++++++++++++-------------- 1 files changed, 59 insertions(+), 35 deletions(-) diff --git a/pep-0394.txt b/pep-0394.txt --- a/pep-0394.txt +++ b/pep-0394.txt @@ -8,7 +8,7 @@ Type: Informational Content-Type: text/x-rst Created: 02-Mar-2011 -Post-History: 04-Mar-2011, 20-Jul-2011 +Post-History: 04-Mar-2011, 20-Jul-2011, 16-Feb-2012 Abstract @@ -39,7 +39,7 @@ Python as either ``python2`` or ``python3``. * For the time being, it is recommended that ``python`` should refer to ``python2`` (however, some distributions have already chosen otherwise; see - Notes below). + the `Rationale`_ and `Migration Notes`_ below). * The Python 2.x ``idle``, ``pydoc``, and ``python-config`` commands should likewise be available as ``idle2``, ``pydoc2``, and ``python2-config``, with the original commands invoking these versions by default, but possibly @@ -48,7 +48,7 @@ * In order to tolerate differences across platforms, all new code that needs to invoke the Python interpreter should not specify ``python``, but rather should specify either ``python2`` or ``python3`` (or the more specific - ``python2.x`` and ``python3.x`` versions; see the Notes). + ``python2.x`` and ``python3.x`` versions; see the `Migration Notes`_). This distinction should be made in shebangs, when invoking from a shell script, when invoking via the system() call, or when invoking in any other context. @@ -59,17 +59,15 @@ ``sys.executable`` to avoid hardcoded assumptions regarding the interpreter location remains the preferred approach. -These recommendations are the outcome of the relevant python-dev discussion in -March and July 2011 [1][2] (NOTE: More accurately, they will be such once the -"Draft" status disappears from the PEP header, it has been moved into the -"Other Informational PEP" section in PEP 0 and this note has been deleted) +These recommendations are the outcome of the relevant python-dev discussions +in March and July 2011 ([1]_, [2]_) and February 2012 ([4]_). Rationale ========= This is needed as, even though the majority of distributions still alias the -``python`` command to Python 2, some now alias it to Python 3. Some of +``python`` command to Python 2, some now alias it to Python 3 ([5]_). Some of the former also do not provide a ``python2`` command; hence, there is currently no way for Python 2 code (or any code that invokes the Python 2 interpreter directly rather than via ``sys.executable``) to reliably run on @@ -80,8 +78,14 @@ minimal additional work required on the part of distribution maintainers. -Notes -===== +Migration Notes +=============== + +This section does not contain any official recommendations from the core +CPython developers. It's merely a collection of notes regarding various +aspects of migrating to Python 3 as the default version of Python for a +system. They will hopefully be helpful to any distributions considering +making such a change. * Distributions that only include ``python3`` in their base install (i.e. they do not provide ``python2`` by default) along with those that are @@ -107,7 +111,7 @@ rather being provided as a separate binary file. * It is suggested that even distribution-specific packages follow the ``python2``/``python3`` convention, even in code that is not intended to - operate on other distributions. This will prevent problems if the + operate on other distributions. This will reduce problems if the distribution later decides to change the version of the Python interpreter that the ``python`` command invokes, or if a sysadmin installs a custom ``python`` command with a different major version than the distribution @@ -128,8 +132,10 @@ continue to use the ``python3`` convention rather that just ``python``. This will ease transition in the event that yet another major version of Python is released. -* If these conventions are adhered to, it will be the case that the ``python`` - command is only executed in an interactive manner. +* If these conventions are adhered to, it will become the case that the + ``python`` command is only executed in an interactive manner as a user + convenience, or to run scripts that are source compatible with both Python + 2 and Python 3. Backwards Compatibility @@ -147,25 +153,38 @@ Application to the CPython Reference Interpreter ================================================ -While technically a new feature, the ``make install`` command in the 2.7 -version of CPython will be adjusted to create the ``python2.7``, ``idle2.7``, -``pydoc2.7``, and ``python2.7-config`` binaries, with ``python2``, ``idle2``, -``pydoc2``, and ``python2-config`` as hard links to the respective binaries, -and ``python``, ``idle``, ``pydoc``, and ``python-config`` as symbolic links -to the respective hard links. This feature will first appear in CPython -2.7.3. +While technically a new feature, the ``make install`` and ``make bininstall`` +command in the 2.7 version of CPython will be adjusted to create the +following chains of symbolic links in the relevant ``bin`` directory (the +final item listed in the chain is the actual installed binary, preceding +items are relative symbolic links):: -The ``make install`` command in the CPython 3.x series will similarly install -the ``python3.x``, ``idle3.x``, ``pydoc3.x``, and ``python3.x-config`` -binaries (with appropriate ``x``), and ``python3``, ``idle3``, ``pydoc3``, -and ``python3-config`` as hard links. This feature will first appear in -CPython 3.3. + python -> python2 -> python2.7 + python-config -> python2-config -> python2.7-config Similar adjustments will be made to the Mac OS X binary installer. -As implementation of these features in the default installers does not alter -the recommendations in this PEP, the implementation progress is managed on the -tracker as issue #12627 [3]. +This feature will first appear in the default installation process in +CPython 2.7.3. + +The installation commands in the CPython 3.x series already create the +appropriate symlinks. For example, CPython 3.2 creates:: + + python3 -> python3.2 + idle3 -> idle3.2 + pydoc3 -> pydoc3.2 + python3-config -> python3.2-config + +And CPython 3.3 will create:: + + python3 -> python3.3 + idle3 -> idle3.3 + pydoc3 -> pydoc3.3 + python3-config -> python3.3-config + pysetup3 -> pysetup3.3 + +The implementation progress of these features in the default installers is +managed on the tracker as issue #12627 ([3]_). Impact on PYTHON* Environment Variables @@ -192,16 +211,21 @@ References ========== -[1] Support the /usr/bin/python2 symlink upstream (with bonus grammar class!) - (http://mail.python.org/pipermail/python-dev/2011-March/108491.html) +.. [1] Support the /usr/bin/python2 symlink upstream (with bonus grammar class!) + (http://mail.python.org/pipermail/python-dev/2011-March/108491.html) -[2] Rebooting PEP 394 (aka Support the /usr/bin/python2 symlink upstream) - (http://mail.python.org/pipermail/python-dev/2011-July/112322.html) +.. [2] Rebooting \PEP 394 (aka Support the /usr/bin/python2 symlink upstream) + (http://mail.python.org/pipermail/python-dev/2011-July/112322.html) -[3] Implement PEP 394 in the CPython Makefile - (http://bugs.python.org/issue12627) +.. [3] Implement \PEP 394 in the CPython Makefile + (http://bugs.python.org/issue12627) + +.. [4] \PEP 394 request for pronouncement (python2 symlink in \*nix systems) + (http://mail.python.org/pipermail/python-dev/2012-February/116435.html) + +.. [5] Arch Linux announcement that their "python" link now refers Python 3 + (https://www.archlinux.org/news/python-is-now-python-3/) Copyright =========== This document has been placed in the public domain. - -- Repository URL: http://hg.python.org/peps From python-checkins at python.org Thu Feb 16 12:46:45 2012 From: python-checkins at python.org (nick.coghlan) Date: Thu, 16 Feb 2012 12:46:45 +0100 Subject: [Python-checkins] =?utf8?q?peps=3A_Drop_a_suggestion_from_PEP_394?= =?utf8?q?=27s_migration_notes_that=27s_a_really_bad_idea_in_a?= Message-ID: http://hg.python.org/peps/rev/3e67accc3c04 changeset: 4057:3e67accc3c04 user: Nick Coghlan date: Thu Feb 16 21:46:35 2012 +1000 summary: Drop a suggestion from PEP 394's migration notes that's a really bad idea in a world containing scripts that are source compatible with both Python 2 and 3 files: pep-0394.txt | 4 ---- 1 files changed, 0 insertions(+), 4 deletions(-) diff --git a/pep-0394.txt b/pep-0394.txt --- a/pep-0394.txt +++ b/pep-0394.txt @@ -124,10 +124,6 @@ versa. That way, if a sysadmin does decide to replace the installed ``python`` file, they can do so without inadvertently deleting the previously installed binary. -* As an alternative to the recommendation presented above, some distributions - may choose to leave the ``python`` command itself undefined, leaving - sysadmins and users with the responsibility to choose their own preferred - version to be made available as the ``python`` command. * If the Python 2 interpreter becomes uncommon, scripts should nevertheless continue to use the ``python3`` convention rather that just ``python``. This will ease transition in the event that yet another major version of Python -- Repository URL: http://hg.python.org/peps From python-checkins at python.org Thu Feb 16 13:05:01 2012 From: python-checkins at python.org (martin.v.loewis) Date: Thu, 16 Feb 2012 13:05:01 +0100 Subject: [Python-checkins] =?utf8?q?peps=3A_Copy_PEP_text_from_revision_6c?= =?utf8?q?4d5d9dfc6d=2E?= Message-ID: http://hg.python.org/peps/rev/a54dd98146f7 changeset: 4058:a54dd98146f7 user: Martin v. Loewis date: Thu Feb 16 13:04:56 2012 +0100 summary: Copy PEP text from revision 6c4d5d9dfc6d. files: pep-0412.txt | 162 +++++++++++++++++++++++++++++++++++++++ 1 files changed, 162 insertions(+), 0 deletions(-) diff --git a/pep-0412.txt b/pep-0412.txt new file mode 100644 --- /dev/null +++ b/pep-0412.txt @@ -0,0 +1,162 @@ +PEP: 412 +Title: Key-Sharing Dictionary +Version: $Revision$ +Last-Modified: $Date$ +Author: Mark Shannon +Status: Draft +Type: Standards Track +Content-Type: text/x-rst +Created: 08-Feb-2012 +Python-Version: 3.3 or 3.4 +Post-History: 08-Feb-2012 + + +Abstract +======== + +This PEP proposes a change in the implementation of the builtin dictionary +type ``dict``. The new implementation allows dictionaries which are used as +attribute dictionaries (the ``__dict__`` attribute of an object) to share +keys with other attribute dictionaries of instances of the same class. + +Motivation +========== + +The current dictionary implementation uses more memory than is necessary +when used as a container for object attributes as the keys are +replicated for each instance rather than being shared across many instances +of the same class. +Despite this, the current dictionary implementation is finely tuned and +performs very well as a general-purpose mapping object. + +By separating the keys (and hashes) from the values it is possible to share +the keys between multiple dictionaries and improve memory use. +By ensuring that keys are separated from the values only when beneficial, +it is possible to retain the high-performance of the current dictionary +implementation when used as a general-purpose mapping object. + +Behaviour +========= + +The new dictionary behaves in the same way as the old implementation. +It fully conforms to the Python API, the C API and the ABI. + +Performance +=========== + +Memory Usage +------------ + +Reduction in memory use is directly related to the number of dictionaries +with shared keys in existence at any time. These dictionaries are typically +half the size of the current dictionary implementation. + +Benchmarking shows that memory use is reduced by 10% to 20% for +object-oriented programs with no significant change in memory use +for other programs. + +Speed +----- + +The performance of the new implementation is dominated by memory locality +effects. When keys are not shared (for example in module dictionaries +and dictionary explicitly created by dict() or {} ) then performance is +unchanged (within a percent or two) from the current implementation. + +For the shared keys case, the new implementation tends to separate keys +from values, but reduces total memory usage. This will improve performance +in many cases as the effects of reduced memory usage outweigh the loss of +locality, but some programs may show a small slow down. + +Benchmarking shows no significant change of speed for most benchmarks. +Object-oriented benchmarks show small speed ups when they create large +numbers of objects of the same class (the gcbench benchmark shows a 10% +speed up; this is likely to be an upper limit). + +Implementation +============== + +Both the old and new dictionaries consist of a fixed-sized dict struct and +a re-sizeable table. +In the new dictionary the table can be further split into a keys table and +values array. +The keys table holds the keys and hashes and (for non-split tables) the +values as well. It differs only from the original implementation in that it +contains a number of fields that were previously in the dict struct. +If a table is split the values in the keys table are ignored, instead the +values are held in a separate array. + +Split-Table dictionaries +------------------------ + +When dictionaries are created to fill the __dict__ slot of an object, they are +created in split form. The keys table is cached in the type, potentially +allowing all attribute dictionaries of instances of one class to share keys. +In the event of the keys of these dictionaries starting to diverge, +individual dictionaries will lazily convert to the combined-table form. +This ensures good memory use in the common case, and correctness in all cases. + +When resizing a split dictionary it is converted to a combined table. +If resizing is as a result of storing an instance attribute, and there is +only instance of a class, then the dictionary will be re-split immediately. +Since most OO code will set attributes in the __init__ method, all attributes +will be set before a second instance is created and no more resizing will be +necessary as all further instance dictionaries will have the correct size. +For more complex use patterns, it is impossible to know what is the best +approach, so the implementation allows extra insertions up to the point +of a resize when it reverts to the combined table (non-shared keys). + +A deletion from a split dictionary does not change the keys table, it simply +removes the value from the values array. + +Combined-Table dictionaries +--------------------------- + +Explicit dictionaries (dict() or {}), module dictionaries and most other +dictionaries are created as combined-table dictionaries. +A combined-table dictionary never becomes a split-table dictionary. +Combined tables are laid out in much the same way as the tables in the old +dictionary, resulting in very similar performance. + +Implementation +============== + +The new dictionary implementation is available at [1]_. + +Pros and Cons +============= + +Pros +---- + +Significant memory savings for object-oriented applications. +Small improvement to speed for programs which create lots of similar objects. + +Cons +---- + +Change to data structures: +Third party modules which meddle with the internals of the dictionary +implementation will break. +Changes to repr() output and iteration order: +For most cases, this will be unchanged. +However for some split-table dictionaries the iteration order will +change. + +Neither of these cons should be a problem. +Modules which meddle with the internals of the dictionary +implementation are already broken and should be fixed to use the API. +The iteration order of dictionaries was never defined and has always been +arbitrary; it is different for Jython and PyPy. + +References +========== + +.. [1] Reference Implementation: + https://bitbucket.org/markshannon/cpython_new_dict + +Copyright +========= + +This document has been placed in the public domain. + -- Repository URL: http://hg.python.org/peps From python-checkins at python.org Thu Feb 16 17:09:24 2012 From: python-checkins at python.org (eli.bendersky) Date: Thu, 16 Feb 2012 17:09:24 +0100 Subject: [Python-checkins] =?utf8?q?cpython=3A_Disabling_a_test_that_fails?= =?utf8?q?_on_some_bots=2E_Will_investigate_the_failure_soon?= Message-ID: http://hg.python.org/cpython/rev/8ab4a9b192a7 changeset: 74981:8ab4a9b192a7 parent: 74978:76f8d824eb84 user: Eli Bendersky date: Thu Feb 16 18:08:44 2012 +0200 summary: Disabling a test that fails on some bots. Will investigate the failure soon files: Lib/test/test_xml_etree_c.py | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Lib/test/test_xml_etree_c.py b/Lib/test/test_xml_etree_c.py --- a/Lib/test/test_xml_etree_c.py +++ b/Lib/test/test_xml_etree_c.py @@ -53,8 +53,8 @@ # actual class. In the Python version it's a class. self.assertNotIsInstance(cET.Element, type) - def test_correct_import_cET_alias(self): - self.assertNotIsInstance(cET_alias.Element, type) + #def test_correct_import_cET_alias(self): + #self.assertNotIsInstance(cET_alias.Element, type) def test_main(): -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Feb 16 18:56:08 2012 From: python-checkins at python.org (eli.bendersky) Date: Thu, 16 Feb 2012 18:56:08 +0100 Subject: [Python-checkins] =?utf8?q?cpython=3A_make_TestAccelerator=5BNot?= =?utf8?q?=5DImported_for_ElementTree_more_robust?= Message-ID: http://hg.python.org/cpython/rev/639bae502336 changeset: 74982:639bae502336 user: Eli Bendersky date: Thu Feb 16 19:55:29 2012 +0200 summary: make TestAccelerator[Not]Imported for ElementTree more robust files: Lib/test/test_xml_etree.py | 4 +--- Lib/test/test_xml_etree_c.py | 8 ++------ 2 files changed, 3 insertions(+), 9 deletions(-) diff --git a/Lib/test/test_xml_etree.py b/Lib/test/test_xml_etree.py --- a/Lib/test/test_xml_etree.py +++ b/Lib/test/test_xml_etree.py @@ -1907,9 +1907,7 @@ class TestAcceleratorNotImported(unittest.TestCase): # Test that the C accelerator was not imported for pyET def test_correct_import_pyET(self): - # In the C accelerator, Element is just a factory function, not an - # actual class. In the Python version it's a class. - self.assertIsInstance(pyET.Element, type) + self.assertEqual(pyET.Element.__module__, 'xml.etree.ElementTree') def test_main(module=pyET): diff --git a/Lib/test/test_xml_etree_c.py b/Lib/test/test_xml_etree_c.py --- a/Lib/test/test_xml_etree_c.py +++ b/Lib/test/test_xml_etree_c.py @@ -46,15 +46,11 @@ finally: data = None + at unittest.skipUnless(cET, 'requires _elementtree') class TestAcceleratorImported(unittest.TestCase): # Test that the C accelerator was imported, as expected def test_correct_import_cET(self): - # In the C accelerator, Element is just a factory function, not an - # actual class. In the Python version it's a class. - self.assertNotIsInstance(cET.Element, type) - - #def test_correct_import_cET_alias(self): - #self.assertNotIsInstance(cET_alias.Element, type) + self.assertEqual(cET.Element.__module__, '_elementtree') def test_main(): -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Feb 16 19:44:39 2012 From: python-checkins at python.org (brett.cannon) Date: Thu, 16 Feb 2012 19:44:39 +0100 Subject: [Python-checkins] =?utf8?q?cpython=3A_Refactor_importlib=2E=5F=5F?= =?utf8?q?import=5F=5F=28=29_and_=5Fgcd=5Fimport=28=29_to_facilitate_using?= Message-ID: http://hg.python.org/cpython/rev/03140936913c changeset: 74983:03140936913c user: Brett Cannon date: Thu Feb 16 13:43:41 2012 -0500 summary: Refactor importlib.__import__() and _gcd_import() to facilitate using an __import__ implementation that takes care of basics in C and punts to importlib for more complicated code. files: Lib/importlib/_bootstrap.py | 201 +++++++++++++++-------- 1 files changed, 130 insertions(+), 71 deletions(-) diff --git a/Lib/importlib/_bootstrap.py b/Lib/importlib/_bootstrap.py --- a/Lib/importlib/_bootstrap.py +++ b/Lib/importlib/_bootstrap.py @@ -861,6 +861,84 @@ imp.release_lock() +def _resolve_name(name, package, level): + """Resolve a relative module name to an absolute one.""" + 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: + return "{0}.{1}".format(package[:dot], name) + else: + return package[:dot] + + +def _find_module(name, path): + """Find a module's loader.""" + 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: + return loader + else: + return sys.modules[name].__loader__ + else: + return None + + +def _set___package__(module): + """Set __package__ on a module.""" + # 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 + + +def _sanity_check(name, package, level): + """Verify arguments are "sane".""" + 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") + + +def _find_search_path(name, import_): + """Find the search path for a module. + + import_ is expected to be a callable which takes the name of a module to + import. It is required to decouple the function from importlib. + + """ + path = None + parent = name.rpartition('.')[0] + if parent: + if parent not in sys.modules: + 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) + return parent, path + + + _IMPLICIT_META_PATH = [BuiltinImporter, FrozenImporter, _DefaultPathFinder] _ERR_MSG = 'No module named {!r}' @@ -874,27 +952,9 @@ 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] + name = _resolve_name(name, package, level) with _ImportLockContext(): try: module = sys.modules[name] @@ -905,70 +965,33 @@ 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: + parent, path = _find_search_path(name, _gcd_import) + loader = _find_module(name, path) + if loader is None: raise ImportError(_ERR_MSG.format(name)) + elif name not in sys.modules: + # The parent import may have already imported this module. + loader.load_module(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. + parent_module = sys.modules[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 + _set___package__(module) return module -def __import__(name, globals={}, locals={}, fromlist=[], level=0): - """Import a module. +def _return_module(module, name, fromlist, level, import_): + """Figure out what __import__ should return. - The 'globals' argument is used to infer where the import is occuring from - to handle relative imports. The 'locals' argument is ignored. The - 'fromlist' argument specifies what should exist as attributes on the module - being imported (e.g. ``from module import ``). The 'level' - argument represents the package location to import from in a relative - import (e.g. ``from ..pkg import mod`` would have a 'level' of 2). + 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. """ - 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 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] - 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 @@ -989,12 +1012,48 @@ 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)) + import_('{0}.{1}'.format(module.__name__, x)) except ImportError: pass 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): + """Import a module. + + The 'globals' argument is used to infer where the import is occuring from + to handle relative imports. The 'locals' argument is ignored. The + 'fromlist' argument specifies what should exist as attributes on the module + being imported (e.g. ``from module import ``). The 'level' + argument represents the package location to import from in a relative + 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 = _calc___package__(globals) + module = _gcd_import(name, package, level) + return _return_module(module, name, fromlist, level, _gcd_import) + + def _setup(sys_module, imp_module): """Setup importlib by importing needed built-in modules and injecting them into the global namespace. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Feb 16 19:55:17 2012 From: python-checkins at python.org (charles-francois.natali) Date: Thu, 16 Feb 2012 19:55:17 +0100 Subject: [Python-checkins] =?utf8?b?Y3B5dGhvbiAoMy4yKTogSXNzdWUgIzEzODc4?= =?utf8?q?=3A_Fix_random_test=5Fsched_failures=2E?= Message-ID: http://hg.python.org/cpython/rev/662c60d26183 changeset: 74984:662c60d26183 branch: 3.2 parent: 74976:7a73f6d55d5c user: Charles-Fran?ois Natali date: Thu Feb 16 19:49:48 2012 +0100 summary: Issue #13878: Fix random test_sched failures. files: Lib/test/test_sched.py | 17 +++++++++-------- 1 files changed, 9 insertions(+), 8 deletions(-) diff --git a/Lib/test/test_sched.py b/Lib/test/test_sched.py --- a/Lib/test/test_sched.py +++ b/Lib/test/test_sched.py @@ -12,10 +12,10 @@ l = [] fun = lambda x: l.append(x) scheduler = sched.scheduler(time.time, time.sleep) - for x in [0.05, 0.04, 0.03, 0.02, 0.01]: + for x in [0.5, 0.4, 0.3, 0.2, 0.1]: z = scheduler.enter(x, 1, fun, (x,)) scheduler.run() - self.assertEqual(l, [0.01, 0.02, 0.03, 0.04, 0.05]) + self.assertEqual(l, [0.1, 0.2, 0.3, 0.4, 0.5]) def test_enterabs(self): l = [] @@ -31,7 +31,7 @@ fun = lambda x: l.append(x) scheduler = sched.scheduler(time.time, time.sleep) for priority in [1, 2, 3, 4, 5]: - z = scheduler.enter(0.01, priority, fun, (priority,)) + z = scheduler.enterabs(0.01, priority, fun, (priority,)) scheduler.run() self.assertEqual(l, [1, 2, 3, 4, 5]) @@ -39,11 +39,12 @@ l = [] fun = lambda x: l.append(x) scheduler = sched.scheduler(time.time, time.sleep) - event1 = scheduler.enter(0.01, 1, fun, (0.01,)) - event2 = scheduler.enter(0.02, 1, fun, (0.02,)) - event3 = scheduler.enter(0.03, 1, fun, (0.03,)) - event4 = scheduler.enter(0.04, 1, fun, (0.04,)) - event5 = scheduler.enter(0.05, 1, fun, (0.05,)) + now = time.time() + event1 = scheduler.enterabs(now + 0.01, 1, fun, (0.01,)) + event2 = scheduler.enterabs(now + 0.02, 1, fun, (0.02,)) + event3 = scheduler.enterabs(now + 0.03, 1, fun, (0.03,)) + event4 = scheduler.enterabs(now + 0.04, 1, fun, (0.04,)) + event5 = scheduler.enterabs(now + 0.05, 1, fun, (0.05,)) scheduler.cancel(event1) scheduler.cancel(event5) scheduler.run() -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Feb 16 19:55:18 2012 From: python-checkins at python.org (charles-francois.natali) Date: Thu, 16 Feb 2012 19:55:18 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_3=2E2_-=3E_default=29?= =?utf8?q?=3A_Issue_=2313878=3A_Fix_random_test=5Fsched_failures=2E?= Message-ID: http://hg.python.org/cpython/rev/e35091b95813 changeset: 74985:e35091b95813 parent: 74982:639bae502336 parent: 74984:662c60d26183 user: Charles-Fran?ois Natali date: Thu Feb 16 19:51:45 2012 +0100 summary: Issue #13878: Fix random test_sched failures. files: Lib/test/test_sched.py | 28 +++++++++++++++------------- 1 files changed, 15 insertions(+), 13 deletions(-) diff --git a/Lib/test/test_sched.py b/Lib/test/test_sched.py --- a/Lib/test/test_sched.py +++ b/Lib/test/test_sched.py @@ -12,10 +12,10 @@ l = [] fun = lambda x: l.append(x) scheduler = sched.scheduler(time.time, time.sleep) - for x in [0.05, 0.04, 0.03, 0.02, 0.01]: + for x in [0.5, 0.4, 0.3, 0.2, 0.1]: z = scheduler.enter(x, 1, fun, (x,)) scheduler.run() - self.assertEqual(l, [0.01, 0.02, 0.03, 0.04, 0.05]) + self.assertEqual(l, [0.1, 0.2, 0.3, 0.4, 0.5]) def test_enterabs(self): l = [] @@ -31,7 +31,7 @@ fun = lambda x: l.append(x) scheduler = sched.scheduler(time.time, time.sleep) for priority in [1, 2, 3, 4, 5]: - z = scheduler.enter(0.01, priority, fun, (priority,)) + z = scheduler.enterabs(0.01, priority, fun, (priority,)) scheduler.run() self.assertEqual(l, [1, 2, 3, 4, 5]) @@ -39,11 +39,12 @@ l = [] fun = lambda x: l.append(x) scheduler = sched.scheduler(time.time, time.sleep) - event1 = scheduler.enter(0.01, 1, fun, (0.01,)) - event2 = scheduler.enter(0.02, 1, fun, (0.02,)) - event3 = scheduler.enter(0.03, 1, fun, (0.03,)) - event4 = scheduler.enter(0.04, 1, fun, (0.04,)) - event5 = scheduler.enter(0.05, 1, fun, (0.05,)) + now = time.time() + event1 = scheduler.enterabs(now + 0.01, 1, fun, (0.01,)) + event2 = scheduler.enterabs(now + 0.02, 1, fun, (0.02,)) + event3 = scheduler.enterabs(now + 0.03, 1, fun, (0.03,)) + event4 = scheduler.enterabs(now + 0.04, 1, fun, (0.04,)) + event5 = scheduler.enterabs(now + 0.05, 1, fun, (0.05,)) scheduler.cancel(event1) scheduler.cancel(event5) scheduler.run() @@ -64,11 +65,12 @@ l = [] fun = lambda x: l.append(x) scheduler = sched.scheduler(time.time, time.sleep) - e5 = scheduler.enter(0.05, 1, fun) - e1 = scheduler.enter(0.01, 1, fun) - e2 = scheduler.enter(0.02, 1, fun) - e4 = scheduler.enter(0.04, 1, fun) - e3 = scheduler.enter(0.03, 1, fun) + 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]) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Feb 16 19:55:19 2012 From: python-checkins at python.org (charles-francois.natali) Date: Thu, 16 Feb 2012 19:55:19 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_default_-=3E_default?= =?utf8?b?KTogTWVyZ2Uu?= Message-ID: http://hg.python.org/cpython/rev/f2ee5d65dcdb changeset: 74986:f2ee5d65dcdb parent: 74985:e35091b95813 parent: 74983:03140936913c user: Charles-Fran?ois Natali date: Thu Feb 16 19:54:48 2012 +0100 summary: Merge. files: Lib/importlib/_bootstrap.py | 201 +++++++++++++++-------- 1 files changed, 130 insertions(+), 71 deletions(-) diff --git a/Lib/importlib/_bootstrap.py b/Lib/importlib/_bootstrap.py --- a/Lib/importlib/_bootstrap.py +++ b/Lib/importlib/_bootstrap.py @@ -861,6 +861,84 @@ imp.release_lock() +def _resolve_name(name, package, level): + """Resolve a relative module name to an absolute one.""" + 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: + return "{0}.{1}".format(package[:dot], name) + else: + return package[:dot] + + +def _find_module(name, path): + """Find a module's loader.""" + 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: + return loader + else: + return sys.modules[name].__loader__ + else: + return None + + +def _set___package__(module): + """Set __package__ on a module.""" + # 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 + + +def _sanity_check(name, package, level): + """Verify arguments are "sane".""" + 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") + + +def _find_search_path(name, import_): + """Find the search path for a module. + + import_ is expected to be a callable which takes the name of a module to + import. It is required to decouple the function from importlib. + + """ + path = None + parent = name.rpartition('.')[0] + if parent: + if parent not in sys.modules: + 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) + return parent, path + + + _IMPLICIT_META_PATH = [BuiltinImporter, FrozenImporter, _DefaultPathFinder] _ERR_MSG = 'No module named {!r}' @@ -874,27 +952,9 @@ 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] + name = _resolve_name(name, package, level) with _ImportLockContext(): try: module = sys.modules[name] @@ -905,70 +965,33 @@ 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: + parent, path = _find_search_path(name, _gcd_import) + loader = _find_module(name, path) + if loader is None: raise ImportError(_ERR_MSG.format(name)) + elif name not in sys.modules: + # The parent import may have already imported this module. + loader.load_module(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. + parent_module = sys.modules[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 + _set___package__(module) return module -def __import__(name, globals={}, locals={}, fromlist=[], level=0): - """Import a module. +def _return_module(module, name, fromlist, level, import_): + """Figure out what __import__ should return. - The 'globals' argument is used to infer where the import is occuring from - to handle relative imports. The 'locals' argument is ignored. The - 'fromlist' argument specifies what should exist as attributes on the module - being imported (e.g. ``from module import ``). The 'level' - argument represents the package location to import from in a relative - import (e.g. ``from ..pkg import mod`` would have a 'level' of 2). + 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. """ - 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 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] - 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 @@ -989,12 +1012,48 @@ 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)) + import_('{0}.{1}'.format(module.__name__, x)) except ImportError: pass 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): + """Import a module. + + The 'globals' argument is used to infer where the import is occuring from + to handle relative imports. The 'locals' argument is ignored. The + 'fromlist' argument specifies what should exist as attributes on the module + being imported (e.g. ``from module import ``). The 'level' + argument represents the package location to import from in a relative + 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 = _calc___package__(globals) + module = _gcd_import(name, package, level) + return _return_module(module, name, fromlist, level, _gcd_import) + + def _setup(sys_module, imp_module): """Setup importlib by importing needed built-in modules and injecting them into the global namespace. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Feb 16 20:47:31 2012 From: python-checkins at python.org (petri.lehtinen) Date: Thu, 16 Feb 2012 20:47:31 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=283=2E2=29=3A_sqlite3=3A_Fix_?= =?utf8?q?documentation_errors_concerning_Cursor=2Erowcount?= Message-ID: http://hg.python.org/cpython/rev/74b2da95c6be changeset: 74987:74b2da95c6be branch: 3.2 parent: 74984:662c60d26183 user: Petri Lehtinen date: Thu Feb 16 21:39:03 2012 +0200 summary: sqlite3: Fix documentation errors concerning Cursor.rowcount Closes #13995. files: Doc/includes/sqlite3/shortcut_methods.py | 3 +-- Doc/library/sqlite3.rst | 11 +++++------ Misc/NEWS | 4 ++-- 3 files changed, 8 insertions(+), 10 deletions(-) diff --git a/Doc/includes/sqlite3/shortcut_methods.py b/Doc/includes/sqlite3/shortcut_methods.py --- a/Doc/includes/sqlite3/shortcut_methods.py +++ b/Doc/includes/sqlite3/shortcut_methods.py @@ -17,5 +17,4 @@ for row in con.execute("select firstname, lastname from person"): print(row) -# Using a dummy WHERE clause to not let SQLite take the shortcut table deletes. -print("I just deleted", con.execute("delete from person where 1=1").rowcount, "rows") +print("I just deleted", con.execute("delete from person").rowcount, "rows") diff --git a/Doc/library/sqlite3.rst b/Doc/library/sqlite3.rst --- a/Doc/library/sqlite3.rst +++ b/Doc/library/sqlite3.rst @@ -543,18 +543,17 @@ attribute, the database engine's own support for the determination of "rows affected"/"rows selected" is quirky. - For ``DELETE`` statements, SQLite reports :attr:`rowcount` as 0 if you make a - ``DELETE FROM table`` without any condition. - For :meth:`executemany` statements, the number of modifications are summed up into :attr:`rowcount`. As required by the Python DB API Spec, the :attr:`rowcount` attribute "is -1 in case no ``executeXX()`` has been performed on the cursor or the rowcount of the - last operation is not determinable by the interface". + last operation is not determinable by the interface". This includes ``SELECT`` + statements because we cannot determine the number of rows a query produced + until all rows were fetched. - This includes ``SELECT`` statements because we cannot determine the number of - rows a query produced until all rows were fetched. + With SQLite versions before 3.6.5, :attr:`rowcount` is set to 0 if + you make a ``DELETE FROM table`` without any condition. .. attribute:: Cursor.lastrowid diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -528,8 +528,8 @@ Documentation ------------- -- Issue #13491: Fix many errors in sqlite3 documentation. Initial - patch by Johannes Vogel. +- Issues #13491 and #13995: Fix many errors in sqlite3 documentation. + Initial patch for #13491 by Johannes Vogel. - Issue #13402: Document absoluteness of sys.executable. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Feb 16 20:47:32 2012 From: python-checkins at python.org (petri.lehtinen) Date: Thu, 16 Feb 2012 20:47:32 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=282=2E7=29=3A_Fix_errors_in_s?= =?utf8?q?qlite3=27s_Cursor=2Erowcount_documentation?= Message-ID: http://hg.python.org/cpython/rev/a1f17e108a1b changeset: 74988:a1f17e108a1b branch: 2.7 parent: 74980:d2b08b5896d9 user: Petri Lehtinen date: Thu Feb 16 21:42:34 2012 +0200 summary: Fix errors in sqlite3's Cursor.rowcount documentation Closes #13995. files: Doc/includes/sqlite3/shortcut_methods.py | 3 +-- Doc/library/sqlite3.rst | 11 +++++------ Misc/NEWS | 2 ++ 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/Doc/includes/sqlite3/shortcut_methods.py b/Doc/includes/sqlite3/shortcut_methods.py --- a/Doc/includes/sqlite3/shortcut_methods.py +++ b/Doc/includes/sqlite3/shortcut_methods.py @@ -17,5 +17,4 @@ for row in con.execute("select firstname, lastname from person"): print row -# Using a dummy WHERE clause to not let SQLite take the shortcut table deletes. -print "I just deleted", con.execute("delete from person where 1=1").rowcount, "rows" +print "I just deleted", con.execute("delete from person").rowcount, "rows" diff --git a/Doc/library/sqlite3.rst b/Doc/library/sqlite3.rst --- a/Doc/library/sqlite3.rst +++ b/Doc/library/sqlite3.rst @@ -548,18 +548,17 @@ attribute, the database engine's own support for the determination of "rows affected"/"rows selected" is quirky. - For ``DELETE`` statements, SQLite reports :attr:`rowcount` as 0 if you make a - ``DELETE FROM table`` without any condition. - For :meth:`executemany` statements, the number of modifications are summed up into :attr:`rowcount`. As required by the Python DB API Spec, the :attr:`rowcount` attribute "is -1 in case no ``executeXX()`` has been performed on the cursor or the rowcount of the - last operation is not determinable by the interface". + last operation is not determinable by the interface". This includes ``SELECT`` + statements because we cannot determine the number of rows a query produced + until all rows were fetched. - This includes ``SELECT`` statements because we cannot determine the number of - rows a query produced until all rows were fetched. + With SQLite versions before 3.6.5, :attr:`rowcount` is set to 0 if + you make a ``DELETE FROM table`` without any condition. .. attribute:: Cursor.lastrowid diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -575,6 +575,8 @@ Documentation ------------- +- Issue #13995: Fix errors in sqlite3's Cursor.rowcount documentation + - Issue #13402: Document absoluteness of sys.executable. - Issue #13883: PYTHONCASEOK also works on OS X, OS/2, and RiscOS. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Feb 16 20:47:32 2012 From: python-checkins at python.org (petri.lehtinen) Date: Thu, 16 Feb 2012 20:47:32 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_3=2E2_-=3E_default=29?= =?utf8?q?=3A_Merge_branch_=273=2E2=27?= Message-ID: http://hg.python.org/cpython/rev/08699214f79b changeset: 74989:08699214f79b parent: 74986:f2ee5d65dcdb parent: 74987:74b2da95c6be user: Petri Lehtinen date: Thu Feb 16 21:43:41 2012 +0200 summary: Merge branch '3.2' Closes #13995. files: Doc/includes/sqlite3/shortcut_methods.py | 3 +-- Doc/library/sqlite3.rst | 11 +++++------ Misc/NEWS | 4 ++-- 3 files changed, 8 insertions(+), 10 deletions(-) diff --git a/Doc/includes/sqlite3/shortcut_methods.py b/Doc/includes/sqlite3/shortcut_methods.py --- a/Doc/includes/sqlite3/shortcut_methods.py +++ b/Doc/includes/sqlite3/shortcut_methods.py @@ -17,5 +17,4 @@ for row in con.execute("select firstname, lastname from person"): print(row) -# Using a dummy WHERE clause to not let SQLite take the shortcut table deletes. -print("I just deleted", con.execute("delete from person where 1=1").rowcount, "rows") +print("I just deleted", con.execute("delete from person").rowcount, "rows") diff --git a/Doc/library/sqlite3.rst b/Doc/library/sqlite3.rst --- a/Doc/library/sqlite3.rst +++ b/Doc/library/sqlite3.rst @@ -555,18 +555,17 @@ attribute, the database engine's own support for the determination of "rows affected"/"rows selected" is quirky. - For ``DELETE`` statements, SQLite reports :attr:`rowcount` as 0 if you make a - ``DELETE FROM table`` without any condition. - For :meth:`executemany` statements, the number of modifications are summed up into :attr:`rowcount`. As required by the Python DB API Spec, the :attr:`rowcount` attribute "is -1 in case no ``executeXX()`` has been performed on the cursor or the rowcount of the - last operation is not determinable by the interface". + last operation is not determinable by the interface". This includes ``SELECT`` + statements because we cannot determine the number of rows a query produced + until all rows were fetched. - This includes ``SELECT`` statements because we cannot determine the number of - rows a query produced until all rows were fetched. + With SQLite versions before 3.6.5, :attr:`rowcount` is set to 0 if + you make a ``DELETE FROM table`` without any condition. .. attribute:: Cursor.lastrowid diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -2258,8 +2258,8 @@ Documentation ------------- -- Issue #13491: Fix many errors in sqlite3 documentation. Initial - patch by Johannes Vogel. +- Issues #13491 and #13995: Fix many errors in sqlite3 documentation. + Initial patch for #13491 by Johannes Vogel. - Issue #13402: Document absoluteness of sys.executable. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Feb 16 23:18:15 2012 From: python-checkins at python.org (florent.xicluna) Date: Thu, 16 Feb 2012 23:18:15 +0100 Subject: [Python-checkins] =?utf8?q?cpython=3A_The_C_accelerator_was_not_a?= =?utf8?q?lways_imported_for_cElementTree=27s_tests=2E_=28there=27s?= Message-ID: http://hg.python.org/cpython/rev/44728ec9318f changeset: 74990:44728ec9318f user: Florent Xicluna date: Thu Feb 16 23:17:31 2012 +0100 summary: The C accelerator was not always imported for cElementTree's tests. (there's still an issue with --huntrleaks switch) files: Lib/test/test_xml_etree.py | 1 - Lib/test/test_xml_etree_c.py | 5 ++++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/Lib/test/test_xml_etree.py b/Lib/test/test_xml_etree.py --- a/Lib/test/test_xml_etree.py +++ b/Lib/test/test_xml_etree.py @@ -1352,7 +1352,6 @@ r""" Basic inclusion example (XInclude C.1) - >>> from xml.etree import ElementTree as ET >>> from xml.etree import ElementInclude >>> document = xinclude_loader("C1.xml") diff --git a/Lib/test/test_xml_etree_c.py b/Lib/test/test_xml_etree_c.py --- a/Lib/test/test_xml_etree_c.py +++ b/Lib/test/test_xml_etree_c.py @@ -5,7 +5,7 @@ import unittest cET = import_fresh_module('xml.etree.ElementTree', fresh=['_elementtree']) -cET_alias = import_fresh_module('xml.etree.cElementTree', fresh=['_elementtree']) +cET_alias = import_fresh_module('xml.etree.cElementTree', fresh=['_elementtree', 'xml.etree']) # cElementTree specific tests @@ -52,6 +52,9 @@ def test_correct_import_cET(self): self.assertEqual(cET.Element.__module__, '_elementtree') + def test_correct_import_cET_alias(self): + self.assertEqual(cET_alias.Element.__module__, '_elementtree') + def test_main(): from test import test_xml_etree, test_xml_etree_c -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Feb 16 23:28:53 2012 From: python-checkins at python.org (florent.xicluna) Date: Thu, 16 Feb 2012 23:28:53 +0100 Subject: [Python-checkins] =?utf8?q?cpython=3A_fix_the_=5Fnamespace=5Fmap_?= =?utf8?q?cleanup_for_cElementTree_tests=2E?= Message-ID: http://hg.python.org/cpython/rev/cdc9e0238b1d changeset: 74991:cdc9e0238b1d user: Florent Xicluna date: Thu Feb 16 23:28:35 2012 +0100 summary: fix the _namespace_map cleanup for cElementTree tests. files: Lib/test/test_xml_etree.py | 7 +------ Lib/xml/etree/ElementTree.py | 2 ++ 2 files changed, 3 insertions(+), 6 deletions(-) diff --git a/Lib/test/test_xml_etree.py b/Lib/test/test_xml_etree.py --- a/Lib/test/test_xml_etree.py +++ b/Lib/test/test_xml_etree.py @@ -1881,12 +1881,7 @@ def __enter__(self): from xml.etree import ElementPath - if hasattr(ET, '_namespace_map'): - self._nsmap = ET._namespace_map - else: - # when testing the cElementTree alias - from xml.etree.ElementTree import _namespace_map - self._nsmap = _namespace_map + self._nsmap = ET.register_namespace._namespace_map # Copy the default namespace mapping self._nsmap_copy = self._nsmap.copy() # Copy the path cache (should be empty) diff --git a/Lib/xml/etree/ElementTree.py b/Lib/xml/etree/ElementTree.py --- a/Lib/xml/etree/ElementTree.py +++ b/Lib/xml/etree/ElementTree.py @@ -1086,6 +1086,8 @@ # 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( -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Fri Feb 17 00:03:52 2012 From: python-checkins at python.org (brett.cannon) Date: Fri, 17 Feb 2012 00:03:52 +0100 Subject: [Python-checkins] =?utf8?q?cpython=3A_importlib=2E=5F=5Fimport=5F?= =?utf8?q?=5F=28=29_now_raises_ValueError_when_level_=3C_0=2E?= Message-ID: http://hg.python.org/cpython/rev/45a2bbf6c752 changeset: 74992:45a2bbf6c752 parent: 74983:03140936913c user: Brett Cannon date: Thu Feb 16 17:47:48 2012 -0500 summary: importlib.__import__() now raises ValueError when level < 0. This is to bring it more in line with what PEP 328 set out to do with removing ambiguous absolute/relative import semantics. files: Lib/importlib/_bootstrap.py | 2 ++ Lib/importlib/test/import_/test_api.py | 7 +++++++ Misc/NEWS | 3 +++ 3 files changed, 12 insertions(+), 0 deletions(-) diff --git a/Lib/importlib/_bootstrap.py b/Lib/importlib/_bootstrap.py --- a/Lib/importlib/_bootstrap.py +++ b/Lib/importlib/_bootstrap.py @@ -1048,6 +1048,8 @@ raise TypeError("module name must be str, not {}".format(type(name))) if level == 0: module = _gcd_import(name) + elif level < 0: + raise ValueError('level must be >= 0') else: package = _calc___package__(globals) module = _gcd_import(name, package, level) diff --git a/Lib/importlib/test/import_/test_api.py b/Lib/importlib/test/import_/test_api.py --- a/Lib/importlib/test/import_/test_api.py +++ b/Lib/importlib/test/import_/test_api.py @@ -12,6 +12,13 @@ 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_main(): from test.support import run_unittest diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -466,6 +466,9 @@ Library ------- +- Do away with ambiguous level values (as suggested by PEP 328) in + importlib.__import__() by raising ValueError when level < 0. + - Issue #2489: pty.spawn could consume 100% cpu when it encountered an EOF. - Issue #13014: Fix a possible reference leak in SSLSocket.getpeercert(). -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Fri Feb 17 00:03:53 2012 From: python-checkins at python.org (brett.cannon) Date: Fri, 17 Feb 2012 00:03:53 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_default_-=3E_default?= =?utf8?q?=29=3A_Merge?= Message-ID: http://hg.python.org/cpython/rev/83e833f70977 changeset: 74993:83e833f70977 parent: 74992:45a2bbf6c752 parent: 74991:cdc9e0238b1d user: Brett Cannon date: Thu Feb 16 18:03:47 2012 -0500 summary: Merge files: Doc/includes/sqlite3/shortcut_methods.py | 3 +- Doc/library/sqlite3.rst | 11 ++-- Lib/test/test_sched.py | 28 ++++++----- Lib/test/test_xml_etree.py | 8 +--- Lib/test/test_xml_etree_c.py | 5 +- Lib/xml/etree/ElementTree.py | 2 + Misc/NEWS | 4 +- 7 files changed, 30 insertions(+), 31 deletions(-) diff --git a/Doc/includes/sqlite3/shortcut_methods.py b/Doc/includes/sqlite3/shortcut_methods.py --- a/Doc/includes/sqlite3/shortcut_methods.py +++ b/Doc/includes/sqlite3/shortcut_methods.py @@ -17,5 +17,4 @@ for row in con.execute("select firstname, lastname from person"): print(row) -# Using a dummy WHERE clause to not let SQLite take the shortcut table deletes. -print("I just deleted", con.execute("delete from person where 1=1").rowcount, "rows") +print("I just deleted", con.execute("delete from person").rowcount, "rows") diff --git a/Doc/library/sqlite3.rst b/Doc/library/sqlite3.rst --- a/Doc/library/sqlite3.rst +++ b/Doc/library/sqlite3.rst @@ -555,18 +555,17 @@ attribute, the database engine's own support for the determination of "rows affected"/"rows selected" is quirky. - For ``DELETE`` statements, SQLite reports :attr:`rowcount` as 0 if you make a - ``DELETE FROM table`` without any condition. - For :meth:`executemany` statements, the number of modifications are summed up into :attr:`rowcount`. As required by the Python DB API Spec, the :attr:`rowcount` attribute "is -1 in case no ``executeXX()`` has been performed on the cursor or the rowcount of the - last operation is not determinable by the interface". + last operation is not determinable by the interface". This includes ``SELECT`` + statements because we cannot determine the number of rows a query produced + until all rows were fetched. - This includes ``SELECT`` statements because we cannot determine the number of - rows a query produced until all rows were fetched. + With SQLite versions before 3.6.5, :attr:`rowcount` is set to 0 if + you make a ``DELETE FROM table`` without any condition. .. attribute:: Cursor.lastrowid diff --git a/Lib/test/test_sched.py b/Lib/test/test_sched.py --- a/Lib/test/test_sched.py +++ b/Lib/test/test_sched.py @@ -12,10 +12,10 @@ l = [] fun = lambda x: l.append(x) scheduler = sched.scheduler(time.time, time.sleep) - for x in [0.05, 0.04, 0.03, 0.02, 0.01]: + for x in [0.5, 0.4, 0.3, 0.2, 0.1]: z = scheduler.enter(x, 1, fun, (x,)) scheduler.run() - self.assertEqual(l, [0.01, 0.02, 0.03, 0.04, 0.05]) + self.assertEqual(l, [0.1, 0.2, 0.3, 0.4, 0.5]) def test_enterabs(self): l = [] @@ -31,7 +31,7 @@ fun = lambda x: l.append(x) scheduler = sched.scheduler(time.time, time.sleep) for priority in [1, 2, 3, 4, 5]: - z = scheduler.enter(0.01, priority, fun, (priority,)) + z = scheduler.enterabs(0.01, priority, fun, (priority,)) scheduler.run() self.assertEqual(l, [1, 2, 3, 4, 5]) @@ -39,11 +39,12 @@ l = [] fun = lambda x: l.append(x) scheduler = sched.scheduler(time.time, time.sleep) - event1 = scheduler.enter(0.01, 1, fun, (0.01,)) - event2 = scheduler.enter(0.02, 1, fun, (0.02,)) - event3 = scheduler.enter(0.03, 1, fun, (0.03,)) - event4 = scheduler.enter(0.04, 1, fun, (0.04,)) - event5 = scheduler.enter(0.05, 1, fun, (0.05,)) + now = time.time() + event1 = scheduler.enterabs(now + 0.01, 1, fun, (0.01,)) + event2 = scheduler.enterabs(now + 0.02, 1, fun, (0.02,)) + event3 = scheduler.enterabs(now + 0.03, 1, fun, (0.03,)) + event4 = scheduler.enterabs(now + 0.04, 1, fun, (0.04,)) + event5 = scheduler.enterabs(now + 0.05, 1, fun, (0.05,)) scheduler.cancel(event1) scheduler.cancel(event5) scheduler.run() @@ -64,11 +65,12 @@ l = [] fun = lambda x: l.append(x) scheduler = sched.scheduler(time.time, time.sleep) - e5 = scheduler.enter(0.05, 1, fun) - e1 = scheduler.enter(0.01, 1, fun) - e2 = scheduler.enter(0.02, 1, fun) - e4 = scheduler.enter(0.04, 1, fun) - e3 = scheduler.enter(0.03, 1, fun) + 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]) diff --git a/Lib/test/test_xml_etree.py b/Lib/test/test_xml_etree.py --- a/Lib/test/test_xml_etree.py +++ b/Lib/test/test_xml_etree.py @@ -1352,7 +1352,6 @@ r""" Basic inclusion example (XInclude C.1) - >>> from xml.etree import ElementTree as ET >>> from xml.etree import ElementInclude >>> document = xinclude_loader("C1.xml") @@ -1882,12 +1881,7 @@ def __enter__(self): from xml.etree import ElementPath - if hasattr(ET, '_namespace_map'): - self._nsmap = ET._namespace_map - else: - # when testing the cElementTree alias - from xml.etree.ElementTree import _namespace_map - self._nsmap = _namespace_map + self._nsmap = ET.register_namespace._namespace_map # Copy the default namespace mapping self._nsmap_copy = self._nsmap.copy() # Copy the path cache (should be empty) diff --git a/Lib/test/test_xml_etree_c.py b/Lib/test/test_xml_etree_c.py --- a/Lib/test/test_xml_etree_c.py +++ b/Lib/test/test_xml_etree_c.py @@ -5,7 +5,7 @@ import unittest cET = import_fresh_module('xml.etree.ElementTree', fresh=['_elementtree']) -cET_alias = import_fresh_module('xml.etree.cElementTree', fresh=['_elementtree']) +cET_alias = import_fresh_module('xml.etree.cElementTree', fresh=['_elementtree', 'xml.etree']) # cElementTree specific tests @@ -52,6 +52,9 @@ def test_correct_import_cET(self): self.assertEqual(cET.Element.__module__, '_elementtree') + def test_correct_import_cET_alias(self): + self.assertEqual(cET_alias.Element.__module__, '_elementtree') + def test_main(): from test import test_xml_etree, test_xml_etree_c diff --git a/Lib/xml/etree/ElementTree.py b/Lib/xml/etree/ElementTree.py --- a/Lib/xml/etree/ElementTree.py +++ b/Lib/xml/etree/ElementTree.py @@ -1086,6 +1086,8 @@ # 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( diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -2261,8 +2261,8 @@ Documentation ------------- -- Issue #13491: Fix many errors in sqlite3 documentation. Initial - patch by Johannes Vogel. +- Issues #13491 and #13995: Fix many errors in sqlite3 documentation. + Initial patch for #13491 by Johannes Vogel. - Issue #13402: Document absoluteness of sys.executable. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Fri Feb 17 00:12:06 2012 From: python-checkins at python.org (brett.cannon) Date: Fri, 17 Feb 2012 00:12:06 +0100 Subject: [Python-checkins] =?utf8?q?cpython=3A_Tweak_the_handling_of_the_e?= =?utf8?q?mpty_string_in_sys=2Epath_for_importlib=2E?= Message-ID: http://hg.python.org/cpython/rev/b8593ec7e8c5 changeset: 74994:b8593ec7e8c5 user: Brett Cannon date: Thu Feb 16 18:12:00 2012 -0500 summary: Tweak the handling of the empty string in sys.path for importlib. It seems better to cache the finder for the cwd under its full path insetad of '' in case the cwd changes. Otherwise FileFinder needs to dynamically change itself based on whether it is given '' instead of caching a finder for every change to the cwd. files: Lib/importlib/_bootstrap.py | 4 +++- Lib/importlib/test/import_/test_path.py | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/Lib/importlib/_bootstrap.py b/Lib/importlib/_bootstrap.py --- a/Lib/importlib/_bootstrap.py +++ b/Lib/importlib/_bootstrap.py @@ -713,10 +713,12 @@ the default hook, for which ImportError is raised. """ + if path == '': + path = _os.getcwd() try: finder = sys.path_importer_cache[path] except KeyError: - finder = cls._path_hooks(path if path != '' else _os.getcwd()) + finder = cls._path_hooks(path) sys.path_importer_cache[path] = finder else: if finder is None and default: diff --git a/Lib/importlib/test/import_/test_path.py b/Lib/importlib/test/import_/test_path.py --- a/Lib/importlib/test/import_/test_path.py +++ b/Lib/importlib/test/import_/test_path.py @@ -82,7 +82,7 @@ with util.import_state(path=[path], path_hooks=[hook]): loader = machinery.PathFinder.find_module(module) self.assertIs(loader, importer) - self.assertIn('', sys.path_importer_cache) + self.assertIn(os.getcwd(), sys.path_importer_cache) class DefaultPathFinderTests(unittest.TestCase): -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Fri Feb 17 02:19:30 2012 From: python-checkins at python.org (victor.stinner) Date: Fri, 17 Feb 2012 02:19:30 +0100 Subject: [Python-checkins] =?utf8?q?peps=3A_PEP_410=3A_complete_motivation?= =?utf8?q?_section=2C_add_timespec_type=2C_rephrase_os=2Estat=28=29_and?= Message-ID: http://hg.python.org/peps/rev/5f8f5b858e2f changeset: 4059:5f8f5b858e2f user: Victor Stinner date: Fri Feb 17 02:20:31 2012 +0100 summary: PEP 410: complete motivation section, add timespec type, rephrase os.stat() and datetime.datetime() sections files: pep-0410.txt | 115 +++++++++++++++++++++++++++++++++----- 1 files changed, 100 insertions(+), 15 deletions(-) diff --git a/pep-0410.txt b/pep-0410.txt --- a/pep-0410.txt +++ b/pep-0410.txt @@ -22,9 +22,8 @@ ========== Python 2.3 introduced float timestamps to support subsecond resolutions. -os.stat() uses float timestamps by default since Python 2.5. - -Python 3.3 introduced functions supporting nanosecond resolutions: +os.stat() uses float timestamps by default since Python 2.5. Python 3.3 +introduced functions supporting nanosecond resolutions: * os module: stat(), utimensat(), futimens() * time module: clock_gettime(), clock_getres(), wallclock() @@ -33,10 +32,27 @@ resolution of 1 nanosecond (10\ :sup:`-9`), float timestamps lose precision for values bigger than 2\ :sup:`24` seconds (194 days: 1970-07-14 for an Epoch timestamp). +Nanosecond resolution is required to set the exact modification time on +filesystems supporting nanosecond timestamps (e.g ext4, btrfs, NTFS, ...). It +helps also to compare the modification time of two files when checking which +one is newer. Examples: copy a file and its modification time using +shutil.copystat(), create a TAR archive with the tarfile module, manage a +mailbox with the mailbox module, etc. + +An arbitrary resolution is preferred over a fixed resolution (like nanosecond) +to not have to change the API when a better resolution is required. For +example, the NTP protocol uses fractions of 2\ :sup:`32` seconds +(approximatively 2.3 x 10\ :sup:`-10` second), whereas the NTP protocol version +4 uses fractions of 2\ :sup:`64` seconds (5.4 x 10\ :sup:`-20` second). + .. note:: - With a resolution of 1 microsecond (10\ :sup:`-6`), float timestamps lose precision - for values bigger than 2\ :sup:`33` seconds (272 years: 2242-03-16 for an Epoch - timestamp). + With a resolution of 1 microsecond (10\ :sup:`-6`), float timestamps lose + precision for values bigger than 2\ :sup:`33` seconds (272 years: 2242-03-16 + for an Epoch timestamp). + + With a resolution of 100 nanoseconds (10\ :sup:`-7`), float timestamps lose + precision for values bigger than 2\ :sup:`29` seconds (17 years: 1987-01-05 + for an Epoch timestamp). Specification @@ -123,8 +139,9 @@ datetime.datetime ----------------- -Most functions returning timestamps don't have a known starting point or -timezone information, and so cannot be converted to datetime.datetime. +Except os.stat(), time.time() and time.clock_gettime(time.CLOCK_GETTIME), all +time functions have an unspecified starting point and no timezone information, +and so cannot be converted to datetime.datetime. datetime.datetime only supports microsecond resolution, but can be enhanced to support nanosecond. @@ -193,6 +210,60 @@ :sup:`exponent` must be computed again to convert a timestamp as float or Decimal. Storing directly the frequency in the denominator is simpler. +timespec structure +------------------ + +A resolution of one nanosecond is enough to support all current C functions. A +Timespec type can be added to store a timestamp with a nanosecond resolution. +Basic example supporting addition, subtraction and coercion to float:: + + class timespec(tuple): + def __new__(cls, sec, nsec): + if not isinstance(sec, int): + raise TypeError + if not isinstance(nsec, int): + raise TypeError + asec, nsec = divmod(nsec, 10 ** 9) + sec += asec + obj = tuple.__new__(cls, (sec, nsec)) + obj.sec = sec + obj.nsec = nsec + return obj + + def __float__(self): + return self.sec + self.nsec * 1e-9 + + def total_nanoseconds(self): + return self.sec * 10 ** 9 + self.nsec + + def __add__(self, other): + if not isinstance(other, timespec): + raise TypeError + ns_sum = self.total_nanoseconds() + other.total_nanoseconds() + return timespec(*divmod(ns_sum, 10 ** 9)) + + def __sub__(self, other): + if not isinstance(other, timespec): + raise TypeError + ns_diff = self.total_nanoseconds() - other.total_nanoseconds() + return timespec(*divmod(ns_diff, 10 ** 9)) + + def __str__(self): + if self.sec < 0 and self.nsec: + sec = abs(1 + self.sec) + nsec = 10**9 - self.nsec + return '-%i.%09u' % (sec, nsec) + else: + return '%i.%09u' % (self.sec, self.nsec) + + def __repr__(self): + return '' % (self.sec, self.nsec) + +The timespec type is similar to the `Tuple of integer, variant (A) +`_ type, except that it supports arithmetic. + +The timespec type was rejected because it only supports nanosecond resolution. + Alternatives: API design ======================== @@ -244,14 +315,27 @@ Add new fields to os.stat ------------------------- -It was proposed to add 3 fields to os.stat() structure to get nanoseconds of -timestamps. +To get the creation, modification and access time of a file with a nanosecond +resolution, three fields can be added to os.stat() structure. -Populating the extra fields is time consuming. If new fields are available by -default, any call to os.stat() would be slower. If new fields are optional, the -stat structure would have a variable number of fields, which can be surprising. +The new fields can timestamps with nanosecond resolution (tuple of integers, +timespec structure, Decimal, etc.) or the nanosecond part of each timestamp. -Anyway, this approach does not help with the time module. +If the new fields are timestamps with nanosecond resolution, populating the +extra fields would be time consuming. Any call to os.stat() would be slower, +even if os.stat() is only called to check if the file exists. A parameter can +be added to os.stat() to make these fields optional, but a structure with a +variable number of fields can be problematic. + +If the new fields only contain the fractional part (nanoseconds), os.stat() +would be efficient. These fields would always be present and so set to zero if +the operating system does not support subsecond resolution. Splitting a +timestamp in two parts, seconds and nanoseconds, is similar to the `timespec +type `_ and `tuple of integers `_, and so have the +same drawbacks. + +Adding new fields to the os.stat() structure does not solve the nanosecond +issue in other modules (e.g. time). Add a boolean argument ---------------------- @@ -274,10 +358,11 @@ * time.clock_decimal() * time.time_decimal() * os.stat_decimal() + * os.stat_timespec() * etc. Adding a new function for each function creating timestamps duplicate a lot -of time. +of code. Links -- Repository URL: http://hg.python.org/peps From python-checkins at python.org Fri Feb 17 02:23:57 2012 From: python-checkins at python.org (victor.stinner) Date: Fri, 17 Feb 2012 02:23:57 +0100 Subject: [Python-checkins] =?utf8?q?peps=3A_PEP_410=3A_os=2Estat=28=29_nan?= =?utf8?q?osecond_existed_since_at_least_Python_2=2E6?= Message-ID: http://hg.python.org/peps/rev/0eadd72a908c changeset: 4060:0eadd72a908c user: Victor Stinner date: Fri Feb 17 02:24:58 2012 +0100 summary: PEP 410: os.stat() nanosecond existed since at least Python 2.6 files: pep-0410.txt | 7 +++++-- 1 files changed, 5 insertions(+), 2 deletions(-) diff --git a/pep-0410.txt b/pep-0410.txt --- a/pep-0410.txt +++ b/pep-0410.txt @@ -25,8 +25,11 @@ os.stat() uses float timestamps by default since Python 2.5. Python 3.3 introduced functions supporting nanosecond resolutions: - * os module: stat(), utimensat(), futimens() - * time module: clock_gettime(), clock_getres(), wallclock() + * os module: futimens(), utimensat() + * time module: clock_gettime(), clock_getres(), monotonic(), wallclock() + +os.stat() reads nanoseconds fields of the stat structure, but returns +timestamps as float. The Python float type uses binary64 format of the IEEE 754 standard. With a resolution of 1 nanosecond (10\ :sup:`-9`), float timestamps lose precision for values -- Repository URL: http://hg.python.org/peps From ncoghlan at gmail.com Fri Feb 17 04:50:22 2012 From: ncoghlan at gmail.com (Nick Coghlan) Date: Fri, 17 Feb 2012 13:50:22 +1000 Subject: [Python-checkins] cpython: Disabling a test that fails on some bots. Will investigate the failure soon In-Reply-To: References: Message-ID: On Fri, Feb 17, 2012 at 2:09 AM, eli.bendersky wrote: > diff --git a/Lib/test/test_xml_etree_c.py b/Lib/test/test_xml_etree_c.py > --- a/Lib/test/test_xml_etree_c.py > +++ b/Lib/test/test_xml_etree_c.py > @@ -53,8 +53,8 @@ > ? ? ? ? # actual class. In the Python version it's a class. > ? ? ? ? self.assertNotIsInstance(cET.Element, type) > > - ? ?def test_correct_import_cET_alias(self): > - ? ? ? ?self.assertNotIsInstance(cET_alias.Element, type) > + ? ?#def test_correct_import_cET_alias(self): > + ? ? ? ?#self.assertNotIsInstance(cET_alias.Element, type) While this one was fixed quickly, *please* don't comment tests out without some kind of explanation in the code (not just in the checkin message). Even better is to use the expected_failure() decorator or the skip() decorator. Cheers, Nick. -- Nick Coghlan?? |?? ncoghlan at gmail.com?? |?? Brisbane, Australia From eliben at gmail.com Fri Feb 17 04:57:05 2012 From: eliben at gmail.com (Eli Bendersky) Date: Fri, 17 Feb 2012 05:57:05 +0200 Subject: [Python-checkins] cpython: Disabling a test that fails on some bots. Will investigate the failure soon In-Reply-To: References: Message-ID: On Fri, Feb 17, 2012 at 05:50, Nick Coghlan wrote: > On Fri, Feb 17, 2012 at 2:09 AM, eli.bendersky > wrote: > > diff --git a/Lib/test/test_xml_etree_c.py b/Lib/test/test_xml_etree_c.py > > --- a/Lib/test/test_xml_etree_c.py > > +++ b/Lib/test/test_xml_etree_c.py > > @@ -53,8 +53,8 @@ > > # actual class. In the Python version it's a class. > > self.assertNotIsInstance(cET.Element, type) > > > > - def test_correct_import_cET_alias(self): > > - self.assertNotIsInstance(cET_alias.Element, type) > > + #def test_correct_import_cET_alias(self): > > + #self.assertNotIsInstance(cET_alias.Element, type) > > While this one was fixed quickly, *please* don't comment tests out > without some kind of explanation in the code (not just in the checkin > message). > > Even better is to use the expected_failure() decorator or the skip() > decorator. > I just saw this test failing in some bots and wanted to fix it ASAP, without spending time on a real investigation. The follow-up fix came less than 2 hours later. But yes, I agree that commenting out wasn't a good choice - I should've just deleted it for the time I was working on a fix. By the way, I later discussed the failing test with Florent and http://bugs.python.org/issue14035 is the result. That failure had made no sense until Florent got deeper into import_fresh_module. Eli -------------- next part -------------- An HTML attachment was scrubbed... URL: From solipsis at pitrou.net Fri Feb 17 05:34:05 2012 From: solipsis at pitrou.net (solipsis at pitrou.net) Date: Fri, 17 Feb 2012 05:34:05 +0100 Subject: [Python-checkins] Daily reference leaks (b8593ec7e8c5): sum=0 Message-ID: results for b8593ec7e8c5 on branch "default" -------------------------------------------- Command line was: ['./python', '-m', 'test.regrtest', '-uall', '-R', '3:3:/home/antoine/cpython/refleaks/reflogj2x_hm', '-x'] From python-checkins at python.org Fri Feb 17 11:56:24 2012 From: python-checkins at python.org (antoine.pitrou) Date: Fri, 17 Feb 2012 11:56:24 +0100 Subject: [Python-checkins] =?utf8?q?cpython=3A_Fix_compilation_when_SSL=5F?= =?utf8?q?OP=5FSINGLE=5FECDH=5FUSE_isn=27t_defined?= Message-ID: http://hg.python.org/cpython/rev/c1a07c8092f7 changeset: 74995:c1a07c8092f7 user: Antoine Pitrou date: Fri Feb 17 11:53:10 2012 +0100 summary: Fix compilation when SSL_OP_SINGLE_ECDH_USE isn't defined files: Modules/_ssl.c | 2 ++ 1 files changed, 2 insertions(+), 0 deletions(-) diff --git a/Modules/_ssl.c b/Modules/_ssl.c --- a/Modules/_ssl.c +++ b/Modules/_ssl.c @@ -2547,7 +2547,9 @@ 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); -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Fri Feb 17 12:11:08 2012 From: python-checkins at python.org (nick.coghlan) Date: Fri, 17 Feb 2012 12:11:08 +0100 Subject: [Python-checkins] =?utf8?q?peps=3A_Update_PEP_394_to_record_accep?= =?utf8?q?tance=2C_fix_awkward_phrasing_in_the_rational?= Message-ID: http://hg.python.org/peps/rev/c91f8a71826c changeset: 4061:c91f8a71826c user: Nick Coghlan date: Fri Feb 17 21:10:58 2012 +1000 summary: Update PEP 394 to record acceptance, fix awkward phrasing in the rational section and incorporate Barry's suggestion of explicitly noting that we expect the recommendation to eventually change files: pep-0394.txt | 38 +++++++++++++++++++++++++++----------- 1 files changed, 27 insertions(+), 11 deletions(-) diff --git a/pep-0394.txt b/pep-0394.txt --- a/pep-0394.txt +++ b/pep-0394.txt @@ -4,11 +4,12 @@ Last-Modified: $Date$ Author: Kerrick Staley , Nick Coghlan -Status: Draft +Status: Active Type: Informational Content-Type: text/x-rst Created: 02-Mar-2011 Post-History: 04-Mar-2011, 20-Jul-2011, 16-Feb-2012 +Resolution: http://mail.python.org/pipermail/python-dev/2012-February/116594.html Abstract @@ -66,16 +67,31 @@ Rationale ========= -This is needed as, even though the majority of distributions still alias the -``python`` command to Python 2, some now alias it to Python 3 ([5]_). Some of -the former also do not provide a ``python2`` command; hence, there is -currently no way for Python 2 code (or any code that invokes the Python 2 -interpreter directly rather than via ``sys.executable``) to reliably run on -all Unix-like systems without modification, as the ``python`` command will -invoke the wrong interpreter version on some systems, and the ``python2`` -command will fail completely on others. The recommendations in this PEP -provide a very simple mechanism to restore cross-platform support, with -minimal additional work required on the part of distribution maintainers. +This recommendation is needed as, even though the majority of distributions +still alias the ``python`` command to Python 2, some now alias it to +Python 3 ([5]_). As some of the former distributions do not yet provide a +``python2`` command by default, there is currently no way for Python 2 code +(or any code that invokes the Python 2 interpreter directly rather than via +``sys.executable``) to reliably run on all Unix-like systems without +modification, as the ``python`` command will invoke the wrong interpreter +version on some systems, and the ``python2`` command will fail completely +on others. The recommendations in this PEP provide a very simple mechanism +to restore cross-platform support, with minimal additional work required +on the part of distribution maintainers. + + +Future Changes to this Recommendation +===================================== + +It is anticipated that there will eventually come a time where the third +party ecosystem surrounding Python 3 is sufficiently mature for this +recommendation to be updated to suggest that the ``python`` symlink +refer to ``python3`` rather than ``python2``. + +This recommendation will be periodically reviewed over the next few years, +and updated when the core development team judges it appropriate. As a +point of reference, regular maintenance releases for the Python 2.7 series +will continue until at least 2015. Migration Notes -- Repository URL: http://hg.python.org/peps From python-checkins at python.org Fri Feb 17 13:41:16 2012 From: python-checkins at python.org (nick.coghlan) Date: Fri, 17 Feb 2012 13:41:16 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=282=2E7=29=3A_Implement_PEP_3?= =?utf8?q?94_for_Python_2=2E7?= Message-ID: http://hg.python.org/cpython/rev/a65a71aa9436 changeset: 74996:a65a71aa9436 branch: 2.7 parent: 74988:a1f17e108a1b user: Nick Coghlan date: Fri Feb 17 22:10:38 2012 +1000 summary: Implement PEP 394 for Python 2.7 files: Makefile.pre.in | 16 ++++++++++++---- 1 files changed, 12 insertions(+), 4 deletions(-) diff --git a/Makefile.pre.in b/Makefile.pre.in --- a/Makefile.pre.in +++ b/Makefile.pre.in @@ -786,18 +786,26 @@ done -# Install the interpreter (by creating a hard link to python$(VERSION)) +# Install the interpreter by creating a symlink chain: +# $(PYTHON) -> python2 -> python$(VERSION)) +# Also create equivalent chains for other installed files bininstall: altbininstall -if test -f $(DESTDIR)$(BINDIR)/$(PYTHON) -o -h $(DESTDIR)$(BINDIR)/$(PYTHON); \ then rm -f $(DESTDIR)$(BINDIR)/$(PYTHON); \ else true; \ fi - (cd $(DESTDIR)$(BINDIR); $(LN) python$(VERSION)$(EXE) $(PYTHON)) + (cd $(DESTDIR)$(BINDIR); $(LN) -s python2$(EXE) $(PYTHON)) + -rm -f $(DESTDIR)$(BINDIR)/python2$(EXE) + (cd $(DESTDIR)$(BINDIR); $(LN) -s python$(VERSION)$(EXE) python2$(EXE)) + -rm -f $(DESTDIR)$(BINDIR)/python2-config + (cd $(DESTDIR)$(BINDIR); $(LN) -s python$(VERSION)-config python2-config) -rm -f $(DESTDIR)$(BINDIR)/python-config - (cd $(DESTDIR)$(BINDIR); $(LN) -s python$(VERSION)-config python-config) + (cd $(DESTDIR)$(BINDIR); $(LN) -s python2-config python-config) -test -d $(DESTDIR)$(LIBPC) || $(INSTALL) -d -m $(DIRMODE) $(DESTDIR)$(LIBPC) + -rm -f $(DESTDIR)$(LIBPC)/python2.pc + (cd $(DESTDIR)$(LIBPC); $(LN) -s python-$(VERSION).pc python2.pc) -rm -f $(DESTDIR)$(LIBPC)/python.pc - (cd $(DESTDIR)$(LIBPC); $(LN) -s python-$(VERSION).pc python.pc) + (cd $(DESTDIR)$(LIBPC); $(LN) -s python2.pc python.pc) # Install the interpreter with $(VERSION) affixed # This goes into $(exec_prefix) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Fri Feb 17 14:05:48 2012 From: python-checkins at python.org (victor.stinner) Date: Fri, 17 Feb 2012 14:05:48 +0100 Subject: [Python-checkins] =?utf8?q?peps=3A_PEP_410=3A_Rephrase_datetime?= =?utf8?q?=2Edateime_and_tuple_of_integers_sections=3B_add?= Message-ID: http://hg.python.org/peps/rev/0cfd65f3d680 changeset: 4062:0cfd65f3d680 user: Victor Stinner date: Fri Feb 17 14:05:52 2012 +0100 summary: PEP 410: Rephrase datetime.dateime and tuple of integers sections; add "compatible with float" in criteria to choose a timestamp type files: pep-0410.txt | 177 ++++++++++++++++++++++++++------------ 1 files changed, 122 insertions(+), 55 deletions(-) diff --git a/pep-0410.txt b/pep-0410.txt --- a/pep-0410.txt +++ b/pep-0410.txt @@ -45,8 +45,8 @@ An arbitrary resolution is preferred over a fixed resolution (like nanosecond) to not have to change the API when a better resolution is required. For example, the NTP protocol uses fractions of 2\ :sup:`32` seconds -(approximatively 2.3 x 10\ :sup:`-10` second), whereas the NTP protocol version -4 uses fractions of 2\ :sup:`64` seconds (5.4 x 10\ :sup:`-20` second). +(approximatively 2.3 ? 10\ :sup:`-10` second), whereas the NTP protocol version +4 uses fractions of 2\ :sup:`64` seconds (5.4 ? 10\ :sup:`-20` second). .. note:: With a resolution of 1 microsecond (10\ :sup:`-6`), float timestamps lose @@ -105,20 +105,27 @@ Alternatives: Timestamp types ============================= -To support timestamps with a nanosecond resolution, five types were considered: +To support timestamps with a nanosecond resolution, the following types has +been considered: * 128 bits float * decimal.Decimal * datetime.datetime * datetime.timedelta * tuple of integers + * timespec structure Criteria: - * Doing arithmetic on timestamps must be possible. - * Timestamps must be comparable. - * The type must have a resolution of a least 1 nanosecond (without losing - precision) or an arbitrary resolution. + * Doing arithmetic on timestamps must be possible + * Timestamps must be comparable + * An arbitrary resolution, or at least a resolution of 1 nanosecond without + losing precision + * Compatibility with the float type + +It should be possible to coerce the new timestamp to float for backward +compatibility, even if programs should not get this new type if they did not +ask explicitly to get it. 128 bits float -------------- @@ -142,76 +149,136 @@ datetime.datetime ----------------- -Except os.stat(), time.time() and time.clock_gettime(time.CLOCK_GETTIME), all -time functions have an unspecified starting point and no timezone information, -and so cannot be converted to datetime.datetime. +Advantages: -datetime.datetime only supports microsecond resolution, but can be enhanced -to support nanosecond. + * datetime.datetime is the natural choice for a timestamp because it is clear + that this type contains a timestamp, whereas int, float and Decimal are + raw numbers. + * datetime.datetime is an absolute timestamp and so is well defined + * datetime.datetime gives direct access to the year, month, day, hours, + minutes and seconds. + * datetime.datetime has methods related to time like methods to format the + timestamp as string (e.g. datetime.datetime.strftime). -datetime.datetime has issues with timezone. For example, a datetime object -without timezone and a datetime with a timezone cannot be compared. +Drawbacks: -datetime.datetime has ordering issues with daylight saving time (DST) in the -duplicate hour of switching from DST to normal time. + * Except os.stat(), time.time() and time.clock_gettime(time.CLOCK_GETTIME), + all time functions have an unspecified starting point and no timezone + information, and so cannot be converted to datetime.datetime. + * datetime.datetime has issues with timezone. For example, a datetime object + without timezone and a datetime with a timezone cannot be compared. + * datetime.datetime has ordering issues with daylight saving time (DST) in the + duplicate hour of switching from DST to normal time. + * datetime.datetime is not as well integrated than Epoch timestamps: there is + no datetime.datetime.totimestamp() function. Most functions expecting + tiemstamps don't support datime.datetime. For example, os.utime() expects a + tuple of Epoch timestamps. -datetime.datetime is not as well integrated than Epoch timestamps: there is no -datetime.datetime.totimestamp() function. Most functions expecting tiemstamps -don't support datime.datetime. For example, os.utime() expects a tuple of Epoch -timestamps. +datetime.datetime has been rejected because it cannot be used for functions +using an unspecified starting point like os.times() or time.clock(). + +.. note:: + datetime.datetime only supports microsecond resolution, but can be enhanced + to support nanosecond. datetime.timedelta ------------------ -As datetime.datetime, datetime.timedelta only supports microsecond resolution, -but can be enhanced to support nanosecond. +datetime.timedelta is the natural choice for a relative timestamp because it is +clear that this type contains a timestamp, whereas int, float and Decimal are +raw numbers. It can be used with datetime.datetime to get an absolute +timestamp. -datetime.timedelta is not as well integrated than Epoch timestamps, some -functions don't accept this type as input. Converting a timedelta object to a -float (number of seconds) requires to call an explicit method, -timedelta.toseconds(). Supporting timedelta would need to change every -functions getting timestamps, whereas all functions supporting float already -accept Decimal because Decimal can be casted to float. +datetime.timedelta has been rejected because it is not "compatible" with float, +whereas Decimal can be converted to float, and has a fixed resolution. One new +standard timestamp type is enough, and Decimal is preferred over +datetime.timedelta. + +.. note:: + datetime.timedelta only supports microsecond resolution, but can be enhanced + to support nanosecond. .. _tuple-integers: Tuple of integers ----------------- -Creating a tuple of integers is simple and fast, but arithmetic operations -cannot be done directly on tuple. For example, (2, 1) - (2, 0) fails with a -TypeError. +To expose C functions in Python, a tuple of integers is the natural choice to +store a timestamp because the C language uses structures with integers fields +(e.g. timeval and timespec structures). Using only integers avoids the loss of +precision (Python supports integer of arbitrary length). Creating and parsing a +tuple of integers is simple and fast. -An integer fraction can be used to store any number without loss of precision -with any resolution: (numerator: int, denominator: int). The timestamp value -can be computed with a simple division: numerator / denominator. +Depending of the exact format of the tuple, the precision can be arbitrary or +fixed. The precision can be choose as the loss of precision is smaller than +an arbitrary limit like one nanosecond. -For the C implementation, a variant can be used to avoid integer overflow -because C types have a fixed size: (intpart: int, numerator: int, denominator: -int), value = intpart + numerator / denominator. Still to avoid integer -overflow in C types, numerator can be bigger than denominator while intpart can -be zero. +Different formats has been proposed: -Other formats have been proposed: + * A: (numerator, denominator) - * A: (sec, nsec): value = sec + nsec * 10\ :sup:`-9` - * B: (intpart, floatpart, exponent): value = intpart + floatpart * 10\ :sup:`exponent` - * C: (intpart, floatpart, base, exponent): value = intpart + floatpart * base\ :sup:`exponent` + * value = numerator / denominator + * resolution = 1 / denominator + * the numerator is a signed integer and can be bigger than the denominator + * denominator > 0 -The format A only supports nanosecond resolution. Formats A and B lose -precision if the clock frequency cannot be written as a power of 10: if the -clock frequency is not coprime with 2 and 5. + * B: (seconds, numerator, denominator) -For some clocks, like ``QueryPerformanceCounter()`` on Windows, the frequency -is only known as runtime. The base and exponent has to be computed. If -computing the base and the exponent is too expensive (or not possible, e.g. if -the frequency is a prime number), exponent=1 can be used. The format (C) is -just a fractionn if exponent=1. + * value = seconds + numerator / denominator + * resolution = 1 / denominator + * seconds is a signed integer + * 0 <= numerator < denominator + * denominator > 0 -The only advantage of these formats is a small optimization if the base is 2 -for float or if the base 10 for Decimal. In other cases, frequency = base\ -:sup:`exponent` must be computed again to convert a timestamp as float or -Decimal. Storing directly the frequency in the denominator is simpler. + * C: (intpart, floatpart, base, exponent) + + * value = intpart + floatpart ? base\ :sup:`exponent` + * resolution = base \ :sup:`-exponent` + * intpart is a signed integer + * 0 <= floatpart < base \ :sup:`exponent` + * base > 0 + * exponent is a signed integer and should be negative + + * D: (intpart, floatpart, exponent) + + * value = intpart + floatpart ? 10\ :sup:`exponent` + * resolution = 10 \ :sup:`-exponent` + * intpart is a signed integer + * 0 <= floatpart < 10 \ :sup:`exponent` + * exponent is a signed integer and should be negative + + * E: (sec, nsec) + + * value = sec + nsec ? 10\ :sup:`-9` + * resolution = 10 \ :sup:`-9` (nanosecond) + * sec is a signed integer + * 0 <= nsec < 10 \ :sup:`9` + +All formats support an arbitary resolution, except of the format (E). + +The format (D) may loss of precision if the clock frequency is arbitrary and +cannot be expressed as 10 \ :sup:`exponent`. The format (C) has a similar +issue, but in such case, it is possible to use base=frequency and exponent=-1. + +The formats (D) and (E) allow optimization for conversion to float if the base +is 2 and to decimal.Decimal if the base is 10. + +The format (A) supports arbitrary precision, is simple (only two fields), only +requires a simple division to get the floating point value, and is already used +by float.as_integer_ratio(). + +To simplify the implementation (especially if implemented in C to avoid integer +overflow), it may be possible to accept numerator bigger than the denominator +(e.g. floatpart bigger than base \ :sup:`exponent` for the format (C)), and +normalize the tuple later. + +Tuple of integers have been rejected because they don't support arithmetic +operations. + +.. note:: + On Windows, the ``QueryPerformanceCounter()`` clock uses the frequency of + the processor which is an arbitrary number and can be read using + ``QueryPerformanceFrequency()``. timespec structure ------------------ -- Repository URL: http://hg.python.org/peps From python-checkins at python.org Fri Feb 17 14:17:46 2012 From: python-checkins at python.org (nick.coghlan) Date: Fri, 17 Feb 2012 14:17:46 +0100 Subject: [Python-checkins] =?utf8?q?cpython=3A_Change_the_python3_hardlink?= =?utf8?q?_to_a_symlink=2C_and_correct_some_misuse_of_the_PYTHON?= Message-ID: http://hg.python.org/cpython/rev/dc721f28f168 changeset: 74997:dc721f28f168 parent: 74995:c1a07c8092f7 user: Nick Coghlan date: Fri Feb 17 23:17:34 2012 +1000 summary: Change the python3 hardlink to a symlink, and correct some misuse of the PYTHON var in the makefile files: Makefile.pre.in | 8 ++++---- 1 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Makefile.pre.in b/Makefile.pre.in --- a/Makefile.pre.in +++ b/Makefile.pre.in @@ -858,7 +858,7 @@ 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)); \ @@ -879,11 +879,11 @@ 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); \ -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Fri Feb 17 15:27:20 2012 From: python-checkins at python.org (brett.cannon) Date: Fri, 17 Feb 2012 15:27:20 +0100 Subject: [Python-checkins] =?utf8?q?cpython=3A_Have_importlib_use_os=2Erep?= =?utf8?q?lace=28=29_for_atomic_renaming=2E?= Message-ID: http://hg.python.org/cpython/rev/de6703671386 changeset: 74998:de6703671386 user: Brett Cannon date: Fri Feb 17 09:26:53 2012 -0500 summary: Have importlib use os.replace() for atomic renaming. Closes issue #13961. Thanks to Charles-Fran?ois Natali for the patch. files: Lib/importlib/_bootstrap.py | 23 ++++++----------------- Misc/NEWS | 2 ++ 2 files changed, 8 insertions(+), 17 deletions(-) diff --git a/Lib/importlib/_bootstrap.py b/Lib/importlib/_bootstrap.py --- a/Lib/importlib/_bootstrap.py +++ b/Lib/importlib/_bootstrap.py @@ -137,26 +137,16 @@ def _write_atomic(path, data): - """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.""" - # Renaming should be atomic on most platforms (including Windows). - # Under Windows, the limitation is that we can't rename() to an existing - # path, while POSIX will overwrite it. But here we don't really care - # if there is a glimpse of time during which the final pyc file doesn't - # exist. + """Function to write data to a path atomically.""" # 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, 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) - try: - _os.rename(path_tmp, path) - except FileExistsError: - # Windows (if we had access to MoveFileEx, we could overwrite) - _os.unlink(path) - _os.rename(path_tmp, path) + _os.replace(path_tmp, path) except OSError: try: _os.unlink(path_tmp) @@ -602,9 +592,8 @@ return try: _write_atomic(path, data) - except (PermissionError, FileExistsError): - # Don't worry if you can't write bytecode or someone is writing - # it at the same time. + except PermissionError: + # Don't worry if you can't write bytecode. pass diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -466,6 +466,8 @@ Library ------- +- Issue #13961: Move importlib over to using os.replace() for atomic renaming. + - Do away with ambiguous level values (as suggested by PEP 328) in importlib.__import__() by raising ValueError when level < 0. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Fri Feb 17 15:38:04 2012 From: python-checkins at python.org (brett.cannon) Date: Fri, 17 Feb 2012 15:38:04 +0100 Subject: [Python-checkins] =?utf8?q?cpython=3A_Have_importlib=2Etest_use_a?= =?utf8?q?rgparse_instead_of_some_hacked_up_solution=2E?= Message-ID: http://hg.python.org/cpython/rev/688b2a21c392 changeset: 74999:688b2a21c392 user: Brett Cannon date: Fri Feb 17 09:37:39 2012 -0500 summary: Have importlib.test use argparse instead of some hacked up solution. files: Lib/importlib/test/__main__.py | 11 ++++++++--- 1 files changed, 8 insertions(+), 3 deletions(-) diff --git a/Lib/importlib/test/__main__.py b/Lib/importlib/test/__main__.py --- a/Lib/importlib/test/__main__.py +++ b/Lib/importlib/test/__main__.py @@ -4,19 +4,24 @@ builtins.__import__ instead of importlib.__import__. """ +import argparse from importlib.test.import_ import util import os.path from test.support import run_unittest -import sys import unittest def test_main(): + 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 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)) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Fri Feb 17 15:47:06 2012 From: python-checkins at python.org (brett.cannon) Date: Fri, 17 Feb 2012 15:47:06 +0100 Subject: [Python-checkins] =?utf8?q?cpython=3A_Optimize_importlib=27s_case?= =?utf8?q?-sensitivity_check_by_wasting_as_little_time_as?= Message-ID: http://hg.python.org/cpython/rev/e477832212b9 changeset: 75000:e477832212b9 user: Brett Cannon date: Fri Feb 17 09:46:48 2012 -0500 summary: Optimize importlib's case-sensitivity check by wasting as little time as possible under case-sensitive OSs. files: Lib/importlib/_bootstrap.py | 36 +++++++++++++++--------- 1 files changed, 23 insertions(+), 13 deletions(-) diff --git a/Lib/importlib/_bootstrap.py b/Lib/importlib/_bootstrap.py --- a/Lib/importlib/_bootstrap.py +++ b/Lib/importlib/_bootstrap.py @@ -19,28 +19,33 @@ # Bootstrap-related code ###################################################### -# TODO: when not on any of these platforms, replace _case_ok() w/ -# ``lambda x,y: True``. -CASE_OK_PLATFORMS = 'win', 'cygwin', 'darwin' +CASE_INSENSITIVE_PLATFORMS = 'win', 'cygwin', 'darwin' -def _case_ok(directory, check): - """Check if the directory contains something matching 'check' - case-sensitively when running on Windows or OS X. +def _case_insensitive_ok(directory, check): + """Check if the directory contains something matching 'check' exists in the + directory. - If running on Window or OS X and PYTHONCASEOK is a defined environment - variable then no case-sensitive check is performed. No check is done to see - if what is being checked for exists, so if the platform is not Windows or - OS X then assume the case is fine. + If PYTHONCASEOK is a defined environment variable then skip the + case-sensitivity check. """ - if (any(map(sys.platform.startswith, CASE_OK_PLATFORMS)) and - b'PYTHONCASEOK' not in _os.environ): + if b'PYTHONCASEOK' not in _os.environ: if not directory: directory = '.' return check in _os.listdir(directory) else: return True +def _case_sensitive_ok(directory, check): + """Under case-sensitive filesystems always assume the case matches. + + Since other code does the file existence check, that subsumes a + case-sensitivity check. + + """ + return True + +_case_ok = None # TODO: Expose from marshal @@ -1055,7 +1060,7 @@ modules, those two modules must be explicitly passed in. """ - global imp, sys + global _case_ok, imp, sys imp = imp_module sys = sys_module @@ -1089,6 +1094,11 @@ setattr(self_module, '_os', os_module) setattr(self_module, 'path_sep', path_sep) + if sys_module.platform in CASE_INSENSITIVE_PLATFORMS: + _case_ok = _case_insensitive_ok + else: + _case_ok = _case_sensitive_ok + def _install(sys_module, imp_module): """Install importlib as the implementation of import. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Fri Feb 17 16:44:46 2012 From: python-checkins at python.org (brett.cannon) Date: Fri, 17 Feb 2012 16:44:46 +0100 Subject: [Python-checkins] =?utf8?q?cpython=3A_Fix_importlib=2Etest=2E=5F?= =?utf8?q?=5Fmain=5F=5F_to_only_worry_about_command-line_flags_when?= Message-ID: http://hg.python.org/cpython/rev/35c514368276 changeset: 75001:35c514368276 user: Brett Cannon date: Fri Feb 17 10:44:24 2012 -0500 summary: Fix importlib.test.__main__ to only worry about command-line flags when directly executed. files: Lib/importlib/test/__main__.py | 17 +++++++++-------- 1 files changed, 9 insertions(+), 8 deletions(-) diff --git a/Lib/importlib/test/__main__.py b/Lib/importlib/test/__main__.py --- a/Lib/importlib/test/__main__.py +++ b/Lib/importlib/test/__main__.py @@ -4,7 +4,6 @@ builtins.__import__ instead of importlib.__import__. """ -import argparse from importlib.test.import_ import util import os.path from test.support import run_unittest @@ -12,6 +11,15 @@ def test_main(): + start_dir = os.path.dirname(__file__) + top_dir = os.path.dirname(os.path.dirname(start_dir)) + test_loader = unittest.TestLoader() + run_unittest(test_loader.discover(start_dir, top_level_dir=top_dir)) + + +if __name__ == '__main__': + import argparse + parser = argparse.ArgumentParser(description='Execute the importlib test ' 'suite') parser.add_argument('-b', '--builtin', action='store_true', default=False, @@ -19,11 +27,4 @@ args = parser.parse_args() if args.builtin: util.using___import__ = True - start_dir = os.path.dirname(__file__) - top_dir = os.path.dirname(os.path.dirname(start_dir)) - test_loader = unittest.TestLoader() - run_unittest(test_loader.discover(start_dir, top_level_dir=top_dir)) - - -if __name__ == '__main__': test_main() -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Fri Feb 17 18:14:44 2012 From: python-checkins at python.org (eric.araujo) Date: Fri, 17 Feb 2012 18:14:44 +0100 Subject: [Python-checkins] =?utf8?q?cpython=3A_Add_test_for_packaging=2Eut?= =?utf8?b?aWwuc2V0X3BsYXRmb3JtICgjMTM5NzQpLg==?= Message-ID: http://hg.python.org/cpython/rev/b380d715651d changeset: 75002:b380d715651d parent: 74972:2cfba214c243 user: ?ric Araujo date: Thu Feb 16 19:32:17 2012 +0100 summary: Add test for packaging.util.set_platform (#13974). Patch by Tshepang Lekhonkhobe. files: Lib/packaging/tests/test_util.py | 5 +++++ 1 files changed, 5 insertions(+), 0 deletions(-) diff --git a/Lib/packaging/tests/test_util.py b/Lib/packaging/tests/test_util.py --- a/Lib/packaging/tests/test_util.py +++ b/Lib/packaging/tests/test_util.py @@ -173,6 +173,11 @@ sys.stdout = self.old_stdout sys.stderr = self.old_stderr + def test_set_platform(self): + self.addCleanup(util.set_platform, util.get_platform()) + util.set_platform("fake") + self.assertEqual("fake", util.get_platform()) + def test_convert_path(self): # linux/mac os.sep = '/' -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Fri Feb 17 18:14:45 2012 From: python-checkins at python.org (eric.araujo) Date: Fri, 17 Feb 2012 18:14:45 +0100 Subject: [Python-checkins] =?utf8?q?cpython=3A_Fix_code_I_unwittingly_brok?= =?utf8?q?e_in_b0e2d6592a1f_=28=2314038=29?= Message-ID: http://hg.python.org/cpython/rev/697e934ade19 changeset: 75003:697e934ade19 user: ?ric Araujo date: Fri Feb 17 17:26:30 2012 +0100 summary: Fix code I unwittingly broke in b0e2d6592a1f (#14038) files: Lib/packaging/tests/support.py | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Lib/packaging/tests/support.py b/Lib/packaging/tests/support.py --- a/Lib/packaging/tests/support.py +++ b/Lib/packaging/tests/support.py @@ -342,7 +342,7 @@ srcdir = sysconfig.get_config_var('projectbase') path = os.path.join(os.getcwd(), srcdir, 'Modules', 'xxmodule.c') else: - os.path.join(os.path.dirname(__file__), 'xxmodule.c') + path = os.path.join(os.path.dirname(__file__), 'xxmodule.c') if os.path.exists(path): return path -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Fri Feb 17 18:14:54 2012 From: python-checkins at python.org (eric.araujo) Date: Fri, 17 Feb 2012 18:14:54 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_default_-=3E_default?= =?utf8?q?=29=3A_Branch_merge?= Message-ID: http://hg.python.org/cpython/rev/269fde276d7a changeset: 75004:269fde276d7a parent: 75001:35c514368276 parent: 75003:697e934ade19 user: ?ric Araujo date: Fri Feb 17 18:10:11 2012 +0100 summary: Branch merge files: Lib/packaging/tests/support.py | 2 +- Lib/packaging/tests/test_util.py | 5 +++++ 2 files changed, 6 insertions(+), 1 deletions(-) diff --git a/Lib/packaging/tests/support.py b/Lib/packaging/tests/support.py --- a/Lib/packaging/tests/support.py +++ b/Lib/packaging/tests/support.py @@ -342,7 +342,7 @@ srcdir = sysconfig.get_config_var('projectbase') path = os.path.join(os.getcwd(), srcdir, 'Modules', 'xxmodule.c') else: - os.path.join(os.path.dirname(__file__), 'xxmodule.c') + path = os.path.join(os.path.dirname(__file__), 'xxmodule.c') if os.path.exists(path): return path diff --git a/Lib/packaging/tests/test_util.py b/Lib/packaging/tests/test_util.py --- a/Lib/packaging/tests/test_util.py +++ b/Lib/packaging/tests/test_util.py @@ -173,6 +173,11 @@ sys.stdout = self.old_stdout sys.stderr = self.old_stderr + def test_set_platform(self): + self.addCleanup(util.set_platform, util.get_platform()) + util.set_platform("fake") + self.assertEqual("fake", util.get_platform()) + def test_convert_path(self): # linux/mac os.sep = '/' -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Fri Feb 17 18:51:09 2012 From: python-checkins at python.org (antoine.pitrou) Date: Fri, 17 Feb 2012 18:51:09 +0100 Subject: [Python-checkins] =?utf8?q?cpython=3A_Try_to_really_fix_compilati?= =?utf8?q?on_failures_of_the_=5Fssl_module_under_very_old?= Message-ID: http://hg.python.org/cpython/rev/06ed9b3f02af changeset: 75005:06ed9b3f02af user: Antoine Pitrou date: Fri Feb 17 18:47:54 2012 +0100 summary: Try to really fix compilation failures of the _ssl module under very old OpenSSLs. files: Lib/ssl.py | 6 +++++- Modules/_ssl.c | 6 ++++++ 2 files changed, 11 insertions(+), 1 deletions(-) diff --git a/Lib/ssl.py b/Lib/ssl.py --- a/Lib/ssl.py +++ b/Lib/ssl.py @@ -68,12 +68,16 @@ from _ssl import CERT_NONE, CERT_OPTIONAL, CERT_REQUIRED from _ssl import ( OP_ALL, OP_NO_SSLv2, OP_NO_SSLv3, OP_NO_TLSv1, - OP_CIPHER_SERVER_PREFERENCE, OP_SINGLE_DH_USE, OP_SINGLE_ECDH_USE, + 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, diff --git a/Modules/_ssl.c b/Modules/_ssl.c --- a/Modules/_ssl.c +++ b/Modules/_ssl.c @@ -145,6 +145,12 @@ # 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 + + typedef struct { PyObject_HEAD SSL_CTX *ctx; -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Fri Feb 17 20:47:54 2012 From: python-checkins at python.org (petri.lehtinen) Date: Fri, 17 Feb 2012 20:47:54 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=283=2E2=29=3A_Fix_a_variable_?= =?utf8?q?scoping_error_in_an_sqlite3_test?= Message-ID: http://hg.python.org/cpython/rev/bf7226719aec changeset: 75006:bf7226719aec branch: 3.2 parent: 74987:74b2da95c6be user: Petri Lehtinen date: Fri Feb 17 21:30:55 2012 +0200 summary: Fix a variable scoping error in an sqlite3 test Closes #11689. files: Lib/sqlite3/test/hooks.py | 1 + Misc/NEWS | 2 ++ 2 files changed, 3 insertions(+), 0 deletions(-) diff --git a/Lib/sqlite3/test/hooks.py b/Lib/sqlite3/test/hooks.py --- a/Lib/sqlite3/test/hooks.py +++ b/Lib/sqlite3/test/hooks.py @@ -168,6 +168,7 @@ con = sqlite.connect(":memory:") action = 0 def progress(): + nonlocal action action = 1 return 0 con.set_progress_handler(progress, 1) diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -477,6 +477,8 @@ 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. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Fri Feb 17 20:47:57 2012 From: python-checkins at python.org (petri.lehtinen) Date: Fri, 17 Feb 2012 20:47:57 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=282=2E7=29=3A_Fix_a_variable_?= =?utf8?q?scoping_error_in_an_sqlite3_test?= Message-ID: http://hg.python.org/cpython/rev/ce023c95db9f changeset: 75007:ce023c95db9f branch: 2.7 parent: 74996:a65a71aa9436 user: Petri Lehtinen date: Fri Feb 17 21:34:41 2012 +0200 summary: Fix a variable scoping error in an sqlite3 test Initial patch by Torsten Landschoff. Closes #11689. files: Lib/sqlite3/test/hooks.py | 6 +++--- Misc/ACKS | 1 + Misc/NEWS | 3 +++ 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/Lib/sqlite3/test/hooks.py b/Lib/sqlite3/test/hooks.py --- a/Lib/sqlite3/test/hooks.py +++ b/Lib/sqlite3/test/hooks.py @@ -166,14 +166,14 @@ Test that setting the progress handler to None clears the previously set handler. """ con = sqlite.connect(":memory:") - action = 0 + action = [] def progress(): - action = 1 + action.append(1) return 0 con.set_progress_handler(progress, 1) con.set_progress_handler(None, 1) con.execute("select 1 union select 2 union select 3").fetchall() - self.assertEqual(action, 0, "progress handler was not cleared") + self.assertEqual(len(action), 0, "progress handler was not cleared") def suite(): collation_suite = unittest.makeSuite(CollationTests, "Check") diff --git a/Misc/ACKS b/Misc/ACKS --- a/Misc/ACKS +++ b/Misc/ACKS @@ -475,6 +475,7 @@ Kirill Kuzminykh (?????? ?????????) Ross Lagerwall Cameron Laird +Torsten Landschoff ?ukasz Langa Tino Lange Andrew Langmead diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -526,6 +526,9 @@ Tests ----- +- Issue #11689: Fix a variable scoping error in an sqlite3 test. + Initial patch by Torsten Landschoff. + - Issue #13304: Skip test case if user site-packages disabled (-s or PYTHONNOUSERSITE). (Patch by Carl Meyer) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Fri Feb 17 20:47:57 2012 From: python-checkins at python.org (petri.lehtinen) Date: Fri, 17 Feb 2012 20:47:57 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_3=2E2_-=3E_default=29?= =?utf8?q?=3A_Merge_branch_=273=2E2=27?= Message-ID: http://hg.python.org/cpython/rev/6b834e3c0882 changeset: 75008:6b834e3c0882 parent: 75005:06ed9b3f02af parent: 75006:bf7226719aec user: Petri Lehtinen date: Fri Feb 17 21:36:52 2012 +0200 summary: Merge branch '3.2' Closes #11689. files: Lib/sqlite3/test/hooks.py | 1 + Misc/NEWS | 2 ++ 2 files changed, 3 insertions(+), 0 deletions(-) diff --git a/Lib/sqlite3/test/hooks.py b/Lib/sqlite3/test/hooks.py --- a/Lib/sqlite3/test/hooks.py +++ b/Lib/sqlite3/test/hooks.py @@ -168,6 +168,7 @@ con = sqlite.connect(":memory:") action = 0 def progress(): + nonlocal action action = 1 return 0 con.set_progress_handler(progress, 1) diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -2042,6 +2042,8 @@ 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. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sat Feb 18 01:03:50 2012 From: python-checkins at python.org (ezio.melotti) Date: Sat, 18 Feb 2012 01:03:50 +0100 Subject: [Python-checkins] =?utf8?b?Y3B5dGhvbiAoMi43KTogIzE0MDIwOiBpbXBy?= =?utf8?q?ove_HTMLParser_documentation=2E?= Message-ID: http://hg.python.org/cpython/rev/7052eb923fb8 changeset: 75009:7052eb923fb8 branch: 2.7 parent: 75007:ce023c95db9f user: Ezio Melotti date: Sat Feb 18 01:46:04 2012 +0200 summary: #14020: improve HTMLParser documentation. files: Doc/library/htmlparser.rst | 296 ++++++++++++++++++------ 1 files changed, 217 insertions(+), 79 deletions(-) diff --git a/Doc/library/htmlparser.rst b/Doc/library/htmlparser.rst --- a/Doc/library/htmlparser.rst +++ b/Doc/library/htmlparser.rst @@ -22,7 +22,7 @@ -------------- -This module defines a class :class:`HTMLParser` which serves as the basis for +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. Unlike the parser in :mod:`htmllib`, this parser is not based on the SGML parser in :mod:`sgmllib`. @@ -30,11 +30,12 @@ .. class:: HTMLParser() - The :class:`HTMLParser` class is instantiated without arguments. + An :class:`.HTMLParser` instance is fed HTML data and calls handler methods + when start tags, end tags, text, comments, and other markup elements are + encountered. The user should subclass :class:`.HTMLParser` and override its + methods to implement the desired behavior. - An :class:`HTMLParser` instance is fed HTML data and calls handler functions when tags - begin and end. The :class:`HTMLParser` class is meant to be overridden by the - user to provide a desired behavior. + The :class:`.HTMLParser` class is instantiated without arguments. Unlike the parser in :mod:`htmllib`, this parser does not check that end tags match start tags or call the end-tag handler for elements which are closed @@ -42,22 +43,59 @@ An exception is defined as well: - .. exception:: HTMLParseError - Exception raised by the :class:`HTMLParser` class when it encounters an error - while parsing. This exception provides three attributes: :attr:`msg` is a brief - message explaining the error, :attr:`lineno` is the number of the line on which - the broken construct was detected, and :attr:`offset` is the number of + :class:`.HTMLParser` is able to handle broken markup, but in some cases it + might raise this exception when it encounters an error while parsing. + This exception provides three attributes: :attr:`msg` is a brief + message explaining the error, :attr:`lineno` is the number of the line on + which the broken construct was detected, and :attr:`offset` is the number of characters into the line at which the construct starts. -:class:`HTMLParser` instances have the following methods: +Example HTML Parser Application +------------------------------- -.. method:: HTMLParser.reset() +As a basic example, below is a simple HTML parser that uses the +:class:`.HTMLParser` class to print out start tags, end tags and data +as they are encountered:: - Reset the instance. Loses all unprocessed data. This is called implicitly at - instantiation time. + from HTMLParser import HTMLParser + + # create a subclass and override the handler methods + class MyHTMLParser(HTMLParser): + def handle_starttag(self, tag, attrs): + print "Encountered a start tag:", tag + def handle_endtag(self, tag): + print "Encountered an end tag :", tag + def handle_data(self, data): + print "Encountered some data :", data + + # instantiate the parser and fed it some HTML + parser = MyHTMLParser() + parser.feed('Test' + '

Parse me!

') + +The output will then be:: + + Encountered a start tag: html + Encountered a start tag: head + Encountered a start tag: title + Encountered some data : Test + Encountered an end tag : title + Encountered an end tag : head + Encountered a start tag: body + Encountered a start tag: h1 + Encountered some data : Parse me! + Encountered an end tag : h1 + Encountered an end tag : body + Encountered an end tag : html + + +:class:`.HTMLParser` Methods +---------------------------- + +:class:`.HTMLParser` instances have the following methods: .. method:: HTMLParser.feed(data) @@ -73,7 +111,13 @@ Force processing of all buffered data as if it were followed by an end-of-file mark. This method may be redefined by a derived class to define additional processing at the end of the input, but the redefined version should always call - the :class:`HTMLParser` base class method :meth:`close`. + the :class:`.HTMLParser` base class method :meth:`close`. + + +.. method:: HTMLParser.reset() + + Reset the instance. Loses all unprocessed data. This is called implicitly at + instantiation time. .. method:: HTMLParser.getpos() @@ -89,22 +133,34 @@ attributes can be preserved, etc.). +The following methods are called when data or markup elements are encountered +and they are meant to be overridden in a subclass. The base class +implementations do nothing (except for :meth:`~HTMLParser.handle_startendtag`): + + .. method:: HTMLParser.handle_starttag(tag, attrs) - This method is called to handle the start of a tag. It is intended to be - overridden by a derived class; the base class implementation does nothing. + This method is called to handle the start of a tag (e.g. ``
``). + + The *tag* argument is the name of the tag converted to lower case. .. method:: HTMLParser.handle_startendtag(tag, attrs) @@ -115,94 +171,175 @@ implementation simply calls :meth:`handle_starttag` and :meth:`handle_endtag`. -.. method:: HTMLParser.handle_endtag(tag) - - This method is called to handle the end tag of an element. It is intended to be - overridden by a derived class; the base class implementation does nothing. The - *tag* argument is the name of the tag converted to lower case. - - .. method:: HTMLParser.handle_data(data) - This method is called to process arbitrary data (e.g. the content of - ```` and ````). It is intended to be - overridden by a derived class; the base class implementation does nothing. + This method is called to process arbitrary data (e.g. text nodes and the + content of ```` and ````). + + +.. method:: HTMLParser.handle_entityref(name) + + This method is called to process a named character reference of the form + ``&name;`` (e.g. ``>``), where *name* is a general entity reference + (e.g. ``'gt'``). .. method:: HTMLParser.handle_charref(name) - This method is called to process a character reference of the form ``&#ref;``. - It is intended to be overridden by a derived class; the base class - implementation does nothing. - - -.. method:: HTMLParser.handle_entityref(name) - - This method is called to process a general entity reference of the form - ``&name;`` where *name* is an general entity reference. It is intended to be - overridden by a derived class; the base class implementation does nothing. + This method is called to process decimal and hexadecimal numeric character + references of the form ``&#NNN;`` and ``&#xNNN;``. For example, the decimal + equivalent for ``>`` is ``>``, whereas the hexadecimal is ``>``; + in this case the method will receive ``'62'`` or ``'x3E'``. .. method:: HTMLParser.handle_comment(data) - This method is called when a comment is encountered. The *comment* argument is - a string containing the text between the ``--`` and ``--`` delimiters, but not - the delimiters themselves. For example, the comment ```` will cause - this method to be called with the argument ``'text'``. It is intended to be - overridden by a derived class; the base class implementation does nothing. + This method is called when a comment is encountered (e.g. ````). + + For example, the comment ```` will cause this method to be + called with the argument ``' comment '``. + + The content of Internet Explorer conditional comments (condcoms) will also be + sent to this method, so, for ````, + this method will receive ``'[if IE 9]>IE-specific content``). + The *decl* parameter will be the entire contents of the declaration inside - the ```` markup. It is intended to be overridden by a derived class; - the base class implementation does nothing. + the ```` markup (e.g. ``'DOCTYPE html'``). + + +.. method:: HTMLParser.handle_pi(data) + + This method is called when a processing instruction is encountered. The *data* + parameter will contain the entire processing instruction. For example, for the + processing instruction ````, this method would be called as + ``handle_pi("proc color='red'")``. + + .. note:: + + The :class:`.HTMLParser` class uses the SGML syntactic rules for processing + instructions. An XHTML processing instruction using the trailing ``'?'`` will + cause the ``'?'`` to be included in *data*. .. method:: HTMLParser.unknown_decl(data) - Method called when an unrecognized SGML declaration is read by the parser. + This method is called when an unrecognized declaration is read by the parser. + The *data* parameter will be the entire contents of the declaration inside - the ```` markup. It is sometimes useful to be overridden by a - derived class; the base class implementation throws an :exc:`HTMLParseError`. + the ```` markup. It is sometimes useful to be overridden by a + derived class. -.. method:: HTMLParser.handle_pi(data) +.. _htmlparser-examples: - Method called when a processing instruction is encountered. The *data* - parameter will contain the entire processing instruction. For example, for the - processing instruction ````, this method would be called as - ``handle_pi("proc color='red'")``. It is intended to be overridden by a derived - class; the base class implementation does nothing. +Examples +-------- - .. note:: - - The :class:`HTMLParser` class uses the SGML syntactic rules for processing - instructions. An XHTML processing instruction using the trailing ``'?'`` will - cause the ``'?'`` to be included in *data*. - - -.. _htmlparser-example: - -Example HTML Parser Application -------------------------------- - -As a basic example, below is a simple HTML parser that uses the -:class:`HTMLParser` class to print out start tags, end tags and data -as they are encountered:: +The following class implements a parser that will be used to illustrate more +examples:: from HTMLParser import HTMLParser + from htmlentitydefs import name2codepoint class MyHTMLParser(HTMLParser): def handle_starttag(self, tag, attrs): - print "Encountered a start tag:", tag + print "Start tag:", tag + for attr in attrs: + print " attr:", attr def handle_endtag(self, tag): - print "Encountered an end tag:", tag + print "End tag :", tag def handle_data(self, data): - print "Encountered some data:", data - + print "Data :", data + def handle_comment(self, data): + print "Comment :", data + def handle_entityref(self, name): + c = unichr(name2codepoint[name]) + print "Named ent:", c + def handle_charref(self, name): + if name.startswith('x'): + c = unichr(int(name[1:], 16)) + else: + c = unichr(int(name)) + print "Num ent :", c + def handle_decl(self, data): + print "Decl :", data parser = MyHTMLParser() - parser.feed('Test' - '

Parse me!

') + +Parsing a doctype:: + + >>> parser.feed('') + Decl : DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd" + +Parsing an element with a few attributes and a title:: + + >>> parser.feed('The Python logo') + Start tag: img + attr: ('src', 'python-logo.png') + attr: ('alt', 'The Python logo') + >>> + >>> parser.feed('

Python

') + Start tag: h1 + Data : Python + End tag : h1 + +The content of ``script`` and ``style`` elements is returned as is, without +further parsing:: + + >>> parser.feed('') + Start tag: style + attr: ('type', 'text/css') + Data : #python { color: green } + End tag : style + >>> + >>> parser.feed('') + Start tag: script + attr: ('type', 'text/javascript') + Data : alert("hello!"); + End tag : script + +Parsing comments:: + + >>> parser.feed('' + ... '') + Comment : a comment + Comment : [if IE 9]>IE-specific content'``):: + + >>> parser.feed('>>>') + Named ent: > + Num ent : > + Num ent : > + +Feeding incomplete chunks to :meth:`~HTMLParser.feed` works, but +:meth:`~HTMLParser.handle_data` might be called more than once:: + + >>> for chunk in ['buff', 'ered ', 'text']: + ... parser.feed(chunk) + ... + Start tag: span + Data : buff + Data : ered + Data : text + End tag : span + +Parsing invalid HTML (e.g. unquoted attributes) also works:: + + >>> parser.feed('

tag soup

') + Start tag: p + Start tag: a + attr: ('class', 'link') + attr: ('href', '#main') + Data : tag soup + End tag : p + End tag : a -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sat Feb 18 01:03:51 2012 From: python-checkins at python.org (ezio.melotti) Date: Sat, 18 Feb 2012 01:03:51 +0100 Subject: [Python-checkins] =?utf8?b?Y3B5dGhvbiAoMy4yKTogIzE0MDIwOiBpbXBy?= =?utf8?q?ove_HTMLParser_documentation=2E?= Message-ID: http://hg.python.org/cpython/rev/569566cbfd13 changeset: 75010:569566cbfd13 branch: 3.2 parent: 75006:bf7226719aec user: Ezio Melotti date: Sat Feb 18 02:01:36 2012 +0200 summary: #14020: improve HTMLParser documentation. files: Doc/library/html.parser.rst | 277 ++++++++++++++++++----- 1 files changed, 208 insertions(+), 69 deletions(-) diff --git a/Doc/library/html.parser.rst b/Doc/library/html.parser.rst --- a/Doc/library/html.parser.rst +++ b/Doc/library/html.parser.rst @@ -19,14 +19,15 @@ .. class:: HTMLParser(strict=True) Create a parser instance. If *strict* is ``True`` (the default), invalid - html results in :exc:`~html.parser.HTMLParseError` exceptions [#]_. If + 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. + the intention of any invalid HTML it encounters, similar to the way most + browsers do. Using ``strict=False`` is advised. - An :class:`HTMLParser` instance is fed HTML data and calls handler functions when tags - begin and end. The :class:`HTMLParser` class is meant to be overridden by the - user to provide a desired behavior. + An :class:`.HTMLParser` instance is fed HTML data and calls handler methods + when start tags, end tags, text, comments, and other markup elements are + encountered. The user should subclass :class:`.HTMLParser` and override its + methods to implement the desired behavior. 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. @@ -39,25 +40,61 @@ .. exception:: HTMLParseError Exception raised by the :class:`HTMLParser` class when it encounters an error - while parsing. This exception provides three attributes: :attr:`msg` is a brief - message explaining the error, :attr:`lineno` is the number of the line on which - the broken construct was detected, and :attr:`offset` is the number of - characters into the line at which the construct starts. + while parsing and *strict* is ``True``. This exception provides three + attributes: :attr:`msg` is a brief message explaining the error, + :attr:`lineno` is the number of the line on which the broken construct was + detected, and :attr:`offset` is the number of characters into the line at + which the construct starts. + + +Example HTML Parser Application +------------------------------- + +As a basic example, below is a simple HTML parser that uses the +:class:`HTMLParser` class to print out start tags, end tags, and data +as they are encountered:: + + from html.parser import HTMLParser + + class MyHTMLParser(HTMLParser): + def handle_starttag(self, tag, attrs): + print("Encountered a start tag:", tag) + def handle_endtag(self, tag): + print("Encountered an end tag :", tag) + def handle_data(self, data): + print("Encountered some data :", data) + + parser = MyHTMLParser(strict=False) + parser.feed('Test' + '

Parse me!

') + +The output will then be:: + + Encountered a start tag: html + Encountered a start tag: head + Encountered a start tag: title + Encountered some data : Test + Encountered an end tag : title + Encountered an end tag : head + Encountered a start tag: body + Encountered a start tag: h1 + Encountered some data : Parse me! + Encountered an end tag : h1 + Encountered an end tag : body + Encountered an end tag : html + + +:class:`.HTMLParser` Methods +---------------------------- :class:`HTMLParser` instances have the following methods: -.. method:: HTMLParser.reset() - - Reset the instance. Loses all unprocessed data. This is called implicitly at - instantiation time. - - .. method:: HTMLParser.feed(data) Feed some text to the parser. It is processed insofar as it consists of complete elements; incomplete data is buffered until more data is fed or - :meth:`close` is called. + :meth:`close` is called. *data* must be :class:`str`. .. method:: HTMLParser.close() @@ -68,6 +105,12 @@ the :class:`HTMLParser` base class method :meth:`close`. +.. method:: HTMLParser.reset() + + Reset the instance. Loses all unprocessed data. This is called implicitly at + instantiation time. + + .. method:: HTMLParser.getpos() Return current line number and offset. @@ -81,23 +124,35 @@ attributes can be preserved, etc.). +The following methods are called when data or markup elements are encountered +and they are meant to be overridden in a subclass. The base class +implementations do nothing (except for :meth:`~HTMLParser.handle_startendtag`): + + .. method:: HTMLParser.handle_starttag(tag, attrs) - This method is called to handle the start of a tag. It is intended to be - overridden by a derived class; the base class implementation does nothing. + This method is called to handle the start of a tag (e.g. ``
``). The *tag* argument is the name of the tag converted to lower case. The *attrs* argument is a list of ``(name, value)`` pairs containing the attributes found inside the tag's ``<>`` brackets. The *name* will be translated to lower case, and quotes in the *value* have been removed, and character and entity references - have been replaced. For instance, for the tag ````, this method would be called as - ``handle_starttag('a', [('href', 'http://www.cwi.nl/')])``. + have been replaced. + + For instance, for the tag ````, this method + would be called as ``handle_starttag('a', [('href', 'http://www.cwi.nl/')])``. All entity references from :mod:`html.entities` are replaced in the attribute values. +.. method:: HTMLParser.handle_endtag(tag) + + This method is called to handle the end tag of an element (e.g. ``
``). + + The *tag* argument is the name of the tag converted to lower case. + + .. method:: HTMLParser.handle_startendtag(tag, attrs) Similar to :meth:`handle_starttag`, but called when the parser encounters an @@ -106,57 +161,46 @@ implementation simply calls :meth:`handle_starttag` and :meth:`handle_endtag`. -.. method:: HTMLParser.handle_endtag(tag) - - This method is called to handle the end tag of an element. It is intended to be - overridden by a derived class; the base class implementation does nothing. The - *tag* argument is the name of the tag converted to lower case. - - .. method:: HTMLParser.handle_data(data) - This method is called to process arbitrary data (e.g. the content of - ```` and ````). It is intended to be - overridden by a derived class; the base class implementation does nothing. + This method is called to process arbitrary data (e.g. text nodes and the + content of ```` and ````). + + +.. method:: HTMLParser.handle_entityref(name) + + This method is called to process a named character reference of the form + ``&name;`` (e.g. ``>``), where *name* is a general entity reference + (e.g. ``'gt'``). .. method:: HTMLParser.handle_charref(name) - This method is called to process a character reference of the form ``&#ref;``. - It is intended to be overridden by a derived class; the base class - implementation does nothing. - - -.. method:: HTMLParser.handle_entityref(name) - - This method is called to process a general entity reference of the form - ``&name;`` where *name* is an general entity reference. It is intended to be - overridden by a derived class; the base class implementation does nothing. + This method is called to process decimal and hexadecimal numeric character + references of the form ``&#NNN;`` and ``&#xNNN;``. For example, the decimal + equivalent for ``>`` is ``>``, whereas the hexadecimal is ``>``; + in this case the method will receive ``'62'`` or ``'x3E'``. .. method:: HTMLParser.handle_comment(data) - This method is called when a comment is encountered. The *comment* argument is - a string containing the text between the ``--`` and ``--`` delimiters, but not - the delimiters themselves. For example, the comment ```` will cause - this method to be called with the argument ``'text'``. It is intended to be - overridden by a derived class; the base class implementation does nothing. + This method is called when a comment is encountered (e.g. ````). + + For example, the comment ```` will cause this method to be + called with the argument ``' comment '``. + + The content of Internet Explorer conditional comments (condcoms) will also be + sent to this method, so, for ````, + this method will receive ``'[if IE 9]>IE-specific content``). + The *decl* parameter will be the entire contents of the declaration inside - the ```` markup. It is intended to be overridden by a derived class; - the base class implementation does nothing. - - -.. method:: HTMLParser.unknown_decl(data) - - Method called when an unrecognized SGML declaration is read by the parser. - The *data* parameter will be the entire contents of the declaration inside - the ```` markup. It is sometimes useful to be overridden by a - derived class; the base class implementation raises an :exc:`HTMLParseError`. + the ```` markup (e.g. ``'DOCTYPE html'``). .. method:: HTMLParser.handle_pi(data) @@ -174,29 +218,123 @@ cause the ``'?'`` to be included in *data*. -.. _htmlparser-example: +.. method:: HTMLParser.unknown_decl(data) -Example HTML Parser Application -------------------------------- + This method is called when an unrecognized declaration is read by the parser. -As a basic example, below is a simple HTML parser that uses the -:class:`HTMLParser` class to print out start tags, end tags, and data -as they are encountered:: + The *data* parameter will be the entire contents of the declaration inside + the ```` markup. It is sometimes useful to be overridden by a + derived class. The base class implementation raises an :exc:`HTMLParseError` + when *strict* is ``True``. + + +.. _htmlparser-examples: + +Examples +-------- + +The following class implements a parser that will be used to illustrate more +examples:: from html.parser import HTMLParser + from html.entities import name2codepoint class MyHTMLParser(HTMLParser): def handle_starttag(self, tag, attrs): - print("Encountered a start tag:", tag) + print("Start tag:", tag) + for attr in attrs: + print(" attr:", attr) def handle_endtag(self, tag): - print("Encountered an end tag:", tag) + print("End tag :", tag) def handle_data(self, data): - print("Encountered some data:", data) + print("Data :", data) + def handle_comment(self, data): + print("Comment :", data) + def handle_entityref(self, name): + c = chr(name2codepoint[name]) + print("Named ent:", c) + def handle_charref(self, name): + if name.startswith('x'): + c = chr(int(name[1:], 16)) + else: + c = chr(int(name)) + print("Num ent :", c) + def handle_decl(self, data): + print("Decl :", data) - parser = MyHTMLParser() - parser.feed('Test' - '

Parse me!

') + parser = MyHTMLParser(strict=False) +Parsing a doctype:: + + >>> parser.feed('') + Decl : DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd" + +Parsing an element with a few attributes and a title:: + + >>> parser.feed('The Python logo') + Start tag: img + attr: ('src', 'python-logo.png') + attr: ('alt', 'The Python logo') + >>> + >>> parser.feed('

Python

') + Start tag: h1 + Data : Python + End tag : h1 + +The content of ``script`` and ``style`` elements is returned as is, without +further parsing:: + + >>> parser.feed('') + Start tag: style + attr: ('type', 'text/css') + Data : #python { color: green } + End tag : style + >>> + >>> parser.feed('') + Start tag: script + attr: ('type', 'text/javascript') + Data : alert("hello!"); + End tag : script + +Parsing comments:: + + >>> parser.feed('' + ... '') + Comment : a comment + Comment : [if IE 9]>IE-specific content'``):: + + >>> parser.feed('>>>') + Named ent: > + Num ent : > + Num ent : > + +Feeding incomplete chunks to :meth:`~HTMLParser.feed` works, but +:meth:`~HTMLParser.handle_data` might be called more than once:: + + >>> for chunk in ['buff', 'ered ', 'text']: + ... parser.feed(chunk) + ... + Start tag: span + Data : buff + Data : ered + Data : text + End tag : span + +Parsing invalid HTML (e.g. unquoted attributes) also works:: + + >>> parser.feed('

tag soup

') + Start tag: p + Start tag: a + attr: ('class', 'link') + attr: ('href', '#main') + Data : tag soup + End tag : p + End tag : a .. rubric:: Footnotes -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sat Feb 18 01:03:52 2012 From: python-checkins at python.org (ezio.melotti) Date: Sat, 18 Feb 2012 01:03:52 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_3=2E2_-=3E_default=29?= =?utf8?q?=3A_=2314020=3A_merge_with_3=2E2=2E?= Message-ID: http://hg.python.org/cpython/rev/1850f45f6169 changeset: 75011:1850f45f6169 parent: 75008:6b834e3c0882 parent: 75010:569566cbfd13 user: Ezio Melotti date: Sat Feb 18 02:03:35 2012 +0200 summary: #14020: merge with 3.2. files: Doc/library/html.parser.rst | 277 ++++++++++++++++++----- 1 files changed, 208 insertions(+), 69 deletions(-) diff --git a/Doc/library/html.parser.rst b/Doc/library/html.parser.rst --- a/Doc/library/html.parser.rst +++ b/Doc/library/html.parser.rst @@ -19,14 +19,15 @@ .. class:: HTMLParser(strict=True) Create a parser instance. If *strict* is ``True`` (the default), invalid - html results in :exc:`~html.parser.HTMLParseError` exceptions [#]_. If + 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. + the intention of any invalid HTML it encounters, similar to the way most + browsers do. Using ``strict=False`` is advised. - An :class:`HTMLParser` instance is fed HTML data and calls handler functions when tags - begin and end. The :class:`HTMLParser` class is meant to be overridden by the - user to provide a desired behavior. + An :class:`.HTMLParser` instance is fed HTML data and calls handler methods + when start tags, end tags, text, comments, and other markup elements are + encountered. The user should subclass :class:`.HTMLParser` and override its + methods to implement the desired behavior. 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. @@ -39,25 +40,61 @@ .. exception:: HTMLParseError Exception raised by the :class:`HTMLParser` class when it encounters an error - while parsing. This exception provides three attributes: :attr:`msg` is a brief - message explaining the error, :attr:`lineno` is the number of the line on which - the broken construct was detected, and :attr:`offset` is the number of - characters into the line at which the construct starts. + while parsing and *strict* is ``True``. This exception provides three + attributes: :attr:`msg` is a brief message explaining the error, + :attr:`lineno` is the number of the line on which the broken construct was + detected, and :attr:`offset` is the number of characters into the line at + which the construct starts. + + +Example HTML Parser Application +------------------------------- + +As a basic example, below is a simple HTML parser that uses the +:class:`HTMLParser` class to print out start tags, end tags, and data +as they are encountered:: + + from html.parser import HTMLParser + + class MyHTMLParser(HTMLParser): + def handle_starttag(self, tag, attrs): + print("Encountered a start tag:", tag) + def handle_endtag(self, tag): + print("Encountered an end tag :", tag) + def handle_data(self, data): + print("Encountered some data :", data) + + parser = MyHTMLParser(strict=False) + parser.feed('Test' + '

Parse me!

') + +The output will then be:: + + Encountered a start tag: html + Encountered a start tag: head + Encountered a start tag: title + Encountered some data : Test + Encountered an end tag : title + Encountered an end tag : head + Encountered a start tag: body + Encountered a start tag: h1 + Encountered some data : Parse me! + Encountered an end tag : h1 + Encountered an end tag : body + Encountered an end tag : html + + +:class:`.HTMLParser` Methods +---------------------------- :class:`HTMLParser` instances have the following methods: -.. method:: HTMLParser.reset() - - Reset the instance. Loses all unprocessed data. This is called implicitly at - instantiation time. - - .. method:: HTMLParser.feed(data) Feed some text to the parser. It is processed insofar as it consists of complete elements; incomplete data is buffered until more data is fed or - :meth:`close` is called. + :meth:`close` is called. *data* must be :class:`str`. .. method:: HTMLParser.close() @@ -68,6 +105,12 @@ the :class:`HTMLParser` base class method :meth:`close`. +.. method:: HTMLParser.reset() + + Reset the instance. Loses all unprocessed data. This is called implicitly at + instantiation time. + + .. method:: HTMLParser.getpos() Return current line number and offset. @@ -81,23 +124,35 @@ attributes can be preserved, etc.). +The following methods are called when data or markup elements are encountered +and they are meant to be overridden in a subclass. The base class +implementations do nothing (except for :meth:`~HTMLParser.handle_startendtag`): + + .. method:: HTMLParser.handle_starttag(tag, attrs) - This method is called to handle the start of a tag. It is intended to be - overridden by a derived class; the base class implementation does nothing. + This method is called to handle the start of a tag (e.g. ``
``). The *tag* argument is the name of the tag converted to lower case. The *attrs* argument is a list of ``(name, value)`` pairs containing the attributes found inside the tag's ``<>`` brackets. The *name* will be translated to lower case, and quotes in the *value* have been removed, and character and entity references - have been replaced. For instance, for the tag ````, this method would be called as - ``handle_starttag('a', [('href', 'http://www.cwi.nl/')])``. + have been replaced. + + For instance, for the tag ````, this method + would be called as ``handle_starttag('a', [('href', 'http://www.cwi.nl/')])``. All entity references from :mod:`html.entities` are replaced in the attribute values. +.. method:: HTMLParser.handle_endtag(tag) + + This method is called to handle the end tag of an element (e.g. ``
``). + + The *tag* argument is the name of the tag converted to lower case. + + .. method:: HTMLParser.handle_startendtag(tag, attrs) Similar to :meth:`handle_starttag`, but called when the parser encounters an @@ -106,57 +161,46 @@ implementation simply calls :meth:`handle_starttag` and :meth:`handle_endtag`. -.. method:: HTMLParser.handle_endtag(tag) - - This method is called to handle the end tag of an element. It is intended to be - overridden by a derived class; the base class implementation does nothing. The - *tag* argument is the name of the tag converted to lower case. - - .. method:: HTMLParser.handle_data(data) - This method is called to process arbitrary data (e.g. the content of - ```` and ````). It is intended to be - overridden by a derived class; the base class implementation does nothing. + This method is called to process arbitrary data (e.g. text nodes and the + content of ```` and ````). + + +.. method:: HTMLParser.handle_entityref(name) + + This method is called to process a named character reference of the form + ``&name;`` (e.g. ``>``), where *name* is a general entity reference + (e.g. ``'gt'``). .. method:: HTMLParser.handle_charref(name) - This method is called to process a character reference of the form ``&#ref;``. - It is intended to be overridden by a derived class; the base class - implementation does nothing. - - -.. method:: HTMLParser.handle_entityref(name) - - This method is called to process a general entity reference of the form - ``&name;`` where *name* is an general entity reference. It is intended to be - overridden by a derived class; the base class implementation does nothing. + This method is called to process decimal and hexadecimal numeric character + references of the form ``&#NNN;`` and ``&#xNNN;``. For example, the decimal + equivalent for ``>`` is ``>``, whereas the hexadecimal is ``>``; + in this case the method will receive ``'62'`` or ``'x3E'``. .. method:: HTMLParser.handle_comment(data) - This method is called when a comment is encountered. The *comment* argument is - a string containing the text between the ``--`` and ``--`` delimiters, but not - the delimiters themselves. For example, the comment ```` will cause - this method to be called with the argument ``'text'``. It is intended to be - overridden by a derived class; the base class implementation does nothing. + This method is called when a comment is encountered (e.g. ````). + + For example, the comment ```` will cause this method to be + called with the argument ``' comment '``. + + The content of Internet Explorer conditional comments (condcoms) will also be + sent to this method, so, for ````, + this method will receive ``'[if IE 9]>IE-specific content``). + The *decl* parameter will be the entire contents of the declaration inside - the ```` markup. It is intended to be overridden by a derived class; - the base class implementation does nothing. - - -.. method:: HTMLParser.unknown_decl(data) - - Method called when an unrecognized SGML declaration is read by the parser. - The *data* parameter will be the entire contents of the declaration inside - the ```` markup. It is sometimes useful to be overridden by a - derived class; the base class implementation raises an :exc:`HTMLParseError`. + the ```` markup (e.g. ``'DOCTYPE html'``). .. method:: HTMLParser.handle_pi(data) @@ -174,29 +218,123 @@ cause the ``'?'`` to be included in *data*. -.. _htmlparser-example: +.. method:: HTMLParser.unknown_decl(data) -Example HTML Parser Application -------------------------------- + This method is called when an unrecognized declaration is read by the parser. -As a basic example, below is a simple HTML parser that uses the -:class:`HTMLParser` class to print out start tags, end tags, and data -as they are encountered:: + The *data* parameter will be the entire contents of the declaration inside + the ```` markup. It is sometimes useful to be overridden by a + derived class. The base class implementation raises an :exc:`HTMLParseError` + when *strict* is ``True``. + + +.. _htmlparser-examples: + +Examples +-------- + +The following class implements a parser that will be used to illustrate more +examples:: from html.parser import HTMLParser + from html.entities import name2codepoint class MyHTMLParser(HTMLParser): def handle_starttag(self, tag, attrs): - print("Encountered a start tag:", tag) + print("Start tag:", tag) + for attr in attrs: + print(" attr:", attr) def handle_endtag(self, tag): - print("Encountered an end tag:", tag) + print("End tag :", tag) def handle_data(self, data): - print("Encountered some data:", data) + print("Data :", data) + def handle_comment(self, data): + print("Comment :", data) + def handle_entityref(self, name): + c = chr(name2codepoint[name]) + print("Named ent:", c) + def handle_charref(self, name): + if name.startswith('x'): + c = chr(int(name[1:], 16)) + else: + c = chr(int(name)) + print("Num ent :", c) + def handle_decl(self, data): + print("Decl :", data) - parser = MyHTMLParser() - parser.feed('Test' - '

Parse me!

') + parser = MyHTMLParser(strict=False) +Parsing a doctype:: + + >>> parser.feed('') + Decl : DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd" + +Parsing an element with a few attributes and a title:: + + >>> parser.feed('The Python logo') + Start tag: img + attr: ('src', 'python-logo.png') + attr: ('alt', 'The Python logo') + >>> + >>> parser.feed('

Python

') + Start tag: h1 + Data : Python + End tag : h1 + +The content of ``script`` and ``style`` elements is returned as is, without +further parsing:: + + >>> parser.feed('') + Start tag: style + attr: ('type', 'text/css') + Data : #python { color: green } + End tag : style + >>> + >>> parser.feed('') + Start tag: script + attr: ('type', 'text/javascript') + Data : alert("hello!"); + End tag : script + +Parsing comments:: + + >>> parser.feed('' + ... '') + Comment : a comment + Comment : [if IE 9]>IE-specific content'``):: + + >>> parser.feed('>>>') + Named ent: > + Num ent : > + Num ent : > + +Feeding incomplete chunks to :meth:`~HTMLParser.feed` works, but +:meth:`~HTMLParser.handle_data` might be called more than once:: + + >>> for chunk in ['buff', 'ered ', 'text']: + ... parser.feed(chunk) + ... + Start tag: span + Data : buff + Data : ered + Data : text + End tag : span + +Parsing invalid HTML (e.g. unquoted attributes) also works:: + + >>> parser.feed('

tag soup

') + Start tag: p + Start tag: a + attr: ('class', 'link') + attr: ('href', '#main') + Data : tag soup + End tag : p + End tag : a .. rubric:: Footnotes -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sat Feb 18 01:59:14 2012 From: python-checkins at python.org (terry.reedy) Date: Sat, 18 Feb 2012 01:59:14 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=283=2E2=29=3A_Issue_14023_Rev?= =?utf8?q?ert_edit_to_2=2E7_version=2E_=28I_suspect_edit_is_from_when_we_t?= =?utf8?q?hought?= Message-ID: http://hg.python.org/cpython/rev/88522997b021 changeset: 75012:88522997b021 branch: 3.2 parent: 75010:569566cbfd13 user: Terry Jan Reedy date: Fri Feb 17 19:56:58 2012 -0500 summary: Issue 14023 Revert edit to 2.7 version. (I suspect edit is from when we thought to to makes bytes mutable, before deciding to add bytearrays.) files: Doc/reference/expressions.rst | 10 +++++----- 1 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Doc/reference/expressions.rst b/Doc/reference/expressions.rst --- a/Doc/reference/expressions.rst +++ b/Doc/reference/expressions.rst @@ -116,11 +116,11 @@ triple: immutable; data; type pair: immutable; object -With the exception of bytes literals, these all correspond to immutable data -types, and hence the object's identity is less important than its value. -Multiple evaluations of literals with the same value (either the same occurrence -in the program text or a different occurrence) may obtain the same object or a -different object with the same value. +All literals correspond to immutable data types, and hence the object's identity +is less important than its value. Multiple evaluations of literals with the +same value (either the same occurrence in the program text or a different +occurrence) may obtain the same object or a different object with the same +value. .. _parenthesized: -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sat Feb 18 01:59:15 2012 From: python-checkins at python.org (terry.reedy) Date: Sat, 18 Feb 2012 01:59:15 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_3=2E2_-=3E_default=29?= =?utf8?q?=3A_Merge_with_3=2E2_closes_14023?= Message-ID: http://hg.python.org/cpython/rev/47288880cc9e changeset: 75013:47288880cc9e parent: 75011:1850f45f6169 parent: 75012:88522997b021 user: Terry Jan Reedy date: Fri Feb 17 19:58:41 2012 -0500 summary: Merge with 3.2 closes 14023 files: Doc/reference/expressions.rst | 10 +++++----- 1 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Doc/reference/expressions.rst b/Doc/reference/expressions.rst --- a/Doc/reference/expressions.rst +++ b/Doc/reference/expressions.rst @@ -116,11 +116,11 @@ triple: immutable; data; type pair: immutable; object -With the exception of bytes literals, these all correspond to immutable data -types, and hence the object's identity is less important than its value. -Multiple evaluations of literals with the same value (either the same occurrence -in the program text or a different occurrence) may obtain the same object or a -different object with the same value. +All literals correspond to immutable data types, and hence the object's identity +is less important than its value. Multiple evaluations of literals with the +same value (either the same occurrence in the program text or a different +occurrence) may obtain the same object or a different object with the same +value. .. _parenthesized: -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sat Feb 18 04:02:19 2012 From: python-checkins at python.org (victor.stinner) Date: Sat, 18 Feb 2012 04:02:19 +0100 Subject: [Python-checkins] =?utf8?q?peps=3A_PEP_410=3A?= Message-ID: http://hg.python.org/peps/rev/f28ebbc37a2e changeset: 4063:f28ebbc37a2e user: Victor Stinner date: Sat Feb 18 04:03:06 2012 +0100 summary: PEP 410: * Add objection: clocks accuracy * Add Guido's type: number of nanosecond * Add time.time(format="decimal") alternative API * Add links to what other languages offer files: pep-0410.txt | 402 +++++++++++++++++++++++--------------- 1 files changed, 245 insertions(+), 157 deletions(-) diff --git a/pep-0410.txt b/pep-0410.txt --- a/pep-0410.txt +++ b/pep-0410.txt @@ -13,32 +13,31 @@ Abstract ======== -Python 3.3 introduced functions supporting nanosecond resolutions. Python 3.3 -only supports int or float to store timestamps, but these types cannot be use -to store a timestamp with a nanosecond resolution. +Decimal becomes the official type for high-resolution timestamps to make Python +support new functions using a nanosecond resolution without loss of precision. Motivation ========== -Python 2.3 introduced float timestamps to support subsecond resolutions. +Python 2.3 introduced float timestamps to support sub-second resolutions. os.stat() uses float timestamps by default since Python 2.5. Python 3.3 introduced functions supporting nanosecond resolutions: * os module: futimens(), utimensat() * time module: clock_gettime(), clock_getres(), monotonic(), wallclock() -os.stat() reads nanoseconds fields of the stat structure, but returns -timestamps as float. +os.stat() reads nanosecond timestamps but returns timestamps as float. The Python float type uses binary64 format of the IEEE 754 standard. With a -resolution of 1 nanosecond (10\ :sup:`-9`), float timestamps lose precision for values -bigger than 2\ :sup:`24` seconds (194 days: 1970-07-14 for an Epoch timestamp). +resolution of one nanosecond (10\ :sup:`-9`), float timestamps lose precision +for values bigger than 2\ :sup:`24` seconds (194 days: 1970-07-14 for an Epoch +timestamp). Nanosecond resolution is required to set the exact modification time on -filesystems supporting nanosecond timestamps (e.g ext4, btrfs, NTFS, ...). It -helps also to compare the modification time of two files when checking which -one is newer. Examples: copy a file and its modification time using +filesystems supporting nanosecond timestamps (e.g. ext4, btrfs, NTFS, ...). It +helps also to compare the modification time to check if a file is newer than +another file. Use cases: copy the modification time of a file using shutil.copystat(), create a TAR archive with the tarfile module, manage a mailbox with the mailbox module, etc. @@ -51,64 +50,82 @@ .. note:: With a resolution of 1 microsecond (10\ :sup:`-6`), float timestamps lose precision for values bigger than 2\ :sup:`33` seconds (272 years: 2242-03-16 - for an Epoch timestamp). - - With a resolution of 100 nanoseconds (10\ :sup:`-7`), float timestamps lose - precision for values bigger than 2\ :sup:`29` seconds (17 years: 1987-01-05 - for an Epoch timestamp). + for an Epoch timestamp). With a resolution of 100 nanoseconds + (10\ :sup:`-7`, resolution used on Windows), float timestamps lose precision + for values bigger than 2\ :sup:`29` seconds (17 years: 1987-01-05 for an + Epoch timestamp). Specification ============= Add decimal.Decimal as a new type for timestamps. Decimal supports any -timestamp resolution, support arithmetic operations and is comparable. -Functions getting float inputs support directly Decimal, Decimal is converted -implicitly to float, even if the conversion may lose precision. +timestamp resolution, support arithmetic operations and is comparable. It is +possible to coerce a Decimal to float, even if the conversion may lose +precision. The clock resolution can also be stored in a Decimal object. -Add a *timestamp* optional argument to: +Add an optional *timestamp* argument to: - * os module: fstat(), fstatat(), lstat() and stat() - * time module: clock(), clock_gettime(), clock_getres(), time() and - wallclock() + * os module: fstat(), fstatat(), lstat(), stat() (st_atime, + st_ctime and st_mtime fields of the stat structure), + sched_rr_get_interval(), times(), wait3() and wait4() + * resource module: ru_utime and ru_stime fields of getrusage() + * signal module: getitimer(), setitimer() + * time module: clock(), clock_gettime(), clock_getres(), + monotonic(), time() and wallclock() -The *timestamp* argument is a type, there are two supported types: +The *timestamp* argument value can be float or Decimal, float is still the +default for backward compatibility. The following functions support Decimal as +input: - * float - * decimal.Decimal + * datetime module: date.fromtimestamp(), datetime.fromtimestamp() and + datetime.utcfromtimestamp() + * os module: futimes(), futimesat(), lutimes(), utime() + * select module: epoll.poll(), kqueue.control(), select() + * signal module: setitimer(), sigtimedwait() + * time module: ctime(), gmtime(), localtime(), sleep() -The float type is still used by default for backward compatibility. - -Support decimal.Decimal (without implicit conversion to float to avoid lose of -precision) in functions having timestamp arguments: - - * datetime.datetime.fromtimestamp() - * time.gmtime(), time.localtime() - * os.utimensat(), os.futimens() - -The os.stat_float_times() is deprecated: use an explicit cast using int() -instead. +The os.stat_float_times() function is deprecated: use an explicit cast using +int() instead. .. note:: - The decimal module is implemented in Python and is slow, but there is a C - reimplementation which is almost ready for inclusion in CPython. + The decimal module is implemented in Python and is slower than float, but + there is a new C implementation which is almost ready for inclusion in + CPython. Backwards Compatibility ======================= -The default timestamp type is unchanged, so there is no impact of backwad -compatibility, nor impact on performances. The new timestamp type, -decimal.Decimal, is only used when requested explicitly. +The default timestamp type is unchanged, so there is no impact on backward +compatibility nor on performances. The new timestamp type, decimal.Decimal, is +only returned when requested explicitly. + + +Objection: clocks accuracy +========================== + +Computer clocks and operating systems are inaccurate and fail to provide +nanosecond accuracy in practice. A nanosecond is what it takes to execute a +couple of CPU instructions. Even on a real-time operating system, a +nanosecond-precise measurement is already obsolete when it starts being +processed by the higher-level application. A single cache miss in the CPU will +make the precision worthless. + +.. note:: + Linux *actually* is able to measure time in nanosecond precision, even + though it is not able to keep its clock synchronized to UTC with a + nanosecond accuracy. Alternatives: Timestamp types ============================= -To support timestamps with a nanosecond resolution, the following types has -been considered: +To support timestamps with an arbitrary or nanosecond resolution, the following +types have been considered: - * 128 bits float + * number of nanoseconds + * 128-bits float * decimal.Decimal * datetime.datetime * datetime.timedelta @@ -119,64 +136,87 @@ * Doing arithmetic on timestamps must be possible * Timestamps must be comparable - * An arbitrary resolution, or at least a resolution of 1 nanosecond without + * An arbitrary resolution, or at least a resolution of one nanosecond without losing precision - * Compatibility with the float type + * It should be possible to coerce the new timestamp to float for backward + compatibility -It should be possible to coerce the new timestamp to float for backward -compatibility, even if programs should not get this new type if they did not -ask explicitly to get it. -128 bits float +A resolution of one nanosecond is enough to support all current C functions. + +The best resolution used by operating systems is one nanosecond. In practice, +most clock accuracy is closer to microseconds than nanoseconds. So it sounds +reasonable to use a fixed resolution of one nanosecond. + + +Number of nanoseconds (int) +--------------------------- + +A nanosecond resolution is enough for all current C functions and so a +timestamp can simply be a number of nanoseconds, an integer, not a float. + +The number of nanoseconds format has been rejected because it would require to +add new specialized functions for this format because it not possible to +differentiate a number of nanoseconds and a number of seconds just by checking +the object type. + + +128-bits float -------------- -Add a new IEEE 754-2008 quad-precision float type. The IEEE 754-2008 quad -precision float has 1 sign bit, 15 bits of exponent and 112 bits of mantissa. +Add a new IEEE 754-2008 quad-precision binary float type. The IEEE 754-2008 +quad precision float has 1 sign bit, 15 bits of exponent and 112 bits of +mantissa. 128-bits float is supported by GCC (4.3), Clang and ICC compilers. -128 bits float is supported by GCC (4.3), Clang and ICC compilers. Python must -be portable and so cannot rely on a type only available on some platforms. For -example, Visual C++ 2008 doesn't support it 128 bits float, whereas it is used -to build the official Windows executables. Another example: GCC 4.3 does not -support __float128 in 32-bit mode on x86 (but GCC 4.4 does). +Python must be portable and so cannot rely on a type only available on some +platforms. For example, Visual C++ 2008 doesn't support 128-bits float, whereas +it is used to build the official Windows executables. Another example: GCC 4.3 +does not support __float128 in 32-bit mode on x86 (but GCC 4.4 does). -Intel CPUs have FPU (x87) supporting 80-bit floats, but not using SSE -intructions. Other CPU vendors don't support this float size. - -There is also a license issue: GCC uses the MPFR library for 128 bits float, +There is also a license issue: GCC uses the MPFR library for 128-bits float, library distributed under the GNU LGPL license. This license is not compatible with the Python license. +.. note:: + The x87 floating point unit of Intel CPU supports 80-bit floats. This format + is not supported by the SSE instruction set, which is now preferred over + float, especially on x86_64. Other CPU vendors don't support 80-bit float. + + + datetime.datetime ----------------- -Advantages: +The datetime.datetime type is the natural choice for a timestamp because it is +clear that this type contains a timestamp, whereas int, float and Decimal are +raw numbers. It is an absolute timestamp and so is well defined. It gives +direct access to the year, month, day, hours, minutes and seconds. It has +methods related to time like methods to format the timestamp as string (e.g. +datetime.datetime.strftime). - * datetime.datetime is the natural choice for a timestamp because it is clear - that this type contains a timestamp, whereas int, float and Decimal are - raw numbers. - * datetime.datetime is an absolute timestamp and so is well defined - * datetime.datetime gives direct access to the year, month, day, hours, - minutes and seconds. - * datetime.datetime has methods related to time like methods to format the - timestamp as string (e.g. datetime.datetime.strftime). +The major issue is that except os.stat(), time.time() and +time.clock_gettime(time.CLOCK_GETTIME), all time functions have an unspecified +starting point and no timezone information, and so cannot be converted to +datetime.datetime. -Drawbacks: - - * Except os.stat(), time.time() and time.clock_gettime(time.CLOCK_GETTIME), - all time functions have an unspecified starting point and no timezone - information, and so cannot be converted to datetime.datetime. - * datetime.datetime has issues with timezone. For example, a datetime object - without timezone and a datetime with a timezone cannot be compared. - * datetime.datetime has ordering issues with daylight saving time (DST) in the - duplicate hour of switching from DST to normal time. - * datetime.datetime is not as well integrated than Epoch timestamps: there is - no datetime.datetime.totimestamp() function. Most functions expecting - tiemstamps don't support datime.datetime. For example, os.utime() expects a - tuple of Epoch timestamps. +datetime.datetime has also issues with timezone. For example, a datetime object +without timezone (unaware) and a datetime with a timezone (aware) cannot be +compared. There is also an ordering issues with daylight saving time (DST) in +the duplicate hour of switching from DST to normal time. datetime.datetime has been rejected because it cannot be used for functions using an unspecified starting point like os.times() or time.clock(). +For time.time() and time.clock_gettime(time.CLOCK_GETTIME): it is already +possible to get the current time as a datetime.datetime object using:: + + datetime.datetime.now(datetime.timezone.utc) + +For os.stat(), it is simple to create a datetime.datetime object from a +decimal.Decimal timestamp in the UTC timezone:: + + datetime.datetime.fromtimestamp(value, datetime.timezone.utc) + .. note:: datetime.datetime only supports microsecond resolution, but can be enhanced to support nanosecond. @@ -186,19 +226,20 @@ datetime.timedelta is the natural choice for a relative timestamp because it is clear that this type contains a timestamp, whereas int, float and Decimal are -raw numbers. It can be used with datetime.datetime to get an absolute -timestamp. +raw numbers. It can be used with datetime.datetime to get an absolute timestamp +when the starting point is known. -datetime.timedelta has been rejected because it is not "compatible" with float, -whereas Decimal can be converted to float, and has a fixed resolution. One new -standard timestamp type is enough, and Decimal is preferred over -datetime.timedelta. +datetime.timedelta has been rejected because it cannot be coerced to float and +has a fixed resolution. One new standard timestamp type is enough, Decimal is +preferred over datetime.timedelta. Converting a datetime.timedelta to float +requires an explicit call to the datetime.timedelta.total_seconds() method. .. note:: datetime.timedelta only supports microsecond resolution, but can be enhanced to support nanosecond. -.. _tuple-integers: + +.. _tuple: Tuple of integers ----------------- @@ -206,8 +247,8 @@ To expose C functions in Python, a tuple of integers is the natural choice to store a timestamp because the C language uses structures with integers fields (e.g. timeval and timespec structures). Using only integers avoids the loss of -precision (Python supports integer of arbitrary length). Creating and parsing a -tuple of integers is simple and fast. +precision (Python supports integers of arbitrary length). Creating and parsing +a tuple of integers is simple and fast. Depending of the exact format of the tuple, the precision can be arbitrary or fixed. The precision can be choose as the loss of precision is smaller than @@ -219,73 +260,72 @@ * value = numerator / denominator * resolution = 1 / denominator - * the numerator is a signed integer and can be bigger than the denominator * denominator > 0 * B: (seconds, numerator, denominator) * value = seconds + numerator / denominator * resolution = 1 / denominator - * seconds is a signed integer * 0 <= numerator < denominator * denominator > 0 * C: (intpart, floatpart, base, exponent) - * value = intpart + floatpart ? base\ :sup:`exponent` - * resolution = base \ :sup:`-exponent` - * intpart is a signed integer + * value = intpart + floatpart / base\ :sup:`exponent` + * resolution = 1 / base \ :sup:`exponent` * 0 <= floatpart < base \ :sup:`exponent` * base > 0 - * exponent is a signed integer and should be negative + * exponent >= 0 * D: (intpart, floatpart, exponent) - * value = intpart + floatpart ? 10\ :sup:`exponent` - * resolution = 10 \ :sup:`-exponent` - * intpart is a signed integer + * value = intpart + floatpart / 10\ :sup:`exponent` + * resolution = 1 / 10 \ :sup:`exponent` * 0 <= floatpart < 10 \ :sup:`exponent` - * exponent is a signed integer and should be negative + * exponent >= 0 * E: (sec, nsec) * value = sec + nsec ? 10\ :sup:`-9` * resolution = 10 \ :sup:`-9` (nanosecond) - * sec is a signed integer * 0 <= nsec < 10 \ :sup:`9` -All formats support an arbitary resolution, except of the format (E). +All formats support an arbitrary resolution, except of the format (E). -The format (D) may loss of precision if the clock frequency is arbitrary and -cannot be expressed as 10 \ :sup:`exponent`. The format (C) has a similar -issue, but in such case, it is possible to use base=frequency and exponent=-1. +The format (D) may not be able to store the exact value (may loss of precision) +if the clock frequency is arbitrary and cannot be expressed as a power of 10. +The format (C) has a similar issue, but in such case, it is possible to use +base=frequency and exponent=1. -The formats (D) and (E) allow optimization for conversion to float if the base -is 2 and to decimal.Decimal if the base is 10. +The formats (C), (D) and (E) allow optimization for conversion to float if the +base is 2 and to decimal.Decimal if the base is 10. -The format (A) supports arbitrary precision, is simple (only two fields), only -requires a simple division to get the floating point value, and is already used -by float.as_integer_ratio(). +The format (A) is a simple fraction. It supports arbitrary precision, is simple +(only two fields), only requires a simple division to get the floating point +value, and is already used by float.as_integer_ratio(). -To simplify the implementation (especially if implemented in C to avoid integer -overflow), it may be possible to accept numerator bigger than the denominator -(e.g. floatpart bigger than base \ :sup:`exponent` for the format (C)), and -normalize the tuple later. +To simplify the implementation (especially the C implementation to avoid +integer overflow), a numerator bigger than the denominator can be accepted. +The tuple may be normalized later. Tuple of integers have been rejected because they don't support arithmetic operations. .. note:: On Windows, the ``QueryPerformanceCounter()`` clock uses the frequency of - the processor which is an arbitrary number and can be read using - ``QueryPerformanceFrequency()``. + the processor which is an arbitrary number and so may not be a power or 2 or + 10. The frequency can be read using ``QueryPerformanceFrequency()``. + timespec structure ------------------ -A resolution of one nanosecond is enough to support all current C functions. A -Timespec type can be added to store a timestamp with a nanosecond resolution. -Basic example supporting addition, subtraction and coercion to float:: +timespec is the C structure used to store timestamp with a nanosecond +resolution. Python can use a type with the same structure: (seconds, +nanoseconds). For convenience, arithmetic operations on timespec are supported. + +Example of an incomplete timespec type supporting addition, subtraction and +coercion to float:: class timespec(tuple): def __new__(cls, sec, nsec): @@ -329,15 +369,30 @@ def __repr__(self): return '' % (self.sec, self.nsec) -The timespec type is similar to the `Tuple of integer, variant (A) -`_ type, except that it supports arithmetic. +The timespec type is similar to the format (E) of tuples of integer, except +that it supports arithmetic and coercion to float. -The timespec type was rejected because it only supports nanosecond resolution. +The timespec type was rejected because it only supports nanosecond resolution +and requires to implement each arithmetic operation, whereas the Decimal type +is already implemented and well tested. Alternatives: API design ======================== +Add a string argument to specify the return type +------------------------------------------------ + +Add an string argument to function returning timestamps, example: +time.time(format="datetime"). A string is more extensible than a type: it is +possible to request a format that has no type, like a tuple of integers. + +This API was rejected because it was necessary to import implicitly modules to +instantiate objects (e.g. import datetime to create datetime.datetime). +Importing a module may raise an exception and may be slow, such behaviour is +unexpected and surprising. + + Add a global flag to change the timestamp type ---------------------------------------------- @@ -345,20 +400,21 @@ can be added to set globally the timestamp type. A global flag may cause issues with libraries and applications expecting float -instead of Decimal. A float cannot be converted implicitly to Decimal. The -os.stat_float_times() case is different because an int can be converted -implictly to float. +instead of Decimal. Decimal is not fully compatible with float. float+Decimal +raises a TypeError for example. The os.stat_float_times() case is different +because an int can be coerced to float and int+float gives float. + Add a protocol to create a timestamp ------------------------------------ -Instead of hardcoding how timestamps are created, a new protocol can be added -to create a timestamp from a fraction. time.time(timestamp=type) would call -type.__from_fraction__(numerator, denominator) to create a timestamp object of -the specified type. +Instead of hard coding how timestamps are created, a new protocol can be added +to create a timestamp from a fraction. -If the type doesn't support the protocol, a fallback can be used: -type(numerator) / type(denominator). +For example, time.time(timestamp=type) would call the class method +type.__fromfraction__(numerator, denominator) to create a timestamp object of +the specified type. If the type doesn't support the protocol, a fallback is +used: type(numerator) / type(denominator). A variant is to use a "converter" callback to create a timestamp. Example creating a float timestamp: @@ -367,20 +423,20 @@ return float(numerator) / float(denominator) Common converters can be provided by time, datetime and other modules, or maybe -a specific "hires" module. Users can defined their own converters. +a specific "hires" module. Users can define their own converters. -Such protocol has a limitation: the structure of data passed to the protocol or -the callback has to be decided once and cannot be changed later. For example, -adding a timezone or the absolution start of the timestamp (e.g. Epoch or -unspecified start for monotonic clocks) would break the API. +Such protocol has a limitation: the timestamp structure has to be decided once +and cannot be changed later. For example, adding a timezone or the absolute +start of the timestamp would break the API. The protocol proposition was as being excessive given the requirements, but that the specific syntax proposed (time.time(timestamp=type)) allows this to be introduced later if compelling use cases are discovered. .. note:: - Other formats can also be used instead of a fraction: see the `Tuple of integers - `_ section + Other formats may be used instead of a fraction: see the tuple of integers + section for example. + Add new fields to os.stat ------------------------- @@ -388,30 +444,30 @@ To get the creation, modification and access time of a file with a nanosecond resolution, three fields can be added to os.stat() structure. -The new fields can timestamps with nanosecond resolution (tuple of integers, -timespec structure, Decimal, etc.) or the nanosecond part of each timestamp. +The new fields can be timestamps with nanosecond resolution (e.g. Decimal) or +the nanosecond part of each timestamp (int). If the new fields are timestamps with nanosecond resolution, populating the extra fields would be time consuming. Any call to os.stat() would be slower, -even if os.stat() is only called to check if the file exists. A parameter can -be added to os.stat() to make these fields optional, but a structure with a -variable number of fields can be problematic. +even if os.stat() is only called to check if a file exists. A parameter can be +added to os.stat() to make these fields optional, the structure would have a +variable number of fields. If the new fields only contain the fractional part (nanoseconds), os.stat() would be efficient. These fields would always be present and so set to zero if -the operating system does not support subsecond resolution. Splitting a -timestamp in two parts, seconds and nanoseconds, is similar to the `timespec -type `_ and `tuple of integers `_, and so have the -same drawbacks. +the operating system does not support sub-second resolution. Splitting a +timestamp in two parts, seconds and nanoseconds, is similar to the timespec +type and tuple of integers, and so have the same drawbacks. Adding new fields to the os.stat() structure does not solve the nanosecond -issue in other modules (e.g. time). +issue in other modules (e.g. the time module). + Add a boolean argument ---------------------- -Because we only need one new type, decimal.Decimal, a simple boolean flag -can be added. For example, time.time(decimal=True) or time.time(hires=True). +Because we only need one new type (Decimal), a simple boolean flag can be +added. Example: time.time(decimal=True) or time.time(hires=True). Such flag would require to do an hidden import which is considered as a bad practice. @@ -420,6 +476,7 @@ the return type with a parameter value is preferred over a boolean parameter (a flag). + Add new functions ----------------- @@ -431,17 +488,48 @@ * os.stat_timespec() * etc. -Adding a new function for each function creating timestamps duplicate a lot -of code. +Adding a new function for each function creating timestamps duplicate a lot of +code and would be a pain to maintain. + + +Add a new hires module +---------------------- + +Add a new module called "hires" with the same API than the time module, except +that it would return timestamp with high resolution, e.g. decimal.Decimal. +Adding a new module avoids to link low-level modules like time or os to the +decimal module. + +This idea was rejected because it requires to duplicate most of the code of the +time module, would be a pain to maintain, and timestamps are used modules other +than the time module. Examples: signal.sigtimedwait(), select.select(), +resource.getrusage(), os.stat(), etc. Duplicate the code of each module is not +acceptable. Links ===== +Python: + + * `Issue #7652: Merge C version of decimal into py3k `_ (cdecimal) * `Issue #11457: os.stat(): add new fields to get timestamps as Decimal objects with nanosecond resolution `_ - * `Issue #13882: Add format argument for time.time(), time.clock(), ... to get a timestamp as a Decimal object `_ + * `Issue #13882: PEP 410: Use decimal.Decimal type for timestamps `_ * `[Python-Dev] Store timestamps as decimal.Decimal objects `_ - * `Issue #7652: Merge C version of decimal into py3k `_ (cdecimal) + +Other languages: + + * Ruby (1.9.3), the `Time class `_ + supports picosecond (10\ :sup:`-12`) + * .NET framework, `DateTime type `_: + number of 100-nanosecond intervals that have elapsed since 12:00:00 + midnight, January 1, 0001. DateTime.Ticks uses a signed 64-bit integer. + * Java (1.5), `System.nanoTime() `_: + wallclock with an unspecified starting point as a number of nanoseconds, use + a signed 64 bits integer (long). + * Perl, `Time::Hiref module `_: + use float so has the same loss of precision issue with nanosecond resolution + than Python float timestamps Copyright -- Repository URL: http://hg.python.org/peps From solipsis at pitrou.net Sat Feb 18 05:33:01 2012 From: solipsis at pitrou.net (solipsis at pitrou.net) Date: Sat, 18 Feb 2012 05:33:01 +0100 Subject: [Python-checkins] Daily reference leaks (47288880cc9e): sum=0 Message-ID: results for 47288880cc9e on branch "default" -------------------------------------------- Command line was: ['./python', '-m', 'test.regrtest', '-uall', '-R', '3:3:/home/antoine/cpython/refleaks/reflogss1kSP', '-x'] From python-checkins at python.org Sat Feb 18 15:03:10 2012 From: python-checkins at python.org (charles-francois.natali) Date: Sat, 18 Feb 2012 15:03:10 +0100 Subject: [Python-checkins] =?utf8?b?Y3B5dGhvbiAoMi42KTogSXNzdWUgIzE0MDAx?= =?utf8?q?=3A_CVE-2012-0845=3A_xmlrpc=3A_Fix_an_endless_loop_in_SimpleXMLR?= =?utf8?q?PCServer?= Message-ID: http://hg.python.org/cpython/rev/24244a744d01 changeset: 75014:24244a744d01 branch: 2.6 parent: 74645:9a4131ada792 user: Charles-Fran?ois Natali date: Sat Feb 18 14:15:38 2012 +0100 summary: Issue #14001: CVE-2012-0845: xmlrpc: Fix an endless loop in SimpleXMLRPCServer upon malformed POST request. files: Lib/SimpleXMLRPCServer.py | 5 ++++- Misc/NEWS | 3 +++ 2 files changed, 7 insertions(+), 1 deletions(-) diff --git a/Lib/SimpleXMLRPCServer.py b/Lib/SimpleXMLRPCServer.py --- a/Lib/SimpleXMLRPCServer.py +++ b/Lib/SimpleXMLRPCServer.py @@ -459,7 +459,10 @@ L = [] while size_remaining: chunk_size = min(size_remaining, max_chunk_size) - L.append(self.rfile.read(chunk_size)) + chunk = self.rfile.read(chunk_size) + if not chunk: + break + L.append(chunk) size_remaining -= len(L[-1]) data = ''.join(L) diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -13,6 +13,9 @@ Library ------- +- Issue #14001: CVE-2012-0845: xmlrpc: Fix an endless loop in + SimpleXMLRPCServer upon malformed POST request. + - Issue #13885: CVE-2011-3389: the _ssl module would always disable the CBC IV attack countermeasure. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sat Feb 18 15:03:11 2012 From: python-checkins at python.org (charles-francois.natali) Date: Sat, 18 Feb 2012 15:03:11 +0100 Subject: [Python-checkins] =?utf8?b?Y3B5dGhvbiAobWVyZ2UgMi42IC0+IDIuNyk6?= =?utf8?q?_Issue_=2314001=3A_CVE-2012-0845=3A_xmlrpc=3A_Fix_an_endless_loo?= =?utf8?q?p_in_SimpleXMLRPCServer?= Message-ID: http://hg.python.org/cpython/rev/0c02f30b2538 changeset: 75015:0c02f30b2538 branch: 2.7 parent: 75009:7052eb923fb8 parent: 75014:24244a744d01 user: Charles-Fran?ois Natali date: Sat Feb 18 14:30:34 2012 +0100 summary: Issue #14001: CVE-2012-0845: xmlrpc: Fix an endless loop in SimpleXMLRPCServer upon malformed POST request. files: Lib/SimpleXMLRPCServer.py | 5 ++++- Lib/test/test_xmlrpc.py | 6 ++++++ Misc/NEWS | 3 +++ 3 files changed, 13 insertions(+), 1 deletions(-) diff --git a/Lib/SimpleXMLRPCServer.py b/Lib/SimpleXMLRPCServer.py --- a/Lib/SimpleXMLRPCServer.py +++ b/Lib/SimpleXMLRPCServer.py @@ -486,7 +486,10 @@ L = [] while size_remaining: chunk_size = min(size_remaining, max_chunk_size) - L.append(self.rfile.read(chunk_size)) + chunk = self.rfile.read(chunk_size) + if not chunk: + break + L.append(chunk) size_remaining -= len(L[-1]) data = ''.join(L) diff --git a/Lib/test/test_xmlrpc.py b/Lib/test/test_xmlrpc.py --- a/Lib/test/test_xmlrpc.py +++ b/Lib/test/test_xmlrpc.py @@ -589,6 +589,12 @@ # This avoids waiting for the socket timeout. self.test_simple1() + def test_partial_post(self): + # Check that a partial POST doesn't make the server loop: issue #14001. + conn = httplib.HTTPConnection(ADDR, PORT) + conn.request('POST', '/RPC2 HTTP/1.0\r\nContent-Length: 100\r\n\r\nbye') + conn.close() + class MultiPathServerTestCase(BaseServerTestCase): threadFunc = staticmethod(http_multi_server) request_count = 2 diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -93,6 +93,9 @@ Library ------- +- 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(). -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sat Feb 18 15:03:12 2012 From: python-checkins at python.org (charles-francois.natali) Date: Sat, 18 Feb 2012 15:03:12 +0100 Subject: [Python-checkins] =?utf8?b?Y3B5dGhvbiAoMy4xKTogSXNzdWUgIzE0MDAx?= =?utf8?q?=3A_CVE-2012-0845=3A_xmlrpc=3A_Fix_an_endless_loop_in_SimpleXMLR?= =?utf8?q?PCServer?= Message-ID: http://hg.python.org/cpython/rev/4dd5a94fd3e3 changeset: 75016:4dd5a94fd3e3 branch: 3.1 parent: 74744:813a34170ac5 user: Charles-Fran?ois Natali date: Sat Feb 18 14:42:57 2012 +0100 summary: Issue #14001: CVE-2012-0845: xmlrpc: Fix an endless loop in SimpleXMLRPCServer upon malformed POST request. files: Lib/xmlrpc/server.py | 5 ++++- Misc/NEWS | 3 +++ 2 files changed, 7 insertions(+), 1 deletions(-) diff --git a/Lib/xmlrpc/server.py b/Lib/xmlrpc/server.py --- a/Lib/xmlrpc/server.py +++ b/Lib/xmlrpc/server.py @@ -449,7 +449,10 @@ L = [] while size_remaining: chunk_size = min(size_remaining, max_chunk_size) - L.append(self.rfile.read(chunk_size)) + chunk = self.rfile.read(chunk_size) + if not chunk: + break + L.append(chunk) size_remaining -= len(L[-1]) data = b''.join(L) diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -13,6 +13,9 @@ Library ------- +- Issue #14001: CVE-2012-0845: xmlrpc: Fix an endless loop in + SimpleXMLRPCServer upon malformed POST request. + - Issue #13885: CVE-2011-3389: the _ssl module would always disable the CBC IV attack countermeasure. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sat Feb 18 15:03:13 2012 From: python-checkins at python.org (charles-francois.natali) Date: Sat, 18 Feb 2012 15:03:13 +0100 Subject: [Python-checkins] =?utf8?b?Y3B5dGhvbiAobWVyZ2UgMy4xIC0+IDMuMik6?= =?utf8?q?_Issue_=2314001=3A_CVE-2012-0845=3A_xmlrpc=3A_Fix_an_endless_loo?= =?utf8?q?p_in_SimpleXMLRPCServer?= Message-ID: http://hg.python.org/cpython/rev/cd67740ce653 changeset: 75017:cd67740ce653 branch: 3.2 parent: 75012:88522997b021 parent: 75016:4dd5a94fd3e3 user: Charles-Fran?ois Natali date: Sat Feb 18 14:53:41 2012 +0100 summary: Issue #14001: CVE-2012-0845: xmlrpc: Fix an endless loop in SimpleXMLRPCServer upon malformed POST request. files: Lib/test/test_xmlrpc.py | 14 ++++++++------ Lib/xmlrpc/server.py | 5 ++++- Misc/NEWS | 3 +++ 3 files changed, 15 insertions(+), 7 deletions(-) diff --git a/Lib/test/test_xmlrpc.py b/Lib/test/test_xmlrpc.py --- a/Lib/test/test_xmlrpc.py +++ b/Lib/test/test_xmlrpc.py @@ -474,12 +474,7 @@ def tearDown(self): # wait on the server thread to terminate - self.evt.wait(4.0) - # XXX this code does not work, and in fact stop_serving doesn't exist. - if not self.evt.is_set(): - self.evt.set() - stop_serving() - raise RuntimeError("timeout reached, test has failed") + self.evt.wait() # disable traceback reporting xmlrpc.server.SimpleXMLRPCServer._send_traceback_header = False @@ -626,6 +621,13 @@ server = xmlrpclib.ServerProxy("http://%s:%d/RPC2" % (ADDR, PORT)) self.assertEqual(server.add("a", "\xe9"), "a\xe9") + def test_partial_post(self): + # Check that a partial POST doesn't make the server loop: issue #14001. + conn = http.client.HTTPConnection(ADDR, PORT) + conn.request('POST', '/RPC2 HTTP/1.0\r\nContent-Length: 100\r\n\r\nbye') + conn.close() + + class MultiPathServerTestCase(BaseServerTestCase): threadFunc = staticmethod(http_multi_server) request_count = 2 diff --git a/Lib/xmlrpc/server.py b/Lib/xmlrpc/server.py --- a/Lib/xmlrpc/server.py +++ b/Lib/xmlrpc/server.py @@ -474,7 +474,10 @@ L = [] while size_remaining: chunk_size = min(size_remaining, max_chunk_size) - L.append(self.rfile.read(chunk_size)) + chunk = self.rfile.read(chunk_size) + if not chunk: + break + L.append(chunk) size_remaining -= len(L[-1]) data = b''.join(L) diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -116,6 +116,9 @@ Library ------- +- 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(). -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sat Feb 18 15:03:14 2012 From: python-checkins at python.org (charles-francois.natali) Date: Sat, 18 Feb 2012 15:03:14 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_3=2E2_-=3E_default=29?= =?utf8?q?=3A_Issue_=2314001=3A_CVE-2012-0845=3A_xmlrpc=3A_Fix_an_endless_?= =?utf8?q?loop_in_SimpleXMLRPCServer?= Message-ID: http://hg.python.org/cpython/rev/5756b295b6fb changeset: 75018:5756b295b6fb parent: 75013:47288880cc9e parent: 75017:cd67740ce653 user: Charles-Fran?ois Natali date: Sat Feb 18 15:02:10 2012 +0100 summary: Issue #14001: CVE-2012-0845: xmlrpc: Fix an endless loop in SimpleXMLRPCServer upon malformed POST request. files: Lib/test/test_xmlrpc.py | 14 ++++++++------ Lib/xmlrpc/server.py | 5 ++++- Misc/NEWS | 3 +++ 3 files changed, 15 insertions(+), 7 deletions(-) diff --git a/Lib/test/test_xmlrpc.py b/Lib/test/test_xmlrpc.py --- a/Lib/test/test_xmlrpc.py +++ b/Lib/test/test_xmlrpc.py @@ -519,12 +519,7 @@ def tearDown(self): # wait on the server thread to terminate - self.evt.wait(4.0) - # XXX this code does not work, and in fact stop_serving doesn't exist. - if not self.evt.is_set(): - self.evt.set() - stop_serving() - raise RuntimeError("timeout reached, test has failed") + self.evt.wait() # disable traceback reporting xmlrpc.server.SimpleXMLRPCServer._send_traceback_header = False @@ -671,6 +666,13 @@ server = xmlrpclib.ServerProxy("http://%s:%d/RPC2" % (ADDR, PORT)) self.assertEqual(server.add("a", "\xe9"), "a\xe9") + def test_partial_post(self): + # Check that a partial POST doesn't make the server loop: issue #14001. + conn = http.client.HTTPConnection(ADDR, PORT) + conn.request('POST', '/RPC2 HTTP/1.0\r\nContent-Length: 100\r\n\r\nbye') + conn.close() + + class MultiPathServerTestCase(BaseServerTestCase): threadFunc = staticmethod(http_multi_server) request_count = 2 diff --git a/Lib/xmlrpc/server.py b/Lib/xmlrpc/server.py --- a/Lib/xmlrpc/server.py +++ b/Lib/xmlrpc/server.py @@ -476,7 +476,10 @@ L = [] while size_remaining: chunk_size = min(size_remaining, max_chunk_size) - L.append(self.rfile.read(chunk_size)) + chunk = self.rfile.read(chunk_size) + if not chunk: + break + L.append(chunk) size_remaining -= len(L[-1]) data = b''.join(L) diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -466,6 +466,9 @@ Library ------- +- Issue #14001: CVE-2012-0845: xmlrpc: Fix an endless loop in + SimpleXMLRPCServer upon malformed POST request. + - Issue #13961: Move importlib over to using os.replace() for atomic renaming. - Do away with ambiguous level values (as suggested by PEP 328) in -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sat Feb 18 16:11:46 2012 From: python-checkins at python.org (sandro.tosi) Date: Sat, 18 Feb 2012 16:11:46 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=283=2E2=29=3A_fix_error_in_me?= =?utf8?q?moryview_example=3B_thanks_to_kan_lianlian_from_docs=40?= Message-ID: http://hg.python.org/cpython/rev/9ce5d456138b changeset: 75019:9ce5d456138b branch: 3.2 parent: 75017:cd67740ce653 user: Sandro Tosi date: Sat Feb 18 16:05:34 2012 +0100 summary: fix error in memoryview example; thanks to kan lianlian from docs@ files: Doc/library/stdtypes.rst | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Doc/library/stdtypes.rst b/Doc/library/stdtypes.rst --- a/Doc/library/stdtypes.rst +++ b/Doc/library/stdtypes.rst @@ -2375,7 +2375,7 @@ bytearray(b'zbcefg') >>> v[1:4] = b'123' >>> data - bytearray(b'a123fg') + bytearray(b'z123fg') >>> v[2] = b'spam' Traceback (most recent call last): File "", line 1, in -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sat Feb 18 16:11:46 2012 From: python-checkins at python.org (sandro.tosi) Date: Sat, 18 Feb 2012 16:11:46 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_3=2E2_-=3E_default=29?= =?utf8?q?=3A_merge_with_3=2E2?= Message-ID: http://hg.python.org/cpython/rev/5a19909f5845 changeset: 75020:5a19909f5845 parent: 75018:5756b295b6fb parent: 75019:9ce5d456138b user: Sandro Tosi date: Sat Feb 18 16:06:39 2012 +0100 summary: merge with 3.2 files: Doc/library/stdtypes.rst | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Doc/library/stdtypes.rst b/Doc/library/stdtypes.rst --- a/Doc/library/stdtypes.rst +++ b/Doc/library/stdtypes.rst @@ -2421,7 +2421,7 @@ bytearray(b'zbcefg') >>> v[1:4] = b'123' >>> data - bytearray(b'a123fg') + bytearray(b'z123fg') >>> v[2] = b'spam' Traceback (most recent call last): File "", line 1, in -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sat Feb 18 20:34:10 2012 From: python-checkins at python.org (sandro.tosi) Date: Sat, 18 Feb 2012 20:34:10 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=282=2E7=29=3A_Refer_to_=27tim?= =?utf8?q?e=27_and_=27datetime=27_submodules=3B_thanks_to_Erik_Johnson_fro?= =?utf8?q?m_docs=40?= Message-ID: http://hg.python.org/cpython/rev/30ff707ed75f changeset: 75021:30ff707ed75f branch: 2.7 parent: 75015:0c02f30b2538 user: Sandro Tosi date: Sat Feb 18 20:28:35 2012 +0100 summary: Refer to 'time' and 'datetime' submodules; thanks to Erik Johnson from docs@ This is needed after the move to Sphinx 1.x and it's the same way 3.x braches managed it. files: Doc/library/datetime.rst | 132 +++++++++++++------------- 1 files changed, 66 insertions(+), 66 deletions(-) diff --git a/Doc/library/datetime.rst b/Doc/library/datetime.rst --- a/Doc/library/datetime.rst +++ b/Doc/library/datetime.rst @@ -20,13 +20,13 @@ There are two kinds of date and time objects: "naive" and "aware". This distinction refers to whether the object has any notion of time zone, daylight saving time, or other kind of algorithmic or political time adjustment. Whether -a naive :class:`datetime` object represents Coordinated Universal Time (UTC), +a naive :class:`.datetime` object represents Coordinated Universal Time (UTC), local time, or time in some other timezone is purely up to the program, just like it's up to the program whether a particular number represents metres, -miles, or mass. Naive :class:`datetime` objects are easy to understand and to +miles, or mass. Naive :class:`.datetime` objects are easy to understand and to work with, at the cost of ignoring some aspects of reality. -For applications requiring more, :class:`datetime` and :class:`time` objects +For applications requiring more, :class:`.datetime` and :class:`.time` objects have an optional time zone information attribute, :attr:`tzinfo`, that can be set to an instance of a subclass of the abstract :class:`tzinfo` class. These :class:`tzinfo` objects capture information about the offset from UTC time, the @@ -40,13 +40,13 @@ .. data:: MINYEAR - The smallest year number allowed in a :class:`date` or :class:`datetime` object. + The smallest year number allowed in a :class:`date` or :class:`.datetime` object. :const:`MINYEAR` is ``1``. .. data:: MAXYEAR - The largest year number allowed in a :class:`date` or :class:`datetime` object. + The largest year number allowed in a :class:`date` or :class:`.datetime` object. :const:`MAXYEAR` is ``9999``. @@ -90,14 +90,14 @@ .. class:: timedelta :noindex: - A duration expressing the difference between two :class:`date`, :class:`time`, - or :class:`datetime` instances to microsecond resolution. + A duration expressing the difference between two :class:`date`, :class:`.time`, + or :class:`.datetime` instances to microsecond resolution. .. class:: tzinfo An abstract base class for time zone information objects. These are used by the - :class:`datetime` and :class:`time` classes to provide a customizable notion of + :class:`.datetime` and :class:`.time` classes to provide a customizable notion of time adjustment (for example, to account for time zone and/or daylight saving time). @@ -105,7 +105,7 @@ Objects of the :class:`date` type are always naive. -An object *d* of type :class:`time` or :class:`datetime` may be naive or aware. +An object *d* of type :class:`.time` or :class:`.datetime` may be naive or aware. *d* is aware if ``d.tzinfo`` is not ``None`` and ``d.tzinfo.utcoffset(d)`` does not return ``None``. If ``d.tzinfo`` is ``None``, or if ``d.tzinfo`` is not ``None`` but ``d.tzinfo.utcoffset(d)`` returns ``None``, *d* is naive. @@ -269,7 +269,7 @@ -1 day, 19:00:00 In addition to the operations listed above :class:`timedelta` objects support -certain additions and subtractions with :class:`date` and :class:`datetime` +certain additions and subtractions with :class:`date` and :class:`.datetime` objects (see below). Comparisons of :class:`timedelta` objects are supported with the @@ -602,10 +602,10 @@ :class:`datetime` Objects ------------------------- -A :class:`datetime` object is a single object containing all the information -from a :class:`date` object and a :class:`time` object. Like a :class:`date` -object, :class:`datetime` assumes the current Gregorian calendar extended in -both directions; like a time object, :class:`datetime` assumes there are exactly +A :class:`.datetime` object is a single object containing all the information +from a :class:`date` object and a :class:`.time` object. Like a :class:`date` +object, :class:`.datetime` assumes the current Gregorian calendar extended in +both directions; like a time object, :class:`.datetime` assumes there are exactly 3600\*24 seconds in every day. Constructor: @@ -653,7 +653,7 @@ Return the current UTC date and time, with :attr:`tzinfo` ``None``. This is like :meth:`now`, but returns the current UTC date and time, as a naive - :class:`datetime` object. See also :meth:`now`. + :class:`.datetime` object. See also :meth:`now`. .. classmethod:: datetime.fromtimestamp(timestamp[, tz]) @@ -661,7 +661,7 @@ Return the local date and time corresponding to the POSIX timestamp, such as is returned by :func:`time.time`. If optional argument *tz* is ``None`` or not specified, the timestamp is converted to the platform's local date and time, and - the returned :class:`datetime` object is naive. + the returned :class:`.datetime` object is naive. Else *tz* must be an instance of a class :class:`tzinfo` subclass, and the timestamp is converted to *tz*'s time zone. In this case the result is @@ -674,12 +674,12 @@ 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`. + identical :class:`.datetime` objects. See also :meth:`utcfromtimestamp`. .. classmethod:: datetime.utcfromtimestamp(timestamp) - Return the UTC :class:`datetime` corresponding to the POSIX timestamp, with + 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. It's common for this to be restricted to years in 1970 through 2038. See also @@ -688,7 +688,7 @@ .. classmethod:: datetime.fromordinal(ordinal) - Return the :class:`datetime` corresponding to the proleptic Gregorian ordinal, + Return the :class:`.datetime` corresponding to the proleptic Gregorian ordinal, where January 1 of year 1 has ordinal 1. :exc:`ValueError` is raised unless ``1 <= ordinal <= datetime.max.toordinal()``. The hour, minute, second and microsecond of the result are all 0, and :attr:`tzinfo` is ``None``. @@ -696,18 +696,18 @@ .. classmethod:: datetime.combine(date, time) - Return a new :class:`datetime` object whose date components are equal to the + Return a new :class:`.datetime` object whose date components are equal to the given :class:`date` object's, and whose time components and :attr:`tzinfo` - attributes are equal to the given :class:`time` object's. For any - :class:`datetime` object *d*, + attributes are equal to the given :class:`.time` object's. For any + :class:`.datetime` object *d*, ``d == datetime.combine(d.date(), d.timetz())``. If date is a - :class:`datetime` object, its time components and :attr:`tzinfo` attributes + :class:`.datetime` object, its time components and :attr:`tzinfo` attributes are ignored. .. classmethod:: datetime.strptime(date_string, format) - Return a :class:`datetime` corresponding to *date_string*, parsed according to + Return a :class:`.datetime` corresponding to *date_string*, parsed according to *format*. This is equivalent to ``datetime(*(time.strptime(date_string, format)[0:6]))``. :exc:`ValueError` is raised if the date_string and format can't be parsed by :func:`time.strptime` or if it returns a value which isn't a @@ -720,19 +720,19 @@ .. attribute:: datetime.min - The earliest representable :class:`datetime`, ``datetime(MINYEAR, 1, 1, + The earliest representable :class:`.datetime`, ``datetime(MINYEAR, 1, 1, tzinfo=None)``. .. attribute:: datetime.max - The latest representable :class:`datetime`, ``datetime(MAXYEAR, 12, 31, 23, 59, + The latest representable :class:`.datetime`, ``datetime(MAXYEAR, 12, 31, 23, 59, 59, 999999, tzinfo=None)``. .. attribute:: datetime.resolution - The smallest possible difference between non-equal :class:`datetime` objects, + The smallest possible difference between non-equal :class:`.datetime` objects, ``timedelta(microseconds=1)``. @@ -775,24 +775,24 @@ .. attribute:: datetime.tzinfo - The object passed as the *tzinfo* argument to the :class:`datetime` constructor, + The object passed as the *tzinfo* argument to the :class:`.datetime` constructor, or ``None`` if none was passed. Supported operations: -+---------------------------------------+-------------------------------+ -| Operation | Result | -+=======================================+===============================+ -| ``datetime2 = datetime1 + timedelta`` | \(1) | -+---------------------------------------+-------------------------------+ -| ``datetime2 = datetime1 - timedelta`` | \(2) | -+---------------------------------------+-------------------------------+ -| ``timedelta = datetime1 - datetime2`` | \(3) | -+---------------------------------------+-------------------------------+ -| ``datetime1 < datetime2`` | Compares :class:`datetime` to | -| | :class:`datetime`. (4) | -+---------------------------------------+-------------------------------+ ++---------------------------------------+--------------------------------+ +| Operation | Result | ++=======================================+================================+ +| ``datetime2 = datetime1 + timedelta`` | \(1) | ++---------------------------------------+--------------------------------+ +| ``datetime2 = datetime1 - timedelta`` | \(2) | ++---------------------------------------+--------------------------------+ +| ``timedelta = datetime1 - datetime2`` | \(3) | ++---------------------------------------+--------------------------------+ +| ``datetime1 < datetime2`` | Compares :class:`.datetime` to | +| | :class:`.datetime`. (4) | ++---------------------------------------+--------------------------------+ (1) datetime2 is a duration of timedelta removed from datetime1, moving forward in @@ -811,7 +811,7 @@ in isolation can overflow in cases where datetime1 - timedelta does not. (3) - Subtraction of a :class:`datetime` from a :class:`datetime` is defined only if + Subtraction of a :class:`.datetime` from a :class:`.datetime` is defined only if both operands are naive, or if both are aware. If one is aware and the other is naive, :exc:`TypeError` is raised. @@ -840,16 +840,16 @@ In order to stop comparison from falling back to the default scheme of comparing object addresses, datetime comparison normally raises :exc:`TypeError` if the - other comparand isn't also a :class:`datetime` object. However, + other comparand isn't also a :class:`.datetime` object. However, ``NotImplemented`` is returned instead if the other comparand has a :meth:`timetuple` attribute. This hook gives other kinds of date objects a - chance at implementing mixed-type comparison. If not, when a :class:`datetime` + chance at implementing mixed-type comparison. If not, when a :class:`.datetime` object is compared to an object of a different type, :exc:`TypeError` is raised unless the comparison is ``==`` or ``!=``. The latter cases return :const:`False` or :const:`True`, respectively. -:class:`datetime` objects can be used as dictionary keys. In Boolean contexts, -all :class:`datetime` objects are considered to be true. +:class:`.datetime` objects can be used as dictionary keys. In Boolean contexts, +all :class:`.datetime` objects are considered to be true. Instance methods: @@ -860,13 +860,13 @@ .. method:: datetime.time() - Return :class:`time` object with same hour, minute, second and microsecond. + Return :class:`.time` object with same hour, minute, second and microsecond. :attr:`tzinfo` is ``None``. See also method :meth:`timetz`. .. method:: datetime.timetz() - Return :class:`time` object with same hour, minute, second, microsecond, and + Return :class:`.time` object with same hour, minute, second, microsecond, and tzinfo attributes. See also method :meth:`time`. @@ -880,7 +880,7 @@ .. method:: datetime.astimezone(tz) - 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. @@ -954,7 +954,7 @@ .. method:: datetime.utctimetuple() - If :class:`datetime` instance *d* is naive, this is the same as + If :class:`.datetime` instance *d* is naive, this is the same as ``d.timetuple()`` except that :attr:`tm_isdst` is forced to 0 regardless of what ``d.dst()`` returns. DST is never in effect for a UTC time. @@ -1015,7 +1015,7 @@ .. method:: datetime.__str__() - For a :class:`datetime` instance *d*, ``str(d)`` is equivalent to + For a :class:`.datetime` instance *d*, ``str(d)`` is equivalent to ``d.isoformat(' ')``. @@ -1209,7 +1209,7 @@ Supported operations: -* comparison of :class:`time` to :class:`time`, where *a* is considered less +* 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 the same :attr:`tzinfo` attribute, the common :attr:`tzinfo` attribute is @@ -1217,7 +1217,7 @@ have different :attr:`tzinfo` attributes, the comparands are first adjusted by subtracting their UTC offsets (obtained from ``self.utcoffset()``). In order to stop mixed-type comparisons from falling back to the default comparison by - object address, when a :class:`time` object is compared to an object of a + object address, when a :class:`.time` object is compared to an object of a different type, :exc:`TypeError` is raised unless the comparison is ``==`` or ``!=``. The latter cases return :const:`False` or :const:`True`, respectively. @@ -1225,7 +1225,7 @@ * efficient pickling -* in Boolean contexts, a :class:`time` object is considered to be true if and +* in Boolean contexts, a :class:`.time` object is considered to be true if and only if, after converting it to minutes and subtracting :meth:`utcoffset` (or ``0`` if that's ``None``), the result is non-zero. @@ -1315,11 +1315,11 @@ :class:`tzinfo` is an abstract base class, meaning that this class should not be instantiated directly. You need to derive a concrete subclass, and (at least) supply implementations of the standard :class:`tzinfo` methods needed by the -:class:`datetime` methods you use. The :mod:`datetime` module does not supply +:class:`.datetime` methods you use. The :mod:`datetime` module does not supply any concrete subclasses of :class:`tzinfo`. An instance of (a concrete subclass of) :class:`tzinfo` can be passed to the -constructors for :class:`datetime` and :class:`time` objects. The latter objects +constructors for :class:`.datetime` and :class:`.time` objects. The latter objects view their attributes as being in local time, and the :class:`tzinfo` object supports methods revealing offset of local time from UTC, the name of the time zone, and DST offset, all relative to a date or time object passed to them. @@ -1374,7 +1374,7 @@ ``tz.utcoffset(dt) - tz.dst(dt)`` - must return the same result for every :class:`datetime` *dt* with ``dt.tzinfo == + must return the same result for every :class:`.datetime` *dt* with ``dt.tzinfo == tz`` For sane :class:`tzinfo` subclasses, this expression yields the time zone's "standard offset", which should not depend on the date or the time, but only on geographic location. The implementation of :meth:`datetime.astimezone` @@ -1406,7 +1406,7 @@ .. method:: tzinfo.tzname(self, dt) - Return the time zone name corresponding to the :class:`datetime` object *dt*, as + Return the time zone name corresponding to the :class:`.datetime` object *dt*, as a string. Nothing about string names is defined by the :mod:`datetime` module, and there's no requirement that it mean anything in particular. For example, "GMT", "UTC", "-500", "-5:00", "EDT", "US/Eastern", "America/New York" are all @@ -1419,11 +1419,11 @@ The default implementation of :meth:`tzname` raises :exc:`NotImplementedError`. -These methods are called by a :class:`datetime` or :class:`time` object, in -response to their methods of the same names. A :class:`datetime` object passes -itself as the argument, and a :class:`time` object passes ``None`` as the +These methods are called by a :class:`.datetime` or :class:`.time` object, in +response to their methods of the same names. A :class:`.datetime` object passes +itself as the argument, and a :class:`.time` object passes ``None`` as the argument. A :class:`tzinfo` subclass's methods should therefore be prepared to -accept a *dt* argument of ``None``, or of class :class:`datetime`. +accept a *dt* argument of ``None``, or of class :class:`.datetime`. When ``None`` is passed, it's up to the class designer to decide the best response. For example, returning ``None`` is appropriate if the class wishes to @@ -1431,7 +1431,7 @@ may be more useful for ``utcoffset(None)`` to return the standard UTC offset, as there is no other convention for discovering the standard offset. -When a :class:`datetime` object is passed in response to a :class:`datetime` +When a :class:`.datetime` object is passed in response to a :class:`.datetime` method, ``dt.tzinfo`` is the same object as *self*. :class:`tzinfo` methods can rely on this, unless user code calls :class:`tzinfo` methods directly. The intent is that the :class:`tzinfo` methods interpret *dt* as being in local @@ -1527,18 +1527,18 @@ :meth:`strftime` and :meth:`strptime` Behavior ---------------------------------------------- -:class:`date`, :class:`datetime`, and :class:`time` objects all support a +:class:`date`, :class:`.datetime`, and :class:`.time` objects all support a ``strftime(format)`` method, to create a string representing the time under the control of an explicit format string. Broadly speaking, ``d.strftime(fmt)`` acts like the :mod:`time` module's ``time.strftime(fmt, d.timetuple())`` although not all objects support a :meth:`timetuple` method. Conversely, the :meth:`datetime.strptime` class method creates a -:class:`datetime` object from a string representing a date and time and a +:class:`.datetime` object from a string representing a date and time and a corresponding format string. ``datetime.strptime(date_string, format)`` is equivalent to ``datetime(*(time.strptime(date_string, format)[0:6]))``. -For :class:`time` objects, the format codes for year, month, and day should not +For :class:`.time` objects, the format codes for year, month, and day should not be used, as time objects have no such values. If they're used anyway, ``1900`` is substituted for the year, and ``1`` for the month and day. @@ -1547,7 +1547,7 @@ values. If they're used anyway, ``0`` is substituted for them. .. versionadded:: 2.6 - :class:`time` and :class:`datetime` objects support a ``%f`` format code + :class:`.time` and :class:`.datetime` objects support a ``%f`` format code which expands to the number of microseconds in the object, zero-padded on the left to six places. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Feb 19 02:20:58 2012 From: python-checkins at python.org (ned.deily) Date: Sun, 19 Feb 2012 02:20:58 +0100 Subject: [Python-checkins] =?utf8?b?Y3B5dGhvbiAoMi43KTogSXNzdWUgIzEyNjI3?= =?utf8?q?=3A_Implement_PEP_394_for_OS_X_framework_builds=2E?= Message-ID: http://hg.python.org/cpython/rev/499796937b7a changeset: 75022:499796937b7a branch: 2.7 user: Ned Deily date: Sun Feb 19 02:19:12 2012 +0100 summary: Issue #12627: Implement PEP 394 for OS X framework builds. OS X framework builds already created versioned symlinks for all executables and scripts installed in the framework bin directory, of the general form ${cmd} - ${cmd}2.7. The changes here add a hierarchy of ${cmd} -> ${cmd}2 -> ${cmd}2.7. Per previous practice, all of the links are created in the framework bin directory for both the install and altinstall targets. This is consistent with the long-standing recommendation to manage multiple framework versions by adding and ordering framework bin directories on $PATH. Also, per past practice, symlinks to all framework bin entries are created in $prefix/bin (by default, /usr/local/bin) for the install target and only versioned links are created for altinstall, although the use of these links is not recommended for framework builds and their installation is optional with the standard OS X installers. files: Mac/Makefile.in | 29 ++++++++++++++++++----------- Misc/NEWS | 2 ++ 2 files changed, 20 insertions(+), 11 deletions(-) diff --git a/Mac/Makefile.in b/Mac/Makefile.in --- a/Mac/Makefile.in +++ b/Mac/Makefile.in @@ -52,13 +52,17 @@ install_pythonw: pythonw $(INSTALL_PROGRAM) $(STRIPFLAG) pythonw "$(DESTDIR)$(prefix)/bin/pythonw$(VERSION)" $(INSTALL_PROGRAM) $(STRIPFLAG) pythonw "$(DESTDIR)$(prefix)/bin/python$(VERSION)" - ln -sf python$(VERSION) "$(DESTDIR)$(prefix)/bin/python" - ln -sf pythonw$(VERSION) "$(DESTDIR)$(prefix)/bin/pythonw" + ln -sf python$(VERSION) "$(DESTDIR)$(prefix)/bin/python2" + ln -sf python2 "$(DESTDIR)$(prefix)/bin/python" + ln -sf pythonw$(VERSION) "$(DESTDIR)$(prefix)/bin/pythonw2" + ln -sf pythonw2 "$(DESTDIR)$(prefix)/bin/pythonw" ifneq ($(LIPO_32BIT_FLAGS),) lipo $(LIPO_32BIT_FLAGS) -output $(DESTDIR)$(prefix)/bin/python$(VERSION)-32 pythonw lipo $(LIPO_32BIT_FLAGS) -output $(DESTDIR)$(prefix)/bin/pythonw$(VERSION)-32 pythonw - ln -sf python$(VERSION)-32 "$(DESTDIR)$(prefix)/bin/python-32" - ln -sf pythonw$(VERSION)-32 "$(DESTDIR)$(prefix)/bin/pythonw-32" + ln -sf python$(VERSION)-32 "$(DESTDIR)$(prefix)/bin/python2-32" + ln -sf python2-32 "$(DESTDIR)$(prefix)/bin/python-32" + ln -sf pythonw$(VERSION)-32 "$(DESTDIR)$(prefix)/bin/pythonw2-32" + ln -sf pythonw2-32 "$(DESTDIR)$(prefix)/bin/pythonw-32" endif @@ -71,6 +75,9 @@ $(INSTALL) -d -m $(DIRMODE) "$(DESTDIR)$(FRAMEWORKUNIXTOOLSPREFIX)/bin" ;\ fi for fn in python pythonw idle pydoc python-config smtpd.py 2to3 \ + python2 pythonw2 idle2 \ + pydoc2 python2-config smtpd2.py \ + 2to3-2 \ python$(VERSION) pythonw$(VERSION) idle$(VERSION) \ pydoc$(VERSION) python$(VERSION)-config smtpd$(VERSION).py \ 2to3-$(VERSION) ;\ @@ -79,6 +86,7 @@ done ifneq ($(LIPO_32BIT_FLAGS),) for fn in python-32 pythonw-32 \ + python2-32 pythonw2-32 \ python$(VERSION)-32 pythonw$(VERSION)-32 ;\ do \ ln -fs "$(prefix)/bin/$${fn}" "$(DESTDIR)$(FRAMEWORKUNIXTOOLSPREFIX)/bin/$${fn}" ;\ @@ -117,19 +125,18 @@ continue ;\ fi ;\ mv "$(DESTDIR)$(prefix)/bin/$${fn}" "$(DESTDIR)$(prefix)/bin/$${fn}$(VERSION)" ;\ - ln -sf "$${fn}$(VERSION)" "$(DESTDIR)$(prefix)/bin/$${fn}" ;\ + ln -sf "$${fn}$(VERSION)" "$(DESTDIR)$(prefix)/bin/$${fn}2" ;\ + ln -sf "$${fn}2" "$(DESTDIR)$(prefix)/bin/$${fn}" ;\ done - if [ ! -h "$(DESTDIR)$(prefix)/bin/python-config" ]; then \ - mv "$(DESTDIR)$(prefix)/bin/python-config" "$(DESTDIR)$(prefix)/bin/python$(VERSION)-config" ;\ - ln -sf "python$(VERSION)-config" "$(DESTDIR)$(prefix)/bin/python-config" ; \ - fi if [ ! -h "$(DESTDIR)$(prefix)/bin/smtpd.py" ]; then \ mv "$(DESTDIR)$(prefix)/bin/smtpd.py" "$(DESTDIR)$(prefix)/bin/smtpd$(VERSION).py" ;\ - ln -sf "smtpd$(VERSION).py" "$(DESTDIR)$(prefix)/bin/smtpd.py" ;\ + ln -sf "smtpd$(VERSION).py" "$(DESTDIR)$(prefix)/bin/smtpd2.py" ;\ + ln -sf "smtpd2.py" "$(DESTDIR)$(prefix)/bin/smtpd.py" ;\ fi if [ ! -h "$(DESTDIR)$(prefix)/bin/2to3" ]; then \ mv "$(DESTDIR)$(prefix)/bin/2to3" "$(DESTDIR)$(prefix)/bin/2to3-$(VERSION)" ;\ - ln -sf "2to3-$(VERSION)" "$(DESTDIR)$(prefix)/bin/2to3" ;\ + ln -sf "2to3-$(VERSION)" "$(DESTDIR)$(prefix)/bin/2to3-2" ;\ + ln -sf "2to3-2" "$(DESTDIR)$(prefix)/bin/2to3" ;\ fi diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -507,6 +507,8 @@ Build ----- +- Issue #12627: Implement PEP 394 for Python 2.7 ("python2"). + - 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 -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Feb 19 03:52:31 2012 From: python-checkins at python.org (jesus.cea) Date: Sun, 19 Feb 2012 03:52:31 +0100 Subject: [Python-checkins] =?utf8?q?cpython=3A_Test_for_issue_=2313500?= Message-ID: http://hg.python.org/cpython/rev/5af5e6b2c053 changeset: 75023:5af5e6b2c053 parent: 75020:5a19909f5845 user: Jesus Cea date: Sun Feb 19 03:52:23 2012 +0100 summary: Test for issue #13500 files: Lib/test/test_cmd.py | 29 +++++++++++++++++++++++++++++ 1 files changed, 29 insertions(+), 0 deletions(-) diff --git a/Lib/test/test_cmd.py b/Lib/test/test_cmd.py --- a/Lib/test/test_cmd.py +++ b/Lib/test/test_cmd.py @@ -180,6 +180,14 @@ def do_EOF(self, args): return True + + class simplecmd2(simplecmd): + + def do_EOF(self, args): + print('*** Unknown syntax: EOF', file=self.stdout) + return True + + def test_file_with_missing_final_nl(self): input = io.StringIO("print test\nprint test2") output = io.StringIO() @@ -192,6 +200,27 @@ "(Cmd) ")) + def test_input_reset_at_EOF(self): + input = io.StringIO("print test\nprint test2") + output = io.StringIO() + cmd = self.simplecmd2(stdin=input, stdout=output) + cmd.use_rawinput = False + cmd.cmdloop() + self.assertMultiLineEqual(output.getvalue(), + ("(Cmd) test\n" + "(Cmd) test2\n" + "(Cmd) *** Unknown syntax: EOF\n")) + input = io.StringIO("print \n\n") + output = io.StringIO() + cmd.stdin = input + cmd.stdout = output + cmd.cmdloop() + self.assertMultiLineEqual(output.getvalue(), + ("(Cmd) \n" + "(Cmd) \n" + "(Cmd) *** Unknown syntax: EOF\n")) + + def test_main(verbose=None): from test import test_cmd support.run_doctest(test_cmd, verbose) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Feb 19 03:55:08 2012 From: python-checkins at python.org (jesus.cea) Date: Sun, 19 Feb 2012 03:55:08 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=282=2E7=29=3A_Test_for_issue_?= =?utf8?q?=2313500?= Message-ID: http://hg.python.org/cpython/rev/0d442e166c8f changeset: 75024:0d442e166c8f branch: 2.7 parent: 75022:499796937b7a user: Jesus Cea date: Sun Feb 19 03:54:08 2012 +0100 summary: Test for issue #13500 files: Lib/test/test_cmd.py | 29 +++++++++++++++++++++++++++++ 1 files changed, 29 insertions(+), 0 deletions(-) diff --git a/Lib/test/test_cmd.py b/Lib/test/test_cmd.py --- a/Lib/test/test_cmd.py +++ b/Lib/test/test_cmd.py @@ -182,6 +182,14 @@ def do_EOF(self, args): return True + + class simplecmd2(simplecmd): + + def do_EOF(self, args): + print('*** Unknown syntax: EOF', file=self.stdout) + return True + + def test_file_with_missing_final_nl(self): input = StringIO.StringIO("print test\nprint test2") output = StringIO.StringIO() @@ -194,6 +202,27 @@ "(Cmd) ")) + def test_input_reset_at_EOF(self): + input = io.StringIO("print test\nprint test2") + output = io.StringIO() + cmd = self.simplecmd2(stdin=input, stdout=output) + cmd.use_rawinput = False + cmd.cmdloop() + self.assertMultiLineEqual(output.getvalue(), + ("(Cmd) test\n" + "(Cmd) test2\n" + "(Cmd) *** Unknown syntax: EOF\n")) + input = io.StringIO("print \n\n") + output = io.StringIO() + cmd.stdin = input + cmd.stdout = output + cmd.cmdloop() + self.assertMultiLineEqual(output.getvalue(), + ("(Cmd) \n" + "(Cmd) \n" + "(Cmd) *** Unknown syntax: EOF\n")) + + def test_main(verbose=None): from test import test_cmd test_support.run_doctest(test_cmd, verbose) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Feb 19 03:55:10 2012 From: python-checkins at python.org (jesus.cea) Date: Sun, 19 Feb 2012 03:55:10 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=283=2E2=29=3A_Test_for_issue_?= =?utf8?q?=2313500?= Message-ID: http://hg.python.org/cpython/rev/3a40af30449e changeset: 75025:3a40af30449e branch: 3.2 parent: 75019:9ce5d456138b user: Jesus Cea date: Sun Feb 19 03:54:29 2012 +0100 summary: Test for issue #13500 files: Lib/test/test_cmd.py | 29 +++++++++++++++++++++++++++++ 1 files changed, 29 insertions(+), 0 deletions(-) diff --git a/Lib/test/test_cmd.py b/Lib/test/test_cmd.py --- a/Lib/test/test_cmd.py +++ b/Lib/test/test_cmd.py @@ -180,6 +180,14 @@ def do_EOF(self, args): return True + + class simplecmd2(simplecmd): + + def do_EOF(self, args): + print('*** Unknown syntax: EOF', file=self.stdout) + return True + + def test_file_with_missing_final_nl(self): input = io.StringIO("print test\nprint test2") output = io.StringIO() @@ -192,6 +200,27 @@ "(Cmd) ")) + def test_input_reset_at_EOF(self): + input = io.StringIO("print test\nprint test2") + output = io.StringIO() + cmd = self.simplecmd2(stdin=input, stdout=output) + cmd.use_rawinput = False + cmd.cmdloop() + self.assertMultiLineEqual(output.getvalue(), + ("(Cmd) test\n" + "(Cmd) test2\n" + "(Cmd) *** Unknown syntax: EOF\n")) + input = io.StringIO("print \n\n") + output = io.StringIO() + cmd.stdin = input + cmd.stdout = output + cmd.cmdloop() + self.assertMultiLineEqual(output.getvalue(), + ("(Cmd) \n" + "(Cmd) \n" + "(Cmd) *** Unknown syntax: EOF\n")) + + def test_main(verbose=None): from test import test_cmd support.run_doctest(test_cmd, verbose) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Feb 19 03:55:11 2012 From: python-checkins at python.org (jesus.cea) Date: Sun, 19 Feb 2012 03:55:11 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_3=2E2_-=3E_default=29?= =?utf8?q?=3A_MERGE=3A_Test_for_issue_=2313500?= Message-ID: http://hg.python.org/cpython/rev/ad204ed6ac51 changeset: 75026:ad204ed6ac51 parent: 75023:5af5e6b2c053 parent: 75025:3a40af30449e user: Jesus Cea date: Sun Feb 19 03:54:59 2012 +0100 summary: MERGE: Test for issue #13500 files: -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Feb 19 04:21:27 2012 From: python-checkins at python.org (jesus.cea) Date: Sun, 19 Feb 2012 04:21:27 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=282=2E7=29=3A_Fix_Test_for_is?= =?utf8?q?sue_=2313500?= Message-ID: http://hg.python.org/cpython/rev/2909e60e7e13 changeset: 75027:2909e60e7e13 branch: 2.7 parent: 75024:0d442e166c8f user: Jesus Cea date: Sun Feb 19 04:20:45 2012 +0100 summary: Fix Test for issue #13500 files: Lib/test/test_cmd.py | 10 +++++----- 1 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Lib/test/test_cmd.py b/Lib/test/test_cmd.py --- a/Lib/test/test_cmd.py +++ b/Lib/test/test_cmd.py @@ -186,7 +186,7 @@ class simplecmd2(simplecmd): def do_EOF(self, args): - print('*** Unknown syntax: EOF', file=self.stdout) + print >>self.stdout, '*** Unknown syntax: EOF' return True @@ -203,8 +203,8 @@ def test_input_reset_at_EOF(self): - input = io.StringIO("print test\nprint test2") - output = io.StringIO() + input = StringIO.StringIO("print test\nprint test2") + output = StringIO.StringIO() cmd = self.simplecmd2(stdin=input, stdout=output) cmd.use_rawinput = False cmd.cmdloop() @@ -212,8 +212,8 @@ ("(Cmd) test\n" "(Cmd) test2\n" "(Cmd) *** Unknown syntax: EOF\n")) - input = io.StringIO("print \n\n") - output = io.StringIO() + input = StringIO.StringIO("print \n\n") + output = StringIO.StringIO() cmd.stdin = input cmd.stdout = output cmd.cmdloop() -- Repository URL: http://hg.python.org/cpython From solipsis at pitrou.net Sun Feb 19 05:32:30 2012 From: solipsis at pitrou.net (solipsis at pitrou.net) Date: Sun, 19 Feb 2012 05:32:30 +0100 Subject: [Python-checkins] Daily reference leaks (5a19909f5845): sum=0 Message-ID: results for 5a19909f5845 on branch "default" -------------------------------------------- Command line was: ['./python', '-m', 'test.regrtest', '-uall', '-R', '3:3:/home/antoine/cpython/refleaks/reflog_VtPov', '-x'] From python-checkins at python.org Sun Feb 19 07:14:39 2012 From: python-checkins at python.org (benjamin.peterson) Date: Sun, 19 Feb 2012 07:14:39 +0100 Subject: [Python-checkins] =?utf8?q?cpython=3A_allow_arbitrary_attributes_?= =?utf8?q?on_classmethod_and_staticmethod_=28closes_=2314051=29?= Message-ID: http://hg.python.org/cpython/rev/f46deae68e34 changeset: 75028:f46deae68e34 parent: 75026:ad204ed6ac51 user: Benjamin Peterson date: Sun Feb 19 01:10:25 2012 -0500 summary: allow arbitrary attributes on classmethod and staticmethod (closes #14051) files: Lib/test/test_descr.py | 13 +++++++++++++ Misc/NEWS | 3 +++ Objects/funcobject.c | 30 +++++++++++++++++++++++++++--- 3 files changed, 43 insertions(+), 3 deletions(-) diff --git a/Lib/test/test_descr.py b/Lib/test/test_descr.py --- a/Lib/test/test_descr.py +++ b/Lib/test/test_descr.py @@ -1443,6 +1443,13 @@ else: self.fail("classmethod shouldn't accept keyword args") + cm = classmethod(f) + 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... @@ -1474,6 +1481,12 @@ self.assertEqual(d.goo(1), (1,)) self.assertEqual(d.foo(1), (d, 1)) self.assertEqual(D.foo(d, 1), (d, 1)) + sm = staticmethod(None) + 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): diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -10,6 +10,9 @@ Core and Builtins ----------------- +- Issue #14051: Allow arbitrary attributes to be set of classmethod and + staticmethod. + - Issue #13020: Fix a reference leak when allocating a structsequence object fails. Patch by Suman Saha. diff --git a/Objects/funcobject.c b/Objects/funcobject.c --- a/Objects/funcobject.c +++ b/Objects/funcobject.c @@ -754,6 +754,7 @@ typedef struct { PyObject_HEAD PyObject *cm_callable; + PyObject *cm_dict; } classmethod; static void @@ -761,6 +762,7 @@ { _PyObject_GC_UNTRACK((PyObject *)cm); Py_XDECREF(cm->cm_callable); + Py_XDECREF(cm->cm_dict); Py_TYPE(cm)->tp_free((PyObject *)cm); } @@ -768,6 +770,7 @@ cm_traverse(classmethod *cm, visitproc visit, void *arg) { Py_VISIT(cm->cm_callable); + Py_VISIT(cm->cm_dict); return 0; } @@ -775,6 +778,7 @@ cm_clear(classmethod *cm) { Py_CLEAR(cm->cm_callable); + Py_CLEAR(cm->cm_dict); return 0; } @@ -827,11 +831,19 @@ Py_RETURN_FALSE; } +static PyObject * +cm_get___dict__(classmethod *cm, void *closure) +{ + Py_INCREF(cm->cm_dict); + return cm->cm_dict; +} + static PyGetSetDef cm_getsetlist[] = { {"__isabstractmethod__", (getter)cm_get___isabstractmethod__, NULL, NULL, NULL}, + {"__dict__", (getter)cm_get___dict__, NULL, NULL, NULL}, {NULL} /* Sentinel */ }; @@ -891,7 +903,7 @@ 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 */ @@ -930,6 +942,7 @@ typedef struct { PyObject_HEAD PyObject *sm_callable; + PyObject *sm_dict; } staticmethod; static void @@ -937,6 +950,7 @@ { _PyObject_GC_UNTRACK((PyObject *)sm); Py_XDECREF(sm->sm_callable); + Py_XDECREF(sm->sm_dict); Py_TYPE(sm)->tp_free((PyObject *)sm); } @@ -944,6 +958,7 @@ sm_traverse(staticmethod *sm, visitproc visit, void *arg) { Py_VISIT(sm->sm_callable); + Py_VISIT(sm->sm_dict); return 0; } @@ -952,6 +967,7 @@ { Py_XDECREF(sm->sm_callable); sm->sm_callable = NULL; + Py_CLEAR(sm->sm_dict); return 0; } @@ -1003,11 +1019,19 @@ Py_RETURN_FALSE; } +static PyObject * +sm_get___dict__(staticmethod *sm, void *closure) +{ + Py_INCREF(sm->sm_dict); + return sm->sm_dict; +} + static PyGetSetDef sm_getsetlist[] = { {"__isabstractmethod__", (getter)sm_get___isabstractmethod__, NULL, NULL, NULL}, + {"__dict__", (getter)sm_get___dict__, NULL, NULL, NULL}, {NULL} /* Sentinel */ }; @@ -1046,7 +1070,7 @@ 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, @@ -1064,7 +1088,7 @@ 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 */ -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Feb 19 07:14:40 2012 From: python-checkins at python.org (benjamin.peterson) Date: Sun, 19 Feb 2012 07:14:40 +0100 Subject: [Python-checkins] =?utf8?b?Y3B5dGhvbiAoMy4yKTogdXNlIFB5X0NMRUFS?= Message-ID: http://hg.python.org/cpython/rev/ddaf9a2a1d63 changeset: 75029:ddaf9a2a1d63 branch: 3.2 parent: 75025:3a40af30449e user: Benjamin Peterson date: Sun Feb 19 01:11:56 2012 -0500 summary: use Py_CLEAR files: Objects/funcobject.c | 4 +--- 1 files changed, 1 insertions(+), 3 deletions(-) diff --git a/Objects/funcobject.c b/Objects/funcobject.c --- a/Objects/funcobject.c +++ b/Objects/funcobject.c @@ -889,9 +889,7 @@ static int sm_clear(staticmethod *sm) { - Py_XDECREF(sm->sm_callable); - sm->sm_callable = NULL; - + Py_CLEAR(sm->sm_callable); return 0; } -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Feb 19 07:14:40 2012 From: python-checkins at python.org (benjamin.peterson) Date: Sun, 19 Feb 2012 07:14:40 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_3=2E2_-=3E_default=29?= =?utf8?q?=3A_merge_3=2E2?= Message-ID: http://hg.python.org/cpython/rev/7cba5bddc0ad changeset: 75030:7cba5bddc0ad parent: 75028:f46deae68e34 parent: 75029:ddaf9a2a1d63 user: Benjamin Peterson date: Sun Feb 19 01:14:21 2012 -0500 summary: merge 3.2 files: Objects/funcobject.c | 4 +--- 1 files changed, 1 insertions(+), 3 deletions(-) diff --git a/Objects/funcobject.c b/Objects/funcobject.c --- a/Objects/funcobject.c +++ b/Objects/funcobject.c @@ -965,10 +965,8 @@ static int sm_clear(staticmethod *sm) { - Py_XDECREF(sm->sm_callable); - sm->sm_callable = NULL; + Py_CLEAR(sm->sm_callable); Py_CLEAR(sm->sm_dict); - return 0; } -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Feb 19 07:14:41 2012 From: python-checkins at python.org (benjamin.peterson) Date: Sun, 19 Feb 2012 07:14:41 +0100 Subject: [Python-checkins] =?utf8?b?Y3B5dGhvbiAoMi43KTogdXNlIFB5X0NMRUFS?= Message-ID: http://hg.python.org/cpython/rev/520d2818ff38 changeset: 75031:520d2818ff38 branch: 2.7 parent: 75027:2909e60e7e13 user: Benjamin Peterson date: Sun Feb 19 01:11:56 2012 -0500 summary: use Py_CLEAR files: Objects/funcobject.c | 4 +--- 1 files changed, 1 insertions(+), 3 deletions(-) diff --git a/Objects/funcobject.c b/Objects/funcobject.c --- a/Objects/funcobject.c +++ b/Objects/funcobject.c @@ -784,9 +784,7 @@ static int sm_clear(staticmethod *sm) { - Py_XDECREF(sm->sm_callable); - sm->sm_callable = NULL; - + Py_CLEAR(sm->sm_callable); return 0; } -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Feb 19 07:16:17 2012 From: python-checkins at python.org (benjamin.peterson) Date: Sun, 19 Feb 2012 07:16:17 +0100 Subject: [Python-checkins] =?utf8?q?cpython=3A_use_defaults?= Message-ID: http://hg.python.org/cpython/rev/a9f090728729 changeset: 75032:a9f090728729 parent: 75030:7cba5bddc0ad user: Benjamin Peterson date: Sun Feb 19 01:16:13 2012 -0500 summary: use defaults files: Objects/funcobject.c | 6 +++--- 1 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Objects/funcobject.c b/Objects/funcobject.c --- a/Objects/funcobject.c +++ b/Objects/funcobject.c @@ -707,8 +707,8 @@ 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 */ @@ -885,7 +885,7 @@ 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, -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Feb 19 12:33:49 2012 From: python-checkins at python.org (sandro.tosi) Date: Sun, 19 Feb 2012 12:33:49 +0100 Subject: [Python-checkins] =?utf8?b?Y3B5dGhvbiAoMy4yKTogSW5kZW50ICdGaWxl?= =?utf8?q?=27_in_memoryview_example=2C_so_it_is_correctly_highlighted?= Message-ID: http://hg.python.org/cpython/rev/c3e0a0c79696 changeset: 75033:c3e0a0c79696 branch: 3.2 parent: 75029:ddaf9a2a1d63 user: Sandro Tosi date: Sun Feb 19 12:28:01 2012 +0100 summary: Indent 'File' in memoryview example, so it is correctly highlighted files: Doc/library/stdtypes.rst | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Doc/library/stdtypes.rst b/Doc/library/stdtypes.rst --- a/Doc/library/stdtypes.rst +++ b/Doc/library/stdtypes.rst @@ -2378,7 +2378,7 @@ bytearray(b'z123fg') >>> v[2] = b'spam' Traceback (most recent call last): - File "", line 1, in + File "", line 1, in ValueError: cannot modify size of memoryview object Notice how the size of the memoryview object cannot be changed. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Feb 19 12:33:50 2012 From: python-checkins at python.org (sandro.tosi) Date: Sun, 19 Feb 2012 12:33:50 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_3=2E2_-=3E_default=29?= =?utf8?q?=3A_merge_with_3=2E2?= Message-ID: http://hg.python.org/cpython/rev/ea74ed5b9a2b changeset: 75034:ea74ed5b9a2b parent: 75032:a9f090728729 parent: 75033:c3e0a0c79696 user: Sandro Tosi date: Sun Feb 19 12:28:18 2012 +0100 summary: merge with 3.2 files: Doc/library/stdtypes.rst | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Doc/library/stdtypes.rst b/Doc/library/stdtypes.rst --- a/Doc/library/stdtypes.rst +++ b/Doc/library/stdtypes.rst @@ -2424,7 +2424,7 @@ bytearray(b'z123fg') >>> v[2] = b'spam' Traceback (most recent call last): - File "", line 1, in + File "", line 1, in ValueError: cannot modify size of memoryview object Notice how the size of the memoryview object cannot be changed. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Feb 19 12:36:03 2012 From: python-checkins at python.org (sandro.tosi) Date: Sun, 19 Feb 2012 12:36:03 +0100 Subject: [Python-checkins] =?utf8?b?Y3B5dGhvbiAoMi43KTogZG9uJ3Qgc3BsaXQg?= =?utf8?q?=27Hye-Shik_Chang=27_name=3B_thanks_to_Sergey_from_docs=40?= Message-ID: http://hg.python.org/cpython/rev/7470d3915acc changeset: 75035:7470d3915acc branch: 2.7 parent: 75031:520d2818ff38 user: Sandro Tosi date: Sun Feb 19 12:29:43 2012 +0100 summary: don't split 'Hye-Shik Chang' name; thanks to Sergey from docs@ files: Doc/whatsnew/2.4.rst | 6 +++--- 1 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Doc/whatsnew/2.4.rst b/Doc/whatsnew/2.4.rst --- a/Doc/whatsnew/2.4.rst +++ b/Doc/whatsnew/2.4.rst @@ -1554,7 +1554,7 @@ ================ The author would like to thank the following people for offering suggestions, -corrections and assistance with various drafts of this article: Koray Can, Hye- -Shik Chang, Michael Dyck, Raymond Hettinger, Brian Hurt, Hamish Lawson, Fredrik -Lundh, Sean Reifschneider, Sadruddin Rejeb. +corrections and assistance with various drafts of this article: Koray Can, +Hye-Shik Chang, Michael Dyck, Raymond Hettinger, Brian Hurt, Hamish Lawson, +Fredrik Lundh, Sean Reifschneider, Sadruddin Rejeb. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Feb 19 12:36:04 2012 From: python-checkins at python.org (sandro.tosi) Date: Sun, 19 Feb 2012 12:36:04 +0100 Subject: [Python-checkins] =?utf8?b?Y3B5dGhvbiAoMy4yKTogZG9uJ3Qgc3BsaXQg?= =?utf8?q?=27Hye-Shik_Chang=27_name=3B_thanks_to_Sergey_from_docs=40?= Message-ID: http://hg.python.org/cpython/rev/86a4a71da735 changeset: 75036:86a4a71da735 branch: 3.2 parent: 75033:c3e0a0c79696 user: Sandro Tosi date: Sun Feb 19 12:30:28 2012 +0100 summary: don't split 'Hye-Shik Chang' name; thanks to Sergey from docs@ files: Doc/whatsnew/2.4.rst | 6 +++--- 1 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Doc/whatsnew/2.4.rst b/Doc/whatsnew/2.4.rst --- a/Doc/whatsnew/2.4.rst +++ b/Doc/whatsnew/2.4.rst @@ -1554,7 +1554,7 @@ ================ The author would like to thank the following people for offering suggestions, -corrections and assistance with various drafts of this article: Koray Can, Hye- -Shik Chang, Michael Dyck, Raymond Hettinger, Brian Hurt, Hamish Lawson, Fredrik -Lundh, Sean Reifschneider, Sadruddin Rejeb. +corrections and assistance with various drafts of this article: Koray Can, +Hye-Shik Chang, Michael Dyck, Raymond Hettinger, Brian Hurt, Hamish Lawson, +Fredrik Lundh, Sean Reifschneider, Sadruddin Rejeb. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Feb 19 12:36:05 2012 From: python-checkins at python.org (sandro.tosi) Date: Sun, 19 Feb 2012 12:36:05 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_3=2E2_-=3E_default=29?= =?utf8?q?=3A_merge_with_3=2E2?= Message-ID: http://hg.python.org/cpython/rev/e550ed6f3352 changeset: 75037:e550ed6f3352 parent: 75034:ea74ed5b9a2b parent: 75036:86a4a71da735 user: Sandro Tosi date: Sun Feb 19 12:30:47 2012 +0100 summary: merge with 3.2 files: Doc/whatsnew/2.4.rst | 6 +++--- 1 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Doc/whatsnew/2.4.rst b/Doc/whatsnew/2.4.rst --- a/Doc/whatsnew/2.4.rst +++ b/Doc/whatsnew/2.4.rst @@ -1554,7 +1554,7 @@ ================ The author would like to thank the following people for offering suggestions, -corrections and assistance with various drafts of this article: Koray Can, Hye- -Shik Chang, Michael Dyck, Raymond Hettinger, Brian Hurt, Hamish Lawson, Fredrik -Lundh, Sean Reifschneider, Sadruddin Rejeb. +corrections and assistance with various drafts of this article: Koray Can, +Hye-Shik Chang, Michael Dyck, Raymond Hettinger, Brian Hurt, Hamish Lawson, +Fredrik Lundh, Sean Reifschneider, Sadruddin Rejeb. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Feb 19 16:17:34 2012 From: python-checkins at python.org (benjamin.peterson) Date: Sun, 19 Feb 2012 16:17:34 +0100 Subject: [Python-checkins] =?utf8?q?cpython=3A_initialize_=5F=5Fdict=5F=5F?= =?utf8?q?_if_needed?= Message-ID: http://hg.python.org/cpython/rev/336a614f35a3 changeset: 75038:336a614f35a3 user: Benjamin Peterson date: Sun Feb 19 10:17:30 2012 -0500 summary: initialize __dict__ if needed files: Lib/test/test_descr.py | 2 ++ Objects/funcobject.c | 18 ++++++++++++------ 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/Lib/test/test_descr.py b/Lib/test/test_descr.py --- a/Lib/test/test_descr.py +++ b/Lib/test/test_descr.py @@ -1444,6 +1444,7 @@ 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}) @@ -1482,6 +1483,7 @@ 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}) diff --git a/Objects/funcobject.c b/Objects/funcobject.c --- a/Objects/funcobject.c +++ b/Objects/funcobject.c @@ -832,10 +832,13 @@ } static PyObject * -cm_get___dict__(classmethod *cm, void *closure) +cm_get___dict__(PyObject *cm, void *closure) { - Py_INCREF(cm->cm_dict); - return cm->cm_dict; + PyObject **dictptr = _PyObject_GetDictPtr(cm); + if (*dictptr == NULL) + *dictptr = PyDict_New(); + Py_XINCREF(*dictptr); + return *dictptr; } static PyGetSetDef cm_getsetlist[] = { @@ -1018,10 +1021,13 @@ } static PyObject * -sm_get___dict__(staticmethod *sm, void *closure) +sm_get___dict__(PyObject *sm, void *closure) { - Py_INCREF(sm->sm_dict); - return sm->sm_dict; + PyObject **dictptr = _PyObject_GetDictPtr(sm); + if (*dictptr == NULL) + *dictptr = PyDict_New(); + Py_XINCREF(*dictptr); + return *dictptr; } static PyGetSetDef sm_getsetlist[] = { -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Feb 19 19:59:37 2012 From: python-checkins at python.org (sandro.tosi) Date: Sun, 19 Feb 2012 19:59:37 +0100 Subject: [Python-checkins] =?utf8?b?Y3B5dGhvbiAoMy4yKTogSXNzdWUgIzEzNjA1?= =?utf8?q?=3A_use_print=28=29_in_argparse_nargs_example?= Message-ID: http://hg.python.org/cpython/rev/996efb0425c5 changeset: 75039:996efb0425c5 branch: 3.2 parent: 75036:86a4a71da735 user: Sandro Tosi date: Sun Feb 19 19:54:00 2012 +0100 summary: Issue #13605: use print() in argparse nargs example files: Doc/library/argparse.rst | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Doc/library/argparse.rst b/Doc/library/argparse.rst --- a/Doc/library/argparse.rst +++ b/Doc/library/argparse.rst @@ -848,7 +848,7 @@ >>> parser.add_argument('--foo') >>> parser.add_argument('command') >>> parser.add_argument('args', nargs=argparse.REMAINDER) - >>> print parser.parse_args('--foo B cmd --arg1 XX ZZ'.split()) + >>> print(parser.parse_args('--foo B cmd --arg1 XX ZZ'.split())) Namespace(args=['--arg1', 'XX', 'ZZ'], command='cmd', foo='B') If the ``nargs`` keyword argument is not provided, the number of arguments consumed -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Feb 19 19:59:38 2012 From: python-checkins at python.org (sandro.tosi) Date: Sun, 19 Feb 2012 19:59:38 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_3=2E2_-=3E_default=29?= =?utf8?q?=3A_Issue_=2313605=3A_merge_with_3=2E2?= Message-ID: http://hg.python.org/cpython/rev/c3daa6a834c6 changeset: 75040:c3daa6a834c6 parent: 75038:336a614f35a3 parent: 75039:996efb0425c5 user: Sandro Tosi date: Sun Feb 19 19:54:23 2012 +0100 summary: Issue #13605: merge with 3.2 files: Doc/library/argparse.rst | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Doc/library/argparse.rst b/Doc/library/argparse.rst --- a/Doc/library/argparse.rst +++ b/Doc/library/argparse.rst @@ -867,7 +867,7 @@ >>> parser.add_argument('--foo') >>> parser.add_argument('command') >>> parser.add_argument('args', nargs=argparse.REMAINDER) - >>> print parser.parse_args('--foo B cmd --arg1 XX ZZ'.split()) + >>> print(parser.parse_args('--foo B cmd --arg1 XX ZZ'.split())) Namespace(args=['--arg1', 'XX', 'ZZ'], command='cmd', foo='B') If the ``nargs`` keyword argument is not provided, the number of arguments consumed -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Feb 19 20:25:35 2012 From: python-checkins at python.org (martin.v.loewis) Date: Sun, 19 Feb 2012 20:25:35 +0100 Subject: [Python-checkins] =?utf8?q?cpython=3A_Use_=5F=5Fslots=5F=5F_throu?= =?utf8?q?ghout_instead_of_=5F=5Fdict=5F=5F=2C_to_reduce_the_memory_usage?= =?utf8?q?=2E?= Message-ID: http://hg.python.org/cpython/rev/3931f043b79a changeset: 75041:3931f043b79a user: Martin v. L?wis date: Sun Feb 19 20:25:12 2012 +0100 summary: Use __slots__ throughout instead of __dict__, to reduce the memory usage. files: Lib/xml/dom/expatbuilder.py | 39 +-- Lib/xml/dom/minidom.py | 216 +++++++++++------------ 2 files changed, 114 insertions(+), 141 deletions(-) diff --git a/Lib/xml/dom/expatbuilder.py b/Lib/xml/dom/expatbuilder.py --- a/Lib/xml/dom/expatbuilder.py +++ b/Lib/xml/dom/expatbuilder.py @@ -283,27 +283,23 @@ 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 +359,8 @@ 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,11 +754,8 @@ 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.ownerDocuemnt = self.document _set_attribute_node(node, a) del self._ns_ordered_prefixes[:] @@ -785,12 +775,9 @@ 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 --- a/Lib/xml/dom/minidom.py +++ b/Lib/xml/dom/minidom.py @@ -286,10 +286,10 @@ 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 +342,10 @@ 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 +353,11 @@ 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 +365,10 @@ # 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 +376,30 @@ 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 +407,16 @@ 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 +591,8 @@ _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 +603,8 @@ _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 +664,9 @@ _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,10 +682,12 @@ 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 self._attrs = {} # attributes are double-indexed: self._attrsNS = {} # tagName -> Attribute @@ -688,9 +698,10 @@ # namespaces. 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 @@ -718,14 +729,11 @@ 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,23 +741,18 @@ 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): return self._attrs.get(attrname) @@ -874,7 +877,7 @@ 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) @@ -893,8 +896,7 @@ # 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 @@ -938,54 +940,49 @@ 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" % (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 + self._data = data - _get_nodeValue = _get_data - _set_nodeValue = _set_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,11 +1039,6 @@ 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__ = () - nodeType = Node.TEXT_NODE nodeName = "#text" attributes = None @@ -1112,9 +1104,7 @@ else: break if content: - d = self.__dict__ - d['data'] = content - d['nodeValue'] = content + self.data = content return self else: return None @@ -1160,7 +1150,8 @@ 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,11 +1160,6 @@ 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__ = () - nodeType = Node.CDATA_SECTION_NODE nodeName = "#cdata-section" @@ -1504,18 +1490,19 @@ 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 +1517,7 @@ _magic_id_count = 0 def __init__(self): + self.doctype = None self.childNodes = NodeList() # mapping of (namespaceURI, localName) -> ElementInfo # and tagName -> ElementInfo @@ -1815,17 +1803,15 @@ 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: -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Feb 19 20:55:10 2012 From: python-checkins at python.org (martin.v.loewis) Date: Sun, 19 Feb 2012 20:55:10 +0100 Subject: [Python-checkins] =?utf8?q?cpython=3A_Create_=5Fattr/=5FattrNS_la?= =?utf8?q?zily=2E?= Message-ID: http://hg.python.org/cpython/rev/5d27a32ebbcc changeset: 75042:5d27a32ebbcc user: Martin v. L?wis date: Sun Feb 19 20:55:05 2012 +0100 summary: Create _attr/_attrNS lazily. files: Lib/xml/dom/expatbuilder.py | 1 + Lib/xml/dom/minidom.py | 42 +++++++++++++++++++----- 2 files changed, 34 insertions(+), 9 deletions(-) diff --git a/Lib/xml/dom/expatbuilder.py b/Lib/xml/dom/expatbuilder.py --- a/Lib/xml/dom/expatbuilder.py +++ b/Lib/xml/dom/expatbuilder.py @@ -760,6 +760,7 @@ del self._ns_ordered_prefixes[:] if attributes: + node._ensure_attributes() _attrs = node._attrs _attrsNS = node._attrsNS for i in range(0, len(attributes), 2): diff --git a/Lib/xml/dom/minidom.py b/Lib/xml/dom/minidom.py --- a/Lib/xml/dom/minidom.py +++ b/Lib/xml/dom/minidom.py @@ -689,13 +689,21 @@ self.childNodes = NodeList() self.nextSibling = self.previousSibling = 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. + # 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 + + def _ensure_attributes(self): + if self._attrs is None: + self._attrs = {} + self._attrsNS = {} def _get_localName(self): try: @@ -707,8 +715,9 @@ 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) @@ -755,14 +764,19 @@ 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) @@ -781,6 +795,8 @@ setAttributeNodeNS = setAttributeNode def removeAttribute(self, name): + if self._attrsNS is None: + raise xml.dom.NotFoundErr() try: attr = self._attrs[name] except KeyError: @@ -788,6 +804,8 @@ 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: @@ -810,9 +828,13 @@ 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): @@ -853,6 +875,7 @@ writer.write("/>%s"%(newl)) def _get_attributes(self): + self._ensure_attributes() return NamedNodeMap(self._attrs, self._attrsNS, self) def hasAttributes(self): @@ -890,6 +913,7 @@ 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 -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Feb 19 21:26:01 2012 From: python-checkins at python.org (antoine.pitrou) Date: Sun, 19 Feb 2012 21:26:01 +0100 Subject: [Python-checkins] =?utf8?q?cpython=3A_Fix_last_remaining_build_is?= =?utf8?q?sues_of_=5Fssl_under_old_OpenSSLs=2E_Patch_by_Vinay=2E?= Message-ID: http://hg.python.org/cpython/rev/1a06f0a8120f changeset: 75043:1a06f0a8120f user: Antoine Pitrou date: Sun Feb 19 21:22:39 2012 +0100 summary: Fix last remaining build issues of _ssl under old OpenSSLs. Patch by Vinay. files: Lib/test/test_ssl.py | 3 ++- Modules/_ssl.c | 5 +++++ 2 files changed, 7 insertions(+), 1 deletions(-) diff --git a/Lib/test/test_ssl.py b/Lib/test/test_ssl.py --- a/Lib/test/test_ssl.py +++ b/Lib/test/test_ssl.py @@ -102,7 +102,8 @@ ssl.CERT_REQUIRED ssl.OP_CIPHER_SERVER_PREFERENCE ssl.OP_SINGLE_DH_USE - ssl.OP_SINGLE_ECDH_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}) diff --git a/Modules/_ssl.c b/Modules/_ssl.c --- a/Modules/_ssl.c +++ b/Modules/_ssl.c @@ -150,6 +150,11 @@ # 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 -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Feb 20 01:16:52 2012 From: python-checkins at python.org (benjamin.peterson) Date: Mon, 20 Feb 2012 01:16:52 +0100 Subject: [Python-checkins] =?utf8?q?cpython=3A_fix_test_now_that_staticmet?= =?utf8?q?hod_and_classmethod_are_bigger?= Message-ID: http://hg.python.org/cpython/rev/ecaf7ace5169 changeset: 75044:ecaf7ace5169 user: Benjamin Peterson date: Sun Feb 19 19:16:47 2012 -0500 summary: fix test now that staticmethod and classmethod are bigger files: Lib/test/test_sys.py | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Lib/test/test_sys.py b/Lib/test/test_sys.py --- a/Lib/test/test_sys.py +++ b/Lib/test/test_sys.py @@ -742,9 +742,9 @@ def bar(cls): pass # staticmethod - check(foo, size(h + 'P')) + check(foo, size(h + 'PP')) # classmethod - check(bar, size(h + 'P')) + check(bar, size(h + 'PP')) # generator def get_gen(): yield 1 check(get_gen(), size(h + 'Pi2P')) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Feb 20 01:36:50 2012 From: python-checkins at python.org (brett.cannon) Date: Mon, 20 Feb 2012 01:36:50 +0100 Subject: [Python-checkins] =?utf8?q?cpython=3A_Fix_a_failing_importlib_tes?= =?utf8?q?t_under_Windows=2E?= Message-ID: http://hg.python.org/cpython/rev/5b4b70bd2b6f changeset: 75045:5b4b70bd2b6f user: Brett Cannon date: Sun Feb 19 19:36:44 2012 -0500 summary: Fix a failing importlib test under Windows. Closes issue #14054. files: Lib/importlib/_bootstrap.py | 3 ++- 1 files changed, 2 insertions(+), 1 deletions(-) diff --git a/Lib/importlib/_bootstrap.py b/Lib/importlib/_bootstrap.py --- a/Lib/importlib/_bootstrap.py +++ b/Lib/importlib/_bootstrap.py @@ -1094,7 +1094,8 @@ setattr(self_module, '_os', os_module) setattr(self_module, 'path_sep', path_sep) - if sys_module.platform in CASE_INSENSITIVE_PLATFORMS: + if any(sys_module.platform.startswith(x) + for x in CASE_INSENSITIVE_PLATFORMS): _case_ok = _case_insensitive_ok else: _case_ok = _case_sensitive_ok -- Repository URL: http://hg.python.org/cpython From ncoghlan at gmail.com Mon Feb 20 01:51:11 2012 From: ncoghlan at gmail.com (Nick Coghlan) Date: Mon, 20 Feb 2012 10:51:11 +1000 Subject: [Python-checkins] cpython: Fix a failing importlib test under Windows. In-Reply-To: References: Message-ID: On Mon, Feb 20, 2012 at 10:36 AM, brett.cannon wrote: > - ? ?if sys_module.platform in CASE_INSENSITIVE_PLATFORMS: > + ? ?if any(sys_module.platform.startswith(x) > + ? ? ? ? ? ?for x in CASE_INSENSITIVE_PLATFORMS): Since C_I_P is a tuple, that condition can be written as: "sys_module.platform.startswith(CASE_INSENSITIVE_PLATFORMS)" Cheers, Nick. -- Nick Coghlan?? |?? ncoghlan at gmail.com?? |?? Brisbane, Australia From python-checkins at python.org Mon Feb 20 01:53:25 2012 From: python-checkins at python.org (eric.araujo) Date: Mon, 20 Feb 2012 01:53:25 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=283=2E2=29=3A_Add_missing_?= =?utf8?b?4oCcOjrigJ0gbWFya3VwLg==?= Message-ID: http://hg.python.org/cpython/rev/c4a507493453 changeset: 75046:c4a507493453 branch: 3.2 parent: 75039:996efb0425c5 user: ?ric Araujo date: Mon Feb 20 01:44:55 2012 +0100 summary: Add missing ?::? markup. Also wrap two looong lines. files: Doc/library/argparse.rst | 31 ++++++++++++++------------- 1 files changed, 16 insertions(+), 15 deletions(-) diff --git a/Doc/library/argparse.rst b/Doc/library/argparse.rst --- a/Doc/library/argparse.rst +++ b/Doc/library/argparse.rst @@ -720,7 +720,7 @@ * ``'version'`` - This expects a ``version=`` keyword argument in the :meth:`~ArgumentParser.add_argument` call, and prints version information - and exits when invoked. + and exits when invoked:: >>> import argparse >>> parser = argparse.ArgumentParser(prog='PROG') @@ -772,8 +772,8 @@ different number of command-line arguments with a single action. The supported values are: -* ``N`` (an integer). ``N`` arguments from the command line will be gathered together into a - list. For example:: +* ``N`` (an integer). ``N`` arguments from the command line will be gathered + together into a list. For example:: >>> parser = argparse.ArgumentParser() >>> parser.add_argument('--foo', nargs=2) @@ -842,7 +842,7 @@ * ``argparse.REMAINDER``. All the remaining command-line arguments are gathered into a list. This is commonly useful for command line utilities that dispatch - to other command line utilities. + to other command line utilities:: >>> parser = argparse.ArgumentParser(prog='PROG') >>> parser.add_argument('--foo') @@ -865,7 +865,8 @@ * When :meth:`~ArgumentParser.add_argument` is called with ``action='store_const'`` or ``action='append_const'``. These actions add the - ``const`` value to one of the attributes of the object returned by :meth:`~ArgumentParser.parse_args`. See the action_ description for examples. + ``const`` value to one of the attributes of the object returned by + :meth:`~ArgumentParser.parse_args`. See the action_ description for examples. * When :meth:`~ArgumentParser.add_argument` is called with option strings (like ``-f`` or ``--foo``) and ``nargs='?'``. This creates an optional @@ -1576,21 +1577,21 @@ The :class:`FileType` factory creates objects that can be passed to the type argument of :meth:`ArgumentParser.add_argument`. Arguments that have :class:`FileType` objects as their type will open command-line arguments as files - with the requested modes and buffer sizes: + with the requested modes and buffer sizes:: - >>> parser = argparse.ArgumentParser() - >>> parser.add_argument('--output', type=argparse.FileType('wb', 0)) - >>> parser.parse_args(['--output', 'out']) - Namespace(output=<_io.BufferedWriter name='out'>) + >>> parser = argparse.ArgumentParser() + >>> parser.add_argument('--output', type=argparse.FileType('wb', 0)) + >>> parser.parse_args(['--output', 'out']) + Namespace(output=<_io.BufferedWriter name='out'>) FileType objects understand the pseudo-argument ``'-'`` and automatically convert this into ``sys.stdin`` for readable :class:`FileType` objects and - ``sys.stdout`` for writable :class:`FileType` objects: + ``sys.stdout`` for writable :class:`FileType` objects:: - >>> parser = argparse.ArgumentParser() - >>> parser.add_argument('infile', type=argparse.FileType('r')) - >>> parser.parse_args(['-']) - Namespace(infile=<_io.TextIOWrapper name='' encoding='UTF-8'>) + >>> parser = argparse.ArgumentParser() + >>> parser.add_argument('infile', type=argparse.FileType('r')) + >>> parser.parse_args(['-']) + Namespace(infile=<_io.TextIOWrapper name='' encoding='UTF-8'>) Argument groups -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Feb 20 01:53:26 2012 From: python-checkins at python.org (eric.araujo) Date: Mon, 20 Feb 2012 01:53:26 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_3=2E2_-=3E_default=29?= =?utf8?q?=3A_Merge_3=2E2?= Message-ID: http://hg.python.org/cpython/rev/efd299a3eb7d changeset: 75047:efd299a3eb7d parent: 75045:5b4b70bd2b6f parent: 75046:c4a507493453 user: ?ric Araujo date: Mon Feb 20 01:53:09 2012 +0100 summary: Merge 3.2 files: Doc/library/argparse.rst | 31 ++++++++++++++------------- 1 files changed, 16 insertions(+), 15 deletions(-) diff --git a/Doc/library/argparse.rst b/Doc/library/argparse.rst --- a/Doc/library/argparse.rst +++ b/Doc/library/argparse.rst @@ -739,7 +739,7 @@ * ``'version'`` - This expects a ``version=`` keyword argument in the :meth:`~ArgumentParser.add_argument` call, and prints version information - and exits when invoked. + and exits when invoked:: >>> import argparse >>> parser = argparse.ArgumentParser(prog='PROG') @@ -791,8 +791,8 @@ different number of command-line arguments with a single action. The supported values are: -* ``N`` (an integer). ``N`` arguments from the command line will be gathered together into a - list. For example:: +* ``N`` (an integer). ``N`` arguments from the command line will be gathered + together into a list. For example:: >>> parser = argparse.ArgumentParser() >>> parser.add_argument('--foo', nargs=2) @@ -861,7 +861,7 @@ * ``argparse.REMAINDER``. All the remaining command-line arguments are gathered into a list. This is commonly useful for command line utilities that dispatch - to other command line utilities. + to other command line utilities:: >>> parser = argparse.ArgumentParser(prog='PROG') >>> parser.add_argument('--foo') @@ -884,7 +884,8 @@ * When :meth:`~ArgumentParser.add_argument` is called with ``action='store_const'`` or ``action='append_const'``. These actions add the - ``const`` value to one of the attributes of the object returned by :meth:`~ArgumentParser.parse_args`. See the action_ description for examples. + ``const`` value to one of the attributes of the object returned by + :meth:`~ArgumentParser.parse_args`. See the action_ description for examples. * When :meth:`~ArgumentParser.add_argument` is called with option strings (like ``-f`` or ``--foo``) and ``nargs='?'``. This creates an optional @@ -1595,21 +1596,21 @@ The :class:`FileType` factory creates objects that can be passed to the type argument of :meth:`ArgumentParser.add_argument`. Arguments that have :class:`FileType` objects as their type will open command-line arguments as files - with the requested modes and buffer sizes: + with the requested modes and buffer sizes:: - >>> parser = argparse.ArgumentParser() - >>> parser.add_argument('--output', type=argparse.FileType('wb', 0)) - >>> parser.parse_args(['--output', 'out']) - Namespace(output=<_io.BufferedWriter name='out'>) + >>> parser = argparse.ArgumentParser() + >>> parser.add_argument('--output', type=argparse.FileType('wb', 0)) + >>> parser.parse_args(['--output', 'out']) + Namespace(output=<_io.BufferedWriter name='out'>) FileType objects understand the pseudo-argument ``'-'`` and automatically convert this into ``sys.stdin`` for readable :class:`FileType` objects and - ``sys.stdout`` for writable :class:`FileType` objects: + ``sys.stdout`` for writable :class:`FileType` objects:: - >>> parser = argparse.ArgumentParser() - >>> parser.add_argument('infile', type=argparse.FileType('r')) - >>> parser.parse_args(['-']) - Namespace(infile=<_io.TextIOWrapper name='' encoding='UTF-8'>) + >>> parser = argparse.ArgumentParser() + >>> parser.add_argument('infile', type=argparse.FileType('r')) + >>> parser.parse_args(['-']) + Namespace(infile=<_io.TextIOWrapper name='' encoding='UTF-8'>) Argument groups -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Feb 20 01:55:39 2012 From: python-checkins at python.org (antoine.pitrou) Date: Mon, 20 Feb 2012 01:55:39 +0100 Subject: [Python-checkins] =?utf8?q?cpython=3A_Issue_=2314043=3A_Speed_up_?= =?utf8?q?importlib=27s_=5FFileFinder_by_at_least_8x=2C_and_add_a_new?= Message-ID: http://hg.python.org/cpython/rev/bbaab666e6c7 changeset: 75048:bbaab666e6c7 parent: 75045:5b4b70bd2b6f user: Antoine Pitrou date: Mon Feb 20 01:48:16 2012 +0100 summary: Issue #14043: Speed up importlib's _FileFinder by at least 8x, and add a new importlib.invalidate_caches() function. importlib is now often faster than imp.find_module() at finding modules. files: Doc/library/importlib.rst | 8 + Lib/importlib/__init__.py | 4 +- Lib/importlib/_bootstrap.py | 111 +++++++---- Lib/importlib/test/import_/test_path.py | 4 +- Lib/test/test_import.py | 8 + Lib/test/test_reprlib.py | 2 + Misc/NEWS | 3 + 7 files changed, 90 insertions(+), 50 deletions(-) diff --git a/Doc/library/importlib.rst b/Doc/library/importlib.rst --- a/Doc/library/importlib.rst +++ b/Doc/library/importlib.rst @@ -86,6 +86,14 @@ that was imported (e.g. ``pkg.mod``), while :func:`__import__` returns the top-level package or module (e.g. ``pkg``). +.. function:: invalidate_caches() + + Invalidate importlib's internal caches. Calling 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 --------------------------------------------------------------- diff --git a/Lib/importlib/__init__.py b/Lib/importlib/__init__.py --- a/Lib/importlib/__init__.py +++ b/Lib/importlib/__init__.py @@ -18,7 +18,7 @@ http://www.python.org/dev/peps/pep-0328 """ -__all__ = ['__import__', 'import_module'] +__all__ = ['__import__', 'import_module', 'invalidate_caches'] from . import _bootstrap @@ -37,7 +37,7 @@ # Public API ######################################################### -from ._bootstrap import __import__ +from ._bootstrap import __import__, invalidate_caches def import_module(name, package=None): diff --git a/Lib/importlib/_bootstrap.py b/Lib/importlib/_bootstrap.py --- a/Lib/importlib/_bootstrap.py +++ b/Lib/importlib/_bootstrap.py @@ -21,31 +21,16 @@ CASE_INSENSITIVE_PLATFORMS = 'win', 'cygwin', 'darwin' -def _case_insensitive_ok(directory, check): - """Check if the directory contains something matching 'check' exists in the - directory. - If PYTHONCASEOK is a defined environment variable then skip the - case-sensitivity check. - - """ - if b'PYTHONCASEOK' not in _os.environ: - if not directory: - directory = '.' - return check in _os.listdir(directory) +def _relax_case(): + """True if filenames must be checked case-insensitively.""" + if any(map(sys.platform.startswith, CASE_INSENSITIVE_PLATFORMS)): + def _relax_case(): + return b'PYTHONCASEOK' in _os.environ else: - return True - -def _case_sensitive_ok(directory, check): - """Under case-sensitive filesystems always assume the case matches. - - Since other code does the file existence check, that subsumes a - case-sensitivity check. - - """ - return True - -_case_ok = None + def _relax_case(): + return False + return _relax_case # TODO: Expose from marshal @@ -172,6 +157,18 @@ # Finder/loader utility code ################################################## +_cache_refresh = 0 + +def invalidate_caches(): + """Invalidate importlib's internal caches. + + Calling this function may be needed if some modules are installed while + your program is running and you expect the program to notice the changes. + """ + global _cache_refresh + _cache_refresh += 1 + + def set_package(fxn): """Set __package__ on the returned module.""" def set_package_wrapper(*args, **kwargs): @@ -708,7 +705,7 @@ """ if path == '': - path = _os.getcwd() + path = '.' try: finder = sys.path_importer_cache[path] except KeyError: @@ -760,29 +757,55 @@ for suffix in detail.suffixes) self.packages = packages self.modules = modules - self.path = path + # Base (directory) path + self.path = path or '.' + self._path_mtime = -1 + self._path_cache = set() + self._cache_refresh = 0 def find_module(self, fullname): """Try to find a loader for the specified module.""" 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) + if _relax_case(): + tail_module = tail_module.lower() + try: + mtime = _os.stat(self.path).st_mtime + except OSError: + mtime = -1 + if mtime != self._path_mtime or _cache_refresh != self._cache_refresh: + self._fill_cache() + self._path_mtime = mtime + self._cache_refresh = _cache_refresh + cache = self._path_cache + if tail_module in cache: + base_path = _path_join(self.path, tail_module) + if _path_isdir(base_path): + for suffix, loader in self.packages: + init_filename = '__init__' + suffix + full_path = _path_join(base_path, init_filename) + if _path_isfile(full_path): + 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) + if mod_filename in cache: + full_path = _path_join(self.path, mod_filename) + if _path_isfile(full_path): + return loader(fullname, full_path) return None + def _fill_cache(self): + """Fill the cache of potential modules and packages for this directory.""" + path = self.path + contents = _os.listdir(path) + if _relax_case(): + self._path_cache = set(fn.lower() for fn in contents) + else: + self._path_cache = set(contents) + + class _SourceFinderDetails: loader = _SourceFileLoader @@ -1060,7 +1083,7 @@ modules, those two modules must be explicitly passed in. """ - global _case_ok, imp, sys + global imp, sys imp = imp_module sys = sys_module @@ -1093,12 +1116,8 @@ raise ImportError('importlib requires posix or nt') setattr(self_module, '_os', os_module) setattr(self_module, 'path_sep', path_sep) - - if any(sys_module.platform.startswith(x) - for x in CASE_INSENSITIVE_PLATFORMS): - _case_ok = _case_insensitive_ok - else: - _case_ok = _case_sensitive_ok + # Constants + setattr(self_module, '_relax_case', _relax_case()) def _install(sys_module, imp_module): diff --git a/Lib/importlib/test/import_/test_path.py b/Lib/importlib/test/import_/test_path.py --- a/Lib/importlib/test/import_/test_path.py +++ b/Lib/importlib/test/import_/test_path.py @@ -78,11 +78,11 @@ path = '' module = '' importer = util.mock_modules(module) - hook = import_util.mock_path_hook(os.getcwd(), importer=importer) + 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.getcwd(), sys.path_importer_cache) + self.assertIn(os.curdir, sys.path_importer_cache) class DefaultPathFinderTests(unittest.TestCase): diff --git a/Lib/test/test_import.py b/Lib/test/test_import.py --- a/Lib/test/test_import.py +++ b/Lib/test/test_import.py @@ -2,6 +2,7 @@ import imp from importlib.test.import_ import test_relative_imports from importlib.test.import_ import util as importlib_util +import importlib import marshal import os import platform @@ -34,6 +35,7 @@ def setUp(self): remove_files(TESTFN) + importlib.invalidate_caches() def tearDown(self): unload(TESTFN) @@ -107,6 +109,7 @@ create_empty_file(fname) fn = imp.cache_from_source(fname) unlink(fn) + importlib.invalidate_caches() __import__(TESTFN) if not os.path.exists(fn): self.fail("__import__ did not result in creation of " @@ -260,6 +263,7 @@ 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')) @@ -358,6 +362,7 @@ 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 @@ -552,6 +557,7 @@ 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]' @@ -599,6 +605,7 @@ 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))) @@ -619,6 +626,7 @@ 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))) diff --git a/Lib/test/test_reprlib.py b/Lib/test/test_reprlib.py --- a/Lib/test/test_reprlib.py +++ b/Lib/test/test_reprlib.py @@ -6,6 +6,7 @@ import sys import os import shutil +import importlib import unittest from test.support import run_unittest, create_empty_file @@ -212,6 +213,7 @@ # Remember where we are self.here = os.getcwd() sys.path.insert(0, self.here) + importlib.invalidate_caches() def tearDown(self): actions = [] diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -469,6 +469,9 @@ Library ------- +- Issue #14043: Speed up importlib's _FileFinder by at least 8x, and add a + new importlib.invalidate_caches() function. + - Issue #14001: CVE-2012-0845: xmlrpc: Fix an endless loop in SimpleXMLRPCServer upon malformed POST request. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Feb 20 01:55:40 2012 From: python-checkins at python.org (antoine.pitrou) Date: Mon, 20 Feb 2012 01:55:40 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_default_-=3E_default?= =?utf8?q?=29=3A_Merge?= Message-ID: http://hg.python.org/cpython/rev/dee36bfa3f8f changeset: 75049:dee36bfa3f8f parent: 75048:bbaab666e6c7 parent: 75047:efd299a3eb7d user: Antoine Pitrou date: Mon Feb 20 01:52:17 2012 +0100 summary: Merge files: Doc/library/argparse.rst | 31 ++++++++++++++------------- 1 files changed, 16 insertions(+), 15 deletions(-) diff --git a/Doc/library/argparse.rst b/Doc/library/argparse.rst --- a/Doc/library/argparse.rst +++ b/Doc/library/argparse.rst @@ -739,7 +739,7 @@ * ``'version'`` - This expects a ``version=`` keyword argument in the :meth:`~ArgumentParser.add_argument` call, and prints version information - and exits when invoked. + and exits when invoked:: >>> import argparse >>> parser = argparse.ArgumentParser(prog='PROG') @@ -791,8 +791,8 @@ different number of command-line arguments with a single action. The supported values are: -* ``N`` (an integer). ``N`` arguments from the command line will be gathered together into a - list. For example:: +* ``N`` (an integer). ``N`` arguments from the command line will be gathered + together into a list. For example:: >>> parser = argparse.ArgumentParser() >>> parser.add_argument('--foo', nargs=2) @@ -861,7 +861,7 @@ * ``argparse.REMAINDER``. All the remaining command-line arguments are gathered into a list. This is commonly useful for command line utilities that dispatch - to other command line utilities. + to other command line utilities:: >>> parser = argparse.ArgumentParser(prog='PROG') >>> parser.add_argument('--foo') @@ -884,7 +884,8 @@ * When :meth:`~ArgumentParser.add_argument` is called with ``action='store_const'`` or ``action='append_const'``. These actions add the - ``const`` value to one of the attributes of the object returned by :meth:`~ArgumentParser.parse_args`. See the action_ description for examples. + ``const`` value to one of the attributes of the object returned by + :meth:`~ArgumentParser.parse_args`. See the action_ description for examples. * When :meth:`~ArgumentParser.add_argument` is called with option strings (like ``-f`` or ``--foo``) and ``nargs='?'``. This creates an optional @@ -1595,21 +1596,21 @@ The :class:`FileType` factory creates objects that can be passed to the type argument of :meth:`ArgumentParser.add_argument`. Arguments that have :class:`FileType` objects as their type will open command-line arguments as files - with the requested modes and buffer sizes: + with the requested modes and buffer sizes:: - >>> parser = argparse.ArgumentParser() - >>> parser.add_argument('--output', type=argparse.FileType('wb', 0)) - >>> parser.parse_args(['--output', 'out']) - Namespace(output=<_io.BufferedWriter name='out'>) + >>> parser = argparse.ArgumentParser() + >>> parser.add_argument('--output', type=argparse.FileType('wb', 0)) + >>> parser.parse_args(['--output', 'out']) + Namespace(output=<_io.BufferedWriter name='out'>) FileType objects understand the pseudo-argument ``'-'`` and automatically convert this into ``sys.stdin`` for readable :class:`FileType` objects and - ``sys.stdout`` for writable :class:`FileType` objects: + ``sys.stdout`` for writable :class:`FileType` objects:: - >>> parser = argparse.ArgumentParser() - >>> parser.add_argument('infile', type=argparse.FileType('r')) - >>> parser.parse_args(['-']) - Namespace(infile=<_io.TextIOWrapper name='' encoding='UTF-8'>) + >>> parser = argparse.ArgumentParser() + >>> parser.add_argument('infile', type=argparse.FileType('r')) + >>> parser.parse_args(['-']) + Namespace(infile=<_io.TextIOWrapper name='' encoding='UTF-8'>) Argument groups -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Feb 20 02:04:44 2012 From: python-checkins at python.org (benjamin.peterson) Date: Mon, 20 Feb 2012 02:04:44 +0100 Subject: [Python-checkins] =?utf8?q?cpython=3A_add_generic_implementation_?= =?utf8?q?of_a_=5F=5Fdict=5F=5F_descriptor_for_C_types?= Message-ID: http://hg.python.org/cpython/rev/78f93eb7dd75 changeset: 75050:78f93eb7dd75 user: Benjamin Peterson date: Sun Feb 19 19:59:10 2012 -0500 summary: add generic implementation of a __dict__ descriptor for C types files: Doc/c-api/object.rst | 12 +++++++++ Doc/c-api/type.rst | 1 - Include/object.h | 2 + Misc/NEWS | 4 +++ Objects/object.c | 42 ++++++++++++++++++++++++++++++++ Objects/typeobject.c | 22 +++------------- 6 files changed, 64 insertions(+), 19 deletions(-) diff --git a/Doc/c-api/object.rst b/Doc/c-api/object.rst --- a/Doc/c-api/object.rst +++ b/Doc/c-api/object.rst @@ -101,6 +101,18 @@ 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. + + +.. 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. + + .. 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/type.rst b/Doc/c-api/type.rst --- a/Doc/c-api/type.rst +++ b/Doc/c-api/type.rst @@ -77,7 +77,6 @@ XXX: Document. - .. c:function:: int PyType_Ready(PyTypeObject *type) Finalize a type object. This should be called on all type objects to finish diff --git a/Include/object.h b/Include/object.h --- a/Include/object.h +++ b/Include/object.h @@ -516,6 +516,8 @@ PyAPI_FUNC(PyObject *) PyObject_GenericGetAttr(PyObject *, PyObject *); PyAPI_FUNC(int) PyObject_GenericSetAttr(PyObject *, PyObject *, PyObject *); +PyAPI_FUNC(PyObject *) PyObject_GenericGetDict(PyObject *, void *); +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 *); diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -2253,6 +2253,10 @@ C-API ----- +- Add PyObject_GenericGetDict and PyObject_GeneriSetDict. They are generic + implementations for the getter and setter of a ``__dict__`` descriptor of C + types. + - Issue #13727: Add 3 macros to access PyDateTime_Delta members: PyDateTime_DELTA_GET_DAYS, PyDateTime_DELTA_GET_SECONDS, PyDateTime_DELTA_GET_MICROSECONDS. diff --git a/Objects/object.c b/Objects/object.c --- a/Objects/object.c +++ b/Objects/object.c @@ -1210,6 +1210,48 @@ return _PyObject_GenericSetAttrWithDict(obj, name, value, NULL); } +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) + *dictptr = dict = PyDict_New(); + Py_XINCREF(dict); + return dict; +} + +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 */ diff --git a/Objects/typeobject.c b/Objects/typeobject.c --- a/Objects/typeobject.c +++ b/Objects/typeobject.c @@ -1759,8 +1759,6 @@ static PyObject * subtype_dict(PyObject *obj, void *context) { - PyObject **dictptr; - PyObject *dict; PyTypeObject *base; base = get_builtin_base_with_dict(Py_TYPE(obj)); @@ -1778,25 +1776,13 @@ } 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)); @@ -1814,14 +1800,14 @@ } 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, "This object has no __dict__"); return -1; } - if (value != NULL && !PyDict_Check(value)) { + if (!PyDict_Check(value)) { PyErr_Format(PyExc_TypeError, "__dict__ must be set to a dictionary, " "not a '%.200s'", Py_TYPE(value)->tp_name); -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Feb 20 02:04:45 2012 From: python-checkins at python.org (benjamin.peterson) Date: Mon, 20 Feb 2012 02:04:45 +0100 Subject: [Python-checkins] =?utf8?q?cpython=3A_use_new_generic_=5F=5Fdict?= =?utf8?q?=5F=5F_descriptor_implementations?= Message-ID: http://hg.python.org/cpython/rev/f029312764b4 changeset: 75051:f029312764b4 user: Benjamin Peterson date: Sun Feb 19 20:02:57 2012 -0500 summary: use new generic __dict__ descriptor implementations files: Modules/_functoolsmodule.c | 38 +--------------- Modules/_io/iobase.c | 15 +----- Objects/exceptions.c | 32 +------------- Objects/funcobject.c | 62 +------------------------ 4 files changed, 6 insertions(+), 141 deletions(-) diff --git a/Modules/_functoolsmodule.c b/Modules/_functoolsmodule.c --- a/Modules/_functoolsmodule.c +++ b/Modules/_functoolsmodule.c @@ -155,44 +155,8 @@ {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 */ }; diff --git a/Modules/_io/iobase.c b/Modules/_io/iobase.c --- a/Modules/_io/iobase.c +++ b/Modules/_io/iobase.c @@ -159,19 +159,6 @@ 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) { @@ -714,7 +701,7 @@ }; static PyGetSetDef iobase_getset[] = { - {"__dict__", (getter)iobase_get_dict, NULL, NULL}, + {"__dict__", PyObject_GenericGetDict, NULL, NULL}, {"closed", (getter)iobase_closed_get, NULL, NULL}, {NULL} }; diff --git a/Objects/exceptions.c b/Objects/exceptions.c --- a/Objects/exceptions.c +++ b/Objects/exceptions.c @@ -177,36 +177,6 @@ {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) { @@ -320,7 +290,7 @@ 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, diff --git a/Objects/funcobject.c b/Objects/funcobject.c --- a/Objects/funcobject.c +++ b/Objects/funcobject.c @@ -245,42 +245,6 @@ }; 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); @@ -476,7 +440,7 @@ (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 */ @@ -831,22 +795,12 @@ Py_RETURN_FALSE; } -static PyObject * -cm_get___dict__(PyObject *cm, void *closure) -{ - PyObject **dictptr = _PyObject_GetDictPtr(cm); - if (*dictptr == NULL) - *dictptr = PyDict_New(); - Py_XINCREF(*dictptr); - return *dictptr; -} - static PyGetSetDef cm_getsetlist[] = { {"__isabstractmethod__", (getter)cm_get___isabstractmethod__, NULL, NULL, NULL}, - {"__dict__", (getter)cm_get___dict__, NULL, NULL, NULL}, + {"__dict__", PyObject_GenericGetDict, PyObject_GenericSetDict, NULL, NULL}, {NULL} /* Sentinel */ }; @@ -1020,22 +974,12 @@ Py_RETURN_FALSE; } -static PyObject * -sm_get___dict__(PyObject *sm, void *closure) -{ - PyObject **dictptr = _PyObject_GetDictPtr(sm); - if (*dictptr == NULL) - *dictptr = PyDict_New(); - Py_XINCREF(*dictptr); - return *dictptr; -} - static PyGetSetDef sm_getsetlist[] = { {"__isabstractmethod__", (getter)sm_get___isabstractmethod__, NULL, NULL, NULL}, - {"__dict__", (getter)sm_get___dict__, NULL, NULL, NULL}, + {"__dict__", PyObject_GenericGetDict, PyObject_GenericSetDict, NULL, NULL}, {NULL} /* Sentinel */ }; -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Feb 20 02:08:07 2012 From: python-checkins at python.org (eric.araujo) Date: Mon, 20 Feb 2012 02:08:07 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=282=2E7=29=3A_Fix_typo?= Message-ID: http://hg.python.org/cpython/rev/15179a13008f changeset: 75052:15179a13008f branch: 2.7 parent: 75035:7470d3915acc user: ?ric Araujo date: Mon Feb 20 02:07:31 2012 +0100 summary: Fix typo files: Objects/unicodeobject.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -6364,7 +6364,7 @@ to the default encoding. errors may be given to set a different error\n\ handling scheme. Default is 'strict' meaning that encoding errors raise\n\ a UnicodeDecodeError. Other possible values are 'ignore' and 'replace'\n\ -as well as any other name registerd with codecs.register_error that is\n\ +as well as any other name registered with codecs.register_error that is\n\ able to handle UnicodeDecodeErrors."); static PyObject * -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Feb 20 02:08:08 2012 From: python-checkins at python.org (eric.araujo) Date: Mon, 20 Feb 2012 02:08:08 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=282=2E7=29=3A_Add_missing_?= =?utf8?b?4oCcOjrigJ0gbWFya3VwIGFuZCB3cmFwIG92ZXJsb25nIGxpbmVz?= Message-ID: http://hg.python.org/cpython/rev/7ff4731853e2 changeset: 75053:7ff4731853e2 branch: 2.7 user: ?ric Araujo date: Mon Feb 20 02:08:01 2012 +0100 summary: Add missing ?::? markup and wrap overlong lines files: Doc/library/argparse.rst | 41 +++++++++++++++------------ 1 files changed, 23 insertions(+), 18 deletions(-) diff --git a/Doc/library/argparse.rst b/Doc/library/argparse.rst --- a/Doc/library/argparse.rst +++ b/Doc/library/argparse.rst @@ -124,7 +124,9 @@ ArgumentParser objects ---------------------- -.. class:: ArgumentParser([description], [epilog], [prog], [usage], [add_help], [argument_default], [parents], [prefix_chars], [conflict_handler], [formatter_class]) +.. class:: ArgumentParser([description], [epilog], [prog], [usage], [add_help], \ + [argument_default], [parents], [prefix_chars], \ + [conflict_handler], [formatter_class]) Create a new :class:`ArgumentParser` object. Each parameter has its own more detailed description below, but in short they are: @@ -576,7 +578,9 @@ The add_argument() method ------------------------- -.. method:: ArgumentParser.add_argument(name or flags..., [action], [nargs], [const], [default], [type], [choices], [required], [help], [metavar], [dest]) +.. method:: ArgumentParser.add_argument(name or flags..., [action], [nargs], \ + [const], [default], [type], [choices], [required], \ + [help], [metavar], [dest]) Define how a single command-line argument should be parsed. Each parameter has its own more detailed description below, but in short they are: @@ -718,7 +722,7 @@ * ``'version'`` - This expects a ``version=`` keyword argument in the :meth:`~ArgumentParser.add_argument` call, and prints version information - and exits when invoked. + and exits when invoked:: >>> import argparse >>> parser = argparse.ArgumentParser(prog='PROG') @@ -770,8 +774,8 @@ different number of command-line arguments with a single action. The supported values are: -* ``N`` (an integer). ``N`` arguments from the command line will be gathered together into a - list. For example:: +* ``N`` (an integer). ``N`` arguments from the command line will be gathered + together into a list. For example:: >>> parser = argparse.ArgumentParser() >>> parser.add_argument('--foo', nargs=2) @@ -840,7 +844,7 @@ * ``argparse.REMAINDER``. All the remaining command-line arguments are gathered into a list. This is commonly useful for command line utilities that dispatch - to other command line utilities. + to other command line utilities:: >>> parser = argparse.ArgumentParser(prog='PROG') >>> parser.add_argument('--foo') @@ -863,7 +867,8 @@ * When :meth:`~ArgumentParser.add_argument` is called with ``action='store_const'`` or ``action='append_const'``. These actions add the - ``const`` value to one of the attributes of the object returned by :meth:`~ArgumentParser.parse_args`. See the action_ description for examples. + ``const`` value to one of the attributes of the object returned by + :meth:`~ArgumentParser.parse_args`. See the action_ description for examples. * When :meth:`~ArgumentParser.add_argument` is called with option strings (like ``-f`` or ``--foo``) and ``nargs='?'``. This creates an optional @@ -1539,7 +1544,7 @@ >>> args.func(args) ((XYZYX)) - This way, you can let :meth:`parse_args` does the job of calling the + This way, you can let :meth:`parse_args` do the job of calling the appropriate function after argument parsing is complete. Associating functions with actions like this is typically the easiest way to handle the different actions for each of your subparsers. However, if it is necessary @@ -1564,21 +1569,21 @@ The :class:`FileType` factory creates objects that can be passed to the type argument of :meth:`ArgumentParser.add_argument`. Arguments that have :class:`FileType` objects as their type will open command-line arguments as files - with the requested modes and buffer sizes: + with the requested modes and buffer sizes:: - >>> parser = argparse.ArgumentParser() - >>> parser.add_argument('--output', type=argparse.FileType('wb', 0)) - >>> parser.parse_args(['--output', 'out']) - Namespace(output=) + >>> parser = argparse.ArgumentParser() + >>> parser.add_argument('--output', type=argparse.FileType('wb', 0)) + >>> parser.parse_args(['--output', 'out']) + Namespace(output=) FileType objects understand the pseudo-argument ``'-'`` and automatically convert this into ``sys.stdin`` for readable :class:`FileType` objects and - ``sys.stdout`` for writable :class:`FileType` objects: + ``sys.stdout`` for writable :class:`FileType` objects:: - >>> parser = argparse.ArgumentParser() - >>> parser.add_argument('infile', type=argparse.FileType('r')) - >>> parser.parse_args(['-']) - Namespace(infile=', mode 'r' at 0x...>) + >>> parser = argparse.ArgumentParser() + >>> parser.add_argument('infile', type=argparse.FileType('r')) + >>> parser.parse_args(['-']) + Namespace(infile=', mode 'r' at 0x...>) Argument groups -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Feb 20 02:36:17 2012 From: python-checkins at python.org (benjamin.peterson) Date: Mon, 20 Feb 2012 02:36:17 +0100 Subject: [Python-checkins] =?utf8?q?cpython=3A_check_for_NULL_to_fix_segfa?= =?utf8?q?ult?= Message-ID: http://hg.python.org/cpython/rev/857cc070ef75 changeset: 75054:857cc070ef75 parent: 75051:f029312764b4 user: Benjamin Peterson date: Sun Feb 19 20:36:12 2012 -0500 summary: check for NULL to fix segfault files: Objects/typeobject.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Objects/typeobject.c b/Objects/typeobject.c --- a/Objects/typeobject.c +++ b/Objects/typeobject.c @@ -1807,7 +1807,7 @@ "This object has no __dict__"); return -1; } - if (!PyDict_Check(value)) { + if (value != NULL && !PyDict_Check(value)) { PyErr_Format(PyExc_TypeError, "__dict__ must be set to a dictionary, " "not a '%.200s'", Py_TYPE(value)->tp_name); -- Repository URL: http://hg.python.org/cpython From ncoghlan at gmail.com Mon Feb 20 04:09:28 2012 From: ncoghlan at gmail.com (Nick Coghlan) Date: Mon, 20 Feb 2012 13:09:28 +1000 Subject: [Python-checkins] cpython: Issue #14043: Speed up importlib's _FileFinder by at least 8x, and add a new In-Reply-To: References: Message-ID: On Mon, Feb 20, 2012 at 10:55 AM, antoine.pitrou wrote: > +def _relax_case(): > + ? ?"""True if filenames must be checked case-insensitively.""" > + ? ?if any(map(sys.platform.startswith, CASE_INSENSITIVE_PLATFORMS)): > + ? ? ? ?def _relax_case(): > + ? ? ? ? ? ?return b'PYTHONCASEOK' in _os.environ > ? ? else: > - ? ? ? ?return True Wow, that's horrendously confusing. Please change the name of the factory function to "_make_relax_case" (or something, anything that isn't "_relax_case" would be an improvement). Also, the docstring should be on the created functions, not the factory function. Cheers, Nick. -- Nick Coghlan?? |?? ncoghlan at gmail.com?? |?? Brisbane, Australia From ncoghlan at gmail.com Mon Feb 20 04:15:54 2012 From: ncoghlan at gmail.com (Nick Coghlan) Date: Mon, 20 Feb 2012 13:15:54 +1000 Subject: [Python-checkins] cpython: Issue #14043: Speed up importlib's _FileFinder by at least 8x, and add a new In-Reply-To: References: Message-ID: However, "very cool" on adding the caching in the default importers :) Cheers, Nick. -- Nick Coghlan?? |?? ncoghlan at gmail.com?? |?? Brisbane, Australia From solipsis at pitrou.net Mon Feb 20 05:33:49 2012 From: solipsis at pitrou.net (solipsis at pitrou.net) Date: Mon, 20 Feb 2012 05:33:49 +0100 Subject: [Python-checkins] Daily reference leaks (857cc070ef75): sum=1 Message-ID: results for 857cc070ef75 on branch "default" -------------------------------------------- test_support leaked [0, 0, 1] references, sum=1 Command line was: ['./python', '-m', 'test.regrtest', '-uall', '-R', '3:3:/home/antoine/cpython/refleaks/reflog7zjN7K', '-x'] From python-checkins at python.org Mon Feb 20 08:50:31 2012 From: python-checkins at python.org (georg.brandl) Date: Mon, 20 Feb 2012 08:50:31 +0100 Subject: [Python-checkins] =?utf8?q?peps=3A_New_version_of_PEP_3144_by_Pet?= =?utf8?q?er_Moody=2E?= Message-ID: http://hg.python.org/peps/rev/58b573772c6c changeset: 4064:58b573772c6c user: Georg Brandl date: Mon Feb 20 08:50:42 2012 +0100 summary: New version of PEP 3144 by Peter Moody. files: pep-3144.txt | 430 +++++++++----------------------------- 1 files changed, 104 insertions(+), 326 deletions(-) diff --git a/pep-3144.txt b/pep-3144.txt --- a/pep-3144.txt +++ b/pep-3144.txt @@ -1,382 +1,160 @@ -PEP: 3144 -Title: IP Address Manipulation Library for the Python Standard Library -Version: $Revision$ -Last-Modified: $Date$ -Author: Peter Moody -Discussions-To: ipaddr-py-dev at googlegroups.com -Status: Draft -Type: Standards Track -Content-Type: text/plain -Created: 13-Aug-2009 -Python-Version: 3.2 +PEP: 3144 +Title: IP Address Manipulation Library for the Python Standard Library +Version: $Revision$ +Last-Modified: $Date$ +Author: Peter Moody +Discussions-To: +Status: Draft +Type: Standards Track +Content-Type: text/plain +Created: 6-Feb-2012 +Python-Version: 3.3 Abstract: - This PEP proposes a design for a lightweight ip address manipulation module - for python. - + This PEP proposes a design and for an IP address manipulation module for + python. Motivation: - Many network administrators use python in their day to day jobs. Finding a - library to assist with the common ip address manipulation tasks is easy. - Finding a good library for performing those tasks can be somewhat more - difficult. For this reason, I (like many before me) scratched an itch and - wrote my own with an emphasis on being easy to understand and fast for the - most common operations. - - For context, a previous version of this library was up for inclusion in - python 3.1, see issue 3959 [1] for more information. + Several very good IP address modules for python already exist. + The truth is that all of the struggle with the balance between + adherence to Pythonic principals and the shorthand upon which + network engineers and administrators rely. I believe ipaddr + strikes the right balance. Rationale: - ipaddr was designed with a few basic principals in mind: + The existance of several Python IP address manipulation moduels is + evidence of an outstanding need for the functionality this module + seeks to provide. - - IPv4 and IPv6 objects are distinct. - - IP addresses and IP networks are distinct. - - the library should be useful and the assumptions obvious to the network - programmer. - - IP networks should be treated as lists (as opposed to some other - python intrinsic) in so far as it makes sense. - - the library should be lightweight and fast without sacrificing - expected functionality. - - - Distinct IPV4 and IPV6 objects. - While there are many similarities, IPV4 and IPV6 objects are fundamentally - different. The similarities allow for easy abstraction of certain - operations which affect the bits from both in the same manner, but their - differences mean attempts to combine them into one object yield unexpected - results. According to Vint Cerf, "I have seen a substantial amount of - traffic about IPv4 and IPv6 comparisons and the general consensus is that - these are not comparable." (Vint Cerf [2]). For python versions >= 3.0, - this means that (<, >, <=, >=) comparison operations between IPv4 and IPv6 - objects raise a TypeError per the Ordering Comparisons [3]. +Background: - - Distinct network and address objects. + PEP 3144 and ipaddr have been up for inclusion before. The + version of the library specified here is backwards incompatible + with the version on PyPI and the one which was discussed before. + In order to avoid confusing users of the current ipaddr, I've + renamed this version of the library "ipaddress". - An IPV4 address is a single 32 bit number while the IPV4 address assigned - to a networked computer is a 32 bit address and associated network. - Similarly, an IPV6 address is a 128 bit number while an IPV6 address - assigned to a networked computer is a 128 bit number and associated network - information. The similarities leads to easy abstraction of some methods - and properties, but there are obviously a number of address/network - specific properties which require they be distinct. For instance, IP - networks contain a network address (the base address of the network), - broadcast address (the upper end of the network, also the address to - which every machine on a given network is supposed listen, hence the name - broadcast), supernetworks and subnetworks, etc. The individual property - addresses in an IP network obviously don't have the same properties, - they're simply 32 or 128 bit numbers. + The main differences between ipaddr and ipaddress are: - - Principal of least confusion for network programmers. + * ipaddress *Network classes are equivalent to the ipaddr *Network + class counterparts with the strict flag set to True. - It should be understood that, above all, this module is designed with the - network administrator in mind. In practice, this means that a number of - assumptions are made with regards to common usage and the library prefers - the usefulness of accepted practice over strict adherence to RFCs. For - example, ipaddr accepts '192.168.1.1/24' as a network definition because - this is a very common way of describing an address + netmask despite the - fact that 192.168.1.1 is actually an IP address on the network - 192.168.1.0/24. Strict adherence would require that networks have all of - the host bits masked to zero, which would require two objects to describe - that IP + network. In practice, a looser interpretation of a network is - a very useful if common abstraction, so ipaddr prefers to make this - available. For the developer who is concerned with strict adherence, - ipaddr provides an optional 'strict' boolean argument to the - IPv(4|6)Network constructors which guarantees that all host bits are masked - down. - - - Treat network elements as lists (in so far as it's possible). + * ipaddress *Interface classes are equivalent to the ipaddr + *Network class counterparts with the strict flag set to False. - Treating IP networks as lists is a natural extension from viewing the - network as a series of individual ip addresses. Most of the standard list - methods should be implemented and should behave in a manner that would be - consistent if the IP network object were actually a list of strings or - integers. The methods which actually modify a lists contents don't extend - as well to this model (__add__, __iadd__, __sub__, __isub__, etc) but - others (__contains__, __iter__, etc) work quite nicely. It should be noted - that __len__ doesn't work as expected since python internals has this - limited to a 32 bit integer and it would need to be at least 128 bits to - work with IPV6. + * The factory functions in ipaddress were renamed to disambiguate + them from classes. - - Lightweight. - - While some network programmers will undoubtedly want more than this library - provides, keeping the functionality to strictly what's required from a IP - address manipulation module is critical to keeping the code fast, easily - comprehensible and extensible. It is a goal to provide enough options in - terms of functionality to allow the developer to easily do their work - without needlessly cluttering the library. Finally, It's important to note - that this design doesn't prevent subclassing or otherwise extending to meet - the unforeseen needs. + * A few attributes were renamed to disambiguate their purpose as + well. (eg. network, network_address) Specification: - A slightly more detailed look at the library follows. + The ipaddr module defines a total of 6 new public classes, 3 for + manipulating IPv4 objects and 3 for manipulating IPv6 objects. + The classes are as follows: - - Design + IPv4Address/IPv6Address - These define individual addresses, for + example the IPv4 address returned by an A record query for + www.google.com (74.125.224.84) or the IPv6 address returned by a + AAAA record query for ipv6.google.com (2001:4860:4001:801::1011). - ipaddr has four main classes most people will use: + IPv4Network/IPv6Network - These define networks or groups of + addresses, for example the IPv4 network reserved for multicast use + (224.0.0.0/4) or the IPv6 network reserved for multicast + (ff00::/8, wow, that's big). - 1. IPv4Address. (eg, '192.168.1.1') - 2. IPv4Network (eg, '192.168.0.0/16') - 3. IPv6Address (eg, '::1') - 4. IPv6Network (eg, '2001::/32') + IPv4Interface/IPv6Interface - These hybrid classes refer to an + individual address on a given network. For example, the IPV4 + address 192.0.2.1 on the network 192.0.2.0/24 could be referred to + as 192.0.2.1/24. Likewise, the IPv6 address 2001:DB8::1 on the + network 2001:DB8::/96 could be referred to as 2001:DB8::1/96. + It's very common to refer to addresses assigned to computer + network interfaces like this, hence the Interface name. - Most of the operations a network administrator performs on networks are - similar for both IPv4 and IPv6 networks. Ie. finding subnets, supernets, - determining if an address is contained in a given network, etc. Similarly, - both addresses and networks (of the same ip version!) have much in common; - the process for turning a given 32 or 128 bit number into a human readable - string notation, determining if the ip is within the valid specified range, - etc. Finally, there are some pythonic abstractions which are valid for all - addresses and networks, both IPv4 and IPv6. In short, there is common - functionality shared between (ipaddr class names in parentheses): + All IPv4 classes share certain characteristics and methods; the + number of bits needed to represent them, whether or not they + belong to certain special IPv4 network ranges, etc. Similarly, + all IPv6 classes share characteristics and methods. - 1. all IP addresses and networks, both IPv4 and IPv6. (_IPAddrBase) + ipaddr makes extensive use of inheritance to avoid code + duplication as much as possible. The parent classes are private, + but they are outlined here: - 2. all IP addresses of both versions. (_BaseIP) + _IPAddrBase - Provides methods common to all ipaddr objects. - 3. all IP networks of both version. (_BaseNet) + _BaseAddress - Provides methods common to IPv4Address and + IPv6Address. - 4. all IPv4 objects, both addresses and networks. (_BaseV4) + _BaseInterface - Provides methods common to IPv4Interface and + IPv6Interface, as well as IPv4Network and IPv6Network (ipaddr + treats the Network classes as a special case of Interface). - 5. all IPv6 objects, both addresses and networks. (_BaseV6) + _BaseV4 - Provides methods and variables (eg, _max_prefixlen) + common to all IPv4 classes. - Seeing this as a clear hierarchy is important for recognizing how much - code is common between the four main classes. For this reason, ipaddr uses - class inheritance to abstract out as much common code is possible and - appropriate. This lack of duplication and very clean layout also makes - the job of the developer much easier should they need to debug code (either - theirs or mine). + _BaseV6 - Provides methods and variables common to all IPv6 + classes. - Knowing that there might be cases where the developer doesn't so much care - as to the types of IP they might be receiving, ipaddr comes with two - important helper functions, IPAddress() and IPNetwork(). These, as you - might guess, return the appropriately typed address or network objects for - the given argument. + Comparisons between objects of differing IP versions results in a + TypeError [1]. Additionally, comparisons of objects with + different _Base parent classes results in a TypeError. The effect + of the _Base parent class limitation is that IPv4Interface's can + be compared to IPv4Network's and IPv6Interface's can be compared + to IPv6Network's. - Finally, as mentioned earlier, there is no meaningful natural ordering - between IPv4 and IPv6 addresses and networks [2]. Rather than invent a - standard, ipaddr follows Ordering Comparisons and returns a TypeError - when asked to compare objects of differing IP versions. In practice, there - are many ways a programmer may wish to order the addresses, so this this - shouldn't pose a problem for the developer who can easily write: - - v4 = [x for x in mixed_list if x._version == 4] - v6 = [x for x in mixed_list if x._version == 6] - - # perform operations on v4 and v6 here. - - return v4_return + v6_return - - - Multiple ways of displaying an IP Address. - - Not everyone will want to display the same information in the same format; - IP addresses in cisco syntax are represented by network/hostmask, junipers - are (network/IP)/prefixlength and IPTables are (network/IP)/(prefixlength/ - netmask). The ipaddr library provides multiple ways to display an address. - - In [1]: IPNetwork('1.1.1.1').with_prefixlen - Out[1]: '1.1.1.1/32' - - In [1]: IPNetwork('1.1.1.1').with_netmask - Out[1]: '1.1.1.1/255.255.255.255' - - In [1]: IPNetwork('1.1.1.1').with_hostmask - Out[1]: '1.1.1.1/0.0.0.0' - - the same applies to IPv6. It should be noted that netmasks and hostmasks - are not commonly used in IPv6, the methods exist for compatibility with - IPv4. - - - Lazy evaluation combined with aggressive caching of network elements. - - (the following example is for IPv6Network objects but the exact same - properties apply to IPv6Network objects). - - As mentioned, an IP network object is defined by a number of properties. - The object - - In [1]: IPv4Network('1.1.1.0/24') - - has a number of IPv4Address properties - - In [1]: o = IPv4Network('1.1.1.0/24') - - In [2]: o.network - Out[2]: IPv4Address('1.1.1.0') - - In [3]: o.broadcast - Out[3]: IPv4Address('1.1.1.255') - - In [4]: o.hostmask - Out[4]: IPv4Address('0.0.0.255') - - If we were to compute them all at object creation time, we would incur a - non-negligible performance hit. Since these properties are required to - define the object completely but their values aren't always of interest to - the programmer, their computation should be done only when requested. - However, in order to avoid the performance hit in the case where one - attribute for a particular object is requested repeatedly (and continuously - recomputed), the results of the computation should be cached. - - - Address list summarization. - - ipaddr supports easy summarization of lists of possibly contiguous - addresses, as this is something network administrators constantly find - themselves doing. This currently works in a number of ways. - - 1. collapse_address_list([list]): - - Given a list of networks, ipaddr will collapse the list into the smallest - possible list of networks that wholey contain the addresses supplied. - - In [1]: collapse_address_list([IPNetwork('1.1.0.0/24'), - ...: IPNetwork('1.1.1.0/24')]) - Out[1]: [IPv4Network('1.1.0.0/23')] - - more elaborately: - - In [1]: collapse_address_list([IPNetwork(x) for x in - ...: IPNetwork('1.1.0.0/23')]) - Out[1]: [IPv4Network('1.1.0.0/23')] - - 2. summarize_address_range(first, last). - - Given a start and end address, ipaddr will provide the smallest number of - networks to cover the given range. - - - In [1]: summarize_address_range(IPv4Address('1.1.1.0'), - ...: IPv4Address('2.2.2.0')) - Out[1]: - [IPv4Network('1.1.1.0/24'), - IPv4Network('1.1.2.0/23'), - IPv4Network('1.1.4.0/22'), - IPv4Network('1.1.8.0/21'), - IPv4Network('1.1.16.0/20'), - IPv4Network('1.1.32.0/19'), - IPv4Network('1.1.64.0/18'), - IPv4Network('1.1.128.0/17'), - IPv4Network('1.2.0.0/15'), - IPv4Network('1.4.0.0/14'), - IPv4Network('1.8.0.0/13'), - IPv4Network('1.16.0.0/12'), - IPv4Network('1.32.0.0/11'), - IPv4Network('1.64.0.0/10'), - IPv4Network('1.128.0.0/9'), - IPv4Network('2.0.0.0/15'), - IPv4Network('2.2.0.0/23'), - IPv4Network('2.2.2.0/32')] - - - Address Exclusion. - - Used somewhat less often, but all the more annoying, is the case where an - programmer would want "all of the addresses in a newtork *except* these". - ipaddr performs this exclusion equally well for IPv4 and IPv6 networks - and collapses the resulting address list. - - In [1]: IPNetwork('1.1.0.0/15').address_exclude(IPNetwork('1.1.1.0/24')) - Out[1]: - [IPv4Network('1.0.0.0/16'), - IPv4Network('1.1.0.0/24'), - IPv4Network('1.1.2.0/23'), - IPv4Network('1.1.4.0/22'), - IPv4Network('1.1.8.0/21'), - IPv4Network('1.1.16.0/20'), - IPv4Network('1.1.32.0/19'), - IPv4Network('1.1.64.0/18'), - IPv4Network('1.1.128.0/17')] - - In [1]: IPNewtork('::1/96').address_exclude(IPNetwork('::1/112')) - Out[1]: - [IPv6Network('::1:0/112'), - IPv6Network('::2:0/111'), - IPv6Network('::4:0/110'), - IPv6Network('::8:0/109'), - IPv6Network('::10:0/108'), - IPv6Network('::20:0/107'), - IPv6Network('::40:0/106'), - IPv6Network('::80:0/105'), - IPv6Network('::100:0/104'), - IPv6Network('::200:0/103'), - IPv6Network('::400:0/102'), - IPv6Network('::800:0/101'), - IPv6Network('::1000:0/100'), - IPv6Network('::2000:0/99'), - IPv6Network('::4000:0/98'), - IPv6Network('::8000:0/97')] - - - IPv6 address compression. - - By default, IPv6 addresses are compressed internally (see the method - BaseV6._compress_hextets), but ipaddr makes both the compressed and the - exploded representations available. - - In [1]: IPNetwork('::1').compressed - Out[1]: '::1/128' - - In [2]: IPNetwork('::1').exploded - Out[2]: '0000:0000:0000:0000:0000:0000:0000:1/128' - - In [3]: IPv6Address('::1').exploded - Out[3]: '0000:0000:0000:0000:0000:0000:0000:0001' - - In [4]: IPv6Address('::1').compressed - Out[4]: '::1' - - (the same methods exist for IPv4 networks and addresses, but they're - just stubs for returning the normal __str__ representation). - - - Most other common operations. - - It is a design goal to support all of the common operation expected from - an IP address manipulation module. As such, finding supernets, subnets, - address and network containment etc are all supported. Reference Implementation: - A reference implementation is available at: - http://ipaddr-py.googlecode.com/svn/trunk + The current reference implementation can be found at: + http://code.google.com/p/ipaddr-py/downloads/detail?name=3144.tar.gz + + More information about using the reference implementation can be + found at: http://code.google.com/p/ipaddr-py/wiki/Using3144 References: - [1] http://bugs.python.org/issue3959 - [2] Appealing to authority is a logical fallacy, but Vint Cerf is an - an authority who can't be ignored. Full text of the email follows: + + [1] Appealing to authority is a logical fallacy, but Vint Cerf is an + an authority who can't be ignored. Full text of the email + follows: """ - I have seen a substantial amount of traffic about IPv4 and IPv6 - comparisons and the general consensus is that these are not comparable. + I have seen a substantial amount of traffic about IPv4 and + IPv6 comparisons and the general consensus is that these are + not comparable. - If we were to take a very simple minded view, we might treat these as - pure integers in which case there is an ordering but not a useful one. + If we were to take a very simple minded view, we might treat + these as pure integers in which case there is an ordering but + not a useful one. - In the IPv4 world, "length" is important because we take longest (most - specific) address first for routing. Length is determine by the mask, - as you know. + In the IPv4 world, "length" is important because we take + longest (most specific) address first for routing. Length is + determine by the mask, as you know. - Assuming that the same style of argument works in IPv6, we would have - to conclude that treating an IPv6 value purely as an integer for - comparison with IPv4 would lead to some really strange results. + Assuming that the same style of argument works in IPv6, we + would have to conclude that treating an IPv6 value purely as + an integer for comparison with IPv4 would lead to some really + strange results. - All of IPv4 space would lie in the host space of 0::0/96 prefix of - IPv6. For any useful interpretation of IPv4, this is a non-starter. + All of IPv4 space would lie in the host space of 0::0/96 + prefix of IPv6. For any useful interpretation of IPv4, this is + a non-starter. - I think the only sensible conclusion is that IPv4 values and IPv6 values - should be treated as non-comparable. + I think the only sensible conclusion is that IPv4 values and + IPv6 values should be treated as non-comparable. Vint """ - [3] http://docs.python.org/dev/3.0/whatsnew/3.0.html#ordering-comparisons - Copyright: -- Repository URL: http://hg.python.org/peps From python-checkins at python.org Mon Feb 20 14:02:57 2012 From: python-checkins at python.org (antoine.pitrou) Date: Mon, 20 Feb 2012 14:02:57 +0100 Subject: [Python-checkins] =?utf8?q?cpython=3A_=5Frelax=5Fcase_-=3E_=5Fmak?= =?utf8?q?e=5Frelax=5Fcase?= Message-ID: http://hg.python.org/cpython/rev/b8576719fe71 changeset: 75055:b8576719fe71 user: Antoine Pitrou date: Mon Feb 20 13:52:47 2012 +0100 summary: _relax_case -> _make_relax_case files: Lib/importlib/_bootstrap.py | 7 ++++--- 1 files changed, 4 insertions(+), 3 deletions(-) diff --git a/Lib/importlib/_bootstrap.py b/Lib/importlib/_bootstrap.py --- a/Lib/importlib/_bootstrap.py +++ b/Lib/importlib/_bootstrap.py @@ -22,12 +22,13 @@ CASE_INSENSITIVE_PLATFORMS = 'win', 'cygwin', 'darwin' -def _relax_case(): - """True if filenames must be checked case-insensitively.""" +def _make_relax_case(): if any(map(sys.platform.startswith, CASE_INSENSITIVE_PLATFORMS)): + """True if filenames must be checked case-insensitively.""" def _relax_case(): return b'PYTHONCASEOK' in _os.environ else: + """True if filenames must be checked case-insensitively.""" def _relax_case(): return False return _relax_case @@ -1117,7 +1118,7 @@ setattr(self_module, '_os', os_module) setattr(self_module, 'path_sep', path_sep) # Constants - setattr(self_module, '_relax_case', _relax_case()) + setattr(self_module, '_relax_case', _make_relax_case()) def _install(sys_module, imp_module): -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Feb 20 15:03:00 2012 From: python-checkins at python.org (benjamin.peterson) Date: Mon, 20 Feb 2012 15:03:00 +0100 Subject: [Python-checkins] =?utf8?q?cpython=3A_write_versionadded?= Message-ID: http://hg.python.org/cpython/rev/9a156474d678 changeset: 75056:9a156474d678 parent: 75054:857cc070ef75 user: Benjamin Peterson date: Mon Feb 20 08:48:25 2012 -0500 summary: write versionadded files: Doc/c-api/object.rst | 4 ++++ 1 files changed, 4 insertions(+), 0 deletions(-) diff --git a/Doc/c-api/object.rst b/Doc/c-api/object.rst --- a/Doc/c-api/object.rst +++ b/Doc/c-api/object.rst @@ -106,12 +106,16 @@ 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) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Feb 20 15:03:01 2012 From: python-checkins at python.org (benjamin.peterson) Date: Mon, 20 Feb 2012 15:03:01 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_default_-=3E_default?= =?utf8?q?=29=3A_merge_heads?= Message-ID: http://hg.python.org/cpython/rev/1f9461ef6312 changeset: 75057:1f9461ef6312 parent: 75056:9a156474d678 parent: 75055:b8576719fe71 user: Benjamin Peterson date: Mon Feb 20 09:02:57 2012 -0500 summary: merge heads files: Lib/importlib/_bootstrap.py | 7 ++++--- 1 files changed, 4 insertions(+), 3 deletions(-) diff --git a/Lib/importlib/_bootstrap.py b/Lib/importlib/_bootstrap.py --- a/Lib/importlib/_bootstrap.py +++ b/Lib/importlib/_bootstrap.py @@ -22,12 +22,13 @@ CASE_INSENSITIVE_PLATFORMS = 'win', 'cygwin', 'darwin' -def _relax_case(): - """True if filenames must be checked case-insensitively.""" +def _make_relax_case(): if any(map(sys.platform.startswith, CASE_INSENSITIVE_PLATFORMS)): + """True if filenames must be checked case-insensitively.""" def _relax_case(): return b'PYTHONCASEOK' in _os.environ else: + """True if filenames must be checked case-insensitively.""" def _relax_case(): return False return _relax_case @@ -1117,7 +1118,7 @@ setattr(self_module, '_os', os_module) setattr(self_module, 'path_sep', path_sep) # Constants - setattr(self_module, '_relax_case', _relax_case()) + setattr(self_module, '_relax_case', _make_relax_case()) def _install(sys_module, imp_module): -- Repository URL: http://hg.python.org/cpython From brett at python.org Mon Feb 20 19:20:50 2012 From: brett at python.org (Brett Cannon) Date: Mon, 20 Feb 2012 13:20:50 -0500 Subject: [Python-checkins] cpython: Issue #14043: Speed up importlib's _FileFinder by at least 8x, and add a new In-Reply-To: References: Message-ID: On Sun, Feb 19, 2012 at 22:15, Nick Coghlan wrote: > However, "very cool" on adding the caching in the default importers :) Thanks to PJE for bringing the idea up again and Antoine discovering the approach *independently* from PJE and myself and actually writing the code. Now I *really* need to get that C hybrid for __import__() finished (in the middle of implementing _gcd_import() in C) to see where the performance ends up. -------------- next part -------------- An HTML attachment was scrubbed... URL: From python-checkins at python.org Mon Feb 20 19:33:48 2012 From: python-checkins at python.org (antoine.pitrou) Date: Mon, 20 Feb 2012 19:33:48 +0100 Subject: [Python-checkins] =?utf8?q?cpython=3A_Issue_=2313641=3A_Decoding_?= =?utf8?q?functions_in_the_base64_module_now_accept_ASCII-only?= Message-ID: http://hg.python.org/cpython/rev/c760bd844222 changeset: 75058:c760bd844222 user: Antoine Pitrou date: Mon Feb 20 19:30:23 2012 +0100 summary: Issue #13641: Decoding functions in the base64 module now accept ASCII-only unicode strings. Patch by Catalin Iacob. files: Doc/library/base64.rst | 11 +- Lib/base64.py | 26 ++- Lib/test/test_base64.py | 163 +++++++++++++++++---------- Misc/NEWS | 3 + 4 files changed, 130 insertions(+), 73 deletions(-) diff --git a/Doc/library/base64.rst b/Doc/library/base64.rst --- a/Doc/library/base64.rst +++ b/Doc/library/base64.rst @@ -18,9 +18,14 @@ 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/Lib/base64.py b/Lib/base64.py --- a/Lib/base64.py +++ b/Lib/base64.py @@ -29,6 +29,16 @@ bytes_types = (bytes, bytearray) # Types acceptable as binary data +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__) def _translate(s, altchars): if not isinstance(s, bytes_types): @@ -79,12 +89,9 @@ 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'/'}) if validate and not re.match(b'^[A-Za-z0-9+/]*={0,2}$', s): @@ -211,8 +218,7 @@ 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,8 +226,7 @@ # 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}) if casefold: @@ -292,8 +297,7 @@ 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/test/test_base64.py b/Lib/test/test_base64.py --- a/Lib/test/test_base64.py +++ b/Lib/test/test_base64.py @@ -102,44 +102,53 @@ 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. @@ -154,8 +163,10 @@ (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) + base64.b64decode(bstr.decode('ascii'), validate=True) def test_b32encode(self): eq = self.assertEqual @@ -170,40 +181,62 @@ 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) + base64.b32decode(data.decode('ascii')) def test_b16encode(self): eq = self.assertEqual @@ -214,12 +247,24 @@ 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/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -469,6 +469,9 @@ Library ------- +- Issue #13641: Decoding functions in the base64 module now accept ASCII-only + unicode strings. Patch by Catalin Iacob. + - Issue #14043: Speed up importlib's _FileFinder by at least 8x, and add a new importlib.invalidate_caches() function. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Feb 20 19:44:37 2012 From: python-checkins at python.org (antoine.pitrou) Date: Mon, 20 Feb 2012 19:44:37 +0100 Subject: [Python-checkins] =?utf8?q?cpython=3A_Issue_=2314040=3A_Remove_ra?= =?utf8?q?rely_used_file_name_suffixes_for_C_extensions_=28under?= Message-ID: http://hg.python.org/cpython/rev/42f61304f77d changeset: 75059:42f61304f77d user: Antoine Pitrou date: Mon Feb 20 19:41:11 2012 +0100 summary: Issue #14040: Remove rarely used file name suffixes for C extensions (under POSIX mainly). This will improve import performance a bit (especially under importlib). files: Doc/whatsnew/3.3.rst | 14 ++++++++++++++ Misc/NEWS | 3 +++ Python/dynload_aix.c | 1 - Python/dynload_dl.c | 1 - Python/dynload_hpux.c | 1 - Python/dynload_next.c | 1 - Python/dynload_shlib.c | 6 ------ 7 files changed, 17 insertions(+), 10 deletions(-) diff --git a/Doc/whatsnew/3.3.rst b/Doc/whatsnew/3.3.rst --- a/Doc/whatsnew/3.3.rst +++ b/Doc/whatsnew/3.3.rst @@ -939,6 +939,20 @@ :c:func:`PyUnicode_FromFormat()`, your code will automatically take advantage of the new unicode representations. +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`.) + + Other issues ------------ diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -10,6 +10,9 @@ Core and Builtins ----------------- +- Issue #14040: Remove rarely used file name suffixes for C extensions + (under POSIX mainly). + - Issue #14051: Allow arbitrary attributes to be set of classmethod and staticmethod. diff --git a/Python/dynload_aix.c b/Python/dynload_aix.c --- a/Python/dynload_aix.c +++ b/Python/dynload_aix.c @@ -28,7 +28,6 @@ const struct filedescr _PyImport_DynLoadFiletab[] = { {".so", "rb", C_EXTENSION}, - {"module.so", "rb", C_EXTENSION}, {0, 0} }; diff --git a/Python/dynload_dl.c b/Python/dynload_dl.c --- a/Python/dynload_dl.c +++ b/Python/dynload_dl.c @@ -11,7 +11,6 @@ const struct filedescr _PyImport_DynLoadFiletab[] = { {".o", "rb", C_EXTENSION}, - {"module.o", "rb", C_EXTENSION}, {0, 0} }; diff --git a/Python/dynload_hpux.c b/Python/dynload_hpux.c --- a/Python/dynload_hpux.c +++ b/Python/dynload_hpux.c @@ -15,7 +15,6 @@ const struct filedescr _PyImport_DynLoadFiletab[] = { {SHLIB_EXT, "rb", C_EXTENSION}, - {"module"SHLIB_EXT, "rb", C_EXTENSION}, {0, 0} }; diff --git a/Python/dynload_next.c b/Python/dynload_next.c --- a/Python/dynload_next.c +++ b/Python/dynload_next.c @@ -10,7 +10,6 @@ const struct filedescr _PyImport_DynLoadFiletab[] = { {".so", "rb", C_EXTENSION}, - {"module.so", "rb", C_EXTENSION}, {0, 0} }; diff --git a/Python/dynload_shlib.c b/Python/dynload_shlib.c --- a/Python/dynload_shlib.c +++ b/Python/dynload_shlib.c @@ -39,7 +39,6 @@ const struct filedescr _PyImport_DynLoadFiletab[] = { #ifdef __CYGWIN__ {".dll", "rb", C_EXTENSION}, - {"module.dll", "rb", C_EXTENSION}, #else /* !__CYGWIN__ */ #if defined(PYOS_OS2) && defined(PYCC_GCC) {".pyd", "rb", C_EXTENSION}, @@ -48,15 +47,10 @@ #ifdef __VMS {".exe", "rb", C_EXTENSION}, {".EXE", "rb", C_EXTENSION}, - {"module.exe", "rb", C_EXTENSION}, - {"MODULE.EXE", "rb", C_EXTENSION}, #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}, #endif /* __VMS */ #endif /* defined(PYOS_OS2) && defined(PYCC_GCC) */ #endif /* __CYGWIN__ */ -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Feb 20 19:49:52 2012 From: python-checkins at python.org (antoine.pitrou) Date: Mon, 20 Feb 2012 19:49:52 +0100 Subject: [Python-checkins] =?utf8?q?cpython=3A_Fix_use_of_assertRaises_fol?= =?utf8?q?lowing_c760bd844222_=28spotted_by_Alex_Gaynor=29=2E?= Message-ID: http://hg.python.org/cpython/rev/2e54fd523412 changeset: 75060:2e54fd523412 user: Antoine Pitrou date: Mon Feb 20 19:46:26 2012 +0100 summary: Fix use of assertRaises following c760bd844222 (spotted by Alex Gaynor). files: Lib/test/test_base64.py | 2 ++ 1 files changed, 2 insertions(+), 0 deletions(-) diff --git a/Lib/test/test_base64.py b/Lib/test/test_base64.py --- a/Lib/test/test_base64.py +++ b/Lib/test/test_base64.py @@ -166,6 +166,7 @@ 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): @@ -236,6 +237,7 @@ 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): -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Feb 20 19:51:09 2012 From: python-checkins at python.org (vinay.sajip) Date: Mon, 20 Feb 2012 19:51:09 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=282=2E7=29=3A_logging=3A_clar?= =?utf8?q?ified_documentation_for_Handler=2EhandleError=2E?= Message-ID: http://hg.python.org/cpython/rev/37494e44265c changeset: 75061:37494e44265c branch: 2.7 parent: 75053:7ff4731853e2 user: Vinay Sajip date: Mon Feb 20 18:34:07 2012 +0000 summary: logging: clarified documentation for Handler.handleError. files: Doc/library/logging.rst | 14 ++++++++------ 1 files changed, 8 insertions(+), 6 deletions(-) diff --git a/Doc/library/logging.rst b/Doc/library/logging.rst --- a/Doc/library/logging.rst +++ b/Doc/library/logging.rst @@ -339,12 +339,14 @@ .. method:: Handler.handleError(record) This method should be called from handlers when an exception is encountered - during an :meth:`emit` call. By default it does nothing, which means that - exceptions get silently ignored. This is what is mostly wanted for a logging - system - most users will not care about errors in the logging system, they are - more interested in application errors. You could, however, replace this with a - custom handler if you wish. The specified record is the one which was being - processed when the exception occurred. + during an :meth:`emit` call. If the module-level attribute + ``raiseExceptions`` is ``False``, exceptions get silently ignored. This is + what is mostly wanted for a logging system - most users will not care about + errors in the logging system, they are more interested in application + errors. You could, however, replace this with a custom handler if you wish. + The specified record is the one which was being processed when the exception + occurred. (The default value of ``raiseExceptions`` is ``True``, as that is + more useful during development). .. method:: Handler.format(record) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Feb 20 19:51:10 2012 From: python-checkins at python.org (vinay.sajip) Date: Mon, 20 Feb 2012 19:51:10 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=283=2E2=29=3A_logging=3A_clar?= =?utf8?q?ified_documentation_for_Handler=2EhandleError=2E?= Message-ID: http://hg.python.org/cpython/rev/a72e0e1d0292 changeset: 75062:a72e0e1d0292 branch: 3.2 parent: 75046:c4a507493453 user: Vinay Sajip date: Mon Feb 20 18:35:26 2012 +0000 summary: logging: clarified documentation for Handler.handleError. files: Doc/library/logging.rst | 14 ++++++++------ 1 files changed, 8 insertions(+), 6 deletions(-) diff --git a/Doc/library/logging.rst b/Doc/library/logging.rst --- a/Doc/library/logging.rst +++ b/Doc/library/logging.rst @@ -375,12 +375,14 @@ .. method:: Handler.handleError(record) This method should be called from handlers when an exception is encountered - during an :meth:`emit` call. By default it does nothing, which means that - exceptions get silently ignored. This is what is mostly wanted for a logging - system - most users will not care about errors in the logging system, they are - more interested in application errors. You could, however, replace this with a - custom handler if you wish. The specified record is the one which was being - processed when the exception occurred. + during an :meth:`emit` call. If the module-level attribute + ``raiseExceptions`` is ``False``, exceptions get silently ignored. This is + what is mostly wanted for a logging system - most users will not care about + errors in the logging system, they are more interested in application + errors. You could, however, replace this with a custom handler if you wish. + The specified record is the one which was being processed when the exception + occurred. (The default value of ``raiseExceptions`` is ``True``, as that is + more useful during development). .. method:: Handler.format(record) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Feb 20 19:51:11 2012 From: python-checkins at python.org (vinay.sajip) Date: Mon, 20 Feb 2012 19:51:11 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_3=2E2_-=3E_default=29?= =?utf8?q?=3A_Merged_documentation_update_from_3=2E2=2E?= Message-ID: http://hg.python.org/cpython/rev/2b4a553bd6ed changeset: 75063:2b4a553bd6ed parent: 75057:1f9461ef6312 parent: 75062:a72e0e1d0292 user: Vinay Sajip date: Mon Feb 20 18:36:12 2012 +0000 summary: Merged documentation update from 3.2. files: Doc/library/logging.rst | 14 ++++++++------ 1 files changed, 8 insertions(+), 6 deletions(-) diff --git a/Doc/library/logging.rst b/Doc/library/logging.rst --- a/Doc/library/logging.rst +++ b/Doc/library/logging.rst @@ -378,12 +378,14 @@ .. method:: Handler.handleError(record) This method should be called from handlers when an exception is encountered - during an :meth:`emit` call. By default it does nothing, which means that - exceptions get silently ignored. This is what is mostly wanted for a logging - system - most users will not care about errors in the logging system, they are - more interested in application errors. You could, however, replace this with a - custom handler if you wish. The specified record is the one which was being - processed when the exception occurred. + during an :meth:`emit` call. If the module-level attribute + ``raiseExceptions`` is ``False``, exceptions get silently ignored. This is + what is mostly wanted for a logging system - most users will not care about + errors in the logging system, they are more interested in application + errors. You could, however, replace this with a custom handler if you wish. + The specified record is the one which was being processed when the exception + occurred. (The default value of ``raiseExceptions`` is ``True``, as that is + more useful during development). .. method:: Handler.format(record) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Feb 20 19:51:12 2012 From: python-checkins at python.org (vinay.sajip) Date: Mon, 20 Feb 2012 19:51:12 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_default_-=3E_default?= =?utf8?q?=29=3A_Merged_upstream_changes=2E?= Message-ID: http://hg.python.org/cpython/rev/ae960e5ae112 changeset: 75064:ae960e5ae112 parent: 75063:2b4a553bd6ed parent: 75059:42f61304f77d user: Vinay Sajip date: Mon Feb 20 18:50:33 2012 +0000 summary: Merged upstream changes. files: Doc/library/base64.rst | 11 +- Doc/whatsnew/3.3.rst | 14 ++ Lib/base64.py | 26 ++- Lib/test/test_base64.py | 163 +++++++++++++++++---------- Misc/NEWS | 6 + Python/dynload_aix.c | 1 - Python/dynload_dl.c | 1 - Python/dynload_hpux.c | 1 - Python/dynload_next.c | 1 - Python/dynload_shlib.c | 6 - 10 files changed, 147 insertions(+), 83 deletions(-) diff --git a/Doc/library/base64.rst b/Doc/library/base64.rst --- a/Doc/library/base64.rst +++ b/Doc/library/base64.rst @@ -18,9 +18,14 @@ 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/whatsnew/3.3.rst b/Doc/whatsnew/3.3.rst --- a/Doc/whatsnew/3.3.rst +++ b/Doc/whatsnew/3.3.rst @@ -939,6 +939,20 @@ :c:func:`PyUnicode_FromFormat()`, your code will automatically take advantage of the new unicode representations. +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`.) + + Other issues ------------ diff --git a/Lib/base64.py b/Lib/base64.py --- a/Lib/base64.py +++ b/Lib/base64.py @@ -29,6 +29,16 @@ bytes_types = (bytes, bytearray) # Types acceptable as binary data +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__) def _translate(s, altchars): if not isinstance(s, bytes_types): @@ -79,12 +89,9 @@ 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'/'}) if validate and not re.match(b'^[A-Za-z0-9+/]*={0,2}$', s): @@ -211,8 +218,7 @@ 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,8 +226,7 @@ # 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}) if casefold: @@ -292,8 +297,7 @@ 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/test/test_base64.py b/Lib/test/test_base64.py --- a/Lib/test/test_base64.py +++ b/Lib/test/test_base64.py @@ -102,44 +102,53 @@ 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. @@ -154,8 +163,10 @@ (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) + base64.b64decode(bstr.decode('ascii'), validate=True) def test_b32encode(self): eq = self.assertEqual @@ -170,40 +181,62 @@ 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) + base64.b32decode(data.decode('ascii')) def test_b16encode(self): eq = self.assertEqual @@ -214,12 +247,24 @@ 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/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -10,6 +10,9 @@ Core and Builtins ----------------- +- Issue #14040: Remove rarely used file name suffixes for C extensions + (under POSIX mainly). + - Issue #14051: Allow arbitrary attributes to be set of classmethod and staticmethod. @@ -469,6 +472,9 @@ Library ------- +- Issue #13641: Decoding functions in the base64 module now accept ASCII-only + unicode strings. Patch by Catalin Iacob. + - Issue #14043: Speed up importlib's _FileFinder by at least 8x, and add a new importlib.invalidate_caches() function. diff --git a/Python/dynload_aix.c b/Python/dynload_aix.c --- a/Python/dynload_aix.c +++ b/Python/dynload_aix.c @@ -28,7 +28,6 @@ const struct filedescr _PyImport_DynLoadFiletab[] = { {".so", "rb", C_EXTENSION}, - {"module.so", "rb", C_EXTENSION}, {0, 0} }; diff --git a/Python/dynload_dl.c b/Python/dynload_dl.c --- a/Python/dynload_dl.c +++ b/Python/dynload_dl.c @@ -11,7 +11,6 @@ const struct filedescr _PyImport_DynLoadFiletab[] = { {".o", "rb", C_EXTENSION}, - {"module.o", "rb", C_EXTENSION}, {0, 0} }; diff --git a/Python/dynload_hpux.c b/Python/dynload_hpux.c --- a/Python/dynload_hpux.c +++ b/Python/dynload_hpux.c @@ -15,7 +15,6 @@ const struct filedescr _PyImport_DynLoadFiletab[] = { {SHLIB_EXT, "rb", C_EXTENSION}, - {"module"SHLIB_EXT, "rb", C_EXTENSION}, {0, 0} }; diff --git a/Python/dynload_next.c b/Python/dynload_next.c --- a/Python/dynload_next.c +++ b/Python/dynload_next.c @@ -10,7 +10,6 @@ const struct filedescr _PyImport_DynLoadFiletab[] = { {".so", "rb", C_EXTENSION}, - {"module.so", "rb", C_EXTENSION}, {0, 0} }; diff --git a/Python/dynload_shlib.c b/Python/dynload_shlib.c --- a/Python/dynload_shlib.c +++ b/Python/dynload_shlib.c @@ -39,7 +39,6 @@ const struct filedescr _PyImport_DynLoadFiletab[] = { #ifdef __CYGWIN__ {".dll", "rb", C_EXTENSION}, - {"module.dll", "rb", C_EXTENSION}, #else /* !__CYGWIN__ */ #if defined(PYOS_OS2) && defined(PYCC_GCC) {".pyd", "rb", C_EXTENSION}, @@ -48,15 +47,10 @@ #ifdef __VMS {".exe", "rb", C_EXTENSION}, {".EXE", "rb", C_EXTENSION}, - {"module.exe", "rb", C_EXTENSION}, - {"MODULE.EXE", "rb", C_EXTENSION}, #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}, #endif /* __VMS */ #endif /* defined(PYOS_OS2) && defined(PYCC_GCC) */ #endif /* __CYGWIN__ */ -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Feb 20 19:51:13 2012 From: python-checkins at python.org (vinay.sajip) Date: Mon, 20 Feb 2012 19:51:13 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_default_-=3E_default?= =?utf8?q?=29=3A_Merged_upstream_changes=2E?= Message-ID: http://hg.python.org/cpython/rev/d64f04e437b1 changeset: 75065:d64f04e437b1 parent: 75064:ae960e5ae112 parent: 75060:2e54fd523412 user: Vinay Sajip date: Mon Feb 20 18:51:00 2012 +0000 summary: Merged upstream changes. files: Lib/test/test_base64.py | 2 ++ 1 files changed, 2 insertions(+), 0 deletions(-) diff --git a/Lib/test/test_base64.py b/Lib/test/test_base64.py --- a/Lib/test/test_base64.py +++ b/Lib/test/test_base64.py @@ -166,6 +166,7 @@ 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): @@ -236,6 +237,7 @@ 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): -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Feb 20 20:01:40 2012 From: python-checkins at python.org (georg.brandl) Date: Mon, 20 Feb 2012 20:01:40 +0100 Subject: [Python-checkins] =?utf8?b?Y3B5dGhvbiAoMy4xKTogSXNzdWUgIzEzNzAz?= =?utf8?q?=3A_add_a_way_to_randomize_the_hash_values_of_basic_types_=28str?= =?utf8?q?=2C?= Message-ID: http://hg.python.org/cpython/rev/f4b7ecf8a5f8 changeset: 75066:f4b7ecf8a5f8 branch: 3.1 parent: 75016:4dd5a94fd3e3 user: Georg Brandl date: Mon Feb 20 19:54:16 2012 +0100 summary: Issue #13703: add a way to randomize the hash values of basic types (str, bytes, datetime) in order to make algorithmic complexity attacks on (e.g.) web apps much more complicated. The environment variable PYTHONHASHSEED and the new command line flag -R control this behavior. files: Doc/library/sys.rst | 4 + Doc/reference/datamodel.rst | 2 + Doc/using/cmdline.rst | 48 +- Include/object.h | 6 + Include/pydebug.h | 1 + Include/pythonrun.h | 2 + Lib/json/__init__.py | 4 +- Lib/os.py | 17 - Lib/test/mapping_tests.py | 2 +- Lib/test/regrtest.py | 5 + Lib/test/script_helper.py | 7 +- Lib/test/test_cmd_line.py | 17 +- Lib/test/test_descr.py | 12 +- Lib/test/test_hash.py | 92 ++- Lib/test/test_os.py | 36 +- Lib/test/test_set.py | 23 +- Lib/test/test_sys.py | 2 +- Lib/test/test_urllib.py | 4 +- Lib/tkinter/test/test_ttk/test_functions.py | 2 +- Makefile.pre.in | 1 + Misc/NEWS | 5 + Misc/python.man | 29 + Modules/datetimemodule.c | 4 +- Modules/main.c | 16 +- Modules/posixmodule.c | 133 +--- Objects/bytesobject.c | 12 +- Objects/object.c | 2 + Objects/unicodeobject.c | 12 +- PCbuild/pythoncore.vcproj | 4 + Python/pythonrun.c | 8 + Python/random.c | 302 ++++++++++ Python/sysmodule.c | 6 +- 32 files changed, 664 insertions(+), 156 deletions(-) diff --git a/Doc/library/sys.rst b/Doc/library/sys.rst --- a/Doc/library/sys.rst +++ b/Doc/library/sys.rst @@ -220,8 +220,12 @@ :const:`ignore_environment` :option:`-E` :const:`verbose` :option:`-v` :const:`bytes_warning` :option:`-b` + :const:`hash_randomization` :option:`-R` ============================= ============================= + .. versionadded:: 3.1.5 + The ``hash_randomization`` attribute. + .. data:: float_info diff --git a/Doc/reference/datamodel.rst b/Doc/reference/datamodel.rst --- a/Doc/reference/datamodel.rst +++ b/Doc/reference/datamodel.rst @@ -1265,6 +1265,8 @@ inheritance of :meth:`__hash__` will be blocked, just as if :attr:`__hash__` had been explicitly set to :const:`None`. + See also the :option:`-R` command-line option. + .. method:: object.__bool__(self) diff --git a/Doc/using/cmdline.rst b/Doc/using/cmdline.rst --- a/Doc/using/cmdline.rst +++ b/Doc/using/cmdline.rst @@ -21,7 +21,7 @@ When invoking Python, you may specify any of these options:: - python [-bBdEhiOsSuvVWx?] [-c command | -m module-name | script | - ] [args] + python [-bBdEhiORsSuvVWx?] [-c command | -m module-name | script | - ] [args] The most common use case is, of course, a simple invocation of a script:: @@ -215,6 +215,29 @@ Discard docstrings in addition to the :option:`-O` optimizations. +.. 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. + + 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 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. + + See also :envvar:`PYTHONHASHSEED`. + + .. versionadded:: 3.1.5 + + .. cmdoption:: -s Don't add user site directory to sys.path @@ -314,6 +337,7 @@ .. note:: The line numbers in error messages will be off by one. + Options you shouldn't use ~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -328,6 +352,7 @@ Reserved for alternative implementations of Python to use for their own purposes. + .. _using-on-envvars: Environment variables @@ -435,6 +460,27 @@ import of source modules. +.. 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 :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 + randomization. + + Its purpose is to allow repeatable hashing, such as for selftests for the + 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. + + .. versionadded:: 3.1.5 + + .. envvar:: PYTHONIOENCODING Overrides the encoding used for stdin/stdout/stderr, in the syntax diff --git a/Include/object.h b/Include/object.h --- a/Include/object.h +++ b/Include/object.h @@ -473,6 +473,12 @@ PyAPI_FUNC(long) _Py_HashDouble(double); PyAPI_FUNC(long) _Py_HashPointer(void*); +typedef struct { + long prefix; + long suffix; +} _Py_HashSecret_t; +PyAPI_DATA(_Py_HashSecret_t) _Py_HashSecret; + /* Helper for passing objects to printf and the like */ #define PyObject_REPR(obj) _PyUnicode_AsString(PyObject_Repr(obj)) diff --git a/Include/pydebug.h b/Include/pydebug.h --- a/Include/pydebug.h +++ b/Include/pydebug.h @@ -19,6 +19,7 @@ PyAPI_DATA(int) Py_DontWriteBytecodeFlag; PyAPI_DATA(int) Py_NoUserSiteDirectory; PyAPI_DATA(int) Py_UnbufferedStdioFlag; +PyAPI_DATA(int) Py_HashRandomizationFlag; /* this is a wrapper around getenv() that pays attention to Py_IgnoreEnvironmentFlag. It should be used for getting variables like diff --git a/Include/pythonrun.h b/Include/pythonrun.h --- a/Include/pythonrun.h +++ b/Include/pythonrun.h @@ -174,6 +174,8 @@ PyAPI_FUNC(PyOS_sighandler_t) PyOS_getsig(int); PyAPI_FUNC(PyOS_sighandler_t) PyOS_setsig(int, PyOS_sighandler_t); +/* Random */ +PyAPI_FUNC(int) _PyOS_URandom (void *buffer, Py_ssize_t size); #ifdef __cplusplus } diff --git a/Lib/json/__init__.py b/Lib/json/__init__.py --- a/Lib/json/__init__.py +++ b/Lib/json/__init__.py @@ -31,7 +31,9 @@ Compact encoding:: >>> import json - >>> json.dumps([1,2,3,{'4': 5, '6': 7}], separators=(',', ':')) + >>> from collections import OrderedDict + >>> mydict = OrderedDict([('4', 5), ('6', 7)]) + >>> json.dumps([1,2,3,mydict], separators=(',', ':')) '[1,2,3,{"4":5,"6":7}]' Pretty printing:: diff --git a/Lib/os.py b/Lib/os.py --- a/Lib/os.py +++ b/Lib/os.py @@ -611,23 +611,6 @@ except NameError: # statvfs_result may not exist pass -if not _exists("urandom"): - def urandom(n): - """urandom(n) -> str - - Return a string of n random bytes suitable for cryptographic use. - - """ - try: - _urandomfd = open("/dev/urandom", O_RDONLY) - except (OSError, IOError): - raise NotImplementedError("/dev/urandom (or equivalent) not found") - bs = b"" - while len(bs) < n: - bs += read(_urandomfd, n - len(bs)) - close(_urandomfd) - return bs - # Supply os.popen() def popen(cmd, mode="r", buffering=-1): if not isinstance(cmd, str): diff --git a/Lib/test/mapping_tests.py b/Lib/test/mapping_tests.py --- a/Lib/test/mapping_tests.py +++ b/Lib/test/mapping_tests.py @@ -14,7 +14,7 @@ def _reference(self): """Return a dictionary of values which are invariant by storage in the object under test.""" - return {1:2, "key1":"value1", "key2":(1,2,3)} + return {"1": "2", "key1":"value1", "key2":(1,2,3)} def _empty_mapping(self): """Return an empty mapping object""" return self.type2test() diff --git a/Lib/test/regrtest.py b/Lib/test/regrtest.py --- a/Lib/test/regrtest.py +++ b/Lib/test/regrtest.py @@ -428,6 +428,11 @@ except ValueError: print("Couldn't find starting test (%s), using all tests" % start) if randomize: + hashseed = os.getenv('PYTHONHASHSEED') + if not hashseed: + os.environ['PYTHONHASHSEED'] = str(random_seed) + os.execv(sys.executable, [sys.executable] + sys.argv) + return random.seed(random_seed) print("Using random seed", random_seed) random.shuffle(tests) diff --git a/Lib/test/script_helper.py b/Lib/test/script_helper.py --- a/Lib/test/script_helper.py +++ b/Lib/test/script_helper.py @@ -3,7 +3,6 @@ import sys import os -import re import os.path import tempfile import subprocess @@ -19,11 +18,15 @@ cmd_line = [sys.executable] if not env_vars: cmd_line.append('-E') - cmd_line.extend(args) # Need to preserve the original environment, for in-place testing of # shared library builds. env = os.environ.copy() + # But a special flag that can be set to override -- in this case, the + # caller is responsible to pass the full environment. + if env_vars.pop('__cleanenv', None): + env = {} env.update(env_vars) + cmd_line.extend(args) p = subprocess.Popen(cmd_line, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, env=env) diff --git a/Lib/test/test_cmd_line.py b/Lib/test/test_cmd_line.py --- a/Lib/test/test_cmd_line.py +++ b/Lib/test/test_cmd_line.py @@ -4,7 +4,6 @@ import os import test.support, unittest -import os import sys import subprocess @@ -190,6 +189,22 @@ self.assertTrue(path1.encode('ascii') in stdout) self.assertTrue(path2.encode('ascii') in stdout) + def test_hash_randomization(self): + # Verify that -R enables hash randomization: + self.verify_valid_flag('-R') + hashes = [] + for i in range(2): + code = 'print(hash("spam"))' + data, rc = self.start_python_and_exit_code('-R', '-c', code) + self.assertEqual(rc, 0) + hashes.append(data) + self.assertNotEqual(hashes[0], hashes[1]) + + # Verify that sys.flags contains hash_randomization + code = 'import sys; print("random is", sys.flags.hash_randomization)' + data, rc = self.start_python_and_exit_code('-R', '-c', code) + self.assertEqual(rc, 0) + self.assertIn(b'random is 1', data) def test_main(): test.support.run_unittest(CmdLineTest) diff --git a/Lib/test/test_descr.py b/Lib/test/test_descr.py --- a/Lib/test/test_descr.py +++ b/Lib/test/test_descr.py @@ -4300,8 +4300,18 @@ 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()} - self.assertEqual(repr(self.C.__dict__), 'dict_proxy({!r})'.format(dict_)) + repr_ = repr(self.C.__dict__) + self.assert_(repr_.startswith('dict_proxy(')) + self.assert_(repr_.endswith(')')) + self.assertEqual(sorted_dict_repr(repr_[len('dict_proxy('):-len(')')]), + sorted_dict_repr('{!r}'.format(dict_))) class PTypesLongInitTest(unittest.TestCase): diff --git a/Lib/test/test_hash.py b/Lib/test/test_hash.py --- a/Lib/test/test_hash.py +++ b/Lib/test/test_hash.py @@ -3,10 +3,16 @@ # # Also test that hash implementations are inherited as expected +import datetime +import os +import struct import unittest from test import support +from test.script_helper import assert_python_ok from collections import Hashable +IS_64BIT = (struct.calcsize('l') == 8) + class HashEqualityTestCase(unittest.TestCase): @@ -118,10 +124,92 @@ for obj in self.hashes_to_check: self.assertEqual(hash(obj), _default_hash(obj)) +class HashRandomizationTests(unittest.TestCase): + + # Each subclass should define a field "repr_", containing the repr() of + # an object to be tested + + def get_hash_command(self, repr_): + return 'print(hash(%s))' % repr_ + + def get_hash(self, repr_, seed=None): + env = os.environ.copy() + env['__cleanenv'] = True # signal to assert_python not to do a copy + # of os.environ on its own + if seed is not None: + env['PYTHONHASHSEED'] = str(seed) + else: + env.pop('PYTHONHASHSEED', None) + out = assert_python_ok( + '-c', self.get_hash_command(repr_), + **env) + stdout = out[1].strip() + return int(stdout) + + def test_randomized_hash(self): + # two runs should return different hashes + run1 = self.get_hash(self.repr_, seed='random') + run2 = self.get_hash(self.repr_, seed='random') + self.assertNotEqual(run1, run2) + +class StringlikeHashRandomizationTests(HashRandomizationTests): + def test_null_hash(self): + # PYTHONHASHSEED=0 disables the randomized hash + if IS_64BIT: + known_hash_of_obj = 1453079729188098211 + else: + known_hash_of_obj = -1600925533 + + # Randomization is disabled by default: + self.assertEqual(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) + + def test_fixed_hash(self): + # test a fixed seed for the randomized hash + # Note that all types share the same values: + if IS_64BIT: + h = -4410911502303878509 + else: + h = -206076799 + self.assertEqual(self.get_hash(self.repr_, seed=42), h) + +class StrHashRandomizationTests(StringlikeHashRandomizationTests): + repr_ = repr('abc') + + def test_empty_string(self): + self.assertEqual(hash(""), 0) + +class BytesHashRandomizationTests(StringlikeHashRandomizationTests): + repr_ = repr(b'abc') + + def test_empty_string(self): + self.assertEqual(hash(b""), 0) + +class DatetimeTests(HashRandomizationTests): + def get_hash_command(self, repr_): + return 'import datetime; print(hash(%s))' % repr_ + +class DatetimeDateTests(DatetimeTests): + repr_ = repr(datetime.date(1066, 10, 14)) + +class DatetimeDatetimeTests(DatetimeTests): + repr_ = repr(datetime.datetime(1, 2, 3, 4, 5, 6, 7)) + +class DatetimeTimeTests(DatetimeTests): + repr_ = repr(datetime.time(0)) + + def test_main(): support.run_unittest(HashEqualityTestCase, - HashInheritanceTestCase, - HashBuiltinsTestCase) + HashInheritanceTestCase, + HashBuiltinsTestCase, + StrHashRandomizationTests, + BytesHashRandomizationTests, + DatetimeDateTests, + DatetimeDatetimeTests, + DatetimeTimeTests) if __name__ == "__main__": diff --git a/Lib/test/test_os.py b/Lib/test/test_os.py --- a/Lib/test/test_os.py +++ b/Lib/test/test_os.py @@ -9,6 +9,7 @@ import sys import shutil from test import support +from test.script_helper import assert_python_ok # Detect whether we're on a Linux system that uses the (now outdated # and unmaintained) linuxthreads threading library. There's an issue @@ -574,14 +575,33 @@ f.close() class URandomTests(unittest.TestCase): - def test_urandom(self): - try: - self.assertEqual(len(os.urandom(1)), 1) - self.assertEqual(len(os.urandom(10)), 10) - self.assertEqual(len(os.urandom(100)), 100) - self.assertEqual(len(os.urandom(1000)), 1000) - except NotImplementedError: - pass + def test_urandom_length(self): + self.assertEqual(len(os.urandom(0)), 0) + self.assertEqual(len(os.urandom(1)), 1) + self.assertEqual(len(os.urandom(10)), 10) + self.assertEqual(len(os.urandom(100)), 100) + self.assertEqual(len(os.urandom(1000)), 1000) + + def test_urandom_value(self): + data1 = os.urandom(16) + data2 = os.urandom(16) + self.assertNotEqual(data1, data2) + + def get_urandom_subprocess(self, count): + code = '\n'.join(( + 'import os, sys', + 'data = os.urandom(%s)' % count, + 'sys.stdout.buffer.write(data)', + 'sys.stdout.buffer.flush()')) + out = assert_python_ok('-c', code) + stdout = out[1] + self.assertEqual(len(stdout), 16) + return stdout + + def test_urandom_subprocess(self): + data1 = self.get_urandom_subprocess(16) + data2 = self.get_urandom_subprocess(16) + self.assertNotEqual(data1, data2) class ExecTests(unittest.TestCase): @unittest.skipIf(USING_LINUXTHREADS, diff --git a/Lib/test/test_set.py b/Lib/test/test_set.py --- a/Lib/test/test_set.py +++ b/Lib/test/test_set.py @@ -734,6 +734,17 @@ if self.repr is not None: self.assertEqual(repr(self.set), self.repr) + def check_repr_against_values(self): + text = repr(self.set) + self.assertTrue(text.startswith('{')) + self.assertTrue(text.endswith('}')) + + result = text[1:-1].split(', ') + result.sort() + sorted_repr_values = [repr(value) for value in self.values] + sorted_repr_values.sort() + self.assertEqual(result, sorted_repr_values) + def test_print(self): try: fo = open(support.TESTFN, "w") @@ -892,7 +903,9 @@ self.set = set(self.values) self.dup = set(self.values) self.length = 3 - self.repr = "{'a', 'c', 'b'}" + + def test_repr(self): + self.check_repr_against_values() #------------------------------------------------------------------------------ @@ -903,7 +916,9 @@ self.set = set(self.values) self.dup = set(self.values) self.length = 3 - self.repr = "{b'a', b'c', b'b'}" + + def test_repr(self): + self.check_repr_against_values() #------------------------------------------------------------------------------ @@ -916,11 +931,13 @@ self.set = set(self.values) self.dup = set(self.values) self.length = 4 - self.repr = "{'a', b'a', 'b', b'b'}" def tearDown(self): warnings.filters = self.warning_filters + def test_repr(self): + self.check_repr_against_values() + #============================================================================== def baditer(): diff --git a/Lib/test/test_sys.py b/Lib/test/test_sys.py --- a/Lib/test/test_sys.py +++ b/Lib/test/test_sys.py @@ -446,7 +446,7 @@ attrs = ("debug", "division_warning", "inspect", "interactive", "optimize", "dont_write_bytecode", "no_user_site", "no_site", "ignore_environment", "verbose", - "bytes_warning") + "bytes_warning", "hash_randomization") for attr in attrs: self.assertTrue(hasattr(sys.flags, attr), attr) self.assertEqual(type(getattr(sys.flags, attr)), int, attr) diff --git a/Lib/test/test_urllib.py b/Lib/test/test_urllib.py --- a/Lib/test/test_urllib.py +++ b/Lib/test/test_urllib.py @@ -12,6 +12,7 @@ import sys import tempfile import warnings +import collections def hexescape(char): """Escape char as RFC 2396 specifies""" @@ -840,8 +841,9 @@ self.assertEqual("a=1&a=2", urllib.parse.urlencode({"a": [1, 2]}, True)) self.assertEqual("a=None&a=a", urllib.parse.urlencode({"a": [None, "a"]}, True)) + data = collections.OrderedDict([("a", 1), ("b", 1)]) self.assertEqual("a=a&a=b", - urllib.parse.urlencode({"a": {"a": 1, "b": 1}}, True)) + urllib.parse.urlencode({"a": data}, True)) def test_urlencode_encoding(self): # ASCII encoding. Expect %3F with errors="replace' diff --git a/Lib/tkinter/test/test_ttk/test_functions.py b/Lib/tkinter/test/test_ttk/test_functions.py --- a/Lib/tkinter/test/test_ttk/test_functions.py +++ b/Lib/tkinter/test/test_ttk/test_functions.py @@ -143,7 +143,7 @@ ('a', 'b', 'c')), ("test {a b} c", ())) # state spec and options self.assertEqual(ttk._format_elemcreate('image', False, 'test', - ('a', 'b'), a='x', b='y'), ("test a b", ("-a", "x", "-b", "y"))) + ('a', 'b'), a='x'), ("test a b", ("-a", "x"))) # format returned values as a tcl script # state spec with multiple states and an option with a multivalue self.assertEqual(ttk._format_elemcreate('image', True, 'test', diff --git a/Makefile.pre.in b/Makefile.pre.in --- a/Makefile.pre.in +++ b/Makefile.pre.in @@ -305,6 +305,7 @@ Python/pymath.o \ Python/pystate.o \ Python/pythonrun.o \ + Python/random.o \ Python/structmember.o \ Python/symtable.o \ Python/sysmodule.o \ diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -10,6 +10,11 @@ Core and Builtins ----------------- +- Issue #13703: oCERT-2011-003: add -R command-line option and PYTHONHASHSEED + environment variables, 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. + Library ------- diff --git a/Misc/python.man b/Misc/python.man --- a/Misc/python.man +++ b/Misc/python.man @@ -34,6 +34,9 @@ .B \-OO ] [ +.B \-R +] +[ .B -Q .I argument ] @@ -145,6 +148,18 @@ .B \-OO Discard docstrings in addition to the \fB-O\fP optimizations. .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 insertion, 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 @@ -403,6 +418,20 @@ If this is set to a non-empty string it is equivalent to specifying the \fB\-v\fP option. If set to an integer, it is equivalent to specifying \fB\-v\fP multiple times. +.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 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 +purpose is to allow repeatable hashing, such as for selftests for the +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. .SH AUTHOR The Python Software Foundation: http://www.python.org/psf .SH INTERNET RESOURCES diff --git a/Modules/datetimemodule.c b/Modules/datetimemodule.c --- a/Modules/datetimemodule.c +++ b/Modules/datetimemodule.c @@ -2566,10 +2566,12 @@ register long x; p = (unsigned char *) data; - x = *p << 7; + 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; diff --git a/Modules/main.c b/Modules/main.c --- a/Modules/main.c +++ b/Modules/main.c @@ -47,7 +47,7 @@ static int orig_argc; /* command line options */ -#define BASE_OPTS L"bBc:dEhiJm:OsStuvVW:xX?" +#define BASE_OPTS L"bBc:dEhiJm:ORsStuvVW:xX?" #define PROGRAM_OPTS BASE_OPTS @@ -72,6 +72,9 @@ -m mod : run library module as a script (terminates option list)\n\ -O : optimize generated bytecode slightly; also PYTHONOPTIMIZE=x\n\ -OO : remove doc-strings in addition to the -O optimizations\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\ "; @@ -99,6 +102,12 @@ PYTHONCASEOK : ignore case in 'import' statements (Windows).\n\ PYTHONIOENCODING: Encoding[:errors] used for stdin/stdout/stderr.\n\ "; +static char *usage_6 = "\ +PYTHONHASHSEED: if this variable is set to ``random``, the effect is the same \n\ + as specifying the :option:`-R` option: a random value is used to seed the\n\ + hashes of 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\ +"; #ifndef MS_WINDOWS static FILE* @@ -136,6 +145,7 @@ fputs(usage_3, f); fprintf(f, usage_4, DELIM); fprintf(f, usage_5, DELIM, PYTHONHOMEHELP); + fputs(usage_6, f); } #if defined(__VMS) if (exitcode == 0) { @@ -373,6 +383,10 @@ PySys_AddWarnOption(_PyOS_optarg); break; + case 'R': + Py_HashRandomizationFlag++; + break; + /* This space reserved for other options */ default: diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c --- a/Modules/posixmodule.c +++ b/Modules/posixmodule.c @@ -4022,7 +4022,7 @@ #endif gid_t grouplist[MAX_GROUPS]; - /* On MacOSX getgroups(2) can return more than MAX_GROUPS results + /* On MacOSX getgroups(2) can return more than MAX_GROUPS results * This is a helper variable to store the intermediate result when * that happens. * @@ -6942,82 +6942,6 @@ } #endif -#ifdef MS_WINDOWS - -PyDoc_STRVAR(win32_urandom__doc__, -"urandom(n) -> str\n\n\ -Return n random bytes suitable for cryptographic use."); - -typedef BOOL (WINAPI *CRYPTACQUIRECONTEXTA)(HCRYPTPROV *phProv,\ - LPCSTR pszContainer, LPCSTR pszProvider, DWORD dwProvType,\ - DWORD dwFlags ); -typedef BOOL (WINAPI *CRYPTGENRANDOM)(HCRYPTPROV hProv, DWORD dwLen,\ - BYTE *pbBuffer ); - -static CRYPTGENRANDOM pCryptGenRandom = NULL; -/* This handle is never explicitly released. Instead, the operating - system will release it when the process terminates. */ -static HCRYPTPROV hCryptProv = 0; - -static PyObject* -win32_urandom(PyObject *self, PyObject *args) -{ - int howMany; - PyObject* result; - - /* Read arguments */ - if (! PyArg_ParseTuple(args, "i:urandom", &howMany)) - return NULL; - if (howMany < 0) - return PyErr_Format(PyExc_ValueError, - "negative argument not allowed"); - - if (hCryptProv == 0) { - HINSTANCE hAdvAPI32 = NULL; - CRYPTACQUIRECONTEXTA pCryptAcquireContext = NULL; - - /* Obtain handle to the DLL containing CryptoAPI - This should not fail */ - hAdvAPI32 = GetModuleHandle("advapi32.dll"); - if(hAdvAPI32 == NULL) - return win32_error("GetModuleHandle", NULL); - - /* Obtain pointers to the CryptoAPI functions - This will fail on some early versions of Win95 */ - pCryptAcquireContext = (CRYPTACQUIRECONTEXTA)GetProcAddress( - hAdvAPI32, - "CryptAcquireContextA"); - if (pCryptAcquireContext == NULL) - return PyErr_Format(PyExc_NotImplementedError, - "CryptAcquireContextA not found"); - - pCryptGenRandom = (CRYPTGENRANDOM)GetProcAddress( - hAdvAPI32, "CryptGenRandom"); - if (pCryptGenRandom == NULL) - return PyErr_Format(PyExc_NotImplementedError, - "CryptGenRandom not found"); - - /* Acquire context */ - if (! pCryptAcquireContext(&hCryptProv, NULL, NULL, - PROV_RSA_FULL, CRYPT_VERIFYCONTEXT)) - return win32_error("CryptAcquireContext", NULL); - } - - /* Allocate bytes */ - result = PyBytes_FromStringAndSize(NULL, howMany); - if (result != NULL) { - /* Get random data */ - memset(PyBytes_AS_STRING(result), 0, howMany); /* zero seed */ - if (! pCryptGenRandom(hCryptProv, howMany, (unsigned char*) - PyBytes_AS_STRING(result))) { - Py_DECREF(result); - return win32_error("CryptGenRandom", NULL); - } - } - return result; -} -#endif - PyDoc_STRVAR(device_encoding__doc__, "device_encoding(fd) -> str\n\n\ Return a string describing the encoding of the device\n\ @@ -7055,41 +6979,35 @@ return Py_None; } -#ifdef __VMS -/* Use openssl random routine */ -#include -PyDoc_STRVAR(vms_urandom__doc__, +PyDoc_STRVAR(posix_urandom__doc__, "urandom(n) -> str\n\n\ Return n random bytes suitable for cryptographic use."); -static PyObject* -vms_urandom(PyObject *self, PyObject *args) -{ - int howMany; - PyObject* result; - - /* Read arguments */ - if (! PyArg_ParseTuple(args, "i:urandom", &howMany)) - return NULL; - if (howMany < 0) +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"); - - /* Allocate bytes */ - result = PyBytes_FromStringAndSize(NULL, howMany); - if (result != NULL) { - /* Get random data */ - if (RAND_pseudo_bytes((unsigned char*) - PyBytes_AS_STRING(result), - howMany) < 0) { - Py_DECREF(result); - return PyErr_Format(PyExc_ValueError, - "RAND_pseudo_bytes"); - } + 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; } -#endif static PyMethodDef posix_methods[] = { {"access", posix_access, METH_VARARGS, posix_access__doc__}, @@ -7374,12 +7292,7 @@ #ifdef HAVE_GETLOADAVG {"getloadavg", posix_getloadavg, METH_NOARGS, posix_getloadavg__doc__}, #endif - #ifdef MS_WINDOWS - {"urandom", win32_urandom, METH_VARARGS, win32_urandom__doc__}, - #endif - #ifdef __VMS - {"urandom", vms_urandom, METH_VARARGS, vms_urandom__doc__}, - #endif + {"urandom", posix_urandom, METH_VARARGS, posix_urandom__doc__}, {NULL, NULL} /* Sentinel */ }; diff --git a/Objects/bytesobject.c b/Objects/bytesobject.c --- a/Objects/bytesobject.c +++ b/Objects/bytesobject.c @@ -899,11 +899,21 @@ 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 = *p << 7; + x = _Py_HashSecret.prefix; + x ^= *p << 7; while (--len >= 0) x = (1000003*x) ^ *p++; x ^= Py_SIZE(a); + x ^= _Py_HashSecret.suffix; if (x == -1) x = -2; a->ob_shash = x; diff --git a/Objects/object.c b/Objects/object.c --- a/Objects/object.c +++ b/Objects/object.c @@ -712,6 +712,8 @@ return -1; } +_Py_HashSecret_t _Py_HashSecret; + long PyObject_Hash(PyObject *v) { diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -7344,11 +7344,21 @@ if (self->hash != -1) return self->hash; len = Py_SIZE(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; + return 0; + } p = self->str; - x = *p << 7; + x = _Py_HashSecret.prefix; + x ^= *p << 7; while (--len >= 0) x = (1000003*x) ^ *p++; x ^= Py_SIZE(self); + x ^= _Py_HashSecret.suffix; if (x == -1) x = -2; self->hash = x; diff --git a/PCbuild/pythoncore.vcproj b/PCbuild/pythoncore.vcproj --- a/PCbuild/pythoncore.vcproj +++ b/PCbuild/pythoncore.vcproj @@ -1778,6 +1778,10 @@ RelativePath="..\Python\pythonrun.c" > + + diff --git a/Python/pythonrun.c b/Python/pythonrun.c --- a/Python/pythonrun.c +++ b/Python/pythonrun.c @@ -73,6 +73,7 @@ extern void _PyUnicode_Fini(void); extern int _PyLong_Init(void); extern void PyLong_Fini(void); +extern void _PyRandom_Init(void); #ifdef WITH_THREAD extern void _PyGILState_Init(PyInterpreterState *, PyThreadState *); @@ -91,6 +92,7 @@ int Py_IgnoreEnvironmentFlag; /* e.g. PYTHONPATH, PYTHONHOME */ int Py_NoUserSiteDirectory = 0; /* for -s and site.py */ int Py_UnbufferedStdioFlag = 0; /* Unbuffered binary std{in,out,err} */ +int Py_HashRandomizationFlag = 0; /* for -R and PYTHONHASHSEED */ /* PyModule_GetWarningsModule is no longer necessary as of 2.6 since _warnings is builtin. This API should not be used. */ @@ -195,6 +197,12 @@ Py_OptimizeFlag = add_flag(Py_OptimizeFlag, p); if ((p = Py_GETENV("PYTHONDONTWRITEBYTECODE")) && *p != '\0') Py_DontWriteBytecodeFlag = add_flag(Py_DontWriteBytecodeFlag, p); + /* The variable is only tested for existence here; _PyRandom_Init will + check its value further. */ + if ((p = Py_GETENV("PYTHONHASHSEED")) && *p != '\0') + Py_HashRandomizationFlag = add_flag(Py_HashRandomizationFlag, p); + + _PyRandom_Init(); interp = PyInterpreterState_New(); if (interp == NULL) diff --git a/Python/random.c b/Python/random.c new file mode 100644 --- /dev/null +++ b/Python/random.c @@ -0,0 +1,302 @@ +#include "Python.h" +#ifdef MS_WINDOWS +#include +#else +#include +#endif + +static int random_initialized = 0; + +#ifdef MS_WINDOWS +typedef BOOL (WINAPI *CRYPTACQUIRECONTEXTA)(HCRYPTPROV *phProv,\ + LPCSTR pszContainer, LPCSTR pszProvider, DWORD dwProvType,\ + DWORD dwFlags ); +typedef BOOL (WINAPI *CRYPTGENRANDOM)(HCRYPTPROV hProv, DWORD dwLen,\ + BYTE *pbBuffer ); + +static CRYPTGENRANDOM pCryptGenRandom = NULL; +/* This handle is never explicitly released. Instead, the operating + system will release it when the process terminates. */ +static HCRYPTPROV hCryptProv = 0; + +static int +win32_urandom_init(int raise) +{ + HINSTANCE hAdvAPI32 = NULL; + CRYPTACQUIRECONTEXTA pCryptAcquireContext = NULL; + + /* Obtain handle to the DLL containing CryptoAPI. This should not fail. */ + hAdvAPI32 = GetModuleHandle("advapi32.dll"); + if(hAdvAPI32 == NULL) + goto error; + + /* Obtain pointers to the CryptoAPI functions. This will fail on some early + versions of Win95. */ + pCryptAcquireContext = (CRYPTACQUIRECONTEXTA)GetProcAddress( + hAdvAPI32, "CryptAcquireContextA"); + if (pCryptAcquireContext == NULL) + goto error; + + pCryptGenRandom = (CRYPTGENRANDOM)GetProcAddress(hAdvAPI32, + "CryptGenRandom"); + if (pCryptGenRandom == NULL) + goto error; + + /* Acquire context */ + if (! pCryptAcquireContext(&hCryptProv, NULL, NULL, + PROV_RSA_FULL, CRYPT_VERIFYCONTEXT)) + goto error; + + return 0; + +error: + if (raise) + PyErr_SetFromWindowsErr(0); + else + Py_FatalError("Failed to initialize Windows random API (CryptoGen)"); + return -1; +} + +/* Fill buffer with size pseudo-random bytes generated by the Windows CryptoGen + API. Return 0 on success, or -1 on error. */ +static int +win32_urandom(unsigned char *buffer, Py_ssize_t size, int raise) +{ + Py_ssize_t chunk; + + if (hCryptProv == 0) + { + if (win32_urandom_init(raise) == -1) + return -1; + } + + while (size > 0) + { + chunk = size > INT_MAX ? INT_MAX : size; + if (!pCryptGenRandom(hCryptProv, chunk, buffer)) + { + /* CryptGenRandom() failed */ + if (raise) + PyErr_SetFromWindowsErr(0); + else + Py_FatalError("Failed to initialized the randomized hash " + "secret using CryptoGen)"); + return -1; + } + buffer += chunk; + size -= chunk; + } + return 0; +} +#endif /* MS_WINDOWS */ + + +#ifdef __VMS +/* Use openssl random routine */ +#include +static int +vms_urandom(unsigned char *buffer, Py_ssize_t size, int raise) +{ + if (RAND_pseudo_bytes(buffer, size) < 0) { + if (raise) { + PyErr_Format(PyExc_ValueError, + "RAND_pseudo_bytes"); + } else { + Py_FatalError("Failed to initialize the randomized hash " + "secret using RAND_pseudo_bytes"); + } + return -1; + } + return 0; +} +#endif /* __VMS */ + + +#if !defined(MS_WINDOWS) && !defined(__VMS) + +/* Read size bytes from /dev/urandom into buffer. + Call Py_FatalError() on error. */ +static void +dev_urandom_noraise(char *buffer, Py_ssize_t size) +{ + int fd; + Py_ssize_t n; + + assert (0 < size); + + fd = open("/dev/urandom", O_RDONLY); + if (fd < 0) + Py_FatalError("Failed to open /dev/urandom"); + + while (0 < size) + { + do { + n = read(fd, buffer, (size_t)size); + } while (n < 0 && errno == EINTR); + if (n <= 0) + { + /* stop on error or if read(size) returned 0 */ + Py_FatalError("Failed to read bytes from /dev/urandom"); + break; + } + buffer += n; + size -= (Py_ssize_t)n; + } + close(fd); +} + +/* Read size bytes from /dev/urandom into buffer. + Return 0 on success, raise an exception and return -1 on error. */ +static int +dev_urandom_python(char *buffer, Py_ssize_t size) +{ + int fd; + Py_ssize_t n; + + if (size <= 0) + return 0; + + Py_BEGIN_ALLOW_THREADS + fd = open("/dev/urandom", O_RDONLY); + Py_END_ALLOW_THREADS + if (fd < 0) + { + PyErr_SetFromErrnoWithFilename(PyExc_OSError, "/dev/urandom"); + return -1; + } + + Py_BEGIN_ALLOW_THREADS + do { + do { + n = read(fd, buffer, (size_t)size); + } while (n < 0 && errno == EINTR); + if (n <= 0) + break; + buffer += n; + size -= (Py_ssize_t)n; + } while (0 < size); + Py_END_ALLOW_THREADS + + if (n <= 0) + { + /* stop on error or if read(size) returned 0 */ + if (n < 0) + PyErr_SetFromErrno(PyExc_OSError); + else + PyErr_Format(PyExc_RuntimeError, + "Failed to read %zi bytes from /dev/urandom", + size); + close(fd); + return -1; + } + close(fd); + return 0; +} +#endif /* !defined(MS_WINDOWS) && !defined(__VMS) */ + +/* Fill buffer with pseudo-random bytes generated by a linear congruent + generator (LCG): + + x(n+1) = (x(n) * 214013 + 2531011) % 2^32 + + Use bits 23..16 of x(n) to generate a byte. */ +static void +lcg_urandom(unsigned int x0, unsigned char *buffer, size_t size) +{ + size_t index; + unsigned int x; + + x = x0; + for (index=0; index < size; index++) { + x *= 214013; + x += 2531011; + /* modulo 2 ^ (8 * sizeof(int)) */ + buffer[index] = (x >> 16) & 0xff; + } +} + +/* Fill buffer with size pseudo-random bytes, not suitable for cryptographic + use, from the operating random number generator (RNG). + + Return 0 on success, raise an exception and return -1 on error. */ +int +_PyOS_URandom(void *buffer, Py_ssize_t size) +{ + if (size < 0) { + PyErr_Format(PyExc_ValueError, + "negative argument not allowed"); + return -1; + } + if (size == 0) + return 0; + +#ifdef MS_WINDOWS + return win32_urandom((unsigned char *)buffer, size, 1); +#else +# ifdef __VMS + return vms_urandom((unsigned char *)buffer, size, 1); +# else + return dev_urandom_python((char*)buffer, size); +# endif +#endif +} + +void +_PyRandom_Init(void) +{ + char *env; + void *secret = &_Py_HashSecret; + Py_ssize_t secret_size = sizeof(_Py_HashSecret); + + if (random_initialized) + return; + random_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. + */ + + env = Py_GETENV("PYTHONHASHSEED"); + if (env && *env != '\0' & strcmp(env, "random") != 0) { + char *endptr = env; + unsigned long seed; + seed = strtoul(env, &endptr, 10); + if (*endptr != '\0' + || seed > 4294967295UL + || (errno == ERANGE && seed == ULONG_MAX)) + { + Py_FatalError("PYTHONHASHSEED must be \"random\" or an integer " + "in range [0; 4294967295]"); + } + if (seed == 0) { + /* disable the randomized hash */ + memset(secret, 0, secret_size); + } + else { + lcg_urandom(seed, (unsigned char*)secret, secret_size); + } + } + else { +#ifdef MS_WINDOWS + (void)win32_urandom((unsigned char *)secret, secret_size, 0); +#else /* #ifdef MS_WINDOWS */ +# ifdef __VMS + vms_urandom((unsigned char *)secret, secret_size, 0); +# else + dev_urandom_noraise((char*)secret, secret_size); +# endif +#endif + } +} diff --git a/Python/sysmodule.c b/Python/sysmodule.c --- a/Python/sysmodule.c +++ b/Python/sysmodule.c @@ -1126,6 +1126,7 @@ /* {"unbuffered", "-u"}, */ /* {"skip_first", "-x"}, */ {"bytes_warning", "-b"}, + {"hash_randomization", "-R"}, {0} }; @@ -1134,9 +1135,9 @@ flags__doc__, /* doc */ flags_fields, /* fields */ #ifdef RISCOS + 13 +#else 12 -#else - 11 #endif }; @@ -1169,6 +1170,7 @@ /* SetFlag(saw_unbuffered_flag); */ /* SetFlag(skipfirstline); */ SetFlag(Py_BytesWarningFlag); + SetFlag(Py_HashRandomizationFlag); #undef SetFlag if (PyErr_Occurred()) { -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Feb 20 20:46:10 2012 From: python-checkins at python.org (barry.warsaw) Date: Mon, 20 Feb 2012 20:46:10 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=282=2E6=29=3A_Back_port_Pytho?= =?utf8?q?n_2=2E7_fix_for_test=5Finvalid=5Fredirect=28=29_in_test=5Furllib?= =?utf8?q?=2Epy=2E?= Message-ID: http://hg.python.org/cpython/rev/90ec0bc01f3b changeset: 75067:90ec0bc01f3b branch: 2.6 parent: 75014:24244a744d01 user: Barry Warsaw date: Mon Feb 20 14:43:22 2012 -0500 summary: Back port Python 2.7 fix for test_invalid_redirect() in test_urllib.py. files: Lib/test/test_urllib2.py | 1 + 1 files changed, 1 insertions(+), 0 deletions(-) diff --git a/Lib/test/test_urllib2.py b/Lib/test/test_urllib2.py --- a/Lib/test/test_urllib2.py +++ b/Lib/test/test_urllib2.py @@ -950,6 +950,7 @@ h = urllib2.HTTPRedirectHandler() o = h.parent = MockOpener() req = Request(from_url) + req.timeout = socket._GLOBAL_DEFAULT_TIMEOUT for scheme in invalid_schemes: invalid_url = scheme + '://' + schemeless_url -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Feb 20 20:46:11 2012 From: python-checkins at python.org (barry.warsaw) Date: Mon, 20 Feb 2012 20:46:11 +0100 Subject: [Python-checkins] =?utf8?b?Y3B5dGhvbiAobWVyZ2UgMi42IC0+IDIuNyk6?= =?utf8?q?_null_merge_from_2=2E6?= Message-ID: http://hg.python.org/cpython/rev/0761a3b855f0 changeset: 75068:0761a3b855f0 branch: 2.7 parent: 75053:7ff4731853e2 parent: 75067:90ec0bc01f3b user: Barry Warsaw date: Mon Feb 20 14:44:26 2012 -0500 summary: null merge from 2.6 files: -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Feb 20 20:46:12 2012 From: python-checkins at python.org (barry.warsaw) Date: Mon, 20 Feb 2012 20:46:12 +0100 Subject: [Python-checkins] =?utf8?b?Y3B5dGhvbiAobWVyZ2UgMi43IC0+IDIuNyk6?= =?utf8?q?_null_merge_from_2=2E6?= Message-ID: http://hg.python.org/cpython/rev/cfd60d0d448b changeset: 75069:cfd60d0d448b branch: 2.7 parent: 75061:37494e44265c parent: 75068:0761a3b855f0 user: Barry Warsaw date: Mon Feb 20 14:45:45 2012 -0500 summary: null merge from 2.6 files: -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Feb 20 21:06:45 2012 From: python-checkins at python.org (benjamin.peterson) Date: Mon, 20 Feb 2012 21:06:45 +0100 Subject: [Python-checkins] =?utf8?q?cpython=3A_put_docstrings_on_functions?= Message-ID: http://hg.python.org/cpython/rev/defd944af91b changeset: 75070:defd944af91b parent: 75065:d64f04e437b1 user: Benjamin Peterson date: Mon Feb 20 15:06:35 2012 -0500 summary: put docstrings on functions files: Lib/importlib/_bootstrap.py | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Lib/importlib/_bootstrap.py b/Lib/importlib/_bootstrap.py --- a/Lib/importlib/_bootstrap.py +++ b/Lib/importlib/_bootstrap.py @@ -24,12 +24,12 @@ def _make_relax_case(): if any(map(sys.platform.startswith, CASE_INSENSITIVE_PLATFORMS)): - """True if filenames must be checked case-insensitively.""" def _relax_case(): + """True if filenames must be checked case-insensitively.""" return b'PYTHONCASEOK' in _os.environ else: - """True if filenames must be checked case-insensitively.""" def _relax_case(): + """True if filenames must be checked case-insensitively.""" return False return _relax_case -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Feb 20 21:21:02 2012 From: python-checkins at python.org (benjamin.peterson) Date: Mon, 20 Feb 2012 21:21:02 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=283=2E1=29=3A_don=27t_rely_on?= =?utf8?q?_the_order_of_module_clearing?= Message-ID: http://hg.python.org/cpython/rev/11b09df370e7 changeset: 75071:11b09df370e7 branch: 3.1 parent: 75066:f4b7ecf8a5f8 user: Benjamin Peterson date: Mon Feb 20 15:20:37 2012 -0500 summary: don't rely on the order of module clearing files: Lib/test/test_module.py | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Lib/test/test_module.py b/Lib/test/test_module.py --- a/Lib/test/test_module.py +++ b/Lib/test/test_module.py @@ -70,7 +70,7 @@ m = ModuleType("foo") m.destroyed = destroyed s = """class A: - def __del__(self): + def __del__(self, destroyed=destroyed): destroyed.append(1) a = A()""" exec(s, m.__dict__) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Feb 20 21:21:35 2012 From: python-checkins at python.org (benjamin.peterson) Date: Mon, 20 Feb 2012 21:21:35 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=282=2E7=29=3A_don=27t_rely_on?= =?utf8?q?_the_order_of_module_clearing?= Message-ID: http://hg.python.org/cpython/rev/2e8b28dbc395 changeset: 75072:2e8b28dbc395 branch: 2.7 parent: 75069:cfd60d0d448b user: Benjamin Peterson date: Mon Feb 20 15:20:37 2012 -0500 summary: don't rely on the order of module clearing files: Lib/test/test_module.py | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Lib/test/test_module.py b/Lib/test/test_module.py --- a/Lib/test/test_module.py +++ b/Lib/test/test_module.py @@ -70,7 +70,7 @@ m = ModuleType("foo") m.destroyed = destroyed s = """class A: - def __del__(self): + def __del__(self, destroyed=destroyed): destroyed.append(1) a = A()""" exec(s, m.__dict__) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Feb 20 21:41:42 2012 From: python-checkins at python.org (georg.brandl) Date: Mon, 20 Feb 2012 21:41:42 +0100 Subject: [Python-checkins] =?utf8?b?Y3B5dGhvbiAobWVyZ2UgMy4xIC0+IDMuMik6?= =?utf8?q?_Merge_from_3=2E1=3A_Issue_=2313703=3A_add_a_way_to_randomize_th?= =?utf8?q?e_hash_values_of_basic?= Message-ID: http://hg.python.org/cpython/rev/4a31f6b11e7a changeset: 75073:4a31f6b11e7a branch: 3.2 parent: 75062:a72e0e1d0292 parent: 75066:f4b7ecf8a5f8 user: Georg Brandl date: Mon Feb 20 21:31:46 2012 +0100 summary: Merge from 3.1: Issue #13703: add a way to randomize the hash values of basic types (str, bytes, datetime) in order to make algorithmic complexity attacks on (e.g.) web apps much more complicated. The environment variable PYTHONHASHSEED and the new command line flag -R control this behavior. files: Doc/library/sys.rst | 4 + Doc/reference/datamodel.rst | 2 + Doc/using/cmdline.rst | 47 +- Include/object.h | 6 + Include/pydebug.h | 1 + Include/pythonrun.h | 2 + Lib/json/__init__.py | 4 +- Lib/os.py | 17 - Lib/test/mapping_tests.py | 2 +- Lib/test/regrtest.py | 5 + Lib/test/script_helper.py | 7 +- Lib/test/test_cmd_line.py | 16 + Lib/test/test_descr.py | 12 +- Lib/test/test_gdb.py | 22 +- Lib/test/test_hash.py | 92 ++- Lib/test/test_os.py | 36 +- Lib/test/test_set.py | 23 +- Lib/test/test_sys.py | 2 +- Lib/test/test_urllib.py | 4 +- Lib/test/test_urlparse.py | 3 +- Lib/tkinter/test/test_ttk/test_functions.py | 2 +- Makefile.pre.in | 1 + Misc/NEWS | 5 + Misc/python.man | 29 + Modules/_datetimemodule.c | 4 +- Modules/main.c | 20 +- Modules/posixmodule.c | 132 +--- Objects/bytesobject.c | 12 +- Objects/object.c | 2 + Objects/unicodeobject.c | 12 +- PCbuild/pythoncore.vcproj | 4 + Python/pythonrun.c | 8 + Python/random.c | 302 ++++++++++ Python/sysmodule.c | 6 +- 34 files changed, 680 insertions(+), 166 deletions(-) diff --git a/Doc/library/sys.rst b/Doc/library/sys.rst --- a/Doc/library/sys.rst +++ b/Doc/library/sys.rst @@ -253,11 +253,15 @@ :const:`verbose` :option:`-v` :const:`bytes_warning` :option:`-b` :const:`quiet` :option:`-q` + :const:`hash_randomization` :option:`-R` ============================= ============================= .. versionchanged:: 3.2 Added ``quiet`` attribute for the new :option:`-q` flag. + .. versionadded:: 3.2.3 + The ``hash_randomization`` attribute. + .. data:: float_info diff --git a/Doc/reference/datamodel.rst b/Doc/reference/datamodel.rst --- a/Doc/reference/datamodel.rst +++ b/Doc/reference/datamodel.rst @@ -1272,6 +1272,8 @@ inheritance of :meth:`__hash__` will be blocked, just as if :attr:`__hash__` had been explicitly set to :const:`None`. + See also the :option:`-R` command-line option. + .. method:: object.__bool__(self) diff --git a/Doc/using/cmdline.rst b/Doc/using/cmdline.rst --- a/Doc/using/cmdline.rst +++ b/Doc/using/cmdline.rst @@ -24,7 +24,7 @@ When invoking Python, you may specify any of these options:: - python [-bBdEhiOsSuvVWx?] [-c command | -m module-name | script | - ] [args] + python [-bBdEhiORqsSuvVWx?] [-c command | -m module-name | script | - ] [args] The most common use case is, of course, a simple invocation of a script:: @@ -227,6 +227,29 @@ .. versionadded:: 3.2 +.. 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. + + 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 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. + + See also :envvar:`PYTHONHASHSEED`. + + .. versionadded:: 3.2.3 + + .. cmdoption:: -s Don't add the :data:`user site-packages directory ` to @@ -350,6 +373,7 @@ .. _Jython: http://jython.org + .. _using-on-envvars: Environment variables @@ -458,6 +482,27 @@ option. +.. 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 :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 + randomization. + + Its purpose is to allow repeatable hashing, such as for selftests for the + 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. + + .. versionadded:: 3.2.3 + + .. envvar:: PYTHONIOENCODING If this is set before running the interpreter, it overrides the encoding used diff --git a/Include/object.h b/Include/object.h --- a/Include/object.h +++ b/Include/object.h @@ -517,6 +517,12 @@ PyAPI_FUNC(Py_hash_t) _Py_HashPointer(void*); #endif +typedef struct { + Py_hash_t prefix; + Py_hash_t suffix; +} _Py_HashSecret_t; +PyAPI_DATA(_Py_HashSecret_t) _Py_HashSecret; + /* Helper for passing objects to printf and the like */ #define PyObject_REPR(obj) _PyUnicode_AsString(PyObject_Repr(obj)) diff --git a/Include/pydebug.h b/Include/pydebug.h --- a/Include/pydebug.h +++ b/Include/pydebug.h @@ -20,6 +20,7 @@ PyAPI_DATA(int) Py_DontWriteBytecodeFlag; PyAPI_DATA(int) Py_NoUserSiteDirectory; PyAPI_DATA(int) Py_UnbufferedStdioFlag; +PyAPI_DATA(int) Py_HashRandomizationFlag; /* this is a wrapper around getenv() that pays attention to Py_IgnoreEnvironmentFlag. It should be used for getting variables like diff --git a/Include/pythonrun.h b/Include/pythonrun.h --- a/Include/pythonrun.h +++ b/Include/pythonrun.h @@ -248,6 +248,8 @@ PyAPI_FUNC(PyOS_sighandler_t) PyOS_getsig(int); PyAPI_FUNC(PyOS_sighandler_t) PyOS_setsig(int, PyOS_sighandler_t); +/* Random */ +PyAPI_FUNC(int) _PyOS_URandom (void *buffer, Py_ssize_t size); #ifdef __cplusplus } diff --git a/Lib/json/__init__.py b/Lib/json/__init__.py --- a/Lib/json/__init__.py +++ b/Lib/json/__init__.py @@ -31,7 +31,9 @@ Compact encoding:: >>> import json - >>> json.dumps([1,2,3,{'4': 5, '6': 7}], separators=(',', ':')) + >>> from collections import OrderedDict + >>> mydict = OrderedDict([('4', 5), ('6', 7)]) + >>> json.dumps([1,2,3,mydict], separators=(',', ':')) '[1,2,3,{"4":5,"6":7}]' Pretty printing:: diff --git a/Lib/os.py b/Lib/os.py --- a/Lib/os.py +++ b/Lib/os.py @@ -761,23 +761,6 @@ except NameError: # statvfs_result may not exist pass -if not _exists("urandom"): - def urandom(n): - """urandom(n) -> str - - Return a string of n random bytes suitable for cryptographic use. - - """ - try: - _urandomfd = open("/dev/urandom", O_RDONLY) - except (OSError, IOError): - raise NotImplementedError("/dev/urandom (or equivalent) not found") - bs = b"" - while len(bs) < n: - bs += read(_urandomfd, n - len(bs)) - close(_urandomfd) - return bs - # Supply os.popen() def popen(cmd, mode="r", buffering=-1): if not isinstance(cmd, str): diff --git a/Lib/test/mapping_tests.py b/Lib/test/mapping_tests.py --- a/Lib/test/mapping_tests.py +++ b/Lib/test/mapping_tests.py @@ -14,7 +14,7 @@ def _reference(self): """Return a dictionary of values which are invariant by storage in the object under test.""" - return {1:2, "key1":"value1", "key2":(1,2,3)} + return {"1": "2", "key1":"value1", "key2":(1,2,3)} def _empty_mapping(self): """Return an empty mapping object""" return self.type2test() diff --git a/Lib/test/regrtest.py b/Lib/test/regrtest.py --- a/Lib/test/regrtest.py +++ b/Lib/test/regrtest.py @@ -496,6 +496,11 @@ except ValueError: print("Couldn't find starting test (%s), using all tests" % start) if randomize: + hashseed = os.getenv('PYTHONHASHSEED') + if not hashseed: + os.environ['PYTHONHASHSEED'] = str(random_seed) + os.execv(sys.executable, [sys.executable] + sys.argv) + return random.seed(random_seed) print("Using random seed", random_seed) random.shuffle(selected) diff --git a/Lib/test/script_helper.py b/Lib/test/script_helper.py --- a/Lib/test/script_helper.py +++ b/Lib/test/script_helper.py @@ -3,7 +3,6 @@ import sys import os -import re import os.path import tempfile import subprocess @@ -20,11 +19,15 @@ cmd_line = [sys.executable] if not env_vars: cmd_line.append('-E') - cmd_line.extend(args) # Need to preserve the original environment, for in-place testing of # shared library builds. env = os.environ.copy() + # But a special flag that can be set to override -- in this case, the + # caller is responsible to pass the full environment. + if env_vars.pop('__cleanenv', None): + env = {} env.update(env_vars) + cmd_line.extend(args) p = subprocess.Popen(cmd_line, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, env=env) diff --git a/Lib/test/test_cmd_line.py b/Lib/test/test_cmd_line.py --- a/Lib/test/test_cmd_line.py +++ b/Lib/test/test_cmd_line.py @@ -330,6 +330,22 @@ def test_no_std_streams(self): self._test_no_stdio(['stdin', 'stdout', 'stderr']) + def test_hash_randomization(self): + # Verify that -R enables hash randomization: + self.verify_valid_flag('-R') + hashes = [] + for i in range(2): + code = 'print(hash("spam"))' + rc, out, err = assert_python_ok('-R', '-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) + self.assertEqual(rc, 0) + self.assertIn(b'random is 1', out) def test_main(): test.support.run_unittest(CmdLineTest) diff --git a/Lib/test/test_descr.py b/Lib/test/test_descr.py --- a/Lib/test/test_descr.py +++ b/Lib/test/test_descr.py @@ -4474,8 +4474,18 @@ 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()} - self.assertEqual(repr(self.C.__dict__), 'dict_proxy({!r})'.format(dict_)) + repr_ = repr(self.C.__dict__) + self.assert_(repr_.startswith('dict_proxy(')) + self.assert_(repr_.endswith(')')) + self.assertEqual(sorted_dict_repr(repr_[len('dict_proxy('):-len(')')]), + sorted_dict_repr('{!r}'.format(dict_))) class PTypesLongInitTest(unittest.TestCase): diff --git a/Lib/test/test_gdb.py b/Lib/test/test_gdb.py --- a/Lib/test/test_gdb.py +++ b/Lib/test/test_gdb.py @@ -52,13 +52,18 @@ """Test that the debugger can debug Python.""" - def run_gdb(self, *args): + def run_gdb(self, *args, **env_vars): """Runs gdb with the command line given by *args. Returns its stdout, stderr """ + if env_vars: + env = os.environ.copy() + env.update(env_vars) + else: + env = None out, err = subprocess.Popen( - args, stdout=subprocess.PIPE, stderr=subprocess.PIPE, + args, stdout=subprocess.PIPE, stderr=subprocess.PIPE, env=env, ).communicate() return out.decode('utf-8', 'replace'), err.decode('utf-8', 'replace') @@ -118,7 +123,7 @@ # print ' '.join(args) # Use "args" to invoke gdb, capturing stdout, stderr: - out, err = self.run_gdb(*args) + out, err = self.run_gdb(*args, PYTHONHASHSEED='0') # Ignore some noise on stderr due to the pending breakpoint: err = err.replace('Function "%s" not defined.\n' % breakpoint, '') @@ -207,7 +212,8 @@ 'Verify the pretty-printing of dictionaries' self.assertGdbRepr({}) self.assertGdbRepr({'foo': 'bar'}) - self.assertGdbRepr({'foo': 'bar', 'douglas':42}) + self.assertGdbRepr({'foo': 'bar', 'douglas': 42}, + "{'foo': 'bar', 'douglas': 42}") def test_lists(self): 'Verify the pretty-printing of lists' @@ -269,8 +275,8 @@ def test_sets(self): 'Verify the pretty-printing of sets' self.assertGdbRepr(set()) - self.assertGdbRepr(set(['a', 'b'])) - self.assertGdbRepr(set([4, 5, 6])) + self.assertGdbRepr(set(['a', 'b']), "{'a', 'b'}") + self.assertGdbRepr(set([4, 5, 6]), "{4, 5, 6}") # Ensure that we handle sets containing the "dummy" key value, # which happens on deletion: @@ -282,8 +288,8 @@ def test_frozensets(self): 'Verify the pretty-printing of frozensets' self.assertGdbRepr(frozenset()) - self.assertGdbRepr(frozenset(['a', 'b'])) - self.assertGdbRepr(frozenset([4, 5, 6])) + self.assertGdbRepr(frozenset(['a', 'b']), "frozenset({'a', 'b'})") + self.assertGdbRepr(frozenset([4, 5, 6]), "frozenset({4, 5, 6})") def test_exceptions(self): # Test a RuntimeError diff --git a/Lib/test/test_hash.py b/Lib/test/test_hash.py --- a/Lib/test/test_hash.py +++ b/Lib/test/test_hash.py @@ -3,10 +3,16 @@ # # Also test that hash implementations are inherited as expected +import datetime +import os +import sys import unittest from test import support +from test.script_helper import assert_python_ok from collections import Hashable +IS_64BIT = sys.maxsize > 2**32 + class HashEqualityTestCase(unittest.TestCase): @@ -118,10 +124,92 @@ for obj in self.hashes_to_check: self.assertEqual(hash(obj), _default_hash(obj)) +class HashRandomizationTests(unittest.TestCase): + + # Each subclass should define a field "repr_", containing the repr() of + # an object to be tested + + def get_hash_command(self, repr_): + return 'print(hash(%s))' % repr_ + + def get_hash(self, repr_, seed=None): + env = os.environ.copy() + env['__cleanenv'] = True # signal to assert_python not to do a copy + # of os.environ on its own + if seed is not None: + env['PYTHONHASHSEED'] = str(seed) + else: + env.pop('PYTHONHASHSEED', None) + out = assert_python_ok( + '-c', self.get_hash_command(repr_), + **env) + stdout = out[1].strip() + return int(stdout) + + def test_randomized_hash(self): + # two runs should return different hashes + run1 = self.get_hash(self.repr_, seed='random') + run2 = self.get_hash(self.repr_, seed='random') + self.assertNotEqual(run1, run2) + +class StringlikeHashRandomizationTests(HashRandomizationTests): + def test_null_hash(self): + # PYTHONHASHSEED=0 disables the randomized hash + if IS_64BIT: + known_hash_of_obj = 1453079729188098211 + else: + known_hash_of_obj = -1600925533 + + # Randomization is disabled by default: + self.assertEqual(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) + + def test_fixed_hash(self): + # test a fixed seed for the randomized hash + # Note that all types share the same values: + if IS_64BIT: + h = -4410911502303878509 + else: + h = -206076799 + self.assertEqual(self.get_hash(self.repr_, seed=42), h) + +class StrHashRandomizationTests(StringlikeHashRandomizationTests): + repr_ = repr('abc') + + def test_empty_string(self): + self.assertEqual(hash(""), 0) + +class BytesHashRandomizationTests(StringlikeHashRandomizationTests): + repr_ = repr(b'abc') + + def test_empty_string(self): + self.assertEqual(hash(b""), 0) + +class DatetimeTests(HashRandomizationTests): + def get_hash_command(self, repr_): + return 'import datetime; print(hash(%s))' % repr_ + +class DatetimeDateTests(DatetimeTests): + repr_ = repr(datetime.date(1066, 10, 14)) + +class DatetimeDatetimeTests(DatetimeTests): + repr_ = repr(datetime.datetime(1, 2, 3, 4, 5, 6, 7)) + +class DatetimeTimeTests(DatetimeTests): + repr_ = repr(datetime.time(0)) + + def test_main(): support.run_unittest(HashEqualityTestCase, - HashInheritanceTestCase, - HashBuiltinsTestCase) + HashInheritanceTestCase, + HashBuiltinsTestCase, + StrHashRandomizationTests, + BytesHashRandomizationTests, + DatetimeDateTests, + DatetimeDatetimeTests, + DatetimeTimeTests) if __name__ == "__main__": diff --git a/Lib/test/test_os.py b/Lib/test/test_os.py --- a/Lib/test/test_os.py +++ b/Lib/test/test_os.py @@ -15,6 +15,7 @@ import contextlib import mmap import uuid +from test.script_helper import assert_python_ok # Detect whether we're on a Linux system that uses the (now outdated # and unmaintained) linuxthreads threading library. There's an issue @@ -611,14 +612,33 @@ self.assertEqual(f.read(), b'') class URandomTests(unittest.TestCase): - def test_urandom(self): - try: - self.assertEqual(len(os.urandom(1)), 1) - self.assertEqual(len(os.urandom(10)), 10) - self.assertEqual(len(os.urandom(100)), 100) - self.assertEqual(len(os.urandom(1000)), 1000) - except NotImplementedError: - pass + def test_urandom_length(self): + self.assertEqual(len(os.urandom(0)), 0) + self.assertEqual(len(os.urandom(1)), 1) + self.assertEqual(len(os.urandom(10)), 10) + self.assertEqual(len(os.urandom(100)), 100) + self.assertEqual(len(os.urandom(1000)), 1000) + + def test_urandom_value(self): + data1 = os.urandom(16) + data2 = os.urandom(16) + self.assertNotEqual(data1, data2) + + def get_urandom_subprocess(self, count): + code = '\n'.join(( + 'import os, sys', + 'data = os.urandom(%s)' % count, + 'sys.stdout.buffer.write(data)', + 'sys.stdout.buffer.flush()')) + out = assert_python_ok('-c', code) + stdout = out[1] + self.assertEqual(len(stdout), 16) + return stdout + + def test_urandom_subprocess(self): + data1 = self.get_urandom_subprocess(16) + data2 = self.get_urandom_subprocess(16) + self.assertNotEqual(data1, data2) @contextlib.contextmanager def _execvpe_mockup(defpath=None): diff --git a/Lib/test/test_set.py b/Lib/test/test_set.py --- a/Lib/test/test_set.py +++ b/Lib/test/test_set.py @@ -733,6 +733,17 @@ if self.repr is not None: self.assertEqual(repr(self.set), self.repr) + def check_repr_against_values(self): + text = repr(self.set) + self.assertTrue(text.startswith('{')) + self.assertTrue(text.endswith('}')) + + result = text[1:-1].split(', ') + result.sort() + sorted_repr_values = [repr(value) for value in self.values] + sorted_repr_values.sort() + self.assertEqual(result, sorted_repr_values) + def test_print(self): try: fo = open(support.TESTFN, "w") @@ -891,7 +902,9 @@ self.set = set(self.values) self.dup = set(self.values) self.length = 3 - self.repr = "{'a', 'c', 'b'}" + + def test_repr(self): + self.check_repr_against_values() #------------------------------------------------------------------------------ @@ -902,7 +915,9 @@ self.set = set(self.values) self.dup = set(self.values) self.length = 3 - self.repr = "{b'a', b'c', b'b'}" + + def test_repr(self): + self.check_repr_against_values() #------------------------------------------------------------------------------ @@ -916,11 +931,13 @@ self.set = set(self.values) self.dup = set(self.values) self.length = 4 - self.repr = "{'a', b'a', 'b', b'b'}" def tearDown(self): self._warning_filters.__exit__(None, None, None) + def test_repr(self): + self.check_repr_against_values() + #============================================================================== def baditer(): diff --git a/Lib/test/test_sys.py b/Lib/test/test_sys.py --- a/Lib/test/test_sys.py +++ b/Lib/test/test_sys.py @@ -503,7 +503,7 @@ attrs = ("debug", "division_warning", "inspect", "interactive", "optimize", "dont_write_bytecode", "no_user_site", "no_site", "ignore_environment", "verbose", - "bytes_warning", "quiet") + "bytes_warning", "quiet", "hash_randomization") for attr in attrs: self.assertTrue(hasattr(sys.flags, attr), attr) self.assertEqual(type(getattr(sys.flags, attr)), int, attr) diff --git a/Lib/test/test_urllib.py b/Lib/test/test_urllib.py --- a/Lib/test/test_urllib.py +++ b/Lib/test/test_urllib.py @@ -13,6 +13,7 @@ import tempfile from base64 import b64encode +import collections def hexescape(char): """Escape char as RFC 2396 specifies""" @@ -953,8 +954,9 @@ self.assertEqual("a=1&a=2", urllib.parse.urlencode({"a": [1, 2]}, True)) self.assertEqual("a=None&a=a", urllib.parse.urlencode({"a": [None, "a"]}, True)) + data = collections.OrderedDict([("a", 1), ("b", 1)]) self.assertEqual("a=a&a=b", - urllib.parse.urlencode({"a": {"a": 1, "b": 1}}, True)) + urllib.parse.urlencode({"a": data}, True)) def test_urlencode_encoding(self): # ASCII encoding. Expect %3F with errors="replace' diff --git a/Lib/test/test_urlparse.py b/Lib/test/test_urlparse.py old mode 100644 new mode 100755 --- a/Lib/test/test_urlparse.py +++ b/Lib/test/test_urlparse.py @@ -769,7 +769,8 @@ # Other tests incidentally urlencode things; test non-covered cases: # Sequence and object values. result = urllib.parse.urlencode({'a': [1, 2], 'b': (3, 4, 5)}, True) - self.assertEqual(result, 'a=1&a=2&b=3&b=4&b=5') + # we cannot rely on ordering here + assert set(result.split('&')) == {'a=1', 'a=2', 'b=3', 'b=4', 'b=5'} class Trivial: def __str__(self): diff --git a/Lib/tkinter/test/test_ttk/test_functions.py b/Lib/tkinter/test/test_ttk/test_functions.py --- a/Lib/tkinter/test/test_ttk/test_functions.py +++ b/Lib/tkinter/test/test_ttk/test_functions.py @@ -143,7 +143,7 @@ ('a', 'b', 'c')), ("test {a b} c", ())) # state spec and options self.assertEqual(ttk._format_elemcreate('image', False, 'test', - ('a', 'b'), a='x', b='y'), ("test a b", ("-a", "x", "-b", "y"))) + ('a', 'b'), a='x'), ("test a b", ("-a", "x"))) # format returned values as a tcl script # state spec with multiple states and an option with a multivalue self.assertEqual(ttk._format_elemcreate('image', True, 'test', diff --git a/Makefile.pre.in b/Makefile.pre.in --- a/Makefile.pre.in +++ b/Makefile.pre.in @@ -322,6 +322,7 @@ Python/pystate.o \ Python/pythonrun.o \ Python/pytime.o \ + Python/random.o \ Python/structmember.o \ Python/symtable.o \ Python/sysmodule.o \ diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -10,6 +10,11 @@ Core and Builtins ----------------- +- Issue #13703: oCERT-2011-003: add -R command-line option and PYTHONHASHSEED + environment variables, 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 #13020: Fix a reference leak when allocating a structsequence object fails. Patch by Suman Saha. diff --git a/Misc/python.man b/Misc/python.man --- a/Misc/python.man +++ b/Misc/python.man @@ -37,6 +37,9 @@ .B \-OO ] [ +.B \-R +] +[ .B -Q .I argument ] @@ -152,6 +155,18 @@ 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 insertion, 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 @@ -413,6 +428,20 @@ .IP PYTHONWARNINGS 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 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 +purpose is to allow repeatable hashing, such as for selftests for the +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. .SH AUTHOR The Python Software Foundation: http://www.python.org/psf .SH INTERNET RESOURCES diff --git a/Modules/_datetimemodule.c b/Modules/_datetimemodule.c --- a/Modules/_datetimemodule.c +++ b/Modules/_datetimemodule.c @@ -2785,10 +2785,12 @@ register Py_hash_t x; p = (unsigned char *) data; - x = *p << 7; + 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; diff --git a/Modules/main.c b/Modules/main.c --- a/Modules/main.c +++ b/Modules/main.c @@ -46,7 +46,7 @@ static int orig_argc; /* command line options */ -#define BASE_OPTS L"bBc:dEhiJm:OqsStuvVW:xX:?" +#define BASE_OPTS L"bBc:dEhiJm:OqRsStuvVW:xX:?" #define PROGRAM_OPTS BASE_OPTS @@ -72,6 +72,9 @@ -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\ "; @@ -99,8 +102,14 @@ "PYTHONHOME : alternate directory (or %c).\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\ +"; +static char *usage_6 = "\ +PYTHONHASHSEED: if this variable is set to ``random``, the effect is the same \n\ + as specifying the :option:`-R` option: a random value is used to seed the\n\ + hashes of 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\ +"; static int usage(int exitcode, wchar_t* program) @@ -116,6 +125,7 @@ fputs(usage_3, f); fprintf(f, usage_4, DELIM); fprintf(f, usage_5, DELIM, PYTHONHOMEHELP); + fputs(usage_6, f); } #if defined(__VMS) if (exitcode == 0) { @@ -429,6 +439,10 @@ Py_QuietFlag++; break; + case 'R': + Py_HashRandomizationFlag++; + break; + /* This space reserved for other options */ default: diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c --- a/Modules/posixmodule.c +++ b/Modules/posixmodule.c @@ -7614,82 +7614,6 @@ } #endif -#ifdef MS_WINDOWS - -PyDoc_STRVAR(win32_urandom__doc__, -"urandom(n) -> str\n\n\ -Return n random bytes suitable for cryptographic use."); - -typedef BOOL (WINAPI *CRYPTACQUIRECONTEXTA)(HCRYPTPROV *phProv,\ - LPCSTR pszContainer, LPCSTR pszProvider, DWORD dwProvType,\ - DWORD dwFlags ); -typedef BOOL (WINAPI *CRYPTGENRANDOM)(HCRYPTPROV hProv, DWORD dwLen,\ - BYTE *pbBuffer ); - -static CRYPTGENRANDOM pCryptGenRandom = NULL; -/* This handle is never explicitly released. Instead, the operating - system will release it when the process terminates. */ -static HCRYPTPROV hCryptProv = 0; - -static PyObject* -win32_urandom(PyObject *self, PyObject *args) -{ - int howMany; - PyObject* result; - - /* Read arguments */ - if (! PyArg_ParseTuple(args, "i:urandom", &howMany)) - return NULL; - if (howMany < 0) - return PyErr_Format(PyExc_ValueError, - "negative argument not allowed"); - - if (hCryptProv == 0) { - HINSTANCE hAdvAPI32 = NULL; - CRYPTACQUIRECONTEXTA pCryptAcquireContext = NULL; - - /* Obtain handle to the DLL containing CryptoAPI - This should not fail */ - hAdvAPI32 = GetModuleHandle("advapi32.dll"); - if(hAdvAPI32 == NULL) - return win32_error("GetModuleHandle", NULL); - - /* Obtain pointers to the CryptoAPI functions - This will fail on some early versions of Win95 */ - pCryptAcquireContext = (CRYPTACQUIRECONTEXTA)GetProcAddress( - hAdvAPI32, - "CryptAcquireContextA"); - if (pCryptAcquireContext == NULL) - return PyErr_Format(PyExc_NotImplementedError, - "CryptAcquireContextA not found"); - - pCryptGenRandom = (CRYPTGENRANDOM)GetProcAddress( - hAdvAPI32, "CryptGenRandom"); - if (pCryptGenRandom == NULL) - return PyErr_Format(PyExc_NotImplementedError, - "CryptGenRandom not found"); - - /* Acquire context */ - if (! pCryptAcquireContext(&hCryptProv, NULL, NULL, - PROV_RSA_FULL, CRYPT_VERIFYCONTEXT)) - return win32_error("CryptAcquireContext", NULL); - } - - /* Allocate bytes */ - result = PyBytes_FromStringAndSize(NULL, howMany); - if (result != NULL) { - /* Get random data */ - memset(PyBytes_AS_STRING(result), 0, howMany); /* zero seed */ - if (! pCryptGenRandom(hCryptProv, howMany, (unsigned char*) - PyBytes_AS_STRING(result))) { - Py_DECREF(result); - return win32_error("CryptGenRandom", NULL); - } - } - return result; -} -#endif - PyDoc_STRVAR(device_encoding__doc__, "device_encoding(fd) -> str\n\n\ Return a string describing the encoding of the device\n\ @@ -7727,41 +7651,35 @@ return Py_None; } -#ifdef __VMS -/* Use openssl random routine */ -#include -PyDoc_STRVAR(vms_urandom__doc__, +PyDoc_STRVAR(posix_urandom__doc__, "urandom(n) -> str\n\n\ Return n random bytes suitable for cryptographic use."); -static PyObject* -vms_urandom(PyObject *self, PyObject *args) -{ - int howMany; - PyObject* result; - - /* Read arguments */ - if (! PyArg_ParseTuple(args, "i:urandom", &howMany)) - return NULL; - if (howMany < 0) +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"); - - /* Allocate bytes */ - result = PyBytes_FromStringAndSize(NULL, howMany); - if (result != NULL) { - /* Get random data */ - if (RAND_pseudo_bytes((unsigned char*) - PyBytes_AS_STRING(result), - howMany) < 0) { - Py_DECREF(result); - return PyErr_Format(PyExc_ValueError, - "RAND_pseudo_bytes"); - } + 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; } -#endif #ifdef HAVE_SETRESUID PyDoc_STRVAR(posix_setresuid__doc__, @@ -8137,12 +8055,7 @@ #ifdef HAVE_GETLOADAVG {"getloadavg", posix_getloadavg, METH_NOARGS, posix_getloadavg__doc__}, #endif - #ifdef MS_WINDOWS - {"urandom", win32_urandom, METH_VARARGS, win32_urandom__doc__}, - #endif - #ifdef __VMS - {"urandom", vms_urandom, METH_VARARGS, vms_urandom__doc__}, - #endif + {"urandom", posix_urandom, METH_VARARGS, posix_urandom__doc__}, #ifdef HAVE_SETRESUID {"setresuid", posix_setresuid, METH_VARARGS, posix_setresuid__doc__}, #endif @@ -8155,7 +8068,6 @@ #ifdef HAVE_GETRESGID {"getresgid", posix_getresgid, METH_NOARGS, posix_getresgid__doc__}, #endif - {NULL, NULL} /* Sentinel */ }; diff --git a/Objects/bytesobject.c b/Objects/bytesobject.c --- a/Objects/bytesobject.c +++ b/Objects/bytesobject.c @@ -878,11 +878,21 @@ 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 = *p << 7; + 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; diff --git a/Objects/object.c b/Objects/object.c --- a/Objects/object.c +++ b/Objects/object.c @@ -754,6 +754,8 @@ return -1; } +_Py_HashSecret_t _Py_HashSecret; + Py_hash_t PyObject_Hash(PyObject *v) { diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -7676,11 +7676,21 @@ if (self->hash != -1) return self->hash; len = Py_SIZE(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; + return 0; + } p = self->str; - x = *p << 7; + x = _Py_HashSecret.prefix; + x ^= *p << 7; while (--len >= 0) x = (_PyHASH_MULTIPLIER*x) ^ *p++; x ^= Py_SIZE(self); + x ^= _Py_HashSecret.suffix; if (x == -1) x = -2; self->hash = x; diff --git a/PCbuild/pythoncore.vcproj b/PCbuild/pythoncore.vcproj --- a/PCbuild/pythoncore.vcproj +++ b/PCbuild/pythoncore.vcproj @@ -1882,6 +1882,10 @@ RelativePath="..\Python\pythonrun.c" > + + diff --git a/Python/pythonrun.c b/Python/pythonrun.c --- a/Python/pythonrun.c +++ b/Python/pythonrun.c @@ -70,6 +70,7 @@ extern void _PyUnicode_Fini(void); extern int _PyLong_Init(void); extern void PyLong_Fini(void); +extern void _PyRandom_Init(void); #ifdef WITH_THREAD extern void _PyGILState_Init(PyInterpreterState *, PyThreadState *); @@ -89,6 +90,7 @@ int Py_IgnoreEnvironmentFlag; /* e.g. PYTHONPATH, PYTHONHOME */ int Py_NoUserSiteDirectory = 0; /* for -s and site.py */ int Py_UnbufferedStdioFlag = 0; /* Unbuffered binary std{in,out,err} */ +int Py_HashRandomizationFlag = 0; /* for -R and PYTHONHASHSEED */ PyThreadState *_Py_Finalizing = NULL; @@ -207,6 +209,12 @@ Py_OptimizeFlag = add_flag(Py_OptimizeFlag, p); if ((p = Py_GETENV("PYTHONDONTWRITEBYTECODE")) && *p != '\0') Py_DontWriteBytecodeFlag = add_flag(Py_DontWriteBytecodeFlag, p); + /* The variable is only tested for existence here; _PyRandom_Init will + check its value further. */ + if ((p = Py_GETENV("PYTHONHASHSEED")) && *p != '\0') + Py_HashRandomizationFlag = add_flag(Py_HashRandomizationFlag, p); + + _PyRandom_Init(); interp = PyInterpreterState_New(); if (interp == NULL) diff --git a/Python/random.c b/Python/random.c new file mode 100644 --- /dev/null +++ b/Python/random.c @@ -0,0 +1,302 @@ +#include "Python.h" +#ifdef MS_WINDOWS +#include +#else +#include +#endif + +static int random_initialized = 0; + +#ifdef MS_WINDOWS +typedef BOOL (WINAPI *CRYPTACQUIRECONTEXTA)(HCRYPTPROV *phProv,\ + LPCSTR pszContainer, LPCSTR pszProvider, DWORD dwProvType,\ + DWORD dwFlags ); +typedef BOOL (WINAPI *CRYPTGENRANDOM)(HCRYPTPROV hProv, DWORD dwLen,\ + BYTE *pbBuffer ); + +static CRYPTGENRANDOM pCryptGenRandom = NULL; +/* This handle is never explicitly released. Instead, the operating + system will release it when the process terminates. */ +static HCRYPTPROV hCryptProv = 0; + +static int +win32_urandom_init(int raise) +{ + HINSTANCE hAdvAPI32 = NULL; + CRYPTACQUIRECONTEXTA pCryptAcquireContext = NULL; + + /* Obtain handle to the DLL containing CryptoAPI. This should not fail. */ + hAdvAPI32 = GetModuleHandle("advapi32.dll"); + if(hAdvAPI32 == NULL) + goto error; + + /* Obtain pointers to the CryptoAPI functions. This will fail on some early + versions of Win95. */ + pCryptAcquireContext = (CRYPTACQUIRECONTEXTA)GetProcAddress( + hAdvAPI32, "CryptAcquireContextA"); + if (pCryptAcquireContext == NULL) + goto error; + + pCryptGenRandom = (CRYPTGENRANDOM)GetProcAddress(hAdvAPI32, + "CryptGenRandom"); + if (pCryptGenRandom == NULL) + goto error; + + /* Acquire context */ + if (! pCryptAcquireContext(&hCryptProv, NULL, NULL, + PROV_RSA_FULL, CRYPT_VERIFYCONTEXT)) + goto error; + + return 0; + +error: + if (raise) + PyErr_SetFromWindowsErr(0); + else + Py_FatalError("Failed to initialize Windows random API (CryptoGen)"); + return -1; +} + +/* Fill buffer with size pseudo-random bytes generated by the Windows CryptoGen + API. Return 0 on success, or -1 on error. */ +static int +win32_urandom(unsigned char *buffer, Py_ssize_t size, int raise) +{ + Py_ssize_t chunk; + + if (hCryptProv == 0) + { + if (win32_urandom_init(raise) == -1) + return -1; + } + + while (size > 0) + { + chunk = size > INT_MAX ? INT_MAX : size; + if (!pCryptGenRandom(hCryptProv, chunk, buffer)) + { + /* CryptGenRandom() failed */ + if (raise) + PyErr_SetFromWindowsErr(0); + else + Py_FatalError("Failed to initialized the randomized hash " + "secret using CryptoGen)"); + return -1; + } + buffer += chunk; + size -= chunk; + } + return 0; +} +#endif /* MS_WINDOWS */ + + +#ifdef __VMS +/* Use openssl random routine */ +#include +static int +vms_urandom(unsigned char *buffer, Py_ssize_t size, int raise) +{ + if (RAND_pseudo_bytes(buffer, size) < 0) { + if (raise) { + PyErr_Format(PyExc_ValueError, + "RAND_pseudo_bytes"); + } else { + Py_FatalError("Failed to initialize the randomized hash " + "secret using RAND_pseudo_bytes"); + } + return -1; + } + return 0; +} +#endif /* __VMS */ + + +#if !defined(MS_WINDOWS) && !defined(__VMS) + +/* Read size bytes from /dev/urandom into buffer. + Call Py_FatalError() on error. */ +static void +dev_urandom_noraise(char *buffer, Py_ssize_t size) +{ + int fd; + Py_ssize_t n; + + assert (0 < size); + + fd = open("/dev/urandom", O_RDONLY); + if (fd < 0) + Py_FatalError("Failed to open /dev/urandom"); + + while (0 < size) + { + do { + n = read(fd, buffer, (size_t)size); + } while (n < 0 && errno == EINTR); + if (n <= 0) + { + /* stop on error or if read(size) returned 0 */ + Py_FatalError("Failed to read bytes from /dev/urandom"); + break; + } + buffer += n; + size -= (Py_ssize_t)n; + } + close(fd); +} + +/* Read size bytes from /dev/urandom into buffer. + Return 0 on success, raise an exception and return -1 on error. */ +static int +dev_urandom_python(char *buffer, Py_ssize_t size) +{ + int fd; + Py_ssize_t n; + + if (size <= 0) + return 0; + + Py_BEGIN_ALLOW_THREADS + fd = open("/dev/urandom", O_RDONLY); + Py_END_ALLOW_THREADS + if (fd < 0) + { + PyErr_SetFromErrnoWithFilename(PyExc_OSError, "/dev/urandom"); + return -1; + } + + Py_BEGIN_ALLOW_THREADS + do { + do { + n = read(fd, buffer, (size_t)size); + } while (n < 0 && errno == EINTR); + if (n <= 0) + break; + buffer += n; + size -= (Py_ssize_t)n; + } while (0 < size); + Py_END_ALLOW_THREADS + + if (n <= 0) + { + /* stop on error or if read(size) returned 0 */ + if (n < 0) + PyErr_SetFromErrno(PyExc_OSError); + else + PyErr_Format(PyExc_RuntimeError, + "Failed to read %zi bytes from /dev/urandom", + size); + close(fd); + return -1; + } + close(fd); + return 0; +} +#endif /* !defined(MS_WINDOWS) && !defined(__VMS) */ + +/* Fill buffer with pseudo-random bytes generated by a linear congruent + generator (LCG): + + x(n+1) = (x(n) * 214013 + 2531011) % 2^32 + + Use bits 23..16 of x(n) to generate a byte. */ +static void +lcg_urandom(unsigned int x0, unsigned char *buffer, size_t size) +{ + size_t index; + unsigned int x; + + x = x0; + for (index=0; index < size; index++) { + x *= 214013; + x += 2531011; + /* modulo 2 ^ (8 * sizeof(int)) */ + buffer[index] = (x >> 16) & 0xff; + } +} + +/* Fill buffer with size pseudo-random bytes, not suitable for cryptographic + use, from the operating random number generator (RNG). + + Return 0 on success, raise an exception and return -1 on error. */ +int +_PyOS_URandom(void *buffer, Py_ssize_t size) +{ + if (size < 0) { + PyErr_Format(PyExc_ValueError, + "negative argument not allowed"); + return -1; + } + if (size == 0) + return 0; + +#ifdef MS_WINDOWS + return win32_urandom((unsigned char *)buffer, size, 1); +#else +# ifdef __VMS + return vms_urandom((unsigned char *)buffer, size, 1); +# else + return dev_urandom_python((char*)buffer, size); +# endif +#endif +} + +void +_PyRandom_Init(void) +{ + char *env; + void *secret = &_Py_HashSecret; + Py_ssize_t secret_size = sizeof(_Py_HashSecret); + + if (random_initialized) + return; + random_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. + */ + + env = Py_GETENV("PYTHONHASHSEED"); + if (env && *env != '\0' & strcmp(env, "random") != 0) { + char *endptr = env; + unsigned long seed; + seed = strtoul(env, &endptr, 10); + if (*endptr != '\0' + || seed > 4294967295UL + || (errno == ERANGE && seed == ULONG_MAX)) + { + Py_FatalError("PYTHONHASHSEED must be \"random\" or an integer " + "in range [0; 4294967295]"); + } + if (seed == 0) { + /* disable the randomized hash */ + memset(secret, 0, secret_size); + } + else { + lcg_urandom(seed, (unsigned char*)secret, secret_size); + } + } + else { +#ifdef MS_WINDOWS + (void)win32_urandom((unsigned char *)secret, secret_size, 0); +#else /* #ifdef MS_WINDOWS */ +# ifdef __VMS + vms_urandom((unsigned char *)secret, secret_size, 0); +# else + dev_urandom_noraise((char*)secret, secret_size); +# endif +#endif + } +} diff --git a/Python/sysmodule.c b/Python/sysmodule.c --- a/Python/sysmodule.c +++ b/Python/sysmodule.c @@ -1368,6 +1368,7 @@ /* {"skip_first", "-x"}, */ {"bytes_warning", "-b"}, {"quiet", "-q"}, + {"hash_randomization", "-R"}, {0} }; @@ -1376,9 +1377,9 @@ flags__doc__, /* doc */ flags_fields, /* fields */ #ifdef RISCOS + 14 +#else 13 -#else - 12 #endif }; @@ -1412,6 +1413,7 @@ /* SetFlag(skipfirstline); */ SetFlag(Py_BytesWarningFlag); SetFlag(Py_QuietFlag); + SetFlag(Py_HashRandomizationFlag); #undef SetFlag if (PyErr_Occurred()) { -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Feb 20 21:41:43 2012 From: python-checkins at python.org (georg.brandl) Date: Mon, 20 Feb 2012 21:41:43 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=283=2E2=29=3A_Run_tests_with_?= =?utf8?q?-R_on_=22make_test=22_and_the_buildbots=2E?= Message-ID: http://hg.python.org/cpython/rev/d1fb8fa2bb34 changeset: 75074:d1fb8fa2bb34 branch: 3.2 user: Georg Brandl date: Mon Feb 20 21:34:31 2012 +0100 summary: Run tests with -R on "make test" and the buildbots. files: Makefile.pre.in | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Makefile.pre.in b/Makefile.pre.in --- a/Makefile.pre.in +++ b/Makefile.pre.in @@ -764,7 +764,7 @@ TESTOPTS= -l $(EXTRATESTOPTS) TESTPROG= $(srcdir)/Lib/test/regrtest.py -TESTPYTHON= $(RUNSHARED) ./$(BUILDPYTHON) -Wd -E -bb $(TESTPYTHONOPTS) +TESTPYTHON= $(RUNSHARED) ./$(BUILDPYTHON) -Wd -E -R -bb $(TESTPYTHONOPTS) test: all platform -find $(srcdir)/Lib -name '*.py[co]' -print | xargs rm -f -$(TESTPYTHON) $(TESTPROG) $(TESTOPTS) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Feb 20 21:41:43 2012 From: python-checkins at python.org (georg.brandl) Date: Mon, 20 Feb 2012 21:41:43 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=283=2E2=29=3A_Fix_bad_inherit?= =?utf8?q?ance_in_test=5Fsubprocess_that_led_to_a_number_of_tests_being?= Message-ID: http://hg.python.org/cpython/rev/61b3f1582588 changeset: 75075:61b3f1582588 branch: 3.2 user: Georg Brandl date: Mon Feb 20 21:34:57 2012 +0100 summary: Fix bad inheritance in test_subprocess that led to a number of tests being executed twice. files: Lib/test/test_subprocess.py | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Lib/test/test_subprocess.py b/Lib/test/test_subprocess.py --- a/Lib/test/test_subprocess.py +++ b/Lib/test/test_subprocess.py @@ -1702,7 +1702,7 @@ self.with_spaces([sys.executable, self.fname, "ab cd"]) -class ContextManagerTests(ProcessTestCase): +class ContextManagerTests(BaseTestCase): def test_pipe(self): with subprocess.Popen([sys.executable, "-c", -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Feb 20 21:41:44 2012 From: python-checkins at python.org (georg.brandl) Date: Mon, 20 Feb 2012 21:41:44 +0100 Subject: [Python-checkins] =?utf8?b?Y3B5dGhvbiAoMy4yKTogRml4ICJzeXMucGF0?= =?utf8?q?h_modified=22_warning_in_test=5Fstrlit=2C_by_not_replacing_sys?= =?utf8?q?=2Epath?= Message-ID: http://hg.python.org/cpython/rev/b89cff9c63be changeset: 75076:b89cff9c63be branch: 3.2 user: Georg Brandl date: Mon Feb 20 21:36:28 2012 +0100 summary: Fix "sys.path modified" warning in test_strlit, by not replacing sys.path itself, only its contents. files: Lib/test/test_strlit.py | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Lib/test/test_strlit.py b/Lib/test/test_strlit.py --- a/Lib/test/test_strlit.py +++ b/Lib/test/test_strlit.py @@ -65,7 +65,7 @@ sys.path.insert(0, self.tmpdir) def tearDown(self): - sys.path = self.save_path + sys.path[:] = self.save_path shutil.rmtree(self.tmpdir, ignore_errors=True) def test_template(self): -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Feb 20 21:41:45 2012 From: python-checkins at python.org (georg.brandl) Date: Mon, 20 Feb 2012 21:41:45 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=283=2E2=29=3A_Fix_use_of_depr?= =?utf8?q?ecated_assert=5F_method=2E?= Message-ID: http://hg.python.org/cpython/rev/a348a053a6b1 changeset: 75077:a348a053a6b1 branch: 3.2 user: Georg Brandl date: Mon Feb 20 21:37:22 2012 +0100 summary: Fix use of deprecated assert_ method. files: Lib/test/test_descr.py | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Lib/test/test_descr.py b/Lib/test/test_descr.py --- a/Lib/test/test_descr.py +++ b/Lib/test/test_descr.py @@ -4482,8 +4482,8 @@ return '{' + ', '.join(sorted(kvs)) + '}' dict_ = {k: v for k, v in self.C.__dict__.items()} repr_ = repr(self.C.__dict__) - self.assert_(repr_.startswith('dict_proxy(')) - self.assert_(repr_.endswith(')')) + 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_))) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Feb 20 21:41:46 2012 From: python-checkins at python.org (georg.brandl) Date: Mon, 20 Feb 2012 21:41:46 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=283=2E2=29=3A_Fix_test=5Fdis_?= =?utf8?q?dependency_on_dict_order=2E?= Message-ID: http://hg.python.org/cpython/rev/224ebf9d428a changeset: 75078:224ebf9d428a branch: 3.2 user: Georg Brandl date: Mon Feb 20 21:41:03 2012 +0100 summary: Fix test_dis dependency on dict order. files: Lib/test/test_dis.py | 13 +++++++------ 1 files changed, 7 insertions(+), 6 deletions(-) diff --git a/Lib/test/test_dis.py b/Lib/test/test_dis.py --- a/Lib/test/test_dis.py +++ b/Lib/test/test_dis.py @@ -268,12 +268,13 @@ 6: args 7: kwds Cell variables: - 0: e - 1: d - 2: f - 3: y - 4: x - 5: z""" + 0: [edfxyz] + 1: [edfxyz] + 2: [edfxyz] + 3: [edfxyz] + 4: [edfxyz] + 5: [edfxyz]""" +# NOTE: the order of the cell variables above depends on dictionary order! co_tricky_nested_f = tricky.__func__.__code__.co_consts[1] -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Feb 20 21:43:29 2012 From: python-checkins at python.org (georg.brandl) Date: Mon, 20 Feb 2012 21:43:29 +0100 Subject: [Python-checkins] =?utf8?b?Y3B5dGhvbiAobWVyZ2UgMy4xIC0+IDMuMik6?= =?utf8?q?_Merge_with_3=2E1=2E?= Message-ID: http://hg.python.org/cpython/rev/763559c6d301 changeset: 75079:763559c6d301 branch: 3.2 parent: 75078:224ebf9d428a parent: 75071:11b09df370e7 user: Georg Brandl date: Mon Feb 20 21:43:25 2012 +0100 summary: Merge with 3.1. files: Lib/test/test_module.py | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Lib/test/test_module.py b/Lib/test/test_module.py --- a/Lib/test/test_module.py +++ b/Lib/test/test_module.py @@ -70,7 +70,7 @@ m = ModuleType("foo") m.destroyed = destroyed s = """class A: - def __del__(self): + def __del__(self, destroyed=destroyed): destroyed.append(1) a = A()""" exec(s, m.__dict__) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Feb 20 22:05:59 2012 From: python-checkins at python.org (georg.brandl) Date: Mon, 20 Feb 2012 22:05:59 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=283=2E2=29=3A_Another_test=5F?= =?utf8?q?dis_dict_order_dependency=2E?= Message-ID: http://hg.python.org/cpython/rev/38828f0c9312 changeset: 75080:38828f0c9312 branch: 3.2 user: Georg Brandl date: Mon Feb 20 22:03:28 2012 +0100 summary: Another test_dis dict order dependency. files: Lib/test/test_dis.py | 12 ++++++------ 1 files changed, 6 insertions(+), 6 deletions(-) diff --git a/Lib/test/test_dis.py b/Lib/test/test_dis.py --- a/Lib/test/test_dis.py +++ b/Lib/test/test_dis.py @@ -293,12 +293,12 @@ Variable names: 0: c Free variables: - 0: e - 1: d - 2: f - 3: y - 4: x - 5: z""" + 0: [edfxyz] + 1: [edfxyz] + 2: [edfxyz] + 3: [edfxyz] + 4: [edfxyz] + 5: [edfxyz]""" code_info_expr_str = """\ Name: -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Feb 20 22:06:00 2012 From: python-checkins at python.org (georg.brandl) Date: Mon, 20 Feb 2012 22:06:00 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=283=2E2=29=3A_Remove_setting_?= =?utf8?q?hash_seed_to_regrtest=27s_random_seed_and_re-execv=28=29ing=3A_t?= =?utf8?q?his?= Message-ID: http://hg.python.org/cpython/rev/1cbb7d8ebab1 changeset: 75081:1cbb7d8ebab1 branch: 3.2 user: Georg Brandl date: Mon Feb 20 22:06:02 2012 +0100 summary: Remove setting hash seed to regrtest's random seed and re-execv()ing: this doesn't preserve Python flags and fails from a temp directory. files: Lib/test/regrtest.py | 5 ----- 1 files changed, 0 insertions(+), 5 deletions(-) diff --git a/Lib/test/regrtest.py b/Lib/test/regrtest.py --- a/Lib/test/regrtest.py +++ b/Lib/test/regrtest.py @@ -496,11 +496,6 @@ except ValueError: print("Couldn't find starting test (%s), using all tests" % start) if randomize: - hashseed = os.getenv('PYTHONHASHSEED') - if not hashseed: - os.environ['PYTHONHASHSEED'] = str(random_seed) - os.execv(sys.executable, [sys.executable] + sys.argv) - return random.seed(random_seed) print("Using random seed", random_seed) random.shuffle(selected) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Feb 20 22:10:28 2012 From: python-checkins at python.org (antoine.pitrou) Date: Mon, 20 Feb 2012 22:10:28 +0100 Subject: [Python-checkins] =?utf8?q?cpython=3A_Issue_=2314063=3A_fix_test?= =?utf8?q?=5Fimportlib_failure_under_OS_X_case-insensitive_filesystems?= Message-ID: http://hg.python.org/cpython/rev/3297dcdad196 changeset: 75082:3297dcdad196 parent: 75070:defd944af91b user: Antoine Pitrou date: Mon Feb 20 22:06:59 2012 +0100 summary: Issue #14063: fix test_importlib failure under OS X case-insensitive filesystems (regression) files: Lib/importlib/_bootstrap.py | 26 ++++++++++++++---------- 1 files changed, 15 insertions(+), 11 deletions(-) diff --git a/Lib/importlib/_bootstrap.py b/Lib/importlib/_bootstrap.py --- a/Lib/importlib/_bootstrap.py +++ b/Lib/importlib/_bootstrap.py @@ -762,13 +762,12 @@ self.path = path or '.' self._path_mtime = -1 self._path_cache = set() + self._relaxed_path_cache = set() self._cache_refresh = 0 def find_module(self, fullname): """Try to find a loader for the specified module.""" tail_module = fullname.rpartition('.')[2] - if _relax_case(): - tail_module = tail_module.lower() try: mtime = _os.stat(self.path).st_mtime except OSError: @@ -777,8 +776,14 @@ self._fill_cache() self._path_mtime = mtime self._cache_refresh = _cache_refresh - cache = self._path_cache - if tail_module in cache: + # 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 + if cache_module in cache: base_path = _path_join(self.path, tail_module) if _path_isdir(base_path): for suffix, loader in self.packages: @@ -790,9 +795,8 @@ msg = "Not importing directory {}: missing __init__" _warnings.warn(msg.format(base_path), ImportWarning) for suffix, loader in self.modules: - mod_filename = tail_module + suffix - if mod_filename in cache: - full_path = _path_join(self.path, mod_filename) + 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) return None @@ -801,10 +805,10 @@ """Fill the cache of potential modules and packages for this directory.""" path = self.path contents = _os.listdir(path) - if _relax_case(): - self._path_cache = set(fn.lower() for fn in contents) - else: - self._path_cache = set(contents) + # We store two cached versions, to handle runtime changes of the + # PYTHONCASEOK environment variable. + self._path_cache = set(contents) + self._relaxed_path_cache = set(fn.lower() for fn in contents) class _SourceFinderDetails: -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Feb 20 22:47:59 2012 From: python-checkins at python.org (georg.brandl) Date: Mon, 20 Feb 2012 22:47:59 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=283=2E2=29=3A_Fix_use_of_depr?= =?utf8?q?ecated_assertRegexpMatches_method=2E?= Message-ID: http://hg.python.org/cpython/rev/2d1166133816 changeset: 75083:2d1166133816 branch: 3.2 parent: 75081:1cbb7d8ebab1 user: Georg Brandl date: Mon Feb 20 22:08:27 2012 +0100 summary: Fix use of deprecated assertRegexpMatches method. files: Lib/lib2to3/tests/test_refactor.py | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Lib/lib2to3/tests/test_refactor.py b/Lib/lib2to3/tests/test_refactor.py --- a/Lib/lib2to3/tests/test_refactor.py +++ b/Lib/lib2to3/tests/test_refactor.py @@ -230,7 +230,7 @@ os.sep, os.path.basename(test_file)) for message in debug_messages: if "Not writing changes" in message: - self.assertRegexpMatches(message, message_regex) + self.assertRegex(message, message_regex) break else: self.fail("%r not matched in %r" % (message_regex, debug_messages)) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Feb 20 22:48:00 2012 From: python-checkins at python.org (georg.brandl) Date: Mon, 20 Feb 2012 22:48:00 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=283=2E2=29=3A_Fix_dbm=5Fgnu_t?= =?utf8?q?est_relying_on_set_order=2E?= Message-ID: http://hg.python.org/cpython/rev/12fd6ae8ce44 changeset: 75084:12fd6ae8ce44 branch: 3.2 user: Georg Brandl date: Mon Feb 20 22:48:06 2012 +0100 summary: Fix dbm_gnu test relying on set order. files: Lib/test/test_dbm_gnu.py | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Lib/test/test_dbm_gnu.py b/Lib/test/test_dbm_gnu.py --- a/Lib/test/test_dbm_gnu.py +++ b/Lib/test/test_dbm_gnu.py @@ -53,7 +53,7 @@ all = set(gdbm.open_flags) # Test standard flags (presumably "crwn"). modes = all - set('fsu') - for mode in modes: + for mode in sorted(modes): # put "c" mode first self.g = gdbm.open(filename, mode) self.g.close() -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Feb 20 23:37:31 2012 From: python-checkins at python.org (georg.brandl) Date: Mon, 20 Feb 2012 23:37:31 +0100 Subject: [Python-checkins] =?utf8?b?Y3B5dGhvbiAoMy4yKTogRml4IHR5cG8u?= Message-ID: http://hg.python.org/cpython/rev/e5ca2b2c8d90 changeset: 75085:e5ca2b2c8d90 branch: 3.2 user: Georg Brandl date: Mon Feb 20 23:09:59 2012 +0100 summary: Fix typo. files: Misc/NEWS | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -11,7 +11,7 @@ ----------------- - Issue #13703: oCERT-2011-003: add -R command-line option and PYTHONHASHSEED - environment variables, to provide an opt-in way to protect against denial of + 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. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Feb 20 23:37:32 2012 From: python-checkins at python.org (georg.brandl) Date: Mon, 20 Feb 2012 23:37:32 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=283=2E2=29=3A_Fix_obscure_fai?= =?utf8?q?lures_of_datetime-related_tests_due_to_the_datetime_tests?= Message-ID: http://hg.python.org/cpython/rev/01e5d0771824 changeset: 75086:01e5d0771824 branch: 3.2 user: Georg Brandl date: Mon Feb 20 23:37:36 2012 +0100 summary: Fix obscure failures of datetime-related tests due to the datetime tests failing to restore the system state completely after testing the pure-Python versions. files: Lib/test/datetimetester.py | 2 - Lib/test/test_datetime.py | 40 ++++++++++++++----------- 2 files changed, 23 insertions(+), 19 deletions(-) diff --git a/Lib/test/datetimetester.py b/Lib/test/datetimetester.py --- a/Lib/test/datetimetester.py +++ b/Lib/test/datetimetester.py @@ -1780,8 +1780,6 @@ self.assertTrue(abs(from_timestamp - from_now) <= tolerance) def test_strptime(self): - import _strptime - string = '2004-12-01 13:02:47.197' format = '%Y-%m-%d %H:%M:%S.%f' expected = _strptime._strptime_datetime(self.theclass, string, format) diff --git a/Lib/test/test_datetime.py b/Lib/test/test_datetime.py --- a/Lib/test/test_datetime.py +++ b/Lib/test/test_datetime.py @@ -1,7 +1,9 @@ import unittest import sys from test.support import import_fresh_module, run_unittest + TESTS = 'test.datetimetester' + # XXX: import_fresh_module() is supposed to leave sys.module cache untouched, # XXX: but it does not, so we have to save and restore it ourselves. save_sys_modules = sys.modules.copy() @@ -15,28 +17,32 @@ sys.modules.update(save_sys_modules) test_modules = [pure_tests, fast_tests] test_suffixes = ["_Pure", "_Fast"] +# XXX(gb) First run all the _Pure tests, then all the _Fast tests. You might +# not believe this, but in spite of all the sys.modules trickery running a _Pure +# test last will leave a mix of pure and native datetime stuff lying around. +test_classes = [] for module, suffix in zip(test_modules, test_suffixes): for name, cls in module.__dict__.items(): - if isinstance(cls, type) and issubclass(cls, unittest.TestCase): - name += suffix - cls.__name__ = name - globals()[name] = cls - def setUp(self, module=module, setup=cls.setUp): - self._save_sys_modules = sys.modules.copy() - sys.modules[TESTS] = module - sys.modules['datetime'] = module.datetime_module - sys.modules['_strptime'] = module._strptime - setup(self) - def tearDown(self, teardown=cls.tearDown): - teardown(self) - sys.modules.clear() - sys.modules.update(self._save_sys_modules) - cls.setUp = setUp - cls.tearDown = tearDown + if not (isinstance(cls, type) and issubclass(cls, unittest.TestCase)): + continue + cls.__name__ = name + suffix + @classmethod + def setUpClass(cls_, module=module): + cls_._save_sys_modules = sys.modules.copy() + sys.modules[TESTS] = module + sys.modules['datetime'] = module.datetime_module + sys.modules['_strptime'] = module._strptime + @classmethod + def tearDownClass(cls_): + sys.modules.clear() + sys.modules.update(cls_._save_sys_modules) + cls.setUpClass = setUpClass + cls.tearDownClass = tearDownClass + test_classes.append(cls) def test_main(): - run_unittest(__name__) + run_unittest(*test_classes) if __name__ == "__main__": test_main() -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Feb 20 23:52:16 2012 From: python-checkins at python.org (georg.brandl) Date: Mon, 20 Feb 2012 23:52:16 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=283=2E2=29=3A_Fix_typo_in_con?= =?utf8?q?ditional=2E?= Message-ID: http://hg.python.org/cpython/rev/ab1886e7fc19 changeset: 75087:ab1886e7fc19 branch: 3.2 user: Georg Brandl date: Mon Feb 20 23:49:29 2012 +0100 summary: Fix typo in conditional. files: Python/random.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Python/random.c b/Python/random.c --- a/Python/random.c +++ b/Python/random.c @@ -269,7 +269,7 @@ */ env = Py_GETENV("PYTHONHASHSEED"); - if (env && *env != '\0' & strcmp(env, "random") != 0) { + if (env && *env != '\0' && strcmp(env, "random") != 0) { char *endptr = env; unsigned long seed; seed = strtoul(env, &endptr, 10); -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Feb 20 23:52:16 2012 From: python-checkins at python.org (georg.brandl) Date: Mon, 20 Feb 2012 23:52:16 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=283=2E1=29=3A_Fix_typo_in_con?= =?utf8?q?ditional=2E?= Message-ID: http://hg.python.org/cpython/rev/cd61c71a017c changeset: 75088:cd61c71a017c branch: 3.1 parent: 75071:11b09df370e7 user: Georg Brandl date: Mon Feb 20 23:49:29 2012 +0100 summary: Fix typo in conditional. files: Python/random.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Python/random.c b/Python/random.c --- a/Python/random.c +++ b/Python/random.c @@ -269,7 +269,7 @@ */ env = Py_GETENV("PYTHONHASHSEED"); - if (env && *env != '\0' & strcmp(env, "random") != 0) { + if (env && *env != '\0' && strcmp(env, "random") != 0) { char *endptr = env; unsigned long seed; seed = strtoul(env, &endptr, 10); -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Feb 20 23:52:17 2012 From: python-checkins at python.org (georg.brandl) Date: Mon, 20 Feb 2012 23:52:17 +0100 Subject: [Python-checkins] =?utf8?b?Y3B5dGhvbiAoMy4xKTogRml4IHR5cG8u?= Message-ID: http://hg.python.org/cpython/rev/2057b6c580e5 changeset: 75089:2057b6c580e5 branch: 3.1 user: Georg Brandl date: Mon Feb 20 23:09:59 2012 +0100 summary: Fix typo. files: Misc/NEWS | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -11,7 +11,7 @@ ----------------- - Issue #13703: oCERT-2011-003: add -R command-line option and PYTHONHASHSEED - environment variables, to provide an opt-in way to protect against denial of + 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. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Feb 20 23:52:18 2012 From: python-checkins at python.org (georg.brandl) Date: Mon, 20 Feb 2012 23:52:18 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=283=2E1=29=3A_Fix_dbm=5Fgnu_t?= =?utf8?q?est_relying_on_set_order=2E?= Message-ID: http://hg.python.org/cpython/rev/2a83c7ed9ae6 changeset: 75090:2a83c7ed9ae6 branch: 3.1 user: Georg Brandl date: Mon Feb 20 22:48:06 2012 +0100 summary: Fix dbm_gnu test relying on set order. files: Lib/test/test_dbm_gnu.py | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Lib/test/test_dbm_gnu.py b/Lib/test/test_dbm_gnu.py --- a/Lib/test/test_dbm_gnu.py +++ b/Lib/test/test_dbm_gnu.py @@ -49,7 +49,7 @@ all = set(gdbm.open_flags) # Test standard flags (presumably "crwn"). modes = all - set('fsu') - for mode in modes: + for mode in sorted(modes): # put "c" mode first self.g = gdbm.open(filename, mode) self.g.close() -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Feb 20 23:52:18 2012 From: python-checkins at python.org (georg.brandl) Date: Mon, 20 Feb 2012 23:52:18 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=283=2E1=29=3A_Remove_setting_?= =?utf8?q?hash_seed_to_regrtest=27s_random_seed_and_re-execv=28=29ing=3A_t?= =?utf8?q?his?= Message-ID: http://hg.python.org/cpython/rev/0e68e31b75a0 changeset: 75091:0e68e31b75a0 branch: 3.1 user: Georg Brandl date: Mon Feb 20 22:06:02 2012 +0100 summary: Remove setting hash seed to regrtest's random seed and re-execv()ing: this doesn't preserve Python flags and fails from a temp directory. files: Lib/test/regrtest.py | 5 ----- 1 files changed, 0 insertions(+), 5 deletions(-) diff --git a/Lib/test/regrtest.py b/Lib/test/regrtest.py --- a/Lib/test/regrtest.py +++ b/Lib/test/regrtest.py @@ -428,11 +428,6 @@ except ValueError: print("Couldn't find starting test (%s), using all tests" % start) if randomize: - hashseed = os.getenv('PYTHONHASHSEED') - if not hashseed: - os.environ['PYTHONHASHSEED'] = str(random_seed) - os.execv(sys.executable, [sys.executable] + sys.argv) - return random.seed(random_seed) print("Using random seed", random_seed) random.shuffle(tests) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Feb 20 23:52:19 2012 From: python-checkins at python.org (georg.brandl) Date: Mon, 20 Feb 2012 23:52:19 +0100 Subject: [Python-checkins] =?utf8?b?Y3B5dGhvbiAobWVyZ2UgMy4xIC0+IDMuMik6?= =?utf8?q?_Dummy-merge_with_3=2E1?= Message-ID: http://hg.python.org/cpython/rev/3a8cabb3ebc6 changeset: 75092:3a8cabb3ebc6 branch: 3.2 parent: 75087:ab1886e7fc19 parent: 75091:0e68e31b75a0 user: Georg Brandl date: Mon Feb 20 23:52:16 2012 +0100 summary: Dummy-merge with 3.1 files: -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Feb 20 23:55:14 2012 From: python-checkins at python.org (antoine.pitrou) Date: Mon, 20 Feb 2012 23:55:14 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=283=2E2=29=3A_Make_=22regrtes?= =?utf8?q?t_-j=22_=22-R=22-aware?= Message-ID: http://hg.python.org/cpython/rev/28dc6177c28f changeset: 75093:28dc6177c28f branch: 3.2 parent: 75086:01e5d0771824 user: Antoine Pitrou date: Mon Feb 20 23:49:07 2012 +0100 summary: Make "regrtest -j" "-R"-aware files: Lib/test/support.py | 1 + 1 files changed, 1 insertions(+), 0 deletions(-) diff --git a/Lib/test/support.py b/Lib/test/support.py --- a/Lib/test/support.py +++ b/Lib/test/support.py @@ -1460,6 +1460,7 @@ flag_opt_map = { 'bytes_warning': 'b', 'dont_write_bytecode': 'B', + 'hash_randomization': 'R', 'ignore_environment': 'E', 'no_user_site': 's', 'no_site': 'S', -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Feb 20 23:55:15 2012 From: python-checkins at python.org (antoine.pitrou) Date: Mon, 20 Feb 2012 23:55:15 +0100 Subject: [Python-checkins] =?utf8?b?Y3B5dGhvbiAobWVyZ2UgMy4yIC0+IDMuMik6?= =?utf8?q?_Merge?= Message-ID: http://hg.python.org/cpython/rev/63502dd55268 changeset: 75094:63502dd55268 branch: 3.2 parent: 75093:28dc6177c28f parent: 75092:3a8cabb3ebc6 user: Antoine Pitrou date: Mon Feb 20 23:51:50 2012 +0100 summary: Merge files: Python/random.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Python/random.c b/Python/random.c --- a/Python/random.c +++ b/Python/random.c @@ -269,7 +269,7 @@ */ env = Py_GETENV("PYTHONHASHSEED"); - if (env && *env != '\0' & strcmp(env, "random") != 0) { + if (env && *env != '\0' && strcmp(env, "random") != 0) { char *endptr = env; unsigned long seed; seed = strtoul(env, &endptr, 10); -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Feb 21 00:03:43 2012 From: python-checkins at python.org (antoine.pitrou) Date: Tue, 21 Feb 2012 00:03:43 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=283=2E2=29=3A_Delete_the_iter?= =?utf8?q?ator=2C_which_could_accidentally_keep_a_temporary_reference_to_t?= =?utf8?q?he?= Message-ID: http://hg.python.org/cpython/rev/f189da5bda26 changeset: 75095:f189da5bda26 branch: 3.2 user: Antoine Pitrou date: Tue Feb 21 00:00:06 2012 +0100 summary: Delete the iterator, which could accidentally keep a temporary reference to the yielded element. files: Lib/test/test_weakset.py | 1 + 1 files changed, 1 insertions(+), 0 deletions(-) diff --git a/Lib/test/test_weakset.py b/Lib/test/test_weakset.py --- a/Lib/test/test_weakset.py +++ b/Lib/test/test_weakset.py @@ -335,6 +335,7 @@ try: it = iter(s) next(it) + del it # Schedule an item for removal and recreate it u = ustr(str(items.pop())) gc.collect() # just in case -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Feb 21 00:32:28 2012 From: python-checkins at python.org (georg.brandl) Date: Tue, 21 Feb 2012 00:32:28 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=283=2E2=29=3A_Disable_an_insp?= =?utf8?q?ect_test=3A_it_depends_on_dict_ordering_which_parameter_is?= Message-ID: http://hg.python.org/cpython/rev/ee89a9eec88e changeset: 75096:ee89a9eec88e branch: 3.2 user: Georg Brandl date: Tue Feb 21 00:32:36 2012 +0100 summary: Disable an inspect test: it depends on dict ordering which parameter is reported as duplicate. files: Lib/test/test_inspect.py | 3 ++- 1 files changed, 2 insertions(+), 1 deletions(-) diff --git a/Lib/test/test_inspect.py b/Lib/test/test_inspect.py --- a/Lib/test/test_inspect.py +++ b/Lib/test/test_inspect.py @@ -810,7 +810,8 @@ self.assertEqualException(f, '2, 3, 4') self.assertEqualException(f, '1, 2, 3, a=1') self.assertEqualException(f, '2, 3, 4, c=5') - self.assertEqualException(f, '2, 3, 4, a=1, c=5') + # XXX: success of this one depends on dict order + ## self.assertEqualException(f, '2, 3, 4, a=1, c=5') # f got an unexpected keyword argument self.assertEqualException(f, 'c=2') self.assertEqualException(f, '2, c=3') -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Feb 21 00:37:05 2012 From: python-checkins at python.org (georg.brandl) Date: Tue, 21 Feb 2012 00:37:05 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_3=2E2_-=3E_default=29?= =?utf8?q?=3A_Merge_3=2E2=3A_Issue_=2313703_plus_some_related_test_suite_f?= =?utf8?q?ixes=2E?= Message-ID: http://hg.python.org/cpython/rev/ed76dc34b39d changeset: 75097:ed76dc34b39d parent: 75082:3297dcdad196 parent: 75094:63502dd55268 user: Georg Brandl date: Tue Feb 21 00:33:36 2012 +0100 summary: Merge 3.2: Issue #13703 plus some related test suite fixes. files: Doc/library/sys.rst | 4 + Doc/reference/datamodel.rst | 2 + Doc/using/cmdline.rst | 47 +- Include/object.h | 6 + Include/pydebug.h | 1 + Include/pythonrun.h | 2 + Lib/json/__init__.py | 4 +- Lib/os.py | 17 - Lib/test/datetimetester.py | 2 - Lib/test/mapping_tests.py | 2 +- Lib/test/script_helper.py | 7 +- Lib/test/support.py | 1 + Lib/test/test_cmd_line.py | 16 + Lib/test/test_datetime.py | 40 +- Lib/test/test_dbm_gnu.py | 2 +- Lib/test/test_dis.py | 25 +- Lib/test/test_gdb.py | 22 +- Lib/test/test_hash.py | 92 ++- Lib/test/test_os.py | 36 +- Lib/test/test_set.py | 23 +- Lib/test/test_strlit.py | 2 +- Lib/test/test_subprocess.py | 2 +- Lib/test/test_sys.py | 2 +- Lib/test/test_urllib.py | 4 +- Lib/test/test_urlparse.py | 3 +- Lib/tkinter/test/test_ttk/test_functions.py | 2 +- Makefile.pre.in | 1 + Misc/NEWS | 5 + Misc/python.man | 29 + Modules/main.c | 20 +- Modules/posixmodule.c | 113 +-- Objects/object.c | 13 +- Objects/unicodeobject.c | 14 +- PCbuild/pythoncore.vcproj | 4 + Python/pythonrun.c | 8 + Python/random.c | 302 ++++++++++ Python/sysmodule.c | 6 +- Tools/scripts/run_tests.py | 1 + 38 files changed, 707 insertions(+), 175 deletions(-) diff --git a/Doc/library/sys.rst b/Doc/library/sys.rst --- a/Doc/library/sys.rst +++ b/Doc/library/sys.rst @@ -252,11 +252,15 @@ :const:`verbose` :option:`-v` :const:`bytes_warning` :option:`-b` :const:`quiet` :option:`-q` + :const:`hash_randomization` :option:`-R` ============================= ============================= .. versionchanged:: 3.2 Added ``quiet`` attribute for the new :option:`-q` flag. + .. versionadded:: 3.2.3 + The ``hash_randomization`` attribute. + .. versionchanged:: 3.3 Removed obsolete ``division_warning`` attribute. diff --git a/Doc/reference/datamodel.rst b/Doc/reference/datamodel.rst --- a/Doc/reference/datamodel.rst +++ b/Doc/reference/datamodel.rst @@ -1277,6 +1277,8 @@ inheritance of :meth:`__hash__` will be blocked, just as if :attr:`__hash__` had been explicitly set to :const:`None`. + See also the :option:`-R` command-line option. + .. method:: object.__bool__(self) diff --git a/Doc/using/cmdline.rst b/Doc/using/cmdline.rst --- a/Doc/using/cmdline.rst +++ b/Doc/using/cmdline.rst @@ -24,7 +24,7 @@ When invoking Python, you may specify any of these options:: - python [-bBdEhiOsSuvVWx?] [-c command | -m module-name | script | - ] [args] + python [-bBdEhiORqsSuvVWx?] [-c command | -m module-name | script | - ] [args] The most common use case is, of course, a simple invocation of a script:: @@ -227,6 +227,29 @@ .. versionadded:: 3.2 +.. 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. + + 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 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. + + See also :envvar:`PYTHONHASHSEED`. + + .. versionadded:: 3.2.3 + + .. cmdoption:: -s Don't add the :data:`user site-packages directory ` to @@ -352,6 +375,7 @@ .. _Jython: http://jython.org + .. _using-on-envvars: Environment variables @@ -460,6 +484,27 @@ option. +.. 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 :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 + randomization. + + Its purpose is to allow repeatable hashing, such as for selftests for the + 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. + + .. versionadded:: 3.2.3 + + .. envvar:: PYTHONIOENCODING If this is set before running the interpreter, it overrides the encoding used diff --git a/Include/object.h b/Include/object.h --- a/Include/object.h +++ b/Include/object.h @@ -554,6 +554,12 @@ PyAPI_FUNC(Py_hash_t) _Py_HashBytes(unsigned char*, Py_ssize_t); #endif +typedef struct { + Py_hash_t prefix; + Py_hash_t suffix; +} _Py_HashSecret_t; +PyAPI_DATA(_Py_HashSecret_t) _Py_HashSecret; + /* Helper for passing objects to printf and the like */ #define PyObject_REPR(obj) _PyUnicode_AsString(PyObject_Repr(obj)) diff --git a/Include/pydebug.h b/Include/pydebug.h --- a/Include/pydebug.h +++ b/Include/pydebug.h @@ -19,6 +19,7 @@ PyAPI_DATA(int) Py_DontWriteBytecodeFlag; PyAPI_DATA(int) Py_NoUserSiteDirectory; PyAPI_DATA(int) Py_UnbufferedStdioFlag; +PyAPI_DATA(int) Py_HashRandomizationFlag; /* this is a wrapper around getenv() that pays attention to Py_IgnoreEnvironmentFlag. It should be used for getting variables like diff --git a/Include/pythonrun.h b/Include/pythonrun.h --- a/Include/pythonrun.h +++ b/Include/pythonrun.h @@ -246,6 +246,8 @@ PyAPI_FUNC(PyOS_sighandler_t) PyOS_getsig(int); PyAPI_FUNC(PyOS_sighandler_t) PyOS_setsig(int, PyOS_sighandler_t); +/* Random */ +PyAPI_FUNC(int) _PyOS_URandom (void *buffer, Py_ssize_t size); #ifdef __cplusplus } diff --git a/Lib/json/__init__.py b/Lib/json/__init__.py --- a/Lib/json/__init__.py +++ b/Lib/json/__init__.py @@ -31,7 +31,9 @@ Compact encoding:: >>> import json - >>> json.dumps([1,2,3,{'4': 5, '6': 7}], separators=(',', ':')) + >>> from collections import OrderedDict + >>> mydict = OrderedDict([('4', 5), ('6', 7)]) + >>> json.dumps([1,2,3,mydict], separators=(',', ':')) '[1,2,3,{"4":5,"6":7}]' Pretty printing:: diff --git a/Lib/os.py b/Lib/os.py --- a/Lib/os.py +++ b/Lib/os.py @@ -852,23 +852,6 @@ except NameError: # statvfs_result may not exist pass -if not _exists("urandom"): - def urandom(n): - """urandom(n) -> str - - Return a string of n random bytes suitable for cryptographic use. - - """ - try: - _urandomfd = open("/dev/urandom", O_RDONLY) - except (OSError, IOError): - raise NotImplementedError("/dev/urandom (or equivalent) not found") - bs = b"" - while len(bs) < n: - bs += read(_urandomfd, n - len(bs)) - close(_urandomfd) - return bs - # Supply os.popen() def popen(cmd, mode="r", buffering=-1): if not isinstance(cmd, str): diff --git a/Lib/test/datetimetester.py b/Lib/test/datetimetester.py --- a/Lib/test/datetimetester.py +++ b/Lib/test/datetimetester.py @@ -1786,8 +1786,6 @@ self.assertTrue(abs(from_timestamp - from_now) <= tolerance) def test_strptime(self): - import _strptime - string = '2004-12-01 13:02:47.197' format = '%Y-%m-%d %H:%M:%S.%f' expected = _strptime._strptime_datetime(self.theclass, string, format) diff --git a/Lib/test/mapping_tests.py b/Lib/test/mapping_tests.py --- a/Lib/test/mapping_tests.py +++ b/Lib/test/mapping_tests.py @@ -14,7 +14,7 @@ def _reference(self): """Return a dictionary of values which are invariant by storage in the object under test.""" - return {1:2, "key1":"value1", "key2":(1,2,3)} + return {"1": "2", "key1":"value1", "key2":(1,2,3)} def _empty_mapping(self): """Return an empty mapping object""" return self.type2test() diff --git a/Lib/test/script_helper.py b/Lib/test/script_helper.py --- a/Lib/test/script_helper.py +++ b/Lib/test/script_helper.py @@ -3,7 +3,6 @@ import sys import os -import re import os.path import tempfile import subprocess @@ -20,11 +19,15 @@ cmd_line = [sys.executable] if not env_vars: cmd_line.append('-E') - cmd_line.extend(args) # Need to preserve the original environment, for in-place testing of # shared library builds. env = os.environ.copy() + # But a special flag that can be set to override -- in this case, the + # caller is responsible to pass the full environment. + if env_vars.pop('__cleanenv', None): + env = {} env.update(env_vars) + cmd_line.extend(args) p = subprocess.Popen(cmd_line, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, env=env) diff --git a/Lib/test/support.py b/Lib/test/support.py --- a/Lib/test/support.py +++ b/Lib/test/support.py @@ -1588,6 +1588,7 @@ flag_opt_map = { 'bytes_warning': 'b', 'dont_write_bytecode': 'B', + 'hash_randomization': 'R', 'ignore_environment': 'E', 'no_user_site': 's', 'no_site': 'S', diff --git a/Lib/test/test_cmd_line.py b/Lib/test/test_cmd_line.py --- a/Lib/test/test_cmd_line.py +++ b/Lib/test/test_cmd_line.py @@ -324,6 +324,22 @@ def test_no_std_streams(self): self._test_no_stdio(['stdin', 'stdout', 'stderr']) + def test_hash_randomization(self): + # Verify that -R enables hash randomization: + self.verify_valid_flag('-R') + hashes = [] + for i in range(2): + code = 'print(hash("spam"))' + rc, out, err = assert_python_ok('-R', '-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) + self.assertEqual(rc, 0) + self.assertIn(b'random is 1', out) def test_main(): test.support.run_unittest(CmdLineTest) diff --git a/Lib/test/test_datetime.py b/Lib/test/test_datetime.py --- a/Lib/test/test_datetime.py +++ b/Lib/test/test_datetime.py @@ -1,7 +1,9 @@ import unittest import sys from test.support import import_fresh_module, run_unittest + TESTS = 'test.datetimetester' + # XXX: import_fresh_module() is supposed to leave sys.module cache untouched, # XXX: but it does not, so we have to save and restore it ourselves. save_sys_modules = sys.modules.copy() @@ -15,28 +17,32 @@ sys.modules.update(save_sys_modules) test_modules = [pure_tests, fast_tests] test_suffixes = ["_Pure", "_Fast"] +# XXX(gb) First run all the _Pure tests, then all the _Fast tests. You might +# not believe this, but in spite of all the sys.modules trickery running a _Pure +# test last will leave a mix of pure and native datetime stuff lying around. +test_classes = [] for module, suffix in zip(test_modules, test_suffixes): for name, cls in module.__dict__.items(): - if isinstance(cls, type) and issubclass(cls, unittest.TestCase): - name += suffix - cls.__name__ = name - globals()[name] = cls - def setUp(self, module=module, setup=cls.setUp): - self._save_sys_modules = sys.modules.copy() - sys.modules[TESTS] = module - sys.modules['datetime'] = module.datetime_module - sys.modules['_strptime'] = module._strptime - setup(self) - def tearDown(self, teardown=cls.tearDown): - teardown(self) - sys.modules.clear() - sys.modules.update(self._save_sys_modules) - cls.setUp = setUp - cls.tearDown = tearDown + if not (isinstance(cls, type) and issubclass(cls, unittest.TestCase)): + continue + cls.__name__ = name + suffix + @classmethod + def setUpClass(cls_, module=module): + cls_._save_sys_modules = sys.modules.copy() + sys.modules[TESTS] = module + sys.modules['datetime'] = module.datetime_module + sys.modules['_strptime'] = module._strptime + @classmethod + def tearDownClass(cls_): + sys.modules.clear() + sys.modules.update(cls_._save_sys_modules) + cls.setUpClass = setUpClass + cls.tearDownClass = tearDownClass + test_classes.append(cls) def test_main(): - run_unittest(__name__) + run_unittest(*test_classes) if __name__ == "__main__": test_main() diff --git a/Lib/test/test_dbm_gnu.py b/Lib/test/test_dbm_gnu.py --- a/Lib/test/test_dbm_gnu.py +++ b/Lib/test/test_dbm_gnu.py @@ -53,7 +53,7 @@ all = set(gdbm.open_flags) # Test standard flags (presumably "crwn"). modes = all - set('fsu') - for mode in modes: + for mode in sorted(modes): # put "c" mode first self.g = gdbm.open(filename, mode) self.g.close() diff --git a/Lib/test/test_dis.py b/Lib/test/test_dis.py --- a/Lib/test/test_dis.py +++ b/Lib/test/test_dis.py @@ -350,12 +350,13 @@ 6: args 7: kwds Cell variables: - 0: e - 1: d - 2: f - 3: y - 4: x - 5: z""" + 0: [edfxyz] + 1: [edfxyz] + 2: [edfxyz] + 3: [edfxyz] + 4: [edfxyz] + 5: [edfxyz]""" +# NOTE: the order of the cell variables above depends on dictionary order! co_tricky_nested_f = tricky.__func__.__code__.co_consts[1] @@ -374,12 +375,12 @@ Variable names: 0: c Free variables: - 0: e - 1: d - 2: f - 3: y - 4: x - 5: z""" + 0: [edfxyz] + 1: [edfxyz] + 2: [edfxyz] + 3: [edfxyz] + 4: [edfxyz] + 5: [edfxyz]""" code_info_expr_str = """\ Name: diff --git a/Lib/test/test_gdb.py b/Lib/test/test_gdb.py --- a/Lib/test/test_gdb.py +++ b/Lib/test/test_gdb.py @@ -52,13 +52,18 @@ """Test that the debugger can debug Python.""" - def run_gdb(self, *args): + def run_gdb(self, *args, **env_vars): """Runs gdb with the command line given by *args. Returns its stdout, stderr """ + if env_vars: + env = os.environ.copy() + env.update(env_vars) + else: + env = None out, err = subprocess.Popen( - args, stdout=subprocess.PIPE, stderr=subprocess.PIPE, + args, stdout=subprocess.PIPE, stderr=subprocess.PIPE, env=env, ).communicate() return out.decode('utf-8', 'replace'), err.decode('utf-8', 'replace') @@ -118,7 +123,7 @@ # print ' '.join(args) # Use "args" to invoke gdb, capturing stdout, stderr: - out, err = self.run_gdb(*args) + out, err = self.run_gdb(*args, PYTHONHASHSEED='0') # Ignore some noise on stderr due to the pending breakpoint: err = err.replace('Function "%s" not defined.\n' % breakpoint, '') @@ -207,7 +212,8 @@ 'Verify the pretty-printing of dictionaries' self.assertGdbRepr({}) self.assertGdbRepr({'foo': 'bar'}) - self.assertGdbRepr({'foo': 'bar', 'douglas':42}) + self.assertGdbRepr({'foo': 'bar', 'douglas': 42}, + "{'foo': 'bar', 'douglas': 42}") def test_lists(self): 'Verify the pretty-printing of lists' @@ -269,8 +275,8 @@ def test_sets(self): 'Verify the pretty-printing of sets' self.assertGdbRepr(set()) - self.assertGdbRepr(set(['a', 'b'])) - self.assertGdbRepr(set([4, 5, 6])) + self.assertGdbRepr(set(['a', 'b']), "{'a', 'b'}") + self.assertGdbRepr(set([4, 5, 6]), "{4, 5, 6}") # Ensure that we handle sets containing the "dummy" key value, # which happens on deletion: @@ -282,8 +288,8 @@ def test_frozensets(self): 'Verify the pretty-printing of frozensets' self.assertGdbRepr(frozenset()) - self.assertGdbRepr(frozenset(['a', 'b'])) - self.assertGdbRepr(frozenset([4, 5, 6])) + self.assertGdbRepr(frozenset(['a', 'b']), "frozenset({'a', 'b'})") + self.assertGdbRepr(frozenset([4, 5, 6]), "frozenset({4, 5, 6})") def test_exceptions(self): # Test a RuntimeError diff --git a/Lib/test/test_hash.py b/Lib/test/test_hash.py --- a/Lib/test/test_hash.py +++ b/Lib/test/test_hash.py @@ -3,10 +3,16 @@ # # Also test that hash implementations are inherited as expected +import datetime +import os +import sys import unittest from test import support +from test.script_helper import assert_python_ok from collections import Hashable +IS_64BIT = sys.maxsize > 2**32 + class HashEqualityTestCase(unittest.TestCase): @@ -117,10 +123,92 @@ for obj in self.hashes_to_check: self.assertEqual(hash(obj), _default_hash(obj)) +class HashRandomizationTests(unittest.TestCase): + + # Each subclass should define a field "repr_", containing the repr() of + # an object to be tested + + def get_hash_command(self, repr_): + return 'print(hash(%s))' % repr_ + + def get_hash(self, repr_, seed=None): + env = os.environ.copy() + env['__cleanenv'] = True # signal to assert_python not to do a copy + # of os.environ on its own + if seed is not None: + env['PYTHONHASHSEED'] = str(seed) + else: + env.pop('PYTHONHASHSEED', None) + out = assert_python_ok( + '-c', self.get_hash_command(repr_), + **env) + stdout = out[1].strip() + return int(stdout) + + def test_randomized_hash(self): + # two runs should return different hashes + run1 = self.get_hash(self.repr_, seed='random') + run2 = self.get_hash(self.repr_, seed='random') + self.assertNotEqual(run1, run2) + +class StringlikeHashRandomizationTests(HashRandomizationTests): + def test_null_hash(self): + # PYTHONHASHSEED=0 disables the randomized hash + if IS_64BIT: + known_hash_of_obj = 1453079729188098211 + else: + known_hash_of_obj = -1600925533 + + # Randomization is disabled by default: + self.assertEqual(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) + + def test_fixed_hash(self): + # test a fixed seed for the randomized hash + # Note that all types share the same values: + if IS_64BIT: + h = -4410911502303878509 + else: + h = -206076799 + self.assertEqual(self.get_hash(self.repr_, seed=42), h) + +class StrHashRandomizationTests(StringlikeHashRandomizationTests): + repr_ = repr('abc') + + def test_empty_string(self): + self.assertEqual(hash(""), 0) + +class BytesHashRandomizationTests(StringlikeHashRandomizationTests): + repr_ = repr(b'abc') + + def test_empty_string(self): + self.assertEqual(hash(b""), 0) + +class DatetimeTests(HashRandomizationTests): + def get_hash_command(self, repr_): + return 'import datetime; print(hash(%s))' % repr_ + +class DatetimeDateTests(DatetimeTests): + repr_ = repr(datetime.date(1066, 10, 14)) + +class DatetimeDatetimeTests(DatetimeTests): + repr_ = repr(datetime.datetime(1, 2, 3, 4, 5, 6, 7)) + +class DatetimeTimeTests(DatetimeTests): + repr_ = repr(datetime.time(0)) + + def test_main(): support.run_unittest(HashEqualityTestCase, - HashInheritanceTestCase, - HashBuiltinsTestCase) + HashInheritanceTestCase, + HashBuiltinsTestCase, + StrHashRandomizationTests, + BytesHashRandomizationTests, + DatetimeDateTests, + DatetimeDatetimeTests, + DatetimeTimeTests) if __name__ == "__main__": diff --git a/Lib/test/test_os.py b/Lib/test/test_os.py --- a/Lib/test/test_os.py +++ b/Lib/test/test_os.py @@ -26,6 +26,7 @@ import threading except ImportError: threading = None +from test.script_helper import assert_python_ok os.stat_float_times(True) st = os.stat(__file__) @@ -794,14 +795,33 @@ self.assertEqual(f.read(), b'') class URandomTests(unittest.TestCase): - def test_urandom(self): - try: - self.assertEqual(len(os.urandom(1)), 1) - self.assertEqual(len(os.urandom(10)), 10) - self.assertEqual(len(os.urandom(100)), 100) - self.assertEqual(len(os.urandom(1000)), 1000) - except NotImplementedError: - pass + def test_urandom_length(self): + self.assertEqual(len(os.urandom(0)), 0) + self.assertEqual(len(os.urandom(1)), 1) + self.assertEqual(len(os.urandom(10)), 10) + self.assertEqual(len(os.urandom(100)), 100) + self.assertEqual(len(os.urandom(1000)), 1000) + + def test_urandom_value(self): + data1 = os.urandom(16) + data2 = os.urandom(16) + self.assertNotEqual(data1, data2) + + def get_urandom_subprocess(self, count): + code = '\n'.join(( + 'import os, sys', + 'data = os.urandom(%s)' % count, + 'sys.stdout.buffer.write(data)', + 'sys.stdout.buffer.flush()')) + out = assert_python_ok('-c', code) + stdout = out[1] + self.assertEqual(len(stdout), 16) + return stdout + + def test_urandom_subprocess(self): + data1 = self.get_urandom_subprocess(16) + data2 = self.get_urandom_subprocess(16) + self.assertNotEqual(data1, data2) @contextlib.contextmanager def _execvpe_mockup(defpath=None): diff --git a/Lib/test/test_set.py b/Lib/test/test_set.py --- a/Lib/test/test_set.py +++ b/Lib/test/test_set.py @@ -733,6 +733,17 @@ if self.repr is not None: self.assertEqual(repr(self.set), self.repr) + def check_repr_against_values(self): + text = repr(self.set) + self.assertTrue(text.startswith('{')) + self.assertTrue(text.endswith('}')) + + result = text[1:-1].split(', ') + result.sort() + sorted_repr_values = [repr(value) for value in self.values] + sorted_repr_values.sort() + self.assertEqual(result, sorted_repr_values) + def test_print(self): try: fo = open(support.TESTFN, "w") @@ -891,7 +902,9 @@ self.set = set(self.values) self.dup = set(self.values) self.length = 3 - self.repr = "{'a', 'c', 'b'}" + + def test_repr(self): + self.check_repr_against_values() #------------------------------------------------------------------------------ @@ -902,7 +915,9 @@ self.set = set(self.values) self.dup = set(self.values) self.length = 3 - self.repr = "{b'a', b'c', b'b'}" + + def test_repr(self): + self.check_repr_against_values() #------------------------------------------------------------------------------ @@ -916,11 +931,13 @@ self.set = set(self.values) self.dup = set(self.values) self.length = 4 - self.repr = "{'a', b'a', 'b', b'b'}" def tearDown(self): self._warning_filters.__exit__(None, None, None) + def test_repr(self): + self.check_repr_against_values() + #============================================================================== def baditer(): diff --git a/Lib/test/test_strlit.py b/Lib/test/test_strlit.py --- a/Lib/test/test_strlit.py +++ b/Lib/test/test_strlit.py @@ -65,7 +65,7 @@ sys.path.insert(0, self.tmpdir) def tearDown(self): - sys.path = self.save_path + sys.path[:] = self.save_path shutil.rmtree(self.tmpdir, ignore_errors=True) def test_template(self): diff --git a/Lib/test/test_subprocess.py b/Lib/test/test_subprocess.py --- a/Lib/test/test_subprocess.py +++ b/Lib/test/test_subprocess.py @@ -1774,7 +1774,7 @@ self.with_spaces([sys.executable, self.fname, "ab cd"]) -class ContextManagerTests(ProcessTestCase): +class ContextManagerTests(BaseTestCase): def test_pipe(self): with subprocess.Popen([sys.executable, "-c", diff --git a/Lib/test/test_sys.py b/Lib/test/test_sys.py --- a/Lib/test/test_sys.py +++ b/Lib/test/test_sys.py @@ -513,7 +513,7 @@ attrs = ("debug", "inspect", "interactive", "optimize", "dont_write_bytecode", "no_user_site", "no_site", "ignore_environment", "verbose", - "bytes_warning", "quiet") + "bytes_warning", "quiet", "hash_randomization") for attr in attrs: self.assertTrue(hasattr(sys.flags, attr), attr) self.assertEqual(type(getattr(sys.flags, attr)), int, attr) diff --git a/Lib/test/test_urllib.py b/Lib/test/test_urllib.py --- a/Lib/test/test_urllib.py +++ b/Lib/test/test_urllib.py @@ -13,6 +13,7 @@ import tempfile from base64 import b64encode +import collections def hexescape(char): """Escape char as RFC 2396 specifies""" @@ -953,8 +954,9 @@ self.assertEqual("a=1&a=2", urllib.parse.urlencode({"a": [1, 2]}, True)) self.assertEqual("a=None&a=a", urllib.parse.urlencode({"a": [None, "a"]}, True)) + data = collections.OrderedDict([("a", 1), ("b", 1)]) self.assertEqual("a=a&a=b", - urllib.parse.urlencode({"a": {"a": 1, "b": 1}}, True)) + urllib.parse.urlencode({"a": data}, True)) def test_urlencode_encoding(self): # ASCII encoding. Expect %3F with errors="replace' diff --git a/Lib/test/test_urlparse.py b/Lib/test/test_urlparse.py old mode 100644 new mode 100755 --- a/Lib/test/test_urlparse.py +++ b/Lib/test/test_urlparse.py @@ -769,7 +769,8 @@ # Other tests incidentally urlencode things; test non-covered cases: # Sequence and object values. result = urllib.parse.urlencode({'a': [1, 2], 'b': (3, 4, 5)}, True) - self.assertEqual(result, 'a=1&a=2&b=3&b=4&b=5') + # we cannot rely on ordering here + assert set(result.split('&')) == {'a=1', 'a=2', 'b=3', 'b=4', 'b=5'} class Trivial: def __str__(self): diff --git a/Lib/tkinter/test/test_ttk/test_functions.py b/Lib/tkinter/test/test_ttk/test_functions.py --- a/Lib/tkinter/test/test_ttk/test_functions.py +++ b/Lib/tkinter/test/test_ttk/test_functions.py @@ -143,7 +143,7 @@ ('a', 'b', 'c')), ("test {a b} c", ())) # state spec and options self.assertEqual(ttk._format_elemcreate('image', False, 'test', - ('a', 'b'), a='x', b='y'), ("test a b", ("-a", "x", "-b", "y"))) + ('a', 'b'), a='x'), ("test a b", ("-a", "x"))) # format returned values as a tcl script # state spec with multiple states and an option with a multivalue self.assertEqual(ttk._format_elemcreate('image', True, 'test', diff --git a/Makefile.pre.in b/Makefile.pre.in --- a/Makefile.pre.in +++ b/Makefile.pre.in @@ -322,6 +322,7 @@ Python/pystate.o \ Python/pythonrun.o \ Python/pytime.o \ + Python/random.o \ Python/structmember.o \ Python/symtable.o \ Python/sysmodule.o \ diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -16,6 +16,11 @@ - Issue #14051: Allow arbitrary attributes to be set of classmethod and staticmethod. +- 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 #13020: Fix a reference leak when allocating a structsequence object fails. Patch by Suman Saha. diff --git a/Misc/python.man b/Misc/python.man --- a/Misc/python.man +++ b/Misc/python.man @@ -37,6 +37,9 @@ .B \-OO ] [ +.B \-R +] +[ .B \-s ] [ @@ -148,6 +151,18 @@ 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 insertion, O(n^2) complexity. See +http://www.ocert.org/advisories/ocert-2011-003.html +for details. +.TP .B \-s Don't add user site directory to sys.path. .TP @@ -402,6 +417,20 @@ .IP PYTHONWARNINGS 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 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 +purpose is to allow repeatable hashing, such as for selftests for the +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. .SH AUTHOR The Python Software Foundation: http://www.python.org/psf .SH INTERNET RESOURCES diff --git a/Modules/main.c b/Modules/main.c --- a/Modules/main.c +++ b/Modules/main.c @@ -47,7 +47,7 @@ static int orig_argc; /* command line options */ -#define BASE_OPTS L"bBc:dEhiJm:OqsStuvVW:xX:?" +#define BASE_OPTS L"bBc:dEhiJm:OqRsStuvVW:xX:?" #define PROGRAM_OPTS BASE_OPTS @@ -73,6 +73,9 @@ -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\ "; @@ -101,8 +104,14 @@ " 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" -"PYTHONFAULTHANDLER: dump the Python traceback on fatal errors.\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 :option:`-R` option: a random value is used to seed the\n\ + hashes of 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\ +"; static int usage(int exitcode, wchar_t* program) @@ -118,6 +127,7 @@ fputs(usage_3, f); fprintf(f, usage_4, DELIM); fprintf(f, usage_5, DELIM, PYTHONHOMEHELP); + fputs(usage_6, f); } #if defined(__VMS) if (exitcode == 0) { @@ -431,6 +441,10 @@ Py_QuietFlag++; break; + case 'R': + Py_HashRandomizationFlag++; + break; + /* This space reserved for other options */ default: diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c --- a/Modules/posixmodule.c +++ b/Modules/posixmodule.c @@ -9317,82 +9317,6 @@ } #endif -#ifdef MS_WINDOWS - -PyDoc_STRVAR(win32_urandom__doc__, -"urandom(n) -> str\n\n\ -Return n random bytes suitable for cryptographic use."); - -typedef BOOL (WINAPI *CRYPTACQUIRECONTEXTA)(HCRYPTPROV *phProv,\ - LPCSTR pszContainer, LPCSTR pszProvider, DWORD dwProvType,\ - DWORD dwFlags ); -typedef BOOL (WINAPI *CRYPTGENRANDOM)(HCRYPTPROV hProv, DWORD dwLen,\ - BYTE *pbBuffer ); - -static CRYPTGENRANDOM pCryptGenRandom = NULL; -/* This handle is never explicitly released. Instead, the operating - system will release it when the process terminates. */ -static HCRYPTPROV hCryptProv = 0; - -static PyObject* -win32_urandom(PyObject *self, PyObject *args) -{ - int howMany; - PyObject* result; - - /* Read arguments */ - if (! PyArg_ParseTuple(args, "i:urandom", &howMany)) - return NULL; - if (howMany < 0) - return PyErr_Format(PyExc_ValueError, - "negative argument not allowed"); - - if (hCryptProv == 0) { - HINSTANCE hAdvAPI32 = NULL; - CRYPTACQUIRECONTEXTA pCryptAcquireContext = NULL; - - /* Obtain handle to the DLL containing CryptoAPI - This should not fail */ - hAdvAPI32 = GetModuleHandleW(L"advapi32.dll"); - if(hAdvAPI32 == NULL) - return win32_error("GetModuleHandle", NULL); - - /* Obtain pointers to the CryptoAPI functions - This will fail on some early versions of Win95 */ - pCryptAcquireContext = (CRYPTACQUIRECONTEXTA)GetProcAddress( - hAdvAPI32, - "CryptAcquireContextA"); - if (pCryptAcquireContext == NULL) - return PyErr_Format(PyExc_NotImplementedError, - "CryptAcquireContextA not found"); - - pCryptGenRandom = (CRYPTGENRANDOM)GetProcAddress( - hAdvAPI32, "CryptGenRandom"); - if (pCryptGenRandom == NULL) - return PyErr_Format(PyExc_NotImplementedError, - "CryptGenRandom not found"); - - /* Acquire context */ - if (! pCryptAcquireContext(&hCryptProv, NULL, NULL, - PROV_RSA_FULL, CRYPT_VERIFYCONTEXT)) - return win32_error("CryptAcquireContext", NULL); - } - - /* Allocate bytes */ - result = PyBytes_FromStringAndSize(NULL, howMany); - if (result != NULL) { - /* Get random data */ - memset(PyBytes_AS_STRING(result), 0, howMany); /* zero seed */ - if (! pCryptGenRandom(hCryptProv, howMany, (unsigned char*) - PyBytes_AS_STRING(result))) { - Py_DECREF(result); - return win32_error("CryptGenRandom", NULL); - } - } - return result; -} -#endif - PyDoc_STRVAR(device_encoding__doc__, "device_encoding(fd) -> str\n\n\ Return a string describing the encoding of the device\n\ @@ -10490,6 +10414,36 @@ #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; @@ -10984,12 +10938,7 @@ #ifdef HAVE_GETLOADAVG {"getloadavg", posix_getloadavg, METH_NOARGS, posix_getloadavg__doc__}, #endif - #ifdef MS_WINDOWS - {"urandom", win32_urandom, METH_VARARGS, win32_urandom__doc__}, - #endif - #ifdef __VMS - {"urandom", vms_urandom, METH_VARARGS, vms_urandom__doc__}, - #endif + {"urandom", posix_urandom, METH_VARARGS, posix_urandom__doc__}, #ifdef HAVE_SETRESUID {"setresuid", posix_setresuid, METH_VARARGS, posix_setresuid__doc__}, #endif diff --git a/Objects/object.c b/Objects/object.c --- a/Objects/object.c +++ b/Objects/object.c @@ -759,10 +759,19 @@ Py_uhash_t x; Py_ssize_t i; - x = (Py_uhash_t) *p << 7; + /* + 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) { + 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; @@ -776,6 +785,8 @@ return -1; } +_Py_HashSecret_t _Py_HashSecret; + Py_hash_t PyObject_Hash(PyObject *v) { diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -11221,11 +11221,12 @@ len = PyUnicode_GET_LENGTH(self); /* 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++; - +#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); @@ -11246,7 +11247,8 @@ break; } } - x ^= (Py_uhash_t)PyUnicode_GET_LENGTH(self); + x ^= (Py_uhash_t) PyUnicode_GET_LENGTH(self); + x ^= (Py_uhash_t) _Py_HashSecret.suffix; if (x == -1) x = -2; diff --git a/PCbuild/pythoncore.vcproj b/PCbuild/pythoncore.vcproj --- a/PCbuild/pythoncore.vcproj +++ b/PCbuild/pythoncore.vcproj @@ -1890,6 +1890,10 @@ RelativePath="..\Python\pythonrun.c" > + + diff --git a/Python/pythonrun.c b/Python/pythonrun.c --- a/Python/pythonrun.c +++ b/Python/pythonrun.c @@ -73,6 +73,7 @@ extern void PyLong_Fini(void); extern int _PyFaulthandler_Init(void); extern void _PyFaulthandler_Fini(void); +extern void _PyRandom_Init(void); #ifdef WITH_THREAD extern void _PyGILState_Init(PyInterpreterState *, PyThreadState *); @@ -92,6 +93,7 @@ int Py_IgnoreEnvironmentFlag; /* e.g. PYTHONPATH, PYTHONHOME */ int Py_NoUserSiteDirectory = 0; /* for -s and site.py */ int Py_UnbufferedStdioFlag = 0; /* Unbuffered binary std{in,out,err} */ +int Py_HashRandomizationFlag = 0; /* for -R and PYTHONHASHSEED */ PyThreadState *_Py_Finalizing = NULL; @@ -218,6 +220,12 @@ Py_OptimizeFlag = add_flag(Py_OptimizeFlag, p); if ((p = Py_GETENV("PYTHONDONTWRITEBYTECODE")) && *p != '\0') Py_DontWriteBytecodeFlag = add_flag(Py_DontWriteBytecodeFlag, p); + /* The variable is only tested for existence here; _PyRandom_Init will + check its value further. */ + if ((p = Py_GETENV("PYTHONHASHSEED")) && *p != '\0') + Py_HashRandomizationFlag = add_flag(Py_HashRandomizationFlag, p); + + _PyRandom_Init(); interp = PyInterpreterState_New(); if (interp == NULL) diff --git a/Python/random.c b/Python/random.c new file mode 100644 --- /dev/null +++ b/Python/random.c @@ -0,0 +1,302 @@ +#include "Python.h" +#ifdef MS_WINDOWS +#include +#else +#include +#endif + +static int random_initialized = 0; + +#ifdef MS_WINDOWS +typedef BOOL (WINAPI *CRYPTACQUIRECONTEXTA)(HCRYPTPROV *phProv,\ + LPCSTR pszContainer, LPCSTR pszProvider, DWORD dwProvType,\ + DWORD dwFlags ); +typedef BOOL (WINAPI *CRYPTGENRANDOM)(HCRYPTPROV hProv, DWORD dwLen,\ + BYTE *pbBuffer ); + +static CRYPTGENRANDOM pCryptGenRandom = NULL; +/* This handle is never explicitly released. Instead, the operating + system will release it when the process terminates. */ +static HCRYPTPROV hCryptProv = 0; + +static int +win32_urandom_init(int raise) +{ + HINSTANCE hAdvAPI32 = NULL; + CRYPTACQUIRECONTEXTA pCryptAcquireContext = NULL; + + /* Obtain handle to the DLL containing CryptoAPI. This should not fail. */ + hAdvAPI32 = GetModuleHandle("advapi32.dll"); + if(hAdvAPI32 == NULL) + goto error; + + /* Obtain pointers to the CryptoAPI functions. This will fail on some early + versions of Win95. */ + pCryptAcquireContext = (CRYPTACQUIRECONTEXTA)GetProcAddress( + hAdvAPI32, "CryptAcquireContextA"); + if (pCryptAcquireContext == NULL) + goto error; + + pCryptGenRandom = (CRYPTGENRANDOM)GetProcAddress(hAdvAPI32, + "CryptGenRandom"); + if (pCryptGenRandom == NULL) + goto error; + + /* Acquire context */ + if (! pCryptAcquireContext(&hCryptProv, NULL, NULL, + PROV_RSA_FULL, CRYPT_VERIFYCONTEXT)) + goto error; + + return 0; + +error: + if (raise) + PyErr_SetFromWindowsErr(0); + else + Py_FatalError("Failed to initialize Windows random API (CryptoGen)"); + return -1; +} + +/* Fill buffer with size pseudo-random bytes generated by the Windows CryptoGen + API. Return 0 on success, or -1 on error. */ +static int +win32_urandom(unsigned char *buffer, Py_ssize_t size, int raise) +{ + Py_ssize_t chunk; + + if (hCryptProv == 0) + { + if (win32_urandom_init(raise) == -1) + return -1; + } + + while (size > 0) + { + chunk = size > INT_MAX ? INT_MAX : size; + if (!pCryptGenRandom(hCryptProv, chunk, buffer)) + { + /* CryptGenRandom() failed */ + if (raise) + PyErr_SetFromWindowsErr(0); + else + Py_FatalError("Failed to initialized the randomized hash " + "secret using CryptoGen)"); + return -1; + } + buffer += chunk; + size -= chunk; + } + return 0; +} +#endif /* MS_WINDOWS */ + + +#ifdef __VMS +/* Use openssl random routine */ +#include +static int +vms_urandom(unsigned char *buffer, Py_ssize_t size, int raise) +{ + if (RAND_pseudo_bytes(buffer, size) < 0) { + if (raise) { + PyErr_Format(PyExc_ValueError, + "RAND_pseudo_bytes"); + } else { + Py_FatalError("Failed to initialize the randomized hash " + "secret using RAND_pseudo_bytes"); + } + return -1; + } + return 0; +} +#endif /* __VMS */ + + +#if !defined(MS_WINDOWS) && !defined(__VMS) + +/* Read size bytes from /dev/urandom into buffer. + Call Py_FatalError() on error. */ +static void +dev_urandom_noraise(char *buffer, Py_ssize_t size) +{ + int fd; + Py_ssize_t n; + + assert (0 < size); + + fd = open("/dev/urandom", O_RDONLY); + if (fd < 0) + Py_FatalError("Failed to open /dev/urandom"); + + while (0 < size) + { + do { + n = read(fd, buffer, (size_t)size); + } while (n < 0 && errno == EINTR); + if (n <= 0) + { + /* stop on error or if read(size) returned 0 */ + Py_FatalError("Failed to read bytes from /dev/urandom"); + break; + } + buffer += n; + size -= (Py_ssize_t)n; + } + close(fd); +} + +/* Read size bytes from /dev/urandom into buffer. + Return 0 on success, raise an exception and return -1 on error. */ +static int +dev_urandom_python(char *buffer, Py_ssize_t size) +{ + int fd; + Py_ssize_t n; + + if (size <= 0) + return 0; + + Py_BEGIN_ALLOW_THREADS + fd = open("/dev/urandom", O_RDONLY); + Py_END_ALLOW_THREADS + if (fd < 0) + { + PyErr_SetFromErrnoWithFilename(PyExc_OSError, "/dev/urandom"); + return -1; + } + + Py_BEGIN_ALLOW_THREADS + do { + do { + n = read(fd, buffer, (size_t)size); + } while (n < 0 && errno == EINTR); + if (n <= 0) + break; + buffer += n; + size -= (Py_ssize_t)n; + } while (0 < size); + Py_END_ALLOW_THREADS + + if (n <= 0) + { + /* stop on error or if read(size) returned 0 */ + if (n < 0) + PyErr_SetFromErrno(PyExc_OSError); + else + PyErr_Format(PyExc_RuntimeError, + "Failed to read %zi bytes from /dev/urandom", + size); + close(fd); + return -1; + } + close(fd); + return 0; +} +#endif /* !defined(MS_WINDOWS) && !defined(__VMS) */ + +/* Fill buffer with pseudo-random bytes generated by a linear congruent + generator (LCG): + + x(n+1) = (x(n) * 214013 + 2531011) % 2^32 + + Use bits 23..16 of x(n) to generate a byte. */ +static void +lcg_urandom(unsigned int x0, unsigned char *buffer, size_t size) +{ + size_t index; + unsigned int x; + + x = x0; + for (index=0; index < size; index++) { + x *= 214013; + x += 2531011; + /* modulo 2 ^ (8 * sizeof(int)) */ + buffer[index] = (x >> 16) & 0xff; + } +} + +/* Fill buffer with size pseudo-random bytes, not suitable for cryptographic + use, from the operating random number generator (RNG). + + Return 0 on success, raise an exception and return -1 on error. */ +int +_PyOS_URandom(void *buffer, Py_ssize_t size) +{ + if (size < 0) { + PyErr_Format(PyExc_ValueError, + "negative argument not allowed"); + return -1; + } + if (size == 0) + return 0; + +#ifdef MS_WINDOWS + return win32_urandom((unsigned char *)buffer, size, 1); +#else +# ifdef __VMS + return vms_urandom((unsigned char *)buffer, size, 1); +# else + return dev_urandom_python((char*)buffer, size); +# endif +#endif +} + +void +_PyRandom_Init(void) +{ + char *env; + void *secret = &_Py_HashSecret; + Py_ssize_t secret_size = sizeof(_Py_HashSecret); + + if (random_initialized) + return; + random_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. + */ + + env = Py_GETENV("PYTHONHASHSEED"); + if (env && *env != '\0' && strcmp(env, "random") != 0) { + char *endptr = env; + unsigned long seed; + seed = strtoul(env, &endptr, 10); + if (*endptr != '\0' + || seed > 4294967295UL + || (errno == ERANGE && seed == ULONG_MAX)) + { + Py_FatalError("PYTHONHASHSEED must be \"random\" or an integer " + "in range [0; 4294967295]"); + } + if (seed == 0) { + /* disable the randomized hash */ + memset(secret, 0, secret_size); + } + else { + lcg_urandom(seed, (unsigned char*)secret, secret_size); + } + } + else { +#ifdef MS_WINDOWS + (void)win32_urandom((unsigned char *)secret, secret_size, 0); +#else /* #ifdef MS_WINDOWS */ +# ifdef __VMS + vms_urandom((unsigned char *)secret, secret_size, 0); +# else + dev_urandom_noraise((char*)secret, secret_size); +# endif +#endif + } +} diff --git a/Python/sysmodule.c b/Python/sysmodule.c --- a/Python/sysmodule.c +++ b/Python/sysmodule.c @@ -1332,6 +1332,7 @@ /* {"skip_first", "-x"}, */ {"bytes_warning", "-b"}, {"quiet", "-q"}, + {"hash_randomization", "-R"}, {0} }; @@ -1340,9 +1341,9 @@ flags__doc__, /* doc */ flags_fields, /* fields */ #ifdef RISCOS + 13 +#else 12 -#else - 11 #endif }; @@ -1375,6 +1376,7 @@ /* SetFlag(skipfirstline); */ SetFlag(Py_BytesWarningFlag); SetFlag(Py_QuietFlag); + SetFlag(Py_HashRandomizationFlag); #undef SetFlag if (PyErr_Occurred()) { diff --git a/Tools/scripts/run_tests.py b/Tools/scripts/run_tests.py --- a/Tools/scripts/run_tests.py +++ b/Tools/scripts/run_tests.py @@ -25,6 +25,7 @@ '-W', 'default', # Warnings set to 'default' '-bb', # Warnings about bytes/bytearray '-E', # Ignore environment variables + '-R', # Randomize hashing ] # Allow user-specified interpreter options to override our defaults. args.extend(test.support.args_from_interpreter_flags()) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Feb 21 00:37:06 2012 From: python-checkins at python.org (georg.brandl) Date: Tue, 21 Feb 2012 00:37:06 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_3=2E2_-=3E_default=29?= =?utf8?q?=3A_Merge_more_test_vs_hashing-order_fixes_from_3=2E2=2E?= Message-ID: http://hg.python.org/cpython/rev/b0834452ccfb changeset: 75098:b0834452ccfb parent: 75097:ed76dc34b39d parent: 75096:ee89a9eec88e user: Georg Brandl date: Tue Feb 21 00:34:05 2012 +0100 summary: Merge more test vs hashing-order fixes from 3.2. files: Lib/test/test_inspect.py | 3 ++- Lib/test/test_weakset.py | 1 + 2 files changed, 3 insertions(+), 1 deletions(-) diff --git a/Lib/test/test_inspect.py b/Lib/test/test_inspect.py --- a/Lib/test/test_inspect.py +++ b/Lib/test/test_inspect.py @@ -810,7 +810,8 @@ self.assertEqualException(f, '2, 3, 4') self.assertEqualException(f, '1, 2, 3, a=1') self.assertEqualException(f, '2, 3, 4, c=5') - self.assertEqualException(f, '2, 3, 4, a=1, c=5') + # XXX: success of this one depends on dict order + ## self.assertEqualException(f, '2, 3, 4, a=1, c=5') # f got an unexpected keyword argument self.assertEqualException(f, 'c=2') self.assertEqualException(f, '2, c=3') diff --git a/Lib/test/test_weakset.py b/Lib/test/test_weakset.py --- a/Lib/test/test_weakset.py +++ b/Lib/test/test_weakset.py @@ -335,6 +335,7 @@ try: it = iter(s) next(it) + del it # Schedule an item for removal and recreate it u = ustr(str(items.pop())) gc.collect() # just in case -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Feb 21 00:50:47 2012 From: python-checkins at python.org (georg.brandl) Date: Tue, 21 Feb 2012 00:50:47 +0100 Subject: [Python-checkins] =?utf8?q?cpython=3A_Forgot_the_=22empty_string_?= =?utf8?q?-=3E_hash_=3D=3D_0=22_special_case_for_strings=2E?= Message-ID: http://hg.python.org/cpython/rev/4a77887b1ac2 changeset: 75099:4a77887b1ac2 user: Georg Brandl date: Tue Feb 21 00:50:13 2012 +0100 summary: Forgot the "empty string -> hash == 0" special case for strings. files: Objects/unicodeobject.c | 8 ++++++++ 1 files changed, 8 insertions(+), 0 deletions(-) diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -11219,6 +11219,14 @@ 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) { + _PyUnicode_HASH(self) = 0; + return 0; + } /* The hash function as a macro, gets expanded three times below. */ #define HASH(P) \ -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Feb 21 02:16:42 2012 From: python-checkins at python.org (victor.stinner) Date: Tue, 21 Feb 2012 02:16:42 +0100 Subject: [Python-checkins] =?utf8?q?peps=3A_PEP_410=3A_Motivation_=3D=3E_R?= =?utf8?q?ationale?= Message-ID: http://hg.python.org/peps/rev/e45c408eedb2 changeset: 4065:e45c408eedb2 user: Victor Stinner date: Mon Feb 20 23:56:18 2012 +0100 summary: PEP 410: Motivation => Rationale files: pep-0410.txt | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) diff --git a/pep-0410.txt b/pep-0410.txt --- a/pep-0410.txt +++ b/pep-0410.txt @@ -17,8 +17,8 @@ support new functions using a nanosecond resolution without loss of precision. -Motivation -========== +Rationale +========= Python 2.3 introduced float timestamps to support sub-second resolutions. os.stat() uses float timestamps by default since Python 2.5. Python 3.3 -- Repository URL: http://hg.python.org/peps From python-checkins at python.org Tue Feb 21 02:23:13 2012 From: python-checkins at python.org (victor.stinner) Date: Tue, 21 Feb 2012 02:23:13 +0100 Subject: [Python-checkins] =?utf8?q?peps=3A_PEP_410?= Message-ID: http://hg.python.org/peps/rev/20cfaac9c10e changeset: 4066:20cfaac9c10e user: Victor Stinner date: Tue Feb 21 00:02:51 2012 +0100 summary: PEP 410 files: pep-0410.txt | 10 +++++----- 1 files changed, 5 insertions(+), 5 deletions(-) diff --git a/pep-0410.txt b/pep-0410.txt --- a/pep-0410.txt +++ b/pep-0410.txt @@ -97,9 +97,9 @@ Backwards Compatibility ======================= -The default timestamp type is unchanged, so there is no impact on backward -compatibility nor on performances. The new timestamp type, decimal.Decimal, is -only returned when requested explicitly. +The default timestamp type (float) is unchanged, so there is no impact on +backward compatibility nor on performances. The new timestamp type, +decimal.Decimal, is only returned when requested explicitly. Objection: clocks accuracy @@ -124,9 +124,9 @@ To support timestamps with an arbitrary or nanosecond resolution, the following types have been considered: + * decimal.Decimal * number of nanoseconds * 128-bits float - * decimal.Decimal * datetime.datetime * datetime.timedelta * tuple of integers @@ -254,7 +254,7 @@ fixed. The precision can be choose as the loss of precision is smaller than an arbitrary limit like one nanosecond. -Different formats has been proposed: +Different formats have been proposed: * A: (numerator, denominator) -- Repository URL: http://hg.python.org/peps From python-checkins at python.org Tue Feb 21 02:44:32 2012 From: python-checkins at python.org (barry.warsaw) Date: Tue, 21 Feb 2012 02:44:32 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=282=2E6=29=3A_-_Issue_=231370?= =?utf8?q?3=3A_oCERT-2011-003=3A_add_-R_command-line_option_and_PYTHONHASH?= =?utf8?q?SEED?= Message-ID: http://hg.python.org/cpython/rev/6b7704fe1be1 changeset: 75100:6b7704fe1be1 branch: 2.6 parent: 75067:90ec0bc01f3b user: Barry Warsaw date: Mon Feb 20 20:42:21 2012 -0500 summary: - 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. files: Doc/library/sys.rst | 5 + Doc/reference/datamodel.rst | 2 + Doc/using/cmdline.rst | 46 +++- Include/object.h | 6 + Include/pydebug.h | 1 + Include/pythonrun.h | 2 + Lib/os.py | 19 - Lib/test/test_cmd_line.py | 14 + Lib/test/test_hash.py | 100 +++++++- Lib/test/test_os.py | 54 +++- Lib/test/test_set.py | 52 ++++- Lib/test/test_support.py | 12 +- Lib/test/test_symtable.py | 7 +- Lib/test/test_sys.py | 2 +- Makefile.pre.in | 3 +- Misc/NEWS | 5 + Misc/python.man | 29 ++ Modules/main.c | 16 +- Modules/posixmodule.c | 135 +-------- Objects/bufferobject.c | 12 +- Objects/object.c | 2 + Objects/stringobject.c | 12 +- Objects/unicodeobject.c | 12 +- PCbuild/pythoncore.vcproj | 4 + Python/pythonrun.c | 8 + Python/random.c | 302 ++++++++++++++++++++++++ Python/sysmodule.c | 6 +- 27 files changed, 711 insertions(+), 157 deletions(-) diff --git a/Doc/library/sys.rst b/Doc/library/sys.rst --- a/Doc/library/sys.rst +++ b/Doc/library/sys.rst @@ -289,6 +289,11 @@ +------------------------------+------------------------------------------+ | :const:`bytes_warning` | -b | +------------------------------+------------------------------------------+ + +------------------------------+------------------------------------------+ + | :const:`hash_randomization` | -R | + | | | + | | .. versionadded:: 2.6.8 | + +------------------------------+------------------------------------------+ .. versionadded:: 2.6 diff --git a/Doc/reference/datamodel.rst b/Doc/reference/datamodel.rst --- a/Doc/reference/datamodel.rst +++ b/Doc/reference/datamodel.rst @@ -1273,6 +1273,8 @@ modules are still available at the time when the :meth:`__del__` method is called. + See also the :option:`-R` command-line option. + .. method:: object.__repr__(self) diff --git a/Doc/using/cmdline.rst b/Doc/using/cmdline.rst --- a/Doc/using/cmdline.rst +++ b/Doc/using/cmdline.rst @@ -21,7 +21,7 @@ When invoking Python, you may specify any of these options:: - python [-BdEiOQsStuUvVWxX3?] [-c command | -m module-name | script | - ] [args] + python [-BdEiOQsRStuUvVWxX3?] [-c command | -m module-name | script | - ] [args] The most common use case is, of course, a simple invocation of a script:: @@ -239,6 +239,29 @@ :pep:`238` -- Changing the division operator +.. 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. + + 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 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. + + See also :envvar:`PYTHONHASHSEED`. + + .. versionadded:: 2.6.8 + + .. cmdoption:: -s Don't add user site directory to sys.path @@ -501,6 +524,27 @@ .. versionadded:: 2.6 +.. 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 :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 + randomization. + + Its purpose is to allow repeatable hashing, such as for selftests for the + 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. + + .. versionadded:: 2.6.8 + + .. envvar:: PYTHONIOENCODING Overrides the encoding used for stdin/stdout/stderr, in the syntax diff --git a/Include/object.h b/Include/object.h --- a/Include/object.h +++ b/Include/object.h @@ -506,6 +506,12 @@ PyAPI_FUNC(long) _Py_HashDouble(double); PyAPI_FUNC(long) _Py_HashPointer(void*); +typedef struct { + long prefix; + long suffix; +} _Py_HashSecret_t; +PyAPI_DATA(_Py_HashSecret_t) _Py_HashSecret; + /* Helper for passing objects to printf and the like */ #define PyObject_REPR(obj) PyString_AS_STRING(PyObject_Repr(obj)) diff --git a/Include/pydebug.h b/Include/pydebug.h --- a/Include/pydebug.h +++ b/Include/pydebug.h @@ -26,6 +26,7 @@ PyAPI_DATA(int) _Py_QnewFlag; /* Warn about 3.x issues */ PyAPI_DATA(int) Py_Py3kWarningFlag; +PyAPI_DATA(int) Py_HashRandomizationFlag; /* this is a wrapper around getenv() that pays attention to Py_IgnoreEnvironmentFlag. It should be used for getting variables like diff --git a/Include/pythonrun.h b/Include/pythonrun.h --- a/Include/pythonrun.h +++ b/Include/pythonrun.h @@ -168,6 +168,8 @@ PyAPI_FUNC(PyOS_sighandler_t) PyOS_getsig(int); PyAPI_FUNC(PyOS_sighandler_t) PyOS_setsig(int, PyOS_sighandler_t); +/* Random */ +PyAPI_FUNC(int) _PyOS_URandom (void *buffer, Py_ssize_t size); #ifdef __cplusplus } diff --git a/Lib/os.py b/Lib/os.py --- a/Lib/os.py +++ b/Lib/os.py @@ -742,22 +742,3 @@ _make_statvfs_result) except NameError: # statvfs_result may not exist pass - -if not _exists("urandom"): - def urandom(n): - """urandom(n) -> str - - Return a string of n random bytes suitable for cryptographic use. - - """ - try: - _urandomfd = open("/dev/urandom", O_RDONLY) - except (OSError, IOError): - raise NotImplementedError("/dev/urandom (or equivalent) not found") - try: - bs = b"" - while n - len(bs) >= 1: - bs += read(_urandomfd, n - len(bs)) - finally: - close(_urandomfd) - return bs diff --git a/Lib/test/test_cmd_line.py b/Lib/test/test_cmd_line.py --- a/Lib/test/test_cmd_line.py +++ b/Lib/test/test_cmd_line.py @@ -103,6 +103,20 @@ self.exit_code('-c', 'pass'), 0) + def test_hash_randomization(self): + # Verify that -R enables hash randomization: + self.verify_valid_flag('-R') + hashes = [] + for i in range(2): + code = 'print(hash("spam"))' + data = self.start_python('-R', '-c', code) + hashes.append(data) + self.assertNotEqual(hashes[0], hashes[1]) + + # Verify that sys.flags contains hash_randomization + code = 'import sys; print sys.flags' + data = self.start_python('-R', '-c', code) + self.assertTrue('hash_randomization=1' in data) def test_main(): test.test_support.run_unittest(CmdLineTest) diff --git a/Lib/test/test_hash.py b/Lib/test/test_hash.py --- a/Lib/test/test_hash.py +++ b/Lib/test/test_hash.py @@ -3,10 +3,18 @@ # # Also test that hash implementations are inherited as expected +import os +import sys +import struct +import datetime import unittest +import subprocess + from test import test_support from collections import Hashable +IS_64BIT = (struct.calcsize('l') == 8) + class HashEqualityTestCase(unittest.TestCase): @@ -133,10 +141,100 @@ for obj in self.hashes_to_check: self.assertEqual(hash(obj), _default_hash(obj)) +class HashRandomizationTests(unittest.TestCase): + + # Each subclass should define a field "repr_", containing the repr() of + # an object to be tested + + def get_hash_command(self, repr_): + return 'print(hash(%s))' % repr_ + + def get_hash(self, repr_, seed=None): + env = os.environ.copy() + if seed is not None: + env['PYTHONHASHSEED'] = str(seed) + else: + env.pop('PYTHONHASHSEED', None) + cmd_line = [sys.executable, '-c', self.get_hash_command(repr_)] + p = subprocess.Popen(cmd_line, stdin=subprocess.PIPE, + stdout=subprocess.PIPE, stderr=subprocess.STDOUT, + env=env) + out, err = p.communicate() + out = test_support.strip_python_stderr(out) + return int(out.strip()) + + def test_randomized_hash(self): + # two runs should return different hashes + run1 = self.get_hash(self.repr_, seed='random') + run2 = self.get_hash(self.repr_, seed='random') + self.assertNotEqual(run1, run2) + +class StringlikeHashRandomizationTests(HashRandomizationTests): + def test_null_hash(self): + # PYTHONHASHSEED=0 disables the randomized hash + if IS_64BIT: + known_hash_of_obj = 1453079729188098211 + else: + known_hash_of_obj = -1600925533 + + # Randomization is disabled by default: + self.assertEqual(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) + + def test_fixed_hash(self): + # test a fixed seed for the randomized hash + # Note that all types share the same values: + if IS_64BIT: + h = -4410911502303878509 + else: + h = -206076799 + self.assertEqual(self.get_hash(self.repr_, seed=42), h) + +class StrHashRandomizationTests(StringlikeHashRandomizationTests): + repr_ = repr('abc') + + def test_empty_string(self): + self.assertEqual(hash(""), 0) + +class UnicodeHashRandomizationTests(StringlikeHashRandomizationTests): + repr_ = repr(u'abc') + + def test_empty_string(self): + self.assertEqual(hash(u""), 0) + +class BufferHashRandomizationTests(StringlikeHashRandomizationTests): + repr_ = 'buffer("abc")' + + def test_empty_string(self): + self.assertEqual(hash(buffer("")), 0) + +class DatetimeTests(HashRandomizationTests): + def get_hash_command(self, repr_): + return 'import datetime; print(hash(%s))' % repr_ + +class DatetimeDateTests(DatetimeTests): + repr_ = repr(datetime.date(1066, 10, 14)) + +class DatetimeDatetimeTests(DatetimeTests): + repr_ = repr(datetime.datetime(1, 2, 3, 4, 5, 6, 7)) + +class DatetimeTimeTests(DatetimeTests): + repr_ = repr(datetime.time(0)) + + def test_main(): test_support.run_unittest(HashEqualityTestCase, HashInheritanceTestCase, - HashBuiltinsTestCase) + HashBuiltinsTestCase, + StrHashRandomizationTests, + UnicodeHashRandomizationTests, + BufferHashRandomizationTests, + DatetimeDateTests, + DatetimeDatetimeTests, + DatetimeTimeTests) + if __name__ == "__main__": diff --git a/Lib/test/test_os.py b/Lib/test/test_os.py --- a/Lib/test/test_os.py +++ b/Lib/test/test_os.py @@ -6,6 +6,8 @@ import unittest import warnings import sys +import subprocess + from test import test_support warnings.filterwarnings("ignore", "tempnam", RuntimeWarning, __name__) @@ -499,18 +501,46 @@ class URandomTests (unittest.TestCase): def test_urandom(self): - try: - with test_support.check_warnings(): - self.assertEqual(len(os.urandom(1)), 1) - self.assertEqual(len(os.urandom(10)), 10) - self.assertEqual(len(os.urandom(100)), 100) - self.assertEqual(len(os.urandom(1000)), 1000) - # see http://bugs.python.org/issue3708 - self.assertEqual(len(os.urandom(0.9)), 0) - self.assertEqual(len(os.urandom(1.1)), 1) - self.assertEqual(len(os.urandom(2.0)), 2) - except NotImplementedError: - pass + with test_support.check_warnings(): + self.assertEqual(len(os.urandom(1)), 1) + self.assertEqual(len(os.urandom(10)), 10) + self.assertEqual(len(os.urandom(100)), 100) + self.assertEqual(len(os.urandom(1000)), 1000) + # see http://bugs.python.org/issue3708 + self.assertEqual(len(os.urandom(0.9)), 0) + self.assertEqual(len(os.urandom(1.1)), 1) + self.assertEqual(len(os.urandom(2.0)), 2) + + def test_urandom_length(self): + self.assertEqual(len(os.urandom(0)), 0) + self.assertEqual(len(os.urandom(1)), 1) + self.assertEqual(len(os.urandom(10)), 10) + self.assertEqual(len(os.urandom(100)), 100) + self.assertEqual(len(os.urandom(1000)), 1000) + + def test_urandom_value(self): + data1 = os.urandom(16) + data2 = os.urandom(16) + self.assertNotEqual(data1, data2) + + def get_urandom_subprocess(self, count): + code = '\n'.join(( + 'import os, sys', + 'data = os.urandom(%s)' % count, + 'sys.stdout.write(data)', + 'sys.stdout.flush()')) + cmd_line = [sys.executable, '-c', code] + p = subprocess.Popen(cmd_line, stdin=subprocess.PIPE, + stdout=subprocess.PIPE, stderr=subprocess.STDOUT) + out, err = p.communicate() + out = test_support.strip_python_stderr(out) + self.assertEqual(len(out), count) + return out + + def test_urandom_subprocess(self): + data1 = self.get_urandom_subprocess(16) + data2 = self.get_urandom_subprocess(16) + self.assertNotEqual(data1, data2) class Win32ErrorTests(unittest.TestCase): def test_rename(self): diff --git a/Lib/test/test_set.py b/Lib/test/test_set.py --- a/Lib/test/test_set.py +++ b/Lib/test/test_set.py @@ -6,7 +6,6 @@ import operator import copy import pickle -import os from random import randrange, shuffle import sys import collections @@ -688,6 +687,17 @@ if self.repr is not None: self.assertEqual(repr(self.set), self.repr) + def check_repr_against_values(self): + text = repr(self.set) + self.assertTrue(text.startswith('{')) + self.assertTrue(text.endswith('}')) + + result = text[1:-1].split(', ') + result.sort() + sorted_repr_values = [repr(value) for value in self.values] + sorted_repr_values.sort() + self.assertEqual(result, sorted_repr_values) + def test_print(self): fo = open(test_support.TESTFN, "wb") try: @@ -837,6 +847,46 @@ self.length = 3 self.repr = None +#------------------------------------------------------------------------------ + +class TestBasicOpsString(TestBasicOps): + def setUp(self): + self.case = "string set" + self.values = ["a", "b", "c"] + self.set = set(self.values) + self.dup = set(self.values) + self.length = 3 + + def test_repr(self): + self.check_repr_against_values() + +#------------------------------------------------------------------------------ + +class TestBasicOpsUnicode(TestBasicOps): + def setUp(self): + self.case = "unicode set" + self.values = [u"a", u"b", u"c"] + self.set = set(self.values) + self.dup = set(self.values) + self.length = 3 + + def test_repr(self): + self.check_repr_against_values() + +#------------------------------------------------------------------------------ + +class TestBasicOpsMixedStringUnicode(TestBasicOps): + def setUp(self): + self.case = "string and bytes set" + self.values = ["a", "b", u"a", u"b"] + self.set = set(self.values) + self.dup = set(self.values) + self.length = 4 + + def test_repr(self): + with test_support.check_warnings(): + self.check_repr_against_values() + #============================================================================== def baditer(): diff --git a/Lib/test/test_support.py b/Lib/test/test_support.py --- a/Lib/test/test_support.py +++ b/Lib/test/test_support.py @@ -24,7 +24,7 @@ "captured_stdout", "TransientResource", "transient_internet", "run_with_locale", "set_memlimit", "bigmemtest", "bigaddrspacetest", "BasicTestRunner", "run_unittest", "run_doctest", "threading_setup", - "threading_cleanup", "reap_children"] + "threading_cleanup", "reap_children", "strip_python_stderr"] class Error(Exception): """Base class for regression test exceptions.""" @@ -893,3 +893,13 @@ break except: break + +def strip_python_stderr(stderr): + """Strip the stderr of a Python process from potential debug output + emitted by the interpreter. + + 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() + return stderr diff --git a/Lib/test/test_symtable.py b/Lib/test/test_symtable.py --- a/Lib/test/test_symtable.py +++ b/Lib/test/test_symtable.py @@ -105,10 +105,11 @@ def test_function_info(self): func = self.spam - self.assertEqual(func.get_parameters(), ("a", "b", "kw", "var")) - self.assertEqual(func.get_locals(), + self.assertEqual( + tuple(sorted(func.get_parameters())), ("a", "b", "kw", "var")) + self.assertEqual(tuple(sorted(func.get_locals())), ("a", "b", "bar", "internal", "kw", "var", "x")) - self.assertEqual(func.get_globals(), ("bar", "glob")) + self.assertEqual(tuple(sorted(func.get_globals())), ("bar", "glob")) self.assertEqual(self.internal.get_frees(), ("x",)) def test_globals(self): diff --git a/Lib/test/test_sys.py b/Lib/test/test_sys.py --- a/Lib/test/test_sys.py +++ b/Lib/test/test_sys.py @@ -384,7 +384,7 @@ attrs = ("debug", "py3k_warning", "division_warning", "division_new", "inspect", "interactive", "optimize", "dont_write_bytecode", "no_site", "ignore_environment", "tabcheck", "verbose", - "unicode", "bytes_warning") + "unicode", "bytes_warning", "hash_randomization") for attr in attrs: self.assert_(hasattr(sys.flags, attr), attr) self.assertEqual(type(getattr(sys.flags, attr)), int, attr) diff --git a/Makefile.pre.in b/Makefile.pre.in --- a/Makefile.pre.in +++ b/Makefile.pre.in @@ -280,6 +280,7 @@ Python/pymath.o \ Python/pystate.o \ Python/pythonrun.o \ + Python/random.o \ Python/structmember.o \ Python/symtable.o \ Python/sysmodule.o \ @@ -708,7 +709,7 @@ - at if which pybuildbot.identify >/dev/null 2>&1; then \ pybuildbot.identify "CC='$(CC)'" "CXX='$(CXX)'"; \ fi - $(TESTPYTHON) $(TESTPROG) -uall -rw $(TESTOPTS) + $(TESTPYTHON) -R $(TESTPROG) -uall -rw $(TESTOPTS) QUICKTESTOPTS= $(TESTOPTS) -x test_thread test_signal test_strftime \ test_unicodedata test_re test_sre test_select test_poll \ diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -10,6 +10,11 @@ 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. + Library ------- diff --git a/Misc/python.man b/Misc/python.man --- a/Misc/python.man +++ b/Misc/python.man @@ -34,6 +34,9 @@ .B \-O0 ] [ +.B \-R +] +[ .B -Q .I argument ] @@ -151,6 +154,18 @@ .B \-O0 Discard docstrings in addition to the \fB-O\fP optimizations. .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 insertion, 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 @@ -411,6 +426,20 @@ If this is set to a non-empty string it is equivalent to specifying the \fB\-v\fP option. If set to an integer, it is equivalent to specifying \fB\-v\fP multiple times. +.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 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 +purpose is to allow repeatable hashing, such as for selftests for the +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. .SH AUTHOR The Python Software Foundation: http://www.python.org/psf .SH INTERNET RESOURCES diff --git a/Modules/main.c b/Modules/main.c --- a/Modules/main.c +++ b/Modules/main.c @@ -40,7 +40,7 @@ static int orig_argc; /* command line options */ -#define BASE_OPTS "3bBc:dEhiJm:OQ:sStuUvVW:xX?" +#define BASE_OPTS "3bBc:dEhiJm:OQ:RsStuUvVW:xX?" #ifndef RISCOS #define PROGRAM_OPTS BASE_OPTS @@ -71,6 +71,9 @@ -m mod : run library module as a script (terminates option list)\n\ -O : optimize generated bytecode slightly; also PYTHONOPTIMIZE=x\n\ -OO : remove doc-strings in addition to the -O optimizations\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 defense against denial-of-service attacks\n\ -Q arg : division options: -Qold (default), -Qwarn, -Qwarnall, -Qnew\n\ -s : don't add user site directory to sys.path; also PYTHONNOUSERSITE\n\ -S : don't imply 'import site' on initialization\n\ @@ -101,6 +104,12 @@ PYTHONCASEOK : ignore case in 'import' statements (Windows).\n\ PYTHONIOENCODING: Encoding[:errors] used for stdin/stdout/stderr.\n\ "; +static char *usage_6 = "\ +PYTHONHASHSEED: if this variable is set to ``random``, the effect is the same \n\ + as specifying the :option:`-R` option: a random value is used to seed the\n\ + hashes of 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\ +"; static int @@ -117,6 +126,7 @@ fputs(usage_3, f); fprintf(f, usage_4, DELIM); fprintf(f, usage_5, DELIM, PYTHONHOMEHELP); + fputs(usage_6, f); } #if defined(__VMS) if (exitcode == 0) { @@ -388,6 +398,10 @@ PySys_AddWarnOption(_PyOS_optarg); break; + case 'R': + Py_HashRandomizationFlag++; + break; + /* This space reserved for other options */ default: diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c --- a/Modules/posixmodule.c +++ b/Modules/posixmodule.c @@ -8371,117 +8371,35 @@ } #endif -#ifdef MS_WINDOWS - -PyDoc_STRVAR(win32_urandom__doc__, +PyDoc_STRVAR(posix_urandom__doc__, "urandom(n) -> str\n\n\ -Return a string of n random bytes suitable for cryptographic use."); - -typedef BOOL (WINAPI *CRYPTACQUIRECONTEXTA)(HCRYPTPROV *phProv,\ - LPCSTR pszContainer, LPCSTR pszProvider, DWORD dwProvType,\ - DWORD dwFlags ); -typedef BOOL (WINAPI *CRYPTGENRANDOM)(HCRYPTPROV hProv, DWORD dwLen,\ - BYTE *pbBuffer ); - -static CRYPTGENRANDOM pCryptGenRandom = NULL; -/* This handle is never explicitly released. Instead, the operating - system will release it when the process terminates. */ -static HCRYPTPROV hCryptProv = 0; - -static PyObject* -win32_urandom(PyObject *self, PyObject *args) -{ - int howMany; - PyObject* result; - - /* Read arguments */ - if (! PyArg_ParseTuple(args, "i:urandom", &howMany)) - return NULL; - if (howMany < 0) +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"); - - if (hCryptProv == 0) { - HINSTANCE hAdvAPI32 = NULL; - CRYPTACQUIRECONTEXTA pCryptAcquireContext = NULL; - - /* Obtain handle to the DLL containing CryptoAPI - This should not fail */ - hAdvAPI32 = GetModuleHandle("advapi32.dll"); - if(hAdvAPI32 == NULL) - return win32_error("GetModuleHandle", NULL); - - /* Obtain pointers to the CryptoAPI functions - This will fail on some early versions of Win95 */ - pCryptAcquireContext = (CRYPTACQUIRECONTEXTA)GetProcAddress( - hAdvAPI32, - "CryptAcquireContextA"); - if (pCryptAcquireContext == NULL) - return PyErr_Format(PyExc_NotImplementedError, - "CryptAcquireContextA not found"); - - pCryptGenRandom = (CRYPTGENRANDOM)GetProcAddress( - hAdvAPI32, "CryptGenRandom"); - if (pCryptGenRandom == NULL) - return PyErr_Format(PyExc_NotImplementedError, - "CryptGenRandom not found"); - - /* Acquire context */ - if (! pCryptAcquireContext(&hCryptProv, NULL, NULL, - PROV_RSA_FULL, CRYPT_VERIFYCONTEXT)) - return win32_error("CryptAcquireContext", NULL); - } - - /* Allocate bytes */ - result = PyString_FromStringAndSize(NULL, howMany); - if (result != NULL) { - /* Get random data */ - memset(PyString_AS_STRING(result), 0, howMany); /* zero seed */ - if (! pCryptGenRandom(hCryptProv, howMany, (unsigned char*) - PyString_AS_STRING(result))) { - Py_DECREF(result); - return win32_error("CryptGenRandom", NULL); - } + 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; } -#endif - -#ifdef __VMS -/* Use openssl random routine */ -#include -PyDoc_STRVAR(vms_urandom__doc__, -"urandom(n) -> str\n\n\ -Return a string of n random bytes suitable for cryptographic use."); - -static PyObject* -vms_urandom(PyObject *self, PyObject *args) -{ - int howMany; - PyObject* result; - - /* Read arguments */ - if (! PyArg_ParseTuple(args, "i:urandom", &howMany)) - return NULL; - if (howMany < 0) - return PyErr_Format(PyExc_ValueError, - "negative argument not allowed"); - - /* Allocate bytes */ - result = PyString_FromStringAndSize(NULL, howMany); - if (result != NULL) { - /* Get random data */ - if (RAND_pseudo_bytes((unsigned char*) - PyString_AS_STRING(result), - howMany) < 0) { - Py_DECREF(result); - return PyErr_Format(PyExc_ValueError, - "RAND_pseudo_bytes"); - } - } - return result; -} -#endif static PyMethodDef posix_methods[] = { {"access", posix_access, METH_VARARGS, posix_access__doc__}, @@ -8787,12 +8705,7 @@ #ifdef HAVE_GETLOADAVG {"getloadavg", posix_getloadavg, METH_NOARGS, posix_getloadavg__doc__}, #endif - #ifdef MS_WINDOWS - {"urandom", win32_urandom, METH_VARARGS, win32_urandom__doc__}, - #endif - #ifdef __VMS - {"urandom", vms_urandom, METH_VARARGS, vms_urandom__doc__}, - #endif + {"urandom", posix_urandom, METH_VARARGS, posix_urandom__doc__}, {NULL, NULL} /* Sentinel */ }; diff --git a/Objects/bufferobject.c b/Objects/bufferobject.c --- a/Objects/bufferobject.c +++ b/Objects/bufferobject.c @@ -334,10 +334,20 @@ return -1; p = (unsigned char *) ptr; len = size; - x = *p << 7; + /* + We make the hash of the empty buffer be 0, rather than using + (prefix ^ suffix), since this slightly obfuscates the hash secret + */ + if (len == 0) { + self->b_hash = 0; + return 0; + } + x = _Py_HashSecret.prefix; + x ^= *p << 7; while (--len >= 0) x = (1000003*x) ^ *p++; x ^= size; + x ^= _Py_HashSecret.suffix; if (x == -1) x = -2; self->b_hash = x; diff --git a/Objects/object.c b/Objects/object.c --- a/Objects/object.c +++ b/Objects/object.c @@ -1101,6 +1101,8 @@ return -1; } +_Py_HashSecret_t _Py_HashSecret; + long PyObject_Hash(PyObject *v) { diff --git a/Objects/stringobject.c b/Objects/stringobject.c --- a/Objects/stringobject.c +++ b/Objects/stringobject.c @@ -1212,11 +1212,21 @@ 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 = *p << 7; + x = _Py_HashSecret.prefix; + x ^= *p << 7; while (--len >= 0) x = (1000003*x) ^ *p++; x ^= Py_SIZE(a); + x ^= _Py_HashSecret.suffix; if (x == -1) x = -2; a->ob_shash = x; diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -6695,11 +6695,21 @@ if (self->hash != -1) return self->hash; len = PyUnicode_GET_SIZE(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; + return 0; + } p = PyUnicode_AS_UNICODE(self); - x = *p << 7; + x = _Py_HashSecret.prefix; + x ^= *p << 7; while (--len >= 0) x = (1000003*x) ^ *p++; x ^= PyUnicode_GET_SIZE(self); + x ^= _Py_HashSecret.suffix; if (x == -1) x = -2; self->hash = x; diff --git a/PCbuild/pythoncore.vcproj b/PCbuild/pythoncore.vcproj --- a/PCbuild/pythoncore.vcproj +++ b/PCbuild/pythoncore.vcproj @@ -1779,6 +1779,10 @@ > + + diff --git a/Python/pythonrun.c b/Python/pythonrun.c --- a/Python/pythonrun.c +++ b/Python/pythonrun.c @@ -67,6 +67,7 @@ static void call_ll_exitfuncs(void); extern void _PyUnicode_Init(void); extern void _PyUnicode_Fini(void); +extern void _PyRandom_Init(void); #ifdef WITH_THREAD extern void _PyGILState_Init(PyInterpreterState *, PyThreadState *); @@ -89,6 +90,7 @@ true divisions (which they will be in 2.3). */ int _Py_QnewFlag = 0; int Py_NoUserSiteDirectory = 0; /* for -s and site.py */ +int Py_HashRandomizationFlag = 0; /* for -R and PYTHONHASHSEED */ /* PyModule_GetWarningsModule is no longer necessary as of 2.6 since _warnings is builtin. This API should not be used. */ @@ -166,6 +168,12 @@ Py_OptimizeFlag = add_flag(Py_OptimizeFlag, p); if ((p = Py_GETENV("PYTHONDONTWRITEBYTECODE")) && *p != '\0') Py_DontWriteBytecodeFlag = add_flag(Py_DontWriteBytecodeFlag, p); + /* The variable is only tested for existence here; _PyRandom_Init will + check its value further. */ + if ((p = Py_GETENV("PYTHONHASHSEED")) && *p != '\0') + Py_HashRandomizationFlag = add_flag(Py_HashRandomizationFlag, p); + + _PyRandom_Init(); interp = PyInterpreterState_New(); if (interp == NULL) diff --git a/Python/random.c b/Python/random.c new file mode 100644 --- /dev/null +++ b/Python/random.c @@ -0,0 +1,302 @@ +#include "Python.h" +#ifdef MS_WINDOWS +#include +#else +#include +#endif + +static int random_initialized = 0; + +#ifdef MS_WINDOWS +typedef BOOL (WINAPI *CRYPTACQUIRECONTEXTA)(HCRYPTPROV *phProv,\ + LPCSTR pszContainer, LPCSTR pszProvider, DWORD dwProvType,\ + DWORD dwFlags ); +typedef BOOL (WINAPI *CRYPTGENRANDOM)(HCRYPTPROV hProv, DWORD dwLen,\ + BYTE *pbBuffer ); + +static CRYPTGENRANDOM pCryptGenRandom = NULL; +/* This handle is never explicitly released. Instead, the operating + system will release it when the process terminates. */ +static HCRYPTPROV hCryptProv = 0; + +static int +win32_urandom_init(int raise) +{ + HINSTANCE hAdvAPI32 = NULL; + CRYPTACQUIRECONTEXTA pCryptAcquireContext = NULL; + + /* Obtain handle to the DLL containing CryptoAPI. This should not fail. */ + hAdvAPI32 = GetModuleHandle("advapi32.dll"); + if(hAdvAPI32 == NULL) + goto error; + + /* Obtain pointers to the CryptoAPI functions. This will fail on some early + versions of Win95. */ + pCryptAcquireContext = (CRYPTACQUIRECONTEXTA)GetProcAddress( + hAdvAPI32, "CryptAcquireContextA"); + if (pCryptAcquireContext == NULL) + goto error; + + pCryptGenRandom = (CRYPTGENRANDOM)GetProcAddress(hAdvAPI32, + "CryptGenRandom"); + if (pCryptGenRandom == NULL) + goto error; + + /* Acquire context */ + if (! pCryptAcquireContext(&hCryptProv, NULL, NULL, + PROV_RSA_FULL, CRYPT_VERIFYCONTEXT)) + goto error; + + return 0; + +error: + if (raise) + PyErr_SetFromWindowsErr(0); + else + Py_FatalError("Failed to initialize Windows random API (CryptoGen)"); + return -1; +} + +/* Fill buffer with size pseudo-random bytes generated by the Windows CryptoGen + API. Return 0 on success, or -1 on error. */ +static int +win32_urandom(unsigned char *buffer, Py_ssize_t size, int raise) +{ + Py_ssize_t chunk; + + if (hCryptProv == 0) + { + if (win32_urandom_init(raise) == -1) + return -1; + } + + while (size > 0) + { + chunk = size > INT_MAX ? INT_MAX : size; + if (!pCryptGenRandom(hCryptProv, chunk, buffer)) + { + /* CryptGenRandom() failed */ + if (raise) + PyErr_SetFromWindowsErr(0); + else + Py_FatalError("Failed to initialized the randomized hash " + "secret using CryptoGen)"); + return -1; + } + buffer += chunk; + size -= chunk; + } + return 0; +} +#endif /* MS_WINDOWS */ + + +#ifdef __VMS +/* Use openssl random routine */ +#include +static int +vms_urandom(unsigned char *buffer, Py_ssize_t size, int raise) +{ + if (RAND_pseudo_bytes(buffer, size) < 0) { + if (raise) { + PyErr_Format(PyExc_ValueError, + "RAND_pseudo_bytes"); + } else { + Py_FatalError("Failed to initialize the randomized hash " + "secret using RAND_pseudo_bytes"); + } + return -1; + } + return 0; +} +#endif /* __VMS */ + + +#if !defined(MS_WINDOWS) && !defined(__VMS) + +/* Read size bytes from /dev/urandom into buffer. + Call Py_FatalError() on error. */ +static void +dev_urandom_noraise(char *buffer, Py_ssize_t size) +{ + int fd; + Py_ssize_t n; + + assert (0 < size); + + fd = open("/dev/urandom", O_RDONLY); + if (fd < 0) + Py_FatalError("Failed to open /dev/urandom"); + + while (0 < size) + { + do { + n = read(fd, buffer, (size_t)size); + } while (n < 0 && errno == EINTR); + if (n <= 0) + { + /* stop on error or if read(size) returned 0 */ + Py_FatalError("Failed to read bytes from /dev/urandom"); + break; + } + buffer += n; + size -= (Py_ssize_t)n; + } + close(fd); +} + +/* Read size bytes from /dev/urandom into buffer. + Return 0 on success, raise an exception and return -1 on error. */ +static int +dev_urandom_python(char *buffer, Py_ssize_t size) +{ + int fd; + Py_ssize_t n; + + if (size <= 0) + return 0; + + Py_BEGIN_ALLOW_THREADS + fd = open("/dev/urandom", O_RDONLY); + Py_END_ALLOW_THREADS + if (fd < 0) + { + PyErr_SetFromErrnoWithFilename(PyExc_OSError, "/dev/urandom"); + return -1; + } + + Py_BEGIN_ALLOW_THREADS + do { + do { + n = read(fd, buffer, (size_t)size); + } while (n < 0 && errno == EINTR); + if (n <= 0) + break; + buffer += n; + size -= (Py_ssize_t)n; + } while (0 < size); + Py_END_ALLOW_THREADS + + if (n <= 0) + { + /* stop on error or if read(size) returned 0 */ + if (n < 0) + PyErr_SetFromErrno(PyExc_OSError); + else + PyErr_Format(PyExc_RuntimeError, + "Failed to read %zi bytes from /dev/urandom", + size); + close(fd); + return -1; + } + close(fd); + return 0; +} +#endif /* !defined(MS_WINDOWS) && !defined(__VMS) */ + +/* Fill buffer with pseudo-random bytes generated by a linear congruent + generator (LCG): + + x(n+1) = (x(n) * 214013 + 2531011) % 2^32 + + Use bits 23..16 of x(n) to generate a byte. */ +static void +lcg_urandom(unsigned int x0, unsigned char *buffer, size_t size) +{ + size_t index; + unsigned int x; + + x = x0; + for (index=0; index < size; index++) { + x *= 214013; + x += 2531011; + /* modulo 2 ^ (8 * sizeof(int)) */ + buffer[index] = (x >> 16) & 0xff; + } +} + +/* Fill buffer with size pseudo-random bytes, not suitable for cryptographic + use, from the operating random number generator (RNG). + + Return 0 on success, raise an exception and return -1 on error. */ +int +_PyOS_URandom(void *buffer, Py_ssize_t size) +{ + if (size < 0) { + PyErr_Format(PyExc_ValueError, + "negative argument not allowed"); + return -1; + } + if (size == 0) + return 0; + +#ifdef MS_WINDOWS + return win32_urandom((unsigned char *)buffer, size, 1); +#else +# ifdef __VMS + return vms_urandom((unsigned char *)buffer, size, 1); +# else + return dev_urandom_python((char*)buffer, size); +# endif +#endif +} + +void +_PyRandom_Init(void) +{ + char *env; + void *secret = &_Py_HashSecret; + Py_ssize_t secret_size = sizeof(_Py_HashSecret); + + if (random_initialized) + return; + random_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. + */ + + env = Py_GETENV("PYTHONHASHSEED"); + if (env && *env != '\0' && strcmp(env, "random") != 0) { + char *endptr = env; + unsigned long seed; + seed = strtoul(env, &endptr, 10); + if (*endptr != '\0' + || seed > 4294967295UL + || (errno == ERANGE && seed == ULONG_MAX)) + { + Py_FatalError("PYTHONHASHSEED must be \"random\" or an integer " + "in range [0; 4294967295]"); + } + if (seed == 0) { + /* disable the randomized hash */ + memset(secret, 0, secret_size); + } + else { + lcg_urandom(seed, (unsigned char*)secret, secret_size); + } + } + else { +#ifdef MS_WINDOWS + (void)win32_urandom((unsigned char *)secret, secret_size, 0); +#else /* #ifdef MS_WINDOWS */ +# ifdef __VMS + vms_urandom((unsigned char *)secret, secret_size, 0); +# else + dev_urandom_noraise((char*)secret, secret_size); +# endif +#endif + } +} diff --git a/Python/sysmodule.c b/Python/sysmodule.c --- a/Python/sysmodule.c +++ b/Python/sysmodule.c @@ -1224,6 +1224,7 @@ {"unicode", "-U"}, /* {"skip_first", "-x"}, */ {"bytes_warning", "-b"}, + {"hash_randomization", "-R"}, {0} }; @@ -1232,9 +1233,9 @@ flags__doc__, /* doc */ flags_fields, /* fields */ #ifdef RISCOS + 17 +#else 16 -#else - 15 #endif }; @@ -1271,6 +1272,7 @@ SetFlag(Py_UnicodeFlag); /* SetFlag(skipfirstline); */ SetFlag(Py_BytesWarningFlag); + SetFlag(Py_HashRandomizationFlag); #undef SetFlag if (PyErr_Occurred()) { -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Feb 21 02:44:32 2012 From: python-checkins at python.org (barry.warsaw) Date: Tue, 21 Feb 2012 02:44:32 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=282=2E6=29=3A_Whitespace_norm?= =?utf8?q?alization?= Message-ID: http://hg.python.org/cpython/rev/19e6e55f09f3 changeset: 75101:19e6e55f09f3 branch: 2.6 user: Barry Warsaw date: Mon Feb 20 20:44:15 2012 -0500 summary: Whitespace normalization files: Lib/test/test_hash.py | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Lib/test/test_hash.py b/Lib/test/test_hash.py --- a/Lib/test/test_hash.py +++ b/Lib/test/test_hash.py @@ -234,7 +234,7 @@ DatetimeDateTests, DatetimeDatetimeTests, DatetimeTimeTests) - + if __name__ == "__main__": -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Feb 21 03:49:13 2012 From: python-checkins at python.org (benjamin.peterson) Date: Tue, 21 Feb 2012 03:49:13 +0100 Subject: [Python-checkins] =?utf8?b?Y3B5dGhvbiAobWVyZ2UgMi42IC0+IDIuNyk6?= =?utf8?q?_merge_2=2E6_with_hash_randomization_fix?= Message-ID: http://hg.python.org/cpython/rev/a0f43f4481e0 changeset: 75102:a0f43f4481e0 branch: 2.7 parent: 75072:2e8b28dbc395 parent: 75101:19e6e55f09f3 user: Benjamin Peterson date: Mon Feb 20 21:44:56 2012 -0500 summary: merge 2.6 with hash randomization fix files: Doc/library/sys.rst | 1 + Doc/reference/datamodel.rst | 2 + Doc/using/cmdline.rst | 46 +- Include/object.h | 6 + Include/pydebug.h | 1 + Include/pythonrun.h | 2 + Lib/os.py | 19 - Lib/test/test_cmd_line.py | 14 + Lib/test/test_hash.py | 100 +- Lib/test/test_os.py | 38 +- Lib/test/test_set.py | 51 + Lib/test/test_support.py | 4 +- Lib/test/test_sys.py | 2 +- Makefile.pre.in | 3 +- Misc/NEWS | 5 + Misc/python.man | 29 + Modules/main.c | 16 +- Modules/posixmodule.c | 136 +- Objects/bufferobject.c | 12 +- Objects/object.c | 2 + Objects/stringobject.c | 12 +- Objects/unicodeobject.c | 12 +- PCbuild/pythoncore.vcproj | 1824 +++++++++++++++++++++++ Python/pythonrun.c | 8 + Python/random.c | 302 +++ Python/sysmodule.c | 6 +- 26 files changed, 2508 insertions(+), 145 deletions(-) diff --git a/Doc/library/sys.rst b/Doc/library/sys.rst --- a/Doc/library/sys.rst +++ b/Doc/library/sys.rst @@ -286,6 +286,7 @@ :const:`verbose` :option:`-v` :const:`unicode` :option:`-U` :const:`bytes_warning` :option:`-b` + :const:`hash_randomization` :option:`-R` ============================= =================================== .. versionadded:: 2.6 diff --git a/Doc/reference/datamodel.rst b/Doc/reference/datamodel.rst --- a/Doc/reference/datamodel.rst +++ b/Doc/reference/datamodel.rst @@ -1282,6 +1282,8 @@ modules are still available at the time when the :meth:`__del__` method is called. + See also the :option:`-R` command-line option. + .. method:: object.__repr__(self) diff --git a/Doc/using/cmdline.rst b/Doc/using/cmdline.rst --- a/Doc/using/cmdline.rst +++ b/Doc/using/cmdline.rst @@ -24,7 +24,7 @@ When invoking Python, you may specify any of these options:: - python [-BdEiOQsStuUvVWxX3?] [-c command | -m module-name | script | - ] [args] + python [-BdEiOQsRStuUvVWxX3?] [-c command | -m module-name | script | - ] [args] The most common use case is, of course, a simple invocation of a script:: @@ -253,6 +253,29 @@ :pep:`238` -- Changing the division operator +.. 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. + + 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 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. + + See also :envvar:`PYTHONHASHSEED`. + + .. versionadded:: 2.6.8 + + .. cmdoption:: -s Don't add the :data:`user site-packages directory ` to @@ -522,6 +545,27 @@ .. versionadded:: 2.6 +.. 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 :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 + randomization. + + Its purpose is to allow repeatable hashing, such as for selftests for the + 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. + + .. versionadded:: 2.6.8 + + .. envvar:: PYTHONIOENCODING Overrides the encoding used for stdin/stdout/stderr, in the syntax diff --git a/Include/object.h b/Include/object.h --- a/Include/object.h +++ b/Include/object.h @@ -517,6 +517,12 @@ PyAPI_FUNC(long) _Py_HashDouble(double); PyAPI_FUNC(long) _Py_HashPointer(void*); +typedef struct { + long prefix; + long suffix; +} _Py_HashSecret_t; +PyAPI_DATA(_Py_HashSecret_t) _Py_HashSecret; + /* Helper for passing objects to printf and the like */ #define PyObject_REPR(obj) PyString_AS_STRING(PyObject_Repr(obj)) diff --git a/Include/pydebug.h b/Include/pydebug.h --- a/Include/pydebug.h +++ b/Include/pydebug.h @@ -26,6 +26,7 @@ PyAPI_DATA(int) _Py_QnewFlag; /* Warn about 3.x issues */ PyAPI_DATA(int) Py_Py3kWarningFlag; +PyAPI_DATA(int) Py_HashRandomizationFlag; /* this is a wrapper around getenv() that pays attention to Py_IgnoreEnvironmentFlag. It should be used for getting variables like diff --git a/Include/pythonrun.h b/Include/pythonrun.h --- a/Include/pythonrun.h +++ b/Include/pythonrun.h @@ -171,6 +171,8 @@ PyAPI_FUNC(PyOS_sighandler_t) PyOS_getsig(int); PyAPI_FUNC(PyOS_sighandler_t) PyOS_setsig(int, PyOS_sighandler_t); +/* Random */ +PyAPI_FUNC(int) _PyOS_URandom (void *buffer, Py_ssize_t size); #ifdef __cplusplus } diff --git a/Lib/os.py b/Lib/os.py --- a/Lib/os.py +++ b/Lib/os.py @@ -738,22 +738,3 @@ _make_statvfs_result) except NameError: # statvfs_result may not exist pass - -if not _exists("urandom"): - def urandom(n): - """urandom(n) -> str - - Return a string of n random bytes suitable for cryptographic use. - - """ - try: - _urandomfd = open("/dev/urandom", O_RDONLY) - except (OSError, IOError): - raise NotImplementedError("/dev/urandom (or equivalent) not found") - try: - bs = b"" - while n > len(bs): - bs += read(_urandomfd, n - len(bs)) - finally: - close(_urandomfd) - return bs diff --git a/Lib/test/test_cmd_line.py b/Lib/test/test_cmd_line.py --- a/Lib/test/test_cmd_line.py +++ b/Lib/test/test_cmd_line.py @@ -86,6 +86,20 @@ self.exit_code('-c', 'pass'), 0) + def test_hash_randomization(self): + # Verify that -R enables hash randomization: + self.verify_valid_flag('-R') + hashes = [] + for i in range(2): + code = 'print(hash("spam"))' + data = self.start_python('-R', '-c', code) + hashes.append(data) + self.assertNotEqual(hashes[0], hashes[1]) + + # Verify that sys.flags contains hash_randomization + code = 'import sys; print sys.flags' + data = self.start_python('-R', '-c', code) + self.assertTrue('hash_randomization=1' in data) def test_main(): test.test_support.run_unittest(CmdLineTest) diff --git a/Lib/test/test_hash.py b/Lib/test/test_hash.py --- a/Lib/test/test_hash.py +++ b/Lib/test/test_hash.py @@ -3,10 +3,18 @@ # # Also test that hash implementations are inherited as expected +import os +import sys +import struct +import datetime import unittest +import subprocess + from test import test_support from collections import Hashable +IS_64BIT = (struct.calcsize('l') == 8) + class HashEqualityTestCase(unittest.TestCase): @@ -134,10 +142,100 @@ for obj in self.hashes_to_check: self.assertEqual(hash(obj), _default_hash(obj)) +class HashRandomizationTests(unittest.TestCase): + + # Each subclass should define a field "repr_", containing the repr() of + # an object to be tested + + def get_hash_command(self, repr_): + return 'print(hash(%s))' % repr_ + + def get_hash(self, repr_, seed=None): + env = os.environ.copy() + if seed is not None: + env['PYTHONHASHSEED'] = str(seed) + else: + env.pop('PYTHONHASHSEED', None) + cmd_line = [sys.executable, '-c', self.get_hash_command(repr_)] + p = subprocess.Popen(cmd_line, stdin=subprocess.PIPE, + stdout=subprocess.PIPE, stderr=subprocess.STDOUT, + env=env) + out, err = p.communicate() + out = test_support.strip_python_stderr(out) + return int(out.strip()) + + def test_randomized_hash(self): + # two runs should return different hashes + run1 = self.get_hash(self.repr_, seed='random') + run2 = self.get_hash(self.repr_, seed='random') + self.assertNotEqual(run1, run2) + +class StringlikeHashRandomizationTests(HashRandomizationTests): + def test_null_hash(self): + # PYTHONHASHSEED=0 disables the randomized hash + if IS_64BIT: + known_hash_of_obj = 1453079729188098211 + else: + known_hash_of_obj = -1600925533 + + # Randomization is disabled by default: + self.assertEqual(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) + + def test_fixed_hash(self): + # test a fixed seed for the randomized hash + # Note that all types share the same values: + if IS_64BIT: + h = -4410911502303878509 + else: + h = -206076799 + self.assertEqual(self.get_hash(self.repr_, seed=42), h) + +class StrHashRandomizationTests(StringlikeHashRandomizationTests): + repr_ = repr('abc') + + def test_empty_string(self): + self.assertEqual(hash(""), 0) + +class UnicodeHashRandomizationTests(StringlikeHashRandomizationTests): + repr_ = repr(u'abc') + + def test_empty_string(self): + self.assertEqual(hash(u""), 0) + +class BufferHashRandomizationTests(StringlikeHashRandomizationTests): + repr_ = 'buffer("abc")' + + def test_empty_string(self): + self.assertEqual(hash(buffer("")), 0) + +class DatetimeTests(HashRandomizationTests): + def get_hash_command(self, repr_): + return 'import datetime; print(hash(%s))' % repr_ + +class DatetimeDateTests(DatetimeTests): + repr_ = repr(datetime.date(1066, 10, 14)) + +class DatetimeDatetimeTests(DatetimeTests): + repr_ = repr(datetime.datetime(1, 2, 3, 4, 5, 6, 7)) + +class DatetimeTimeTests(DatetimeTests): + repr_ = repr(datetime.time(0)) + + def test_main(): test_support.run_unittest(HashEqualityTestCase, HashInheritanceTestCase, - HashBuiltinsTestCase) + HashBuiltinsTestCase, + StrHashRandomizationTests, + UnicodeHashRandomizationTests, + BufferHashRandomizationTests, + DatetimeDateTests, + DatetimeDatetimeTests, + DatetimeTimeTests) + if __name__ == "__main__": diff --git a/Lib/test/test_os.py b/Lib/test/test_os.py --- a/Lib/test/test_os.py +++ b/Lib/test/test_os.py @@ -10,6 +10,7 @@ import signal import subprocess import time + from test import test_support import mmap import uuid @@ -536,8 +537,41 @@ self.assertRaises(TypeError, os.urandom, 0.9) self.assertRaises(TypeError, os.urandom, 1.1) self.assertRaises(TypeError, os.urandom, 2.0) - except NotImplementedError: - pass + self.assertEqual(len(os.urandom(0.9)), 0) + self.assertEqual(len(os.urandom(1.1)), 1) + self.assertEqual(len(os.urandom(2.0)), 2) + + def test_urandom_length(self): + self.assertEqual(len(os.urandom(0)), 0) + self.assertEqual(len(os.urandom(1)), 1) + self.assertEqual(len(os.urandom(10)), 10) + self.assertEqual(len(os.urandom(100)), 100) + self.assertEqual(len(os.urandom(1000)), 1000) + + def test_urandom_value(self): + data1 = os.urandom(16) + data2 = os.urandom(16) + self.assertNotEqual(data1, data2) + + def get_urandom_subprocess(self, count): + code = '\n'.join(( + 'import os, sys', + 'data = os.urandom(%s)' % count, + 'sys.stdout.write(data)', + 'sys.stdout.flush()')) + cmd_line = [sys.executable, '-c', code] + p = subprocess.Popen(cmd_line, stdin=subprocess.PIPE, + stdout=subprocess.PIPE, stderr=subprocess.STDOUT) + out, err = p.communicate() + out = test_support.strip_python_stderr(out) + self.assertEqual(len(out), count) + return out + + def test_urandom_subprocess(self): + data1 = self.get_urandom_subprocess(16) + data2 = self.get_urandom_subprocess(16) + self.assertNotEqual(data1, data2) +>>>>>>> other def test_execvpe_with_bad_arglist(self): self.assertRaises(ValueError, os.execvpe, 'notepad', [], None) diff --git a/Lib/test/test_set.py b/Lib/test/test_set.py --- a/Lib/test/test_set.py +++ b/Lib/test/test_set.py @@ -687,6 +687,17 @@ if self.repr is not None: self.assertEqual(repr(self.set), self.repr) + def check_repr_against_values(self): + text = repr(self.set) + self.assertTrue(text.startswith('{')) + self.assertTrue(text.endswith('}')) + + result = text[1:-1].split(', ') + result.sort() + sorted_repr_values = [repr(value) for value in self.values] + sorted_repr_values.sort() + self.assertEqual(result, sorted_repr_values) + def test_print(self): fo = open(test_support.TESTFN, "wb") try: @@ -836,6 +847,46 @@ self.length = 3 self.repr = None +#------------------------------------------------------------------------------ + +class TestBasicOpsString(TestBasicOps): + def setUp(self): + self.case = "string set" + self.values = ["a", "b", "c"] + self.set = set(self.values) + self.dup = set(self.values) + self.length = 3 + + def test_repr(self): + self.check_repr_against_values() + +#------------------------------------------------------------------------------ + +class TestBasicOpsUnicode(TestBasicOps): + def setUp(self): + self.case = "unicode set" + self.values = [u"a", u"b", u"c"] + self.set = set(self.values) + self.dup = set(self.values) + self.length = 3 + + def test_repr(self): + self.check_repr_against_values() + +#------------------------------------------------------------------------------ + +class TestBasicOpsMixedStringUnicode(TestBasicOps): + def setUp(self): + self.case = "string and bytes set" + self.values = ["a", "b", u"a", u"b"] + self.set = set(self.values) + self.dup = set(self.values) + self.length = 4 + + def test_repr(self): + with test_support.check_warnings(): + self.check_repr_against_values() + #============================================================================== def baditer(): diff --git a/Lib/test/test_support.py b/Lib/test/test_support.py --- a/Lib/test/test_support.py +++ b/Lib/test/test_support.py @@ -36,8 +36,8 @@ "BasicTestRunner", "run_unittest", "run_doctest", "threading_setup", "threading_cleanup", "reap_children", "cpython_only", "check_impl_detail", "get_attribute", "py3k_bytes", - "import_fresh_module"] - + "import_fresh_module", "threading_cleanup", "reap_children", + "strip_python_stderr"] class Error(Exception): """Base class for regression test exceptions.""" diff --git a/Lib/test/test_sys.py b/Lib/test/test_sys.py --- a/Lib/test/test_sys.py +++ b/Lib/test/test_sys.py @@ -438,7 +438,7 @@ attrs = ("debug", "py3k_warning", "division_warning", "division_new", "inspect", "interactive", "optimize", "dont_write_bytecode", "no_site", "ignore_environment", "tabcheck", "verbose", - "unicode", "bytes_warning") + "unicode", "bytes_warning", "hash_randomization") for attr in attrs: self.assertTrue(hasattr(sys.flags, attr), attr) self.assertEqual(type(getattr(sys.flags, attr)), int, attr) diff --git a/Makefile.pre.in b/Makefile.pre.in --- a/Makefile.pre.in +++ b/Makefile.pre.in @@ -290,6 +290,7 @@ Python/pymath.o \ Python/pystate.o \ Python/pythonrun.o \ + Python/random.o \ Python/structmember.o \ Python/symtable.o \ Python/sysmodule.o \ @@ -739,7 +740,7 @@ - at if which pybuildbot.identify >/dev/null 2>&1; then \ pybuildbot.identify "CC='$(CC)'" "CXX='$(CXX)'"; \ fi - $(TESTPYTHON) $(TESTPROG) -uall -rwW $(TESTOPTS) + $(TESTPYTHON) -R $(TESTPROG) -uall -rwW $(TESTOPTS) QUICKTESTOPTS= $(TESTOPTS) -x test_subprocess test_io test_lib2to3 \ test_multibytecodec test_urllib2_localnet test_itertools \ diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -12,6 +12,11 @@ - Issue #13020: Fix a reference leak when allocating a structsequence object fails. Patch by Suman Saha. +- 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 #11235: Fix OverflowError when trying to import a source file whose modification time doesn't fit in a 32-bit timestamp. diff --git a/Misc/python.man b/Misc/python.man --- a/Misc/python.man +++ b/Misc/python.man @@ -34,6 +34,9 @@ .B \-OO ] [ +.B \-R +] +[ .B -Q .I argument ] @@ -151,6 +154,18 @@ .B \-OO Discard docstrings in addition to the \fB-O\fP optimizations. .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 insertion, 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 @@ -423,6 +438,20 @@ .IP PYTHONWARNINGS 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 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 +purpose is to allow repeatable hashing, such as for selftests for the +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. .SH AUTHOR The Python Software Foundation: http://www.python.org/psf .SH INTERNET RESOURCES diff --git a/Modules/main.c b/Modules/main.c --- a/Modules/main.c +++ b/Modules/main.c @@ -40,7 +40,7 @@ static int orig_argc; /* command line options */ -#define BASE_OPTS "3bBc:dEhiJm:OQ:sStuUvVW:xX?" +#define BASE_OPTS "3bBc:dEhiJm:OQ:RsStuUvVW:xX?" #ifndef RISCOS #define PROGRAM_OPTS BASE_OPTS @@ -71,6 +71,9 @@ -m mod : run library module as a script (terminates option list)\n\ -O : optimize generated bytecode slightly; also PYTHONOPTIMIZE=x\n\ -OO : remove doc-strings in addition to the -O optimizations\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 defense against denial-of-service attacks\n\ -Q arg : division options: -Qold (default), -Qwarn, -Qwarnall, -Qnew\n\ -s : don't add user site directory to sys.path; also PYTHONNOUSERSITE\n\ -S : don't imply 'import site' on initialization\n\ @@ -102,6 +105,12 @@ PYTHONCASEOK : ignore case in 'import' statements (Windows).\n\ PYTHONIOENCODING: Encoding[:errors] used for stdin/stdout/stderr.\n\ "; +static char *usage_6 = "\ +PYTHONHASHSEED: if this variable is set to ``random``, the effect is the same \n\ + as specifying the :option:`-R` option: a random value is used to seed the\n\ + hashes of 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\ +"; static int @@ -118,6 +127,7 @@ fputs(usage_3, f); fprintf(f, usage_4, DELIM); fprintf(f, usage_5, DELIM, PYTHONHOMEHELP); + fputs(usage_6, f); } #if defined(__VMS) if (exitcode == 0) { @@ -389,6 +399,10 @@ PySys_AddWarnOption(_PyOS_optarg); break; + case 'R': + Py_HashRandomizationFlag++; + break; + /* This space reserved for other options */ default: diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c --- a/Modules/posixmodule.c +++ b/Modules/posixmodule.c @@ -8538,117 +8538,35 @@ } #endif -#ifdef MS_WINDOWS - -PyDoc_STRVAR(win32_urandom__doc__, +PyDoc_STRVAR(posix_urandom__doc__, "urandom(n) -> str\n\n\ -Return a string of n random bytes suitable for cryptographic use."); - -typedef BOOL (WINAPI *CRYPTACQUIRECONTEXTA)(HCRYPTPROV *phProv,\ - LPCSTR pszContainer, LPCSTR pszProvider, DWORD dwProvType,\ - DWORD dwFlags ); -typedef BOOL (WINAPI *CRYPTGENRANDOM)(HCRYPTPROV hProv, DWORD dwLen,\ - BYTE *pbBuffer ); - -static CRYPTGENRANDOM pCryptGenRandom = NULL; -/* This handle is never explicitly released. Instead, the operating - system will release it when the process terminates. */ -static HCRYPTPROV hCryptProv = 0; - -static PyObject* -win32_urandom(PyObject *self, PyObject *args) -{ - int howMany; - PyObject* result; - - /* Read arguments */ - if (! PyArg_ParseTuple(args, "i:urandom", &howMany)) - return NULL; - if (howMany < 0) +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"); - - if (hCryptProv == 0) { - HINSTANCE hAdvAPI32 = NULL; - CRYPTACQUIRECONTEXTA pCryptAcquireContext = NULL; - - /* Obtain handle to the DLL containing CryptoAPI - This should not fail */ - hAdvAPI32 = GetModuleHandle("advapi32.dll"); - if(hAdvAPI32 == NULL) - return win32_error("GetModuleHandle", NULL); - - /* Obtain pointers to the CryptoAPI functions - This will fail on some early versions of Win95 */ - pCryptAcquireContext = (CRYPTACQUIRECONTEXTA)GetProcAddress( - hAdvAPI32, - "CryptAcquireContextA"); - if (pCryptAcquireContext == NULL) - return PyErr_Format(PyExc_NotImplementedError, - "CryptAcquireContextA not found"); - - pCryptGenRandom = (CRYPTGENRANDOM)GetProcAddress( - hAdvAPI32, "CryptGenRandom"); - if (pCryptGenRandom == NULL) - return PyErr_Format(PyExc_NotImplementedError, - "CryptGenRandom not found"); - - /* Acquire context */ - if (! pCryptAcquireContext(&hCryptProv, NULL, NULL, - PROV_RSA_FULL, CRYPT_VERIFYCONTEXT)) - return win32_error("CryptAcquireContext", NULL); - } - - /* Allocate bytes */ - result = PyString_FromStringAndSize(NULL, howMany); - if (result != NULL) { - /* Get random data */ - memset(PyString_AS_STRING(result), 0, howMany); /* zero seed */ - if (! pCryptGenRandom(hCryptProv, howMany, (unsigned char*) - PyString_AS_STRING(result))) { - Py_DECREF(result); - return win32_error("CryptGenRandom", NULL); - } + 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; } -#endif - -#ifdef __VMS -/* Use openssl random routine */ -#include -PyDoc_STRVAR(vms_urandom__doc__, -"urandom(n) -> str\n\n\ -Return a string of n random bytes suitable for cryptographic use."); - -static PyObject* -vms_urandom(PyObject *self, PyObject *args) -{ - int howMany; - PyObject* result; - - /* Read arguments */ - if (! PyArg_ParseTuple(args, "i:urandom", &howMany)) - return NULL; - if (howMany < 0) - return PyErr_Format(PyExc_ValueError, - "negative argument not allowed"); - - /* Allocate bytes */ - result = PyString_FromStringAndSize(NULL, howMany); - if (result != NULL) { - /* Get random data */ - if (RAND_pseudo_bytes((unsigned char*) - PyString_AS_STRING(result), - howMany) < 0) { - Py_DECREF(result); - return PyErr_Format(PyExc_ValueError, - "RAND_pseudo_bytes"); - } - } - return result; -} -#endif #ifdef HAVE_SETRESUID PyDoc_STRVAR(posix_setresuid__doc__, @@ -9035,12 +8953,6 @@ #ifdef HAVE_GETLOADAVG {"getloadavg", posix_getloadavg, METH_NOARGS, posix_getloadavg__doc__}, #endif - #ifdef MS_WINDOWS - {"urandom", win32_urandom, METH_VARARGS, win32_urandom__doc__}, - #endif - #ifdef __VMS - {"urandom", vms_urandom, METH_VARARGS, vms_urandom__doc__}, - #endif #ifdef HAVE_SETRESUID {"setresuid", posix_setresuid, METH_VARARGS, posix_setresuid__doc__}, #endif @@ -9053,7 +8965,7 @@ #ifdef HAVE_GETRESGID {"getresgid", posix_getresgid, METH_NOARGS, posix_getresgid__doc__}, #endif - + {"urandom", posix_urandom, METH_VARARGS, posix_urandom__doc__}, {NULL, NULL} /* Sentinel */ }; diff --git a/Objects/bufferobject.c b/Objects/bufferobject.c --- a/Objects/bufferobject.c +++ b/Objects/bufferobject.c @@ -334,10 +334,20 @@ return -1; p = (unsigned char *) ptr; len = size; - x = *p << 7; + /* + We make the hash of the empty buffer be 0, rather than using + (prefix ^ suffix), since this slightly obfuscates the hash secret + */ + if (len == 0) { + self->b_hash = 0; + return 0; + } + x = _Py_HashSecret.prefix; + x ^= *p << 7; while (--len >= 0) x = (1000003*x) ^ *p++; x ^= size; + x ^= _Py_HashSecret.suffix; if (x == -1) x = -2; self->b_hash = x; diff --git a/Objects/object.c b/Objects/object.c --- a/Objects/object.c +++ b/Objects/object.c @@ -1094,6 +1094,8 @@ return -1; } +_Py_HashSecret_t _Py_HashSecret; + long PyObject_Hash(PyObject *v) { diff --git a/Objects/stringobject.c b/Objects/stringobject.c --- a/Objects/stringobject.c +++ b/Objects/stringobject.c @@ -1265,11 +1265,21 @@ 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 = *p << 7; + x = _Py_HashSecret.prefix; + x ^= *p << 7; while (--len >= 0) x = (1000003*x) ^ *p++; x ^= Py_SIZE(a); + x ^= _Py_HashSecret.suffix; if (x == -1) x = -2; a->ob_shash = x; diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -6541,11 +6541,21 @@ if (self->hash != -1) return self->hash; len = PyUnicode_GET_SIZE(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; + return 0; + } p = PyUnicode_AS_UNICODE(self); - x = *p << 7; + x = _Py_HashSecret.prefix; + x ^= *p << 7; while (--len >= 0) x = (1000003*x) ^ *p++; x ^= PyUnicode_GET_SIZE(self); + x ^= _Py_HashSecret.suffix; if (x == -1) x = -2; self->hash = x; diff --git a/PCbuild/pythoncore.vcproj b/PCbuild/pythoncore.vcproj --- a/PCbuild/pythoncore.vcproj +++ b/PCbuild/pythoncore.vcproj @@ -1,3 +1,4 @@ +<<<<<<< local +======= + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +>>>>>>> other diff --git a/Python/pythonrun.c b/Python/pythonrun.c --- a/Python/pythonrun.c +++ b/Python/pythonrun.c @@ -67,6 +67,7 @@ static void call_ll_exitfuncs(void); extern void _PyUnicode_Init(void); extern void _PyUnicode_Fini(void); +extern void _PyRandom_Init(void); #ifdef WITH_THREAD extern void _PyGILState_Init(PyInterpreterState *, PyThreadState *); @@ -89,6 +90,7 @@ true divisions (which they will be in 2.3). */ int _Py_QnewFlag = 0; int Py_NoUserSiteDirectory = 0; /* for -s and site.py */ +int Py_HashRandomizationFlag = 0; /* for -R and PYTHONHASHSEED */ /* PyModule_GetWarningsModule is no longer necessary as of 2.6 since _warnings is builtin. This API should not be used. */ @@ -166,6 +168,12 @@ Py_OptimizeFlag = add_flag(Py_OptimizeFlag, p); if ((p = Py_GETENV("PYTHONDONTWRITEBYTECODE")) && *p != '\0') Py_DontWriteBytecodeFlag = add_flag(Py_DontWriteBytecodeFlag, p); + /* The variable is only tested for existence here; _PyRandom_Init will + check its value further. */ + if ((p = Py_GETENV("PYTHONHASHSEED")) && *p != '\0') + Py_HashRandomizationFlag = add_flag(Py_HashRandomizationFlag, p); + + _PyRandom_Init(); interp = PyInterpreterState_New(); if (interp == NULL) diff --git a/Python/random.c b/Python/random.c new file mode 100644 --- /dev/null +++ b/Python/random.c @@ -0,0 +1,302 @@ +#include "Python.h" +#ifdef MS_WINDOWS +#include +#else +#include +#endif + +static int random_initialized = 0; + +#ifdef MS_WINDOWS +typedef BOOL (WINAPI *CRYPTACQUIRECONTEXTA)(HCRYPTPROV *phProv,\ + LPCSTR pszContainer, LPCSTR pszProvider, DWORD dwProvType,\ + DWORD dwFlags ); +typedef BOOL (WINAPI *CRYPTGENRANDOM)(HCRYPTPROV hProv, DWORD dwLen,\ + BYTE *pbBuffer ); + +static CRYPTGENRANDOM pCryptGenRandom = NULL; +/* This handle is never explicitly released. Instead, the operating + system will release it when the process terminates. */ +static HCRYPTPROV hCryptProv = 0; + +static int +win32_urandom_init(int raise) +{ + HINSTANCE hAdvAPI32 = NULL; + CRYPTACQUIRECONTEXTA pCryptAcquireContext = NULL; + + /* Obtain handle to the DLL containing CryptoAPI. This should not fail. */ + hAdvAPI32 = GetModuleHandle("advapi32.dll"); + if(hAdvAPI32 == NULL) + goto error; + + /* Obtain pointers to the CryptoAPI functions. This will fail on some early + versions of Win95. */ + pCryptAcquireContext = (CRYPTACQUIRECONTEXTA)GetProcAddress( + hAdvAPI32, "CryptAcquireContextA"); + if (pCryptAcquireContext == NULL) + goto error; + + pCryptGenRandom = (CRYPTGENRANDOM)GetProcAddress(hAdvAPI32, + "CryptGenRandom"); + if (pCryptGenRandom == NULL) + goto error; + + /* Acquire context */ + if (! pCryptAcquireContext(&hCryptProv, NULL, NULL, + PROV_RSA_FULL, CRYPT_VERIFYCONTEXT)) + goto error; + + return 0; + +error: + if (raise) + PyErr_SetFromWindowsErr(0); + else + Py_FatalError("Failed to initialize Windows random API (CryptoGen)"); + return -1; +} + +/* Fill buffer with size pseudo-random bytes generated by the Windows CryptoGen + API. Return 0 on success, or -1 on error. */ +static int +win32_urandom(unsigned char *buffer, Py_ssize_t size, int raise) +{ + Py_ssize_t chunk; + + if (hCryptProv == 0) + { + if (win32_urandom_init(raise) == -1) + return -1; + } + + while (size > 0) + { + chunk = size > INT_MAX ? INT_MAX : size; + if (!pCryptGenRandom(hCryptProv, chunk, buffer)) + { + /* CryptGenRandom() failed */ + if (raise) + PyErr_SetFromWindowsErr(0); + else + Py_FatalError("Failed to initialized the randomized hash " + "secret using CryptoGen)"); + return -1; + } + buffer += chunk; + size -= chunk; + } + return 0; +} +#endif /* MS_WINDOWS */ + + +#ifdef __VMS +/* Use openssl random routine */ +#include +static int +vms_urandom(unsigned char *buffer, Py_ssize_t size, int raise) +{ + if (RAND_pseudo_bytes(buffer, size) < 0) { + if (raise) { + PyErr_Format(PyExc_ValueError, + "RAND_pseudo_bytes"); + } else { + Py_FatalError("Failed to initialize the randomized hash " + "secret using RAND_pseudo_bytes"); + } + return -1; + } + return 0; +} +#endif /* __VMS */ + + +#if !defined(MS_WINDOWS) && !defined(__VMS) + +/* Read size bytes from /dev/urandom into buffer. + Call Py_FatalError() on error. */ +static void +dev_urandom_noraise(char *buffer, Py_ssize_t size) +{ + int fd; + Py_ssize_t n; + + assert (0 < size); + + fd = open("/dev/urandom", O_RDONLY); + if (fd < 0) + Py_FatalError("Failed to open /dev/urandom"); + + while (0 < size) + { + do { + n = read(fd, buffer, (size_t)size); + } while (n < 0 && errno == EINTR); + if (n <= 0) + { + /* stop on error or if read(size) returned 0 */ + Py_FatalError("Failed to read bytes from /dev/urandom"); + break; + } + buffer += n; + size -= (Py_ssize_t)n; + } + close(fd); +} + +/* Read size bytes from /dev/urandom into buffer. + Return 0 on success, raise an exception and return -1 on error. */ +static int +dev_urandom_python(char *buffer, Py_ssize_t size) +{ + int fd; + Py_ssize_t n; + + if (size <= 0) + return 0; + + Py_BEGIN_ALLOW_THREADS + fd = open("/dev/urandom", O_RDONLY); + Py_END_ALLOW_THREADS + if (fd < 0) + { + PyErr_SetFromErrnoWithFilename(PyExc_OSError, "/dev/urandom"); + return -1; + } + + Py_BEGIN_ALLOW_THREADS + do { + do { + n = read(fd, buffer, (size_t)size); + } while (n < 0 && errno == EINTR); + if (n <= 0) + break; + buffer += n; + size -= (Py_ssize_t)n; + } while (0 < size); + Py_END_ALLOW_THREADS + + if (n <= 0) + { + /* stop on error or if read(size) returned 0 */ + if (n < 0) + PyErr_SetFromErrno(PyExc_OSError); + else + PyErr_Format(PyExc_RuntimeError, + "Failed to read %zi bytes from /dev/urandom", + size); + close(fd); + return -1; + } + close(fd); + return 0; +} +#endif /* !defined(MS_WINDOWS) && !defined(__VMS) */ + +/* Fill buffer with pseudo-random bytes generated by a linear congruent + generator (LCG): + + x(n+1) = (x(n) * 214013 + 2531011) % 2^32 + + Use bits 23..16 of x(n) to generate a byte. */ +static void +lcg_urandom(unsigned int x0, unsigned char *buffer, size_t size) +{ + size_t index; + unsigned int x; + + x = x0; + for (index=0; index < size; index++) { + x *= 214013; + x += 2531011; + /* modulo 2 ^ (8 * sizeof(int)) */ + buffer[index] = (x >> 16) & 0xff; + } +} + +/* Fill buffer with size pseudo-random bytes, not suitable for cryptographic + use, from the operating random number generator (RNG). + + Return 0 on success, raise an exception and return -1 on error. */ +int +_PyOS_URandom(void *buffer, Py_ssize_t size) +{ + if (size < 0) { + PyErr_Format(PyExc_ValueError, + "negative argument not allowed"); + return -1; + } + if (size == 0) + return 0; + +#ifdef MS_WINDOWS + return win32_urandom((unsigned char *)buffer, size, 1); +#else +# ifdef __VMS + return vms_urandom((unsigned char *)buffer, size, 1); +# else + return dev_urandom_python((char*)buffer, size); +# endif +#endif +} + +void +_PyRandom_Init(void) +{ + char *env; + void *secret = &_Py_HashSecret; + Py_ssize_t secret_size = sizeof(_Py_HashSecret); + + if (random_initialized) + return; + random_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. + */ + + env = Py_GETENV("PYTHONHASHSEED"); + if (env && *env != '\0' && strcmp(env, "random") != 0) { + char *endptr = env; + unsigned long seed; + seed = strtoul(env, &endptr, 10); + if (*endptr != '\0' + || seed > 4294967295UL + || (errno == ERANGE && seed == ULONG_MAX)) + { + Py_FatalError("PYTHONHASHSEED must be \"random\" or an integer " + "in range [0; 4294967295]"); + } + if (seed == 0) { + /* disable the randomized hash */ + memset(secret, 0, secret_size); + } + else { + lcg_urandom(seed, (unsigned char*)secret, secret_size); + } + } + else { +#ifdef MS_WINDOWS + (void)win32_urandom((unsigned char *)secret, secret_size, 0); +#else /* #ifdef MS_WINDOWS */ +# ifdef __VMS + vms_urandom((unsigned char *)secret, secret_size, 0); +# else + dev_urandom_noraise((char*)secret, secret_size); +# endif +#endif + } +} diff --git a/Python/sysmodule.c b/Python/sysmodule.c --- a/Python/sysmodule.c +++ b/Python/sysmodule.c @@ -1209,6 +1209,7 @@ {"unicode", "-U"}, /* {"skip_first", "-x"}, */ {"bytes_warning", "-b"}, + {"hash_randomization", "-R"}, {0} }; @@ -1217,9 +1218,9 @@ flags__doc__, /* doc */ flags_fields, /* fields */ #ifdef RISCOS + 17 +#else 16 -#else - 15 #endif }; @@ -1256,6 +1257,7 @@ SetFlag(Py_UnicodeFlag); /* SetFlag(skipfirstline); */ SetFlag(Py_BytesWarningFlag); + SetFlag(Py_HashRandomizationFlag); #undef SetFlag if (PyErr_Occurred()) { -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Feb 21 03:49:14 2012 From: python-checkins at python.org (benjamin.peterson) Date: Tue, 21 Feb 2012 03:49:14 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=282=2E7=29=3A_don=27t_rely_on?= =?utf8?q?_dict_order_here?= Message-ID: http://hg.python.org/cpython/rev/8e9f53974fd3 changeset: 75103:8e9f53974fd3 branch: 2.7 user: Benjamin Peterson date: Mon Feb 20 21:47:54 2012 -0500 summary: don't rely on dict order here files: Lib/test/test_gdbm.py | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Lib/test/test_gdbm.py b/Lib/test/test_gdbm.py --- a/Lib/test/test_gdbm.py +++ b/Lib/test/test_gdbm.py @@ -47,7 +47,7 @@ all = set(gdbm.open_flags) # Test standard flags (presumably "crwn"). modes = all - set('fsu') - for mode in modes: + for mode in sorted(modes): self.g = gdbm.open(filename, mode) self.g.close() -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Feb 21 03:55:42 2012 From: python-checkins at python.org (benjamin.peterson) Date: Tue, 21 Feb 2012 03:55:42 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=282=2E7=29=3A_fix_test=5Fgdb_?= =?utf8?q?under_hash_randomization?= Message-ID: http://hg.python.org/cpython/rev/a0b663935b45 changeset: 75104:a0b663935b45 branch: 2.7 user: Benjamin Peterson date: Mon Feb 20 21:55:32 2012 -0500 summary: fix test_gdb under hash randomization files: Lib/test/test_gdb.py | 17 +++++++++++------ 1 files changed, 11 insertions(+), 6 deletions(-) diff --git a/Lib/test/test_gdb.py b/Lib/test/test_gdb.py --- a/Lib/test/test_gdb.py +++ b/Lib/test/test_gdb.py @@ -58,13 +58,18 @@ """Test that the debugger can debug Python.""" - def run_gdb(self, *args): + def run_gdb(self, *args, **env_vars): """Runs gdb with the command line given by *args. Returns its stdout, stderr """ + if env_vars: + env = os.environ.copy() + env.update(env_vars) + else: + env = None out, err = subprocess.Popen( - args, stdout=subprocess.PIPE, stderr=subprocess.PIPE, + args, stdout=subprocess.PIPE, stderr=subprocess.PIPE, env=env ).communicate() return out, err @@ -124,7 +129,7 @@ # print ' '.join(args) # Use "args" to invoke gdb, capturing stdout, stderr: - out, err = self.run_gdb(*args) + out, err = self.run_gdb(*args, PYTHONHASHSEED='0') # Ignore some noise on stderr due to the pending breakpoint: err = err.replace('Function "%s" not defined.\n' % breakpoint, '') @@ -213,7 +218,7 @@ 'Verify the pretty-printing of dictionaries' self.assertGdbRepr({}) self.assertGdbRepr({'foo': 'bar'}) - self.assertGdbRepr({'foo': 'bar', 'douglas':42}) + self.assertGdbRepr("{'foo': 'bar', 'douglas':42}") def test_lists(self): 'Verify the pretty-printing of lists' @@ -273,8 +278,8 @@ def test_frozensets(self): 'Verify the pretty-printing of frozensets' self.assertGdbRepr(frozenset()) - self.assertGdbRepr(frozenset(['a', 'b'])) - self.assertGdbRepr(frozenset([4, 5, 6])) + self.assertGdbRepr("frozenset(['a', 'b'])") + self.assertGdbRepr("frozenset([4, 5, 6])") def test_exceptions(self): # Test a RuntimeError -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Feb 21 03:57:34 2012 From: python-checkins at python.org (benjamin.peterson) Date: Tue, 21 Feb 2012 03:57:34 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=282=2E7=29=3A_belately_resolv?= =?utf8?q?e_conflicts_here?= Message-ID: http://hg.python.org/cpython/rev/3c893a94cb7f changeset: 75105:3c893a94cb7f branch: 2.7 user: Benjamin Peterson date: Mon Feb 20 21:57:25 2012 -0500 summary: belately resolve conflicts here files: PCbuild/pythoncore.vcproj | 2 -- 1 files changed, 0 insertions(+), 2 deletions(-) diff --git a/PCbuild/pythoncore.vcproj b/PCbuild/pythoncore.vcproj --- a/PCbuild/pythoncore.vcproj +++ b/PCbuild/pythoncore.vcproj @@ -1,4 +1,3 @@ -<<<<<<< local ->>>>>>> other -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Feb 21 04:00:57 2012 From: python-checkins at python.org (benjamin.peterson) Date: Tue, 21 Feb 2012 04:00:57 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=282=2E7=29=3A_fix_for_real_th?= =?utf8?q?is_time=2E=2E=2E?= Message-ID: http://hg.python.org/cpython/rev/fca3b3936aee changeset: 75106:fca3b3936aee branch: 2.7 user: Benjamin Peterson date: Mon Feb 20 22:00:46 2012 -0500 summary: fix for real this time... files: PCbuild/pythoncore.vcproj | 1828 +------------------------ 1 files changed, 5 insertions(+), 1823 deletions(-) diff --git a/PCbuild/pythoncore.vcproj b/PCbuild/pythoncore.vcproj --- a/PCbuild/pythoncore.vcproj +++ b/PCbuild/pythoncore.vcproj @@ -1835,6 +1835,10 @@ > + + @@ -1870,1826 +1874,4 @@ - -======= - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + \ No newline at end of file -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Feb 21 04:33:47 2012 From: python-checkins at python.org (benjamin.peterson) Date: Tue, 21 Feb 2012 04:33:47 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=282=2E7=29=3A_this_was_suppos?= =?utf8?q?ed_to_die?= Message-ID: http://hg.python.org/cpython/rev/e3fb353b3fd4 changeset: 75108:e3fb353b3fd4 branch: 2.7 parent: 75106:fca3b3936aee user: Benjamin Peterson date: Mon Feb 20 22:33:33 2012 -0500 summary: this was supposed to die files: Lib/test/test_compiler.py | 4 ++-- Lib/test/test_os.py | 14 -------------- 2 files changed, 2 insertions(+), 16 deletions(-) diff --git a/Lib/test/test_compiler.py b/Lib/test/test_compiler.py --- a/Lib/test/test_compiler.py +++ b/Lib/test/test_compiler.py @@ -28,8 +28,8 @@ libdir = os.path.dirname(os.__file__) testdir = os.path.dirname(test.test_support.__file__) - for dir in [libdir, testdir]: - for basename in os.listdir(dir): + for dir in [testdir]: + for basename in "test_os.py",: # Print still working message since this test can be really slow if next_time <= time.time(): next_time = time.time() + _PRINT_WORKING_MSG_INTERVAL diff --git a/Lib/test/test_os.py b/Lib/test/test_os.py --- a/Lib/test/test_os.py +++ b/Lib/test/test_os.py @@ -527,19 +527,6 @@ f.close() class URandomTests (unittest.TestCase): - def test_urandom(self): - try: - self.assertEqual(len(os.urandom(1)), 1) - self.assertEqual(len(os.urandom(10)), 10) - self.assertEqual(len(os.urandom(100)), 100) - self.assertEqual(len(os.urandom(1000)), 1000) - # see http://bugs.python.org/issue3708 - self.assertRaises(TypeError, os.urandom, 0.9) - self.assertRaises(TypeError, os.urandom, 1.1) - self.assertRaises(TypeError, os.urandom, 2.0) - self.assertEqual(len(os.urandom(0.9)), 0) - self.assertEqual(len(os.urandom(1.1)), 1) - self.assertEqual(len(os.urandom(2.0)), 2) def test_urandom_length(self): self.assertEqual(len(os.urandom(0)), 0) @@ -571,7 +558,6 @@ data1 = self.get_urandom_subprocess(16) data2 = self.get_urandom_subprocess(16) self.assertNotEqual(data1, data2) ->>>>>>> other def test_execvpe_with_bad_arglist(self): self.assertRaises(ValueError, os.execvpe, 'notepad', [], None) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Feb 21 04:33:46 2012 From: python-checkins at python.org (benjamin.peterson) Date: Tue, 21 Feb 2012 04:33:46 +0100 Subject: [Python-checkins] =?utf8?q?cpython=3A_update_to_Unicode_6=2E1?= Message-ID: http://hg.python.org/cpython/rev/cd21e6d30a1a changeset: 75107:cd21e6d30a1a parent: 75099:4a77887b1ac2 user: Benjamin Peterson date: Mon Feb 20 22:24:29 2012 -0500 summary: update to Unicode 6.1 files: Lib/test/test_unicodedata.py | 4 +- Misc/NEWS | 2 + Modules/unicodedata.c | 2 +- Modules/unicodedata_db.h | 8898 ++- Modules/unicodename_db.h | 37906 ++++++++-------- Objects/unicodetype_db.h | 3345 +- Tools/unicode/makeunicodedata.py | 9 +- 7 files changed, 25828 insertions(+), 24338 deletions(-) diff --git a/Lib/test/test_unicodedata.py b/Lib/test/test_unicodedata.py --- a/Lib/test/test_unicodedata.py +++ b/Lib/test/test_unicodedata.py @@ -21,7 +21,7 @@ class UnicodeMethodsTest(unittest.TestCase): # update this, if the database changes - expectedchecksum = 'df0b3ca6785a070b21f837b227dbdbdff3c2e921' + expectedchecksum = 'bf7a78f1a532421b5033600102e23a92044dbba9' def test_method_checksum(self): h = hashlib.sha1() @@ -80,7 +80,7 @@ class UnicodeFunctionsTest(UnicodeDatabaseTest): # update this, if the database changes - expectedchecksum = 'c23dfc0b5eaf3ca2aad32d733de96bb182ccda50' + expectedchecksum = '17fe2f12b788e4fff5479b469c4404bb6ecf841f' def test_function_checksum(self): data = [] h = hashlib.sha1() diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -10,6 +10,8 @@ Core and Builtins ----------------- +- Upgrade Unicode data to Unicode 6.1. + - Issue #14040: Remove rarely used file name suffixes for C extensions (under POSIX mainly). diff --git a/Modules/unicodedata.c b/Modules/unicodedata.c --- a/Modules/unicodedata.c +++ b/Modules/unicodedata.c @@ -921,7 +921,7 @@ { 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 */ diff --git a/Modules/unicodedata_db.h b/Modules/unicodedata_db.h --- 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 @@ {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 @@ {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 @@ {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 @@ {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 @@ {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 @@ {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 @@ {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 @@ {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 @@ {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 @@ {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 @@ { 69785, 0, 367}, { 69787, 0, 368}, { 69797, 0, 369}, + { 69937, 1, 370}, {0,0,0} }; @@ -574,6 +578,7 @@ { 6965, 0, 51}, { 12441, 1, 52}, { 69818, 0, 54}, + { 69927, 0, 55}, {0,0,0} }; @@ -671,515 +676,515 @@ 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, + 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, 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, - 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, - 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, - 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, - 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, - 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, - 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, - 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, - 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, - 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, - 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, - 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, - 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, - 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, - 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, - 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, - 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, - 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, - 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, - 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, - 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, - 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, - 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, - 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, - 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, - 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, - 120, 120, 120, 120, 120, 120, 120, 120, 120, 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 @@ 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, + 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, 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, - 47, 47, 47, 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, + 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, 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, 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, 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, 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, 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, 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, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, + 80, 80, 80, 80, 80, 80, 80, 80, 80, 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, 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, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, + 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, + 80, 80, 80, 80, 80, 80, 80, 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, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 47, + 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, 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, 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, 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, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 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, 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, 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, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 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, 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, 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, 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, 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, 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, - 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, 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, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, - 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, 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, - 0, 0, 0, 0, 0, 0, 0, 0, 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, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, - 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, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, - 0, 0, 0, 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, + 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, 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, + 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, 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, - 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, - 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, - 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, - 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, - 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 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, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 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, + 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, 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, + 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, 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, 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, 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, + 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, 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, 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, 48, 48, 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, 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, 48, 48, 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, 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, 48, 48, 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, 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, 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, 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, - 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, 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, 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, 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 @@ 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 @@ 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,177 +3734,177 @@ 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 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, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 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, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 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, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 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, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 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, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 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, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 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 @@ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 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 @@ { 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 @@ { 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,373 +5203,373 @@ { 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, - 2, 2, 2, 2, 2, 2, 2, 2, 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, 2, 2, 2, 2, 2, 2, 2, 2, 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, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 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, 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, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 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, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 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, 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, 2, 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, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 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, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 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, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 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, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, + 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, 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, 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, 2, 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, 2, 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, 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, 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, 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, 2, 2, + 2, 2, 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, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 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, 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, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 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, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 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,910 +5579,969 @@ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 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, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 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, 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, 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, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 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, 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, 0, 0, 0, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 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, 0, - 0, 0, 0, 0, 0, 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, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 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, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 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, 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, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 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, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 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, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 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, 0, 0, 0, 0, 0, 0, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 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, 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, 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, + 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, 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, 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, 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, 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, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 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, 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, 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, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 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, - 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, - 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 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, 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, 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, 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, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 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, 0, 0, 0, 0, - 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 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, 0, 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, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 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, 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, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 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, 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, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 7, 7, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 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, 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, 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, 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, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, + 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, 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, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 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, 0, 0, 0, 0, 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, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 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, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 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, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 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, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 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, 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, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 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, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 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, 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, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 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, 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, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 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, 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, 0, 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, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, + 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, 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, 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, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 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, 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, 9, 9, 9, 9, 9, 9, 9, 9, 9, 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, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 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, 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, 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, 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, + 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, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 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, 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, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 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 --- a/Modules/unicodename_db.h +++ b/Modules/unicodename_db.h @@ -6,106 +6,108 @@ static unsigned char lexicon[] = { 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, 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, 65, 78, 196, 66, 79, 76, 196, 72, 65, 78, 71, 85, 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, 86, 79, 87, 69, - 204, 70, 79, 210, 73, 84, 65, 76, 73, 195, 67, 89, 82, 73, 76, 76, 73, + 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, 84, 65, 77, 73, 204, 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, 66, 69, 76, 79, 87, 128, 75, 65, 84, - 65, 75, 65, 78, 193, 194, 75, 65, 78, 71, 88, 201, 77, 79, 68, 73, 70, - 73, 69, 210, 76, 73, 78, 69, 65, 210, 84, 73, 66, 69, 84, 65, 206, 68, - 79, 212, 65, 128, 77, 69, 69, 205, 77, 89, 65, 78, 77, 65, 210, 86, 69, - 82, 84, 73, 67, 65, 204, 75, 72, 77, 69, 210, 79, 198, 87, 72, 73, 84, - 197, 67, 65, 82, 82, 73, 69, 210, 65, 82, 82, 79, 87, 128, 85, 128, 73, - 78, 73, 84, 73, 65, 204, 65, 66, 79, 86, 197, 73, 128, 89, 69, 200, 79, - 128, 77, 65, 82, 75, 128, 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, - 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, 211, 67, 72, 79, 83, 69, 79, 78, 199, - 71, 69, 79, 82, 71, 73, 65, 206, 72, 65, 76, 70, 87, 73, 68, 84, 200, 66, - 65, 76, 73, 78, 69, 83, 197, 72, 79, 79, 75, 128, 213, 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, 84, 79, 128, 72, 69, 65, 86, 217, 84, 87, 79, 128, 79, 86, 69, 210, - 66, 82, 65, 72, 77, 201, 83, 67, 82, 73, 80, 212, 85, 208, 76, 79, 215, - 79, 78, 69, 128, 84, 87, 207, 67, 79, 78, 83, 79, 78, 65, 78, 212, 68, - 79, 87, 206, 70, 85, 76, 76, 87, 73, 68, 84, 200, 72, 65, 200, 79, 78, - 197, 66, 82, 65, 67, 75, 69, 84, 128, 69, 81, 85, 65, 204, 72, 73, 71, - 200, 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, 66, 65, 82, 128, 76, 69, 70, 84, 87, 65, 82, 68, - 211, 72, 73, 82, 65, 71, 65, 78, 193, 84, 72, 82, 69, 197, 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, 67, 72, 65, 82, 65, 67, 84, - 69, 210, 77, 69, 68, 73, 65, 204, 84, 69, 76, 85, 71, 213, 65, 82, 77, - 69, 78, 73, 65, 206, 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, 77, 65, 82, 203, - 72, 65, 76, 198, 75, 65, 78, 78, 65, 68, 193, 80, 72, 65, 83, 69, 45, - 193, 84, 72, 65, 201, 84, 79, 78, 197, 72, 65, 128, 78, 69, 215, 67, 72, - 69, 82, 79, 75, 69, 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, 84, 73, 76, 68, 69, 128, 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, 75, 65, 128, 70, 73, 86, 69, - 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, - 83, 128, 65, 80, 204, 69, 73, 71, 72, 84, 128, 70, 85, 78, 67, 84, 73, - 79, 78, 65, 204, 83, 69, 86, 69, 78, 128, 72, 79, 82, 73, 90, 79, 78, 84, - 65, 204, 76, 65, 207, 78, 73, 78, 69, 128, 84, 69, 76, 69, 71, 82, 65, - 80, 200, 66, 79, 80, 79, 77, 79, 70, 207, 78, 65, 128, 82, 65, 128, 71, - 82, 65, 86, 69, 128, 79, 80, 69, 206, 86, 128, 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, + 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, 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, @@ -124,160 +126,247 @@ 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, 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, - 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, 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, 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, - 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, 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, + 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, 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, @@ -336,156 +425,159 @@ 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, 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, 86, 48, 51, 51, - 128, 86, 48, 51, 50, 128, 86, 48, 51, 49, 65, 128, 86, 48, 51, 49, 128, - 86, 48, 51, 48, 65, 128, 86, 48, 51, 48, 128, 86, 48, 50, 57, 65, 128, - 86, 48, 50, 57, 128, 86, 48, 50, 56, 65, 128, 86, 48, 50, 56, 128, 86, - 48, 50, 55, 128, 86, 48, 50, 54, 128, 86, 48, 50, 53, 128, 86, 48, 50, - 52, 128, 86, 48, 50, 51, 65, 128, 86, 48, 50, 51, 128, 86, 48, 50, 50, - 128, 86, 48, 50, 49, 128, 86, 48, 50, 48, 76, 128, 86, 48, 50, 48, 75, - 128, 86, 48, 50, 48, 74, 128, 86, 48, 50, 48, 73, 128, 86, 48, 50, 48, - 72, 128, 86, 48, 50, 48, 71, 128, 86, 48, 50, 48, 70, 128, 86, 48, 50, - 48, 69, 128, 86, 48, 50, 48, 68, 128, 86, 48, 50, 48, 67, 128, 86, 48, - 50, 48, 66, 128, 86, 48, 50, 48, 65, 128, 86, 48, 50, 48, 128, 86, 48, - 49, 57, 128, 86, 48, 49, 56, 128, 86, 48, 49, 55, 128, 86, 48, 49, 54, - 128, 86, 48, 49, 53, 128, 86, 48, 49, 52, 128, 86, 48, 49, 51, 128, 86, - 48, 49, 50, 66, 128, 86, 48, 49, 50, 65, 128, 86, 48, 49, 50, 128, 86, - 48, 49, 49, 67, 128, 86, 48, 49, 49, 66, 128, 86, 48, 49, 49, 65, 128, - 86, 48, 49, 49, 128, 86, 48, 49, 48, 128, 86, 48, 48, 57, 128, 86, 48, - 48, 56, 128, 86, 48, 48, 55, 66, 128, 86, 48, 48, 55, 65, 128, 86, 48, - 48, 55, 128, 86, 48, 48, 54, 128, 86, 48, 48, 53, 128, 86, 48, 48, 52, - 128, 86, 48, 48, 51, 128, 86, 48, 48, 50, 65, 128, 86, 48, 48, 50, 128, - 86, 48, 48, 49, 73, 128, 86, 48, 48, 49, 72, 128, 86, 48, 48, 49, 71, - 128, 86, 48, 48, 49, 70, 128, 86, 48, 48, 49, 69, 128, 86, 48, 48, 49, - 68, 128, 86, 48, 48, 49, 67, 128, 86, 48, 48, 49, 66, 128, 86, 48, 48, - 49, 65, 128, 86, 48, 48, 49, 128, 85, 90, 85, 128, 85, 90, 51, 128, 85, - 90, 179, 85, 89, 65, 78, 78, 65, 128, 85, 89, 128, 85, 85, 89, 65, 78, - 78, 65, 128, 85, 85, 85, 85, 128, 85, 85, 85, 51, 128, 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, 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, 85, 78, 73, 84, - 128, 85, 78, 73, 212, 85, 78, 73, 79, 78, 128, 85, 78, 73, 79, 206, 85, - 78, 73, 70, 73, 69, 196, 85, 78, 68, 207, 85, 78, 68, 69, 82, 84, 73, 69, - 128, 85, 78, 68, 69, 82, 76, 73, 78, 197, 85, 78, 68, 69, 82, 68, 79, 84, - 128, 85, 78, 68, 69, 82, 66, 65, 82, 128, 85, 78, 68, 69, 210, 85, 78, - 67, 73, 193, 85, 78, 65, 83, 80, 73, 82, 65, 84, 69, 68, 128, 85, 78, 65, - 80, 128, 85, 78, 65, 77, 85, 83, 69, 196, 85, 78, 65, 128, 85, 206, 85, - 77, 85, 77, 128, 85, 77, 85, 205, 85, 77, 66, 82, 69, 76, 76, 65, 128, - 85, 77, 66, 82, 69, 76, 76, 193, 85, 77, 66, 73, 78, 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, 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, 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, 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, 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, + 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, + 86, 48, 51, 51, 128, 86, 48, 51, 50, 128, 86, 48, 51, 49, 65, 128, 86, + 48, 51, 49, 128, 86, 48, 51, 48, 65, 128, 86, 48, 51, 48, 128, 86, 48, + 50, 57, 65, 128, 86, 48, 50, 57, 128, 86, 48, 50, 56, 65, 128, 86, 48, + 50, 56, 128, 86, 48, 50, 55, 128, 86, 48, 50, 54, 128, 86, 48, 50, 53, + 128, 86, 48, 50, 52, 128, 86, 48, 50, 51, 65, 128, 86, 48, 50, 51, 128, + 86, 48, 50, 50, 128, 86, 48, 50, 49, 128, 86, 48, 50, 48, 76, 128, 86, + 48, 50, 48, 75, 128, 86, 48, 50, 48, 74, 128, 86, 48, 50, 48, 73, 128, + 86, 48, 50, 48, 72, 128, 86, 48, 50, 48, 71, 128, 86, 48, 50, 48, 70, + 128, 86, 48, 50, 48, 69, 128, 86, 48, 50, 48, 68, 128, 86, 48, 50, 48, + 67, 128, 86, 48, 50, 48, 66, 128, 86, 48, 50, 48, 65, 128, 86, 48, 50, + 48, 128, 86, 48, 49, 57, 128, 86, 48, 49, 56, 128, 86, 48, 49, 55, 128, + 86, 48, 49, 54, 128, 86, 48, 49, 53, 128, 86, 48, 49, 52, 128, 86, 48, + 49, 51, 128, 86, 48, 49, 50, 66, 128, 86, 48, 49, 50, 65, 128, 86, 48, + 49, 50, 128, 86, 48, 49, 49, 67, 128, 86, 48, 49, 49, 66, 128, 86, 48, + 49, 49, 65, 128, 86, 48, 49, 49, 128, 86, 48, 49, 48, 128, 86, 48, 48, + 57, 128, 86, 48, 48, 56, 128, 86, 48, 48, 55, 66, 128, 86, 48, 48, 55, + 65, 128, 86, 48, 48, 55, 128, 86, 48, 48, 54, 128, 86, 48, 48, 53, 128, + 86, 48, 48, 52, 128, 86, 48, 48, 51, 128, 86, 48, 48, 50, 65, 128, 86, + 48, 48, 50, 128, 86, 48, 48, 49, 73, 128, 86, 48, 48, 49, 72, 128, 86, + 48, 48, 49, 71, 128, 86, 48, 48, 49, 70, 128, 86, 48, 48, 49, 69, 128, + 86, 48, 48, 49, 68, 128, 86, 48, 48, 49, 67, 128, 86, 48, 48, 49, 66, + 128, 86, 48, 48, 49, 65, 128, 86, 48, 48, 49, 128, 85, 90, 85, 128, 85, + 90, 51, 128, 85, 90, 179, 85, 89, 65, 78, 78, 65, 128, 85, 89, 128, 85, + 85, 89, 65, 78, 78, 65, 128, 85, 85, 85, 85, 128, 85, 85, 85, 51, 128, + 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, 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, + 85, 78, 73, 84, 128, 85, 78, 73, 212, 85, 78, 73, 79, 78, 128, 85, 78, + 73, 79, 206, 85, 78, 73, 70, 73, 69, 196, 85, 78, 68, 207, 85, 78, 68, + 69, 82, 84, 73, 69, 128, 85, 78, 68, 69, 82, 76, 73, 78, 197, 85, 78, 68, + 69, 82, 68, 79, 84, 128, 85, 78, 68, 69, 82, 66, 65, 82, 128, 85, 78, 68, + 69, 210, 85, 78, 67, 73, 193, 85, 78, 65, 83, 80, 73, 82, 65, 84, 69, 68, + 128, 85, 78, 65, 80, 128, 85, 78, 65, 77, 85, 83, 69, 196, 85, 78, 65, + 128, 85, 206, 85, 77, 85, 77, 128, 85, 77, 85, 205, 85, 77, 66, 82, 69, + 76, 76, 65, 128, 85, 77, 66, 82, 69, 76, 76, 193, 85, 77, 66, 73, 78, + 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, 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, 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, @@ -498,275 +590,280 @@ 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, 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, 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, 87, 78, 128, 84, - 73, 87, 65, 218, 84, 73, 84, 85, 65, 69, 80, 128, 84, 73, 84, 76, 79, - 128, 84, 73, 84, 193, 84, 73, 84, 128, 84, 73, 82, 89, 65, 75, 128, 84, - 73, 82, 84, 193, 84, 73, 82, 79, 78, 73, 65, 206, 84, 73, 82, 69, 196, - 84, 73, 82, 128, 84, 73, 210, 84, 73, 80, 80, 73, 128, 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, 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, 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, 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, - 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, 128, 83, - 89, 77, 66, 79, 76, 45, 53, 52, 128, 83, 89, 77, 66, 79, 76, 45, 53, 51, - 128, 83, 89, 77, 66, 79, 76, 45, 53, 50, 128, 83, 89, 77, 66, 79, 76, 45, - 53, 49, 128, 83, 89, 77, 66, 79, 76, 45, 53, 48, 128, 83, 89, 77, 66, 79, - 76, 45, 53, 128, 83, 89, 77, 66, 79, 76, 45, 52, 57, 128, 83, 89, 77, 66, - 79, 76, 45, 52, 56, 128, 83, 89, 77, 66, 79, 76, 45, 52, 55, 128, 83, 89, - 77, 66, 79, 76, 45, 52, 53, 128, 83, 89, 77, 66, 79, 76, 45, 52, 51, 128, - 83, 89, 77, 66, 79, 76, 45, 52, 50, 128, 83, 89, 77, 66, 79, 76, 45, 52, - 48, 128, 83, 89, 77, 66, 79, 76, 45, 52, 128, 83, 89, 77, 66, 79, 76, 45, - 51, 57, 128, 83, 89, 77, 66, 79, 76, 45, 51, 56, 128, 83, 89, 77, 66, 79, - 76, 45, 51, 55, 128, 83, 89, 77, 66, 79, 76, 45, 51, 54, 128, 83, 89, 77, - 66, 79, 76, 45, 51, 50, 128, 83, 89, 77, 66, 79, 76, 45, 51, 48, 128, 83, - 89, 77, 66, 79, 76, 45, 51, 128, 83, 89, 77, 66, 79, 76, 45, 50, 57, 128, - 83, 89, 77, 66, 79, 76, 45, 50, 55, 128, 83, 89, 77, 66, 79, 76, 45, 50, - 54, 128, 83, 89, 77, 66, 79, 76, 45, 50, 53, 128, 83, 89, 77, 66, 79, 76, - 45, 50, 52, 128, 83, 89, 77, 66, 79, 76, 45, 50, 51, 128, 83, 89, 77, 66, - 79, 76, 45, 50, 50, 128, 83, 89, 77, 66, 79, 76, 45, 50, 49, 128, 83, 89, - 77, 66, 79, 76, 45, 50, 48, 128, 83, 89, 77, 66, 79, 76, 45, 50, 128, 83, - 89, 77, 66, 79, 76, 45, 49, 57, 128, 83, 89, 77, 66, 79, 76, 45, 49, 56, - 128, 83, 89, 77, 66, 79, 76, 45, 49, 55, 128, 83, 89, 77, 66, 79, 76, 45, - 49, 54, 128, 83, 89, 77, 66, 79, 76, 45, 49, 53, 128, 83, 89, 77, 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, 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, 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, + 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, + 87, 78, 128, 84, 73, 87, 65, 218, 84, 73, 84, 85, 65, 69, 80, 128, 84, + 73, 84, 76, 79, 128, 84, 73, 84, 193, 84, 73, 84, 128, 84, 73, 82, 89, + 65, 75, 128, 84, 73, 82, 84, 193, 84, 73, 82, 79, 78, 73, 65, 206, 84, + 73, 82, 69, 196, 84, 73, 82, 128, 84, 73, 210, 84, 73, 80, 80, 73, 128, + 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, 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, + 128, 83, 89, 77, 66, 79, 76, 45, 53, 52, 128, 83, 89, 77, 66, 79, 76, 45, + 53, 51, 128, 83, 89, 77, 66, 79, 76, 45, 53, 50, 128, 83, 89, 77, 66, 79, + 76, 45, 53, 49, 128, 83, 89, 77, 66, 79, 76, 45, 53, 48, 128, 83, 89, 77, + 66, 79, 76, 45, 53, 128, 83, 89, 77, 66, 79, 76, 45, 52, 57, 128, 83, 89, + 77, 66, 79, 76, 45, 52, 56, 128, 83, 89, 77, 66, 79, 76, 45, 52, 55, 128, + 83, 89, 77, 66, 79, 76, 45, 52, 53, 128, 83, 89, 77, 66, 79, 76, 45, 52, + 51, 128, 83, 89, 77, 66, 79, 76, 45, 52, 50, 128, 83, 89, 77, 66, 79, 76, + 45, 52, 48, 128, 83, 89, 77, 66, 79, 76, 45, 52, 128, 83, 89, 77, 66, 79, + 76, 45, 51, 57, 128, 83, 89, 77, 66, 79, 76, 45, 51, 56, 128, 83, 89, 77, + 66, 79, 76, 45, 51, 55, 128, 83, 89, 77, 66, 79, 76, 45, 51, 54, 128, 83, + 89, 77, 66, 79, 76, 45, 51, 50, 128, 83, 89, 77, 66, 79, 76, 45, 51, 48, + 128, 83, 89, 77, 66, 79, 76, 45, 51, 128, 83, 89, 77, 66, 79, 76, 45, 50, + 57, 128, 83, 89, 77, 66, 79, 76, 45, 50, 55, 128, 83, 89, 77, 66, 79, 76, + 45, 50, 54, 128, 83, 89, 77, 66, 79, 76, 45, 50, 53, 128, 83, 89, 77, 66, + 79, 76, 45, 50, 52, 128, 83, 89, 77, 66, 79, 76, 45, 50, 51, 128, 83, 89, + 77, 66, 79, 76, 45, 50, 50, 128, 83, 89, 77, 66, 79, 76, 45, 50, 49, 128, + 83, 89, 77, 66, 79, 76, 45, 50, 48, 128, 83, 89, 77, 66, 79, 76, 45, 50, + 128, 83, 89, 77, 66, 79, 76, 45, 49, 57, 128, 83, 89, 77, 66, 79, 76, 45, + 49, 56, 128, 83, 89, 77, 66, 79, 76, 45, 49, 55, 128, 83, 89, 77, 66, 79, + 76, 45, 49, 54, 128, 83, 89, 77, 66, 79, 76, 45, 49, 53, 128, 83, 89, 77, + 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, 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, @@ -776,19 +873,20 @@ 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, - 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, + 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, @@ -823,505 +921,513 @@ 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, 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, 128, 83, 72, 69, 78, 128, 83, 72, 69, 76, 76, 128, - 83, 72, 69, 76, 204, 83, 72, 69, 76, 70, 128, 83, 72, 69, 73, 128, 83, - 72, 69, 71, 57, 128, 83, 72, 69, 69, 80, 128, 83, 72, 69, 69, 78, 85, - 128, 83, 72, 69, 69, 78, 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, 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, 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, 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, - 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, - 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, + 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, + 128, 83, 72, 69, 78, 128, 83, 72, 69, 76, 76, 128, 83, 72, 69, 76, 204, + 83, 72, 69, 76, 70, 128, 83, 72, 69, 73, 128, 83, 72, 69, 71, 57, 128, + 83, 72, 69, 69, 80, 128, 83, 72, 69, 69, 78, 85, 128, 83, 72, 69, 69, 78, + 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, 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, 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, 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, 210, 82, 69, 67, 84, 65, 78, 71, 76, 69, 128, 82, 69, - 67, 84, 65, 78, 71, 76, 197, 82, 69, 67, 82, 69, 65, 84, 73, 79, 78, 65, - 204, 82, 69, 67, 79, 82, 68, 73, 78, 199, 82, 69, 67, 79, 82, 68, 69, 82, - 128, 82, 69, 67, 79, 82, 196, 82, 69, 67, 69, 80, 84, 73, 86, 197, 82, - 69, 67, 69, 73, 86, 69, 82, 128, 82, 69, 65, 76, 71, 65, 82, 45, 50, 128, - 82, 69, 65, 76, 71, 65, 82, 128, 82, 69, 65, 72, 77, 85, 75, 128, 82, 69, - 65, 67, 72, 128, 82, 68, 207, 82, 68, 69, 204, 82, 66, 65, 83, 193, 82, - 65, 89, 83, 128, 82, 65, 89, 65, 78, 78, 65, 128, 82, 65, 84, 73, 79, - 128, 82, 65, 84, 72, 65, 128, 82, 65, 84, 72, 193, 82, 65, 84, 65, 128, - 82, 65, 84, 128, 82, 65, 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, 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, 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, + 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, + 210, 82, 69, 67, 84, 65, 78, 71, 76, 69, 128, 82, 69, 67, 84, 65, 78, 71, + 76, 197, 82, 69, 67, 82, 69, 65, 84, 73, 79, 78, 65, 204, 82, 69, 67, 79, + 82, 68, 73, 78, 199, 82, 69, 67, 79, 82, 68, 69, 82, 128, 82, 69, 67, 79, + 82, 196, 82, 69, 67, 69, 80, 84, 73, 86, 197, 82, 69, 67, 69, 73, 86, 69, + 82, 128, 82, 69, 65, 76, 71, 65, 82, 45, 50, 128, 82, 69, 65, 76, 71, 65, + 82, 128, 82, 69, 65, 72, 77, 85, 75, 128, 82, 69, 65, 67, 72, 128, 82, + 68, 207, 82, 68, 69, 204, 82, 66, 65, 83, 193, 82, 65, 89, 83, 128, 82, + 65, 89, 65, 78, 78, 65, 128, 82, 65, 84, 73, 79, 128, 82, 65, 84, 72, 65, + 128, 82, 65, 84, 72, 193, 82, 65, 84, 65, 128, 82, 65, 84, 128, 82, 65, + 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, 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, @@ -1338,63 +1444,67 @@ 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, 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, + 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, @@ -1450,310 +1560,316 @@ 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, 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, 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, 73, 128, - 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, 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, - 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, 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, 69, 84, 128, 78, 89, 69, 212, + 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, 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, 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, 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, 85, 48, 50, 48, 128, 78, 85, 48, 49, 57, - 128, 78, 85, 48, 49, 56, 65, 128, 78, 85, 48, 49, 56, 128, 78, 85, 48, - 49, 55, 128, 78, 85, 48, 49, 54, 128, 78, 85, 48, 49, 53, 128, 78, 85, - 48, 49, 52, 128, 78, 85, 48, 49, 51, 128, 78, 85, 48, 49, 50, 128, 78, - 85, 48, 49, 49, 65, 128, 78, 85, 48, 49, 49, 128, 78, 85, 48, 49, 48, 65, - 128, 78, 85, 48, 49, 48, 128, 78, 85, 48, 48, 57, 128, 78, 85, 48, 48, - 56, 128, 78, 85, 48, 48, 55, 128, 78, 85, 48, 48, 54, 128, 78, 85, 48, - 48, 53, 128, 78, 85, 48, 48, 52, 128, 78, 85, 48, 48, 51, 128, 78, 85, - 48, 48, 50, 128, 78, 85, 48, 48, 49, 128, 78, 84, 85, 85, 128, 78, 84, - 85, 77, 128, 78, 84, 213, 78, 84, 79, 81, 80, 69, 78, 128, 78, 84, 73, - 69, 197, 78, 84, 69, 85, 78, 71, 66, 65, 128, 78, 84, 69, 85, 77, 128, - 78, 84, 69, 78, 128, 78, 84, 69, 69, 128, 78, 84, 65, 80, 128, 78, 84, - 65, 208, 78, 84, 65, 65, 128, 78, 83, 85, 79, 212, 78, 83, 85, 78, 128, - 78, 83, 85, 77, 128, 78, 83, 79, 77, 128, 78, 83, 73, 69, 69, 84, 128, - 78, 83, 73, 69, 69, 80, 128, 78, 83, 73, 69, 69, 128, 78, 83, 72, 85, 84, - 128, 78, 83, 72, 85, 212, 78, 83, 72, 85, 79, 80, 128, 78, 83, 72, 85, - 69, 128, 78, 83, 72, 73, 69, 69, 128, 78, 83, 72, 69, 69, 128, 78, 83, - 72, 65, 81, 128, 78, 83, 72, 65, 128, 78, 83, 69, 85, 65, 69, 78, 128, - 78, 83, 69, 78, 128, 78, 83, 65, 128, 78, 82, 89, 88, 128, 78, 82, 89, - 84, 128, 78, 82, 89, 82, 88, 128, 78, 82, 89, 82, 128, 78, 82, 89, 80, - 128, 78, 82, 89, 128, 78, 82, 85, 88, 128, 78, 82, 85, 84, 128, 78, 82, - 85, 82, 88, 128, 78, 82, 85, 82, 128, 78, 82, 85, 80, 128, 78, 82, 85, - 128, 78, 82, 79, 88, 128, 78, 82, 79, 80, 128, 78, 82, 79, 128, 78, 82, - 69, 88, 128, 78, 82, 69, 84, 128, 78, 82, 69, 80, 128, 78, 82, 69, 128, - 78, 82, 65, 88, 128, 78, 82, 65, 84, 128, 78, 82, 65, 80, 128, 78, 82, - 65, 128, 78, 79, 89, 128, 78, 79, 88, 128, 78, 79, 86, 69, 77, 66, 69, - 82, 128, 78, 79, 84, 84, 79, 128, 78, 79, 84, 69, 83, 128, 78, 79, 84, - 69, 72, 69, 65, 68, 128, 78, 79, 84, 69, 72, 69, 65, 196, 78, 79, 84, 69, - 66, 79, 79, 75, 128, 78, 79, 84, 69, 66, 79, 79, 203, 78, 79, 84, 69, - 128, 78, 79, 84, 197, 78, 79, 84, 67, 72, 69, 196, 78, 79, 84, 67, 72, - 128, 78, 79, 84, 128, 78, 79, 212, 78, 79, 83, 69, 128, 78, 79, 82, 84, - 72, 87, 69, 83, 212, 78, 79, 82, 84, 72, 69, 82, 206, 78, 79, 82, 84, - 200, 78, 79, 82, 77, 65, 204, 78, 79, 210, 78, 79, 80, 128, 78, 79, 79, - 78, 85, 128, 78, 79, 79, 128, 78, 79, 78, 70, 79, 82, 75, 73, 78, 71, - 128, 78, 79, 78, 45, 80, 79, 84, 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, 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, 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, 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, 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, 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, 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, + 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, + 85, 48, 50, 48, 128, 78, 85, 48, 49, 57, 128, 78, 85, 48, 49, 56, 65, + 128, 78, 85, 48, 49, 56, 128, 78, 85, 48, 49, 55, 128, 78, 85, 48, 49, + 54, 128, 78, 85, 48, 49, 53, 128, 78, 85, 48, 49, 52, 128, 78, 85, 48, + 49, 51, 128, 78, 85, 48, 49, 50, 128, 78, 85, 48, 49, 49, 65, 128, 78, + 85, 48, 49, 49, 128, 78, 85, 48, 49, 48, 65, 128, 78, 85, 48, 49, 48, + 128, 78, 85, 48, 48, 57, 128, 78, 85, 48, 48, 56, 128, 78, 85, 48, 48, + 55, 128, 78, 85, 48, 48, 54, 128, 78, 85, 48, 48, 53, 128, 78, 85, 48, + 48, 52, 128, 78, 85, 48, 48, 51, 128, 78, 85, 48, 48, 50, 128, 78, 85, + 48, 48, 49, 128, 78, 84, 85, 85, 128, 78, 84, 85, 77, 128, 78, 84, 213, + 78, 84, 79, 81, 80, 69, 78, 128, 78, 84, 73, 69, 197, 78, 84, 69, 85, 78, + 71, 66, 65, 128, 78, 84, 69, 85, 77, 128, 78, 84, 69, 78, 128, 78, 84, + 69, 69, 128, 78, 84, 65, 80, 128, 78, 84, 65, 208, 78, 84, 65, 65, 128, + 78, 83, 85, 79, 212, 78, 83, 85, 78, 128, 78, 83, 85, 77, 128, 78, 83, + 79, 77, 128, 78, 83, 73, 69, 69, 84, 128, 78, 83, 73, 69, 69, 80, 128, + 78, 83, 73, 69, 69, 128, 78, 83, 72, 85, 84, 128, 78, 83, 72, 85, 212, + 78, 83, 72, 85, 79, 80, 128, 78, 83, 72, 85, 69, 128, 78, 83, 72, 73, 69, + 69, 128, 78, 83, 72, 69, 69, 128, 78, 83, 72, 65, 81, 128, 78, 83, 72, + 65, 128, 78, 83, 69, 85, 65, 69, 78, 128, 78, 83, 69, 78, 128, 78, 83, + 65, 128, 78, 82, 89, 88, 128, 78, 82, 89, 84, 128, 78, 82, 89, 82, 88, + 128, 78, 82, 89, 82, 128, 78, 82, 89, 80, 128, 78, 82, 89, 128, 78, 82, + 85, 88, 128, 78, 82, 85, 84, 128, 78, 82, 85, 82, 88, 128, 78, 82, 85, + 82, 128, 78, 82, 85, 80, 128, 78, 82, 85, 128, 78, 82, 79, 88, 128, 78, + 82, 79, 80, 128, 78, 82, 79, 128, 78, 82, 69, 88, 128, 78, 82, 69, 84, + 128, 78, 82, 69, 80, 128, 78, 82, 69, 128, 78, 82, 65, 88, 128, 78, 82, + 65, 84, 128, 78, 82, 65, 80, 128, 78, 82, 65, 128, 78, 79, 89, 128, 78, + 79, 88, 128, 78, 79, 86, 69, 77, 66, 69, 82, 128, 78, 79, 84, 84, 79, + 128, 78, 79, 84, 69, 83, 128, 78, 79, 84, 69, 72, 69, 65, 68, 128, 78, + 79, 84, 69, 72, 69, 65, 196, 78, 79, 84, 69, 66, 79, 79, 75, 128, 78, 79, + 84, 69, 66, 79, 79, 203, 78, 79, 84, 69, 128, 78, 79, 84, 197, 78, 79, + 84, 67, 72, 69, 196, 78, 79, 84, 67, 72, 128, 78, 79, 84, 128, 78, 79, + 212, 78, 79, 83, 69, 128, 78, 79, 82, 84, 72, 87, 69, 83, 212, 78, 79, + 82, 84, 72, 69, 82, 206, 78, 79, 82, 84, 200, 78, 79, 82, 77, 65, 204, + 78, 79, 210, 78, 79, 80, 128, 78, 79, 79, 78, 85, 128, 78, 79, 79, 128, + 78, 79, 78, 70, 79, 82, 75, 73, 78, 71, 128, 78, 79, 78, 45, 80, 79, 84, + 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, 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, 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, @@ -1774,495 +1890,504 @@ 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, + 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, 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, 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, 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, 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, + 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 72, 69, 85, 65, 69, 80, 128, 75, 69, 85, 83, 69, 85, 88, 128, - 75, 69, 85, 80, 85, 81, 128, 75, 69, 85, 79, 212, 75, 69, 85, 77, 128, - 75, 69, 85, 75, 69, 85, 84, 78, 68, 65, 128, 75, 69, 85, 75, 65, 81, 128, - 75, 69, 85, 65, 69, 84, 77, 69, 85, 78, 128, 75, 69, 85, 65, 69, 82, 73, - 128, 75, 69, 84, 84, 201, 75, 69, 83, 72, 50, 128, 75, 69, 82, 69, 84, - 128, 75, 69, 79, 87, 128, 75, 69, 78, 84, 73, 77, 65, 84, 65, 128, 75, - 69, 78, 84, 73, 77, 65, 84, 193, 75, 69, 78, 84, 73, 77, 193, 75, 69, 78, - 65, 84, 128, 75, 69, 78, 128, 75, 69, 206, 75, 69, 77, 80, 85, 76, 128, - 75, 69, 77, 80, 85, 204, 75, 69, 77, 80, 76, 73, 128, 75, 69, 77, 80, 76, - 201, 75, 69, 77, 80, 72, 82, 69, 78, 71, 128, 75, 69, 77, 66, 65, 78, 71, - 128, 75, 69, 76, 86, 73, 206, 75, 69, 72, 69, 72, 128, 75, 69, 72, 69, - 200, 75, 69, 72, 128, 75, 69, 70, 85, 76, 65, 128, 75, 69, 69, 83, 85, - 128, 75, 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, 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, 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, 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, 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, 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, 82, 80, 79, 76, 65, 84, 73, 79, 206, 73, 78, 84, 69, 82, - 76, 79, 67, 75, 69, 196, 73, 78, 84, 69, 82, 76, 73, 78, 69, 65, 210, 73, - 78, 84, 69, 82, 76, 65, 67, 69, 196, 73, 78, 84, 69, 82, 73, 79, 210, 73, - 78, 84, 69, 82, 69, 83, 212, 73, 78, 84, 69, 82, 67, 65, 76, 65, 84, 69, - 128, 73, 78, 84, 69, 71, 82, 65, 84, 73, 79, 78, 128, 73, 78, 84, 69, 71, - 82, 65, 84, 73, 79, 206, 73, 78, 84, 69, 71, 82, 65, 76, 128, 73, 78, 84, - 69, 71, 82, 65, 204, 73, 78, 83, 85, 76, 65, 210, 73, 78, 83, 84, 82, 85, - 77, 69, 78, 84, 65, 204, 73, 78, 83, 73, 68, 69, 128, 73, 78, 83, 69, 82, - 84, 73, 79, 206, 73, 78, 83, 69, 67, 84, 128, 73, 78, 83, 67, 82, 73, 80, - 84, 73, 79, 78, 65, 204, 73, 78, 80, 85, 212, 73, 78, 78, 79, 67, 69, 78, - 67, 69, 128, 73, 78, 78, 78, 128, 73, 78, 78, 69, 82, 128, 73, 78, 78, - 69, 210, 73, 78, 78, 128, 73, 78, 73, 78, 71, 85, 128, 73, 78, 73, 128, - 73, 78, 72, 73, 66, 73, 212, 73, 78, 72, 69, 82, 69, 78, 212, 73, 78, 71, - 87, 65, 90, 128, 73, 78, 70, 79, 82, 77, 65, 84, 73, 79, 206, 73, 78, 70, - 76, 85, 69, 78, 67, 69, 128, 73, 78, 70, 73, 78, 73, 84, 89, 128, 73, 78, - 70, 73, 78, 73, 84, 217, 73, 78, 68, 85, 83, 84, 82, 73, 65, 204, 73, 78, - 68, 73, 82, 69, 67, 212, 73, 78, 68, 73, 67, 65, 84, 79, 82, 128, 73, 78, - 68, 73, 67, 65, 84, 79, 210, 73, 78, 68, 73, 195, 73, 78, 68, 73, 65, - 206, 73, 78, 68, 69, 88, 128, 73, 78, 68, 69, 80, 69, 78, 68, 69, 78, - 212, 73, 78, 67, 82, 69, 77, 69, 78, 84, 128, 73, 78, 67, 82, 69, 65, 83, - 69, 211, 73, 78, 67, 82, 69, 65, 83, 69, 128, 73, 78, 67, 79, 77, 80, 76, - 69, 84, 197, 73, 78, 67, 79, 77, 73, 78, 199, 73, 78, 67, 76, 85, 68, 73, - 78, 199, 73, 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, + 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, 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, + 72, 69, 85, 65, 69, 80, 128, 75, 69, 85, 83, 69, 85, 88, 128, 75, 69, 85, + 80, 85, 81, 128, 75, 69, 85, 79, 212, 75, 69, 85, 77, 128, 75, 69, 85, + 75, 69, 85, 84, 78, 68, 65, 128, 75, 69, 85, 75, 65, 81, 128, 75, 69, 85, + 65, 69, 84, 77, 69, 85, 78, 128, 75, 69, 85, 65, 69, 82, 73, 128, 75, 69, + 84, 84, 201, 75, 69, 83, 72, 50, 128, 75, 69, 82, 69, 84, 128, 75, 69, + 79, 87, 128, 75, 69, 78, 84, 73, 77, 65, 84, 65, 128, 75, 69, 78, 84, 73, + 77, 65, 84, 193, 75, 69, 78, 84, 73, 77, 193, 75, 69, 78, 65, 84, 128, + 75, 69, 78, 128, 75, 69, 206, 75, 69, 77, 80, 85, 76, 128, 75, 69, 77, + 80, 85, 204, 75, 69, 77, 80, 76, 73, 128, 75, 69, 77, 80, 76, 201, 75, + 69, 77, 80, 72, 82, 69, 78, 71, 128, 75, 69, 77, 66, 65, 78, 71, 128, 75, + 69, 76, 86, 73, 206, 75, 69, 72, 69, 72, 128, 75, 69, 72, 69, 200, 75, + 69, 72, 128, 75, 69, 70, 85, 76, 65, 128, 75, 69, 69, 83, 85, 128, 75, + 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, 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, + 82, 80, 79, 76, 65, 84, 73, 79, 206, 73, 78, 84, 69, 82, 76, 79, 67, 75, + 69, 196, 73, 78, 84, 69, 82, 76, 73, 78, 69, 65, 210, 73, 78, 84, 69, 82, + 76, 65, 67, 69, 196, 73, 78, 84, 69, 82, 73, 79, 210, 73, 78, 84, 69, 82, + 69, 83, 212, 73, 78, 84, 69, 82, 67, 65, 76, 65, 84, 69, 128, 73, 78, 84, + 69, 71, 82, 65, 84, 73, 79, 78, 128, 73, 78, 84, 69, 71, 82, 65, 84, 73, + 79, 206, 73, 78, 84, 69, 71, 82, 65, 76, 128, 73, 78, 84, 69, 71, 82, 65, + 204, 73, 78, 83, 85, 76, 65, 210, 73, 78, 83, 84, 82, 85, 77, 69, 78, 84, + 65, 204, 73, 78, 83, 73, 68, 69, 128, 73, 78, 83, 69, 82, 84, 73, 79, + 206, 73, 78, 83, 69, 67, 84, 128, 73, 78, 83, 67, 82, 73, 80, 84, 73, 79, + 78, 65, 204, 73, 78, 80, 85, 212, 73, 78, 78, 79, 67, 69, 78, 67, 69, + 128, 73, 78, 78, 78, 128, 73, 78, 78, 69, 82, 128, 73, 78, 78, 69, 210, + 73, 78, 78, 128, 73, 78, 73, 78, 71, 85, 128, 73, 78, 73, 128, 73, 78, + 72, 73, 66, 73, 212, 73, 78, 72, 69, 82, 69, 78, 212, 73, 78, 71, 87, 65, + 90, 128, 73, 78, 70, 79, 82, 77, 65, 84, 73, 79, 206, 73, 78, 70, 76, 85, + 69, 78, 67, 69, 128, 73, 78, 70, 73, 78, 73, 84, 89, 128, 73, 78, 70, 73, + 78, 73, 84, 217, 73, 78, 68, 85, 83, 84, 82, 73, 65, 204, 73, 78, 68, 73, + 82, 69, 67, 212, 73, 78, 68, 73, 67, 65, 84, 79, 82, 128, 73, 78, 68, 73, + 67, 65, 84, 79, 210, 73, 78, 68, 73, 195, 73, 78, 68, 73, 65, 206, 73, + 78, 68, 69, 88, 128, 73, 78, 68, 69, 80, 69, 78, 68, 69, 78, 212, 73, 78, + 67, 82, 69, 77, 69, 78, 84, 128, 73, 78, 67, 82, 69, 65, 83, 69, 211, 73, + 78, 67, 82, 69, 65, 83, 69, 128, 73, 78, 67, 79, 77, 80, 76, 69, 84, 197, + 73, 78, 67, 79, 77, 73, 78, 199, 73, 78, 67, 76, 85, 68, 73, 78, 199, 73, + 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, 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, @@ -2417,936 +2542,940 @@ 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, + 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, 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, 128, 72, 73, 68, + 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, 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, + 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, @@ -3362,250 +3491,256 @@ 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, 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, 79, 84, 83, 84, 79, 79, 76, 128, 70, 79, 79, 84, - 80, 82, 73, 78, 84, 83, 128, 70, 79, 79, 84, 78, 79, 84, 197, 70, 79, 79, - 84, 66, 65, 76, 76, 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, 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, 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, + 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, + 79, 84, 83, 84, 79, 79, 76, 128, 70, 79, 79, 84, 80, 82, 73, 78, 84, 83, + 128, 70, 79, 79, 84, 78, 79, 84, 197, 70, 79, 79, 84, 66, 65, 76, 76, + 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, 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, 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, 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, + 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, 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, @@ -3619,568 +3754,575 @@ 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, 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, 73, 71, 78, 128, 68, 69, 83, 73, - 128, 68, 69, 83, 67, 82, 73, 80, 84, 73, 79, 206, 68, 69, 83, 67, 69, 78, - 68, 73, 78, 199, 68, 69, 83, 67, 69, 78, 68, 69, 82, 128, 68, 69, 82, 69, - 84, 45, 72, 73, 68, 69, 84, 128, 68, 69, 82, 69, 84, 128, 68, 69, 80, 65, - 82, 84, 85, 82, 69, 128, 68, 69, 80, 65, 82, 84, 77, 69, 78, 212, 68, 69, - 80, 65, 82, 84, 73, 78, 199, 68, 69, 78, 84, 73, 83, 84, 82, 217, 68, 69, - 78, 84, 65, 204, 68, 69, 78, 79, 77, 73, 78, 65, 84, 79, 82, 128, 68, 69, - 78, 79, 77, 73, 78, 65, 84, 79, 210, 68, 69, 78, 78, 69, 78, 128, 68, 69, - 78, 71, 128, 68, 69, 78, 197, 68, 69, 78, 65, 82, 73, 85, 211, 68, 69, - 76, 84, 65, 128, 68, 69, 76, 84, 193, 68, 69, 76, 84, 128, 68, 69, 76, - 80, 72, 73, 195, 68, 69, 76, 73, 86, 69, 82, 217, 68, 69, 76, 73, 86, 69, - 82, 65, 78, 67, 69, 128, 68, 69, 76, 73, 77, 73, 84, 69, 82, 128, 68, 69, - 76, 73, 77, 73, 84, 69, 210, 68, 69, 76, 73, 67, 73, 79, 85, 211, 68, 69, - 76, 69, 84, 69, 128, 68, 69, 76, 69, 84, 197, 68, 69, 75, 65, 128, 68, - 69, 75, 128, 68, 69, 73, 128, 68, 69, 72, 73, 128, 68, 69, 71, 82, 69, - 197, 68, 69, 70, 73, 78, 73, 84, 73, 79, 78, 128, 68, 69, 70, 69, 67, 84, - 73, 86, 69, 78, 69, 83, 211, 68, 69, 69, 82, 128, 68, 69, 69, 80, 76, 89, - 128, 68, 69, 69, 76, 128, 68, 69, 67, 82, 69, 83, 67, 69, 78, 68, 79, - 128, 68, 69, 67, 82, 69, 65, 83, 69, 128, 68, 69, 67, 79, 82, 65, 84, 73, - 86, 197, 68, 69, 67, 79, 82, 65, 84, 73, 79, 78, 128, 68, 69, 67, 73, 83, - 73, 86, 69, 78, 69, 83, 83, 128, 68, 69, 67, 73, 77, 65, 204, 68, 69, 67, - 73, 68, 85, 79, 85, 211, 68, 69, 67, 69, 77, 66, 69, 82, 128, 68, 69, 67, - 65, 89, 69, 68, 128, 68, 69, 66, 73, 212, 68, 69, 65, 84, 72, 128, 68, - 69, 65, 68, 128, 68, 68, 87, 65, 128, 68, 68, 85, 88, 128, 68, 68, 85, - 84, 128, 68, 68, 85, 82, 88, 128, 68, 68, 85, 82, 128, 68, 68, 85, 80, - 128, 68, 68, 85, 79, 88, 128, 68, 68, 85, 79, 80, 128, 68, 68, 85, 79, - 128, 68, 68, 85, 128, 68, 68, 79, 88, 128, 68, 68, 79, 84, 128, 68, 68, - 79, 80, 128, 68, 68, 79, 65, 128, 68, 68, 73, 88, 128, 68, 68, 73, 84, - 128, 68, 68, 73, 80, 128, 68, 68, 73, 69, 88, 128, 68, 68, 73, 69, 80, - 128, 68, 68, 73, 69, 128, 68, 68, 73, 128, 68, 68, 72, 85, 128, 68, 68, - 72, 79, 128, 68, 68, 72, 73, 128, 68, 68, 72, 69, 69, 128, 68, 68, 72, - 69, 128, 68, 68, 72, 65, 65, 128, 68, 68, 72, 65, 128, 68, 68, 69, 88, - 128, 68, 68, 69, 80, 128, 68, 68, 69, 69, 128, 68, 68, 69, 128, 68, 68, - 68, 72, 65, 128, 68, 68, 68, 65, 128, 68, 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, 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, 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, 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, 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, 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, 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, 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, 67, 72, 73, 84, 85, 69, 85, 77, 67, 73, 69, 85, 67, 128, 67, 72, - 73, 84, 85, 69, 85, 77, 67, 72, 73, 69, 85, 67, 72, 128, 67, 72, 73, 82, - 79, 78, 128, 67, 72, 73, 82, 69, 84, 128, 67, 72, 73, 78, 71, 128, 67, - 72, 73, 78, 69, 83, 197, 67, 72, 73, 78, 128, 67, 72, 73, 77, 69, 128, - 67, 72, 73, 76, 76, 213, 67, 72, 73, 76, 68, 82, 69, 206, 67, 72, 73, 76, - 68, 128, 67, 72, 73, 76, 128, 67, 72, 73, 75, 201, 67, 72, 73, 69, 85, - 67, 72, 45, 75, 72, 73, 69, 85, 75, 72, 128, 67, 72, 73, 69, 85, 67, 72, - 45, 72, 73, 69, 85, 72, 128, 67, 72, 73, 69, 85, 67, 200, 67, 72, 73, 67, - 75, 69, 78, 128, 67, 72, 73, 67, 75, 128, 67, 72, 73, 128, 67, 72, 201, - 67, 72, 72, 65, 128, 67, 72, 69, 88, 128, 67, 72, 69, 86, 82, 79, 206, - 67, 72, 69, 84, 128, 67, 72, 69, 83, 84, 78, 85, 84, 128, 67, 72, 69, 83, + 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, + 73, 71, 78, 128, 68, 69, 83, 73, 128, 68, 69, 83, 67, 82, 73, 80, 84, 73, + 79, 206, 68, 69, 83, 67, 69, 78, 68, 73, 78, 199, 68, 69, 83, 67, 69, 78, + 68, 69, 82, 128, 68, 69, 82, 69, 84, 45, 72, 73, 68, 69, 84, 128, 68, 69, + 82, 69, 84, 128, 68, 69, 80, 65, 82, 84, 85, 82, 69, 128, 68, 69, 80, 65, + 82, 84, 77, 69, 78, 212, 68, 69, 80, 65, 82, 84, 73, 78, 199, 68, 69, 78, + 84, 73, 83, 84, 82, 217, 68, 69, 78, 84, 65, 204, 68, 69, 78, 79, 77, 73, + 78, 65, 84, 79, 82, 128, 68, 69, 78, 79, 77, 73, 78, 65, 84, 79, 210, 68, + 69, 78, 78, 69, 78, 128, 68, 69, 78, 71, 128, 68, 69, 78, 197, 68, 69, + 78, 65, 82, 73, 85, 211, 68, 69, 76, 84, 65, 128, 68, 69, 76, 84, 193, + 68, 69, 76, 84, 128, 68, 69, 76, 80, 72, 73, 195, 68, 69, 76, 73, 86, 69, + 82, 217, 68, 69, 76, 73, 86, 69, 82, 65, 78, 67, 69, 128, 68, 69, 76, 73, + 77, 73, 84, 69, 82, 128, 68, 69, 76, 73, 77, 73, 84, 69, 210, 68, 69, 76, + 73, 67, 73, 79, 85, 211, 68, 69, 76, 69, 84, 69, 128, 68, 69, 76, 69, 84, + 197, 68, 69, 75, 65, 128, 68, 69, 75, 128, 68, 69, 73, 128, 68, 69, 72, + 73, 128, 68, 69, 71, 82, 69, 197, 68, 69, 70, 73, 78, 73, 84, 73, 79, 78, + 128, 68, 69, 70, 69, 67, 84, 73, 86, 69, 78, 69, 83, 211, 68, 69, 69, 82, + 128, 68, 69, 69, 80, 76, 89, 128, 68, 69, 69, 76, 128, 68, 69, 67, 82, + 69, 83, 67, 69, 78, 68, 79, 128, 68, 69, 67, 82, 69, 65, 83, 69, 128, 68, + 69, 67, 79, 82, 65, 84, 73, 86, 197, 68, 69, 67, 79, 82, 65, 84, 73, 79, + 78, 128, 68, 69, 67, 73, 83, 73, 86, 69, 78, 69, 83, 83, 128, 68, 69, 67, + 73, 77, 65, 204, 68, 69, 67, 73, 68, 85, 79, 85, 211, 68, 69, 67, 69, 77, + 66, 69, 82, 128, 68, 69, 67, 65, 89, 69, 68, 128, 68, 69, 66, 73, 212, + 68, 69, 65, 84, 72, 128, 68, 69, 65, 68, 128, 68, 68, 87, 65, 128, 68, + 68, 85, 88, 128, 68, 68, 85, 84, 128, 68, 68, 85, 82, 88, 128, 68, 68, + 85, 82, 128, 68, 68, 85, 80, 128, 68, 68, 85, 79, 88, 128, 68, 68, 85, + 79, 80, 128, 68, 68, 85, 79, 128, 68, 68, 85, 128, 68, 68, 79, 88, 128, + 68, 68, 79, 84, 128, 68, 68, 79, 80, 128, 68, 68, 79, 65, 128, 68, 68, + 73, 88, 128, 68, 68, 73, 84, 128, 68, 68, 73, 80, 128, 68, 68, 73, 69, + 88, 128, 68, 68, 73, 69, 80, 128, 68, 68, 73, 69, 128, 68, 68, 73, 128, + 68, 68, 72, 85, 128, 68, 68, 72, 79, 128, 68, 68, 72, 73, 128, 68, 68, + 72, 69, 69, 128, 68, 68, 72, 69, 128, 68, 68, 72, 65, 65, 128, 68, 68, + 72, 65, 128, 68, 68, 69, 88, 128, 68, 68, 69, 80, 128, 68, 68, 69, 69, + 128, 68, 68, 69, 128, 68, 68, 68, 72, 65, 128, 68, 68, 68, 65, 128, 68, + 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, + 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, + 67, 72, 73, 84, 85, 69, 85, 77, 67, 73, 69, 85, 67, 128, 67, 72, 73, 84, + 85, 69, 85, 77, 67, 72, 73, 69, 85, 67, 72, 128, 67, 72, 73, 82, 79, 78, + 128, 67, 72, 73, 82, 69, 84, 128, 67, 72, 73, 78, 71, 128, 67, 72, 73, + 78, 69, 83, 197, 67, 72, 73, 78, 128, 67, 72, 73, 77, 69, 128, 67, 72, + 73, 76, 76, 213, 67, 72, 73, 76, 68, 82, 69, 206, 67, 72, 73, 76, 68, + 128, 67, 72, 73, 76, 128, 67, 72, 73, 75, 201, 67, 72, 73, 69, 85, 67, + 72, 45, 75, 72, 73, 69, 85, 75, 72, 128, 67, 72, 73, 69, 85, 67, 72, 45, + 72, 73, 69, 85, 72, 128, 67, 72, 73, 69, 85, 67, 200, 67, 72, 73, 67, 75, + 69, 78, 128, 67, 72, 73, 67, 75, 128, 67, 72, 73, 128, 67, 72, 201, 67, + 72, 72, 65, 128, 67, 72, 69, 88, 128, 67, 72, 69, 86, 82, 79, 206, 67, + 72, 69, 84, 128, 67, 72, 69, 83, 84, 78, 85, 84, 128, 67, 72, 69, 83, 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, 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, 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, + 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, @@ -4200,9084 +4342,9481 @@ 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, 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, 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, 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, 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, + 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, 18, 23, 27, 34, 39, 41, 44, 52, 62, 68, 81, 93, 102, 108, - 113, 121, 130, 135, 140, 143, 147, 153, 158, 166, 173, 181, 186, 191, - 194, 200, 208, 215, 225, 230, 237, 246, 249, 252, 257, 263, 267, 276, - 283, 290, 295, 304, 312, 318, 324, 330, 144, 335, 341, 349, 350, 356, - 364, 370, 377, 380, 382, 386, 393, 401, 406, 408, 413, 420, 426, 428, - 435, 440, 442, 316, 445, 447, 452, 457, 463, 470, 479, 489, 494, 498, - 511, 518, 522, 531, 538, 545, 548, 554, 558, 568, 576, 584, 592, 601, - 609, 614, 615, 623, 630, 640, 651, 655, 658, 348, 663, 667, 671, 677, - 683, 685, 688, 692, 695, 704, 708, 717, 720, 723, 731, 736, 740, 743, - 749, 756, 763, 772, 779, 783, 792, 800, 805, 811, 820, 694, 830, 837, - 846, 852, 858, 866, 875, 883, 887, 895, 781, 900, 17, 516, 909, 913, 917, - 924, 931, 935, 939, 942, 945, 953, 960, 964, 969, 977, 980, 192, 986, - 991, 1001, 1010, 1017, 1024, 1030, 1038, 1046, 1052, 1056, 1061, 111, - 1064, 1069, 1075, 1079, 1085, 1088, 1101, 1104, 1108, 1112, 1117, 1120, - 1122, 1125, 1131, 1141, 1147, 1157, 1160, 1165, 1174, 333, 1182, 1185, - 1188, 1194, 1198, 1200, 1205, 1210, 1216, 1221, 1226, 1230, 1235, 1241, - 1246, 1251, 1255, 1260, 1265, 1269, 1274, 1279, 1284, 1290, 1296, 1302, - 1307, 1311, 1316, 1321, 1326, 1330, 1335, 1340, 1345, 1350, 1201, 1206, - 1211, 1217, 1222, 1354, 1227, 1360, 1369, 1231, 1373, 1236, 1242, 1247, - 1377, 1382, 1387, 1391, 1395, 1401, 1405, 1252, 1408, 1412, 1256, 1418, - 1261, 1422, 1426, 1266, 1430, 1435, 1439, 1442, 1446, 1270, 1275, 1451, - 1280, 1457, 1463, 1469, 1475, 1285, 1297, 1303, 1479, 1483, 1487, 1490, - 1308, 1494, 1496, 1501, 1506, 1512, 1517, 1522, 1526, 1531, 1536, 1541, - 1546, 1552, 1557, 1562, 1568, 1574, 1579, 1583, 1588, 1593, 1598, 1603, - 1607, 1615, 1619, 1624, 1629, 1634, 1639, 1643, 1646, 1651, 1656, 1661, - 1666, 1672, 1677, 1681, 1312, 1684, 1689, 1694, 1317, 1698, 1702, 1709, - 1322, 1716, 1327, 1720, 1722, 1727, 1733, 1331, 1738, 1747, 1336, 1752, - 1758, 1341, 1763, 1768, 1771, 1776, 1780, 1784, 1788, 1791, 1795, 1346, - 1351, 1115, 1800, 1806, 1812, 1818, 1824, 1830, 1836, 1842, 1848, 1853, - 1859, 1865, 1871, 1877, 1883, 1889, 1895, 1901, 1907, 1912, 1917, 1922, - 1927, 1932, 1937, 1942, 1947, 1952, 1957, 1963, 1968, 1974, 1979, 1985, - 1991, 1996, 2002, 2008, 2014, 2020, 2025, 2030, 2032, 2033, 2037, 2041, - 2046, 2050, 2054, 2058, 2062, 2065, 2070, 2074, 2079, 2083, 2087, 2092, - 2096, 2099, 2103, 2109, 2123, 2127, 2131, 2135, 2138, 2143, 2147, 2151, - 2154, 2158, 2163, 2168, 2173, 2178, 2182, 2186, 2190, 2195, 2199, 2204, - 2208, 2213, 2219, 2226, 2232, 2237, 2242, 2247, 2253, 2258, 2264, 2269, - 2272, 1218, 2274, 2281, 2289, 2299, 2308, 2322, 2326, 2330, 2343, 2351, - 2355, 2360, 2364, 2367, 2371, 2375, 2380, 2385, 2390, 2394, 2397, 2401, - 2408, 2415, 2421, 2426, 2431, 2437, 2443, 2448, 2451, 1724, 2453, 2459, - 2463, 2468, 2472, 2476, 1729, 1735, 2481, 2485, 2488, 2493, 2498, 2503, - 2508, 2512, 2519, 2524, 2527, 2534, 2540, 2544, 2548, 2552, 2557, 2564, - 2569, 2574, 2581, 2587, 2593, 2599, 2613, 2630, 2645, 2660, 2669, 2674, - 2678, 2683, 2688, 2692, 2704, 2711, 2717, 2222, 2723, 2730, 2736, 2740, - 2743, 2750, 2756, 2760, 2764, 2768, 2055, 2772, 2777, 2782, 2786, 2794, - 2798, 2802, 2806, 2810, 2815, 2820, 2825, 2829, 2834, 2839, 2843, 2848, - 2852, 2855, 2859, 2863, 2868, 2872, 2876, 2882, 2891, 2895, 2899, 2905, - 2910, 2917, 2921, 2931, 2935, 2939, 2944, 2948, 2953, 2959, 2964, 2968, - 2972, 2976, 2411, 2984, 2989, 2995, 3000, 3004, 3009, 3014, 3018, 3024, - 3029, 3035, 3039, 3045, 3050, 3055, 3060, 3065, 3070, 3075, 3080, 3085, - 3090, 3096, 3101, 1228, 80, 3107, 3111, 3115, 3119, 3124, 3128, 3132, - 3136, 3140, 3145, 3149, 3154, 3158, 3161, 3165, 3170, 3174, 3179, 3183, - 3187, 3191, 3196, 3200, 3203, 3216, 3220, 3224, 3228, 3232, 3236, 3239, - 3243, 3247, 3252, 3256, 3261, 3266, 3271, 3275, 3278, 3281, 3287, 3291, - 3295, 3298, 3302, 3306, 3309, 3315, 3320, 3325, 3331, 3336, 3341, 3347, - 3353, 3358, 3363, 3368, 1106, 547, 3373, 3376, 3381, 3385, 3388, 3392, - 3397, 3402, 3406, 3411, 3415, 3420, 3424, 3428, 3434, 3440, 3443, 3446, - 3452, 3459, 3466, 3472, 3479, 3484, 3488, 3495, 3500, 3504, 3514, 3518, - 3522, 3527, 3532, 3542, 2066, 3547, 3551, 3554, 3560, 3565, 3571, 3577, - 3582, 3589, 3593, 3597, 664, 693, 3601, 3608, 3615, 3622, 3628, 3634, - 3639, 3643, 3649, 3654, 3658, 2075, 3662, 3670, 596, 3676, 3687, 3691, - 3701, 2080, 3707, 3712, 3727, 3733, 3740, 3750, 3756, 3761, 3767, 3773, - 3776, 3780, 3785, 3792, 3797, 3801, 3805, 3809, 3813, 3818, 3824, 3166, - 3829, 3841, 3849, 3854, 1528, 3861, 3864, 3867, 3871, 3874, 3880, 3884, - 3898, 3902, 3905, 3909, 3915, 3921, 3926, 3930, 3934, 3940, 3951, 3957, - 3962, 3968, 3972, 3980, 3990, 3996, 4001, 4010, 4018, 4025, 4029, 4035, - 4044, 4053, 4057, 4062, 4067, 4071, 4079, 4083, 4088, 4092, 2088, 1370, - 4098, 4103, 4109, 4114, 4119, 4124, 4129, 4134, 4139, 4145, 4150, 4156, - 4161, 4166, 4171, 4177, 4182, 4187, 4192, 4197, 4203, 4208, 4214, 4219, - 4224, 4229, 4234, 4239, 4244, 4250, 4255, 4260, 339, 456, 4265, 4271, - 4275, 4279, 4284, 4288, 4292, 4295, 4299, 4303, 4307, 4311, 4316, 4320, - 4324, 4330, 4095, 4335, 4338, 4345, 4349, 4362, 4366, 4370, 4374, 4378, - 4382, 4386, 4392, 4399, 4407, 4411, 4419, 4428, 4434, 4446, 4451, 4454, - 4458, 4468, 4476, 4484, 4490, 4494, 4504, 4514, 4522, 4529, 4536, 4542, - 4548, 4555, 4559, 4566, 4576, 4586, 4594, 4601, 4606, 4610, 4618, 4622, - 4627, 4634, 4642, 4647, 4652, 4656, 4670, 4675, 4680, 4687, 4696, 4699, - 4703, 4707, 4710, 4715, 4720, 4729, 4735, 4741, 4747, 4751, 4762, 4772, - 4787, 4802, 4817, 4832, 4847, 4862, 4877, 4892, 4907, 4922, 4937, 4952, - 4967, 4982, 4997, 5012, 5027, 5042, 5057, 5072, 5087, 5102, 5117, 5132, - 5147, 5162, 5177, 5192, 5207, 5222, 5237, 5252, 5267, 5282, 5297, 5312, - 5327, 5342, 5357, 5372, 5387, 5402, 5417, 5432, 5447, 5462, 5477, 5492, - 5507, 5516, 5525, 5530, 5536, 5546, 5550, 5555, 5560, 5568, 5572, 5575, - 5579, 2926, 5582, 5587, 315, 438, 5593, 5601, 5605, 5609, 5612, 5616, - 5622, 5626, 5634, 5640, 5645, 5652, 5659, 5665, 5670, 5677, 5683, 5691, - 5695, 5700, 5712, 5723, 5730, 5734, 5740, 3188, 5744, 5750, 5755, 5760, - 5765, 5771, 5776, 5781, 5786, 5791, 5797, 5802, 5807, 5813, 5818, 5824, - 5829, 5835, 5840, 5846, 5851, 5856, 5861, 5866, 5871, 5877, 5882, 5887, - 5892, 5898, 5904, 5910, 5916, 5922, 5928, 5934, 5940, 5946, 5952, 5958, - 5964, 5969, 5974, 5979, 5984, 5989, 5994, 5999, 6004, 6010, 6016, 6021, - 6027, 6033, 6039, 6044, 6049, 6054, 6059, 6065, 6071, 6076, 6081, 6086, - 6091, 6096, 6102, 6107, 6113, 6119, 6125, 6131, 6137, 6143, 6149, 6155, - 6161, 5611, 6166, 6170, 6174, 6177, 6184, 6187, 6195, 6200, 6205, 6196, - 6210, 2124, 6214, 6220, 6226, 6231, 6236, 6243, 6251, 6256, 6260, 6263, - 6267, 2132, 556, 6271, 6275, 6280, 6286, 6291, 6295, 6298, 6302, 6308, - 6313, 6317, 6324, 6328, 6332, 6336, 966, 761, 6339, 6347, 6354, 6361, - 6367, 6374, 6382, 6389, 6396, 6401, 6413, 1248, 1378, 1383, 6424, 1388, - 6428, 6432, 6441, 6449, 6458, 6464, 6469, 6473, 6479, 6484, 6491, 6495, - 6504, 6513, 6522, 6531, 6536, 6541, 6553, 6558, 6566, 2183, 6570, 6572, - 6577, 6581, 6590, 6598, 1392, 133, 3416, 3421, 6604, 6608, 6617, 6623, - 6628, 6631, 6640, 2657, 6646, 6654, 6658, 6662, 2196, 6666, 6671, 6678, - 6684, 6690, 6693, 6695, 6698, 6706, 6714, 6722, 6725, 6730, 6207, 6733, - 6735, 6740, 6745, 6750, 6755, 6760, 6765, 6770, 6775, 6780, 6785, 6791, - 6796, 6801, 6806, 6812, 6817, 6822, 6827, 6832, 6837, 6842, 6848, 6853, - 6858, 6863, 6868, 6873, 6878, 6883, 6888, 6893, 6898, 6903, 6908, 6913, - 6918, 6923, 6928, 6933, 6939, 6945, 6950, 6955, 6960, 6965, 6970, 2220, - 2227, 2233, 6975, 6981, 6989, 2259, 2265, 6997, 7001, 7006, 7010, 7014, - 7018, 7023, 7027, 7032, 7036, 7039, 7042, 7048, 7054, 7060, 7066, 7072, - 7078, 7084, 7088, 7092, 7096, 7100, 7104, 7109, 7116, 7127, 7135, 7145, - 7152, 7157, 7161, 7172, 7185, 7196, 7209, 7220, 7232, 7244, 7256, 7269, - 7282, 7289, 7295, 7309, 7316, 7322, 7326, 7331, 7335, 7342, 7350, 7354, - 7360, 7364, 7370, 7380, 7384, 7389, 7394, 7401, 7407, 7417, 6369, 7423, - 7427, 7434, 760, 7438, 7442, 7447, 7452, 7457, 7461, 7467, 7475, 7481, - 7485, 7491, 7501, 7505, 7511, 7516, 7520, 7526, 7532, 2120, 7537, 7539, - 7544, 7552, 7561, 7565, 7571, 7576, 7581, 7586, 7591, 7597, 7602, 7607, - 3936, 7612, 7617, 7621, 7627, 7632, 7638, 7643, 7648, 7654, 7659, 7566, - 7665, 7669, 7676, 7682, 7687, 7691, 4666, 7696, 7705, 7710, 7715, 6674, - 6681, 7720, 2812, 7724, 7729, 7734, 7577, 7738, 7582, 7587, 7743, 7750, - 7757, 7763, 7769, 7775, 7780, 7785, 7790, 7592, 7598, 7796, 7802, 7807, - 7815, 7603, 7820, 1054, 7823, 7831, 7837, 7843, 7852, 7860, 7865, 7871, - 7879, 7886, 7901, 7918, 7937, 7946, 7954, 7969, 7980, 7990, 8000, 8008, - 8014, 8026, 8035, 8043, 8050, 8057, 8063, 8068, 8076, 8086, 8093, 8103, - 8113, 8123, 8131, 8138, 8147, 8157, 8171, 8186, 8195, 8203, 8208, 8212, - 8221, 8227, 8232, 8242, 8252, 8262, 8267, 8271, 8280, 8285, 8295, 8306, - 8319, 8332, 8344, 8352, 8357, 8361, 8367, 8372, 8380, 8388, 8395, 8400, - 8408, 8414, 8417, 8421, 8427, 8435, 8440, 8444, 8452, 8461, 8469, 8475, - 8479, 8486, 8497, 8501, 8504, 8510, 7608, 8515, 8521, 8528, 8534, 8539, - 8546, 8553, 8560, 8567, 8574, 8581, 8586, 7914, 8591, 8597, 8604, 8611, - 8616, 8623, 8632, 8636, 8648, 6712, 8652, 8655, 8659, 8663, 8667, 8671, - 8677, 8682, 8688, 8693, 8698, 8704, 8709, 8714, 7397, 8719, 8723, 8727, - 8731, 8736, 8741, 8749, 8755, 8759, 8763, 8770, 8775, 8783, 8788, 8792, - 8795, 8801, 8808, 8812, 8815, 8820, 8824, 3975, 8830, 8839, 36, 8847, - 8853, 8858, 7412, 8863, 8868, 8872, 8875, 8890, 8909, 8921, 8934, 8947, - 8960, 8974, 8987, 9002, 9009, 7613, 9015, 9029, 9034, 9040, 9045, 9053, - 9058, 6500, 9063, 9066, 9073, 9078, 9082, 2817, 975, 9088, 9092, 9098, - 9104, 9109, 9115, 9120, 7622, 9126, 9132, 9137, 9142, 9150, 9156, 9169, - 9177, 9184, 7628, 9190, 9198, 9206, 9213, 9226, 9238, 9248, 9255, 9262, - 9271, 9280, 9288, 9295, 9300, 9306, 7633, 9311, 9317, 7639, 9322, 9325, - 9332, 9338, 9351, 7120, 9362, 9368, 9377, 9385, 9392, 9398, 9404, 9409, - 9413, 9418, 8882, 9424, 7644, 9431, 9436, 9443, 9449, 9455, 9460, 9468, - 9476, 9483, 9487, 9501, 9511, 9516, 9520, 9531, 9537, 9542, 9547, 7649, - 7655, 9551, 9554, 9559, 9571, 9578, 9583, 9587, 9592, 9596, 9603, 9609, - 7660, 7567, 9616, 2822, 8, 9623, 9628, 9632, 9638, 9646, 9656, 9661, - 9666, 9673, 9680, 9684, 9695, 9705, 9714, 9726, 9731, 9735, 9743, 9757, - 9761, 9764, 9772, 9779, 9787, 9791, 9802, 9806, 9813, 9818, 9822, 9828, - 9833, 9837, 9843, 9848, 9859, 9863, 9866, 9872, 9877, 9883, 9889, 9896, - 9907, 9917, 9927, 9936, 9943, 7670, 7677, 7683, 7688, 9949, 9955, 7692, - 9961, 9964, 9971, 9976, 9991, 10007, 10022, 10030, 10036, 808, 411, - 10041, 10049, 10056, 10062, 10067, 10072, 7697, 10074, 10078, 10083, - 10087, 10097, 10102, 10106, 10115, 10119, 10122, 7706, 10129, 10132, - 10140, 10147, 10155, 10159, 10166, 10175, 10178, 10182, 10186, 10192, - 10196, 10200, 10204, 10210, 10220, 10224, 10232, 10236, 10243, 10247, - 10252, 10256, 10263, 10269, 10277, 10283, 10293, 10298, 10303, 10307, - 10315, 3835, 10323, 10328, 7711, 10332, 10336, 10339, 10347, 10354, - 10358, 4486, 10362, 10367, 10371, 10382, 10387, 10393, 10397, 10400, - 10408, 10413, 10418, 10425, 10430, 7716, 10435, 10439, 1686, 4640, 10446, - 10451, 10456, 10461, 10467, 10472, 10478, 10483, 10488, 10493, 10498, - 10503, 10508, 10513, 10518, 10523, 10528, 10533, 10538, 10543, 10548, - 10553, 10558, 10564, 10569, 10574, 10579, 10584, 10589, 10595, 10600, - 10605, 10611, 10616, 10622, 10627, 10633, 10638, 10643, 10648, 10653, - 10659, 10664, 10669, 10674, 729, 139, 10682, 10686, 10691, 10696, 10700, - 10704, 10708, 10713, 10717, 10722, 10726, 10729, 10733, 10737, 10742, - 10752, 10758, 10766, 10770, 10774, 10781, 10789, 10798, 10809, 10816, - 10823, 10832, 10841, 10849, 10858, 10867, 10876, 10885, 10895, 10905, - 10915, 10925, 10935, 10944, 10954, 10964, 10974, 10984, 10994, 11004, - 11014, 11023, 11033, 11043, 11053, 11063, 11073, 11083, 11092, 11102, - 11112, 11122, 11132, 11142, 11152, 11162, 11172, 11182, 11191, 11201, - 11211, 11221, 11231, 11241, 11251, 11261, 11271, 11281, 11291, 11300, - 11306, 11310, 11313, 11317, 11322, 11329, 11335, 11340, 11344, 11349, - 11358, 11366, 11371, 11375, 11379, 11385, 11390, 11396, 7725, 11401, - 11406, 11415, 7730, 11420, 11423, 11429, 11437, 7735, 11444, 11448, - 11452, 11456, 11466, 11472, 11477, 11486, 11494, 11501, 11508, 11513, - 11520, 11525, 11529, 11532, 11543, 11553, 11562, 11570, 11581, 11593, - 11603, 11608, 11612, 11617, 11622, 11626, 11632, 11640, 11647, 11658, - 11663, 11673, 11682, 11686, 11689, 11696, 11706, 11715, 11722, 11726, - 11733, 11739, 11744, 11749, 11753, 11762, 11767, 11773, 11777, 11782, - 11786, 11795, 11803, 11811, 11818, 11826, 11838, 11849, 11859, 11866, - 11872, 11881, 11892, 11901, 11913, 11925, 11937, 11947, 11956, 11965, - 11973, 11980, 11989, 11997, 12003, 12009, 12014, 6228, 12018, 12020, - 12025, 12031, 12040, 12048, 12055, 12064, 12073, 12082, 12091, 12100, - 12109, 12118, 12127, 12137, 12147, 12156, 12162, 12169, 12183, 12190, - 12198, 12207, 12213, 12222, 12231, 12242, 12252, 12260, 12267, 12275, - 12284, 12297, 12305, 12312, 12325, 12331, 12337, 12347, 12356, 12365, - 12370, 12374, 12380, 12386, 12393, 7411, 12398, 12403, 12410, 12415, - 12420, 12424, 12432, 12438, 12443, 12451, 12459, 12466, 12474, 12480, - 12488, 12496, 12501, 12507, 12514, 12520, 12525, 12529, 12540, 12548, - 12554, 12559, 12568, 12574, 12579, 12588, 12602, 3794, 12606, 12611, - 12616, 12622, 12627, 12632, 12636, 12641, 12646, 12651, 6227, 12656, - 12661, 12666, 12671, 12676, 12680, 12685, 12690, 12695, 12700, 12706, - 12712, 12717, 12721, 12726, 12731, 12736, 7739, 12741, 12746, 12751, - 12756, 12761, 12778, 12796, 12808, 12821, 12838, 12854, 12871, 12881, - 12900, 12911, 12922, 12933, 12944, 12956, 12967, 12978, 12995, 13006, - 13017, 13022, 13027, 2340, 13031, 13034, 13040, 13048, 13056, 13061, - 13069, 13077, 13084, 13089, 13095, 13102, 13110, 13117, 13129, 13137, - 13142, 9985, 13148, 13157, 13166, 13174, 13181, 13187, 13195, 13202, - 13208, 13215, 13221, 13230, 13238, 13248, 13255, 13261, 13269, 13275, - 13283, 13290, 13303, 13310, 13319, 13328, 13337, 13345, 13355, 13362, - 13367, 3508, 13374, 13379, 13382, 12657, 13386, 13392, 13396, 13404, - 13416, 13421, 13428, 13434, 13439, 13446, 12662, 13450, 13454, 12667, - 13458, 12672, 13462, 13469, 13474, 13478, 13482, 13490, 13497, 13504, - 13521, 13530, 13534, 13537, 13545, 13551, 13556, 3586, 13560, 13562, - 13570, 13577, 13587, 13599, 13604, 13610, 13615, 13619, 13625, 13630, - 13636, 13639, 13646, 13654, 13661, 13667, 13673, 13678, 13685, 13691, - 13696, 13703, 13707, 13713, 13717, 13724, 13730, 13736, 13744, 13750, - 13755, 13761, 13769, 13777, 13783, 13789, 13794, 13801, 13806, 13810, - 13816, 13821, 13828, 13833, 13839, 13842, 13848, 13854, 13857, 13861, - 13873, 13879, 13884, 13891, 13897, 13903, 13914, 13924, 13933, 13941, - 13948, 13959, 13969, 13979, 13987, 13990, 12686, 13995, 14000, 12691, - 12826, 14008, 14021, 14036, 14047, 12843, 14065, 14078, 14091, 14102, - 8897, 14113, 14126, 14145, 14156, 14167, 14178, 2608, 14191, 14195, - 14203, 14214, 14221, 14227, 14235, 14239, 14245, 14248, 14258, 14266, - 14273, 14281, 14291, 14296, 14303, 14308, 14315, 14326, 14336, 14342, - 14347, 14352, 12696, 14356, 14362, 14368, 14373, 14378, 14383, 14387, - 12701, 12707, 14391, 12713, 14396, 14404, 14413, 14420, 7588, 14424, - 14426, 14431, 14436, 14442, 14447, 14452, 14457, 14462, 14466, 14472, - 14478, 14483, 14489, 14494, 14499, 14505, 14510, 14515, 14520, 14525, - 14531, 14536, 14541, 14547, 14553, 14558, 14563, 14570, 14576, 14587, - 14594, 14599, 14603, 14607, 14610, 14618, 14623, 14630, 14637, 14643, - 14648, 14653, 14660, 14670, 14675, 14682, 14688, 14698, 14708, 14722, - 14736, 14750, 14764, 14779, 14794, 14811, 14829, 14842, 14848, 14853, - 14858, 14862, 14867, 14875, 14881, 14886, 14891, 14895, 14900, 14904, - 14909, 14913, 14924, 14930, 14935, 14940, 14947, 14952, 14956, 14961, - 14966, 14972, 14979, 14985, 14990, 14994, 15000, 15005, 15010, 15014, - 15020, 15025, 15030, 15037, 15042, 11468, 15046, 15051, 15055, 15060, - 15066, 15072, 15079, 15089, 15097, 15104, 15109, 15113, 15122, 15130, - 15137, 15144, 15150, 15156, 15161, 15166, 15172, 15177, 15183, 15188, - 15194, 15200, 15207, 15213, 15218, 15223, 7781, 15232, 15235, 15241, - 15246, 15251, 15261, 15268, 15274, 15279, 15284, 15290, 15295, 15301, - 15306, 15312, 15318, 15323, 15331, 15338, 15343, 15348, 15354, 15359, - 15363, 15372, 15383, 15390, 15395, 15403, 15409, 15416, 15422, 15427, - 15431, 15437, 15442, 15447, 15452, 7786, 6252, 2836, 15456, 15460, 15464, - 15468, 15472, 15475, 15482, 15490, 12727, 15497, 15507, 15515, 15522, - 15530, 15540, 15549, 15562, 15567, 15572, 15580, 15587, 11558, 11567, - 15594, 15604, 15619, 15625, 15632, 15639, 15645, 15655, 15665, 12732, - 15674, 15680, 15686, 15694, 15702, 15707, 15716, 15724, 15736, 15746, - 15756, 15766, 15775, 15787, 15797, 15807, 15818, 15823, 15835, 15847, - 15859, 15871, 15883, 15895, 15907, 15919, 15931, 15943, 15954, 15966, - 15978, 15990, 16002, 16014, 16026, 16038, 16050, 16062, 16074, 16085, - 16097, 16109, 16121, 16133, 16145, 16157, 16169, 16181, 16193, 16205, - 16216, 16228, 16240, 16252, 16264, 16276, 16288, 16300, 16312, 16324, - 16336, 16347, 16359, 16371, 16383, 16395, 16407, 16419, 16431, 16443, - 16455, 16467, 16478, 16490, 16502, 16514, 16526, 16538, 16550, 16562, - 16574, 16586, 16598, 16609, 16621, 16633, 16645, 16657, 16669, 16681, - 16693, 16705, 16717, 16729, 16740, 16752, 16764, 16776, 16788, 16801, - 16814, 16827, 16840, 16853, 16866, 16879, 16891, 16904, 16917, 16930, - 16943, 16956, 16969, 16982, 16995, 17008, 17021, 17033, 17046, 17059, - 17072, 17085, 17098, 17111, 17124, 17137, 17150, 17163, 17175, 17188, - 17201, 17214, 17227, 17240, 17253, 17266, 17279, 17292, 17305, 17317, - 17330, 17343, 17356, 17369, 17382, 17395, 17408, 17421, 17434, 17447, - 17459, 17472, 17485, 17498, 17511, 17524, 17537, 17550, 17563, 17576, - 17589, 17601, 17612, 17625, 17638, 17651, 17664, 17677, 17690, 17703, - 17716, 17729, 17742, 17754, 17767, 17780, 17793, 17806, 17819, 17832, - 17845, 17858, 17871, 17884, 17896, 17909, 17922, 17935, 17948, 17961, - 17974, 17987, 18000, 18013, 18026, 18038, 18051, 18064, 18077, 18090, - 18103, 18116, 18129, 18142, 18155, 18168, 18180, 18193, 18206, 18219, - 18232, 18245, 18258, 18271, 18284, 18297, 18310, 18322, 18335, 18348, - 18361, 18374, 18387, 18400, 18413, 18426, 18439, 18452, 18464, 18477, - 18490, 18503, 18516, 18529, 18542, 18555, 18568, 18581, 18594, 18606, - 18619, 18632, 18645, 18658, 18671, 18684, 18697, 18710, 18723, 18736, - 18748, 18761, 18774, 18787, 18800, 18813, 18826, 18839, 18852, 18865, - 18878, 18890, 18903, 18916, 18929, 18942, 18955, 18968, 18981, 18994, - 19007, 19020, 19032, 19043, 19051, 19058, 19064, 19068, 19074, 19080, - 19088, 19094, 19099, 19103, 19112, 7593, 19123, 19130, 19138, 19145, - 19152, 9345, 19159, 19168, 19173, 19178, 6268, 19185, 19190, 19193, - 19198, 19206, 19213, 19220, 19227, 19233, 19242, 19251, 19257, 19266, - 19272, 19277, 19287, 19294, 19300, 19308, 19314, 19321, 19331, 19340, - 19344, 19351, 19355, 19360, 19366, 19374, 19378, 19388, 12742, 19397, - 19403, 19407, 19416, 12747, 19422, 19429, 19440, 19448, 19457, 7376, - 19465, 19470, 19476, 19481, 19485, 19489, 19493, 8072, 19498, 19506, - 19513, 19522, 19529, 19536, 9275, 19543, 19549, 19553, 19559, 19565, - 19573, 19579, 19586, 19592, 19598, 19607, 19611, 19619, 19628, 19635, - 19640, 19644, 19655, 19660, 19665, 19670, 19683, 6455, 19687, 19693, - 19701, 19705, 19712, 19721, 19726, 13018, 19734, 19746, 19751, 19755, - 19758, 19764, 19770, 19775, 19779, 19782, 19793, 19798, 7816, 19805, - 7604, 7821, 19810, 19815, 19820, 19825, 19830, 19835, 19840, 19845, - 19850, 19855, 19860, 19865, 19871, 19876, 19881, 19886, 19891, 19896, - 19901, 19906, 19911, 19916, 19922, 19928, 19933, 19938, 19943, 19948, - 19953, 19958, 19963, 19968, 19973, 19979, 19984, 19989, 19994, 20000, - 20006, 20011, 20016, 20021, 20026, 20031, 20036, 20041, 20046, 20052, - 20057, 20062, 20067, 20072, 20078, 20083, 20088, 20092, 129, 20100, - 20104, 20108, 20112, 20117, 20121, 20125, 10829, 20129, 20134, 20138, - 20143, 20147, 20152, 20156, 20162, 20167, 20171, 20175, 20183, 20187, - 20191, 20196, 20201, 20205, 20211, 20216, 20220, 20225, 20230, 20234, - 20241, 20248, 20255, 20259, 20263, 20268, 20272, 20275, 20281, 20294, - 20299, 20308, 20313, 7861, 20318, 20321, 2671, 2676, 20325, 20331, 20337, - 20342, 20347, 20352, 20358, 20363, 12238, 20368, 20373, 20378, 20383, - 20389, 20394, 20399, 20405, 20410, 20414, 20419, 20424, 20429, 20434, - 20438, 20443, 20447, 20452, 20457, 20462, 20467, 20471, 20476, 20480, - 20485, 20490, 20495, 20500, 2845, 20415, 20504, 20512, 20519, 8166, - 20531, 20539, 20420, 20546, 20551, 20559, 20425, 20564, 20569, 20577, - 20582, 20430, 20587, 20592, 20596, 20602, 20605, 20612, 20616, 20620, - 20626, 20633, 20638, 7403, 1691, 1696, 20642, 20648, 20654, 20659, 20663, - 20667, 20671, 20674, 20680, 20687, 20695, 20701, 20707, 20712, 20717, - 20721, 13112, 13965, 20726, 20738, 20741, 20748, 14639, 20755, 20763, - 20774, 20783, 20796, 20806, 20820, 20832, 20846, 20858, 20868, 20880, - 20886, 20901, 20925, 20943, 20962, 20975, 20989, 21007, 21023, 21040, - 21058, 21069, 21088, 21105, 21125, 21143, 21155, 21169, 21183, 21195, - 21212, 21231, 21249, 21261, 21279, 21298, 12886, 21311, 21331, 21343, - 8928, 21355, 21360, 21365, 21370, 21376, 21381, 21385, 21392, 2357, - 21396, 21402, 21406, 21409, 21413, 21421, 21427, 20448, 21431, 21440, - 21451, 21457, 21463, 21472, 21480, 21487, 21492, 21499, 21505, 21514, - 21522, 21529, 21539, 21548, 21558, 21563, 21572, 21581, 21592, 21603, - 3893, 21613, 21617, 21627, 21635, 21645, 21656, 21661, 21669, 21676, - 21682, 21687, 20458, 21691, 21700, 21704, 21707, 21712, 21719, 21728, - 21736, 21744, 21754, 21763, 21769, 21775, 20463, 20468, 21779, 21789, - 21799, 21809, 21817, 21824, 21834, 21842, 21850, 21856, 982, 21865, - 13073, 542, 21879, 21888, 21896, 21907, 21918, 21928, 21937, 21949, - 21958, 21967, 21973, 21982, 21991, 22001, 22009, 22017, 7793, 22023, - 22026, 22030, 22035, 22040, 8281, 20481, 20486, 22048, 22054, 22060, - 22065, 22070, 22074, 22082, 22088, 22094, 22098, 3480, 22106, 22111, - 22116, 22120, 22124, 8353, 22131, 22139, 22146, 22152, 8362, 8368, 22160, - 22168, 22175, 22180, 22185, 20491, 22191, 22202, 22207, 2560, 22212, - 22223, 22229, 22234, 22238, 22242, 22245, 22252, 22259, 22266, 22272, - 22276, 20496, 22281, 22285, 999, 22289, 22294, 22299, 22304, 22309, - 22314, 22319, 22324, 22329, 22334, 22339, 22344, 22349, 22354, 22360, - 22365, 22370, 22375, 22380, 22385, 22390, 22396, 22401, 22406, 22411, - 22416, 22421, 22426, 22431, 22437, 22443, 22448, 22454, 22459, 22464, 5, - 22470, 22474, 22478, 22482, 22487, 22491, 22495, 22499, 22503, 22508, - 22512, 22517, 22521, 22524, 22528, 22533, 22537, 22542, 22546, 22550, - 22554, 22559, 22563, 22567, 22577, 22582, 22586, 22590, 22595, 22600, - 22609, 22614, 22619, 22623, 22627, 22640, 22652, 22661, 22670, 22676, - 22681, 22685, 22689, 22699, 22708, 22716, 22722, 22727, 22731, 22738, - 22748, 22757, 22765, 22773, 22780, 22788, 22797, 22806, 22814, 22819, - 22823, 22827, 22830, 22832, 22836, 22840, 22845, 22850, 22854, 22858, - 22861, 22865, 22868, 22872, 22875, 22878, 22882, 22888, 22892, 22896, - 22900, 22905, 22910, 22915, 22919, 22922, 22927, 22933, 22938, 22944, - 22949, 22953, 22957, 22961, 22966, 22970, 22975, 22979, 22986, 22990, - 22993, 22997, 23003, 23009, 23013, 23017, 23022, 23029, 23035, 23039, - 23048, 23052, 23056, 23059, 23065, 23070, 23076, 1453, 1755, 23081, - 23086, 23091, 23096, 23101, 23106, 23111, 2107, 2153, 23116, 23119, - 23123, 23127, 23132, 23136, 23140, 23143, 23148, 23153, 23157, 23160, - 23165, 23169, 23174, 23178, 13085, 23183, 23186, 23189, 23193, 23198, - 23202, 23215, 23219, 23222, 23230, 23239, 23246, 23251, 23257, 23263, - 23270, 23277, 23281, 23285, 23289, 23294, 23299, 23303, 23311, 23316, - 23328, 23339, 23344, 23348, 23352, 23358, 23363, 23368, 23372, 23375, - 23381, 6375, 2275, 23385, 23390, 23406, 7908, 23426, 23435, 23451, 23455, - 23458, 23464, 23474, 23480, 23495, 23507, 23518, 23526, 23535, 23541, - 23550, 23560, 23571, 23582, 23591, 23600, 23608, 23615, 23623, 23636, - 23643, 23649, 23654, 23663, 23669, 23674, 23682, 21637, 23694, 23706, - 23720, 23728, 23735, 23747, 23756, 23765, 23773, 23781, 23789, 23796, - 23805, 23813, 23823, 23832, 23842, 23851, 23860, 23868, 23873, 23877, - 23880, 23884, 23888, 23892, 23896, 23900, 23906, 23912, 23920, 13130, - 23927, 23932, 23939, 23945, 23952, 13138, 23959, 23962, 23974, 23982, - 23988, 23993, 23997, 8311, 24008, 24018, 24027, 24034, 24038, 13143, - 24041, 24048, 24052, 24058, 24061, 24068, 24074, 24078, 24083, 24087, - 24096, 24103, 24109, 6416, 24116, 24124, 24131, 24137, 24142, 24148, - 24154, 24162, 24166, 24169, 24171, 23885, 24180, 24186, 24196, 24201, - 24208, 24214, 24219, 24224, 24229, 24234, 24241, 24250, 24257, 24266, - 24272, 24277, 24283, 24288, 24295, 24306, 24311, 24315, 24325, 24331, - 24335, 24340, 24350, 24359, 24363, 24370, 24378, 24385, 24391, 24396, - 24404, 24411, 24423, 24432, 24436, 11410, 24444, 24454, 24458, 23226, - 24469, 24474, 24478, 24485, 24492, 20207, 23810, 24497, 24501, 24504, - 21075, 24509, 24523, 24539, 24557, 24576, 24593, 24611, 21094, 24628, - 24648, 21111, 24660, 24672, 14052, 24684, 21131, 24698, 24710, 8941, - 24724, 24729, 24734, 24739, 24745, 24751, 24757, 24761, 24768, 24773, - 24783, 24789, 8594, 24795, 24797, 24802, 24810, 24814, 24237, 24820, - 24827, 9921, 9931, 24834, 24844, 24849, 24853, 24856, 24862, 24870, - 24882, 24892, 24908, 24921, 24935, 14070, 24949, 24956, 24960, 24963, - 24968, 24972, 24979, 24986, 24996, 25001, 25006, 25011, 25019, 25027, - 25036, 25041, 8005, 25045, 25048, 25051, 25056, 25063, 25068, 25084, - 25092, 25100, 7856, 25108, 25113, 25117, 25123, 25129, 25132, 25138, - 25150, 25158, 25165, 25171, 25178, 25189, 25203, 25216, 25225, 25237, - 25248, 25258, 25267, 25276, 25284, 25295, 6398, 25302, 25308, 25313, - 25319, 25326, 25336, 25346, 25355, 25361, 25368, 25373, 25380, 25388, - 25396, 25408, 4725, 25415, 25424, 25432, 25438, 25444, 25449, 25453, - 25456, 25462, 25469, 25474, 25479, 25483, 25495, 25506, 25515, 25523, - 13270, 25528, 25534, 25540, 9914, 7086, 25545, 25548, 25551, 25557, - 25565, 25573, 25577, 25581, 25586, 25589, 25598, 25602, 25610, 25621, - 25625, 25631, 25637, 25641, 25647, 25655, 25677, 25701, 25708, 25715, - 25721, 25727, 25732, 25743, 25761, 25768, 25776, 25780, 25789, 25802, - 25810, 25822, 25833, 25843, 25857, 25866, 25874, 25886, 7925, 25897, - 25908, 25920, 25930, 25939, 25944, 25948, 25956, 25966, 25971, 25975, - 25978, 25981, 25989, 25997, 26006, 26016, 26025, 26031, 26045, 2622, - 26067, 26078, 26087, 26097, 26109, 26118, 26128, 26136, 26144, 26153, - 26158, 26169, 26174, 26185, 26189, 26199, 26208, 26216, 26226, 26236, - 26244, 26253, 26260, 26268, 26275, 26284, 26288, 26296, 26303, 26311, - 26318, 26329, 26344, 26351, 26357, 26367, 26376, 26382, 26386, 26393, - 12360, 26399, 26403, 26408, 26412, 26416, 26424, 26432, 26438, 26447, - 26454, 26459, 26464, 26474, 21689, 26478, 26481, 26486, 26491, 26496, - 26501, 26506, 26511, 26516, 26521, 26527, 26532, 26537, 26543, 1224, 684, - 26548, 26557, 2323, 26564, 26569, 26573, 26579, 1257, 546, 338, 26584, - 26593, 26601, 26610, 26618, 26629, 26638, 26646, 26650, 26653, 26661, - 26669, 26674, 13098, 26680, 26686, 26692, 4367, 26697, 26701, 26707, - 26711, 26718, 1419, 26724, 8012, 26731, 26741, 26749, 26755, 26764, - 26772, 26778, 26786, 26793, 9507, 26799, 26806, 26813, 1460, 2106, 26819, - 26825, 26832, 26843, 26854, 26862, 26869, 26879, 26888, 26896, 26903, - 26910, 26923, 26934, 1262, 26953, 26958, 26966, 3523, 26970, 26975, - 26979, 1423, 22859, 26989, 26993, 26998, 27002, 3448, 27008, 27016, - 27023, 27034, 27042, 27050, 3524, 274, 27055, 27063, 27071, 27078, 27084, - 27089, 2175, 27096, 27102, 24079, 24301, 27108, 106, 27112, 27116, 27122, - 611, 7761, 27127, 27134, 27140, 2286, 27144, 27148, 27151, 27154, 27159, - 27166, 27172, 27177, 27185, 27192, 27198, 20584, 27202, 3594, 14902, - 27206, 27211, 27214, 27222, 27230, 27233, 27240, 27250, 27262, 27267, - 27271, 27279, 27286, 27292, 27299, 27306, 27309, 27313, 27317, 1427, - 27327, 27329, 27334, 27340, 27346, 27351, 27356, 27361, 27366, 27371, - 27376, 27381, 27386, 27391, 27396, 27401, 27406, 27411, 27416, 27422, - 27428, 27434, 27440, 27445, 27450, 27455, 27461, 27466, 27471, 27476, - 27482, 27487, 27493, 27498, 27503, 27508, 27513, 27519, 27524, 27530, - 27535, 27540, 27545, 27550, 27556, 27561, 27567, 27572, 27577, 27582, - 27587, 27592, 27597, 27602, 27607, 27612, 27618, 27624, 27630, 27635, - 27640, 27645, 27650, 27656, 27662, 27668, 27674, 27680, 27686, 27691, - 27697, 27702, 27707, 27712, 27717, 27723, 2402, 27728, 2409, 2416, 2713, - 27733, 2422, 2432, 27739, 27743, 27748, 27753, 27759, 27764, 27769, - 27773, 27778, 27784, 27789, 27794, 27799, 27805, 27810, 27814, 27818, - 27823, 27828, 27833, 27838, 27843, 27849, 27855, 27860, 27864, 27869, - 27875, 27879, 27884, 27889, 27894, 27899, 27903, 27906, 27911, 27916, - 27921, 27926, 27931, 27937, 27943, 27948, 27953, 27957, 27962, 27967, - 27972, 27977, 27982, 27986, 27991, 27996, 28001, 28005, 28009, 28013, - 28018, 28026, 28031, 28037, 28043, 28049, 28054, 28058, 28061, 28066, - 28070, 28075, 28079, 28084, 28088, 28091, 28096, 15575, 28101, 28106, - 28114, 19525, 26728, 7464, 28119, 28124, 28128, 28133, 28137, 28141, - 28146, 28150, 28153, 28156, 28160, 28165, 28169, 28177, 28181, 28184, - 28189, 28193, 28197, 28202, 28207, 28211, 28217, 28222, 28227, 28234, - 28241, 28245, 28248, 28254, 28263, 28270, 28278, 28285, 28289, 28294, - 28298, 28304, 28310, 28314, 28320, 28325, 28330, 28337, 28343, 28349, - 28355, 28361, 28368, 28374, 28380, 28386, 28392, 28398, 28404, 28410, - 28417, 28423, 28430, 28436, 28442, 28448, 28454, 28460, 28466, 28472, - 28478, 28484, 9815, 28490, 28495, 28500, 28503, 28511, 28516, 28525, - 28531, 28536, 28541, 28546, 28550, 28555, 28560, 28565, 28570, 28575, - 28582, 28589, 28595, 28601, 28606, 14580, 28613, 28619, 28626, 28632, - 28638, 28643, 28651, 28656, 14359, 28660, 28665, 28670, 28676, 28681, - 28686, 28690, 28695, 28700, 28706, 28711, 28716, 28720, 28725, 28730, - 28734, 28739, 28744, 28749, 28753, 28758, 28763, 28768, 28772, 28776, - 13600, 28780, 28789, 28795, 28801, 28810, 28818, 28827, 28835, 28840, - 28844, 28851, 28857, 28861, 28864, 28869, 28878, 28886, 28891, 1459, - 28897, 28900, 28904, 20649, 20655, 28910, 28914, 28925, 28936, 28947, - 28959, 28966, 28973, 28978, 28982, 4404, 747, 19524, 28990, 28995, 28999, - 29004, 29008, 29014, 29019, 29025, 29030, 29036, 29041, 29047, 29052, - 29058, 29064, 29070, 29075, 29031, 29037, 29079, 29085, 29090, 29096, - 29101, 29107, 29112, 29042, 8826, 29053, 29059, 29065, 2790, 3378, 29116, - 29119, 29125, 29131, 29137, 29144, 29150, 29156, 29162, 29168, 29174, - 29180, 29186, 29192, 29198, 29204, 29210, 29216, 29223, 29229, 29235, - 29241, 29247, 29253, 29258, 29261, 29268, 29276, 29281, 29286, 29292, - 29297, 29302, 29306, 29311, 29317, 29322, 29328, 29333, 29339, 29344, - 29350, 29356, 29360, 29365, 29370, 29375, 29380, 29384, 29389, 29394, - 29399, 29405, 29411, 29417, 29423, 29428, 29432, 29435, 29441, 29447, - 29456, 29464, 29471, 29476, 29480, 29484, 29489, 13464, 29494, 29502, - 29508, 3624, 29513, 29516, 29520, 6465, 29526, 29532, 29539, 6474, 29543, - 29549, 29556, 29562, 29571, 29579, 29591, 29595, 29602, 29608, 29612, - 29615, 29624, 29632, 29032, 29637, 29647, 29657, 29667, 29673, 29678, - 29688, 29693, 29706, 29720, 29731, 29743, 29755, 29769, 29782, 29794, - 29806, 12927, 29820, 29825, 29830, 29834, 29838, 29842, 1744, 25246, - 29846, 29851, 29856, 29860, 29863, 29868, 29873, 29878, 29884, 29890, - 8523, 29895, 29902, 14004, 29908, 29913, 29918, 29922, 29927, 29932, - 29080, 29937, 29942, 29947, 29953, 29086, 29958, 29961, 29968, 29976, - 29982, 29988, 29994, 30005, 30010, 30017, 30024, 30031, 30039, 30048, - 30057, 30063, 30069, 30077, 29091, 30082, 30088, 30094, 29097, 30099, - 30107, 30115, 30121, 30128, 30134, 30141, 30148, 30154, 30162, 30172, - 30179, 30184, 30190, 30195, 30200, 30207, 30216, 30224, 30229, 30235, - 30242, 30250, 30256, 30261, 30267, 30276, 26011, 30283, 30287, 30292, - 30301, 30306, 30311, 30316, 10762, 30324, 30329, 30334, 30339, 30343, - 30348, 30353, 30360, 30365, 30370, 29102, 29108, 30376, 2478, 244, 30379, - 30382, 30386, 30390, 30400, 30408, 30412, 30419, 30426, 30430, 30433, - 30439, 30447, 30455, 30459, 30463, 30466, 30473, 30477, 30484, 30492, - 29043, 30499, 30507, 689, 302, 30519, 30524, 30529, 30535, 30540, 30545, - 3645, 30550, 30553, 30558, 30563, 30568, 30573, 30578, 30585, 20734, - 30590, 30595, 30600, 30605, 30610, 30616, 30621, 30627, 29264, 30633, - 30638, 30644, 30650, 30660, 30665, 30670, 30674, 30679, 30684, 30689, - 30694, 30707, 30712, 20535, 14982, 3651, 30716, 30721, 30726, 30732, - 30737, 30742, 30746, 30751, 30756, 30762, 30767, 30772, 30776, 30781, - 30786, 30791, 30795, 30800, 30805, 30810, 30816, 30822, 30827, 30831, - 30836, 30841, 30846, 30850, 30858, 30862, 30868, 30872, 30879, 14775, - 29054, 30885, 30892, 30900, 30907, 30913, 30925, 30931, 30935, 2732, - 30939, 30943, 30468, 30952, 30963, 30968, 30973, 30978, 30982, 30987, - 20660, 30991, 30996, 29060, 19545, 31000, 31005, 31011, 31016, 31020, - 31024, 31027, 31031, 31037, 31048, 31060, 29066, 31065, 31068, 347, - 31072, 31077, 31082, 31087, 31092, 31097, 31103, 31108, 31113, 31119, - 31124, 31130, 31135, 31141, 31146, 31151, 31156, 31161, 31166, 31171, - 31176, 31181, 31187, 31192, 31197, 31202, 31207, 31212, 31217, 31222, - 31228, 31234, 31239, 31244, 31249, 31254, 31259, 31264, 31269, 31274, - 31279, 31284, 31289, 31294, 31299, 31304, 31309, 31314, 31319, 31324, - 31330, 26, 31335, 31339, 31343, 31351, 31355, 31359, 31362, 31365, 31367, - 31372, 31376, 31381, 31385, 31390, 31394, 31399, 31403, 31406, 31408, - 31413, 31417, 31428, 31431, 31433, 31437, 31449, 31458, 31462, 31466, - 31472, 31477, 31486, 31492, 31497, 31502, 31506, 31511, 31518, 31523, - 31529, 31534, 31538, 31545, 23818, 23828, 31549, 31554, 31559, 31564, - 31571, 31575, 31582, 6573, 31588, 31597, 31605, 31620, 31634, 31642, - 31653, 31662, 31667, 5706, 31677, 31682, 31687, 31691, 31694, 31698, - 31703, 31707, 31714, 31719, 31724, 7357, 31734, 31736, 31739, 31743, - 31749, 31753, 31758, 31763, 31769, 31774, 31780, 31785, 31795, 31804, - 31812, 31817, 31823, 31828, 31835, 31839, 31847, 31854, 31867, 31875, - 31879, 31889, 31894, 31898, 31906, 31914, 31918, 31927, 31933, 31938, - 31946, 31956, 31965, 31974, 31983, 31994, 32002, 32013, 32022, 32029, - 32035, 32040, 32051, 32056, 32060, 32063, 32067, 32075, 32081, 32089, - 32096, 32102, 32107, 32113, 2377, 32117, 32119, 32124, 32129, 32132, - 32134, 32138, 32141, 32148, 32152, 32156, 32159, 32165, 32175, 32180, - 32186, 32190, 32195, 32208, 24191, 32214, 32223, 15740, 32230, 32239, - 29653, 32247, 32252, 32256, 32264, 32271, 32276, 32280, 32285, 32289, - 32297, 32303, 32309, 32314, 32318, 32321, 32326, 32339, 32355, 21201, - 32372, 32384, 32401, 32413, 32427, 21218, 21237, 32439, 32451, 2639, - 32465, 32470, 32475, 32480, 32484, 32491, 32503, 32509, 32512, 32523, - 32534, 30074, 675, 32539, 32543, 32546, 32551, 32556, 32562, 32567, - 32572, 32578, 32584, 32589, 32593, 32598, 32603, 32608, 32612, 32615, - 32621, 32626, 32631, 32636, 32640, 32645, 32651, 32659, 24416, 32664, - 32669, 32676, 32682, 32688, 32693, 32701, 20743, 32708, 32713, 32718, - 32723, 32727, 32730, 32735, 32739, 32743, 32750, 32756, 32762, 32768, - 32775, 32780, 32786, 31909, 32790, 32794, 32799, 32812, 32817, 32823, - 32831, 32838, 32846, 32856, 32862, 32868, 32874, 32878, 32887, 32892, - 32897, 8849, 32902, 32909, 32915, 32925, 32930, 32936, 32944, 3556, - 32951, 32958, 3562, 32962, 32967, 32978, 32985, 32991, 33000, 33004, - 3945, 33007, 33014, 33020, 33026, 33034, 33044, 27079, 33051, 33059, - 33065, 33070, 33076, 33081, 33087, 33091, 33098, 33104, 33113, 24211, - 33120, 33125, 33129, 33137, 33145, 8040, 4390, 33152, 33156, 33160, - 33165, 33171, 33176, 33181, 33188, 30581, 33194, 33199, 33203, 33208, - 33212, 33221, 33225, 33231, 33238, 33244, 33251, 33256, 33265, 33270, - 33274, 33279, 33286, 33294, 33302, 33307, 19594, 33311, 33314, 33318, - 33322, 33326, 33329, 33331, 33336, 33344, 33348, 33355, 33359, 33363, - 33371, 33378, 33388, 33392, 33396, 33404, 33412, 33418, 33423, 33432, - 11717, 33438, 33447, 33452, 33459, 33467, 33475, 33483, 33490, 33497, - 33504, 33511, 33518, 33523, 33529, 33546, 33554, 33564, 33572, 33579, - 390, 33583, 33589, 33593, 33598, 31658, 33604, 33607, 33611, 33619, 3567, - 33627, 33633, 33639, 33648, 33658, 33665, 33671, 3573, 3579, 33680, - 33687, 33695, 33700, 33704, 33711, 33719, 33726, 33732, 33741, 33751, - 33757, 33765, 33774, 33781, 33789, 33796, 20265, 33800, 33807, 33813, - 33823, 33832, 33843, 33847, 33857, 33863, 33870, 33878, 33887, 33896, - 33906, 33917, 33924, 33929, 33936, 2980, 33944, 33950, 33955, 33961, - 33967, 33972, 33985, 33998, 34011, 34018, 34024, 34032, 34037, 34041, - 1433, 34045, 34050, 34055, 34060, 34065, 34071, 34076, 34081, 34086, - 34091, 34096, 34101, 34106, 34112, 34118, 34123, 34128, 34134, 34139, - 34144, 34149, 34155, 34160, 34165, 34170, 34175, 34181, 34186, 34191, - 34197, 34202, 34207, 34212, 34217, 34222, 34228, 34233, 34239, 34244, - 34250, 34255, 34260, 34265, 34271, 34277, 34283, 34289, 34295, 34301, - 34307, 34313, 34318, 34323, 34329, 34334, 34339, 34344, 34349, 34354, - 34359, 34364, 34370, 34375, 34380, 34386, 34392, 101, 34397, 34399, - 34403, 34407, 34411, 34416, 34420, 7961, 34424, 34430, 4759, 34436, - 34439, 34444, 34448, 34453, 34457, 34461, 34466, 8656, 34470, 34474, - 34478, 34482, 13692, 34487, 34491, 34496, 34501, 34506, 34510, 34517, - 24215, 34523, 34526, 34530, 34535, 34541, 34545, 34553, 34559, 34564, - 34568, 34574, 34578, 34582, 3417, 3422, 27265, 34585, 34593, 34600, - 34604, 34611, 34616, 337, 34621, 34625, 34631, 34643, 34649, 34655, - 34659, 34665, 34674, 34678, 34682, 34687, 34692, 34697, 34701, 34705, - 34712, 34718, 34723, 34738, 34753, 34768, 34784, 34802, 8606, 34816, - 34823, 34827, 34830, 34839, 34844, 34848, 34856, 31860, 34864, 34868, - 34878, 27235, 34889, 34893, 34902, 34910, 8218, 13236, 34914, 34917, - 34920, 28173, 34925, 8217, 34930, 34936, 34941, 34947, 34952, 34958, - 34963, 34969, 34974, 34980, 34986, 34992, 34997, 34953, 34959, 34964, - 34970, 34975, 34981, 34987, 6586, 3815, 35001, 35009, 35013, 35016, - 35020, 35025, 35030, 35036, 35042, 35047, 35051, 24063, 35055, 35059, - 35065, 35069, 7487, 35078, 35085, 35089, 10258, 35096, 35102, 35107, - 35114, 35121, 35128, 26605, 6509, 35135, 35142, 35149, 35155, 35160, - 35167, 35178, 35184, 35189, 35194, 35199, 35206, 34954, 35210, 35220, - 35231, 35237, 35242, 35247, 35252, 35257, 35262, 35266, 35270, 35276, - 35284, 2278, 835, 8678, 8683, 8689, 35293, 8694, 8699, 8705, 35298, - 35308, 35312, 8710, 35317, 35320, 35325, 35329, 35334, 35339, 35346, - 35353, 35361, 8619, 35368, 35371, 35377, 35387, 4424, 35396, 35400, - 35408, 35412, 35422, 35428, 35439, 35445, 35451, 35456, 35462, 35468, - 35474, 35479, 35482, 35489, 35495, 35500, 35507, 35514, 35518, 35528, - 35541, 35550, 35559, 35570, 35583, 35594, 35603, 35614, 35619, 35628, - 35633, 8715, 35639, 35646, 35654, 35659, 35663, 35670, 35677, 3770, 16, - 35681, 35686, 15034, 35690, 35693, 35696, 26122, 35700, 26614, 35708, - 35712, 35716, 35719, 35725, 34976, 35731, 35739, 35745, 35752, 26114, - 35756, 26299, 35760, 35769, 35775, 35781, 35786, 35790, 35796, 35800, - 35808, 35816, 24273, 35822, 35829, 35835, 35840, 35845, 35849, 35855, - 35860, 35866, 3986, 769, 35873, 35877, 35880, 13582, 35892, 33770, 35903, - 35906, 35913, 35919, 35923, 35929, 35934, 35940, 35945, 35950, 35954, - 35958, 35963, 35968, 35978, 35984, 35997, 36003, 36010, 36015, 36021, - 36026, 14920, 1436, 1022, 29199, 29205, 36031, 29211, 29224, 29230, - 29236, 36037, 29242, 29248, 36043, 36049, 22, 36057, 36064, 36068, 36072, - 36080, 29963, 36084, 36088, 36095, 36100, 36104, 36109, 36115, 36120, - 36126, 36131, 36135, 36139, 36143, 36148, 36152, 36157, 36161, 36168, - 36173, 36177, 36182, 36186, 36191, 36195, 36200, 36206, 13802, 13807, - 36211, 36215, 36218, 36222, 19436, 36227, 36231, 36237, 36244, 36249, - 36259, 36264, 36272, 36276, 36279, 29978, 36283, 4039, 36288, 36293, - 36297, 36302, 36306, 36311, 11735, 36322, 36326, 36329, 36334, 36338, - 36342, 36345, 36349, 6605, 11751, 36352, 36355, 36361, 36366, 36372, - 36377, 36383, 36388, 36394, 36399, 36405, 36411, 36417, 36422, 36426, - 36430, 36439, 36455, 36471, 36481, 26021, 36488, 36492, 36497, 36502, - 36506, 36510, 33891, 36516, 36521, 36525, 36532, 36537, 36541, 36545, - 25075, 36551, 19689, 36556, 36563, 36571, 36577, 36584, 36592, 36598, - 36602, 36608, 36616, 36620, 36629, 7942, 36637, 36641, 36649, 36656, - 36661, 36666, 36670, 36673, 36677, 36680, 36684, 36691, 36696, 36702, - 24494, 29259, 36706, 36713, 36719, 36725, 36730, 36733, 36735, 36742, - 36749, 36755, 36759, 36762, 36766, 36770, 36774, 36779, 36783, 36787, - 36790, 36794, 36808, 21267, 36827, 36840, 36853, 36866, 21285, 36881, - 8902, 36896, 36902, 36906, 36910, 36917, 36922, 36926, 36933, 36939, - 36944, 36950, 36960, 36972, 36983, 36988, 36995, 36999, 37003, 37006, - 14198, 3618, 37014, 13829, 37027, 37034, 37038, 37042, 37047, 37052, - 37058, 37062, 37066, 37069, 6217, 13840, 37074, 37078, 37084, 37093, - 37098, 33747, 37104, 37109, 37113, 37118, 37125, 37129, 37132, 37137, - 12892, 37144, 37151, 1035, 37155, 37160, 37165, 37171, 37176, 37181, - 37185, 37195, 37200, 37206, 37211, 37217, 37222, 37228, 37238, 37243, - 37248, 37252, 5708, 5720, 37257, 37260, 37267, 37273, 32025, 32032, - 37282, 37286, 30026, 37294, 37305, 37313, 33939, 37320, 37325, 37330, - 37341, 37348, 37359, 30050, 19695, 37367, 727, 37372, 37378, 26105, - 37384, 37389, 37399, 37408, 37415, 37421, 37425, 37428, 37435, 37441, - 37448, 37454, 37464, 37472, 37478, 37484, 37489, 37493, 37500, 37506, - 37513, 36775, 535, 12160, 37519, 37524, 37527, 37533, 37541, 1365, 37546, - 37550, 37555, 37562, 37568, 37572, 37576, 37581, 37590, 37597, 37607, - 37613, 26140, 37630, 37639, 37647, 37653, 37658, 37665, 37671, 37679, - 37688, 37696, 37700, 37705, 37713, 30059, 37719, 37738, 14131, 37752, - 37768, 37782, 37788, 37793, 37798, 37803, 37809, 30065, 37814, 37821, - 37826, 37830, 345, 2887, 37837, 37842, 37847, 25392, 37668, 37851, 37856, - 37864, 37868, 37871, 37877, 37883, 37887, 26195, 37890, 37895, 37899, - 37902, 37907, 37911, 37916, 37921, 37925, 37930, 37934, 37938, 19432, - 19443, 37942, 37947, 37953, 25032, 37958, 37962, 19511, 14349, 37965, - 37970, 37975, 37980, 37985, 37990, 37995, 38000, 450, 43, 29277, 29282, - 29287, 29293, 29298, 29303, 38005, 29307, 38009, 38013, 29312, 29318, - 38017, 29329, 29334, 38025, 38030, 29340, 38035, 38040, 38045, 38050, - 38056, 38062, 38068, 29357, 38081, 38087, 29361, 38091, 29366, 38096, - 29371, 29376, 38099, 38104, 38108, 28940, 38114, 11959, 38121, 38126, - 29381, 38130, 38135, 38140, 38145, 38149, 38154, 38159, 38165, 38170, - 38175, 38181, 38187, 38192, 38196, 38201, 38206, 38211, 38215, 38220, - 38225, 38230, 38236, 38242, 38248, 38253, 38257, 38262, 38266, 29385, - 29390, 29395, 38270, 38274, 38278, 29400, 29406, 29412, 29424, 38290, - 24100, 38294, 38298, 38303, 38308, 38313, 38317, 38321, 38331, 38336, - 38341, 38345, 38349, 38352, 38360, 29472, 38365, 1443, 38371, 38379, - 38388, 38392, 38396, 38404, 38410, 38418, 38434, 38438, 38443, 38458, - 29509, 1713, 10423, 38462, 2933, 38474, 38475, 38483, 38490, 38495, - 38502, 38507, 7812, 1105, 8737, 38514, 38519, 38522, 38525, 38534, 1276, - 38539, 36923, 38546, 38551, 20708, 2516, 38555, 9146, 38565, 38571, 2296, - 2306, 38580, 38589, 38599, 38610, 3248, 32176, 8789, 3748, 14958, 1281, - 38615, 38623, 38630, 38635, 38639, 38643, 22051, 8816, 38651, 38660, - 38669, 38677, 38684, 38689, 38702, 38715, 38727, 38739, 38751, 38764, - 38775, 38786, 38796, 38804, 38812, 38824, 38836, 38847, 38856, 38864, - 38871, 38883, 38890, 38899, 38906, 38919, 38924, 38934, 38939, 38945, - 38950, 35086, 38954, 38961, 38965, 38972, 38980, 2477, 38987, 38998, - 39008, 39017, 39025, 39035, 39043, 39053, 39062, 39067, 39073, 39079, - 39090, 39100, 39109, 39118, 39128, 39136, 39145, 39150, 39155, 39160, - 1669, 37, 39168, 39176, 39187, 39198, 14633, 39208, 39215, 39221, 39226, - 39230, 39241, 39251, 39260, 39271, 15007, 15012, 39276, 39285, 39290, - 39300, 39305, 39313, 39321, 39328, 39334, 5557, 228, 39338, 39344, 39349, - 39352, 2076, 37039, 39360, 39364, 39367, 1476, 39373, 12309, 1286, 39378, - 39391, 39405, 2602, 39423, 39435, 39447, 2616, 2633, 39461, 39474, 2648, - 39488, 39500, 2663, 39514, 1292, 1298, 1304, 9064, 39519, 39524, 39529, - 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, 46898, 46913, 46928, 46943, 46958, 46973, 46988, 47003, 47018, - 47033, 47048, 47063, 47078, 47093, 47108, 47123, 47138, 47153, 47168, - 47183, 47198, 47213, 47228, 47243, 47258, 47273, 47288, 47303, 47319, - 47335, 47351, 47367, 47383, 47399, 47415, 47431, 47447, 47463, 47479, - 47495, 47511, 47527, 47543, 47559, 47575, 47591, 47607, 47623, 47639, - 47655, 47671, 47687, 47703, 47719, 47735, 47751, 47767, 47783, 47799, - 47815, 47831, 47847, 47863, 47879, 47895, 47911, 47927, 47943, 47959, - 47975, 47991, 48007, 48023, 48039, 48055, 48071, 48087, 48103, 48119, - 48135, 48151, 48167, 48183, 48199, 48215, 48231, 48247, 48263, 48279, - 48295, 48311, 48327, 48343, 48359, 48375, 48391, 48407, 48423, 48439, - 48455, 48471, 48487, 48503, 48519, 48535, 48551, 48567, 48583, 48599, - 48615, 48631, 48647, 48663, 48679, 48695, 48711, 48727, 48743, 48759, - 48775, 48791, 48807, 48823, 48839, 48855, 48871, 48887, 48903, 48919, - 48935, 48951, 48967, 48983, 48999, 49015, 49031, 49047, 49063, 49079, - 49095, 49111, 49127, 49143, 49159, 49175, 49191, 49207, 49223, 49239, - 49255, 49271, 49287, 49303, 49319, 49335, 49351, 49367, 49383, 49399, - 49415, 49431, 49447, 49463, 49479, 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, 55990, 15039, 55999, 56005, 56011, 56021, 56029, 13217, 13752, - 8385, 56042, 1484, 56050, 25502, 5662, 56056, 56061, 56066, 56071, 56076, - 56082, 56087, 56093, 56098, 56104, 56109, 56114, 56119, 56124, 56130, - 56135, 56140, 56145, 56150, 56155, 56160, 56165, 56171, 56176, 56182, - 56189, 2520, 56194, 56200, 6977, 56204, 56209, 56216, 56224, 40, 56228, - 56234, 56239, 56244, 56248, 56253, 56257, 56261, 9089, 56265, 56275, - 56288, 56299, 56312, 56319, 56325, 56330, 56336, 56342, 56348, 56353, - 56358, 56363, 56368, 56372, 56377, 56382, 56387, 56393, 56399, 56405, - 56410, 56414, 56419, 56424, 56428, 56433, 56438, 56443, 56447, 9105, - 9116, 9121, 1527, 56451, 1532, 56457, 14516, 56460, 1563, 56466, 1569, - 1575, 9151, 56471, 56479, 56486, 56490, 56496, 56501, 28969, 56506, - 56513, 56518, 56522, 56526, 1580, 14608, 14619, 56535, 56542, 56547, - 56551, 14644, 1584, 35225, 56554, 56559, 56569, 56578, 56583, 56587, - 56593, 1589, 37110, 56598, 56607, 56613, 56618, 9301, 9307, 56624, 56636, - 56653, 56670, 56687, 56704, 56721, 56738, 56755, 56772, 56789, 56806, - 56823, 56840, 56857, 56874, 56891, 56908, 56925, 56942, 56959, 56976, - 56993, 57010, 57027, 57044, 57061, 57078, 57095, 57112, 57129, 57146, - 57163, 57180, 57197, 57214, 57231, 57248, 57265, 57282, 57299, 57316, - 57333, 57350, 57367, 57384, 57401, 57418, 57435, 57452, 57469, 57480, - 57485, 1594, 57489, 57495, 57500, 57505, 7759, 1599, 57511, 57520, 25785, - 57525, 57536, 57546, 57551, 57558, 57564, 57569, 57574, 14896, 57578, - 9318, 1604, 9323, 57584, 57589, 57595, 57600, 57605, 57610, 57615, 57620, - 57625, 57630, 57636, 57642, 57648, 57653, 57657, 57662, 57667, 57671, - 57676, 57681, 57686, 57690, 57695, 57701, 57706, 57711, 57715, 57720, - 57725, 57731, 57736, 57741, 57747, 57753, 57758, 57762, 57767, 57772, - 57777, 57781, 57786, 57791, 57796, 57802, 57808, 57813, 57817, 57821, - 57826, 57831, 57836, 27145, 57840, 57845, 57850, 57856, 57861, 57866, - 57870, 57875, 57880, 57886, 57891, 57896, 57902, 57908, 57913, 57917, - 57922, 57927, 57931, 57936, 57941, 57946, 57952, 57958, 57963, 57967, - 57972, 57977, 57981, 57986, 57991, 57996, 58000, 58003, 29620, 58008, - 58016, 14962, 14986, 9414, 58022, 58032, 58047, 9419, 58058, 58063, - 58074, 58086, 58098, 58110, 2654, 58122, 58127, 58131, 58137, 58143, - 58148, 1616, 1036, 58157, 58162, 37156, 58166, 58170, 58175, 58179, - 15047, 58184, 58187, 58195, 58203, 1620, 9444, 9450, 1625, 58211, 58218, - 58223, 58232, 58242, 58249, 58254, 1630, 58261, 58266, 15162, 58270, - 58275, 58282, 58288, 58292, 58303, 58313, 15184, 7672, 7679, 1635, 58320, - 58326, 58334, 58341, 58347, 58354, 58366, 58372, 58377, 58389, 58400, - 58409, 58419, 3681, 28805, 28814, 15224, 1640, 1644, 58427, 58438, 58443, - 1647, 58451, 58456, 15275, 58468, 58474, 58479, 58487, 1652, 58492, - 58497, 58505, 58513, 58520, 58529, 58537, 58546, 1657, 58550, 1662, - 58555, 58562, 15349, 58570, 58576, 58581, 58589, 58596, 58604, 20779, - 58609, 9579, 58618, 58624, 58631, 58638, 58644, 58654, 58660, 58665, - 58670, 58678, 9588, 9593, 58686, 58692, 58700, 3746, 15391, 37244, 58705, - 58711, 58716, 58724, 58731, 10404, 58736, 58742, 1673, 58747, 58750, - 1073, 58756, 58761, 58766, 58772, 58777, 58782, 58787, 58792, 58797, - 58802, 1682, 9, 58808, 58812, 58817, 58821, 58825, 58829, 29864, 58834, - 58839, 58844, 58848, 58851, 58855, 58859, 58864, 58868, 58873, 58877, - 32547, 32552, 32557, 58880, 58887, 58893, 36976, 58903, 32563, 30117, - 29879, 29885, 32579, 29891, 58908, 58913, 30150, 58917, 58920, 58924, - 58931, 58934, 58939, 58943, 58947, 58950, 58960, 58972, 58979, 31514, - 58982, 6994, 856, 58985, 58989, 58994, 58998, 59001, 11992, 59008, 59015, - 59028, 59036, 59045, 59050, 59060, 59073, 59085, 59092, 59097, 59106, - 59119, 59137, 59142, 59149, 59155, 59160, 59168, 59175, 25341, 619, - 59181, 59187, 59197, 59203, 59208, 29909, 4498, 29923, 59212, 59222, - 59227, 59237, 59252, 59258, 59264, 29933, 59269, 29081, 59273, 59278, - 59283, 59287, 59292, 15227, 59299, 59304, 59308, 4539, 29959, 59312, - 59318, 332, 59328, 59335, 59342, 59347, 59356, 56563, 59362, 59370, - 59374, 59378, 59382, 59386, 59391, 59395, 59401, 59409, 59414, 59419, - 59423, 59428, 59432, 59436, 59442, 59448, 59453, 59457, 30083, 59462, - 30089, 30095, 59467, 59473, 59480, 59485, 59489, 29098, 14889, 59492, - 59496, 59501, 59508, 59514, 59518, 59523, 36686, 59529, 59533, 59537, - 59542, 59548, 59554, 59566, 59575, 59585, 59591, 59598, 59603, 59608, - 59612, 59615, 59621, 59628, 59633, 59638, 59645, 59652, 59658, 59663, - 59668, 59676, 59681, 2382, 59685, 59690, 59696, 59701, 59707, 59712, - 59717, 59722, 59728, 30116, 59733, 59739, 59745, 59751, 30180, 59756, - 59761, 59766, 30191, 59771, 59776, 59781, 59787, 59793, 30196, 59798, - 59803, 59808, 30251, 30257, 59813, 59818, 30262, 59823, 26012, 30284, - 30288, 59828, 59804, 59832, 59840, 59846, 59854, 59861, 59867, 59877, - 59883, 59890, 9036, 30302, 59896, 59909, 59918, 59924, 59933, 59939, - 21696, 59946, 59953, 59963, 30252, 59966, 59973, 59978, 59982, 59986, - 59991, 4615, 59995, 60000, 60005, 32641, 32646, 60009, 32660, 60014, - 32665, 60019, 60025, 32677, 32683, 32689, 60030, 60036, 20744, 60047, - 60050, 60062, 60070, 30325, 60074, 60083, 60093, 60102, 30335, 60107, - 60114, 60123, 60129, 60137, 60144, 4590, 4327, 60149, 30263, 60155, - 60158, 60164, 60171, 60176, 60181, 21623, 60185, 60191, 60197, 60202, - 60207, 60211, 60217, 60223, 31424, 833, 33642, 34555, 34561, 60228, - 60232, 60236, 60239, 60252, 60258, 60262, 60265, 60270, 31727, 60274, - 29103, 19532, 60280, 4519, 4527, 7513, 60283, 60288, 60293, 60298, 60303, - 60308, 60313, 60318, 60323, 60328, 60334, 60339, 60344, 60350, 60355, - 60360, 60365, 60370, 60375, 60380, 60386, 60391, 60397, 60402, 60407, - 60412, 60417, 60422, 60427, 60432, 60437, 60442, 60447, 60453, 60458, - 60463, 60468, 60473, 60478, 60483, 60489, 60494, 60499, 60504, 60509, - 60514, 60519, 60524, 60529, 60534, 60540, 60545, 60550, 60555, 60560, - 60566, 60572, 60577, 60583, 60588, 60593, 60598, 60603, 60608, 1477, 245, - 60613, 60617, 60621, 60625, 23274, 60629, 60633, 60638, 60642, 60647, - 60651, 60655, 60659, 60664, 60668, 11729, 60673, 60677, 60684, 13513, - 60693, 60702, 60706, 60711, 60716, 60720, 23073, 2970, 60724, 60730, - 60739, 60747, 60753, 60765, 60777, 60781, 60786, 60790, 60796, 60802, - 60807, 60817, 60827, 60833, 60838, 60842, 60847, 60853, 60862, 60871, - 60879, 13867, 60883, 60892, 60900, 60912, 60923, 60934, 60943, 60947, - 60956, 60966, 60972, 60977, 60983, 60988, 98, 28917, 60999, 24345, 24355, - 61005, 61012, 61018, 61022, 61032, 61043, 61051, 61060, 61065, 61070, - 61074, 15590, 61082, 61086, 61092, 61102, 61109, 61115, 32740, 1180, - 61121, 61124, 61128, 61138, 61144, 61151, 11666, 61158, 61164, 61173, - 61182, 61188, 61194, 61200, 61205, 61212, 61219, 61225, 61238, 61247, - 61256, 61261, 61265, 61271, 61278, 61285, 61292, 61299, 61306, 61311, - 61315, 61319, 61322, 61332, 61336, 61348, 61357, 61361, 61366, 61370, - 61376, 61381, 61388, 61397, 61405, 61413, 61418, 61422, 61427, 61432, - 61442, 61450, 61455, 61459, 61463, 61469, 61481, 61489, 61499, 61506, - 61512, 61517, 61521, 61525, 61529, 61538, 61547, 61556, 61562, 61568, - 61574, 61579, 61586, 61592, 61600, 61607, 10820, 61613, 61619, 61623, - 12571, 61627, 61632, 61642, 61651, 61657, 61663, 61671, 61678, 61682, - 61686, 61692, 61700, 61707, 61713, 61724, 61728, 61732, 61736, 61739, - 61745, 61750, 61754, 61758, 61767, 61775, 61782, 61788, 61795, 22204, - 36728, 61800, 61808, 61812, 61816, 61819, 61827, 61834, 61840, 61849, - 61857, 61863, 61868, 61872, 61877, 61881, 61885, 61890, 61899, 61903, - 61910, 61917, 61923, 61931, 61937, 61948, 61956, 61962, 20874, 61971, - 61978, 61985, 61992, 61999, 62006, 39708, 11504, 62013, 62020, 62025, - 32776, 37892, 62031, 62036, 62041, 62047, 62053, 62059, 62064, 62069, - 62074, 62079, 62085, 62090, 62096, 62101, 62107, 62112, 62117, 62122, - 62127, 62132, 62137, 62142, 62148, 62153, 62159, 62164, 62169, 62174, - 62179, 62184, 62189, 62195, 62200, 62205, 62210, 62215, 62220, 62225, - 62230, 62235, 62240, 62245, 62251, 62256, 62261, 62266, 62271, 62276, - 62281, 62286, 62291, 62297, 62302, 62307, 62312, 62317, 62322, 62327, - 62332, 62337, 62342, 62347, 62352, 62357, 62363, 1798, 224, 35321, 62368, - 62371, 62376, 62380, 62383, 62388, 61409, 62399, 62409, 62416, 62432, - 62441, 62451, 62461, 62469, 62477, 62481, 62484, 62491, 62497, 62508, - 62520, 62531, 62540, 62547, 1287, 21512, 62557, 2549, 62561, 62570, 1142, - 15563, 35947, 62578, 62586, 62600, 62613, 62617, 62622, 62627, 62632, - 62638, 62644, 62649, 6986, 62654, 62662, 9445, 62667, 62673, 1685, 9457, - 728, 62682, 62691, 62701, 25109, 62710, 62716, 15139, 62722, 62726, 3894, - 9788, 62732, 58433, 62739, 3918, 184, 12492, 62745, 62757, 62761, 62767, - 25805, 62771, 9776, 2689, 4, 62776, 62786, 62792, 62803, 62810, 62816, - 62822, 62830, 62837, 62843, 62853, 62863, 62873, 1299, 62882, 62888, - 2712, 2718, 6983, 2223, 62892, 62896, 62905, 62913, 62924, 62932, 62940, - 62946, 62951, 62962, 62973, 62981, 62987, 8127, 62992, 63000, 63004, - 63008, 63020, 26181, 63027, 63037, 63043, 63049, 8229, 63059, 63070, - 63080, 63089, 63093, 63100, 1144, 1196, 63110, 63115, 63123, 63131, - 63142, 63149, 63163, 12417, 384, 63173, 63177, 63186, 63194, 63200, - 63214, 63221, 63227, 63236, 63243, 63253, 63261, 3753, 189, 63269, 63280, - 63284, 63296, 26003, 156, 63302, 63307, 63311, 63318, 63324, 63332, - 63339, 7263, 63346, 63355, 63363, 3819, 63376, 15185, 63380, 2757, 443, - 63385, 63398, 63403, 1797, 653, 63407, 3825, 63415, 63421, 983, 63431, - 63440, 63445, 13251, 13258, 43040, 63449, 3763, 11398, 63457, 63464, - 21739, 63468, 63475, 63481, 63486, 63491, 13271, 367, 63496, 63508, - 63514, 63522, 2769, 1717, 63530, 63532, 63537, 63542, 63547, 63553, - 63558, 63563, 63568, 63573, 63578, 63583, 63589, 63594, 63599, 63604, - 63609, 63614, 63619, 63624, 63629, 63635, 63640, 63645, 63650, 63656, - 63661, 63667, 63672, 63677, 63682, 63687, 63692, 63697, 63702, 63708, - 63713, 63719, 63724, 63729, 63734, 63739, 63744, 63749, 63754, 63759, - 63765, 63770, 63775, 63779, 63783, 63788, 63792, 63797, 63802, 63808, - 63813, 63817, 63822, 63826, 63829, 63831, 63835, 63838, 63843, 63847, - 63851, 63855, 63859, 63868, 63872, 30520, 63875, 30525, 63882, 63887, - 30530, 63896, 63905, 30536, 63910, 30541, 63919, 63924, 9966, 63928, - 63933, 63938, 30546, 63942, 38058, 63946, 63949, 63953, 6667, 63959, - 63964, 63968, 3646, 30551, 63971, 63975, 63978, 63983, 63987, 63993, - 64001, 64014, 64023, 64029, 64034, 64040, 64044, 64050, 64058, 64063, - 64070, 64076, 64084, 64093, 64101, 30554, 64108, 64118, 64127, 64140, - 64145, 64150, 64159, 64165, 64172, 64183, 64195, 64202, 64211, 64220, - 64229, 64236, 64242, 64249, 64257, 64264, 64272, 64281, 64289, 64296, - 64304, 64313, 64321, 64330, 64340, 64349, 64357, 64364, 64372, 64381, - 64389, 64398, 64408, 64417, 64425, 64434, 64444, 64453, 64463, 64474, - 64484, 64493, 64501, 64508, 64516, 64525, 64533, 64542, 64552, 64561, - 64569, 64578, 64588, 64597, 64607, 64618, 64628, 64637, 64645, 64654, - 64664, 64673, 64683, 64694, 64704, 64713, 64723, 64734, 64744, 64755, - 64767, 64778, 64788, 64797, 64805, 64812, 64820, 64829, 64837, 64846, - 64856, 64865, 64873, 64882, 64892, 64901, 64911, 64922, 64932, 64941, - 64949, 64958, 64968, 64977, 64987, 64998, 65008, 65017, 65027, 65038, - 65048, 65059, 65071, 65082, 65092, 65101, 65109, 65118, 65128, 65137, - 65147, 65158, 65168, 65177, 65187, 65198, 65208, 65219, 65231, 65242, - 65252, 65261, 65271, 65282, 65292, 65303, 65315, 65326, 65336, 65347, - 65359, 65370, 65382, 65395, 65407, 65418, 65428, 65437, 65445, 65452, - 65460, 65469, 65477, 65486, 65496, 65505, 65513, 65522, 65532, 65541, - 65551, 65562, 65572, 65581, 65589, 65598, 65608, 65617, 65627, 65638, - 65648, 65657, 65667, 65678, 65688, 65699, 65711, 65722, 65732, 65741, - 65749, 65758, 65768, 65777, 65787, 65798, 65808, 65817, 65827, 65838, - 65848, 65859, 65871, 65882, 65892, 65901, 65911, 65922, 65932, 65943, - 65955, 65966, 65976, 65987, 65999, 66010, 66022, 66035, 66047, 66058, - 66068, 66077, 66085, 66094, 66104, 66113, 66123, 66134, 66144, 66153, - 66163, 66174, 66184, 66195, 66207, 66218, 66228, 66237, 66247, 66258, - 66268, 66279, 66291, 66302, 66312, 66323, 66335, 66346, 66358, 66371, - 66383, 66394, 66404, 66413, 66423, 66434, 66444, 66455, 66467, 66478, - 66488, 66499, 66511, 66522, 66534, 66547, 66559, 66570, 66580, 66591, - 66603, 66614, 66626, 66639, 66651, 66662, 66674, 66687, 66699, 66712, - 66726, 66739, 66751, 66762, 66772, 66781, 66789, 66796, 66801, 6518, - 66808, 30564, 66813, 66818, 30569, 66824, 19186, 30574, 66829, 66835, - 66843, 66849, 66855, 66862, 66869, 66874, 66878, 66881, 66885, 66894, - 66900, 66912, 66923, 66927, 3032, 6493, 66932, 66935, 66937, 66941, - 66945, 66949, 24044, 66954, 66958, 66961, 66966, 66970, 66977, 66983, - 66987, 66991, 66994, 30591, 66999, 67006, 67015, 67023, 67034, 67042, - 67050, 67057, 67064, 67070, 67081, 30596, 67086, 67097, 67109, 67117, - 67128, 67137, 67148, 67153, 67161, 2515, 67166, 32234, 67179, 67183, - 67195, 67203, 67208, 67216, 15750, 67227, 67233, 67240, 67248, 67254, - 30606, 67259, 3844, 56025, 67266, 67269, 67277, 67290, 67303, 67316, - 67329, 67336, 67347, 67356, 39525, 39530, 67361, 67365, 67373, 67380, - 67389, 67397, 67403, 67412, 67420, 67428, 67432, 67441, 67450, 67460, - 67473, 67486, 67496, 30611, 67502, 67509, 67515, 30617, 67520, 67523, - 67527, 67535, 67544, 39263, 67552, 67561, 67569, 67576, 67584, 67594, - 67603, 67612, 67621, 67629, 67640, 67650, 7799, 19801, 67659, 67664, - 67669, 67673, 67677, 67682, 67688, 67693, 67698, 67704, 67709, 67714, - 19766, 67719, 67726, 67734, 67742, 67747, 67754, 67761, 67765, 67769, - 67777, 67785, 30634, 67791, 67797, 67809, 67815, 67819, 67826, 67831, - 67842, 67852, 67862, 67874, 67880, 67890, 67900, 30661, 67909, 67918, - 67924, 67936, 67947, 67954, 67959, 67963, 67971, 67977, 67982, 67987, - 67994, 68002, 68014, 68024, 68033, 68042, 68049, 32098, 22027, 68055, - 68060, 68064, 68068, 68073, 68079, 68090, 68103, 68108, 68115, 30666, - 68120, 68132, 68141, 68151, 68162, 68175, 68182, 68191, 68200, 68208, - 68213, 68219, 1027, 68224, 68229, 68234, 68239, 68245, 68250, 68255, - 68261, 68267, 68272, 68276, 68281, 68286, 68291, 56531, 68296, 68301, - 68306, 68311, 68317, 68323, 68328, 68332, 68337, 68342, 68347, 68353, - 68358, 68364, 68369, 68374, 68379, 68384, 68388, 68394, 68399, 68408, - 68413, 68418, 68423, 68428, 68432, 68439, 68445, 15412, 15419, 43295, - 68450, 68400, 68452, 68462, 30675, 68465, 68474, 68480, 4638, 30680, - 68484, 68490, 68495, 68501, 68506, 68510, 68517, 68522, 68532, 68541, - 68545, 68551, 68557, 68563, 68567, 68575, 68582, 68590, 68598, 30685, - 68605, 68608, 68615, 68621, 68626, 68630, 68636, 68643, 68648, 68652, - 68661, 68669, 68675, 68680, 30690, 68687, 68694, 68700, 68705, 68711, - 68718, 68724, 19539, 25525, 68730, 68735, 68741, 68753, 68433, 68440, - 68763, 68768, 68775, 68782, 68788, 68799, 68804, 7548, 68812, 68815, - 68821, 68825, 68829, 68832, 68838, 30443, 4677, 922, 11779, 68845, 68851, - 68857, 68863, 68869, 68875, 68881, 68887, 68893, 68898, 68903, 68908, - 68913, 68918, 68923, 68928, 68933, 68938, 68943, 68948, 68953, 68958, - 68964, 68969, 68974, 68980, 68985, 68990, 68996, 69002, 69008, 69014, - 69020, 69026, 69032, 69038, 69044, 69049, 69054, 69060, 69065, 69070, - 69076, 69081, 69086, 69091, 69096, 69101, 69106, 69111, 69116, 69121, - 69126, 69131, 69136, 69142, 69147, 69152, 69157, 69163, 69168, 69173, - 69178, 69183, 69189, 69194, 69199, 69204, 69209, 69214, 69219, 69224, - 69229, 69234, 69239, 69244, 69249, 69254, 69259, 69264, 69269, 69274, - 69279, 69284, 69290, 69295, 69300, 69305, 69310, 69315, 69320, 69325, - 1828, 142, 69330, 69334, 69338, 69343, 69351, 69355, 69362, 69370, 69374, - 69387, 69395, 69399, 69402, 69407, 69411, 69416, 69420, 69428, 69432, - 19194, 69437, 69441, 58696, 69445, 69448, 69456, 69464, 69472, 69477, - 69484, 69490, 69496, 69501, 69506, 69514, 62605, 69521, 69526, 69531, - 69535, 10033, 69539, 69544, 69549, 69553, 69556, 69562, 69566, 69576, - 69585, 69588, 69595, 69608, 69614, 69622, 69633, 69644, 69655, 69666, - 69675, 69681, 69690, 69698, 69708, 69721, 69728, 69739, 69745, 69750, - 69755, 69761, 69767, 69777, 69786, 68122, 69794, 69800, 69808, 69814, - 69822, 69826, 69830, 69833, 69839, 69845, 69853, 69865, 69877, 69884, - 69888, 69899, 69907, 69914, 69926, 69934, 69942, 69949, 69955, 69965, - 69974, 69979, 69989, 69998, 38604, 70005, 70009, 70014, 70022, 70029, - 70035, 70039, 70049, 70060, 70068, 70075, 70087, 70099, 70108, 67169, - 70115, 70126, 70140, 70148, 70158, 70165, 70173, 70185, 70194, 70202, - 70212, 70223, 70235, 70244, 70254, 70261, 70270, 70285, 70295, 70304, - 70312, 70325, 70340, 70344, 70353, 70365, 70376, 70387, 70398, 70408, - 70419, 70427, 70433, 70443, 70449, 27044, 70454, 70460, 70465, 70472, - 8141, 15770, 70478, 70487, 70492, 70496, 70503, 70509, 70514, 70519, - 70527, 70535, 70539, 70542, 70545, 70547, 70554, 70560, 70571, 70576, - 70580, 70587, 70593, 70598, 70606, 63072, 63082, 70612, 70619, 70629, - 9023, 70636, 70641, 27234, 70650, 70655, 70662, 70672, 70680, 70688, - 70697, 70703, 70709, 70716, 70723, 70728, 70732, 70740, 70745, 70750, - 70758, 70765, 70770, 70776, 70779, 70783, 70792, 69382, 70801, 70805, - 70811, 70822, 70832, 15779, 70843, 70851, 15791, 70858, 70862, 70871, - 25411, 70878, 70882, 70887, 70904, 70916, 8981, 70928, 70933, 70938, - 70943, 70947, 70950, 70955, 70960, 70966, 70971, 4341, 19267, 70976, - 70981, 70987, 70994, 70999, 71004, 71010, 71016, 71022, 71027, 71033, - 71037, 71051, 71059, 71067, 71073, 71078, 71085, 71095, 71104, 71109, - 71114, 71122, 71127, 71133, 71138, 71147, 57580, 71152, 71155, 71173, - 71192, 71205, 71219, 71235, 71242, 71249, 71255, 71262, 71267, 71273, - 71279, 71287, 71293, 71298, 71303, 71319, 8994, 71333, 71340, 71348, - 71354, 71358, 71361, 71366, 71371, 71378, 71383, 71392, 71397, 71403, - 71412, 71421, 71426, 71430, 71438, 10057, 71447, 71455, 71460, 71466, - 10068, 71471, 71474, 71479, 71489, 71498, 71503, 71509, 71514, 71522, - 71529, 71540, 71550, 71555, 62533, 71560, 71566, 71571, 71578, 71587, - 71595, 71601, 71608, 71614, 71618, 15237, 3006, 71623, 71627, 71633, - 71642, 71648, 71655, 71659, 71680, 71702, 71718, 71735, 71754, 71763, - 71773, 71780, 71787, 25298, 71793, 71797, 71805, 71817, 71823, 71831, - 71835, 71843, 71850, 71854, 71860, 71866, 71871, 3511, 39725, 71877, - 71881, 71885, 71889, 71894, 71899, 71904, 71910, 71916, 71922, 71929, - 71935, 71942, 71948, 71954, 71959, 71965, 71970, 71975, 71979, 71984, - 39740, 71988, 71993, 72001, 72005, 72010, 72017, 72026, 72032, 72036, - 72043, 72047, 72050, 72057, 72066, 72071, 72075, 72083, 72092, 72096, - 72104, 72110, 72115, 72120, 72126, 72132, 72137, 72141, 72147, 72152, - 72156, 72160, 72163, 72168, 72176, 72186, 72191, 37263, 72199, 72211, - 72215, 72221, 72233, 72244, 72251, 72257, 72264, 72276, 72283, 72289, - 19341, 72293, 72299, 72306, 72312, 72318, 72323, 72328, 72333, 72342, - 5512, 72347, 14703, 72353, 72357, 72361, 72369, 72378, 72382, 72389, - 72398, 72411, 72417, 71980, 28093, 72422, 72424, 72429, 72434, 72439, - 72444, 72449, 72454, 72459, 72464, 72469, 72474, 72479, 72484, 72489, - 72494, 72500, 72505, 72510, 72515, 72520, 72525, 72530, 72535, 72540, - 72546, 72552, 72558, 72563, 72568, 72580, 72585, 1834, 67, 72590, 72595, - 30717, 30722, 30727, 30733, 30738, 72599, 30743, 20316, 72621, 72625, - 72629, 72634, 72638, 30747, 72642, 72650, 30752, 72657, 72660, 72665, - 72669, 7976, 72678, 30757, 20178, 72681, 72685, 1397, 72690, 30768, - 72693, 72698, 23837, 23847, 33172, 72703, 72708, 72713, 72718, 72724, - 72729, 72738, 72743, 72750, 72756, 72761, 72766, 72771, 72781, 72790, - 72795, 72803, 72807, 72815, 30582, 35192, 72822, 72828, 72833, 72838, - 72843, 72849, 72854, 72861, 72867, 72872, 72880, 72890, 72900, 72906, - 72911, 72917, 15801, 72924, 33992, 72937, 72942, 72948, 72961, 72967, - 72971, 72980, 72987, 72993, 73001, 73010, 73017, 73023, 73026, 23978, - 73030, 73037, 73043, 73051, 73056, 22156, 73062, 73065, 73073, 73081, - 73095, 73102, 73108, 73115, 73121, 30782, 73125, 73132, 73140, 73148, - 30787, 73154, 73160, 73165, 73175, 73181, 73190, 28822, 32647, 73198, - 73203, 73208, 73213, 73217, 13243, 37276, 73222, 73227, 30792, 59980, - 73231, 73236, 73240, 73249, 73257, 73263, 73268, 73274, 73281, 73287, - 73292, 73297, 73306, 73318, 73333, 31033, 73339, 14822, 30796, 73343, - 73350, 22262, 73356, 73363, 73372, 73379, 73388, 73394, 73399, 73407, - 73413, 30806, 73418, 73427, 72239, 73436, 73443, 73449, 73455, 73465, - 73473, 73480, 73484, 30811, 73487, 30817, 30823, 73492, 73500, 73508, - 73518, 73527, 73535, 73542, 73552, 30828, 73556, 73558, 73562, 73567, - 73571, 73575, 73581, 73586, 73590, 73601, 73606, 3011, 73610, 73617, - 73621, 73630, 73638, 73645, 73650, 73655, 60026, 73659, 73662, 73668, - 73676, 73682, 73686, 73691, 73698, 73703, 73709, 32678, 73714, 73717, - 73722, 73726, 73731, 73736, 73740, 73748, 23856, 23865, 73754, 73760, - 73766, 73771, 73775, 73778, 73788, 73797, 73802, 73808, 73815, 73821, - 73825, 73833, 73838, 32684, 73842, 73850, 73856, 73863, 73868, 73872, - 73877, 56211, 32690, 73883, 73888, 73892, 73897, 73902, 73907, 73911, - 73916, 73921, 73927, 73932, 73937, 73943, 73949, 73954, 73958, 73963, - 73968, 73973, 73977, 22261, 73982, 73987, 73993, 73999, 74005, 74010, - 74014, 74019, 74024, 74029, 74033, 74038, 74043, 74048, 74053, 74057, - 30832, 74065, 74069, 74077, 74085, 74096, 74101, 74105, 20622, 74110, - 74116, 74126, 74133, 74138, 74147, 74152, 74156, 74161, 74169, 74177, - 74184, 62751, 74190, 74198, 74205, 74216, 74222, 74226, 74232, 30842, - 74235, 74242, 74250, 74255, 37467, 74259, 74264, 74271, 74276, 7430, - 74280, 74288, 74295, 74302, 74308, 74322, 61055, 74330, 74336, 74340, - 74343, 74351, 74358, 74363, 74376, 74383, 74390, 74395, 58600, 74400, - 74403, 74410, 74416, 74420, 74428, 74438, 74448, 74457, 74465, 74476, - 74481, 74485, 74490, 74494, 33303, 19595, 33312, 74502, 74507, 74512, - 74517, 74522, 74527, 74532, 74536, 74541, 74546, 74551, 74556, 74561, - 74566, 74570, 74575, 74580, 74584, 74588, 74592, 74596, 74601, 74606, - 74610, 74615, 74619, 74623, 74628, 74633, 74638, 74643, 74647, 74652, - 74657, 74661, 74666, 74671, 74676, 74681, 74686, 74691, 74696, 74701, - 74706, 74711, 74716, 74721, 74726, 74731, 74736, 74741, 74746, 74751, - 74756, 74761, 74765, 74770, 74775, 74780, 74785, 74790, 74795, 74800, - 74805, 74810, 74815, 74820, 74824, 74829, 74833, 74838, 74843, 74848, - 74853, 74858, 74863, 74868, 74873, 74878, 74882, 74886, 74891, 74896, - 74900, 74905, 74910, 74914, 74919, 74924, 74929, 74934, 74938, 74943, - 74948, 74952, 74957, 74961, 74965, 74969, 74973, 74978, 74982, 74986, - 74990, 74994, 74998, 75002, 75006, 75010, 75014, 75019, 75024, 75029, - 75034, 75039, 75044, 75049, 75054, 75059, 75064, 75068, 75072, 75076, - 75080, 75084, 75088, 75093, 75097, 75102, 75106, 75111, 75116, 75120, - 75124, 75129, 75133, 75137, 75141, 75145, 75149, 75153, 75157, 75161, - 75165, 75169, 75173, 75177, 75181, 75185, 75190, 75195, 75199, 75203, - 75207, 75211, 75215, 75219, 75224, 75228, 75232, 75236, 75240, 75244, - 75248, 75253, 75257, 75262, 75266, 75270, 75274, 75278, 75282, 75286, - 75290, 75294, 75298, 75302, 75306, 75311, 75315, 75319, 75323, 75327, - 75331, 75335, 75339, 75343, 75347, 75351, 75355, 75360, 75364, 75368, - 75373, 75378, 75382, 75386, 75390, 75394, 75398, 75402, 75406, 75410, - 75415, 75419, 75424, 75428, 75433, 75437, 75442, 75446, 75452, 75457, - 75461, 75466, 75470, 75475, 75479, 75484, 75488, 75493, 1485, 75497, - 2783, 1723, 1728, 75501, 75505, 2787, 75509, 1366, 75514, 1332, 75518, - 2799, 75522, 75529, 75536, 75550, 2803, 5610, 75559, 75567, 75574, 75585, - 75594, 75601, 75613, 75626, 75639, 75650, 75655, 75662, 75674, 75678, - 2807, 10130, 75688, 75693, 75702, 75712, 2811, 75717, 75721, 75726, - 75733, 75739, 75747, 75759, 1337, 11399, 75769, 75773, 75779, 75793, - 75805, 75817, 75827, 75836, 75845, 75854, 75862, 75873, 75881, 3981, - 75891, 75900, 75906, 75921, 75928, 75934, 33433, 75939, 2835, 11403, - 75943, 75950, 7375, 75959, 2840, 30341, 75965, 58349, 75972, 75978, - 75989, 75995, 76002, 76008, 76016, 76023, 76029, 76039, 76048, 76059, - 76066, 76072, 76082, 76090, 76096, 76111, 76117, 76122, 76129, 76132, - 76138, 76145, 76151, 76159, 76168, 76176, 76182, 76191, 39265, 76205, - 76210, 13080, 76216, 76229, 76238, 76246, 76253, 76257, 76261, 76264, - 76271, 76278, 76286, 76294, 76303, 76311, 13011, 76319, 76324, 76328, - 76340, 76347, 76356, 780, 76366, 76375, 76386, 2856, 76390, 76394, 76400, - 76413, 76425, 76435, 76444, 24448, 76456, 76464, 76473, 76484, 76495, - 76505, 76515, 76524, 76532, 9709, 76539, 76543, 76548, 76553, 76559, - 1342, 10201, 76566, 76577, 76586, 76594, 76603, 76611, 76627, 76638, - 76647, 76655, 76667, 76678, 76694, 76704, 76725, 76738, 76746, 76753, - 13191, 76766, 76771, 76777, 4403, 76783, 76786, 76793, 76803, 6636, - 76810, 76815, 76820, 76828, 76836, 8189, 8198, 76841, 76852, 76857, - 76863, 2864, 2869, 76869, 9276, 76875, 76882, 76889, 76902, 2210, 50, - 76907, 76912, 76922, 76928, 76937, 76945, 76955, 76959, 76964, 76968, - 76980, 2892, 76988, 76996, 77001, 77012, 77023, 77032, 77037, 77043, - 77048, 77058, 77068, 77073, 77079, 77084, 77093, 19648, 77097, 4058, 20, - 77102, 77111, 77118, 77125, 77131, 77137, 834, 77142, 77147, 58666, - 77152, 77157, 77163, 77171, 77176, 77183, 77189, 77194, 35898, 39163, - 77200, 2896, 32, 77210, 77223, 77228, 77236, 77241, 77247, 2918, 26355, - 77252, 77260, 77267, 77272, 56453, 59647, 77281, 77285, 1668, 1777, - 77290, 77295, 77302, 1781, 247, 77309, 77315, 77320, 77327, 1785, 77332, - 77338, 77343, 77355, 4614, 77365, 1792, 77371, 77376, 77383, 77390, - 77405, 77412, 77423, 77431, 2577, 77435, 77447, 77452, 77456, 77462, - 26180, 2215, 77466, 77477, 77481, 77485, 77491, 77495, 77504, 77508, - 77519, 77523, 2261, 30170, 77527, 77537, 3031, 7804, 77545, 77550, 77554, - 77563, 77570, 77576, 3001, 15429, 77580, 77593, 77611, 77616, 77624, - 77632, 77642, 11505, 77654, 77667, 77674, 77681, 77697, 77704, 77710, - 1050, 77717, 77724, 77734, 77743, 77755, 40129, 77763, 3015, 10398, - 77766, 77774, 77778, 3019, 77782, 19444, 10414, 3697, 77786, 3025, 77790, - 77800, 77806, 77812, 77818, 77824, 77830, 77836, 77842, 77848, 77854, - 77860, 77866, 77872, 77878, 77884, 77890, 77896, 77902, 77908, 77914, - 77920, 77926, 77932, 77938, 77944, 77950, 77957, 77964, 77970, 77976, - 77982, 77988, 77994, 78000, 1347, 14339, 10436, 78006, 78011, 78016, - 78021, 78026, 78031, 78036, 78041, 78046, 78051, 78056, 78061, 78066, - 78071, 78076, 78081, 78086, 78091, 78096, 78101, 78106, 78111, 78116, - 78121, 78126, 78131, 78137, 78142, 78147, 78153, 78158, 78164, 78169, - 78174, 78180, 78185, 78190, 78195, 78200, 78205, 78210, 78215, 78220, - 77801, 77807, 77813, 77819, 77825, 77831, 77837, 77843, 77849, 77855, - 77861, 77867, 77873, 77879, 77885, 78226, 77891, 77897, 77903, 78232, - 77909, 77915, 77921, 77927, 77933, 77939, 77945, 77965, 78238, 78244, - 77971, 78250, 77977, 77983, 77989, 77995, 78001, 3046, 3051, 78256, - 78261, 78264, 78270, 78276, 78283, 78288, 78293, 2266, + 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, 225, 245, 119, 79, 224, 178, 79, 51, 53, 247, 207, 53, 226, 93, - 53, 254, 162, 254, 97, 43, 226, 168, 47, 226, 168, 254, 3, 95, 53, 250, - 23, 241, 20, 244, 64, 219, 83, 219, 250, 21, 212, 79, 21, 118, 21, 112, - 21, 170, 21, 167, 21, 185, 21, 192, 21, 200, 21, 198, 21, 203, 250, 30, - 221, 93, 233, 137, 53, 245, 182, 53, 242, 228, 53, 224, 193, 79, 250, 22, - 253, 249, 7, 6, 1, 63, 7, 6, 1, 253, 201, 7, 6, 1, 251, 121, 7, 6, 1, - 249, 125, 7, 6, 1, 77, 7, 6, 1, 245, 95, 7, 6, 1, 244, 41, 7, 6, 1, 242, - 162, 7, 6, 1, 75, 7, 6, 1, 236, 3, 7, 6, 1, 235, 141, 7, 6, 1, 155, 7, 6, - 1, 184, 7, 6, 1, 206, 7, 6, 1, 78, 7, 6, 1, 227, 11, 7, 6, 1, 225, 19, 7, - 6, 1, 152, 7, 6, 1, 196, 7, 6, 1, 218, 113, 7, 6, 1, 72, 7, 6, 1, 211, - 211, 7, 6, 1, 214, 85, 7, 6, 1, 213, 169, 7, 6, 1, 213, 108, 7, 6, 1, - 212, 152, 43, 42, 125, 223, 237, 219, 250, 47, 42, 125, 250, 91, 255, 46, - 117, 233, 83, 242, 234, 255, 46, 7, 4, 1, 63, 7, 4, 1, 253, 201, 7, 4, 1, - 251, 121, 7, 4, 1, 249, 125, 7, 4, 1, 77, 7, 4, 1, 245, 95, 7, 4, 1, 244, - 41, 7, 4, 1, 242, 162, 7, 4, 1, 75, 7, 4, 1, 236, 3, 7, 4, 1, 235, 141, - 7, 4, 1, 155, 7, 4, 1, 184, 7, 4, 1, 206, 7, 4, 1, 78, 7, 4, 1, 227, 11, - 7, 4, 1, 225, 19, 7, 4, 1, 152, 7, 4, 1, 196, 7, 4, 1, 218, 113, 7, 4, 1, - 72, 7, 4, 1, 211, 211, 7, 4, 1, 214, 85, 7, 4, 1, 213, 169, 7, 4, 1, 213, - 108, 7, 4, 1, 212, 152, 43, 249, 163, 125, 66, 233, 83, 47, 249, 163, - 125, 177, 228, 227, 219, 225, 236, 52, 245, 119, 79, 250, 233, 53, 225, - 144, 53, 249, 162, 53, 213, 32, 53, 251, 188, 134, 222, 115, 53, 248, 74, - 249, 225, 53, 244, 225, 227, 59, 236, 96, 233, 164, 52, 254, 146, 224, - 178, 79, 228, 206, 53, 219, 255, 241, 21, 224, 30, 53, 232, 110, 248, - 143, 53, 225, 191, 53, 218, 237, 112, 218, 237, 170, 255, 36, 255, 46, - 231, 111, 53, 225, 236, 53, 231, 107, 247, 195, 250, 240, 218, 237, 118, - 232, 26, 227, 59, 236, 96, 223, 178, 52, 254, 146, 224, 178, 79, 214, - 101, 244, 92, 124, 224, 201, 214, 101, 244, 92, 124, 242, 129, 214, 101, - 244, 92, 137, 224, 199, 236, 52, 224, 193, 79, 7, 6, 1, 111, 2, 209, 7, - 6, 1, 111, 2, 138, 7, 6, 1, 111, 2, 250, 90, 7, 6, 1, 111, 2, 177, 7, 6, - 1, 111, 2, 248, 74, 7, 6, 1, 111, 2, 223, 165, 50, 7, 6, 1, 255, 20, 7, - 6, 1, 251, 122, 2, 250, 240, 7, 6, 1, 154, 2, 209, 7, 6, 1, 154, 2, 138, - 7, 6, 1, 154, 2, 250, 90, 7, 6, 1, 154, 2, 248, 74, 7, 6, 1, 241, 7, 2, - 209, 7, 6, 1, 241, 7, 2, 138, 7, 6, 1, 241, 7, 2, 250, 90, 7, 6, 1, 241, - 7, 2, 248, 74, 7, 6, 1, 245, 146, 7, 6, 1, 230, 167, 2, 177, 7, 6, 1, - 141, 2, 209, 7, 6, 1, 141, 2, 138, 7, 6, 1, 141, 2, 250, 90, 7, 6, 1, - 141, 2, 177, 7, 6, 1, 141, 2, 248, 74, 230, 224, 53, 7, 6, 1, 141, 2, 91, - 7, 6, 1, 103, 2, 209, 7, 6, 1, 103, 2, 138, 7, 6, 1, 103, 2, 250, 90, 7, - 6, 1, 103, 2, 248, 74, 7, 6, 1, 213, 109, 2, 138, 7, 6, 1, 217, 117, 7, - 4, 1, 221, 21, 196, 7, 4, 1, 111, 2, 209, 7, 4, 1, 111, 2, 138, 7, 4, 1, - 111, 2, 250, 90, 7, 4, 1, 111, 2, 177, 7, 4, 1, 111, 2, 248, 74, 7, 4, 1, - 111, 2, 223, 165, 50, 7, 4, 1, 255, 20, 7, 4, 1, 251, 122, 2, 250, 240, - 7, 4, 1, 154, 2, 209, 7, 4, 1, 154, 2, 138, 7, 4, 1, 154, 2, 250, 90, 7, - 4, 1, 154, 2, 248, 74, 7, 4, 1, 241, 7, 2, 209, 7, 4, 1, 241, 7, 2, 138, - 7, 4, 1, 241, 7, 2, 250, 90, 7, 4, 1, 241, 7, 2, 248, 74, 7, 4, 1, 245, - 146, 7, 4, 1, 230, 167, 2, 177, 7, 4, 1, 141, 2, 209, 7, 4, 1, 141, 2, - 138, 7, 4, 1, 141, 2, 250, 90, 7, 4, 1, 141, 2, 177, 7, 4, 1, 141, 2, - 248, 74, 247, 242, 53, 7, 4, 1, 141, 2, 91, 7, 4, 1, 103, 2, 209, 7, 4, - 1, 103, 2, 138, 7, 4, 1, 103, 2, 250, 90, 7, 4, 1, 103, 2, 248, 74, 7, 4, - 1, 213, 109, 2, 138, 7, 4, 1, 217, 117, 7, 4, 1, 213, 109, 2, 248, 74, 7, - 6, 1, 111, 2, 232, 110, 7, 4, 1, 111, 2, 232, 110, 7, 6, 1, 111, 2, 251, - 199, 7, 4, 1, 111, 2, 251, 199, 7, 6, 1, 111, 2, 227, 127, 7, 4, 1, 111, - 2, 227, 127, 7, 6, 1, 251, 122, 2, 138, 7, 4, 1, 251, 122, 2, 138, 7, 6, - 1, 251, 122, 2, 250, 90, 7, 4, 1, 251, 122, 2, 250, 90, 7, 6, 1, 251, - 122, 2, 62, 50, 7, 4, 1, 251, 122, 2, 62, 50, 7, 6, 1, 251, 122, 2, 251, - 34, 7, 4, 1, 251, 122, 2, 251, 34, 7, 6, 1, 249, 126, 2, 251, 34, 7, 4, - 1, 249, 126, 2, 251, 34, 7, 6, 1, 249, 126, 2, 91, 7, 4, 1, 249, 126, 2, - 91, 7, 6, 1, 154, 2, 232, 110, 7, 4, 1, 154, 2, 232, 110, 7, 6, 1, 154, - 2, 251, 199, 7, 4, 1, 154, 2, 251, 199, 7, 6, 1, 154, 2, 62, 50, 7, 4, 1, - 154, 2, 62, 50, 7, 6, 1, 154, 2, 227, 127, 7, 4, 1, 154, 2, 227, 127, 7, - 6, 1, 154, 2, 251, 34, 7, 4, 1, 154, 2, 251, 34, 7, 6, 1, 244, 42, 2, - 250, 90, 7, 4, 1, 244, 42, 2, 250, 90, 7, 6, 1, 244, 42, 2, 251, 199, 7, - 4, 1, 244, 42, 2, 251, 199, 7, 6, 1, 244, 42, 2, 62, 50, 7, 4, 1, 244, - 42, 2, 62, 50, 7, 6, 1, 244, 42, 2, 250, 240, 7, 4, 1, 244, 42, 2, 250, - 240, 7, 6, 1, 242, 163, 2, 250, 90, 7, 4, 1, 242, 163, 2, 250, 90, 7, 6, - 1, 242, 163, 2, 91, 7, 4, 1, 242, 163, 2, 91, 7, 6, 1, 241, 7, 2, 177, 7, - 4, 1, 241, 7, 2, 177, 7, 6, 1, 241, 7, 2, 232, 110, 7, 4, 1, 241, 7, 2, - 232, 110, 7, 6, 1, 241, 7, 2, 251, 199, 7, 4, 1, 241, 7, 2, 251, 199, 7, - 6, 1, 241, 7, 2, 227, 127, 7, 4, 1, 241, 7, 2, 227, 127, 7, 6, 1, 241, 7, - 2, 62, 50, 7, 4, 1, 247, 194, 75, 7, 6, 26, 236, 143, 7, 4, 26, 236, 143, - 7, 6, 1, 236, 4, 2, 250, 90, 7, 4, 1, 236, 4, 2, 250, 90, 7, 6, 1, 235, - 142, 2, 250, 240, 7, 4, 1, 235, 142, 2, 250, 240, 7, 4, 1, 234, 103, 7, - 6, 1, 234, 13, 2, 138, 7, 4, 1, 234, 13, 2, 138, 7, 6, 1, 234, 13, 2, - 250, 240, 7, 4, 1, 234, 13, 2, 250, 240, 7, 6, 1, 234, 13, 2, 251, 34, 7, - 4, 1, 234, 13, 2, 251, 34, 7, 6, 1, 234, 13, 2, 231, 107, 247, 195, 7, 4, - 1, 234, 13, 2, 231, 107, 247, 195, 7, 6, 1, 234, 13, 2, 91, 7, 4, 1, 234, - 13, 2, 91, 7, 6, 1, 230, 167, 2, 138, 7, 4, 1, 230, 167, 2, 138, 7, 6, 1, - 230, 167, 2, 250, 240, 7, 4, 1, 230, 167, 2, 250, 240, 7, 6, 1, 230, 167, - 2, 251, 34, 7, 4, 1, 230, 167, 2, 251, 34, 7, 4, 1, 230, 167, 225, 120, - 251, 132, 254, 97, 7, 6, 1, 245, 217, 7, 4, 1, 245, 217, 7, 6, 1, 141, 2, - 232, 110, 7, 4, 1, 141, 2, 232, 110, 7, 6, 1, 141, 2, 251, 199, 7, 4, 1, - 141, 2, 251, 199, 7, 6, 1, 141, 2, 52, 138, 7, 4, 1, 141, 2, 52, 138, 7, - 6, 26, 227, 136, 7, 4, 26, 227, 136, 7, 6, 1, 224, 148, 2, 138, 7, 4, 1, - 224, 148, 2, 138, 7, 6, 1, 224, 148, 2, 250, 240, 7, 4, 1, 224, 148, 2, - 250, 240, 7, 6, 1, 224, 148, 2, 251, 34, 7, 4, 1, 224, 148, 2, 251, 34, - 7, 6, 1, 223, 29, 2, 138, 7, 4, 1, 223, 29, 2, 138, 7, 6, 1, 223, 29, 2, - 250, 90, 7, 4, 1, 223, 29, 2, 250, 90, 7, 6, 1, 223, 29, 2, 250, 240, 7, - 4, 1, 223, 29, 2, 250, 240, 7, 6, 1, 223, 29, 2, 251, 34, 7, 4, 1, 223, - 29, 2, 251, 34, 7, 6, 1, 218, 114, 2, 250, 240, 7, 4, 1, 218, 114, 2, - 250, 240, 7, 6, 1, 218, 114, 2, 251, 34, 7, 4, 1, 218, 114, 2, 251, 34, - 7, 6, 1, 218, 114, 2, 91, 7, 4, 1, 218, 114, 2, 91, 7, 6, 1, 103, 2, 177, - 7, 4, 1, 103, 2, 177, 7, 6, 1, 103, 2, 232, 110, 7, 4, 1, 103, 2, 232, - 110, 7, 6, 1, 103, 2, 251, 199, 7, 4, 1, 103, 2, 251, 199, 7, 6, 1, 103, - 2, 223, 165, 50, 7, 4, 1, 103, 2, 223, 165, 50, 7, 6, 1, 103, 2, 52, 138, - 7, 4, 1, 103, 2, 52, 138, 7, 6, 1, 103, 2, 227, 127, 7, 4, 1, 103, 2, - 227, 127, 7, 6, 1, 214, 86, 2, 250, 90, 7, 4, 1, 214, 86, 2, 250, 90, 7, - 6, 1, 213, 109, 2, 250, 90, 7, 4, 1, 213, 109, 2, 250, 90, 7, 6, 1, 213, - 109, 2, 248, 74, 7, 6, 1, 212, 153, 2, 138, 7, 4, 1, 212, 153, 2, 138, 7, - 6, 1, 212, 153, 2, 62, 50, 7, 4, 1, 212, 153, 2, 62, 50, 7, 6, 1, 212, - 153, 2, 251, 34, 7, 4, 1, 212, 153, 2, 251, 34, 7, 4, 1, 187, 196, 7, 4, - 1, 57, 2, 91, 7, 6, 1, 57, 2, 102, 7, 6, 1, 57, 2, 216, 237, 7, 4, 1, 57, - 2, 216, 237, 7, 6, 1, 161, 192, 7, 4, 1, 161, 192, 7, 6, 1, 210, 78, 7, - 6, 1, 251, 122, 2, 102, 7, 4, 1, 251, 122, 2, 102, 7, 6, 1, 254, 252, - 249, 125, 7, 6, 1, 249, 126, 2, 102, 7, 6, 1, 249, 126, 2, 216, 237, 7, - 4, 1, 249, 126, 2, 216, 237, 7, 4, 1, 216, 66, 248, 126, 7, 6, 1, 223, - 236, 77, 7, 6, 1, 222, 136, 7, 6, 1, 210, 77, 7, 6, 1, 245, 96, 2, 102, - 7, 4, 1, 245, 96, 2, 102, 7, 6, 1, 244, 42, 2, 102, 7, 6, 1, 243, 203, 7, - 4, 1, 241, 54, 7, 6, 1, 236, 44, 7, 6, 1, 241, 7, 2, 91, 7, 6, 1, 235, - 142, 2, 102, 7, 4, 1, 235, 142, 2, 102, 7, 4, 1, 234, 13, 2, 134, 7, 4, - 1, 233, 222, 2, 91, 7, 6, 1, 216, 66, 184, 7, 6, 1, 230, 167, 2, 43, 102, - 7, 4, 1, 230, 167, 2, 187, 47, 233, 158, 7, 6, 1, 141, 2, 231, 107, 177, - 7, 6, 1, 141, 2, 241, 97, 7, 4, 1, 141, 2, 241, 97, 7, 6, 1, 227, 122, 7, - 4, 1, 227, 122, 7, 6, 1, 227, 12, 2, 102, 7, 4, 1, 227, 12, 2, 102, 7, 1, - 212, 206, 7, 6, 1, 161, 112, 7, 4, 1, 161, 112, 7, 6, 1, 245, 161, 7, 1, - 223, 236, 245, 162, 232, 251, 7, 4, 1, 218, 114, 2, 226, 230, 102, 7, 6, - 1, 218, 114, 2, 102, 7, 4, 1, 218, 114, 2, 102, 7, 6, 1, 218, 114, 2, - 223, 241, 102, 7, 6, 1, 103, 2, 241, 97, 7, 4, 1, 103, 2, 241, 97, 7, 6, - 1, 215, 134, 7, 6, 1, 215, 86, 2, 102, 7, 6, 1, 213, 109, 2, 102, 7, 4, - 1, 213, 109, 2, 102, 7, 6, 1, 212, 153, 2, 91, 7, 4, 1, 212, 153, 2, 91, - 7, 6, 1, 245, 97, 7, 6, 1, 245, 98, 223, 235, 7, 4, 1, 245, 98, 223, 235, - 7, 4, 1, 245, 98, 2, 218, 40, 7, 1, 119, 2, 91, 7, 6, 1, 161, 185, 7, 4, - 1, 161, 185, 7, 1, 236, 52, 243, 20, 219, 84, 2, 91, 7, 1, 213, 172, 7, - 1, 248, 119, 250, 71, 7, 1, 233, 199, 250, 71, 7, 1, 254, 173, 250, 71, - 7, 1, 223, 241, 250, 71, 7, 6, 1, 246, 116, 2, 251, 34, 7, 6, 1, 249, - 126, 2, 4, 1, 212, 153, 2, 251, 34, 7, 4, 1, 246, 116, 2, 251, 34, 7, 6, - 1, 233, 58, 7, 6, 1, 234, 13, 2, 4, 1, 236, 3, 7, 4, 1, 233, 58, 7, 6, 1, - 229, 81, 7, 6, 1, 230, 167, 2, 4, 1, 236, 3, 7, 4, 1, 229, 81, 7, 6, 1, - 111, 2, 251, 34, 7, 4, 1, 111, 2, 251, 34, 7, 6, 1, 241, 7, 2, 251, 34, - 7, 4, 1, 241, 7, 2, 251, 34, 7, 6, 1, 141, 2, 251, 34, 7, 4, 1, 141, 2, - 251, 34, 7, 6, 1, 103, 2, 251, 34, 7, 4, 1, 103, 2, 251, 34, 7, 6, 1, - 103, 2, 248, 75, 22, 232, 110, 7, 4, 1, 103, 2, 248, 75, 22, 232, 110, 7, - 6, 1, 103, 2, 248, 75, 22, 138, 7, 4, 1, 103, 2, 248, 75, 22, 138, 7, 6, - 1, 103, 2, 248, 75, 22, 251, 34, 7, 4, 1, 103, 2, 248, 75, 22, 251, 34, - 7, 6, 1, 103, 2, 248, 75, 22, 209, 7, 4, 1, 103, 2, 248, 75, 22, 209, 7, - 4, 1, 216, 66, 77, 7, 6, 1, 111, 2, 248, 75, 22, 232, 110, 7, 4, 1, 111, - 2, 248, 75, 22, 232, 110, 7, 6, 1, 111, 2, 62, 74, 22, 232, 110, 7, 4, 1, - 111, 2, 62, 74, 22, 232, 110, 7, 6, 1, 255, 21, 2, 232, 110, 7, 4, 1, - 255, 21, 2, 232, 110, 7, 6, 1, 244, 42, 2, 91, 7, 4, 1, 244, 42, 2, 91, - 7, 6, 1, 244, 42, 2, 251, 34, 7, 4, 1, 244, 42, 2, 251, 34, 7, 6, 1, 235, - 142, 2, 251, 34, 7, 4, 1, 235, 142, 2, 251, 34, 7, 6, 1, 141, 2, 227, - 127, 7, 4, 1, 141, 2, 227, 127, 7, 6, 1, 141, 2, 227, 128, 22, 232, 110, - 7, 4, 1, 141, 2, 227, 128, 22, 232, 110, 7, 6, 1, 245, 98, 2, 251, 34, 7, - 4, 1, 245, 98, 2, 251, 34, 7, 4, 1, 236, 4, 2, 251, 34, 7, 6, 1, 246, - 115, 7, 6, 1, 249, 126, 2, 4, 1, 212, 152, 7, 4, 1, 246, 115, 7, 6, 1, - 244, 42, 2, 138, 7, 4, 1, 244, 42, 2, 138, 7, 6, 1, 241, 52, 7, 6, 1, - 213, 172, 7, 6, 1, 230, 167, 2, 209, 7, 4, 1, 230, 167, 2, 209, 7, 6, 1, - 111, 2, 223, 165, 74, 22, 138, 7, 4, 1, 111, 2, 223, 165, 74, 22, 138, 7, - 6, 1, 255, 21, 2, 138, 7, 4, 1, 255, 21, 2, 138, 7, 6, 1, 141, 2, 219, - 59, 22, 138, 7, 4, 1, 141, 2, 219, 59, 22, 138, 7, 6, 1, 111, 2, 52, 209, - 7, 4, 1, 111, 2, 52, 209, 7, 6, 1, 111, 2, 236, 52, 251, 199, 7, 4, 1, - 111, 2, 236, 52, 251, 199, 7, 6, 1, 154, 2, 52, 209, 7, 4, 1, 154, 2, 52, - 209, 7, 6, 1, 154, 2, 236, 52, 251, 199, 7, 4, 1, 154, 2, 236, 52, 251, - 199, 7, 6, 1, 241, 7, 2, 52, 209, 7, 4, 1, 241, 7, 2, 52, 209, 7, 6, 1, - 241, 7, 2, 236, 52, 251, 199, 7, 4, 1, 241, 7, 2, 236, 52, 251, 199, 7, - 6, 1, 141, 2, 52, 209, 7, 4, 1, 141, 2, 52, 209, 7, 6, 1, 141, 2, 236, - 52, 251, 199, 7, 4, 1, 141, 2, 236, 52, 251, 199, 7, 6, 1, 224, 148, 2, - 52, 209, 7, 4, 1, 224, 148, 2, 52, 209, 7, 6, 1, 224, 148, 2, 236, 52, - 251, 199, 7, 4, 1, 224, 148, 2, 236, 52, 251, 199, 7, 6, 1, 103, 2, 52, - 209, 7, 4, 1, 103, 2, 52, 209, 7, 6, 1, 103, 2, 236, 52, 251, 199, 7, 4, - 1, 103, 2, 236, 52, 251, 199, 7, 6, 1, 223, 29, 2, 250, 24, 55, 7, 4, 1, - 223, 29, 2, 250, 24, 55, 7, 6, 1, 218, 114, 2, 250, 24, 55, 7, 4, 1, 218, - 114, 2, 250, 24, 55, 7, 6, 1, 212, 223, 7, 4, 1, 212, 223, 7, 6, 1, 242, - 163, 2, 251, 34, 7, 4, 1, 242, 163, 2, 251, 34, 7, 6, 1, 230, 167, 2, - 187, 47, 233, 158, 7, 4, 1, 249, 126, 2, 249, 164, 7, 6, 1, 227, 40, 7, - 4, 1, 227, 40, 7, 6, 1, 212, 153, 2, 102, 7, 4, 1, 212, 153, 2, 102, 7, - 6, 1, 111, 2, 62, 50, 7, 4, 1, 111, 2, 62, 50, 7, 6, 1, 154, 2, 250, 240, - 7, 4, 1, 154, 2, 250, 240, 7, 6, 1, 141, 2, 248, 75, 22, 232, 110, 7, 4, - 1, 141, 2, 248, 75, 22, 232, 110, 7, 6, 1, 141, 2, 217, 56, 22, 232, 110, - 7, 4, 1, 141, 2, 217, 56, 22, 232, 110, 7, 6, 1, 141, 2, 62, 50, 7, 4, 1, - 141, 2, 62, 50, 7, 6, 1, 141, 2, 62, 74, 22, 232, 110, 7, 4, 1, 141, 2, - 62, 74, 22, 232, 110, 7, 6, 1, 213, 109, 2, 232, 110, 7, 4, 1, 213, 109, - 2, 232, 110, 7, 4, 1, 234, 13, 2, 249, 164, 7, 4, 1, 230, 167, 2, 249, - 164, 7, 4, 1, 218, 114, 2, 249, 164, 7, 4, 1, 247, 194, 236, 3, 7, 4, 1, - 248, 210, 248, 37, 7, 4, 1, 224, 211, 248, 37, 7, 6, 1, 111, 2, 91, 7, 6, - 1, 251, 122, 2, 91, 7, 4, 1, 251, 122, 2, 91, 7, 6, 1, 234, 13, 2, 134, - 7, 6, 1, 218, 114, 2, 248, 72, 91, 7, 4, 1, 223, 29, 2, 218, 209, 218, - 40, 7, 4, 1, 212, 153, 2, 218, 209, 218, 40, 7, 6, 1, 243, 20, 219, 83, - 7, 4, 1, 243, 20, 219, 83, 7, 6, 1, 57, 2, 91, 7, 6, 1, 103, 134, 7, 6, - 1, 216, 66, 211, 211, 7, 6, 1, 154, 2, 91, 7, 4, 1, 154, 2, 91, 7, 6, 1, - 236, 4, 2, 91, 7, 4, 1, 236, 4, 2, 91, 7, 6, 1, 4, 225, 20, 2, 241, 157, - 218, 40, 7, 4, 1, 225, 20, 2, 241, 157, 218, 40, 7, 6, 1, 224, 148, 2, - 91, 7, 4, 1, 224, 148, 2, 91, 7, 6, 1, 213, 109, 2, 91, 7, 4, 1, 213, - 109, 2, 91, 7, 4, 1, 216, 66, 63, 7, 4, 1, 254, 179, 7, 4, 1, 216, 66, - 254, 179, 7, 4, 1, 57, 2, 102, 7, 4, 1, 210, 78, 7, 4, 1, 251, 122, 2, - 249, 164, 7, 4, 1, 249, 126, 2, 218, 40, 7, 4, 1, 249, 126, 2, 102, 7, 4, - 1, 223, 236, 77, 7, 4, 1, 222, 136, 7, 4, 1, 222, 137, 2, 102, 7, 4, 1, - 210, 77, 7, 4, 1, 223, 236, 210, 77, 7, 4, 1, 223, 236, 210, 154, 2, 102, - 7, 4, 1, 250, 60, 223, 236, 210, 77, 7, 4, 1, 247, 194, 236, 4, 2, 91, 7, - 4, 1, 244, 42, 2, 102, 7, 4, 1, 115, 244, 41, 7, 1, 4, 6, 244, 41, 7, 4, - 1, 243, 203, 7, 4, 1, 224, 78, 241, 97, 7, 4, 1, 216, 66, 242, 162, 7, 4, - 1, 242, 163, 2, 102, 7, 4, 1, 242, 55, 2, 102, 7, 4, 1, 241, 7, 2, 91, 7, - 4, 1, 236, 44, 7, 1, 4, 6, 75, 7, 4, 1, 234, 13, 2, 231, 107, 177, 7, 4, - 1, 234, 13, 2, 252, 88, 7, 4, 1, 234, 13, 2, 223, 241, 102, 7, 4, 1, 233, - 125, 7, 4, 1, 216, 66, 184, 7, 4, 1, 216, 66, 232, 183, 2, 187, 233, 158, - 7, 4, 1, 232, 183, 2, 102, 7, 4, 1, 230, 167, 2, 43, 102, 7, 4, 1, 230, - 167, 2, 223, 241, 102, 7, 1, 4, 6, 206, 7, 4, 1, 252, 180, 78, 7, 1, 4, - 6, 227, 136, 7, 4, 1, 250, 60, 227, 104, 7, 4, 1, 226, 45, 7, 4, 1, 216, - 66, 152, 7, 4, 1, 216, 66, 224, 148, 2, 187, 233, 158, 7, 4, 1, 216, 66, - 224, 148, 2, 102, 7, 4, 1, 224, 148, 2, 187, 233, 158, 7, 4, 1, 224, 148, - 2, 218, 40, 7, 4, 1, 224, 148, 2, 244, 176, 7, 4, 1, 223, 236, 224, 148, - 2, 244, 176, 7, 1, 4, 6, 152, 7, 1, 4, 6, 236, 52, 152, 7, 4, 1, 223, 29, - 2, 102, 7, 4, 1, 245, 161, 7, 4, 1, 247, 194, 236, 4, 2, 219, 59, 22, - 102, 7, 4, 1, 219, 182, 223, 236, 245, 161, 7, 4, 1, 245, 162, 2, 249, - 164, 7, 4, 1, 216, 66, 218, 113, 7, 4, 1, 218, 114, 2, 223, 241, 102, 7, - 4, 1, 103, 134, 7, 4, 1, 215, 134, 7, 4, 1, 215, 86, 2, 102, 7, 4, 1, - 216, 66, 211, 211, 7, 4, 1, 216, 66, 214, 85, 7, 4, 1, 216, 66, 213, 108, - 7, 1, 4, 6, 213, 108, 7, 4, 1, 212, 153, 2, 223, 241, 102, 7, 4, 1, 212, - 153, 2, 249, 164, 7, 4, 1, 245, 97, 7, 4, 1, 245, 98, 2, 249, 164, 7, 1, - 243, 20, 219, 83, 7, 1, 226, 51, 214, 120, 244, 83, 7, 1, 236, 52, 243, - 20, 219, 83, 7, 1, 219, 64, 251, 121, 7, 1, 252, 38, 250, 71, 7, 1, 4, 6, - 253, 201, 7, 4, 1, 250, 60, 210, 77, 7, 1, 4, 6, 244, 42, 2, 102, 7, 1, - 4, 6, 242, 162, 7, 4, 1, 236, 4, 2, 249, 190, 7, 4, 1, 216, 66, 235, 141, - 7, 1, 4, 6, 155, 7, 4, 1, 225, 20, 2, 102, 7, 1, 243, 20, 219, 84, 2, 91, - 7, 1, 223, 236, 243, 20, 219, 84, 2, 91, 7, 4, 1, 246, 116, 248, 37, 7, - 4, 1, 248, 98, 248, 37, 7, 4, 1, 246, 116, 248, 38, 2, 249, 164, 7, 4, 1, - 216, 156, 248, 37, 7, 4, 1, 217, 201, 248, 37, 7, 4, 1, 217, 249, 248, - 38, 2, 249, 164, 7, 4, 1, 244, 223, 248, 37, 7, 4, 1, 232, 232, 248, 37, - 7, 4, 1, 232, 184, 248, 37, 7, 1, 252, 38, 226, 92, 7, 1, 252, 46, 226, - 92, 7, 4, 1, 216, 66, 242, 163, 2, 244, 176, 7, 4, 1, 216, 66, 242, 163, - 2, 244, 177, 22, 218, 40, 59, 1, 4, 242, 162, 59, 1, 4, 242, 163, 2, 102, - 59, 1, 4, 236, 3, 59, 1, 4, 152, 59, 1, 4, 216, 66, 152, 59, 1, 4, 216, - 66, 224, 148, 2, 102, 59, 1, 4, 6, 236, 52, 152, 59, 1, 4, 214, 85, 59, - 1, 4, 213, 108, 59, 1, 225, 107, 59, 1, 52, 225, 107, 59, 1, 216, 66, - 250, 23, 59, 1, 254, 97, 59, 1, 223, 236, 250, 23, 59, 1, 47, 157, 223, - 164, 59, 1, 43, 157, 223, 164, 59, 1, 243, 20, 219, 83, 59, 1, 223, 236, - 243, 20, 219, 83, 59, 1, 43, 254, 35, 59, 1, 47, 254, 35, 59, 1, 116, - 254, 35, 59, 1, 121, 254, 35, 59, 1, 250, 91, 255, 46, 251, 34, 59, 1, - 66, 233, 83, 59, 1, 232, 110, 59, 1, 255, 36, 255, 46, 59, 1, 242, 234, - 255, 46, 59, 1, 117, 66, 233, 83, 59, 1, 117, 232, 110, 59, 1, 117, 242, - 234, 255, 46, 59, 1, 117, 255, 36, 255, 46, 59, 1, 216, 193, 250, 30, 59, - 1, 157, 216, 193, 250, 30, 59, 1, 250, 230, 47, 157, 223, 164, 59, 1, - 250, 230, 43, 157, 223, 164, 59, 1, 116, 218, 50, 59, 1, 121, 218, 50, - 59, 1, 95, 53, 59, 1, 231, 65, 53, 251, 199, 62, 50, 223, 165, 50, 227, - 127, 4, 177, 52, 255, 36, 255, 46, 59, 1, 223, 223, 102, 59, 1, 249, 194, - 255, 46, 59, 1, 4, 243, 203, 59, 1, 4, 155, 59, 1, 4, 196, 59, 1, 4, 213, - 169, 59, 1, 4, 223, 236, 243, 20, 219, 83, 59, 1, 245, 109, 161, 134, 59, - 1, 127, 161, 134, 59, 1, 231, 108, 161, 134, 59, 1, 117, 161, 134, 59, 1, - 245, 108, 161, 134, 59, 1, 212, 246, 248, 116, 161, 79, 59, 1, 213, 61, - 248, 116, 161, 79, 59, 1, 214, 118, 59, 1, 215, 162, 59, 1, 52, 254, 97, - 59, 1, 117, 121, 254, 35, 59, 1, 117, 116, 254, 35, 59, 1, 117, 43, 254, - 35, 59, 1, 117, 47, 254, 35, 59, 1, 117, 223, 164, 59, 1, 231, 107, 242, - 234, 255, 46, 59, 1, 231, 107, 52, 242, 234, 255, 46, 59, 1, 231, 107, - 52, 255, 36, 255, 46, 59, 1, 117, 177, 59, 1, 224, 83, 250, 30, 59, 1, - 252, 104, 127, 216, 254, 59, 1, 245, 222, 127, 216, 254, 59, 1, 252, 104, - 117, 216, 254, 59, 1, 245, 222, 117, 216, 254, 59, 1, 220, 255, 59, 1, - 210, 220, 255, 59, 1, 117, 43, 71, 38, 242, 234, 255, 46, 38, 255, 36, - 255, 46, 38, 250, 91, 255, 46, 38, 177, 38, 232, 110, 38, 227, 25, 38, - 251, 199, 38, 62, 50, 38, 248, 74, 38, 241, 157, 50, 38, 223, 165, 50, - 38, 52, 255, 36, 255, 46, 38, 251, 34, 38, 66, 233, 84, 50, 38, 52, 66, - 233, 84, 50, 38, 52, 242, 234, 255, 46, 38, 251, 55, 38, 236, 52, 251, - 199, 38, 216, 66, 250, 24, 50, 38, 250, 24, 50, 38, 223, 236, 250, 24, - 50, 38, 250, 24, 74, 223, 182, 38, 242, 234, 255, 47, 55, 38, 255, 36, - 255, 47, 55, 38, 43, 218, 51, 55, 38, 47, 218, 51, 55, 38, 43, 254, 146, - 50, 38, 241, 97, 38, 43, 157, 223, 165, 55, 38, 116, 218, 51, 55, 38, - 121, 218, 51, 55, 38, 95, 5, 55, 38, 231, 65, 5, 55, 38, 226, 228, 241, - 157, 55, 38, 223, 241, 241, 157, 55, 38, 62, 55, 38, 248, 75, 55, 38, - 223, 165, 55, 38, 250, 24, 55, 38, 250, 240, 38, 227, 127, 38, 66, 233, - 84, 55, 38, 251, 193, 55, 38, 236, 52, 52, 254, 65, 55, 38, 251, 35, 55, - 38, 250, 91, 255, 47, 55, 38, 251, 200, 55, 38, 236, 52, 251, 200, 55, - 38, 217, 56, 55, 38, 232, 111, 55, 38, 117, 233, 83, 38, 52, 117, 233, - 83, 38, 217, 56, 227, 26, 38, 220, 196, 219, 59, 227, 26, 38, 187, 219, - 59, 227, 26, 38, 220, 196, 219, 251, 227, 26, 38, 187, 219, 251, 227, 26, - 38, 47, 157, 223, 165, 55, 38, 236, 52, 251, 193, 55, 38, 42, 55, 38, - 222, 122, 55, 38, 213, 170, 50, 38, 66, 177, 38, 52, 227, 25, 38, 242, - 234, 161, 79, 38, 255, 36, 161, 79, 38, 25, 226, 86, 38, 25, 234, 122, - 38, 25, 248, 69, 216, 244, 38, 25, 212, 211, 38, 251, 193, 50, 38, 245, - 182, 5, 55, 38, 52, 66, 233, 84, 55, 38, 43, 254, 146, 55, 38, 228, 206, - 217, 56, 50, 38, 241, 163, 50, 38, 254, 184, 126, 217, 10, 50, 38, 43, - 47, 80, 55, 38, 215, 130, 80, 55, 38, 242, 238, 235, 180, 38, 47, 254, - 36, 50, 38, 43, 157, 223, 165, 50, 38, 244, 220, 38, 213, 170, 55, 38, - 43, 254, 36, 55, 38, 47, 254, 36, 55, 38, 47, 254, 36, 22, 116, 254, 36, - 55, 38, 47, 157, 223, 165, 50, 38, 62, 74, 223, 182, 38, 254, 4, 55, 38, - 52, 223, 165, 55, 38, 212, 28, 50, 38, 52, 251, 200, 55, 38, 52, 251, - 199, 38, 52, 232, 110, 38, 52, 232, 111, 55, 38, 52, 177, 38, 52, 236, - 52, 251, 199, 38, 52, 96, 80, 55, 38, 7, 4, 1, 63, 38, 7, 4, 1, 77, 38, - 7, 4, 1, 75, 38, 7, 4, 1, 78, 38, 7, 4, 1, 72, 38, 7, 4, 1, 251, 121, 38, - 7, 4, 1, 249, 125, 38, 7, 4, 1, 242, 162, 38, 7, 4, 1, 184, 38, 7, 4, 1, - 152, 38, 7, 4, 1, 218, 113, 38, 7, 4, 1, 211, 211, 38, 7, 4, 1, 213, 169, - 25, 6, 1, 242, 44, 25, 4, 1, 242, 44, 25, 6, 1, 254, 64, 222, 185, 25, 4, - 1, 254, 64, 222, 185, 25, 228, 97, 53, 25, 232, 237, 228, 97, 53, 25, 6, - 1, 226, 215, 248, 44, 25, 4, 1, 226, 215, 248, 44, 25, 212, 211, 25, 4, - 223, 236, 232, 215, 220, 123, 88, 25, 4, 246, 193, 232, 215, 220, 123, - 88, 25, 4, 223, 236, 246, 193, 232, 215, 220, 123, 88, 25, 224, 193, 79, - 25, 216, 244, 25, 248, 69, 216, 244, 25, 6, 1, 254, 180, 2, 216, 244, 25, - 254, 135, 217, 224, 25, 6, 1, 245, 185, 2, 216, 244, 25, 6, 1, 245, 150, - 2, 216, 244, 25, 6, 1, 236, 45, 2, 216, 244, 25, 6, 1, 227, 103, 2, 216, - 244, 25, 6, 1, 215, 135, 2, 216, 244, 25, 6, 1, 227, 105, 2, 216, 244, - 25, 4, 1, 236, 45, 2, 248, 69, 22, 216, 244, 25, 6, 1, 254, 179, 25, 6, - 1, 252, 73, 25, 6, 1, 243, 203, 25, 6, 1, 248, 126, 25, 6, 1, 245, 184, - 25, 6, 1, 212, 78, 25, 6, 1, 245, 149, 25, 6, 1, 217, 145, 25, 6, 1, 236, - 44, 25, 6, 1, 235, 84, 25, 6, 1, 233, 220, 25, 6, 1, 230, 242, 25, 6, 1, - 228, 135, 25, 6, 1, 213, 148, 25, 6, 1, 227, 102, 25, 6, 1, 226, 20, 25, - 6, 1, 223, 224, 25, 6, 1, 220, 122, 25, 6, 1, 218, 5, 25, 6, 1, 215, 134, - 25, 6, 1, 226, 45, 25, 6, 1, 250, 170, 25, 6, 1, 225, 82, 25, 6, 1, 227, - 104, 25, 6, 1, 236, 45, 2, 248, 68, 25, 6, 1, 215, 135, 2, 248, 68, 25, - 4, 1, 254, 180, 2, 216, 244, 25, 4, 1, 245, 185, 2, 216, 244, 25, 4, 1, - 245, 150, 2, 216, 244, 25, 4, 1, 236, 45, 2, 216, 244, 25, 4, 1, 215, - 135, 2, 248, 69, 22, 216, 244, 25, 4, 1, 254, 179, 25, 4, 1, 252, 73, 25, - 4, 1, 243, 203, 25, 4, 1, 248, 126, 25, 4, 1, 245, 184, 25, 4, 1, 212, - 78, 25, 4, 1, 245, 149, 25, 4, 1, 217, 145, 25, 4, 1, 236, 44, 25, 4, 1, - 235, 84, 25, 4, 1, 233, 220, 25, 4, 1, 230, 242, 25, 4, 1, 228, 135, 25, - 4, 1, 213, 148, 25, 4, 1, 227, 102, 25, 4, 1, 226, 20, 25, 4, 1, 223, - 224, 25, 4, 1, 41, 220, 122, 25, 4, 1, 220, 122, 25, 4, 1, 218, 5, 25, 4, - 1, 215, 134, 25, 4, 1, 226, 45, 25, 4, 1, 250, 170, 25, 4, 1, 225, 82, - 25, 4, 1, 227, 104, 25, 4, 1, 236, 45, 2, 248, 68, 25, 4, 1, 215, 135, 2, - 248, 68, 25, 4, 1, 227, 103, 2, 216, 244, 25, 4, 1, 215, 135, 2, 216, - 244, 25, 4, 1, 227, 105, 2, 216, 244, 25, 6, 235, 109, 88, 25, 252, 74, - 88, 25, 217, 146, 88, 25, 215, 135, 2, 241, 157, 88, 25, 215, 135, 2, - 255, 36, 22, 241, 157, 88, 25, 215, 135, 2, 248, 75, 22, 241, 157, 88, - 25, 226, 46, 88, 25, 226, 21, 88, 25, 235, 109, 88, 25, 1, 254, 64, 234, - 126, 25, 4, 1, 254, 64, 234, 126, 25, 1, 219, 91, 25, 4, 1, 219, 91, 25, - 1, 248, 44, 25, 4, 1, 248, 44, 25, 1, 234, 126, 25, 4, 1, 234, 126, 25, - 1, 222, 185, 25, 4, 1, 222, 185, 81, 6, 1, 221, 0, 81, 4, 1, 221, 0, 81, - 6, 1, 244, 229, 81, 4, 1, 244, 229, 81, 6, 1, 234, 235, 81, 4, 1, 234, - 235, 81, 6, 1, 241, 150, 81, 4, 1, 241, 150, 81, 6, 1, 243, 198, 81, 4, - 1, 243, 198, 81, 6, 1, 220, 223, 81, 4, 1, 220, 223, 81, 6, 1, 248, 141, - 81, 4, 1, 248, 141, 25, 235, 85, 88, 25, 223, 225, 88, 25, 232, 215, 220, - 123, 88, 25, 1, 212, 216, 25, 6, 217, 146, 88, 25, 232, 215, 245, 185, - 88, 25, 223, 236, 232, 215, 245, 185, 88, 25, 6, 1, 220, 208, 25, 4, 1, - 220, 208, 25, 6, 232, 215, 220, 123, 88, 25, 6, 1, 222, 183, 25, 4, 1, - 222, 183, 25, 223, 225, 2, 219, 59, 88, 25, 6, 223, 236, 232, 215, 220, - 123, 88, 25, 6, 246, 193, 232, 215, 220, 123, 88, 25, 6, 223, 236, 246, - 193, 232, 215, 220, 123, 88, 33, 6, 1, 236, 173, 2, 209, 33, 6, 1, 236, - 48, 33, 6, 1, 247, 235, 33, 6, 1, 243, 27, 33, 6, 1, 215, 178, 236, 172, - 33, 6, 1, 246, 112, 33, 6, 1, 251, 130, 75, 33, 6, 1, 213, 0, 33, 6, 1, - 235, 242, 33, 6, 1, 233, 57, 33, 6, 1, 229, 73, 33, 6, 1, 216, 145, 33, - 6, 1, 234, 168, 33, 6, 1, 241, 7, 2, 209, 33, 6, 1, 220, 196, 72, 33, 6, - 1, 246, 108, 33, 6, 1, 63, 33, 6, 1, 252, 121, 33, 6, 1, 214, 237, 33, 6, - 1, 243, 76, 33, 6, 1, 248, 162, 33, 6, 1, 236, 172, 33, 6, 1, 212, 67, - 33, 6, 1, 212, 87, 33, 6, 1, 75, 33, 6, 1, 220, 196, 75, 33, 6, 1, 183, - 33, 6, 1, 245, 252, 33, 6, 1, 245, 238, 33, 6, 1, 245, 229, 33, 6, 1, 78, - 33, 6, 1, 226, 132, 33, 6, 1, 245, 176, 33, 6, 1, 245, 166, 33, 6, 1, - 217, 242, 33, 6, 1, 72, 33, 6, 1, 246, 24, 33, 6, 1, 162, 33, 6, 1, 216, - 149, 33, 6, 1, 250, 190, 33, 6, 1, 221, 47, 33, 6, 1, 221, 10, 33, 6, 1, - 242, 106, 53, 33, 6, 1, 213, 19, 33, 6, 1, 219, 255, 53, 33, 6, 1, 77, - 33, 6, 1, 212, 204, 33, 6, 1, 189, 33, 4, 1, 63, 33, 4, 1, 252, 121, 33, - 4, 1, 214, 237, 33, 4, 1, 243, 76, 33, 4, 1, 248, 162, 33, 4, 1, 236, - 172, 33, 4, 1, 212, 67, 33, 4, 1, 212, 87, 33, 4, 1, 75, 33, 4, 1, 220, - 196, 75, 33, 4, 1, 183, 33, 4, 1, 245, 252, 33, 4, 1, 245, 238, 33, 4, 1, - 245, 229, 33, 4, 1, 78, 33, 4, 1, 226, 132, 33, 4, 1, 245, 176, 33, 4, 1, - 245, 166, 33, 4, 1, 217, 242, 33, 4, 1, 72, 33, 4, 1, 246, 24, 33, 4, 1, - 162, 33, 4, 1, 216, 149, 33, 4, 1, 250, 190, 33, 4, 1, 221, 47, 33, 4, 1, - 221, 10, 33, 4, 1, 242, 106, 53, 33, 4, 1, 213, 19, 33, 4, 1, 219, 255, - 53, 33, 4, 1, 77, 33, 4, 1, 212, 204, 33, 4, 1, 189, 33, 4, 1, 236, 173, - 2, 209, 33, 4, 1, 236, 48, 33, 4, 1, 247, 235, 33, 4, 1, 243, 27, 33, 4, - 1, 215, 178, 236, 172, 33, 4, 1, 246, 112, 33, 4, 1, 251, 130, 75, 33, 4, - 1, 213, 0, 33, 4, 1, 235, 242, 33, 4, 1, 233, 57, 33, 4, 1, 229, 73, 33, - 4, 1, 216, 145, 33, 4, 1, 234, 168, 33, 4, 1, 241, 7, 2, 209, 33, 4, 1, - 220, 196, 72, 33, 4, 1, 246, 108, 33, 6, 1, 227, 104, 33, 4, 1, 227, 104, - 33, 6, 1, 213, 51, 33, 4, 1, 213, 51, 33, 6, 1, 236, 42, 77, 33, 4, 1, - 236, 42, 77, 33, 6, 1, 233, 62, 212, 175, 33, 4, 1, 233, 62, 212, 175, - 33, 6, 1, 236, 42, 233, 62, 212, 175, 33, 4, 1, 236, 42, 233, 62, 212, - 175, 33, 6, 1, 252, 41, 212, 175, 33, 4, 1, 252, 41, 212, 175, 33, 6, 1, - 236, 42, 252, 41, 212, 175, 33, 4, 1, 236, 42, 252, 41, 212, 175, 33, 6, - 1, 234, 97, 33, 4, 1, 234, 97, 33, 6, 1, 225, 82, 33, 4, 1, 225, 82, 33, - 6, 1, 244, 171, 33, 4, 1, 244, 171, 33, 6, 1, 236, 5, 33, 4, 1, 236, 5, - 33, 6, 1, 236, 6, 2, 52, 242, 234, 255, 46, 33, 4, 1, 236, 6, 2, 52, 242, - 234, 255, 46, 33, 6, 1, 215, 181, 33, 4, 1, 215, 181, 33, 6, 1, 223, 121, - 227, 104, 33, 4, 1, 223, 121, 227, 104, 33, 6, 1, 227, 105, 2, 217, 32, - 33, 4, 1, 227, 105, 2, 217, 32, 33, 6, 1, 227, 46, 33, 4, 1, 227, 46, 33, - 6, 1, 234, 126, 33, 4, 1, 234, 126, 33, 217, 112, 53, 38, 33, 217, 32, - 38, 33, 226, 229, 38, 33, 248, 221, 225, 188, 38, 33, 225, 76, 225, 188, - 38, 33, 225, 173, 38, 33, 241, 63, 217, 112, 53, 38, 33, 231, 74, 53, 33, - 6, 1, 220, 196, 241, 7, 2, 218, 40, 33, 4, 1, 220, 196, 241, 7, 2, 218, - 40, 33, 6, 1, 221, 89, 53, 33, 4, 1, 221, 89, 53, 33, 6, 1, 245, 177, 2, - 217, 81, 33, 4, 1, 245, 177, 2, 217, 81, 33, 6, 1, 243, 77, 2, 215, 133, - 33, 4, 1, 243, 77, 2, 215, 133, 33, 6, 1, 243, 77, 2, 91, 33, 4, 1, 243, - 77, 2, 91, 33, 6, 1, 243, 77, 2, 231, 107, 102, 33, 4, 1, 243, 77, 2, - 231, 107, 102, 33, 6, 1, 212, 68, 2, 248, 111, 33, 4, 1, 212, 68, 2, 248, - 111, 33, 6, 1, 212, 88, 2, 248, 111, 33, 4, 1, 212, 88, 2, 248, 111, 33, - 6, 1, 235, 131, 2, 248, 111, 33, 4, 1, 235, 131, 2, 248, 111, 33, 6, 1, - 235, 131, 2, 66, 91, 33, 4, 1, 235, 131, 2, 66, 91, 33, 6, 1, 235, 131, - 2, 91, 33, 4, 1, 235, 131, 2, 91, 33, 6, 1, 252, 170, 183, 33, 4, 1, 252, - 170, 183, 33, 6, 1, 245, 230, 2, 248, 111, 33, 4, 1, 245, 230, 2, 248, - 111, 33, 6, 26, 245, 230, 243, 76, 33, 4, 26, 245, 230, 243, 76, 33, 6, - 1, 226, 133, 2, 231, 107, 102, 33, 4, 1, 226, 133, 2, 231, 107, 102, 33, - 6, 1, 255, 52, 162, 33, 4, 1, 255, 52, 162, 33, 6, 1, 245, 167, 2, 248, - 111, 33, 4, 1, 245, 167, 2, 248, 111, 33, 6, 1, 217, 243, 2, 248, 111, - 33, 4, 1, 217, 243, 2, 248, 111, 33, 6, 1, 219, 75, 72, 33, 4, 1, 219, - 75, 72, 33, 6, 1, 219, 75, 103, 2, 91, 33, 4, 1, 219, 75, 103, 2, 91, 33, - 6, 1, 242, 151, 2, 248, 111, 33, 4, 1, 242, 151, 2, 248, 111, 33, 6, 26, - 217, 243, 216, 149, 33, 4, 26, 217, 243, 216, 149, 33, 6, 1, 250, 191, 2, - 248, 111, 33, 4, 1, 250, 191, 2, 248, 111, 33, 6, 1, 250, 191, 2, 66, 91, - 33, 4, 1, 250, 191, 2, 66, 91, 33, 6, 1, 220, 234, 33, 4, 1, 220, 234, - 33, 6, 1, 255, 52, 250, 190, 33, 4, 1, 255, 52, 250, 190, 33, 6, 1, 255, - 52, 250, 191, 2, 248, 111, 33, 4, 1, 255, 52, 250, 191, 2, 248, 111, 33, - 1, 226, 222, 33, 6, 1, 212, 68, 2, 251, 199, 33, 4, 1, 212, 68, 2, 251, - 199, 33, 6, 1, 235, 131, 2, 102, 33, 4, 1, 235, 131, 2, 102, 33, 6, 1, - 245, 253, 2, 218, 40, 33, 4, 1, 245, 253, 2, 218, 40, 33, 6, 1, 245, 230, - 2, 102, 33, 4, 1, 245, 230, 2, 102, 33, 6, 1, 245, 230, 2, 218, 40, 33, - 4, 1, 245, 230, 2, 218, 40, 33, 6, 1, 234, 245, 250, 190, 33, 4, 1, 234, - 245, 250, 190, 33, 6, 1, 245, 239, 2, 218, 40, 33, 4, 1, 245, 239, 2, - 218, 40, 33, 4, 1, 226, 222, 33, 6, 1, 111, 2, 251, 199, 33, 4, 1, 111, - 2, 251, 199, 33, 6, 1, 111, 2, 248, 74, 33, 4, 1, 111, 2, 248, 74, 33, 6, - 26, 111, 236, 172, 33, 4, 26, 111, 236, 172, 33, 6, 1, 236, 173, 2, 251, - 199, 33, 4, 1, 236, 173, 2, 251, 199, 33, 6, 1, 222, 136, 33, 4, 1, 222, - 136, 33, 6, 1, 222, 137, 2, 248, 74, 33, 4, 1, 222, 137, 2, 248, 74, 33, - 6, 1, 212, 68, 2, 248, 74, 33, 4, 1, 212, 68, 2, 248, 74, 33, 6, 1, 212, - 88, 2, 248, 74, 33, 4, 1, 212, 88, 2, 248, 74, 33, 6, 1, 255, 52, 246, - 112, 33, 4, 1, 255, 52, 246, 112, 33, 6, 1, 241, 7, 2, 232, 110, 33, 4, - 1, 241, 7, 2, 232, 110, 33, 6, 1, 241, 7, 2, 248, 74, 33, 4, 1, 241, 7, - 2, 248, 74, 33, 6, 1, 141, 2, 248, 74, 33, 4, 1, 141, 2, 248, 74, 33, 6, - 1, 252, 180, 78, 33, 4, 1, 252, 180, 78, 33, 6, 1, 252, 180, 141, 2, 248, - 74, 33, 4, 1, 252, 180, 141, 2, 248, 74, 33, 6, 1, 154, 2, 248, 74, 33, - 4, 1, 154, 2, 248, 74, 33, 6, 1, 103, 2, 232, 110, 33, 4, 1, 103, 2, 232, - 110, 33, 6, 1, 103, 2, 248, 74, 33, 4, 1, 103, 2, 248, 74, 33, 6, 1, 103, - 2, 52, 138, 33, 4, 1, 103, 2, 52, 138, 33, 6, 1, 250, 191, 2, 248, 74, - 33, 4, 1, 250, 191, 2, 248, 74, 33, 6, 1, 243, 77, 2, 248, 111, 33, 4, 1, - 243, 77, 2, 248, 111, 33, 6, 1, 213, 20, 2, 248, 74, 33, 4, 1, 213, 20, - 2, 248, 74, 33, 6, 1, 243, 77, 2, 219, 59, 22, 102, 33, 4, 1, 243, 77, 2, - 219, 59, 22, 102, 33, 6, 1, 242, 151, 2, 102, 33, 4, 1, 242, 151, 2, 102, - 33, 6, 1, 242, 151, 2, 91, 33, 4, 1, 242, 151, 2, 91, 33, 6, 1, 234, 134, - 248, 162, 33, 4, 1, 234, 134, 248, 162, 33, 6, 1, 234, 134, 247, 235, 33, - 4, 1, 234, 134, 247, 235, 33, 6, 1, 234, 134, 212, 20, 33, 4, 1, 234, - 134, 212, 20, 33, 6, 1, 234, 134, 246, 106, 33, 4, 1, 234, 134, 246, 106, - 33, 6, 1, 234, 134, 233, 57, 33, 4, 1, 234, 134, 233, 57, 33, 6, 1, 234, - 134, 229, 73, 33, 4, 1, 234, 134, 229, 73, 33, 6, 1, 234, 134, 220, 56, - 33, 4, 1, 234, 134, 220, 56, 33, 6, 1, 234, 134, 217, 27, 33, 4, 1, 234, - 134, 217, 27, 33, 6, 1, 223, 236, 212, 87, 33, 4, 1, 223, 236, 212, 87, - 33, 6, 1, 245, 253, 2, 102, 33, 4, 1, 245, 253, 2, 102, 33, 6, 1, 233, - 123, 33, 4, 1, 233, 123, 33, 6, 1, 223, 226, 33, 4, 1, 223, 226, 33, 6, - 1, 213, 83, 33, 4, 1, 213, 83, 33, 6, 1, 225, 11, 33, 4, 1, 225, 11, 33, - 6, 1, 214, 9, 33, 4, 1, 214, 9, 33, 6, 1, 254, 202, 183, 33, 4, 1, 254, - 202, 183, 33, 6, 1, 245, 253, 2, 231, 107, 102, 33, 4, 1, 245, 253, 2, - 231, 107, 102, 33, 6, 1, 245, 230, 2, 231, 107, 102, 33, 4, 1, 245, 230, - 2, 231, 107, 102, 33, 6, 1, 226, 133, 2, 248, 111, 33, 4, 1, 226, 133, 2, - 248, 111, 33, 6, 1, 220, 235, 2, 248, 111, 33, 4, 1, 220, 235, 2, 248, - 111, 146, 6, 1, 253, 207, 146, 6, 1, 252, 86, 146, 6, 1, 243, 43, 146, 6, - 1, 249, 30, 146, 6, 1, 246, 34, 146, 6, 1, 212, 109, 146, 6, 1, 246, 19, - 146, 6, 1, 245, 151, 146, 6, 1, 109, 146, 6, 1, 212, 67, 146, 6, 1, 236, - 85, 146, 6, 1, 233, 60, 146, 6, 1, 213, 151, 146, 6, 1, 251, 88, 146, 6, - 1, 235, 27, 146, 6, 1, 241, 173, 146, 6, 1, 236, 0, 146, 6, 1, 243, 86, - 146, 6, 1, 250, 185, 146, 6, 1, 231, 192, 146, 6, 1, 213, 0, 146, 6, 1, - 228, 193, 146, 6, 1, 221, 47, 146, 6, 1, 214, 123, 146, 6, 1, 250, 215, - 146, 6, 1, 226, 116, 146, 6, 1, 235, 227, 146, 6, 1, 208, 146, 6, 1, 222, - 103, 146, 6, 1, 214, 161, 146, 6, 1, 217, 29, 146, 6, 1, 224, 23, 146, 6, - 1, 250, 42, 146, 6, 1, 212, 241, 146, 6, 1, 225, 214, 146, 6, 1, 235, 38, - 146, 6, 1, 227, 125, 146, 6, 1, 244, 231, 146, 59, 1, 43, 157, 223, 164, - 146, 254, 97, 146, 245, 233, 79, 146, 245, 119, 79, 146, 250, 23, 146, - 224, 193, 79, 146, 255, 53, 79, 146, 4, 1, 253, 207, 146, 4, 1, 252, 86, - 146, 4, 1, 243, 43, 146, 4, 1, 249, 30, 146, 4, 1, 246, 34, 146, 4, 1, - 212, 109, 146, 4, 1, 246, 19, 146, 4, 1, 245, 151, 146, 4, 1, 109, 146, - 4, 1, 212, 67, 146, 4, 1, 236, 85, 146, 4, 1, 233, 60, 146, 4, 1, 213, - 151, 146, 4, 1, 251, 88, 146, 4, 1, 235, 27, 146, 4, 1, 241, 173, 146, 4, - 1, 236, 0, 146, 4, 1, 243, 86, 146, 4, 1, 250, 185, 146, 4, 1, 231, 192, - 146, 4, 1, 213, 0, 146, 4, 1, 228, 193, 146, 4, 1, 221, 47, 146, 4, 1, - 214, 123, 146, 4, 1, 250, 215, 146, 4, 1, 226, 116, 146, 4, 1, 235, 227, - 146, 4, 1, 208, 146, 4, 1, 222, 103, 146, 4, 1, 214, 161, 146, 4, 1, 217, - 29, 146, 4, 1, 224, 23, 146, 4, 1, 250, 42, 146, 4, 1, 212, 241, 146, 4, - 1, 225, 214, 146, 4, 1, 235, 38, 146, 4, 1, 227, 125, 146, 4, 1, 244, - 231, 146, 4, 26, 246, 35, 212, 241, 146, 244, 64, 219, 83, 146, 241, 21, - 94, 255, 47, 245, 144, 94, 255, 47, 222, 104, 94, 255, 47, 221, 33, 94, - 255, 47, 212, 97, 224, 250, 94, 255, 47, 212, 97, 243, 220, 94, 255, 47, - 217, 42, 94, 255, 47, 223, 234, 94, 255, 47, 212, 96, 94, 255, 47, 226, - 155, 94, 255, 47, 213, 12, 94, 255, 47, 217, 180, 94, 255, 47, 243, 137, - 94, 255, 47, 243, 138, 230, 209, 94, 255, 47, 243, 135, 94, 255, 47, 224, - 251, 226, 181, 94, 255, 47, 217, 219, 243, 152, 94, 255, 47, 226, 136, - 94, 255, 47, 253, 243, 242, 143, 94, 255, 47, 230, 219, 94, 255, 47, 232, - 86, 94, 255, 47, 231, 183, 94, 255, 47, 231, 184, 235, 39, 94, 255, 47, - 248, 230, 94, 255, 47, 225, 6, 94, 255, 47, 217, 219, 224, 246, 94, 255, - 47, 213, 22, 252, 87, 212, 222, 94, 255, 47, 227, 110, 94, 255, 47, 236, - 131, 94, 255, 47, 248, 142, 94, 255, 47, 212, 26, 94, 156, 232, 21, 250, - 95, 94, 225, 181, 220, 237, 94, 225, 181, 242, 97, 222, 104, 94, 225, - 181, 242, 97, 226, 149, 94, 225, 181, 242, 97, 224, 255, 94, 225, 181, - 242, 7, 94, 225, 181, 216, 147, 94, 225, 181, 222, 104, 94, 225, 181, - 226, 149, 94, 225, 181, 224, 255, 94, 225, 181, 241, 166, 94, 225, 181, - 241, 167, 242, 99, 31, 214, 241, 94, 225, 181, 224, 197, 94, 225, 181, - 249, 17, 171, 232, 49, 94, 225, 181, 231, 175, 94, 225, 63, 232, 46, 94, - 225, 181, 224, 94, 94, 225, 63, 226, 157, 94, 225, 181, 220, 222, 247, - 195, 94, 225, 181, 220, 104, 247, 195, 94, 225, 63, 220, 0, 226, 151, 94, - 156, 215, 137, 247, 195, 94, 156, 232, 237, 247, 195, 94, 225, 63, 228, - 94, 242, 142, 94, 225, 181, 225, 0, 224, 250, 94, 1, 254, 205, 94, 1, - 252, 75, 94, 1, 243, 41, 94, 1, 249, 0, 94, 1, 242, 85, 94, 1, 214, 241, - 94, 1, 212, 90, 94, 1, 242, 45, 94, 1, 217, 196, 94, 1, 212, 225, 94, 1, - 41, 235, 112, 94, 1, 235, 112, 94, 1, 233, 216, 94, 1, 41, 231, 199, 94, - 1, 231, 199, 94, 1, 41, 228, 93, 94, 1, 228, 93, 94, 1, 222, 188, 94, 1, - 253, 205, 94, 1, 41, 226, 132, 94, 1, 226, 132, 94, 1, 41, 216, 150, 94, - 1, 216, 150, 94, 1, 224, 219, 94, 1, 223, 253, 94, 1, 220, 221, 94, 1, - 218, 2, 94, 26, 212, 254, 52, 214, 241, 94, 26, 212, 254, 214, 242, 212, - 225, 94, 26, 212, 254, 52, 212, 225, 94, 225, 63, 243, 137, 94, 225, 63, - 243, 135, 12, 51, 53, 12, 5, 222, 182, 12, 244, 119, 232, 32, 12, 5, 222, - 217, 254, 78, 249, 173, 223, 129, 254, 78, 244, 94, 223, 129, 12, 224, - 61, 254, 78, 226, 94, 231, 76, 53, 254, 78, 226, 94, 217, 214, 217, 114, - 53, 254, 254, 53, 12, 250, 23, 12, 248, 217, 221, 80, 12, 225, 183, 214, - 223, 53, 12, 5, 231, 57, 12, 5, 222, 198, 254, 207, 214, 32, 12, 5, 254, - 207, 254, 8, 12, 5, 224, 93, 254, 206, 12, 5, 224, 100, 254, 188, 254, - 141, 12, 5, 218, 33, 12, 4, 127, 218, 43, 12, 4, 127, 26, 108, 2, 233, - 225, 2, 213, 35, 12, 4, 127, 212, 101, 12, 4, 244, 254, 12, 4, 248, 251, - 12, 4, 235, 67, 12, 221, 93, 12, 216, 182, 62, 225, 63, 79, 12, 224, 193, - 79, 12, 1, 235, 71, 213, 35, 12, 1, 242, 122, 12, 1, 108, 2, 232, 106, - 50, 12, 1, 108, 2, 194, 50, 12, 1, 214, 18, 2, 194, 50, 12, 1, 108, 2, - 194, 55, 12, 1, 76, 2, 194, 50, 12, 1, 254, 205, 12, 1, 252, 100, 12, 1, - 217, 229, 232, 42, 12, 1, 217, 228, 12, 1, 217, 158, 12, 1, 235, 239, 12, - 1, 242, 139, 12, 1, 234, 247, 12, 1, 249, 6, 12, 1, 217, 168, 12, 1, 224, - 23, 12, 1, 212, 101, 12, 1, 222, 108, 12, 1, 221, 4, 12, 1, 222, 220, 12, - 1, 249, 25, 12, 1, 218, 43, 12, 1, 212, 104, 12, 1, 254, 231, 12, 1, 243, - 84, 12, 1, 235, 37, 2, 119, 181, 50, 12, 1, 235, 37, 2, 137, 181, 55, 12, - 1, 245, 1, 76, 2, 236, 52, 211, 211, 12, 1, 245, 1, 76, 2, 119, 181, 50, - 12, 1, 245, 1, 76, 2, 137, 181, 50, 12, 218, 7, 12, 1, 244, 231, 12, 1, - 225, 4, 12, 1, 235, 112, 12, 1, 233, 224, 12, 1, 231, 213, 12, 1, 228, - 216, 12, 1, 242, 65, 12, 1, 214, 17, 12, 1, 108, 232, 70, 12, 1, 213, 35, - 12, 244, 252, 12, 248, 249, 12, 235, 65, 12, 244, 254, 12, 248, 251, 12, - 235, 67, 12, 221, 38, 12, 219, 4, 12, 232, 104, 50, 12, 194, 50, 12, 194, - 55, 12, 219, 24, 254, 205, 12, 236, 52, 248, 251, 12, 156, 228, 217, 243, - 58, 12, 211, 250, 12, 30, 5, 4, 215, 86, 50, 12, 30, 5, 236, 52, 4, 215, - 86, 50, 12, 30, 5, 62, 55, 12, 223, 236, 248, 251, 12, 244, 255, 2, 119, - 247, 193, 12, 214, 19, 194, 55, 254, 78, 21, 212, 79, 254, 78, 21, 118, - 254, 78, 21, 112, 254, 78, 21, 170, 254, 78, 21, 167, 254, 78, 21, 185, - 254, 78, 21, 192, 254, 78, 21, 200, 254, 78, 21, 198, 254, 78, 21, 203, - 12, 226, 93, 53, 12, 248, 155, 221, 80, 12, 217, 112, 221, 80, 12, 244, - 170, 225, 179, 219, 109, 12, 1, 247, 194, 252, 100, 12, 1, 247, 194, 225, - 4, 12, 1, 218, 237, 254, 205, 12, 1, 108, 214, 33, 12, 1, 108, 2, 214, - 19, 194, 50, 12, 1, 108, 2, 214, 19, 194, 55, 12, 1, 127, 242, 122, 12, - 1, 127, 194, 254, 205, 12, 1, 127, 194, 214, 17, 12, 1, 103, 2, 194, 50, - 12, 1, 127, 194, 213, 35, 12, 1, 216, 120, 12, 1, 216, 118, 12, 1, 252, - 110, 12, 1, 217, 229, 2, 223, 164, 12, 1, 217, 229, 2, 137, 181, 74, 246, - 178, 12, 1, 226, 116, 12, 1, 217, 226, 12, 1, 252, 98, 12, 1, 123, 2, - 194, 50, 12, 1, 123, 2, 119, 181, 66, 50, 12, 1, 228, 53, 12, 1, 246, - 119, 12, 1, 123, 2, 137, 181, 50, 12, 1, 217, 246, 12, 1, 217, 244, 12, - 1, 248, 202, 12, 1, 249, 7, 2, 223, 164, 12, 1, 249, 7, 2, 62, 55, 12, 1, - 249, 7, 2, 62, 252, 90, 22, 4, 218, 43, 12, 1, 249, 12, 12, 1, 248, 204, - 12, 1, 246, 146, 12, 1, 249, 7, 2, 137, 181, 74, 246, 178, 12, 1, 249, 7, - 2, 244, 101, 181, 50, 12, 1, 223, 107, 12, 1, 224, 24, 2, 4, 211, 211, - 12, 1, 224, 24, 2, 223, 164, 12, 1, 224, 24, 2, 62, 55, 12, 1, 224, 24, - 2, 4, 215, 86, 55, 12, 1, 224, 24, 2, 62, 252, 90, 22, 62, 50, 12, 1, - 224, 24, 2, 119, 181, 50, 12, 1, 235, 236, 12, 1, 224, 24, 2, 244, 101, - 181, 50, 12, 1, 222, 109, 2, 62, 252, 90, 22, 62, 50, 12, 1, 222, 109, 2, - 137, 181, 55, 12, 1, 222, 109, 2, 137, 181, 252, 90, 22, 137, 181, 50, - 12, 1, 222, 221, 2, 119, 181, 55, 12, 1, 222, 221, 2, 137, 181, 50, 12, - 1, 218, 44, 2, 137, 181, 50, 12, 1, 254, 232, 2, 137, 181, 50, 12, 1, - 247, 194, 244, 231, 12, 1, 244, 232, 2, 62, 230, 249, 55, 12, 1, 244, - 232, 2, 62, 55, 12, 1, 214, 230, 12, 1, 244, 232, 2, 137, 181, 55, 12, 1, - 226, 114, 12, 1, 225, 5, 2, 62, 50, 12, 1, 225, 5, 2, 137, 181, 50, 12, - 1, 235, 36, 12, 1, 218, 209, 235, 112, 12, 1, 235, 113, 2, 223, 164, 12, - 1, 235, 113, 2, 62, 50, 12, 1, 229, 228, 12, 1, 235, 113, 2, 137, 181, - 55, 12, 1, 243, 217, 12, 1, 243, 218, 2, 223, 164, 12, 1, 229, 153, 12, - 1, 243, 218, 2, 119, 181, 55, 12, 1, 242, 203, 12, 1, 243, 218, 2, 137, - 181, 50, 12, 1, 233, 225, 2, 4, 211, 211, 12, 1, 233, 225, 2, 62, 50, 12, - 1, 233, 225, 2, 137, 181, 50, 12, 1, 233, 225, 2, 137, 181, 55, 12, 1, - 228, 217, 2, 62, 55, 12, 1, 228, 217, 243, 58, 12, 1, 223, 149, 12, 1, - 228, 217, 2, 223, 164, 12, 1, 228, 217, 2, 137, 181, 50, 12, 1, 242, 66, - 247, 216, 12, 1, 217, 247, 2, 62, 50, 12, 1, 242, 66, 2, 76, 50, 12, 1, - 242, 66, 243, 11, 12, 1, 242, 66, 243, 12, 2, 194, 50, 12, 1, 217, 229, - 232, 43, 243, 11, 12, 1, 214, 18, 2, 223, 164, 12, 1, 234, 193, 227, 136, - 12, 1, 227, 136, 12, 1, 72, 12, 1, 212, 204, 12, 1, 234, 193, 212, 204, - 12, 1, 214, 18, 2, 119, 181, 50, 12, 1, 214, 237, 12, 1, 245, 1, 213, 35, - 12, 1, 76, 2, 218, 40, 12, 1, 76, 2, 4, 211, 211, 12, 1, 214, 18, 2, 62, - 50, 12, 1, 77, 12, 1, 76, 2, 137, 181, 55, 12, 1, 76, 252, 178, 12, 1, - 76, 252, 179, 2, 194, 50, 12, 244, 64, 219, 83, 12, 1, 255, 20, 12, 4, - 127, 26, 222, 221, 2, 233, 225, 2, 108, 232, 70, 12, 4, 127, 26, 225, 5, - 2, 233, 225, 2, 108, 232, 70, 12, 4, 127, 64, 73, 17, 12, 4, 127, 233, - 225, 254, 205, 12, 4, 127, 235, 239, 12, 4, 127, 137, 247, 193, 12, 4, - 127, 222, 108, 12, 245, 222, 68, 253, 209, 12, 219, 105, 68, 223, 75, - 245, 253, 242, 4, 12, 4, 127, 223, 119, 212, 79, 12, 4, 127, 215, 136, - 224, 42, 212, 79, 12, 4, 127, 247, 194, 242, 83, 68, 234, 247, 12, 4, - 127, 64, 49, 17, 12, 4, 117, 222, 108, 12, 4, 127, 232, 105, 12, 4, 214, - 17, 12, 4, 213, 35, 12, 4, 127, 213, 35, 12, 4, 127, 228, 216, 12, 225, - 209, 68, 222, 208, 12, 245, 231, 250, 232, 117, 219, 83, 12, 245, 231, - 250, 232, 127, 219, 83, 12, 223, 119, 127, 219, 84, 2, 244, 193, 250, - 231, 12, 4, 117, 231, 213, 12, 1, 249, 7, 2, 236, 52, 211, 211, 12, 1, - 224, 24, 2, 236, 52, 211, 211, 245, 111, 254, 78, 21, 212, 79, 245, 111, - 254, 78, 21, 118, 245, 111, 254, 78, 21, 112, 245, 111, 254, 78, 21, 170, - 245, 111, 254, 78, 21, 167, 245, 111, 254, 78, 21, 185, 245, 111, 254, - 78, 21, 192, 245, 111, 254, 78, 21, 200, 245, 111, 254, 78, 21, 198, 245, - 111, 254, 78, 21, 203, 12, 1, 221, 5, 2, 62, 55, 12, 1, 249, 26, 2, 62, - 55, 12, 1, 243, 85, 2, 62, 55, 12, 5, 220, 103, 254, 162, 12, 5, 220, - 103, 225, 151, 231, 192, 12, 1, 242, 66, 2, 236, 52, 211, 211, 180, 245, - 222, 68, 226, 179, 180, 218, 233, 244, 64, 219, 83, 180, 219, 26, 244, - 64, 219, 83, 180, 218, 233, 250, 30, 180, 219, 26, 250, 30, 180, 201, - 250, 30, 180, 250, 31, 220, 53, 233, 168, 180, 250, 31, 220, 53, 223, - 182, 180, 218, 233, 250, 31, 220, 53, 233, 168, 180, 219, 26, 250, 31, - 220, 53, 223, 182, 180, 249, 242, 180, 242, 104, 227, 151, 180, 242, 104, - 231, 173, 180, 242, 104, 254, 5, 180, 255, 53, 79, 180, 1, 254, 209, 180, - 1, 218, 237, 254, 209, 180, 1, 252, 72, 180, 1, 243, 209, 180, 1, 243, - 210, 243, 187, 180, 1, 249, 3, 180, 1, 247, 194, 249, 4, 223, 160, 180, - 1, 242, 85, 180, 1, 214, 17, 180, 1, 212, 101, 180, 1, 242, 43, 180, 1, - 217, 192, 180, 1, 217, 193, 243, 187, 180, 1, 212, 191, 180, 1, 212, 192, - 242, 85, 180, 1, 235, 87, 180, 1, 233, 223, 180, 1, 231, 73, 180, 1, 228, - 93, 180, 1, 221, 86, 180, 1, 41, 221, 86, 180, 1, 77, 180, 1, 226, 132, - 180, 1, 223, 236, 226, 132, 180, 1, 222, 218, 180, 1, 224, 254, 180, 1, - 223, 160, 180, 1, 220, 221, 180, 1, 218, 0, 180, 1, 226, 81, 252, 60, - 180, 1, 226, 81, 243, 82, 180, 1, 226, 81, 248, 93, 180, 225, 72, 50, - 180, 225, 72, 55, 180, 225, 72, 246, 192, 180, 212, 10, 50, 180, 212, 10, - 55, 180, 212, 10, 246, 192, 180, 224, 58, 50, 180, 224, 58, 55, 180, 246, - 193, 212, 17, 241, 149, 180, 246, 193, 212, 17, 254, 142, 180, 242, 88, - 50, 180, 242, 88, 55, 180, 242, 87, 246, 192, 180, 245, 164, 50, 180, - 245, 164, 55, 180, 223, 44, 180, 244, 225, 247, 195, 180, 224, 172, 180, - 223, 71, 180, 119, 66, 181, 50, 180, 119, 66, 181, 55, 180, 137, 181, 50, - 180, 137, 181, 55, 180, 227, 149, 233, 84, 50, 180, 227, 149, 233, 84, - 55, 180, 230, 196, 180, 252, 177, 180, 1, 219, 252, 212, 73, 180, 1, 219, - 252, 234, 240, 180, 1, 219, 252, 244, 243, 12, 1, 252, 101, 2, 137, 181, - 241, 99, 55, 12, 1, 252, 101, 2, 62, 252, 90, 22, 137, 181, 50, 12, 1, - 252, 101, 2, 137, 181, 225, 177, 215, 130, 55, 12, 1, 252, 101, 2, 137, - 181, 225, 177, 215, 130, 252, 90, 22, 119, 181, 50, 12, 1, 252, 101, 2, - 119, 181, 252, 90, 22, 62, 50, 12, 1, 252, 101, 2, 236, 52, 4, 215, 86, - 55, 12, 1, 252, 101, 2, 4, 211, 211, 12, 1, 123, 2, 119, 181, 50, 12, 1, - 123, 2, 137, 181, 225, 177, 215, 130, 55, 12, 1, 249, 7, 2, 119, 181, - 214, 171, 252, 90, 22, 4, 218, 43, 12, 1, 249, 7, 2, 236, 52, 4, 215, 86, - 55, 12, 1, 224, 24, 2, 91, 12, 1, 222, 109, 2, 244, 101, 181, 50, 12, 1, - 254, 232, 2, 119, 181, 50, 12, 1, 254, 232, 2, 137, 181, 225, 177, 246, - 179, 50, 12, 1, 254, 232, 2, 119, 181, 214, 171, 50, 12, 1, 244, 232, 2, - 119, 181, 55, 12, 1, 244, 232, 2, 137, 181, 225, 177, 215, 130, 55, 12, - 1, 235, 37, 2, 62, 50, 12, 1, 235, 37, 2, 137, 181, 50, 12, 1, 235, 37, - 2, 137, 181, 225, 177, 215, 130, 55, 12, 1, 64, 2, 62, 50, 12, 1, 64, 2, - 62, 55, 12, 1, 228, 217, 2, 119, 181, 55, 12, 1, 228, 217, 2, 4, 218, 43, - 12, 1, 228, 217, 2, 4, 211, 211, 12, 1, 233, 225, 2, 134, 12, 1, 224, 24, - 2, 119, 181, 214, 171, 50, 12, 1, 224, 24, 2, 194, 50, 12, 1, 222, 109, - 2, 119, 181, 214, 171, 50, 12, 1, 123, 2, 4, 12, 1, 218, 44, 55, 12, 1, - 123, 2, 4, 12, 1, 218, 44, 22, 119, 247, 193, 12, 1, 222, 109, 2, 4, 12, - 1, 218, 44, 22, 119, 247, 193, 12, 1, 224, 24, 2, 4, 12, 1, 218, 44, 22, - 119, 247, 193, 12, 1, 123, 2, 4, 12, 1, 218, 44, 50, 12, 1, 108, 2, 245, - 111, 254, 78, 21, 119, 50, 12, 1, 108, 2, 245, 111, 254, 78, 21, 137, 50, - 12, 1, 245, 1, 76, 2, 245, 111, 254, 78, 21, 119, 50, 12, 1, 245, 1, 76, - 2, 245, 111, 254, 78, 21, 137, 50, 12, 1, 245, 1, 76, 2, 245, 111, 254, - 78, 21, 244, 101, 55, 12, 1, 214, 18, 2, 245, 111, 254, 78, 21, 119, 50, - 12, 1, 214, 18, 2, 245, 111, 254, 78, 21, 137, 50, 12, 1, 76, 252, 179, - 2, 245, 111, 254, 78, 21, 119, 50, 12, 1, 76, 252, 179, 2, 245, 111, 254, - 78, 21, 137, 50, 12, 1, 123, 2, 245, 111, 254, 78, 21, 244, 101, 55, 12, - 1, 222, 109, 2, 245, 111, 254, 78, 21, 244, 101, 50, 12, 1, 222, 109, 2, - 236, 52, 211, 211, 12, 1, 235, 113, 2, 119, 181, 50, 217, 171, 1, 242, - 148, 217, 171, 1, 221, 13, 217, 171, 1, 228, 215, 217, 171, 1, 224, 109, - 217, 171, 1, 252, 233, 217, 171, 1, 233, 120, 217, 171, 1, 235, 126, 217, - 171, 1, 254, 195, 217, 171, 1, 215, 6, 217, 171, 1, 231, 212, 217, 171, - 1, 245, 27, 217, 171, 1, 248, 96, 217, 171, 1, 217, 173, 217, 171, 1, - 233, 251, 217, 171, 1, 243, 226, 217, 171, 1, 243, 17, 217, 171, 1, 222, - 107, 217, 171, 1, 248, 215, 217, 171, 1, 212, 93, 217, 171, 1, 218, 1, - 217, 171, 1, 213, 94, 217, 171, 1, 226, 143, 217, 171, 1, 235, 244, 217, - 171, 1, 250, 193, 217, 171, 1, 216, 127, 217, 171, 1, 242, 36, 217, 171, - 1, 234, 249, 217, 171, 1, 217, 172, 217, 171, 1, 212, 108, 217, 171, 1, - 221, 3, 217, 171, 1, 222, 224, 217, 171, 1, 249, 28, 217, 171, 1, 109, - 217, 171, 1, 212, 16, 217, 171, 1, 254, 228, 217, 171, 1, 243, 83, 217, - 171, 1, 225, 8, 217, 171, 1, 214, 50, 217, 171, 255, 54, 217, 171, 255, - 69, 217, 171, 240, 224, 217, 171, 246, 29, 217, 171, 215, 197, 217, 171, - 227, 85, 217, 171, 246, 37, 217, 171, 245, 105, 217, 171, 227, 148, 217, - 171, 227, 156, 217, 171, 219, 4, 217, 171, 1, 230, 112, 229, 32, 21, 212, - 79, 229, 32, 21, 118, 229, 32, 21, 112, 229, 32, 21, 170, 229, 32, 21, - 167, 229, 32, 21, 185, 229, 32, 21, 192, 229, 32, 21, 200, 229, 32, 21, - 198, 229, 32, 21, 203, 229, 32, 1, 63, 229, 32, 1, 246, 30, 229, 32, 1, - 75, 229, 32, 1, 77, 229, 32, 1, 72, 229, 32, 1, 227, 86, 229, 32, 1, 78, - 229, 32, 1, 249, 18, 229, 32, 1, 206, 229, 32, 1, 252, 234, 229, 32, 1, - 195, 229, 32, 1, 218, 66, 229, 32, 1, 236, 0, 229, 32, 1, 250, 215, 229, - 32, 1, 249, 30, 229, 32, 1, 208, 229, 32, 1, 223, 115, 229, 32, 1, 222, - 227, 229, 32, 1, 243, 175, 229, 32, 1, 245, 29, 229, 32, 1, 183, 229, 32, - 1, 233, 255, 229, 32, 1, 230, 115, 213, 213, 229, 32, 1, 191, 229, 32, 1, - 228, 64, 229, 32, 1, 207, 229, 32, 1, 162, 229, 32, 1, 214, 52, 229, 32, - 1, 189, 229, 32, 1, 228, 65, 213, 213, 229, 32, 1, 235, 178, 236, 0, 229, - 32, 1, 235, 178, 250, 215, 229, 32, 1, 235, 178, 208, 229, 32, 38, 220, - 196, 127, 216, 254, 229, 32, 38, 220, 196, 117, 216, 254, 229, 32, 38, - 220, 196, 223, 159, 216, 254, 229, 32, 38, 187, 248, 110, 216, 254, 229, - 32, 38, 187, 127, 216, 254, 229, 32, 38, 187, 117, 216, 254, 229, 32, 38, - 187, 223, 159, 216, 254, 229, 32, 38, 230, 81, 79, 229, 32, 38, 52, 62, - 50, 229, 32, 127, 161, 254, 97, 229, 32, 117, 161, 254, 97, 229, 32, 16, - 227, 87, 248, 122, 229, 32, 16, 243, 174, 229, 32, 250, 23, 229, 32, 245, - 119, 79, 229, 32, 233, 230, 222, 191, 1, 254, 211, 222, 191, 1, 252, 20, - 222, 191, 1, 243, 208, 222, 191, 1, 249, 5, 222, 191, 1, 236, 11, 222, - 191, 1, 252, 233, 222, 191, 1, 212, 82, 222, 191, 1, 236, 19, 222, 191, - 1, 217, 34, 222, 191, 1, 212, 174, 222, 191, 1, 235, 127, 222, 191, 1, - 233, 248, 222, 191, 1, 231, 73, 222, 191, 1, 228, 93, 222, 191, 1, 220, - 101, 222, 191, 1, 236, 112, 222, 191, 1, 244, 210, 222, 191, 1, 216, 152, - 222, 191, 1, 224, 190, 222, 191, 1, 223, 160, 222, 191, 1, 221, 30, 222, - 191, 1, 218, 62, 222, 191, 156, 236, 112, 222, 191, 156, 236, 111, 222, - 191, 156, 227, 144, 222, 191, 156, 249, 16, 222, 191, 59, 1, 245, 189, - 212, 174, 222, 191, 156, 245, 189, 212, 174, 222, 191, 30, 5, 187, 77, - 222, 191, 30, 5, 77, 222, 191, 30, 5, 227, 24, 255, 104, 222, 191, 30, 5, - 187, 255, 104, 222, 191, 30, 5, 255, 104, 222, 191, 30, 5, 227, 24, 63, - 222, 191, 30, 5, 187, 63, 222, 191, 30, 5, 63, 222, 191, 59, 1, 220, 196, - 63, 222, 191, 30, 5, 220, 196, 63, 222, 191, 30, 5, 187, 72, 222, 191, - 30, 5, 72, 222, 191, 59, 1, 75, 222, 191, 30, 5, 187, 75, 222, 191, 30, - 5, 75, 222, 191, 30, 5, 78, 222, 191, 30, 5, 219, 4, 222, 191, 156, 229, - 241, 222, 191, 225, 63, 229, 241, 222, 191, 225, 63, 254, 251, 222, 191, - 225, 63, 254, 150, 222, 191, 225, 63, 252, 160, 222, 191, 225, 63, 253, - 244, 222, 191, 225, 63, 220, 209, 222, 191, 255, 53, 79, 222, 191, 225, - 63, 231, 202, 224, 225, 222, 191, 225, 63, 212, 24, 222, 191, 225, 63, - 224, 225, 222, 191, 225, 63, 212, 107, 222, 191, 225, 63, 216, 62, 222, - 191, 225, 63, 254, 51, 222, 191, 225, 63, 220, 0, 232, 23, 222, 191, 225, - 63, 254, 138, 232, 60, 1, 242, 127, 232, 60, 1, 255, 57, 232, 60, 1, 254, - 249, 232, 60, 1, 255, 32, 232, 60, 1, 254, 242, 232, 60, 1, 215, 104, - 232, 60, 1, 253, 203, 232, 60, 1, 236, 19, 232, 60, 1, 253, 241, 232, 60, - 1, 254, 216, 232, 60, 1, 254, 221, 232, 60, 1, 254, 213, 232, 60, 1, 254, - 172, 232, 60, 1, 254, 159, 232, 60, 1, 254, 23, 232, 60, 1, 236, 112, - 232, 60, 1, 254, 110, 232, 60, 1, 253, 251, 232, 60, 1, 254, 86, 232, 60, - 1, 254, 82, 232, 60, 1, 254, 17, 232, 60, 1, 253, 249, 232, 60, 1, 246, - 131, 232, 60, 1, 235, 120, 232, 60, 1, 254, 231, 232, 60, 254, 255, 79, - 232, 60, 214, 121, 79, 232, 60, 243, 149, 79, 232, 60, 225, 62, 84, 5, - 236, 52, 251, 55, 84, 5, 251, 55, 84, 5, 254, 113, 84, 5, 214, 132, 84, - 1, 220, 196, 63, 84, 1, 63, 84, 1, 255, 104, 84, 1, 75, 84, 1, 236, 145, - 84, 1, 72, 84, 1, 215, 98, 84, 1, 165, 152, 84, 1, 165, 155, 84, 1, 251, - 58, 77, 84, 1, 220, 196, 77, 84, 1, 77, 84, 1, 254, 236, 84, 1, 251, 58, - 78, 84, 1, 220, 196, 78, 84, 1, 78, 84, 1, 253, 235, 84, 1, 183, 84, 1, - 234, 250, 84, 1, 243, 230, 84, 1, 243, 89, 84, 1, 229, 226, 84, 1, 251, - 88, 84, 1, 250, 215, 84, 1, 236, 0, 84, 1, 235, 230, 84, 1, 228, 64, 84, - 1, 216, 128, 84, 1, 216, 116, 84, 1, 248, 207, 84, 1, 248, 191, 84, 1, - 229, 6, 84, 1, 218, 66, 84, 1, 217, 174, 84, 1, 249, 30, 84, 1, 248, 97, - 84, 1, 207, 84, 1, 228, 246, 84, 1, 195, 84, 1, 226, 59, 84, 1, 252, 234, - 84, 1, 252, 65, 84, 1, 191, 84, 1, 189, 84, 1, 208, 84, 1, 223, 115, 84, - 1, 233, 255, 84, 1, 233, 54, 84, 1, 233, 45, 84, 1, 215, 8, 84, 1, 221, - 47, 84, 1, 219, 176, 84, 1, 222, 227, 84, 1, 162, 84, 30, 5, 227, 136, - 84, 30, 5, 227, 84, 84, 5, 228, 103, 84, 5, 253, 218, 84, 30, 5, 255, - 104, 84, 30, 5, 75, 84, 30, 5, 236, 145, 84, 30, 5, 72, 84, 30, 5, 215, - 98, 84, 30, 5, 165, 152, 84, 30, 5, 165, 223, 116, 84, 30, 5, 251, 58, - 77, 84, 30, 5, 220, 196, 77, 84, 30, 5, 77, 84, 30, 5, 254, 236, 84, 30, - 5, 251, 58, 78, 84, 30, 5, 220, 196, 78, 84, 30, 5, 78, 84, 30, 5, 253, - 235, 84, 5, 214, 137, 84, 30, 5, 225, 102, 77, 84, 30, 5, 253, 214, 84, - 227, 107, 84, 219, 65, 5, 215, 191, 84, 219, 65, 5, 254, 115, 84, 242, - 234, 255, 46, 84, 255, 36, 255, 46, 84, 30, 5, 251, 58, 187, 77, 84, 30, - 5, 215, 189, 84, 30, 5, 215, 97, 84, 1, 225, 11, 84, 1, 234, 233, 84, 1, - 243, 66, 84, 1, 212, 109, 84, 1, 248, 196, 84, 1, 223, 226, 84, 1, 245, - 29, 84, 1, 212, 160, 84, 1, 165, 223, 116, 84, 1, 165, 233, 55, 84, 30, - 5, 165, 155, 84, 30, 5, 165, 233, 55, 84, 248, 245, 84, 52, 248, 245, 84, - 21, 212, 79, 84, 21, 118, 84, 21, 112, 84, 21, 170, 84, 21, 167, 84, 21, - 185, 84, 21, 192, 84, 21, 200, 84, 21, 198, 84, 21, 203, 84, 255, 53, 53, - 84, 5, 127, 219, 224, 247, 195, 84, 1, 251, 58, 63, 84, 1, 227, 136, 84, - 1, 227, 84, 84, 1, 253, 214, 84, 1, 215, 189, 84, 1, 215, 97, 84, 1, 212, - 75, 84, 1, 110, 189, 84, 1, 243, 125, 84, 1, 235, 213, 84, 1, 243, 20, - 219, 83, 84, 1, 248, 197, 84, 1, 252, 157, 142, 5, 251, 55, 142, 5, 254, - 113, 142, 5, 214, 132, 142, 1, 63, 142, 1, 255, 104, 142, 1, 75, 142, 1, - 236, 145, 142, 1, 72, 142, 1, 215, 98, 142, 1, 165, 152, 142, 1, 165, - 155, 142, 1, 77, 142, 1, 254, 236, 142, 1, 78, 142, 1, 253, 235, 142, 1, - 183, 142, 1, 234, 250, 142, 1, 243, 230, 142, 1, 243, 89, 142, 1, 229, - 226, 142, 1, 251, 88, 142, 1, 250, 215, 142, 1, 236, 0, 142, 1, 235, 230, - 142, 1, 228, 64, 142, 1, 216, 128, 142, 1, 216, 116, 142, 1, 248, 207, - 142, 1, 248, 191, 142, 1, 229, 6, 142, 1, 218, 66, 142, 1, 217, 174, 142, - 1, 249, 30, 142, 1, 248, 97, 142, 1, 207, 142, 1, 195, 142, 1, 226, 59, - 142, 1, 252, 234, 142, 1, 252, 65, 142, 1, 191, 142, 1, 189, 142, 1, 208, - 142, 1, 233, 255, 142, 1, 221, 47, 142, 1, 219, 176, 142, 1, 222, 227, - 142, 1, 162, 142, 5, 228, 103, 142, 5, 253, 218, 142, 30, 5, 255, 104, - 142, 30, 5, 75, 142, 30, 5, 236, 145, 142, 30, 5, 72, 142, 30, 5, 215, - 98, 142, 30, 5, 165, 152, 142, 30, 5, 165, 223, 116, 142, 30, 5, 77, 142, - 30, 5, 254, 236, 142, 30, 5, 78, 142, 30, 5, 253, 235, 142, 5, 214, 137, - 142, 1, 234, 242, 218, 66, 142, 253, 236, 233, 145, 79, 142, 1, 223, 115, - 142, 1, 223, 226, 142, 1, 212, 160, 142, 1, 165, 223, 116, 142, 1, 165, - 233, 55, 142, 30, 5, 165, 155, 142, 30, 5, 165, 233, 55, 142, 21, 212, - 79, 142, 21, 118, 142, 21, 112, 142, 21, 170, 142, 21, 167, 142, 21, 185, - 142, 21, 192, 142, 21, 200, 142, 21, 198, 142, 21, 203, 142, 1, 224, 112, - 2, 231, 107, 248, 71, 142, 1, 224, 112, 2, 232, 237, 248, 71, 142, 223, - 55, 79, 142, 223, 55, 53, 142, 249, 162, 228, 96, 118, 142, 249, 162, - 228, 96, 112, 142, 249, 162, 228, 96, 170, 142, 249, 162, 228, 96, 167, - 142, 249, 162, 228, 96, 124, 233, 138, 217, 167, 217, 162, 248, 120, 142, - 249, 162, 248, 121, 220, 66, 142, 236, 20, 142, 243, 199, 79, 178, 5, - 255, 31, 252, 35, 178, 5, 252, 35, 178, 5, 214, 132, 178, 1, 63, 178, 1, - 255, 104, 178, 1, 75, 178, 1, 236, 145, 178, 1, 72, 178, 1, 215, 98, 178, - 1, 246, 30, 178, 1, 254, 236, 178, 1, 227, 86, 178, 1, 253, 235, 178, 1, - 183, 178, 1, 234, 250, 178, 1, 243, 230, 178, 1, 243, 89, 178, 1, 229, - 226, 178, 1, 251, 88, 178, 1, 250, 215, 178, 1, 236, 0, 178, 1, 235, 230, - 178, 1, 228, 64, 178, 1, 216, 128, 178, 1, 216, 116, 178, 1, 248, 207, - 178, 1, 248, 191, 178, 1, 229, 6, 178, 1, 218, 66, 178, 1, 217, 174, 178, - 1, 249, 30, 178, 1, 248, 97, 178, 1, 207, 178, 1, 195, 178, 1, 226, 59, - 178, 1, 252, 234, 178, 1, 252, 65, 178, 1, 191, 178, 1, 189, 178, 1, 208, - 178, 1, 233, 255, 178, 1, 233, 54, 178, 1, 215, 8, 178, 1, 221, 47, 178, - 1, 222, 227, 178, 1, 162, 178, 5, 228, 103, 178, 30, 5, 255, 104, 178, - 30, 5, 75, 178, 30, 5, 236, 145, 178, 30, 5, 72, 178, 30, 5, 215, 98, - 178, 30, 5, 246, 30, 178, 30, 5, 254, 236, 178, 30, 5, 227, 86, 178, 30, - 5, 253, 235, 178, 5, 214, 137, 178, 5, 215, 193, 178, 1, 234, 233, 178, - 1, 243, 66, 178, 1, 212, 109, 178, 1, 223, 115, 178, 1, 245, 29, 178, 21, - 212, 79, 178, 21, 118, 178, 21, 112, 178, 21, 170, 178, 21, 167, 178, 21, - 185, 178, 21, 192, 178, 21, 200, 178, 21, 198, 178, 21, 203, 178, 217, - 41, 178, 255, 30, 178, 236, 37, 178, 215, 123, 178, 246, 3, 227, 91, 178, - 5, 213, 69, 168, 5, 251, 55, 168, 5, 254, 113, 168, 5, 214, 132, 168, 1, - 63, 168, 1, 255, 104, 168, 1, 75, 168, 1, 236, 145, 168, 1, 72, 168, 1, - 215, 98, 168, 1, 165, 152, 168, 1, 165, 155, 168, 30, 251, 58, 77, 168, - 1, 77, 168, 1, 254, 236, 168, 30, 251, 58, 78, 168, 1, 78, 168, 1, 253, - 235, 168, 1, 183, 168, 1, 234, 250, 168, 1, 243, 230, 168, 1, 243, 89, - 168, 1, 229, 226, 168, 1, 251, 88, 168, 1, 250, 215, 168, 1, 236, 0, 168, - 1, 235, 230, 168, 1, 228, 64, 168, 1, 216, 128, 168, 1, 216, 116, 168, 1, - 248, 207, 168, 1, 248, 191, 168, 1, 229, 6, 168, 1, 218, 66, 168, 1, 217, - 174, 168, 1, 249, 30, 168, 1, 248, 97, 168, 1, 207, 168, 1, 195, 168, 1, - 226, 59, 168, 1, 252, 234, 168, 1, 252, 65, 168, 1, 191, 168, 1, 189, - 168, 1, 208, 168, 1, 233, 255, 168, 1, 233, 54, 168, 1, 215, 8, 168, 1, - 221, 47, 168, 1, 219, 176, 168, 1, 222, 227, 168, 1, 162, 168, 5, 228, - 103, 168, 5, 253, 218, 168, 30, 5, 255, 104, 168, 30, 5, 75, 168, 30, 5, - 236, 145, 168, 30, 5, 72, 168, 30, 5, 215, 98, 168, 30, 5, 165, 152, 168, - 30, 5, 165, 223, 116, 168, 30, 5, 251, 58, 77, 168, 30, 5, 77, 168, 30, - 5, 254, 236, 168, 30, 5, 251, 58, 78, 168, 30, 5, 78, 168, 30, 5, 253, - 235, 168, 5, 214, 137, 168, 227, 107, 168, 1, 165, 223, 116, 168, 1, 165, - 233, 55, 168, 30, 5, 165, 155, 168, 30, 5, 165, 233, 55, 168, 21, 212, - 79, 168, 21, 118, 168, 21, 112, 168, 21, 170, 168, 21, 167, 168, 21, 185, - 168, 21, 192, 168, 21, 200, 168, 21, 198, 168, 21, 203, 168, 223, 55, 53, - 151, 5, 251, 55, 151, 5, 254, 113, 151, 5, 214, 132, 151, 1, 63, 151, 1, - 255, 104, 151, 1, 75, 151, 1, 236, 145, 151, 1, 72, 151, 1, 215, 98, 151, - 1, 165, 152, 151, 1, 165, 155, 151, 1, 77, 151, 1, 254, 236, 151, 1, 78, - 151, 1, 253, 235, 151, 1, 183, 151, 1, 234, 250, 151, 1, 243, 230, 151, - 1, 243, 89, 151, 1, 229, 226, 151, 1, 251, 88, 151, 1, 250, 215, 151, 1, - 236, 0, 151, 1, 235, 230, 151, 1, 228, 64, 151, 1, 216, 128, 151, 1, 216, - 116, 151, 1, 248, 207, 151, 1, 248, 191, 151, 1, 229, 6, 151, 1, 218, 66, - 151, 1, 217, 174, 151, 1, 249, 30, 151, 1, 248, 97, 151, 1, 207, 151, 1, - 195, 151, 1, 226, 59, 151, 1, 252, 234, 151, 1, 252, 65, 151, 1, 191, - 151, 1, 189, 151, 1, 208, 151, 1, 233, 255, 151, 1, 233, 54, 151, 1, 215, - 8, 151, 1, 221, 47, 151, 1, 219, 176, 151, 1, 222, 227, 151, 1, 162, 151, - 5, 228, 103, 151, 5, 253, 218, 151, 30, 5, 255, 104, 151, 30, 5, 75, 151, - 30, 5, 236, 145, 151, 30, 5, 72, 151, 30, 5, 215, 98, 151, 30, 5, 165, - 152, 151, 30, 5, 165, 223, 116, 151, 30, 5, 77, 151, 30, 5, 254, 236, - 151, 30, 5, 78, 151, 30, 5, 253, 235, 151, 5, 214, 137, 151, 254, 237, - 233, 145, 79, 151, 253, 236, 233, 145, 79, 151, 1, 223, 115, 151, 1, 223, - 226, 151, 1, 212, 160, 151, 1, 165, 223, 116, 151, 1, 165, 233, 55, 151, - 30, 5, 165, 155, 151, 30, 5, 165, 233, 55, 151, 21, 212, 79, 151, 21, - 118, 151, 21, 112, 151, 21, 170, 151, 21, 167, 151, 21, 185, 151, 21, - 192, 151, 21, 200, 151, 21, 198, 151, 21, 203, 151, 236, 20, 151, 1, 214, - 52, 151, 244, 92, 124, 224, 201, 151, 244, 92, 124, 242, 129, 151, 244, - 92, 137, 224, 199, 151, 244, 92, 124, 220, 64, 151, 244, 92, 124, 246, - 10, 151, 244, 92, 137, 220, 63, 36, 5, 254, 113, 36, 5, 214, 132, 36, 1, - 63, 36, 1, 255, 104, 36, 1, 75, 36, 1, 236, 145, 36, 1, 72, 36, 1, 215, - 98, 36, 1, 77, 36, 1, 246, 30, 36, 1, 254, 236, 36, 1, 78, 36, 1, 227, - 86, 36, 1, 253, 235, 36, 1, 183, 36, 1, 229, 226, 36, 1, 251, 88, 36, 1, - 236, 0, 36, 1, 228, 64, 36, 1, 216, 128, 36, 1, 229, 6, 36, 1, 218, 66, - 36, 1, 207, 36, 1, 228, 246, 36, 1, 195, 36, 1, 191, 36, 1, 189, 36, 1, - 208, 36, 1, 223, 115, 36, 1, 233, 255, 36, 1, 233, 54, 36, 1, 233, 45, - 36, 1, 215, 8, 36, 1, 221, 47, 36, 1, 219, 176, 36, 1, 222, 227, 36, 1, - 162, 36, 30, 5, 255, 104, 36, 30, 5, 75, 36, 30, 5, 236, 145, 36, 30, 5, - 72, 36, 30, 5, 215, 98, 36, 30, 5, 77, 36, 30, 5, 246, 30, 36, 30, 5, - 254, 236, 36, 30, 5, 78, 36, 30, 5, 227, 86, 36, 30, 5, 253, 235, 36, 5, - 214, 137, 36, 227, 107, 36, 253, 236, 233, 145, 79, 36, 21, 212, 79, 36, - 21, 118, 36, 21, 112, 36, 21, 170, 36, 21, 167, 36, 21, 185, 36, 21, 192, - 36, 21, 200, 36, 21, 198, 36, 21, 203, 36, 51, 217, 213, 36, 51, 124, - 241, 62, 36, 51, 124, 217, 113, 36, 248, 213, 53, 36, 231, 19, 53, 36, - 213, 37, 53, 36, 248, 159, 53, 36, 249, 202, 53, 36, 254, 24, 74, 53, 36, - 223, 55, 53, 36, 51, 53, 145, 5, 251, 55, 145, 5, 254, 113, 145, 5, 214, - 132, 145, 1, 63, 145, 1, 255, 104, 145, 1, 75, 145, 1, 236, 145, 145, 1, - 72, 145, 1, 215, 98, 145, 1, 165, 152, 145, 1, 165, 155, 145, 1, 77, 145, - 1, 246, 30, 145, 1, 254, 236, 145, 1, 78, 145, 1, 227, 86, 145, 1, 253, - 235, 145, 1, 183, 145, 1, 234, 250, 145, 1, 243, 230, 145, 1, 243, 89, - 145, 1, 229, 226, 145, 1, 251, 88, 145, 1, 250, 215, 145, 1, 236, 0, 145, - 1, 235, 230, 145, 1, 228, 64, 145, 1, 216, 128, 145, 1, 216, 116, 145, 1, - 248, 207, 145, 1, 248, 191, 145, 1, 229, 6, 145, 1, 218, 66, 145, 1, 217, - 174, 145, 1, 249, 30, 145, 1, 248, 97, 145, 1, 207, 145, 1, 195, 145, 1, - 226, 59, 145, 1, 252, 234, 145, 1, 252, 65, 145, 1, 191, 145, 1, 189, - 145, 1, 208, 145, 1, 223, 115, 145, 1, 233, 255, 145, 1, 233, 54, 145, 1, - 215, 8, 145, 1, 221, 47, 145, 1, 219, 176, 145, 1, 222, 227, 145, 1, 162, - 145, 5, 253, 218, 145, 30, 5, 255, 104, 145, 30, 5, 75, 145, 30, 5, 236, - 145, 145, 30, 5, 72, 145, 30, 5, 215, 98, 145, 30, 5, 165, 152, 145, 30, - 5, 165, 223, 116, 145, 30, 5, 77, 145, 30, 5, 246, 30, 145, 30, 5, 254, - 236, 145, 30, 5, 78, 145, 30, 5, 227, 86, 145, 30, 5, 253, 235, 145, 5, - 214, 137, 145, 233, 145, 79, 145, 254, 237, 233, 145, 79, 145, 1, 216, - 154, 145, 1, 246, 114, 145, 1, 165, 223, 116, 145, 1, 165, 233, 55, 145, - 30, 5, 165, 155, 145, 30, 5, 165, 233, 55, 145, 21, 212, 79, 145, 21, - 118, 145, 21, 112, 145, 21, 170, 145, 21, 167, 145, 21, 185, 145, 21, - 192, 145, 21, 200, 145, 21, 198, 145, 21, 203, 145, 244, 92, 21, 212, 80, - 31, 227, 139, 225, 139, 68, 167, 145, 244, 92, 21, 124, 31, 227, 139, - 225, 139, 68, 167, 145, 244, 92, 21, 119, 31, 227, 139, 225, 139, 68, - 167, 145, 244, 92, 21, 137, 31, 227, 139, 225, 139, 68, 167, 145, 244, - 92, 21, 124, 31, 245, 130, 225, 139, 68, 167, 145, 244, 92, 21, 119, 31, - 245, 130, 225, 139, 68, 167, 145, 244, 92, 21, 137, 31, 245, 130, 225, - 139, 68, 167, 145, 5, 216, 56, 158, 5, 254, 113, 158, 5, 214, 132, 158, - 1, 63, 158, 1, 255, 104, 158, 1, 75, 158, 1, 236, 145, 158, 1, 72, 158, - 1, 215, 98, 158, 1, 165, 152, 158, 1, 165, 155, 158, 1, 77, 158, 1, 246, - 30, 158, 1, 254, 236, 158, 1, 78, 158, 1, 227, 86, 158, 1, 253, 235, 158, - 1, 183, 158, 1, 234, 250, 158, 1, 243, 230, 158, 1, 243, 89, 158, 1, 229, - 226, 158, 1, 251, 88, 158, 1, 250, 215, 158, 1, 236, 0, 158, 1, 235, 230, - 158, 1, 228, 64, 158, 1, 216, 128, 158, 1, 216, 116, 158, 1, 248, 207, - 158, 1, 248, 191, 158, 1, 229, 6, 158, 1, 218, 66, 158, 1, 217, 174, 158, - 1, 249, 30, 158, 1, 248, 97, 158, 1, 207, 158, 1, 195, 158, 1, 226, 59, - 158, 1, 252, 234, 158, 1, 252, 65, 158, 1, 191, 158, 1, 189, 158, 1, 208, - 158, 1, 223, 115, 158, 1, 233, 255, 158, 1, 233, 54, 158, 1, 215, 8, 158, - 1, 221, 47, 158, 1, 219, 176, 158, 1, 222, 227, 158, 1, 162, 158, 5, 228, - 103, 158, 5, 253, 218, 158, 30, 5, 255, 104, 158, 30, 5, 75, 158, 30, 5, - 236, 145, 158, 30, 5, 72, 158, 30, 5, 215, 98, 158, 30, 5, 165, 152, 158, - 30, 5, 165, 223, 116, 158, 30, 5, 77, 158, 30, 5, 246, 30, 158, 30, 5, - 254, 236, 158, 30, 5, 78, 158, 30, 5, 227, 86, 158, 30, 5, 253, 235, 158, - 5, 214, 137, 158, 233, 145, 79, 158, 254, 237, 233, 145, 79, 158, 1, 245, - 29, 158, 1, 165, 223, 116, 158, 1, 165, 233, 55, 158, 30, 5, 165, 155, - 158, 30, 5, 165, 233, 55, 158, 21, 212, 79, 158, 21, 118, 158, 21, 112, - 158, 21, 170, 158, 21, 167, 158, 21, 185, 158, 21, 192, 158, 21, 200, - 158, 21, 198, 158, 21, 203, 158, 5, 235, 219, 158, 5, 215, 138, 132, 5, - 254, 113, 132, 5, 214, 132, 132, 1, 63, 132, 1, 255, 104, 132, 1, 75, - 132, 1, 236, 145, 132, 1, 72, 132, 1, 215, 98, 132, 1, 165, 152, 132, 1, - 165, 155, 132, 1, 77, 132, 1, 246, 30, 132, 1, 254, 236, 132, 1, 78, 132, - 1, 227, 86, 132, 1, 253, 235, 132, 1, 183, 132, 1, 234, 250, 132, 1, 243, - 230, 132, 1, 243, 89, 132, 1, 229, 226, 132, 1, 251, 88, 132, 1, 250, - 215, 132, 1, 236, 0, 132, 1, 235, 230, 132, 1, 228, 64, 132, 1, 216, 128, - 132, 1, 216, 116, 132, 1, 248, 207, 132, 1, 248, 191, 132, 1, 229, 6, - 132, 1, 218, 66, 132, 1, 217, 174, 132, 1, 249, 30, 132, 1, 248, 97, 132, - 1, 207, 132, 1, 228, 246, 132, 1, 195, 132, 1, 226, 59, 132, 1, 252, 234, - 132, 1, 252, 65, 132, 1, 191, 132, 1, 189, 132, 1, 208, 132, 1, 223, 115, - 132, 1, 233, 255, 132, 1, 233, 54, 132, 1, 233, 45, 132, 1, 215, 8, 132, - 1, 221, 47, 132, 1, 219, 176, 132, 1, 222, 227, 132, 1, 162, 132, 1, 216, - 97, 132, 5, 253, 218, 132, 30, 5, 255, 104, 132, 30, 5, 75, 132, 30, 5, - 236, 145, 132, 30, 5, 72, 132, 30, 5, 215, 98, 132, 30, 5, 165, 152, 132, - 30, 5, 165, 223, 116, 132, 30, 5, 77, 132, 30, 5, 246, 30, 132, 30, 5, - 254, 236, 132, 30, 5, 78, 132, 30, 5, 227, 86, 132, 30, 5, 253, 235, 132, - 5, 214, 137, 132, 1, 62, 224, 3, 132, 253, 236, 233, 145, 79, 132, 1, - 165, 223, 116, 132, 1, 165, 233, 55, 132, 30, 5, 165, 155, 132, 30, 5, - 165, 233, 55, 132, 21, 212, 79, 132, 21, 118, 132, 21, 112, 132, 21, 170, - 132, 21, 167, 132, 21, 185, 132, 21, 192, 132, 21, 200, 132, 21, 198, - 132, 21, 203, 132, 51, 217, 213, 132, 51, 124, 241, 62, 132, 51, 124, - 217, 113, 132, 244, 92, 124, 224, 201, 132, 244, 92, 124, 242, 129, 132, - 244, 92, 137, 224, 199, 132, 248, 217, 79, 132, 1, 250, 159, 229, 7, 132, - 1, 250, 159, 206, 132, 1, 250, 159, 223, 116, 132, 1, 250, 159, 155, 132, - 1, 250, 159, 233, 55, 132, 1, 250, 159, 235, 141, 176, 5, 254, 112, 176, - 5, 214, 131, 176, 1, 253, 208, 176, 1, 255, 59, 176, 1, 255, 0, 176, 1, - 255, 15, 176, 1, 236, 10, 176, 1, 236, 144, 176, 1, 215, 90, 176, 1, 215, - 92, 176, 1, 236, 32, 176, 1, 236, 33, 176, 1, 236, 130, 176, 1, 236, 132, - 176, 1, 245, 106, 176, 1, 246, 26, 176, 1, 254, 223, 176, 1, 227, 14, - 176, 1, 227, 80, 176, 1, 253, 221, 176, 1, 254, 182, 235, 49, 176, 1, - 232, 87, 235, 49, 176, 1, 254, 182, 243, 178, 176, 1, 232, 87, 243, 178, - 176, 1, 235, 91, 230, 109, 176, 1, 222, 176, 243, 178, 176, 1, 254, 182, - 251, 16, 176, 1, 232, 87, 251, 16, 176, 1, 254, 182, 235, 243, 176, 1, - 232, 87, 235, 243, 176, 1, 218, 60, 230, 109, 176, 1, 218, 60, 222, 175, - 230, 110, 176, 1, 222, 176, 235, 243, 176, 1, 254, 182, 216, 124, 176, 1, - 232, 87, 216, 124, 176, 1, 254, 182, 248, 198, 176, 1, 232, 87, 248, 198, - 176, 1, 230, 193, 230, 69, 176, 1, 222, 176, 248, 198, 176, 1, 254, 182, - 217, 250, 176, 1, 232, 87, 217, 250, 176, 1, 254, 182, 248, 211, 176, 1, - 232, 87, 248, 211, 176, 1, 248, 241, 230, 69, 176, 1, 222, 176, 248, 211, - 176, 1, 254, 182, 226, 138, 176, 1, 232, 87, 226, 138, 176, 1, 254, 182, - 252, 158, 176, 1, 232, 87, 252, 158, 176, 1, 232, 9, 176, 1, 254, 167, - 252, 158, 176, 1, 213, 43, 176, 1, 224, 60, 176, 1, 248, 241, 233, 189, - 176, 1, 214, 239, 176, 1, 218, 60, 222, 151, 176, 1, 230, 193, 222, 151, - 176, 1, 248, 241, 222, 151, 176, 1, 242, 89, 176, 1, 230, 193, 233, 189, - 176, 1, 244, 245, 176, 5, 254, 212, 176, 30, 5, 255, 10, 176, 30, 5, 235, - 17, 255, 17, 176, 30, 5, 248, 45, 255, 17, 176, 30, 5, 235, 17, 236, 29, - 176, 30, 5, 248, 45, 236, 29, 176, 30, 5, 235, 17, 226, 250, 176, 30, 5, - 248, 45, 226, 250, 176, 30, 5, 243, 219, 176, 30, 5, 234, 135, 176, 30, - 5, 248, 45, 234, 135, 176, 30, 5, 234, 137, 248, 139, 176, 30, 5, 234, - 136, 242, 149, 255, 10, 176, 30, 5, 234, 136, 242, 149, 248, 45, 255, 10, - 176, 30, 5, 234, 136, 242, 149, 243, 177, 176, 30, 5, 243, 177, 176, 30, - 5, 248, 45, 243, 219, 176, 30, 5, 248, 45, 243, 177, 176, 225, 63, 234, - 71, 160, 143, 234, 149, 235, 108, 160, 143, 234, 225, 234, 246, 160, 143, - 234, 225, 234, 218, 160, 143, 234, 225, 234, 215, 160, 143, 234, 225, - 234, 222, 160, 143, 234, 225, 224, 81, 160, 143, 229, 156, 229, 143, 160, - 143, 250, 147, 250, 206, 160, 143, 250, 147, 250, 155, 160, 143, 250, - 147, 250, 205, 160, 143, 220, 6, 220, 5, 160, 143, 250, 147, 250, 143, - 160, 143, 212, 237, 212, 244, 160, 143, 247, 221, 250, 212, 160, 143, - 217, 10, 226, 148, 160, 143, 217, 123, 217, 166, 160, 143, 217, 123, 230, - 89, 160, 143, 217, 123, 226, 23, 160, 143, 228, 229, 229, 247, 160, 143, - 247, 221, 248, 140, 160, 143, 217, 10, 218, 19, 160, 143, 217, 123, 217, - 98, 160, 143, 217, 123, 217, 170, 160, 143, 217, 123, 217, 120, 160, 143, - 228, 229, 228, 135, 160, 143, 251, 254, 252, 210, 160, 143, 225, 187, - 225, 210, 160, 143, 226, 34, 226, 25, 160, 143, 244, 133, 245, 29, 160, - 143, 226, 34, 226, 53, 160, 143, 244, 133, 245, 6, 160, 143, 226, 34, - 222, 186, 160, 143, 231, 46, 191, 160, 143, 212, 237, 213, 70, 160, 143, - 223, 147, 223, 76, 160, 143, 223, 77, 160, 143, 233, 27, 233, 76, 160, - 143, 232, 230, 160, 143, 213, 218, 214, 48, 160, 143, 220, 6, 222, 201, - 160, 143, 220, 6, 223, 51, 160, 143, 220, 6, 219, 40, 160, 143, 241, 174, - 242, 8, 160, 143, 233, 27, 250, 128, 160, 143, 141, 254, 151, 160, 143, - 241, 174, 228, 224, 160, 143, 226, 232, 160, 143, 222, 170, 63, 160, 143, - 232, 82, 242, 120, 160, 143, 222, 170, 255, 104, 160, 143, 222, 170, 254, - 172, 160, 143, 222, 170, 75, 160, 143, 222, 170, 236, 145, 160, 143, 222, - 170, 215, 189, 160, 143, 222, 170, 215, 187, 160, 143, 222, 170, 72, 160, - 143, 222, 170, 215, 98, 160, 143, 226, 36, 160, 249, 162, 16, 252, 211, - 160, 143, 222, 170, 77, 160, 143, 222, 170, 255, 20, 160, 143, 222, 170, - 78, 160, 143, 222, 170, 254, 237, 232, 76, 160, 143, 222, 170, 254, 237, - 232, 77, 160, 143, 233, 228, 160, 143, 232, 73, 160, 143, 232, 74, 160, - 143, 232, 82, 246, 2, 160, 143, 232, 82, 217, 122, 160, 143, 232, 82, - 216, 199, 160, 143, 232, 82, 250, 194, 160, 143, 217, 164, 160, 143, 229, - 100, 160, 143, 213, 64, 160, 143, 244, 124, 160, 21, 212, 79, 160, 21, - 118, 160, 21, 112, 160, 21, 170, 160, 21, 167, 160, 21, 185, 160, 21, - 192, 160, 21, 200, 160, 21, 198, 160, 21, 203, 160, 143, 254, 147, 160, - 143, 234, 223, 202, 1, 234, 148, 202, 1, 234, 225, 218, 249, 202, 1, 234, - 225, 218, 26, 202, 1, 229, 155, 202, 1, 250, 42, 202, 1, 220, 6, 218, 26, - 202, 1, 228, 35, 202, 1, 247, 220, 202, 1, 109, 202, 1, 217, 123, 218, - 249, 202, 1, 217, 123, 218, 26, 202, 1, 228, 228, 202, 1, 251, 253, 202, - 1, 225, 186, 202, 1, 226, 34, 218, 249, 202, 1, 244, 133, 218, 26, 202, - 1, 226, 34, 218, 26, 202, 1, 244, 133, 218, 249, 202, 1, 231, 45, 202, 1, - 212, 236, 202, 1, 233, 27, 233, 76, 202, 1, 233, 27, 232, 250, 202, 1, - 213, 217, 202, 1, 220, 6, 218, 249, 202, 1, 241, 174, 218, 249, 202, 1, - 78, 202, 1, 241, 174, 218, 26, 202, 245, 241, 202, 30, 5, 63, 202, 30, 5, - 232, 82, 235, 96, 202, 30, 5, 255, 104, 202, 30, 5, 254, 172, 202, 30, 5, - 75, 202, 30, 5, 236, 145, 202, 30, 5, 213, 108, 202, 30, 5, 212, 161, - 202, 30, 5, 72, 202, 30, 5, 215, 98, 202, 30, 5, 232, 82, 234, 133, 202, - 221, 88, 5, 233, 26, 202, 221, 88, 5, 228, 35, 202, 30, 5, 77, 202, 30, - 5, 246, 17, 202, 30, 5, 78, 202, 30, 5, 253, 210, 202, 30, 5, 254, 236, - 202, 234, 149, 233, 255, 202, 161, 232, 82, 246, 2, 202, 161, 232, 82, - 217, 122, 202, 161, 232, 82, 217, 84, 202, 161, 232, 82, 251, 23, 202, - 251, 60, 79, 202, 229, 109, 202, 21, 212, 79, 202, 21, 118, 202, 21, 112, - 202, 21, 170, 202, 21, 167, 202, 21, 185, 202, 21, 192, 202, 21, 200, - 202, 21, 198, 202, 21, 203, 202, 241, 174, 228, 228, 202, 241, 174, 231, - 45, 61, 3, 227, 107, 61, 156, 242, 215, 212, 248, 231, 129, 216, 160, 63, - 61, 156, 242, 215, 212, 248, 231, 129, 255, 190, 223, 151, 252, 123, 191, - 61, 156, 242, 215, 212, 248, 231, 129, 255, 190, 242, 215, 216, 144, 191, - 61, 156, 73, 212, 248, 231, 129, 231, 228, 191, 61, 156, 250, 56, 212, - 248, 231, 129, 221, 53, 191, 61, 156, 251, 39, 212, 248, 231, 129, 226, - 24, 221, 41, 191, 61, 156, 212, 248, 231, 129, 216, 144, 221, 41, 191, - 61, 156, 222, 149, 221, 40, 61, 156, 251, 182, 212, 248, 231, 128, 61, - 156, 252, 15, 220, 204, 212, 248, 231, 128, 61, 156, 236, 55, 216, 143, - 61, 156, 248, 133, 216, 144, 251, 181, 61, 156, 221, 40, 61, 156, 228, - 40, 221, 40, 61, 156, 216, 144, 221, 40, 61, 156, 228, 40, 216, 144, 221, - 40, 61, 156, 223, 167, 250, 182, 219, 187, 221, 40, 61, 156, 223, 229, - 242, 242, 221, 40, 61, 156, 251, 39, 255, 194, 223, 81, 231, 227, 187, - 251, 63, 61, 156, 242, 215, 216, 143, 61, 233, 15, 5, 250, 213, 223, 80, - 61, 233, 15, 5, 233, 121, 223, 80, 61, 253, 255, 5, 221, 50, 243, 161, - 255, 195, 223, 80, 61, 253, 255, 5, 255, 192, 195, 61, 253, 255, 5, 222, - 124, 216, 139, 61, 5, 224, 57, 247, 232, 243, 160, 61, 5, 224, 57, 247, - 232, 243, 16, 61, 5, 224, 57, 247, 232, 242, 216, 61, 5, 224, 57, 230, - 106, 243, 160, 61, 5, 224, 57, 230, 106, 243, 16, 61, 5, 224, 57, 247, - 232, 224, 57, 230, 105, 61, 21, 212, 79, 61, 21, 118, 61, 21, 112, 61, - 21, 170, 61, 21, 167, 61, 21, 185, 61, 21, 192, 61, 21, 200, 61, 21, 198, - 61, 21, 203, 61, 21, 157, 118, 61, 21, 157, 112, 61, 21, 157, 170, 61, - 21, 157, 167, 61, 21, 157, 185, 61, 21, 157, 192, 61, 21, 157, 200, 61, - 21, 157, 198, 61, 21, 157, 203, 61, 21, 157, 212, 79, 61, 156, 251, 184, - 223, 80, 61, 156, 229, 218, 251, 123, 228, 50, 212, 18, 61, 156, 251, 39, - 255, 194, 223, 81, 251, 124, 231, 85, 251, 63, 61, 156, 229, 218, 251, - 123, 221, 51, 223, 80, 61, 156, 250, 191, 231, 128, 61, 156, 216, 155, - 255, 191, 61, 156, 242, 202, 223, 81, 242, 165, 61, 156, 242, 202, 223, - 81, 242, 171, 61, 156, 254, 152, 234, 241, 242, 165, 61, 156, 254, 152, - 234, 241, 242, 171, 61, 5, 213, 57, 216, 142, 61, 5, 232, 45, 216, 142, - 61, 1, 183, 61, 1, 234, 250, 61, 1, 243, 230, 61, 1, 243, 89, 61, 1, 229, - 226, 61, 1, 251, 88, 61, 1, 250, 215, 61, 1, 236, 0, 61, 1, 228, 64, 61, - 1, 216, 128, 61, 1, 216, 116, 61, 1, 248, 207, 61, 1, 248, 191, 61, 1, - 229, 6, 61, 1, 218, 66, 61, 1, 217, 174, 61, 1, 249, 30, 61, 1, 248, 97, - 61, 1, 207, 61, 1, 195, 61, 1, 226, 59, 61, 1, 252, 234, 61, 1, 252, 65, - 61, 1, 191, 61, 1, 216, 154, 61, 1, 216, 146, 61, 1, 246, 114, 61, 1, - 246, 109, 61, 1, 214, 52, 61, 1, 212, 75, 61, 1, 212, 109, 61, 1, 255, - 197, 61, 1, 189, 61, 1, 208, 61, 1, 233, 255, 61, 1, 221, 47, 61, 1, 219, - 176, 61, 1, 222, 227, 61, 1, 162, 61, 1, 63, 61, 1, 234, 95, 61, 1, 244, - 166, 208, 61, 1, 234, 166, 61, 1, 223, 115, 61, 30, 5, 255, 104, 61, 30, - 5, 75, 61, 30, 5, 236, 145, 61, 30, 5, 72, 61, 30, 5, 215, 98, 61, 30, 5, - 165, 152, 61, 30, 5, 165, 223, 116, 61, 30, 5, 165, 155, 61, 30, 5, 165, - 233, 55, 61, 30, 5, 77, 61, 30, 5, 246, 30, 61, 30, 5, 78, 61, 30, 5, - 227, 86, 61, 5, 223, 152, 219, 42, 229, 227, 223, 146, 61, 5, 223, 151, - 252, 122, 61, 30, 5, 223, 236, 75, 61, 30, 5, 223, 236, 236, 145, 61, 5, - 228, 50, 212, 19, 230, 113, 249, 30, 61, 5, 220, 18, 233, 182, 61, 156, - 242, 131, 61, 156, 226, 221, 61, 5, 233, 185, 223, 80, 61, 5, 213, 61, - 223, 80, 61, 5, 233, 186, 216, 155, 251, 63, 61, 5, 231, 229, 251, 63, - 61, 5, 242, 218, 251, 64, 223, 227, 61, 5, 242, 218, 231, 220, 223, 227, - 61, 5, 236, 52, 231, 229, 251, 63, 61, 219, 32, 5, 233, 186, 216, 155, - 251, 63, 61, 219, 32, 5, 231, 229, 251, 63, 61, 219, 32, 5, 236, 52, 231, - 229, 251, 63, 61, 219, 32, 1, 183, 61, 219, 32, 1, 234, 250, 61, 219, 32, - 1, 243, 230, 61, 219, 32, 1, 243, 89, 61, 219, 32, 1, 229, 226, 61, 219, - 32, 1, 251, 88, 61, 219, 32, 1, 250, 215, 61, 219, 32, 1, 236, 0, 61, - 219, 32, 1, 228, 64, 61, 219, 32, 1, 216, 128, 61, 219, 32, 1, 216, 116, - 61, 219, 32, 1, 248, 207, 61, 219, 32, 1, 248, 191, 61, 219, 32, 1, 229, - 6, 61, 219, 32, 1, 218, 66, 61, 219, 32, 1, 217, 174, 61, 219, 32, 1, - 249, 30, 61, 219, 32, 1, 248, 97, 61, 219, 32, 1, 207, 61, 219, 32, 1, - 195, 61, 219, 32, 1, 226, 59, 61, 219, 32, 1, 252, 234, 61, 219, 32, 1, - 252, 65, 61, 219, 32, 1, 191, 61, 219, 32, 1, 216, 154, 61, 219, 32, 1, - 216, 146, 61, 219, 32, 1, 246, 114, 61, 219, 32, 1, 246, 109, 61, 219, - 32, 1, 214, 52, 61, 219, 32, 1, 212, 75, 61, 219, 32, 1, 212, 109, 61, - 219, 32, 1, 255, 197, 61, 219, 32, 1, 189, 61, 219, 32, 1, 208, 61, 219, - 32, 1, 233, 255, 61, 219, 32, 1, 221, 47, 61, 219, 32, 1, 219, 176, 61, - 219, 32, 1, 222, 227, 61, 219, 32, 1, 162, 61, 219, 32, 1, 63, 61, 219, - 32, 1, 234, 95, 61, 219, 32, 1, 244, 166, 214, 52, 61, 219, 32, 1, 244, - 166, 189, 61, 219, 32, 1, 244, 166, 208, 61, 234, 82, 223, 78, 234, 250, - 61, 234, 82, 223, 78, 234, 251, 251, 124, 231, 85, 251, 63, 61, 251, 52, - 5, 110, 252, 116, 61, 251, 52, 5, 182, 252, 116, 61, 251, 52, 5, 251, 53, - 217, 241, 61, 251, 52, 5, 222, 148, 255, 196, 61, 16, 246, 167, 251, 179, - 61, 16, 224, 56, 223, 153, 61, 16, 226, 240, 243, 159, 61, 16, 224, 56, - 223, 154, 223, 229, 242, 241, 61, 16, 226, 24, 195, 61, 16, 228, 213, - 251, 179, 61, 16, 228, 213, 251, 180, 228, 40, 255, 193, 61, 16, 228, - 213, 251, 180, 242, 217, 255, 193, 61, 16, 228, 213, 251, 180, 251, 124, - 255, 193, 61, 5, 224, 57, 230, 106, 224, 57, 247, 231, 61, 5, 224, 57, - 230, 106, 242, 216, 61, 156, 251, 183, 220, 204, 243, 55, 231, 129, 223, - 228, 61, 156, 231, 47, 212, 248, 243, 55, 231, 129, 223, 228, 61, 156, - 228, 40, 216, 143, 61, 156, 73, 251, 204, 223, 148, 212, 248, 231, 129, - 231, 228, 191, 61, 156, 250, 56, 251, 204, 223, 148, 212, 248, 231, 129, - 221, 53, 191, 223, 181, 218, 214, 53, 233, 167, 218, 214, 53, 223, 181, - 218, 214, 5, 2, 247, 193, 233, 167, 218, 214, 5, 2, 247, 193, 61, 156, - 233, 177, 231, 230, 223, 80, 61, 156, 216, 220, 231, 230, 223, 80, 65, 1, - 183, 65, 1, 234, 250, 65, 1, 243, 230, 65, 1, 243, 89, 65, 1, 229, 226, - 65, 1, 251, 88, 65, 1, 250, 215, 65, 1, 236, 0, 65, 1, 235, 230, 65, 1, - 228, 64, 65, 1, 228, 230, 65, 1, 216, 128, 65, 1, 216, 116, 65, 1, 248, - 207, 65, 1, 248, 191, 65, 1, 229, 6, 65, 1, 218, 66, 65, 1, 217, 174, 65, - 1, 249, 30, 65, 1, 248, 97, 65, 1, 207, 65, 1, 195, 65, 1, 226, 59, 65, - 1, 252, 234, 65, 1, 252, 65, 65, 1, 191, 65, 1, 189, 65, 1, 208, 65, 1, - 233, 255, 65, 1, 214, 52, 65, 1, 222, 227, 65, 1, 162, 65, 1, 233, 54, - 65, 1, 63, 65, 1, 221, 31, 63, 65, 1, 75, 65, 1, 236, 145, 65, 1, 72, 65, - 1, 215, 98, 65, 1, 77, 65, 1, 231, 35, 77, 65, 1, 78, 65, 1, 253, 235, - 65, 30, 5, 218, 28, 255, 104, 65, 30, 5, 255, 104, 65, 30, 5, 75, 65, 30, - 5, 236, 145, 65, 30, 5, 72, 65, 30, 5, 215, 98, 65, 30, 5, 77, 65, 30, 5, - 254, 236, 65, 30, 5, 231, 35, 236, 145, 65, 30, 5, 231, 35, 78, 65, 30, - 5, 154, 50, 65, 5, 254, 113, 65, 5, 62, 55, 65, 5, 214, 132, 65, 5, 214, - 137, 65, 5, 254, 21, 65, 120, 5, 144, 189, 65, 120, 5, 144, 208, 65, 120, - 5, 144, 214, 52, 65, 120, 5, 144, 162, 65, 1, 242, 230, 222, 227, 65, 21, - 212, 79, 65, 21, 118, 65, 21, 112, 65, 21, 170, 65, 21, 167, 65, 21, 185, - 65, 21, 192, 65, 21, 200, 65, 21, 198, 65, 21, 203, 65, 5, 233, 62, 222, - 114, 65, 5, 222, 114, 65, 16, 233, 23, 65, 16, 250, 18, 65, 16, 254, 253, - 65, 16, 243, 144, 65, 1, 221, 47, 65, 1, 219, 176, 65, 1, 165, 152, 65, - 1, 165, 223, 116, 65, 1, 165, 155, 65, 1, 165, 233, 55, 65, 30, 5, 165, - 152, 65, 30, 5, 165, 223, 116, 65, 30, 5, 165, 155, 65, 30, 5, 165, 233, - 55, 65, 1, 231, 35, 229, 226, 65, 1, 231, 35, 235, 230, 65, 1, 231, 35, - 252, 157, 65, 1, 231, 35, 252, 152, 65, 120, 5, 231, 35, 144, 207, 65, - 120, 5, 231, 35, 144, 191, 65, 120, 5, 231, 35, 144, 233, 255, 65, 1, - 221, 52, 235, 75, 221, 47, 65, 30, 5, 221, 52, 235, 75, 245, 143, 65, - 161, 156, 221, 52, 235, 75, 242, 94, 65, 161, 156, 221, 52, 235, 75, 235, - 45, 226, 33, 65, 1, 213, 251, 225, 31, 235, 75, 217, 174, 65, 1, 213, - 251, 225, 31, 235, 75, 225, 37, 65, 30, 5, 213, 251, 225, 31, 235, 75, - 245, 143, 65, 30, 5, 213, 251, 225, 31, 235, 75, 215, 189, 65, 5, 213, - 251, 225, 31, 235, 75, 216, 253, 65, 5, 213, 251, 225, 31, 235, 75, 216, - 252, 65, 5, 213, 251, 225, 31, 235, 75, 216, 251, 65, 5, 213, 251, 225, - 31, 235, 75, 216, 250, 65, 5, 213, 251, 225, 31, 235, 75, 216, 249, 65, - 1, 246, 40, 225, 31, 235, 75, 229, 6, 65, 1, 246, 40, 225, 31, 235, 75, - 212, 168, 65, 1, 246, 40, 225, 31, 235, 75, 243, 57, 65, 30, 5, 243, 155, - 235, 75, 75, 65, 30, 5, 235, 50, 227, 136, 65, 30, 5, 235, 50, 72, 65, - 30, 5, 235, 50, 246, 30, 65, 1, 221, 31, 183, 65, 1, 221, 31, 234, 250, - 65, 1, 221, 31, 243, 230, 65, 1, 221, 31, 251, 88, 65, 1, 221, 31, 212, - 109, 65, 1, 221, 31, 228, 64, 65, 1, 221, 31, 249, 30, 65, 1, 221, 31, - 207, 65, 1, 221, 31, 226, 59, 65, 1, 221, 31, 245, 29, 65, 1, 221, 31, - 252, 234, 65, 1, 221, 31, 217, 174, 65, 1, 221, 31, 162, 65, 120, 5, 221, - 31, 144, 214, 52, 65, 30, 5, 221, 31, 255, 104, 65, 30, 5, 221, 31, 77, - 65, 30, 5, 221, 31, 154, 50, 65, 30, 5, 221, 31, 41, 213, 108, 65, 5, - 221, 31, 216, 252, 65, 5, 221, 31, 216, 251, 65, 5, 221, 31, 216, 249, - 65, 5, 221, 31, 216, 248, 65, 5, 221, 31, 249, 214, 216, 252, 65, 5, 221, - 31, 249, 214, 216, 251, 65, 5, 221, 31, 249, 214, 245, 232, 216, 254, 65, - 1, 223, 65, 226, 227, 245, 29, 65, 5, 223, 65, 226, 227, 216, 249, 65, - 221, 31, 21, 212, 79, 65, 221, 31, 21, 118, 65, 221, 31, 21, 112, 65, - 221, 31, 21, 170, 65, 221, 31, 21, 167, 65, 221, 31, 21, 185, 65, 221, - 31, 21, 192, 65, 221, 31, 21, 200, 65, 221, 31, 21, 198, 65, 221, 31, 21, - 203, 65, 5, 234, 244, 216, 253, 65, 5, 234, 244, 216, 251, 65, 30, 5, - 254, 225, 63, 65, 30, 5, 254, 225, 254, 236, 65, 16, 221, 31, 118, 65, - 16, 221, 31, 245, 118, 99, 6, 1, 254, 159, 99, 6, 1, 252, 198, 99, 6, 1, - 243, 202, 99, 6, 1, 247, 203, 99, 6, 1, 245, 229, 99, 6, 1, 214, 145, 99, - 6, 1, 212, 82, 99, 6, 1, 218, 24, 99, 6, 1, 236, 112, 99, 6, 1, 235, 96, - 99, 6, 1, 233, 203, 99, 6, 1, 232, 63, 99, 6, 1, 230, 83, 99, 6, 1, 227, - 99, 99, 6, 1, 226, 182, 99, 6, 1, 212, 71, 99, 6, 1, 224, 96, 99, 6, 1, - 222, 183, 99, 6, 1, 218, 14, 99, 6, 1, 215, 166, 99, 6, 1, 226, 52, 99, - 6, 1, 234, 239, 99, 6, 1, 243, 81, 99, 6, 1, 224, 252, 99, 6, 1, 220, - 221, 99, 6, 1, 250, 157, 99, 6, 1, 251, 63, 99, 6, 1, 235, 217, 99, 6, 1, - 250, 100, 99, 6, 1, 250, 202, 99, 6, 1, 213, 154, 99, 6, 1, 235, 228, 99, - 6, 1, 242, 145, 99, 6, 1, 242, 85, 99, 6, 1, 242, 23, 99, 6, 1, 214, 9, - 99, 6, 1, 242, 107, 99, 6, 1, 241, 170, 99, 1, 254, 159, 99, 1, 252, 198, - 99, 1, 243, 202, 99, 1, 247, 203, 99, 1, 245, 229, 99, 1, 214, 145, 99, - 1, 212, 82, 99, 1, 218, 24, 99, 1, 236, 112, 99, 1, 235, 96, 99, 1, 233, - 203, 99, 1, 232, 63, 99, 1, 230, 83, 99, 1, 227, 99, 99, 1, 226, 182, 99, - 1, 212, 71, 99, 1, 224, 96, 99, 1, 222, 183, 99, 1, 218, 14, 99, 1, 215, - 166, 99, 1, 226, 52, 99, 1, 234, 239, 99, 1, 243, 81, 99, 1, 224, 252, - 99, 1, 220, 221, 99, 1, 250, 157, 99, 1, 251, 63, 99, 1, 235, 217, 99, 1, - 250, 100, 99, 1, 250, 202, 99, 1, 213, 154, 99, 1, 235, 228, 99, 1, 242, - 145, 99, 1, 242, 85, 99, 1, 242, 23, 99, 1, 214, 9, 99, 1, 242, 107, 99, - 1, 241, 170, 99, 1, 244, 210, 99, 1, 212, 238, 99, 1, 245, 243, 99, 1, - 216, 66, 243, 202, 99, 1, 254, 231, 99, 226, 180, 221, 80, 59, 1, 99, - 230, 83, 24, 98, 234, 178, 24, 98, 219, 168, 24, 98, 229, 121, 24, 98, - 217, 68, 24, 98, 219, 157, 24, 98, 223, 213, 24, 98, 231, 100, 24, 98, - 226, 7, 24, 98, 219, 165, 24, 98, 220, 95, 24, 98, 219, 162, 24, 98, 236, - 168, 24, 98, 250, 106, 24, 98, 219, 172, 24, 98, 250, 166, 24, 98, 234, - 228, 24, 98, 217, 139, 24, 98, 226, 43, 24, 98, 242, 21, 24, 98, 229, - 117, 24, 98, 219, 166, 24, 98, 229, 111, 24, 98, 229, 115, 24, 98, 217, - 65, 24, 98, 223, 201, 24, 98, 219, 164, 24, 98, 223, 211, 24, 98, 235, - 80, 24, 98, 231, 93, 24, 98, 235, 83, 24, 98, 226, 2, 24, 98, 226, 0, 24, - 98, 225, 244, 24, 98, 225, 252, 24, 98, 225, 250, 24, 98, 225, 247, 24, - 98, 225, 249, 24, 98, 225, 246, 24, 98, 225, 251, 24, 98, 226, 5, 24, 98, - 226, 6, 24, 98, 225, 245, 24, 98, 225, 255, 24, 98, 235, 81, 24, 98, 235, - 79, 24, 98, 220, 88, 24, 98, 220, 86, 24, 98, 220, 78, 24, 98, 220, 81, - 24, 98, 220, 87, 24, 98, 220, 83, 24, 98, 220, 82, 24, 98, 220, 80, 24, - 98, 220, 91, 24, 98, 220, 93, 24, 98, 220, 94, 24, 98, 220, 89, 24, 98, - 220, 79, 24, 98, 220, 84, 24, 98, 220, 92, 24, 98, 250, 150, 24, 98, 250, - 148, 24, 98, 250, 225, 24, 98, 250, 223, 24, 98, 226, 197, 24, 98, 236, - 163, 24, 98, 236, 154, 24, 98, 236, 162, 24, 98, 236, 159, 24, 98, 236, - 157, 24, 98, 236, 161, 24, 98, 219, 169, 24, 98, 236, 166, 24, 98, 236, - 167, 24, 98, 236, 155, 24, 98, 236, 160, 24, 98, 213, 18, 24, 98, 250, - 105, 24, 98, 250, 151, 24, 98, 250, 149, 24, 98, 250, 226, 24, 98, 250, - 224, 24, 98, 250, 164, 24, 98, 250, 165, 24, 98, 250, 152, 24, 98, 250, - 227, 24, 98, 226, 41, 24, 98, 235, 82, 24, 98, 219, 170, 24, 98, 213, 24, - 24, 98, 234, 169, 24, 98, 229, 113, 24, 98, 229, 119, 24, 98, 229, 118, - 24, 98, 217, 62, 24, 98, 244, 192, 24, 139, 244, 192, 24, 139, 63, 24, - 139, 255, 20, 24, 139, 189, 24, 139, 213, 83, 24, 139, 245, 197, 24, 139, - 77, 24, 139, 213, 28, 24, 139, 213, 39, 24, 139, 78, 24, 139, 214, 52, - 24, 139, 214, 49, 24, 139, 227, 136, 24, 139, 212, 236, 24, 139, 72, 24, - 139, 213, 255, 24, 139, 214, 9, 24, 139, 213, 238, 24, 139, 212, 204, 24, - 139, 245, 143, 24, 139, 213, 0, 24, 139, 75, 24, 139, 255, 188, 24, 139, - 255, 187, 24, 139, 213, 97, 24, 139, 213, 95, 24, 139, 245, 195, 24, 139, - 245, 194, 24, 139, 245, 196, 24, 139, 213, 27, 24, 139, 213, 26, 24, 139, - 227, 241, 24, 139, 227, 242, 24, 139, 227, 235, 24, 139, 227, 240, 24, - 139, 227, 238, 24, 139, 212, 230, 24, 139, 212, 229, 24, 139, 212, 228, - 24, 139, 212, 231, 24, 139, 212, 232, 24, 139, 216, 3, 24, 139, 216, 2, - 24, 139, 216, 0, 24, 139, 215, 253, 24, 139, 215, 254, 24, 139, 212, 203, - 24, 139, 212, 200, 24, 139, 212, 201, 24, 139, 212, 195, 24, 139, 212, - 196, 24, 139, 212, 197, 24, 139, 212, 199, 24, 139, 245, 137, 24, 139, - 245, 139, 24, 139, 212, 255, 24, 139, 241, 6, 24, 139, 240, 254, 24, 139, - 241, 1, 24, 139, 240, 255, 24, 139, 241, 3, 24, 139, 241, 5, 24, 139, - 254, 75, 24, 139, 254, 72, 24, 139, 254, 70, 24, 139, 254, 71, 24, 139, - 219, 173, 24, 139, 255, 189, 24, 139, 213, 96, 24, 139, 213, 25, 24, 139, - 227, 237, 24, 139, 227, 236, 24, 90, 234, 178, 24, 90, 219, 168, 24, 90, - 234, 171, 24, 90, 229, 121, 24, 90, 229, 119, 24, 90, 229, 118, 24, 90, - 217, 68, 24, 90, 223, 213, 24, 90, 223, 208, 24, 90, 223, 205, 24, 90, - 223, 198, 24, 90, 223, 193, 24, 90, 223, 188, 24, 90, 223, 199, 24, 90, - 223, 211, 24, 90, 231, 100, 24, 90, 226, 7, 24, 90, 225, 252, 24, 90, - 220, 95, 24, 90, 219, 162, 24, 90, 236, 168, 24, 90, 250, 106, 24, 90, - 250, 166, 24, 90, 234, 228, 24, 90, 217, 139, 24, 90, 226, 43, 24, 90, - 242, 21, 24, 90, 234, 172, 24, 90, 234, 170, 24, 90, 229, 117, 24, 90, - 229, 111, 24, 90, 229, 113, 24, 90, 229, 116, 24, 90, 229, 112, 24, 90, - 217, 65, 24, 90, 217, 62, 24, 90, 223, 206, 24, 90, 223, 201, 24, 90, - 223, 187, 24, 90, 223, 186, 24, 90, 219, 164, 24, 90, 223, 203, 24, 90, - 223, 202, 24, 90, 223, 195, 24, 90, 223, 197, 24, 90, 223, 210, 24, 90, - 223, 190, 24, 90, 223, 200, 24, 90, 223, 209, 24, 90, 223, 185, 24, 90, - 231, 96, 24, 90, 231, 91, 24, 90, 231, 93, 24, 90, 231, 90, 24, 90, 231, - 88, 24, 90, 231, 94, 24, 90, 231, 99, 24, 90, 231, 97, 24, 90, 235, 83, - 24, 90, 225, 254, 24, 90, 225, 255, 24, 90, 226, 4, 24, 90, 235, 81, 24, - 90, 220, 88, 24, 90, 220, 78, 24, 90, 220, 81, 24, 90, 220, 83, 24, 90, - 226, 197, 24, 90, 236, 163, 24, 90, 236, 156, 24, 90, 219, 169, 24, 90, - 236, 164, 24, 90, 213, 18, 24, 90, 213, 14, 24, 90, 213, 15, 24, 90, 226, - 41, 24, 90, 235, 82, 24, 90, 242, 19, 24, 90, 242, 17, 24, 90, 242, 20, - 24, 90, 242, 18, 24, 90, 213, 24, 24, 90, 234, 174, 24, 90, 234, 173, 24, - 90, 234, 177, 24, 90, 234, 175, 24, 90, 234, 176, 24, 90, 219, 166, 28, - 3, 162, 28, 3, 241, 74, 28, 3, 242, 28, 28, 3, 242, 148, 28, 3, 242, 67, - 28, 3, 242, 85, 28, 3, 241, 173, 28, 3, 241, 172, 28, 3, 233, 255, 28, 3, - 232, 230, 28, 3, 233, 111, 28, 3, 233, 254, 28, 3, 233, 172, 28, 3, 233, - 180, 28, 3, 233, 26, 28, 3, 232, 202, 28, 3, 242, 37, 28, 3, 242, 31, 28, - 3, 242, 33, 28, 3, 242, 36, 28, 3, 242, 34, 28, 3, 242, 35, 28, 3, 242, - 32, 28, 3, 242, 30, 28, 3, 191, 28, 3, 230, 242, 28, 3, 231, 112, 28, 3, - 232, 114, 28, 3, 231, 215, 28, 3, 231, 226, 28, 3, 231, 45, 28, 3, 230, - 183, 28, 3, 218, 124, 28, 3, 218, 118, 28, 3, 218, 120, 28, 3, 218, 123, - 28, 3, 218, 121, 28, 3, 218, 122, 28, 3, 218, 119, 28, 3, 218, 117, 28, - 3, 208, 28, 3, 223, 77, 28, 3, 223, 222, 28, 3, 224, 109, 28, 3, 224, 35, - 28, 3, 224, 55, 28, 3, 223, 146, 28, 3, 223, 46, 28, 3, 222, 227, 28, 3, - 219, 41, 28, 3, 220, 136, 28, 3, 222, 225, 28, 3, 222, 112, 28, 3, 222, - 123, 28, 3, 220, 5, 28, 3, 218, 212, 28, 3, 221, 47, 28, 3, 220, 170, 28, - 3, 220, 233, 28, 3, 221, 43, 28, 3, 221, 6, 28, 3, 221, 8, 28, 3, 220, - 208, 28, 3, 220, 153, 28, 3, 225, 11, 28, 3, 224, 210, 28, 3, 224, 233, - 28, 3, 225, 10, 28, 3, 224, 247, 28, 3, 224, 248, 28, 3, 224, 222, 28, 3, - 224, 221, 28, 3, 224, 166, 28, 3, 224, 162, 28, 3, 224, 165, 28, 3, 224, - 163, 28, 3, 224, 164, 28, 3, 224, 245, 28, 3, 224, 239, 28, 3, 224, 241, - 28, 3, 224, 244, 28, 3, 224, 242, 28, 3, 224, 243, 28, 3, 224, 240, 28, - 3, 224, 238, 28, 3, 224, 234, 28, 3, 224, 237, 28, 3, 224, 235, 28, 3, - 224, 236, 28, 3, 252, 234, 28, 3, 251, 179, 28, 3, 252, 54, 28, 3, 252, - 233, 28, 3, 252, 112, 28, 3, 252, 121, 28, 3, 251, 253, 28, 3, 251, 137, - 28, 3, 215, 8, 28, 3, 214, 103, 28, 3, 214, 159, 28, 3, 215, 7, 28, 3, - 214, 232, 28, 3, 214, 237, 28, 3, 214, 123, 28, 3, 214, 94, 28, 3, 218, - 66, 28, 3, 216, 90, 28, 3, 217, 84, 28, 3, 218, 63, 28, 3, 217, 232, 28, - 3, 217, 242, 28, 3, 109, 28, 3, 216, 52, 28, 3, 251, 88, 28, 3, 249, 176, - 28, 3, 250, 111, 28, 3, 251, 87, 28, 3, 250, 239, 28, 3, 250, 247, 28, 3, - 250, 42, 28, 3, 249, 146, 28, 3, 213, 156, 28, 3, 213, 132, 28, 3, 213, - 148, 28, 3, 213, 155, 28, 3, 213, 152, 28, 3, 213, 153, 28, 3, 213, 139, - 28, 3, 213, 138, 28, 3, 213, 127, 28, 3, 213, 123, 28, 3, 213, 126, 28, - 3, 213, 124, 28, 3, 213, 125, 28, 3, 207, 28, 3, 228, 135, 28, 3, 229, - 128, 28, 3, 230, 112, 28, 3, 229, 251, 28, 3, 229, 254, 28, 3, 228, 228, - 28, 3, 228, 73, 28, 3, 228, 64, 28, 3, 228, 29, 28, 3, 228, 49, 28, 3, - 228, 63, 28, 3, 228, 55, 28, 3, 228, 56, 28, 3, 228, 35, 28, 3, 228, 20, - 28, 3, 243, 20, 63, 28, 3, 243, 20, 72, 28, 3, 243, 20, 75, 28, 3, 243, - 20, 255, 104, 28, 3, 243, 20, 246, 30, 28, 3, 243, 20, 77, 28, 3, 243, - 20, 78, 28, 3, 243, 20, 214, 52, 28, 3, 183, 28, 3, 234, 81, 28, 3, 234, - 212, 28, 3, 235, 128, 28, 3, 235, 43, 28, 3, 235, 44, 28, 3, 234, 148, - 28, 3, 234, 147, 28, 3, 234, 46, 28, 3, 234, 40, 28, 3, 234, 45, 28, 3, - 234, 41, 28, 3, 234, 42, 28, 3, 234, 35, 28, 3, 234, 29, 28, 3, 234, 31, - 28, 3, 234, 34, 28, 3, 234, 32, 28, 3, 234, 33, 28, 3, 234, 30, 28, 3, - 234, 28, 28, 3, 234, 24, 28, 3, 234, 27, 28, 3, 234, 25, 28, 3, 234, 26, - 28, 3, 214, 52, 28, 3, 213, 186, 28, 3, 213, 238, 28, 3, 214, 51, 28, 3, - 214, 4, 28, 3, 214, 9, 28, 3, 213, 217, 28, 3, 213, 216, 28, 3, 226, 51, - 63, 28, 3, 226, 51, 72, 28, 3, 226, 51, 75, 28, 3, 226, 51, 255, 104, 28, - 3, 226, 51, 246, 30, 28, 3, 226, 51, 77, 28, 3, 226, 51, 78, 28, 3, 212, - 109, 28, 3, 212, 8, 28, 3, 212, 37, 28, 3, 212, 108, 28, 3, 212, 85, 28, - 3, 212, 87, 28, 3, 212, 16, 28, 3, 211, 251, 28, 3, 212, 75, 28, 3, 212, - 55, 28, 3, 212, 62, 28, 3, 212, 74, 28, 3, 212, 66, 28, 3, 212, 67, 28, - 3, 212, 60, 28, 3, 212, 46, 28, 3, 189, 28, 3, 212, 204, 28, 3, 213, 0, - 28, 3, 213, 94, 28, 3, 213, 36, 28, 3, 213, 39, 28, 3, 212, 236, 28, 3, - 212, 227, 28, 3, 249, 30, 28, 3, 246, 154, 28, 3, 248, 76, 28, 3, 249, - 29, 28, 3, 248, 149, 28, 3, 248, 162, 28, 3, 247, 220, 28, 3, 246, 123, - 28, 3, 248, 207, 28, 3, 248, 172, 28, 3, 248, 184, 28, 3, 248, 206, 28, - 3, 248, 194, 28, 3, 248, 195, 28, 3, 248, 177, 28, 3, 248, 163, 28, 3, - 236, 0, 28, 3, 235, 168, 28, 3, 235, 225, 28, 3, 235, 255, 28, 3, 235, - 240, 28, 3, 235, 242, 28, 3, 235, 185, 28, 3, 235, 149, 28, 3, 243, 230, - 28, 3, 242, 213, 28, 3, 243, 54, 28, 3, 243, 227, 28, 3, 243, 151, 28, 3, - 243, 158, 28, 3, 243, 14, 28, 3, 243, 13, 28, 3, 242, 180, 28, 3, 242, - 176, 28, 3, 242, 179, 28, 3, 242, 177, 28, 3, 242, 178, 28, 3, 243, 125, - 28, 3, 243, 105, 28, 3, 243, 115, 28, 3, 243, 124, 28, 3, 243, 119, 28, - 3, 243, 120, 28, 3, 243, 109, 28, 3, 243, 94, 28, 3, 217, 174, 28, 3, - 217, 103, 28, 3, 217, 141, 28, 3, 217, 173, 28, 3, 217, 160, 28, 3, 217, - 161, 28, 3, 217, 122, 28, 3, 217, 95, 28, 3, 250, 215, 28, 3, 250, 129, - 28, 3, 250, 170, 28, 3, 250, 214, 28, 3, 250, 187, 28, 3, 250, 190, 28, - 3, 250, 146, 28, 3, 250, 118, 28, 3, 226, 59, 28, 3, 226, 26, 28, 3, 226, - 45, 28, 3, 226, 58, 28, 3, 226, 47, 28, 3, 226, 48, 28, 3, 226, 33, 28, - 3, 226, 22, 28, 3, 216, 154, 28, 3, 216, 135, 28, 3, 216, 138, 28, 3, - 216, 153, 28, 3, 216, 148, 28, 3, 216, 149, 28, 3, 216, 137, 28, 3, 216, - 133, 28, 3, 216, 12, 28, 3, 216, 4, 28, 3, 216, 8, 28, 3, 216, 11, 28, 3, - 216, 9, 28, 3, 216, 10, 28, 3, 216, 6, 28, 3, 216, 5, 28, 3, 245, 29, 28, - 3, 244, 69, 28, 3, 244, 210, 28, 3, 245, 28, 28, 3, 244, 236, 28, 3, 244, - 243, 28, 3, 244, 132, 28, 3, 244, 52, 28, 3, 195, 28, 3, 225, 71, 28, 3, - 226, 20, 28, 3, 226, 251, 28, 3, 226, 122, 28, 3, 226, 132, 28, 3, 225, - 186, 28, 3, 225, 37, 28, 3, 223, 36, 28, 3, 230, 172, 28, 3, 244, 46, 28, - 38, 243, 149, 22, 30, 233, 145, 79, 28, 38, 30, 233, 145, 79, 28, 38, - 243, 149, 79, 28, 222, 115, 79, 28, 213, 198, 28, 244, 64, 219, 83, 28, - 250, 23, 28, 221, 93, 28, 250, 30, 28, 225, 115, 250, 30, 28, 224, 193, - 79, 28, 226, 180, 221, 80, 28, 21, 118, 28, 21, 112, 28, 21, 170, 28, 21, - 167, 28, 21, 185, 28, 21, 192, 28, 21, 200, 28, 21, 198, 28, 21, 203, 28, - 51, 217, 213, 28, 51, 216, 45, 28, 51, 217, 128, 28, 51, 244, 104, 28, - 51, 244, 203, 28, 51, 220, 58, 28, 51, 221, 60, 28, 51, 246, 6, 28, 51, - 229, 90, 28, 51, 241, 62, 28, 51, 217, 214, 217, 113, 28, 3, 222, 119, - 230, 183, 28, 3, 230, 179, 28, 3, 230, 180, 28, 3, 230, 181, 28, 3, 222, - 119, 251, 137, 28, 3, 251, 134, 28, 3, 251, 135, 28, 3, 251, 136, 28, 3, - 222, 119, 244, 52, 28, 3, 244, 48, 28, 3, 244, 49, 28, 3, 244, 50, 28, 3, - 222, 119, 225, 37, 28, 3, 225, 33, 28, 3, 225, 34, 28, 3, 225, 35, 28, - 216, 255, 156, 212, 239, 28, 216, 255, 156, 248, 113, 28, 216, 255, 156, - 223, 169, 28, 216, 255, 156, 220, 196, 223, 169, 28, 216, 255, 156, 248, - 52, 28, 216, 255, 156, 235, 26, 28, 216, 255, 156, 250, 154, 28, 216, - 255, 156, 242, 25, 28, 216, 255, 156, 248, 112, 28, 216, 255, 156, 234, - 58, 164, 1, 63, 164, 1, 77, 164, 1, 75, 164, 1, 78, 164, 1, 72, 164, 1, - 211, 211, 164, 1, 243, 230, 164, 1, 183, 164, 1, 243, 158, 164, 1, 243, - 54, 164, 1, 243, 14, 164, 1, 242, 213, 164, 1, 242, 181, 164, 1, 162, - 164, 1, 242, 85, 164, 1, 242, 28, 164, 1, 241, 173, 164, 1, 241, 74, 164, - 1, 241, 54, 164, 1, 233, 255, 164, 1, 233, 180, 164, 1, 233, 111, 164, 1, - 233, 26, 164, 1, 232, 230, 164, 1, 232, 203, 164, 1, 191, 164, 1, 231, - 226, 164, 1, 231, 112, 164, 1, 231, 45, 164, 1, 230, 242, 164, 1, 207, - 164, 1, 241, 195, 164, 1, 230, 100, 164, 1, 229, 254, 164, 1, 229, 128, - 164, 1, 228, 228, 164, 1, 228, 135, 164, 1, 228, 75, 164, 1, 224, 209, - 164, 1, 224, 196, 164, 1, 224, 189, 164, 1, 224, 181, 164, 1, 224, 170, - 164, 1, 224, 168, 164, 1, 222, 227, 164, 1, 196, 164, 1, 222, 123, 164, - 1, 220, 136, 164, 1, 220, 5, 164, 1, 219, 41, 164, 1, 218, 217, 164, 1, - 249, 30, 164, 1, 218, 66, 164, 1, 248, 162, 164, 1, 217, 242, 164, 1, - 248, 76, 164, 1, 217, 84, 164, 1, 247, 220, 164, 1, 246, 154, 164, 1, - 246, 126, 164, 1, 247, 229, 164, 1, 217, 26, 164, 1, 217, 25, 164, 1, - 217, 15, 164, 1, 217, 14, 164, 1, 217, 13, 164, 1, 217, 12, 164, 1, 216, - 154, 164, 1, 216, 149, 164, 1, 216, 138, 164, 1, 216, 137, 164, 1, 216, - 135, 164, 1, 216, 134, 164, 1, 214, 52, 164, 1, 214, 9, 164, 1, 213, 238, - 164, 1, 213, 217, 164, 1, 213, 186, 164, 1, 213, 174, 164, 1, 189, 164, - 1, 213, 39, 164, 1, 213, 0, 164, 1, 212, 236, 164, 1, 212, 204, 164, 1, - 212, 169, 18, 19, 241, 21, 18, 19, 77, 18, 19, 255, 68, 18, 19, 75, 18, - 19, 236, 145, 18, 19, 78, 18, 19, 227, 86, 18, 19, 213, 107, 227, 86, 18, - 19, 70, 246, 30, 18, 19, 70, 75, 18, 19, 63, 18, 19, 255, 104, 18, 19, - 214, 9, 18, 19, 153, 214, 9, 18, 19, 213, 238, 18, 19, 153, 213, 238, 18, - 19, 213, 230, 18, 19, 153, 213, 230, 18, 19, 213, 217, 18, 19, 153, 213, - 217, 18, 19, 213, 205, 18, 19, 153, 213, 205, 18, 19, 230, 79, 213, 205, - 18, 19, 214, 52, 18, 19, 153, 214, 52, 18, 19, 214, 51, 18, 19, 153, 214, - 51, 18, 19, 230, 79, 214, 51, 18, 19, 254, 236, 18, 19, 213, 107, 214, - 85, 18, 19, 243, 20, 219, 83, 18, 19, 41, 138, 18, 19, 41, 209, 18, 19, - 41, 251, 226, 157, 223, 164, 18, 19, 41, 216, 240, 157, 223, 164, 18, 19, - 41, 47, 157, 223, 164, 18, 19, 41, 223, 164, 18, 19, 41, 52, 138, 18, 19, - 41, 52, 220, 196, 66, 219, 46, 18, 19, 41, 231, 107, 247, 195, 18, 19, - 41, 220, 196, 201, 91, 18, 19, 41, 225, 192, 18, 19, 41, 121, 218, 50, - 18, 19, 245, 229, 18, 19, 236, 112, 18, 19, 227, 99, 18, 19, 254, 159, - 18, 19, 226, 132, 18, 19, 226, 249, 18, 19, 226, 20, 18, 19, 225, 239, - 18, 19, 225, 186, 18, 19, 225, 165, 18, 19, 213, 107, 225, 165, 18, 19, - 70, 242, 67, 18, 19, 70, 242, 28, 18, 19, 195, 18, 19, 226, 251, 18, 19, - 225, 35, 18, 19, 153, 225, 35, 18, 19, 225, 33, 18, 19, 153, 225, 33, 18, - 19, 225, 32, 18, 19, 153, 225, 32, 18, 19, 225, 30, 18, 19, 153, 225, 30, - 18, 19, 225, 29, 18, 19, 153, 225, 29, 18, 19, 225, 37, 18, 19, 153, 225, - 37, 18, 19, 225, 36, 18, 19, 153, 225, 36, 18, 19, 213, 107, 225, 36, 18, - 19, 227, 11, 18, 19, 153, 227, 11, 18, 19, 70, 242, 162, 18, 19, 217, - 242, 18, 19, 218, 61, 18, 19, 217, 84, 18, 19, 217, 70, 18, 19, 109, 18, - 19, 216, 243, 18, 19, 213, 107, 216, 243, 18, 19, 70, 248, 149, 18, 19, - 70, 248, 76, 18, 19, 218, 66, 18, 19, 218, 63, 18, 19, 216, 50, 18, 19, - 153, 216, 50, 18, 19, 216, 34, 18, 19, 153, 216, 34, 18, 19, 216, 33, 18, - 19, 153, 216, 33, 18, 19, 112, 18, 19, 153, 112, 18, 19, 216, 27, 18, 19, - 153, 216, 27, 18, 19, 216, 52, 18, 19, 153, 216, 52, 18, 19, 216, 51, 18, - 19, 153, 216, 51, 18, 19, 230, 79, 216, 51, 18, 19, 218, 113, 18, 19, - 216, 123, 18, 19, 216, 107, 18, 19, 216, 105, 18, 19, 216, 128, 18, 19, - 235, 44, 18, 19, 235, 125, 18, 19, 234, 212, 18, 19, 234, 203, 18, 19, - 234, 148, 18, 19, 234, 130, 18, 19, 213, 107, 234, 130, 18, 19, 183, 18, - 19, 235, 128, 18, 19, 234, 42, 18, 19, 153, 234, 42, 18, 19, 234, 40, 18, - 19, 153, 234, 40, 18, 19, 234, 39, 18, 19, 153, 234, 39, 18, 19, 234, 38, - 18, 19, 153, 234, 38, 18, 19, 234, 37, 18, 19, 153, 234, 37, 18, 19, 234, - 46, 18, 19, 153, 234, 46, 18, 19, 234, 45, 18, 19, 153, 234, 45, 18, 19, - 230, 79, 234, 45, 18, 19, 235, 141, 18, 19, 234, 47, 18, 19, 219, 233, - 235, 38, 18, 19, 219, 233, 234, 204, 18, 19, 219, 233, 234, 143, 18, 19, - 219, 233, 235, 110, 18, 19, 250, 247, 18, 19, 251, 86, 18, 19, 250, 111, - 18, 19, 250, 101, 18, 19, 250, 42, 18, 19, 249, 236, 18, 19, 213, 107, - 249, 236, 18, 19, 251, 88, 18, 19, 251, 87, 18, 19, 249, 144, 18, 19, - 153, 249, 144, 18, 19, 249, 142, 18, 19, 153, 249, 142, 18, 19, 249, 141, - 18, 19, 153, 249, 141, 18, 19, 249, 140, 18, 19, 153, 249, 140, 18, 19, - 249, 139, 18, 19, 153, 249, 139, 18, 19, 249, 146, 18, 19, 153, 249, 146, - 18, 19, 249, 145, 18, 19, 153, 249, 145, 18, 19, 230, 79, 249, 145, 18, - 19, 251, 121, 18, 19, 222, 150, 217, 176, 18, 19, 231, 226, 18, 19, 232, - 113, 18, 19, 231, 112, 18, 19, 231, 84, 18, 19, 231, 45, 18, 19, 231, 16, - 18, 19, 213, 107, 231, 16, 18, 19, 191, 18, 19, 232, 114, 18, 19, 230, - 181, 18, 19, 153, 230, 181, 18, 19, 230, 179, 18, 19, 153, 230, 179, 18, - 19, 230, 178, 18, 19, 153, 230, 178, 18, 19, 230, 177, 18, 19, 153, 230, - 177, 18, 19, 230, 176, 18, 19, 153, 230, 176, 18, 19, 230, 183, 18, 19, - 153, 230, 183, 18, 19, 230, 182, 18, 19, 153, 230, 182, 18, 19, 230, 79, - 230, 182, 18, 19, 184, 18, 19, 153, 184, 18, 19, 231, 115, 18, 19, 253, - 248, 184, 18, 19, 222, 150, 184, 18, 19, 229, 254, 18, 19, 230, 111, 18, - 19, 229, 128, 18, 19, 229, 103, 18, 19, 228, 228, 18, 19, 228, 218, 18, - 19, 213, 107, 228, 218, 18, 19, 207, 18, 19, 230, 112, 18, 19, 228, 71, - 18, 19, 153, 228, 71, 18, 19, 228, 73, 18, 19, 153, 228, 73, 18, 19, 228, - 72, 18, 19, 153, 228, 72, 18, 19, 230, 79, 228, 72, 18, 19, 206, 18, 19, - 70, 229, 228, 18, 19, 229, 133, 18, 19, 233, 180, 18, 19, 233, 253, 18, - 19, 233, 111, 18, 19, 233, 97, 18, 19, 233, 26, 18, 19, 232, 254, 18, 19, - 213, 107, 232, 254, 18, 19, 233, 255, 18, 19, 233, 254, 18, 19, 232, 200, - 18, 19, 153, 232, 200, 18, 19, 232, 199, 18, 19, 153, 232, 199, 18, 19, - 232, 198, 18, 19, 153, 232, 198, 18, 19, 232, 197, 18, 19, 153, 232, 197, - 18, 19, 232, 196, 18, 19, 153, 232, 196, 18, 19, 232, 202, 18, 19, 153, - 232, 202, 18, 19, 232, 201, 18, 19, 153, 232, 201, 18, 19, 155, 18, 19, - 153, 155, 18, 19, 144, 155, 18, 19, 222, 123, 18, 19, 222, 223, 18, 19, - 220, 136, 18, 19, 220, 120, 18, 19, 220, 5, 18, 19, 219, 245, 18, 19, - 213, 107, 219, 245, 18, 19, 222, 227, 18, 19, 222, 225, 18, 19, 218, 208, - 18, 19, 153, 218, 208, 18, 19, 218, 202, 18, 19, 153, 218, 202, 18, 19, - 218, 201, 18, 19, 153, 218, 201, 18, 19, 218, 197, 18, 19, 153, 218, 197, - 18, 19, 218, 196, 18, 19, 153, 218, 196, 18, 19, 218, 212, 18, 19, 153, - 218, 212, 18, 19, 218, 211, 18, 19, 153, 218, 211, 18, 19, 230, 79, 218, - 211, 18, 19, 196, 18, 19, 253, 248, 196, 18, 19, 218, 213, 18, 19, 252, - 10, 196, 18, 19, 231, 11, 220, 55, 18, 19, 230, 79, 220, 46, 18, 19, 230, - 79, 223, 27, 18, 19, 230, 79, 219, 186, 18, 19, 230, 79, 219, 43, 18, 19, - 230, 79, 220, 45, 18, 19, 230, 79, 222, 126, 18, 19, 221, 8, 18, 19, 220, - 233, 18, 19, 220, 228, 18, 19, 220, 208, 18, 19, 220, 202, 18, 19, 221, - 47, 18, 19, 221, 43, 18, 19, 220, 151, 18, 19, 153, 220, 151, 18, 19, - 220, 150, 18, 19, 153, 220, 150, 18, 19, 220, 149, 18, 19, 153, 220, 149, - 18, 19, 220, 148, 18, 19, 153, 220, 148, 18, 19, 220, 147, 18, 19, 153, - 220, 147, 18, 19, 220, 153, 18, 19, 153, 220, 153, 18, 19, 220, 152, 18, - 19, 153, 220, 152, 18, 19, 221, 49, 18, 19, 213, 39, 18, 19, 213, 92, 18, - 19, 213, 0, 18, 19, 212, 247, 18, 19, 212, 236, 18, 19, 212, 221, 18, 19, - 213, 107, 212, 221, 18, 19, 189, 18, 19, 213, 94, 18, 19, 212, 166, 18, - 19, 153, 212, 166, 18, 19, 212, 165, 18, 19, 153, 212, 165, 18, 19, 212, - 164, 18, 19, 153, 212, 164, 18, 19, 212, 163, 18, 19, 153, 212, 163, 18, - 19, 212, 162, 18, 19, 153, 212, 162, 18, 19, 212, 168, 18, 19, 153, 212, - 168, 18, 19, 212, 167, 18, 19, 153, 212, 167, 18, 19, 230, 79, 212, 167, - 18, 19, 213, 108, 18, 19, 252, 52, 213, 108, 18, 19, 153, 213, 108, 18, - 19, 222, 150, 213, 0, 18, 19, 224, 55, 18, 19, 224, 147, 224, 55, 18, 19, - 153, 233, 180, 18, 19, 224, 108, 18, 19, 223, 222, 18, 19, 223, 170, 18, - 19, 223, 146, 18, 19, 223, 133, 18, 19, 153, 233, 26, 18, 19, 208, 18, - 19, 224, 109, 18, 19, 153, 233, 255, 18, 19, 223, 45, 18, 19, 153, 223, - 45, 18, 19, 152, 18, 19, 153, 152, 18, 19, 144, 152, 18, 19, 244, 243, - 18, 19, 245, 26, 18, 19, 244, 210, 18, 19, 244, 197, 18, 19, 244, 132, - 18, 19, 244, 123, 18, 19, 245, 29, 18, 19, 245, 28, 18, 19, 244, 51, 18, - 19, 153, 244, 51, 18, 19, 245, 95, 18, 19, 217, 161, 18, 19, 230, 165, - 217, 161, 18, 19, 217, 141, 18, 19, 230, 165, 217, 141, 18, 19, 217, 137, - 18, 19, 230, 165, 217, 137, 18, 19, 217, 122, 18, 19, 217, 119, 18, 19, - 217, 174, 18, 19, 217, 173, 18, 19, 217, 94, 18, 19, 153, 217, 94, 18, - 19, 217, 176, 18, 19, 216, 114, 18, 19, 216, 112, 18, 19, 216, 111, 18, - 19, 216, 116, 18, 19, 216, 117, 18, 19, 216, 25, 18, 19, 216, 24, 18, 19, - 216, 23, 18, 19, 216, 26, 18, 19, 228, 92, 242, 85, 18, 19, 228, 92, 242, - 28, 18, 19, 228, 92, 242, 10, 18, 19, 228, 92, 241, 173, 18, 19, 228, 92, - 241, 158, 18, 19, 228, 92, 162, 18, 19, 228, 92, 242, 148, 18, 19, 228, - 92, 242, 162, 18, 19, 228, 91, 242, 162, 18, 19, 242, 3, 18, 19, 225, 7, - 18, 19, 224, 233, 18, 19, 224, 228, 18, 19, 224, 222, 18, 19, 224, 217, - 18, 19, 225, 11, 18, 19, 225, 10, 18, 19, 225, 19, 18, 19, 217, 22, 18, - 19, 217, 20, 18, 19, 217, 19, 18, 19, 217, 23, 18, 19, 153, 224, 55, 18, - 19, 153, 223, 222, 18, 19, 153, 223, 146, 18, 19, 153, 208, 18, 19, 229, - 224, 18, 19, 229, 178, 18, 19, 229, 174, 18, 19, 229, 155, 18, 19, 229, - 150, 18, 19, 229, 226, 18, 19, 229, 225, 18, 19, 229, 228, 18, 19, 229, - 0, 18, 19, 222, 150, 221, 8, 18, 19, 222, 150, 220, 233, 18, 19, 222, - 150, 220, 208, 18, 19, 222, 150, 221, 47, 18, 19, 213, 203, 217, 161, 18, - 19, 213, 203, 217, 141, 18, 19, 213, 203, 217, 122, 18, 19, 213, 203, - 217, 174, 18, 19, 213, 203, 217, 176, 18, 19, 233, 117, 18, 19, 233, 116, - 18, 19, 233, 115, 18, 19, 233, 114, 18, 19, 233, 123, 18, 19, 233, 122, - 18, 19, 233, 124, 18, 19, 217, 175, 217, 161, 18, 19, 217, 175, 217, 141, - 18, 19, 217, 175, 217, 137, 18, 19, 217, 175, 217, 122, 18, 19, 217, 175, - 217, 119, 18, 19, 217, 175, 217, 174, 18, 19, 217, 175, 217, 173, 18, 19, - 217, 175, 217, 176, 18, 19, 254, 224, 253, 201, 18, 19, 252, 10, 77, 18, - 19, 252, 10, 75, 18, 19, 252, 10, 78, 18, 19, 252, 10, 63, 18, 19, 252, - 10, 214, 9, 18, 19, 252, 10, 213, 238, 18, 19, 252, 10, 213, 217, 18, 19, - 252, 10, 214, 52, 18, 19, 252, 10, 229, 254, 18, 19, 252, 10, 229, 128, - 18, 19, 252, 10, 228, 228, 18, 19, 252, 10, 207, 18, 19, 252, 10, 235, - 44, 18, 19, 252, 10, 234, 212, 18, 19, 252, 10, 234, 148, 18, 19, 252, - 10, 183, 18, 19, 222, 150, 242, 85, 18, 19, 222, 150, 242, 28, 18, 19, - 222, 150, 241, 173, 18, 19, 222, 150, 162, 18, 19, 70, 243, 60, 18, 19, - 70, 243, 64, 18, 19, 70, 243, 76, 18, 19, 70, 243, 75, 18, 19, 70, 243, - 65, 18, 19, 70, 243, 89, 18, 19, 70, 223, 77, 18, 19, 70, 223, 146, 18, - 19, 70, 224, 55, 18, 19, 70, 224, 35, 18, 19, 70, 223, 222, 18, 19, 70, - 208, 18, 19, 70, 213, 186, 18, 19, 70, 213, 217, 18, 19, 70, 214, 9, 18, - 19, 70, 214, 4, 18, 19, 70, 213, 238, 18, 19, 70, 214, 52, 18, 19, 70, - 241, 47, 18, 19, 70, 241, 48, 18, 19, 70, 241, 51, 18, 19, 70, 241, 50, - 18, 19, 70, 241, 49, 18, 19, 70, 241, 53, 18, 19, 70, 217, 103, 18, 19, - 70, 217, 122, 18, 19, 70, 217, 161, 18, 19, 70, 217, 160, 18, 19, 70, - 217, 141, 18, 19, 70, 217, 174, 18, 19, 70, 216, 95, 18, 19, 70, 216, - 105, 18, 19, 70, 216, 123, 18, 19, 70, 216, 122, 18, 19, 70, 216, 107, - 18, 19, 70, 216, 128, 18, 19, 70, 225, 71, 18, 19, 70, 225, 186, 18, 19, - 70, 226, 132, 18, 19, 70, 226, 122, 18, 19, 70, 226, 20, 18, 19, 70, 195, - 18, 19, 70, 227, 11, 18, 19, 70, 242, 213, 18, 19, 70, 243, 14, 18, 19, - 70, 243, 158, 18, 19, 70, 243, 151, 18, 19, 70, 243, 54, 18, 19, 70, 243, - 230, 18, 19, 70, 234, 219, 18, 19, 70, 234, 224, 18, 19, 70, 234, 237, - 18, 19, 70, 234, 236, 18, 19, 70, 234, 230, 18, 19, 70, 234, 250, 18, 19, - 70, 234, 161, 18, 19, 70, 234, 162, 18, 19, 70, 234, 165, 18, 19, 70, - 234, 164, 18, 19, 70, 234, 163, 18, 19, 70, 234, 166, 18, 19, 70, 234, - 167, 18, 19, 70, 228, 135, 18, 19, 70, 228, 228, 18, 19, 70, 229, 254, - 18, 19, 70, 229, 251, 18, 19, 70, 229, 128, 18, 19, 70, 207, 18, 19, 70, - 230, 242, 18, 19, 70, 231, 45, 18, 19, 70, 231, 226, 18, 19, 70, 231, - 215, 18, 19, 70, 231, 112, 18, 19, 70, 191, 18, 19, 70, 212, 204, 18, 19, - 70, 212, 236, 18, 19, 70, 213, 39, 18, 19, 70, 213, 36, 18, 19, 70, 213, - 0, 18, 19, 70, 189, 18, 19, 70, 235, 168, 18, 19, 222, 150, 235, 168, 18, - 19, 70, 235, 185, 18, 19, 70, 235, 242, 18, 19, 70, 235, 240, 18, 19, 70, - 235, 225, 18, 19, 222, 150, 235, 225, 18, 19, 70, 236, 0, 18, 19, 70, - 235, 198, 18, 19, 70, 235, 202, 18, 19, 70, 235, 212, 18, 19, 70, 235, - 211, 18, 19, 70, 235, 210, 18, 19, 70, 235, 213, 18, 19, 70, 232, 230, - 18, 19, 70, 233, 26, 18, 19, 70, 233, 180, 18, 19, 70, 233, 172, 18, 19, - 70, 233, 111, 18, 19, 70, 233, 255, 18, 19, 70, 247, 224, 18, 19, 70, - 247, 225, 18, 19, 70, 247, 228, 18, 19, 70, 247, 227, 18, 19, 70, 247, - 226, 18, 19, 70, 247, 229, 18, 19, 70, 233, 113, 18, 19, 70, 233, 115, - 18, 19, 70, 233, 119, 18, 19, 70, 233, 118, 18, 19, 70, 233, 117, 18, 19, - 70, 233, 123, 18, 19, 70, 217, 17, 18, 19, 70, 217, 19, 18, 19, 70, 217, - 22, 18, 19, 70, 217, 21, 18, 19, 70, 217, 20, 18, 19, 70, 217, 23, 18, - 19, 70, 217, 13, 18, 19, 70, 217, 14, 18, 19, 70, 217, 25, 18, 19, 70, - 217, 24, 18, 19, 70, 217, 15, 18, 19, 70, 217, 26, 18, 19, 70, 212, 8, - 18, 19, 70, 212, 16, 18, 19, 70, 212, 87, 18, 19, 70, 212, 85, 18, 19, - 70, 212, 37, 18, 19, 70, 212, 109, 18, 19, 70, 212, 152, 18, 19, 70, 73, - 212, 152, 18, 19, 70, 246, 104, 18, 19, 70, 246, 105, 18, 19, 70, 246, - 112, 18, 19, 70, 246, 111, 18, 19, 70, 246, 107, 18, 19, 70, 246, 114, - 18, 19, 70, 219, 41, 18, 19, 70, 220, 5, 18, 19, 70, 222, 123, 18, 19, - 70, 222, 112, 18, 19, 70, 220, 136, 18, 19, 70, 222, 227, 18, 19, 70, - 220, 170, 18, 19, 70, 220, 208, 18, 19, 70, 221, 8, 18, 19, 70, 221, 6, - 18, 19, 70, 220, 233, 18, 19, 70, 221, 47, 18, 19, 70, 221, 49, 18, 19, - 70, 216, 135, 18, 19, 70, 216, 137, 18, 19, 70, 216, 149, 18, 19, 70, - 216, 148, 18, 19, 70, 216, 138, 18, 19, 70, 216, 154, 18, 19, 70, 250, - 129, 18, 19, 70, 250, 146, 18, 19, 70, 250, 190, 18, 19, 70, 250, 187, - 18, 19, 70, 250, 170, 18, 19, 70, 250, 215, 18, 19, 70, 216, 98, 18, 19, - 70, 216, 99, 18, 19, 70, 216, 102, 18, 19, 70, 216, 101, 18, 19, 70, 216, - 100, 18, 19, 70, 216, 103, 18, 19, 250, 171, 53, 18, 19, 244, 64, 219, - 83, 18, 19, 225, 3, 18, 19, 229, 223, 18, 19, 228, 253, 18, 19, 228, 252, - 18, 19, 228, 251, 18, 19, 228, 250, 18, 19, 228, 255, 18, 19, 228, 254, - 18, 19, 213, 203, 217, 92, 18, 19, 213, 203, 217, 91, 18, 19, 213, 203, - 217, 90, 18, 19, 213, 203, 217, 89, 18, 19, 213, 203, 217, 88, 18, 19, - 213, 203, 217, 95, 18, 19, 213, 203, 217, 94, 18, 19, 213, 203, 41, 217, - 176, 18, 19, 252, 10, 214, 85, 227, 129, 219, 226, 79, 227, 129, 1, 252, - 94, 227, 129, 1, 232, 219, 227, 129, 1, 244, 240, 227, 129, 1, 222, 210, - 227, 129, 1, 229, 88, 227, 129, 1, 215, 201, 227, 129, 1, 249, 8, 227, - 129, 1, 217, 47, 227, 129, 1, 250, 33, 227, 129, 1, 250, 237, 227, 129, - 1, 230, 231, 227, 129, 1, 242, 252, 227, 129, 1, 229, 213, 227, 129, 1, - 219, 76, 227, 129, 1, 223, 72, 227, 129, 1, 254, 233, 227, 129, 1, 227, - 90, 227, 129, 1, 215, 127, 227, 129, 1, 246, 52, 227, 129, 1, 236, 47, - 227, 129, 1, 246, 53, 227, 129, 1, 227, 62, 227, 129, 1, 215, 182, 227, - 129, 1, 236, 151, 227, 129, 1, 246, 50, 227, 129, 1, 226, 113, 227, 129, - 244, 239, 79, 227, 129, 223, 236, 244, 239, 79, 172, 1, 244, 230, 244, - 222, 244, 244, 245, 95, 172, 1, 211, 211, 172, 1, 215, 112, 215, 128, 72, - 172, 1, 212, 206, 172, 1, 213, 108, 172, 1, 214, 85, 172, 1, 217, 97, - 217, 96, 217, 117, 172, 1, 245, 146, 172, 1, 254, 131, 63, 172, 1, 227, - 48, 78, 172, 1, 255, 49, 63, 172, 1, 255, 4, 172, 1, 233, 4, 78, 172, 1, - 220, 189, 78, 172, 1, 78, 172, 1, 227, 136, 172, 1, 227, 99, 172, 1, 224, - 90, 224, 102, 224, 22, 152, 172, 1, 235, 55, 172, 1, 250, 234, 172, 1, - 235, 56, 235, 141, 172, 1, 244, 41, 172, 1, 245, 217, 172, 1, 243, 154, - 242, 168, 244, 41, 172, 1, 243, 192, 172, 1, 213, 179, 213, 173, 214, 85, - 172, 1, 242, 140, 242, 162, 172, 1, 242, 144, 242, 162, 172, 1, 233, 6, - 242, 162, 172, 1, 220, 192, 242, 162, 172, 1, 230, 74, 228, 57, 230, 75, - 206, 172, 1, 220, 190, 206, 172, 1, 246, 190, 172, 1, 236, 27, 236, 31, - 236, 21, 75, 172, 1, 77, 172, 1, 235, 233, 236, 3, 172, 1, 243, 139, 172, - 1, 233, 7, 255, 20, 172, 1, 220, 194, 63, 172, 1, 236, 13, 245, 193, 172, - 1, 226, 76, 226, 97, 227, 11, 172, 1, 254, 199, 245, 192, 172, 1, 219, - 230, 196, 172, 1, 220, 124, 233, 3, 196, 172, 1, 220, 188, 196, 172, 1, - 251, 121, 172, 1, 212, 152, 172, 1, 217, 30, 217, 40, 216, 14, 218, 113, - 172, 1, 220, 187, 218, 113, 172, 1, 249, 125, 172, 1, 252, 78, 252, 81, - 252, 16, 253, 201, 172, 1, 220, 193, 253, 201, 172, 1, 246, 189, 172, 1, - 227, 74, 172, 1, 246, 18, 246, 20, 77, 172, 1, 232, 56, 232, 64, 184, - 172, 1, 233, 5, 184, 172, 1, 220, 191, 184, 172, 1, 233, 195, 233, 235, - 233, 14, 155, 172, 1, 246, 191, 172, 1, 236, 88, 172, 1, 236, 89, 172, 1, - 249, 19, 249, 24, 249, 125, 172, 1, 227, 44, 245, 145, 78, 172, 1, 246, - 48, 172, 1, 236, 46, 172, 1, 249, 143, 172, 1, 251, 73, 172, 1, 250, 246, - 172, 1, 219, 114, 172, 1, 233, 2, 172, 1, 220, 186, 172, 1, 240, 220, - 172, 1, 225, 19, 172, 1, 213, 169, 172, 220, 100, 225, 62, 172, 230, 225, - 225, 62, 172, 249, 194, 225, 62, 172, 254, 48, 88, 172, 216, 54, 88, 172, - 252, 93, 88, 218, 46, 1, 63, 218, 46, 1, 75, 218, 46, 1, 72, 218, 46, 1, - 183, 218, 46, 1, 243, 230, 218, 46, 1, 229, 226, 218, 46, 1, 218, 66, - 218, 46, 1, 249, 30, 218, 46, 1, 207, 218, 46, 1, 195, 218, 46, 1, 252, - 234, 218, 46, 1, 191, 218, 46, 1, 189, 218, 46, 1, 233, 255, 218, 46, 1, - 214, 52, 218, 46, 1, 222, 227, 218, 46, 1, 162, 218, 46, 30, 5, 75, 218, - 46, 30, 5, 72, 218, 46, 5, 214, 137, 242, 110, 1, 63, 242, 110, 1, 75, - 242, 110, 1, 72, 242, 110, 1, 183, 242, 110, 1, 243, 230, 242, 110, 1, - 229, 226, 242, 110, 1, 218, 66, 242, 110, 1, 249, 30, 242, 110, 1, 207, - 242, 110, 1, 195, 242, 110, 1, 252, 234, 242, 110, 1, 191, 242, 110, 1, - 189, 242, 110, 1, 208, 242, 110, 1, 233, 255, 242, 110, 1, 214, 52, 242, - 110, 1, 222, 227, 242, 110, 1, 162, 242, 110, 30, 5, 75, 242, 110, 30, 5, - 72, 242, 110, 5, 226, 213, 226, 38, 220, 100, 225, 62, 226, 38, 52, 225, - 62, 251, 174, 1, 63, 251, 174, 1, 75, 251, 174, 1, 72, 251, 174, 1, 183, - 251, 174, 1, 243, 230, 251, 174, 1, 229, 226, 251, 174, 1, 218, 66, 251, - 174, 1, 249, 30, 251, 174, 1, 207, 251, 174, 1, 195, 251, 174, 1, 252, - 234, 251, 174, 1, 191, 251, 174, 1, 189, 251, 174, 1, 208, 251, 174, 1, - 233, 255, 251, 174, 1, 214, 52, 251, 174, 1, 222, 227, 251, 174, 1, 162, - 251, 174, 30, 5, 75, 251, 174, 30, 5, 72, 218, 45, 1, 63, 218, 45, 1, 75, - 218, 45, 1, 72, 218, 45, 1, 183, 218, 45, 1, 243, 230, 218, 45, 1, 229, - 226, 218, 45, 1, 218, 66, 218, 45, 1, 249, 30, 218, 45, 1, 207, 218, 45, - 1, 195, 218, 45, 1, 252, 234, 218, 45, 1, 191, 218, 45, 1, 189, 218, 45, - 1, 233, 255, 218, 45, 1, 214, 52, 218, 45, 1, 222, 227, 218, 45, 30, 5, - 75, 218, 45, 30, 5, 72, 67, 1, 183, 67, 1, 234, 250, 67, 1, 234, 148, 67, - 1, 234, 224, 67, 1, 229, 155, 67, 1, 251, 88, 67, 1, 250, 215, 67, 1, - 250, 42, 67, 1, 250, 146, 67, 1, 228, 35, 67, 1, 249, 30, 67, 1, 216, - 116, 67, 1, 247, 220, 67, 1, 216, 111, 67, 1, 228, 234, 67, 1, 218, 66, - 67, 1, 217, 174, 67, 1, 109, 67, 1, 217, 122, 67, 1, 228, 228, 67, 1, - 252, 234, 67, 1, 226, 59, 67, 1, 225, 186, 67, 1, 226, 33, 67, 1, 231, - 45, 67, 1, 212, 236, 67, 1, 223, 146, 67, 1, 233, 26, 67, 1, 214, 123, - 67, 1, 221, 47, 67, 1, 219, 137, 67, 1, 222, 227, 67, 1, 162, 67, 1, 233, - 255, 67, 1, 225, 11, 67, 236, 101, 30, 224, 253, 67, 236, 101, 30, 225, - 10, 67, 236, 101, 30, 224, 233, 67, 236, 101, 30, 224, 228, 67, 236, 101, - 30, 224, 210, 67, 236, 101, 30, 224, 182, 67, 236, 101, 30, 224, 170, 67, - 236, 101, 30, 224, 169, 67, 236, 101, 30, 223, 37, 67, 236, 101, 30, 223, - 30, 67, 236, 101, 30, 232, 194, 67, 236, 101, 30, 232, 185, 67, 236, 101, - 30, 224, 248, 67, 236, 101, 30, 225, 3, 67, 236, 101, 30, 224, 218, 216, - 22, 118, 67, 236, 101, 30, 224, 218, 216, 22, 112, 67, 236, 101, 30, 224, - 249, 67, 30, 236, 87, 254, 86, 67, 30, 236, 87, 255, 104, 67, 30, 5, 255, - 104, 67, 30, 5, 75, 67, 30, 5, 236, 145, 67, 30, 5, 213, 108, 67, 30, 5, - 212, 161, 67, 30, 5, 72, 67, 30, 5, 215, 98, 67, 30, 5, 215, 202, 67, 30, - 5, 227, 136, 67, 30, 5, 189, 67, 30, 5, 236, 172, 67, 30, 5, 77, 67, 30, - 5, 255, 20, 67, 30, 5, 254, 236, 67, 30, 5, 227, 86, 67, 30, 5, 253, 235, - 67, 5, 229, 101, 67, 5, 224, 53, 67, 5, 212, 172, 67, 5, 230, 192, 67, 5, - 216, 184, 67, 5, 252, 189, 67, 5, 223, 141, 67, 5, 217, 8, 67, 5, 235, - 103, 67, 5, 254, 238, 67, 5, 222, 184, 222, 178, 67, 5, 214, 134, 67, 5, - 250, 36, 67, 5, 252, 163, 67, 5, 234, 243, 67, 5, 252, 183, 67, 5, 251, - 65, 225, 240, 234, 51, 67, 5, 233, 152, 216, 243, 67, 5, 252, 67, 67, 5, - 226, 35, 230, 239, 67, 5, 234, 129, 67, 249, 162, 16, 223, 215, 67, 5, - 253, 217, 67, 5, 253, 238, 67, 21, 212, 79, 67, 21, 118, 67, 21, 112, 67, - 21, 170, 67, 21, 167, 67, 21, 185, 67, 21, 192, 67, 21, 200, 67, 21, 198, - 67, 21, 203, 67, 16, 233, 152, 253, 240, 219, 248, 67, 16, 233, 152, 253, - 240, 230, 211, 67, 16, 233, 152, 253, 240, 225, 239, 67, 16, 233, 152, - 253, 240, 252, 95, 67, 16, 233, 152, 253, 240, 251, 157, 67, 16, 233, - 152, 253, 240, 225, 131, 67, 16, 233, 152, 253, 240, 225, 125, 67, 16, - 233, 152, 253, 240, 225, 123, 67, 16, 233, 152, 253, 240, 225, 129, 67, - 16, 233, 152, 253, 240, 225, 127, 83, 252, 28, 83, 245, 241, 83, 250, 23, - 83, 244, 64, 219, 83, 83, 250, 30, 83, 244, 101, 247, 193, 83, 217, 7, - 219, 255, 241, 21, 83, 220, 135, 3, 251, 223, 232, 32, 83, 232, 61, 250, - 23, 83, 232, 61, 244, 64, 219, 83, 83, 229, 86, 83, 244, 87, 44, 222, - 100, 118, 83, 244, 87, 44, 222, 100, 112, 83, 244, 87, 44, 222, 100, 170, - 83, 30, 221, 80, 83, 21, 212, 79, 83, 21, 118, 83, 21, 112, 83, 21, 170, - 83, 21, 167, 83, 21, 185, 83, 21, 192, 83, 21, 200, 83, 21, 198, 83, 21, - 203, 83, 1, 63, 83, 1, 77, 83, 1, 75, 83, 1, 78, 83, 1, 72, 83, 1, 227, - 136, 83, 1, 215, 189, 83, 1, 246, 30, 83, 1, 207, 83, 1, 254, 151, 83, 1, - 252, 234, 83, 1, 195, 83, 1, 225, 11, 83, 1, 243, 230, 83, 1, 191, 83, 1, - 233, 255, 83, 1, 222, 227, 83, 1, 221, 47, 83, 1, 218, 66, 83, 1, 249, - 30, 83, 1, 250, 215, 83, 1, 236, 0, 83, 1, 189, 83, 1, 208, 83, 1, 214, - 52, 83, 1, 245, 29, 83, 1, 183, 83, 1, 234, 250, 83, 1, 216, 154, 83, 1, - 212, 109, 83, 1, 242, 148, 83, 1, 212, 9, 83, 1, 233, 123, 83, 1, 212, - 62, 83, 1, 250, 170, 83, 1, 217, 7, 187, 30, 53, 83, 1, 217, 7, 77, 83, - 1, 217, 7, 75, 83, 1, 217, 7, 78, 83, 1, 217, 7, 72, 83, 1, 217, 7, 227, - 136, 83, 1, 217, 7, 215, 189, 83, 1, 217, 7, 254, 151, 83, 1, 217, 7, - 252, 234, 83, 1, 217, 7, 195, 83, 1, 217, 7, 225, 11, 83, 1, 217, 7, 243, - 230, 83, 1, 217, 7, 191, 83, 1, 217, 7, 218, 66, 83, 1, 217, 7, 249, 30, - 83, 1, 217, 7, 250, 215, 83, 1, 217, 7, 236, 0, 83, 1, 217, 7, 216, 154, - 83, 1, 217, 7, 189, 83, 1, 217, 7, 214, 52, 83, 1, 217, 7, 183, 83, 1, - 217, 7, 243, 227, 83, 1, 217, 7, 242, 148, 83, 1, 217, 7, 235, 224, 83, - 1, 217, 7, 229, 126, 83, 1, 217, 7, 246, 114, 83, 1, 220, 135, 77, 83, 1, - 220, 135, 75, 83, 1, 220, 135, 236, 11, 83, 1, 220, 135, 215, 189, 83, 1, - 220, 135, 72, 83, 1, 220, 135, 254, 151, 83, 1, 220, 135, 183, 83, 1, - 220, 135, 243, 230, 83, 1, 220, 135, 162, 83, 1, 220, 135, 195, 83, 1, - 220, 135, 221, 47, 83, 1, 220, 135, 218, 66, 83, 1, 220, 135, 249, 30, - 83, 1, 220, 135, 236, 0, 83, 1, 220, 135, 245, 29, 83, 1, 220, 135, 243, - 227, 83, 1, 220, 135, 242, 148, 83, 1, 220, 135, 216, 154, 83, 1, 220, - 135, 212, 109, 83, 1, 220, 135, 224, 109, 83, 1, 220, 135, 250, 215, 83, - 1, 220, 135, 212, 75, 83, 1, 232, 61, 75, 83, 1, 232, 61, 183, 83, 1, - 232, 61, 208, 83, 1, 232, 61, 245, 29, 83, 1, 232, 61, 212, 75, 83, 1, - 254, 198, 243, 212, 254, 114, 118, 83, 1, 254, 198, 243, 212, 214, 133, - 118, 83, 1, 254, 198, 243, 212, 248, 253, 83, 1, 254, 198, 243, 212, 215, - 199, 83, 1, 254, 198, 243, 212, 236, 52, 215, 199, 83, 1, 254, 198, 243, - 212, 252, 201, 83, 1, 254, 198, 243, 212, 137, 252, 201, 83, 1, 254, 198, - 243, 212, 63, 83, 1, 254, 198, 243, 212, 75, 83, 1, 254, 198, 243, 212, - 183, 83, 1, 254, 198, 243, 212, 229, 226, 83, 1, 254, 198, 243, 212, 251, - 88, 83, 1, 254, 198, 243, 212, 216, 128, 83, 1, 254, 198, 243, 212, 216, - 116, 83, 1, 254, 198, 243, 212, 248, 207, 83, 1, 254, 198, 243, 212, 229, - 6, 83, 1, 254, 198, 243, 212, 218, 66, 83, 1, 254, 198, 243, 212, 249, - 30, 83, 1, 254, 198, 243, 212, 195, 83, 1, 254, 198, 243, 212, 226, 59, - 83, 1, 254, 198, 243, 212, 219, 176, 83, 1, 254, 198, 243, 212, 212, 75, - 83, 1, 254, 198, 243, 212, 212, 109, 83, 1, 254, 198, 243, 212, 254, 242, - 83, 1, 217, 7, 254, 198, 243, 212, 218, 66, 83, 1, 217, 7, 254, 198, 243, - 212, 212, 75, 83, 1, 232, 61, 254, 198, 243, 212, 243, 89, 83, 1, 232, - 61, 254, 198, 243, 212, 229, 226, 83, 1, 232, 61, 254, 198, 243, 212, - 251, 88, 83, 1, 232, 61, 254, 198, 243, 212, 235, 230, 83, 1, 232, 61, - 254, 198, 243, 212, 216, 128, 83, 1, 232, 61, 254, 198, 243, 212, 248, - 191, 83, 1, 232, 61, 254, 198, 243, 212, 218, 66, 83, 1, 232, 61, 254, - 198, 243, 212, 248, 97, 83, 1, 232, 61, 254, 198, 243, 212, 219, 176, 83, - 1, 232, 61, 254, 198, 243, 212, 249, 137, 83, 1, 232, 61, 254, 198, 243, - 212, 212, 75, 83, 1, 232, 61, 254, 198, 243, 212, 212, 109, 83, 1, 254, - 198, 243, 212, 157, 72, 83, 1, 254, 198, 243, 212, 157, 189, 83, 1, 232, - 61, 254, 198, 243, 212, 252, 65, 83, 1, 254, 198, 243, 212, 249, 20, 83, - 1, 232, 61, 254, 198, 243, 212, 233, 123, 18, 19, 227, 15, 18, 19, 253, - 210, 18, 19, 255, 60, 18, 19, 214, 12, 18, 19, 225, 137, 18, 19, 226, - 139, 18, 19, 225, 28, 18, 19, 217, 251, 18, 19, 235, 51, 18, 19, 234, 43, - 18, 19, 232, 10, 18, 19, 228, 191, 18, 19, 230, 70, 18, 19, 233, 190, 18, - 19, 219, 228, 18, 19, 222, 152, 18, 19, 220, 177, 18, 19, 221, 11, 18, - 19, 220, 146, 18, 19, 212, 212, 18, 19, 213, 44, 18, 19, 224, 61, 18, 19, - 228, 70, 18, 19, 227, 119, 228, 70, 18, 19, 228, 69, 18, 19, 227, 119, - 228, 69, 18, 19, 228, 68, 18, 19, 227, 119, 228, 68, 18, 19, 228, 67, 18, - 19, 227, 119, 228, 67, 18, 19, 223, 42, 18, 19, 223, 41, 18, 19, 223, 40, - 18, 19, 223, 39, 18, 19, 223, 38, 18, 19, 223, 46, 18, 19, 227, 119, 227, - 11, 18, 19, 227, 119, 218, 113, 18, 19, 227, 119, 235, 141, 18, 19, 227, - 119, 251, 121, 18, 19, 227, 119, 184, 18, 19, 227, 119, 206, 18, 19, 227, - 119, 196, 18, 19, 227, 119, 221, 49, 18, 19, 246, 40, 214, 85, 18, 19, - 213, 251, 214, 85, 18, 19, 41, 4, 223, 164, 18, 19, 41, 224, 83, 247, - 195, 18, 19, 224, 147, 223, 43, 18, 19, 153, 232, 254, 18, 19, 153, 233, - 254, 18, 19, 217, 93, 18, 19, 217, 95, 18, 19, 216, 108, 18, 19, 216, - 110, 18, 19, 216, 115, 18, 19, 217, 16, 18, 19, 217, 18, 18, 19, 222, - 150, 220, 151, 18, 19, 222, 150, 220, 202, 18, 19, 222, 150, 241, 158, - 18, 19, 70, 242, 175, 18, 19, 70, 248, 124, 243, 151, 18, 19, 70, 243, - 227, 18, 19, 70, 242, 180, 18, 19, 222, 150, 235, 151, 18, 19, 70, 235, - 149, 18, 19, 252, 114, 248, 124, 155, 18, 19, 252, 114, 248, 124, 152, - 18, 19, 70, 248, 119, 196, 233, 93, 214, 107, 233, 132, 233, 93, 1, 183, - 233, 93, 1, 234, 250, 233, 93, 1, 243, 230, 233, 93, 1, 243, 89, 233, 93, - 1, 229, 226, 233, 93, 1, 251, 88, 233, 93, 1, 250, 215, 233, 93, 1, 236, - 0, 233, 93, 1, 235, 230, 233, 93, 1, 213, 62, 233, 93, 1, 218, 66, 233, - 93, 1, 217, 174, 233, 93, 1, 249, 30, 233, 93, 1, 248, 97, 233, 93, 1, - 207, 233, 93, 1, 195, 233, 93, 1, 226, 59, 233, 93, 1, 252, 234, 233, 93, - 1, 252, 65, 233, 93, 1, 191, 233, 93, 1, 189, 233, 93, 1, 208, 233, 93, - 1, 233, 255, 233, 93, 1, 214, 52, 233, 93, 1, 221, 47, 233, 93, 1, 219, - 176, 233, 93, 1, 222, 227, 233, 93, 1, 162, 233, 93, 30, 5, 63, 233, 93, - 30, 5, 75, 233, 93, 30, 5, 72, 233, 93, 30, 5, 246, 30, 233, 93, 30, 5, - 254, 236, 233, 93, 30, 5, 227, 86, 233, 93, 30, 5, 253, 235, 233, 93, 30, - 5, 77, 233, 93, 30, 5, 78, 233, 93, 219, 32, 1, 189, 233, 93, 219, 32, 1, - 208, 233, 93, 219, 32, 1, 214, 52, 233, 93, 4, 1, 183, 233, 93, 4, 1, - 229, 226, 233, 93, 4, 1, 254, 113, 233, 93, 4, 1, 218, 66, 233, 93, 4, 1, - 207, 233, 93, 4, 1, 195, 233, 93, 4, 1, 191, 233, 93, 4, 1, 208, 233, 93, - 4, 1, 233, 255, 233, 93, 5, 230, 229, 233, 93, 5, 235, 33, 233, 93, 5, - 222, 226, 233, 93, 5, 232, 254, 233, 93, 245, 119, 79, 233, 93, 224, 193, - 79, 233, 93, 21, 212, 79, 233, 93, 21, 118, 233, 93, 21, 112, 233, 93, - 21, 170, 233, 93, 21, 167, 233, 93, 21, 185, 233, 93, 21, 192, 233, 93, - 21, 200, 233, 93, 21, 198, 233, 93, 21, 203, 39, 233, 181, 1, 183, 39, - 233, 181, 1, 213, 156, 39, 233, 181, 1, 229, 226, 39, 233, 181, 1, 216, - 154, 39, 233, 181, 1, 222, 227, 39, 233, 181, 1, 189, 39, 233, 181, 1, - 218, 66, 39, 233, 181, 1, 217, 174, 39, 233, 181, 1, 233, 255, 39, 233, - 181, 1, 195, 39, 233, 181, 1, 226, 59, 39, 233, 181, 1, 191, 39, 233, - 181, 1, 245, 29, 39, 233, 181, 1, 215, 8, 39, 233, 181, 1, 162, 39, 233, - 181, 1, 225, 11, 39, 233, 181, 1, 234, 250, 39, 233, 181, 1, 216, 146, - 39, 233, 181, 1, 207, 39, 233, 181, 1, 63, 39, 233, 181, 1, 75, 39, 233, - 181, 1, 246, 30, 39, 233, 181, 1, 246, 19, 39, 233, 181, 1, 72, 39, 233, - 181, 1, 227, 86, 39, 233, 181, 1, 78, 39, 233, 181, 1, 215, 189, 39, 233, - 181, 1, 77, 39, 233, 181, 1, 253, 233, 39, 233, 181, 1, 254, 236, 39, - 233, 181, 1, 216, 252, 39, 233, 181, 1, 216, 251, 39, 233, 181, 1, 216, - 250, 39, 233, 181, 1, 216, 249, 39, 233, 181, 1, 216, 248, 163, 39, 169, - 1, 127, 225, 11, 163, 39, 169, 1, 117, 225, 11, 163, 39, 169, 1, 127, - 183, 163, 39, 169, 1, 127, 213, 156, 163, 39, 169, 1, 127, 229, 226, 163, - 39, 169, 1, 117, 183, 163, 39, 169, 1, 117, 213, 156, 163, 39, 169, 1, - 117, 229, 226, 163, 39, 169, 1, 127, 216, 154, 163, 39, 169, 1, 127, 222, - 227, 163, 39, 169, 1, 127, 189, 163, 39, 169, 1, 117, 216, 154, 163, 39, - 169, 1, 117, 222, 227, 163, 39, 169, 1, 117, 189, 163, 39, 169, 1, 127, - 218, 66, 163, 39, 169, 1, 127, 217, 174, 163, 39, 169, 1, 127, 207, 163, - 39, 169, 1, 117, 218, 66, 163, 39, 169, 1, 117, 217, 174, 163, 39, 169, - 1, 117, 207, 163, 39, 169, 1, 127, 195, 163, 39, 169, 1, 127, 226, 59, - 163, 39, 169, 1, 127, 191, 163, 39, 169, 1, 117, 195, 163, 39, 169, 1, - 117, 226, 59, 163, 39, 169, 1, 117, 191, 163, 39, 169, 1, 127, 245, 29, - 163, 39, 169, 1, 127, 215, 8, 163, 39, 169, 1, 127, 233, 255, 163, 39, - 169, 1, 117, 245, 29, 163, 39, 169, 1, 117, 215, 8, 163, 39, 169, 1, 117, - 233, 255, 163, 39, 169, 1, 127, 162, 163, 39, 169, 1, 127, 249, 30, 163, - 39, 169, 1, 127, 252, 234, 163, 39, 169, 1, 117, 162, 163, 39, 169, 1, - 117, 249, 30, 163, 39, 169, 1, 117, 252, 234, 163, 39, 169, 1, 127, 234, - 48, 163, 39, 169, 1, 127, 213, 129, 163, 39, 169, 1, 117, 234, 48, 163, - 39, 169, 1, 117, 213, 129, 163, 39, 169, 1, 127, 219, 40, 163, 39, 169, - 1, 117, 219, 40, 163, 39, 169, 30, 5, 30, 220, 184, 163, 39, 169, 30, 5, - 255, 104, 163, 39, 169, 30, 5, 236, 145, 163, 39, 169, 30, 5, 72, 163, - 39, 169, 30, 5, 215, 98, 163, 39, 169, 30, 5, 77, 163, 39, 169, 30, 5, - 255, 20, 163, 39, 169, 30, 5, 78, 163, 39, 169, 30, 5, 227, 157, 163, 39, - 169, 30, 5, 215, 189, 163, 39, 169, 30, 5, 253, 210, 163, 39, 169, 30, 5, - 255, 60, 163, 39, 169, 30, 5, 215, 91, 163, 39, 169, 30, 5, 227, 15, 163, - 39, 169, 30, 5, 227, 154, 163, 39, 169, 30, 5, 215, 186, 163, 39, 169, - 30, 5, 236, 11, 163, 39, 169, 1, 41, 211, 211, 163, 39, 169, 1, 41, 229, - 228, 163, 39, 169, 1, 41, 206, 163, 39, 169, 1, 41, 184, 163, 39, 169, 1, - 41, 235, 141, 163, 39, 169, 1, 41, 249, 125, 163, 39, 169, 1, 41, 253, - 201, 163, 39, 169, 161, 232, 36, 163, 39, 169, 161, 232, 35, 163, 39, - 169, 21, 212, 79, 163, 39, 169, 21, 118, 163, 39, 169, 21, 112, 163, 39, - 169, 21, 170, 163, 39, 169, 21, 167, 163, 39, 169, 21, 185, 163, 39, 169, - 21, 192, 163, 39, 169, 21, 200, 163, 39, 169, 21, 198, 163, 39, 169, 21, - 203, 163, 39, 169, 89, 21, 118, 163, 39, 169, 5, 233, 241, 163, 39, 169, - 5, 233, 240, 67, 16, 226, 146, 67, 16, 230, 212, 234, 145, 67, 16, 225, - 240, 234, 145, 67, 16, 252, 96, 234, 145, 67, 16, 251, 158, 234, 145, 67, - 16, 225, 132, 234, 145, 67, 16, 225, 126, 234, 145, 67, 16, 225, 124, - 234, 145, 67, 16, 225, 130, 234, 145, 67, 16, 225, 128, 234, 145, 67, 16, - 248, 240, 234, 145, 67, 16, 248, 236, 234, 145, 67, 16, 248, 235, 234, - 145, 67, 16, 248, 238, 234, 145, 67, 16, 248, 237, 234, 145, 67, 16, 248, - 234, 234, 145, 67, 16, 216, 59, 67, 16, 230, 212, 223, 140, 67, 16, 225, - 240, 223, 140, 67, 16, 252, 96, 223, 140, 67, 16, 251, 158, 223, 140, 67, - 16, 225, 132, 223, 140, 67, 16, 225, 126, 223, 140, 67, 16, 225, 124, - 223, 140, 67, 16, 225, 130, 223, 140, 67, 16, 225, 128, 223, 140, 67, 16, - 248, 240, 223, 140, 67, 16, 248, 236, 223, 140, 67, 16, 248, 235, 223, - 140, 67, 16, 248, 238, 223, 140, 67, 16, 248, 237, 223, 140, 67, 16, 248, - 234, 223, 140, 251, 175, 1, 183, 251, 175, 1, 243, 230, 251, 175, 1, 229, - 226, 251, 175, 1, 229, 173, 251, 175, 1, 195, 251, 175, 1, 252, 234, 251, - 175, 1, 191, 251, 175, 1, 230, 245, 251, 175, 1, 218, 66, 251, 175, 1, - 249, 30, 251, 175, 1, 207, 251, 175, 1, 228, 190, 251, 175, 1, 251, 88, - 251, 175, 1, 236, 0, 251, 175, 1, 228, 64, 251, 175, 1, 228, 58, 251, - 175, 1, 189, 251, 175, 1, 208, 251, 175, 1, 233, 255, 251, 175, 1, 215, - 8, 251, 175, 1, 222, 227, 251, 175, 1, 63, 251, 175, 1, 162, 251, 175, - 30, 5, 75, 251, 175, 30, 5, 72, 251, 175, 30, 5, 77, 251, 175, 30, 5, 78, - 251, 175, 30, 5, 255, 20, 251, 175, 226, 224, 251, 175, 245, 222, 68, - 222, 114, 39, 89, 1, 127, 183, 39, 89, 1, 127, 234, 250, 39, 89, 1, 127, - 234, 35, 39, 89, 1, 117, 183, 39, 89, 1, 117, 234, 35, 39, 89, 1, 117, - 234, 250, 39, 89, 1, 229, 226, 39, 89, 1, 127, 251, 88, 39, 89, 1, 127, - 250, 215, 39, 89, 1, 117, 251, 88, 39, 89, 1, 117, 222, 227, 39, 89, 1, - 117, 250, 215, 39, 89, 1, 228, 64, 39, 89, 1, 224, 67, 39, 89, 1, 127, - 224, 65, 39, 89, 1, 249, 30, 39, 89, 1, 117, 224, 65, 39, 89, 1, 224, 76, - 39, 89, 1, 127, 218, 66, 39, 89, 1, 127, 217, 174, 39, 89, 1, 117, 218, - 66, 39, 89, 1, 117, 217, 174, 39, 89, 1, 207, 39, 89, 1, 252, 234, 39, - 89, 1, 127, 195, 39, 89, 1, 127, 226, 59, 39, 89, 1, 127, 245, 29, 39, - 89, 1, 117, 195, 39, 89, 1, 117, 245, 29, 39, 89, 1, 117, 226, 59, 39, - 89, 1, 191, 39, 89, 1, 117, 189, 39, 89, 1, 127, 189, 39, 89, 1, 208, 39, - 89, 1, 223, 74, 39, 89, 1, 233, 255, 39, 89, 1, 232, 225, 39, 89, 1, 214, - 52, 39, 89, 1, 127, 221, 47, 39, 89, 1, 127, 219, 176, 39, 89, 1, 127, - 222, 227, 39, 89, 1, 127, 162, 39, 89, 1, 233, 54, 39, 89, 1, 63, 39, 89, - 1, 117, 162, 39, 89, 1, 75, 39, 89, 1, 236, 145, 39, 89, 1, 72, 39, 89, - 1, 215, 98, 39, 89, 1, 246, 30, 39, 89, 1, 227, 86, 39, 89, 1, 233, 241, - 39, 89, 1, 242, 230, 222, 227, 39, 89, 120, 5, 144, 208, 39, 89, 120, 5, - 144, 233, 255, 39, 89, 120, 5, 234, 0, 218, 22, 233, 231, 39, 89, 5, 232, - 82, 235, 93, 233, 231, 39, 89, 120, 5, 41, 229, 226, 39, 89, 120, 5, 117, - 195, 39, 89, 120, 5, 127, 224, 66, 171, 117, 195, 39, 89, 120, 5, 191, - 39, 89, 120, 5, 252, 234, 39, 89, 120, 5, 222, 227, 39, 89, 5, 222, 205, - 39, 89, 30, 5, 63, 39, 89, 30, 5, 232, 82, 222, 166, 39, 89, 30, 5, 255, - 104, 39, 89, 30, 5, 218, 28, 255, 104, 39, 89, 30, 5, 75, 39, 89, 30, 5, - 236, 145, 39, 89, 30, 5, 215, 189, 39, 89, 30, 5, 215, 97, 39, 89, 30, 5, - 72, 39, 89, 30, 5, 215, 98, 39, 89, 30, 5, 78, 39, 89, 30, 5, 227, 158, - 55, 39, 89, 30, 5, 227, 15, 39, 89, 30, 5, 77, 39, 89, 30, 5, 255, 20, - 39, 89, 30, 5, 227, 86, 39, 89, 30, 5, 254, 236, 39, 89, 30, 5, 89, 254, - 236, 39, 89, 30, 5, 227, 158, 50, 39, 89, 5, 232, 82, 235, 92, 39, 89, 5, - 216, 253, 39, 89, 5, 216, 252, 39, 89, 5, 234, 217, 216, 251, 39, 89, 5, - 234, 217, 216, 250, 39, 89, 5, 234, 217, 216, 249, 39, 89, 5, 224, 112, - 242, 147, 39, 89, 5, 232, 82, 222, 192, 39, 89, 5, 234, 216, 235, 77, 39, - 89, 38, 249, 178, 247, 195, 39, 89, 241, 151, 21, 212, 79, 39, 89, 241, - 151, 21, 118, 39, 89, 241, 151, 21, 112, 39, 89, 241, 151, 21, 170, 39, - 89, 241, 151, 21, 167, 39, 89, 241, 151, 21, 185, 39, 89, 241, 151, 21, - 192, 39, 89, 241, 151, 21, 200, 39, 89, 241, 151, 21, 198, 39, 89, 241, - 151, 21, 203, 39, 89, 89, 21, 212, 79, 39, 89, 89, 21, 118, 39, 89, 89, - 21, 112, 39, 89, 89, 21, 170, 39, 89, 89, 21, 167, 39, 89, 89, 21, 185, - 39, 89, 89, 21, 192, 39, 89, 89, 21, 200, 39, 89, 89, 21, 198, 39, 89, - 89, 21, 203, 39, 89, 5, 213, 237, 39, 89, 5, 213, 236, 39, 89, 5, 222, - 156, 39, 89, 5, 235, 22, 39, 89, 5, 241, 81, 39, 89, 5, 247, 209, 39, 89, - 5, 223, 236, 223, 123, 224, 76, 39, 89, 5, 232, 82, 213, 63, 39, 89, 5, - 235, 124, 39, 89, 5, 235, 123, 39, 89, 5, 222, 163, 39, 89, 5, 222, 162, - 39, 89, 5, 242, 112, 39, 89, 5, 251, 85, 101, 5, 215, 176, 223, 217, 101, - 5, 215, 176, 251, 57, 101, 5, 250, 243, 101, 5, 218, 229, 101, 5, 252, - 25, 101, 1, 254, 219, 101, 1, 254, 220, 217, 234, 101, 1, 236, 141, 101, - 1, 236, 142, 217, 234, 101, 1, 215, 179, 101, 1, 215, 180, 217, 234, 101, - 1, 224, 112, 224, 7, 101, 1, 224, 112, 224, 8, 217, 234, 101, 1, 234, 0, - 233, 146, 101, 1, 234, 0, 233, 147, 217, 234, 101, 1, 246, 1, 101, 1, - 254, 234, 101, 1, 227, 115, 101, 1, 227, 116, 217, 234, 101, 1, 183, 101, - 1, 235, 131, 232, 85, 101, 1, 243, 230, 101, 1, 243, 231, 243, 1, 101, 1, - 229, 226, 101, 1, 251, 88, 101, 1, 251, 89, 233, 244, 101, 1, 236, 0, - 101, 1, 236, 1, 235, 234, 101, 1, 228, 64, 101, 1, 218, 67, 233, 198, - 101, 1, 218, 67, 230, 207, 232, 85, 101, 1, 249, 31, 230, 207, 254, 181, - 101, 1, 249, 31, 230, 207, 232, 85, 101, 1, 230, 115, 224, 79, 101, 1, - 218, 66, 101, 1, 218, 67, 217, 255, 101, 1, 249, 30, 101, 1, 249, 31, - 232, 103, 101, 1, 207, 101, 1, 195, 101, 1, 226, 252, 235, 88, 101, 1, - 252, 234, 101, 1, 252, 235, 235, 34, 101, 1, 191, 101, 1, 189, 101, 1, - 208, 101, 1, 233, 255, 101, 1, 214, 52, 101, 1, 222, 228, 222, 214, 101, - 1, 222, 228, 222, 173, 101, 1, 222, 227, 101, 1, 162, 101, 5, 224, 0, - 101, 30, 5, 217, 234, 101, 30, 5, 215, 175, 101, 30, 5, 215, 176, 222, - 169, 101, 30, 5, 219, 6, 101, 30, 5, 219, 7, 236, 133, 101, 30, 5, 224, - 112, 224, 7, 101, 30, 5, 224, 112, 224, 8, 217, 234, 101, 30, 5, 234, 0, - 233, 146, 101, 30, 5, 234, 0, 233, 147, 217, 234, 101, 30, 5, 218, 29, - 101, 30, 5, 218, 30, 224, 7, 101, 30, 5, 218, 30, 217, 234, 101, 30, 5, - 218, 30, 224, 8, 217, 234, 101, 30, 5, 226, 95, 101, 30, 5, 226, 96, 217, - 234, 101, 255, 27, 255, 26, 101, 1, 235, 113, 222, 168, 101, 1, 234, 221, - 222, 168, 101, 1, 216, 7, 222, 168, 101, 1, 246, 25, 222, 168, 101, 1, - 214, 238, 222, 168, 101, 1, 212, 100, 222, 168, 101, 1, 253, 252, 222, - 168, 101, 21, 212, 79, 101, 21, 118, 101, 21, 112, 101, 21, 170, 101, 21, - 167, 101, 21, 185, 101, 21, 192, 101, 21, 200, 101, 21, 198, 101, 21, - 203, 101, 226, 194, 101, 226, 219, 101, 213, 226, 101, 251, 36, 226, 212, - 101, 251, 36, 220, 117, 101, 251, 36, 226, 167, 101, 226, 218, 101, 27, - 16, 247, 201, 101, 27, 16, 248, 123, 101, 27, 16, 246, 140, 101, 27, 16, - 248, 243, 101, 27, 16, 248, 244, 218, 229, 101, 27, 16, 248, 22, 101, 27, - 16, 249, 23, 101, 27, 16, 248, 105, 101, 27, 16, 249, 9, 101, 27, 16, - 248, 244, 243, 153, 101, 27, 16, 38, 217, 230, 101, 27, 16, 38, 245, 220, - 101, 27, 16, 38, 235, 29, 101, 27, 16, 38, 235, 31, 101, 27, 16, 38, 235, - 238, 101, 27, 16, 38, 235, 30, 2, 235, 238, 101, 27, 16, 38, 235, 32, 2, - 235, 238, 101, 27, 16, 38, 252, 84, 101, 27, 16, 38, 243, 5, 101, 27, 16, - 223, 180, 210, 246, 150, 101, 27, 16, 223, 180, 210, 249, 21, 101, 27, - 16, 223, 180, 250, 60, 216, 83, 101, 27, 16, 223, 180, 250, 60, 218, 36, - 101, 27, 16, 233, 166, 210, 226, 207, 101, 27, 16, 233, 166, 210, 225, - 61, 101, 27, 16, 233, 166, 250, 60, 225, 206, 101, 27, 16, 233, 166, 250, - 60, 225, 196, 101, 27, 16, 233, 166, 210, 225, 229, 218, 251, 5, 226, - 191, 218, 251, 5, 226, 203, 218, 251, 5, 226, 200, 218, 251, 1, 63, 218, - 251, 1, 75, 218, 251, 1, 72, 218, 251, 1, 255, 20, 218, 251, 1, 78, 218, - 251, 1, 77, 218, 251, 1, 245, 143, 218, 251, 1, 183, 218, 251, 1, 225, - 11, 218, 251, 1, 243, 230, 218, 251, 1, 229, 226, 218, 251, 1, 251, 88, - 218, 251, 1, 236, 0, 218, 251, 1, 212, 109, 218, 251, 1, 228, 64, 218, - 251, 1, 218, 66, 218, 251, 1, 249, 30, 218, 251, 1, 207, 218, 251, 1, - 195, 218, 251, 1, 245, 29, 218, 251, 1, 215, 8, 218, 251, 1, 252, 234, - 218, 251, 1, 191, 218, 251, 1, 189, 218, 251, 1, 208, 218, 251, 1, 233, - 255, 218, 251, 1, 214, 52, 218, 251, 1, 222, 227, 218, 251, 1, 213, 156, - 218, 251, 1, 162, 218, 251, 120, 5, 226, 216, 218, 251, 120, 5, 226, 193, - 218, 251, 120, 5, 226, 190, 218, 251, 30, 5, 226, 206, 218, 251, 30, 5, - 226, 189, 218, 251, 30, 5, 226, 210, 218, 251, 30, 5, 226, 199, 218, 251, - 30, 5, 226, 217, 218, 251, 30, 5, 226, 208, 218, 251, 5, 226, 220, 218, - 251, 1, 234, 250, 218, 251, 1, 218, 190, 218, 251, 21, 212, 79, 218, 251, - 21, 118, 218, 251, 21, 112, 218, 251, 21, 170, 218, 251, 21, 167, 218, - 251, 21, 185, 218, 251, 21, 192, 218, 251, 21, 200, 218, 251, 21, 198, - 218, 251, 21, 203, 252, 166, 1, 63, 252, 166, 1, 220, 109, 63, 252, 166, - 1, 162, 252, 166, 1, 220, 109, 162, 252, 166, 1, 232, 59, 162, 252, 166, - 1, 252, 234, 252, 166, 1, 235, 74, 252, 234, 252, 166, 1, 195, 252, 166, - 1, 220, 109, 195, 252, 166, 1, 207, 252, 166, 1, 232, 59, 207, 252, 166, - 1, 214, 52, 252, 166, 1, 220, 109, 214, 52, 252, 166, 1, 226, 231, 214, - 52, 252, 166, 1, 243, 230, 252, 166, 1, 220, 109, 243, 230, 252, 166, 1, - 236, 0, 252, 166, 1, 249, 30, 252, 166, 1, 208, 252, 166, 1, 220, 109, - 208, 252, 166, 1, 191, 252, 166, 1, 220, 109, 191, 252, 166, 1, 219, 232, - 218, 66, 252, 166, 1, 228, 209, 218, 66, 252, 166, 1, 222, 227, 252, 166, - 1, 220, 109, 222, 227, 252, 166, 1, 232, 59, 222, 227, 252, 166, 1, 189, - 252, 166, 1, 220, 109, 189, 252, 166, 1, 229, 226, 252, 166, 1, 233, 255, - 252, 166, 1, 220, 109, 233, 255, 252, 166, 1, 228, 64, 252, 166, 1, 251, - 88, 252, 166, 1, 230, 39, 252, 166, 1, 232, 1, 252, 166, 1, 75, 252, 166, - 1, 72, 252, 166, 5, 217, 1, 252, 166, 30, 5, 77, 252, 166, 30, 5, 226, - 231, 77, 252, 166, 30, 5, 246, 30, 252, 166, 30, 5, 75, 252, 166, 30, 5, - 235, 74, 75, 252, 166, 30, 5, 78, 252, 166, 30, 5, 235, 74, 78, 252, 166, - 30, 5, 72, 252, 166, 30, 5, 103, 31, 220, 109, 222, 227, 252, 166, 120, - 5, 229, 228, 252, 166, 120, 5, 242, 162, 252, 166, 226, 202, 252, 166, - 226, 198, 252, 166, 16, 252, 33, 230, 115, 231, 174, 252, 166, 16, 252, - 33, 225, 232, 252, 166, 16, 252, 33, 235, 165, 252, 166, 16, 252, 33, - 226, 202, 186, 1, 183, 186, 1, 234, 159, 186, 1, 234, 250, 186, 1, 243, - 230, 186, 1, 243, 26, 186, 1, 229, 226, 186, 1, 251, 88, 186, 1, 250, - 215, 186, 1, 236, 0, 186, 1, 228, 64, 186, 1, 218, 66, 186, 1, 217, 174, - 186, 1, 249, 30, 186, 1, 207, 186, 1, 195, 186, 1, 225, 210, 186, 1, 226, - 59, 186, 1, 245, 29, 186, 1, 244, 164, 186, 1, 252, 234, 186, 1, 252, 14, - 186, 1, 191, 186, 1, 231, 51, 186, 1, 216, 154, 186, 1, 216, 146, 186, 1, - 246, 114, 186, 1, 189, 186, 1, 208, 186, 1, 233, 255, 186, 1, 162, 186, - 1, 242, 2, 186, 1, 215, 8, 186, 1, 222, 227, 186, 1, 221, 47, 186, 1, - 214, 52, 186, 1, 63, 186, 219, 32, 1, 189, 186, 219, 32, 1, 208, 186, 30, - 5, 255, 104, 186, 30, 5, 75, 186, 30, 5, 78, 186, 30, 5, 227, 86, 186, - 30, 5, 72, 186, 30, 5, 215, 98, 186, 30, 5, 77, 186, 120, 5, 235, 141, - 186, 120, 5, 184, 186, 120, 5, 155, 186, 120, 5, 206, 186, 120, 5, 227, - 11, 186, 120, 5, 152, 186, 120, 5, 218, 113, 186, 120, 5, 228, 43, 186, - 120, 5, 235, 92, 186, 5, 224, 77, 186, 5, 228, 103, 186, 225, 63, 218, - 65, 186, 225, 63, 228, 52, 217, 87, 218, 65, 186, 225, 63, 250, 221, 186, - 225, 63, 216, 141, 250, 221, 186, 225, 63, 216, 140, 186, 21, 212, 79, - 186, 21, 118, 186, 21, 112, 186, 21, 170, 186, 21, 167, 186, 21, 185, - 186, 21, 192, 186, 21, 200, 186, 21, 198, 186, 21, 203, 186, 1, 216, 128, - 186, 1, 216, 116, 186, 1, 248, 207, 227, 113, 250, 163, 21, 212, 79, 227, - 113, 250, 163, 21, 118, 227, 113, 250, 163, 21, 112, 227, 113, 250, 163, - 21, 170, 227, 113, 250, 163, 21, 167, 227, 113, 250, 163, 21, 185, 227, - 113, 250, 163, 21, 192, 227, 113, 250, 163, 21, 200, 227, 113, 250, 163, - 21, 198, 227, 113, 250, 163, 21, 203, 227, 113, 250, 163, 1, 233, 255, - 227, 113, 250, 163, 1, 253, 249, 227, 113, 250, 163, 1, 254, 249, 227, - 113, 250, 163, 1, 254, 151, 227, 113, 250, 163, 1, 254, 213, 227, 113, - 250, 163, 1, 233, 254, 227, 113, 250, 163, 1, 255, 66, 227, 113, 250, - 163, 1, 255, 67, 227, 113, 250, 163, 1, 255, 65, 227, 113, 250, 163, 1, - 255, 61, 227, 113, 250, 163, 1, 233, 111, 227, 113, 250, 163, 1, 236, 30, - 227, 113, 250, 163, 1, 236, 146, 227, 113, 250, 163, 1, 236, 49, 227, - 113, 250, 163, 1, 236, 38, 227, 113, 250, 163, 1, 232, 230, 227, 113, - 250, 163, 1, 215, 196, 227, 113, 250, 163, 1, 215, 194, 227, 113, 250, - 163, 1, 215, 145, 227, 113, 250, 163, 1, 215, 91, 227, 113, 250, 163, 1, - 233, 180, 227, 113, 250, 163, 1, 245, 191, 227, 113, 250, 163, 1, 246, - 33, 227, 113, 250, 163, 1, 245, 229, 227, 113, 250, 163, 1, 245, 170, - 227, 113, 250, 163, 1, 233, 26, 227, 113, 250, 163, 1, 227, 43, 227, 113, - 250, 163, 1, 227, 153, 227, 113, 250, 163, 1, 227, 31, 227, 113, 250, - 163, 1, 227, 125, 227, 113, 250, 163, 230, 243, 216, 93, 227, 113, 250, - 163, 243, 225, 216, 94, 227, 113, 250, 163, 230, 241, 216, 94, 227, 113, - 250, 163, 224, 20, 227, 113, 250, 163, 226, 57, 227, 113, 250, 163, 254, - 241, 227, 113, 250, 163, 225, 63, 230, 238, 227, 113, 250, 163, 225, 63, - 52, 230, 238, 214, 234, 161, 235, 72, 214, 234, 161, 221, 22, 214, 234, - 161, 225, 114, 214, 234, 5, 229, 104, 214, 234, 5, 213, 71, 231, 105, - 218, 215, 214, 234, 161, 213, 71, 254, 246, 236, 101, 218, 215, 214, 234, - 161, 213, 71, 236, 101, 218, 215, 214, 234, 161, 213, 71, 235, 60, 236, - 101, 218, 215, 214, 234, 161, 251, 58, 55, 214, 234, 161, 213, 71, 235, - 60, 236, 101, 218, 216, 222, 138, 214, 234, 161, 52, 218, 215, 214, 234, - 161, 216, 182, 218, 215, 214, 234, 161, 235, 60, 254, 115, 214, 234, 161, - 62, 55, 214, 234, 161, 119, 181, 55, 214, 234, 161, 137, 181, 55, 214, - 234, 161, 223, 171, 235, 71, 236, 101, 218, 215, 214, 234, 161, 253, 247, - 236, 101, 218, 215, 214, 234, 5, 214, 133, 218, 215, 214, 234, 5, 214, - 133, 215, 191, 214, 234, 5, 223, 236, 214, 133, 215, 191, 214, 234, 5, - 214, 133, 254, 115, 214, 234, 5, 223, 236, 214, 133, 254, 115, 214, 234, - 5, 214, 133, 215, 192, 2, 218, 40, 214, 234, 5, 214, 133, 254, 116, 2, - 218, 40, 214, 234, 5, 254, 114, 254, 129, 214, 234, 5, 254, 114, 252, - 212, 214, 234, 5, 254, 114, 215, 2, 214, 234, 5, 254, 114, 215, 3, 2, - 218, 40, 214, 234, 5, 217, 35, 214, 234, 5, 242, 39, 187, 254, 113, 214, - 234, 5, 187, 254, 113, 214, 234, 5, 223, 79, 187, 254, 113, 214, 234, 5, - 254, 114, 215, 198, 230, 230, 214, 234, 5, 254, 61, 7, 1, 4, 6, 63, 7, 1, - 4, 6, 255, 20, 7, 4, 1, 216, 66, 255, 20, 7, 1, 4, 6, 252, 180, 253, 201, - 7, 1, 4, 6, 251, 121, 7, 1, 4, 6, 249, 125, 7, 1, 4, 6, 245, 146, 7, 1, - 4, 6, 77, 7, 4, 1, 216, 66, 210, 77, 7, 4, 1, 216, 66, 75, 7, 1, 4, 6, - 236, 3, 7, 1, 4, 6, 235, 141, 7, 1, 4, 6, 234, 13, 2, 91, 7, 1, 4, 6, - 184, 7, 1, 4, 6, 223, 236, 206, 7, 1, 4, 6, 78, 7, 1, 4, 6, 210, 78, 7, - 4, 1, 220, 132, 78, 7, 4, 1, 220, 132, 210, 78, 7, 4, 1, 220, 132, 141, - 2, 91, 7, 4, 1, 216, 66, 227, 136, 7, 1, 4, 6, 227, 40, 7, 4, 1, 216, - 240, 157, 78, 7, 4, 1, 251, 226, 157, 78, 7, 1, 4, 6, 227, 11, 7, 1, 4, - 6, 223, 236, 152, 7, 1, 4, 6, 216, 66, 152, 7, 1, 4, 6, 218, 113, 7, 1, - 4, 6, 72, 7, 4, 1, 220, 132, 72, 7, 4, 1, 220, 132, 248, 73, 72, 7, 4, 1, - 220, 132, 216, 66, 184, 7, 1, 4, 6, 211, 211, 7, 1, 4, 6, 214, 85, 7, 1, - 4, 6, 212, 152, 7, 1, 4, 6, 245, 97, 7, 1, 214, 120, 233, 204, 219, 201, - 7, 1, 254, 231, 25, 1, 4, 6, 243, 203, 25, 1, 4, 6, 233, 220, 25, 1, 4, - 6, 226, 20, 25, 1, 4, 6, 223, 224, 25, 1, 4, 6, 225, 82, 33, 1, 4, 6, - 245, 252, 59, 1, 6, 63, 59, 1, 6, 255, 20, 59, 1, 6, 253, 201, 59, 1, 6, - 252, 180, 253, 201, 59, 1, 6, 249, 125, 59, 1, 6, 77, 59, 1, 6, 223, 236, - 77, 59, 1, 6, 244, 41, 59, 1, 6, 242, 162, 59, 1, 6, 75, 59, 1, 6, 236, - 3, 59, 1, 6, 235, 141, 59, 1, 6, 155, 59, 1, 6, 184, 59, 1, 6, 206, 59, - 1, 6, 223, 236, 206, 59, 1, 6, 78, 59, 1, 6, 227, 40, 59, 1, 6, 227, 11, - 59, 1, 6, 152, 59, 1, 6, 218, 113, 59, 1, 6, 72, 59, 1, 6, 214, 85, 59, - 1, 4, 63, 59, 1, 4, 216, 66, 63, 59, 1, 4, 254, 179, 59, 1, 4, 216, 66, - 255, 20, 59, 1, 4, 253, 201, 59, 1, 4, 249, 125, 59, 1, 4, 77, 59, 1, 4, - 222, 136, 59, 1, 4, 210, 77, 59, 1, 4, 216, 66, 210, 77, 59, 1, 4, 244, - 41, 59, 1, 4, 216, 66, 75, 59, 1, 4, 235, 141, 59, 1, 4, 184, 59, 1, 4, - 245, 217, 59, 1, 4, 78, 59, 1, 4, 210, 78, 59, 1, 4, 216, 240, 157, 78, - 59, 1, 4, 251, 226, 157, 78, 59, 1, 4, 227, 11, 59, 1, 4, 218, 113, 59, - 1, 4, 72, 59, 1, 4, 220, 132, 72, 59, 1, 4, 216, 66, 184, 59, 1, 4, 211, - 211, 59, 1, 4, 254, 231, 59, 1, 4, 252, 73, 59, 1, 4, 25, 243, 203, 59, - 1, 4, 248, 126, 59, 1, 4, 25, 226, 45, 59, 1, 4, 250, 170, 7, 219, 24, 4, - 1, 75, 7, 219, 24, 4, 1, 152, 7, 219, 24, 4, 1, 72, 7, 219, 24, 4, 1, - 211, 211, 25, 219, 24, 4, 1, 252, 73, 25, 219, 24, 4, 1, 243, 203, 25, - 219, 24, 4, 1, 223, 224, 25, 219, 24, 4, 1, 226, 45, 25, 219, 24, 4, 1, - 250, 170, 7, 4, 1, 215, 189, 7, 4, 1, 57, 2, 231, 107, 177, 7, 4, 1, 249, - 126, 2, 231, 107, 177, 7, 4, 1, 245, 96, 2, 231, 107, 177, 7, 4, 1, 232, - 183, 2, 231, 107, 177, 7, 4, 1, 230, 167, 2, 231, 107, 177, 7, 4, 1, 227, - 12, 2, 231, 107, 177, 7, 4, 1, 224, 148, 2, 231, 107, 177, 7, 4, 1, 224, - 148, 2, 244, 177, 22, 231, 107, 177, 7, 4, 1, 223, 29, 2, 231, 107, 177, - 7, 4, 1, 218, 114, 2, 231, 107, 177, 7, 4, 1, 212, 153, 2, 231, 107, 177, - 7, 4, 1, 216, 66, 244, 41, 59, 1, 33, 245, 229, 7, 4, 1, 236, 71, 244, - 41, 7, 4, 1, 217, 177, 2, 219, 61, 7, 4, 6, 1, 241, 7, 2, 91, 7, 4, 1, - 236, 45, 2, 91, 7, 4, 1, 227, 12, 2, 91, 7, 4, 6, 1, 103, 2, 91, 7, 4, 1, - 215, 135, 2, 91, 7, 4, 1, 57, 2, 226, 230, 102, 7, 4, 1, 249, 126, 2, - 226, 230, 102, 7, 4, 1, 245, 96, 2, 226, 230, 102, 7, 4, 1, 244, 42, 2, - 226, 230, 102, 7, 4, 1, 235, 142, 2, 226, 230, 102, 7, 4, 1, 234, 13, 2, - 226, 230, 102, 7, 4, 1, 232, 183, 2, 226, 230, 102, 7, 4, 1, 230, 167, 2, - 226, 230, 102, 7, 4, 1, 227, 12, 2, 226, 230, 102, 7, 4, 1, 224, 148, 2, - 226, 230, 102, 7, 4, 1, 223, 29, 2, 226, 230, 102, 7, 4, 1, 245, 162, 2, - 226, 230, 102, 7, 4, 1, 215, 86, 2, 226, 230, 102, 7, 4, 1, 213, 170, 2, - 226, 230, 102, 7, 4, 1, 212, 153, 2, 226, 230, 102, 7, 4, 1, 111, 2, 223, - 241, 102, 7, 4, 1, 254, 180, 2, 223, 241, 102, 7, 4, 1, 249, 126, 2, 241, - 157, 22, 218, 40, 7, 4, 1, 154, 2, 223, 241, 102, 7, 4, 1, 210, 154, 2, - 223, 241, 102, 7, 4, 1, 223, 236, 210, 154, 2, 223, 241, 102, 7, 4, 1, - 222, 137, 2, 223, 241, 102, 7, 4, 1, 241, 7, 2, 223, 241, 102, 7, 4, 1, - 210, 141, 2, 223, 241, 102, 7, 4, 1, 245, 162, 2, 223, 241, 102, 7, 4, 1, - 103, 2, 223, 241, 102, 7, 4, 1, 245, 98, 2, 223, 241, 102, 59, 1, 4, 216, - 66, 254, 179, 59, 1, 4, 251, 121, 59, 1, 4, 251, 122, 2, 249, 164, 59, 1, - 4, 245, 146, 59, 1, 4, 223, 236, 210, 77, 59, 1, 4, 245, 95, 59, 1, 4, - 247, 194, 236, 4, 2, 91, 59, 1, 4, 115, 244, 41, 59, 1, 4, 216, 66, 242, - 162, 59, 1, 4, 241, 7, 2, 91, 59, 1, 4, 236, 44, 59, 1, 4, 6, 75, 59, 1, - 4, 6, 241, 7, 2, 91, 59, 1, 4, 236, 4, 2, 249, 190, 59, 1, 4, 234, 13, 2, - 223, 241, 102, 59, 1, 4, 234, 13, 2, 226, 230, 102, 59, 1, 4, 6, 155, 59, - 1, 4, 232, 183, 2, 102, 59, 1, 4, 216, 66, 232, 183, 2, 187, 233, 158, - 59, 1, 4, 230, 167, 2, 43, 102, 59, 1, 4, 230, 167, 2, 223, 241, 102, 59, - 1, 4, 6, 206, 59, 1, 4, 252, 180, 78, 59, 1, 4, 226, 45, 59, 1, 4, 223, - 29, 2, 102, 59, 1, 4, 245, 161, 59, 1, 4, 218, 114, 2, 226, 230, 102, 59, - 1, 4, 103, 134, 59, 1, 4, 215, 134, 59, 1, 4, 6, 72, 59, 1, 4, 215, 86, - 2, 102, 59, 1, 4, 216, 66, 211, 211, 59, 1, 4, 212, 152, 59, 1, 4, 212, - 153, 2, 223, 241, 102, 59, 1, 4, 212, 153, 2, 249, 164, 59, 1, 4, 245, - 97, 59, 1, 4, 217, 145, 38, 246, 193, 242, 234, 255, 46, 38, 246, 193, - 255, 36, 255, 46, 38, 220, 16, 55, 38, 218, 221, 79, 38, 232, 109, 38, - 242, 232, 38, 232, 107, 38, 255, 34, 38, 242, 233, 38, 255, 35, 38, 7, 4, - 1, 224, 148, 55, 38, 251, 198, 38, 232, 108, 38, 52, 250, 91, 50, 38, - 227, 128, 50, 38, 212, 28, 55, 38, 236, 31, 55, 38, 215, 128, 50, 38, - 215, 111, 50, 38, 7, 4, 1, 244, 152, 210, 111, 50, 38, 7, 4, 1, 255, 20, - 38, 7, 4, 1, 254, 111, 38, 7, 4, 1, 253, 219, 38, 7, 4, 1, 251, 122, 250, - 240, 38, 7, 4, 1, 236, 71, 249, 125, 38, 7, 4, 1, 245, 146, 38, 7, 4, 1, - 244, 41, 38, 7, 1, 4, 6, 244, 41, 38, 7, 4, 1, 235, 141, 38, 7, 4, 1, - 155, 38, 7, 1, 4, 6, 155, 38, 7, 1, 4, 6, 184, 38, 7, 4, 1, 206, 38, 7, - 1, 4, 6, 206, 38, 7, 1, 4, 6, 152, 38, 7, 4, 1, 224, 148, 223, 122, 38, - 7, 4, 1, 196, 38, 7, 4, 1, 187, 196, 38, 7, 4, 1, 212, 152, 38, 52, 236, - 52, 251, 200, 55, 38, 254, 184, 126, 217, 10, 55, 38, 43, 254, 36, 50, - 38, 47, 254, 36, 22, 121, 254, 36, 55, 7, 6, 1, 111, 2, 223, 165, 55, 7, - 4, 1, 111, 2, 223, 165, 55, 7, 6, 1, 57, 2, 62, 50, 7, 4, 1, 57, 2, 62, - 50, 7, 6, 1, 57, 2, 62, 55, 7, 4, 1, 57, 2, 62, 55, 7, 6, 1, 57, 2, 233, - 84, 55, 7, 4, 1, 57, 2, 233, 84, 55, 7, 6, 1, 251, 122, 2, 250, 241, 22, - 138, 7, 4, 1, 251, 122, 2, 250, 241, 22, 138, 7, 6, 1, 249, 126, 2, 62, - 50, 7, 4, 1, 249, 126, 2, 62, 50, 7, 6, 1, 249, 126, 2, 62, 55, 7, 4, 1, - 249, 126, 2, 62, 55, 7, 6, 1, 249, 126, 2, 233, 84, 55, 7, 4, 1, 249, - 126, 2, 233, 84, 55, 7, 6, 1, 249, 126, 2, 250, 240, 7, 4, 1, 249, 126, - 2, 250, 240, 7, 6, 1, 249, 126, 2, 250, 91, 55, 7, 4, 1, 249, 126, 2, - 250, 91, 55, 7, 6, 1, 154, 2, 232, 111, 22, 209, 7, 4, 1, 154, 2, 232, - 111, 22, 209, 7, 6, 1, 154, 2, 232, 111, 22, 138, 7, 4, 1, 154, 2, 232, - 111, 22, 138, 7, 6, 1, 154, 2, 250, 91, 55, 7, 4, 1, 154, 2, 250, 91, 55, - 7, 6, 1, 154, 2, 217, 56, 55, 7, 4, 1, 154, 2, 217, 56, 55, 7, 6, 1, 154, - 2, 250, 241, 22, 251, 199, 7, 4, 1, 154, 2, 250, 241, 22, 251, 199, 7, 6, - 1, 245, 96, 2, 62, 50, 7, 4, 1, 245, 96, 2, 62, 50, 7, 6, 1, 244, 42, 2, - 232, 110, 7, 4, 1, 244, 42, 2, 232, 110, 7, 6, 1, 242, 163, 2, 62, 50, 7, - 4, 1, 242, 163, 2, 62, 50, 7, 6, 1, 242, 163, 2, 62, 55, 7, 4, 1, 242, - 163, 2, 62, 55, 7, 6, 1, 242, 163, 2, 248, 74, 7, 4, 1, 242, 163, 2, 248, - 74, 7, 6, 1, 242, 163, 2, 250, 240, 7, 4, 1, 242, 163, 2, 250, 240, 7, 6, - 1, 242, 163, 2, 251, 200, 55, 7, 4, 1, 242, 163, 2, 251, 200, 55, 7, 6, - 1, 241, 7, 2, 217, 56, 55, 7, 4, 1, 241, 7, 2, 217, 56, 55, 7, 6, 1, 241, - 7, 2, 248, 75, 22, 138, 7, 4, 1, 241, 7, 2, 248, 75, 22, 138, 7, 6, 1, - 235, 142, 2, 138, 7, 4, 1, 235, 142, 2, 138, 7, 6, 1, 235, 142, 2, 62, - 55, 7, 4, 1, 235, 142, 2, 62, 55, 7, 6, 1, 235, 142, 2, 233, 84, 55, 7, - 4, 1, 235, 142, 2, 233, 84, 55, 7, 6, 1, 234, 13, 2, 62, 55, 7, 4, 1, - 234, 13, 2, 62, 55, 7, 6, 1, 234, 13, 2, 62, 252, 90, 22, 232, 110, 7, 4, - 1, 234, 13, 2, 62, 252, 90, 22, 232, 110, 7, 6, 1, 234, 13, 2, 233, 84, - 55, 7, 4, 1, 234, 13, 2, 233, 84, 55, 7, 6, 1, 234, 13, 2, 250, 91, 55, - 7, 4, 1, 234, 13, 2, 250, 91, 55, 7, 6, 1, 232, 183, 2, 138, 7, 4, 1, - 232, 183, 2, 138, 7, 6, 1, 232, 183, 2, 62, 50, 7, 4, 1, 232, 183, 2, 62, - 50, 7, 6, 1, 232, 183, 2, 62, 55, 7, 4, 1, 232, 183, 2, 62, 55, 7, 6, 1, - 230, 167, 2, 62, 50, 7, 4, 1, 230, 167, 2, 62, 50, 7, 6, 1, 230, 167, 2, - 62, 55, 7, 4, 1, 230, 167, 2, 62, 55, 7, 6, 1, 230, 167, 2, 233, 84, 55, - 7, 4, 1, 230, 167, 2, 233, 84, 55, 7, 6, 1, 230, 167, 2, 250, 91, 55, 7, - 4, 1, 230, 167, 2, 250, 91, 55, 7, 6, 1, 141, 2, 217, 56, 22, 138, 7, 4, - 1, 141, 2, 217, 56, 22, 138, 7, 6, 1, 141, 2, 217, 56, 22, 248, 74, 7, 4, - 1, 141, 2, 217, 56, 22, 248, 74, 7, 6, 1, 141, 2, 232, 111, 22, 209, 7, - 4, 1, 141, 2, 232, 111, 22, 209, 7, 6, 1, 141, 2, 232, 111, 22, 138, 7, - 4, 1, 141, 2, 232, 111, 22, 138, 7, 6, 1, 227, 12, 2, 138, 7, 4, 1, 227, - 12, 2, 138, 7, 6, 1, 227, 12, 2, 62, 50, 7, 4, 1, 227, 12, 2, 62, 50, 7, - 6, 1, 224, 148, 2, 62, 50, 7, 4, 1, 224, 148, 2, 62, 50, 7, 6, 1, 224, - 148, 2, 62, 55, 7, 4, 1, 224, 148, 2, 62, 55, 7, 6, 1, 224, 148, 2, 62, - 252, 90, 22, 232, 110, 7, 4, 1, 224, 148, 2, 62, 252, 90, 22, 232, 110, - 7, 6, 1, 224, 148, 2, 233, 84, 55, 7, 4, 1, 224, 148, 2, 233, 84, 55, 7, - 6, 1, 223, 29, 2, 62, 50, 7, 4, 1, 223, 29, 2, 62, 50, 7, 6, 1, 223, 29, - 2, 62, 55, 7, 4, 1, 223, 29, 2, 62, 55, 7, 6, 1, 223, 29, 2, 255, 36, 22, - 62, 50, 7, 4, 1, 223, 29, 2, 255, 36, 22, 62, 50, 7, 6, 1, 223, 29, 2, - 251, 35, 22, 62, 50, 7, 4, 1, 223, 29, 2, 251, 35, 22, 62, 50, 7, 6, 1, - 223, 29, 2, 62, 252, 90, 22, 62, 50, 7, 4, 1, 223, 29, 2, 62, 252, 90, - 22, 62, 50, 7, 6, 1, 218, 114, 2, 62, 50, 7, 4, 1, 218, 114, 2, 62, 50, - 7, 6, 1, 218, 114, 2, 62, 55, 7, 4, 1, 218, 114, 2, 62, 55, 7, 6, 1, 218, - 114, 2, 233, 84, 55, 7, 4, 1, 218, 114, 2, 233, 84, 55, 7, 6, 1, 218, - 114, 2, 250, 91, 55, 7, 4, 1, 218, 114, 2, 250, 91, 55, 7, 6, 1, 103, 2, - 248, 75, 55, 7, 4, 1, 103, 2, 248, 75, 55, 7, 6, 1, 103, 2, 217, 56, 55, - 7, 4, 1, 103, 2, 217, 56, 55, 7, 6, 1, 103, 2, 250, 91, 55, 7, 4, 1, 103, - 2, 250, 91, 55, 7, 6, 1, 103, 2, 217, 56, 22, 138, 7, 4, 1, 103, 2, 217, - 56, 22, 138, 7, 6, 1, 103, 2, 232, 111, 22, 248, 74, 7, 4, 1, 103, 2, - 232, 111, 22, 248, 74, 7, 6, 1, 215, 86, 2, 177, 7, 4, 1, 215, 86, 2, - 177, 7, 6, 1, 215, 86, 2, 62, 55, 7, 4, 1, 215, 86, 2, 62, 55, 7, 6, 1, - 214, 86, 2, 209, 7, 4, 1, 214, 86, 2, 209, 7, 6, 1, 214, 86, 2, 138, 7, - 4, 1, 214, 86, 2, 138, 7, 6, 1, 214, 86, 2, 248, 74, 7, 4, 1, 214, 86, 2, - 248, 74, 7, 6, 1, 214, 86, 2, 62, 50, 7, 4, 1, 214, 86, 2, 62, 50, 7, 6, - 1, 214, 86, 2, 62, 55, 7, 4, 1, 214, 86, 2, 62, 55, 7, 6, 1, 213, 170, 2, - 62, 50, 7, 4, 1, 213, 170, 2, 62, 50, 7, 6, 1, 213, 170, 2, 248, 74, 7, - 4, 1, 213, 170, 2, 248, 74, 7, 6, 1, 213, 109, 2, 62, 50, 7, 4, 1, 213, - 109, 2, 62, 50, 7, 6, 1, 212, 153, 2, 250, 90, 7, 4, 1, 212, 153, 2, 250, - 90, 7, 6, 1, 212, 153, 2, 62, 55, 7, 4, 1, 212, 153, 2, 62, 55, 7, 6, 1, - 212, 153, 2, 233, 84, 55, 7, 4, 1, 212, 153, 2, 233, 84, 55, 7, 4, 1, - 242, 163, 2, 233, 84, 55, 7, 4, 1, 218, 114, 2, 248, 74, 7, 4, 1, 214, - 86, 2, 223, 165, 50, 7, 4, 1, 213, 109, 2, 223, 165, 50, 7, 4, 1, 111, 2, - 47, 157, 223, 164, 7, 4, 1, 187, 223, 29, 2, 62, 50, 7, 4, 1, 187, 223, - 29, 2, 248, 72, 91, 7, 4, 1, 187, 223, 29, 2, 127, 91, 7, 6, 1, 221, 21, - 196, 7, 4, 1, 248, 126, 7, 6, 1, 111, 2, 62, 55, 7, 4, 1, 111, 2, 62, 55, - 7, 6, 1, 111, 2, 241, 157, 50, 7, 4, 1, 111, 2, 241, 157, 50, 7, 6, 1, - 111, 2, 250, 91, 22, 138, 7, 4, 1, 111, 2, 250, 91, 22, 138, 7, 6, 1, - 111, 2, 250, 91, 22, 209, 7, 4, 1, 111, 2, 250, 91, 22, 209, 7, 6, 1, - 111, 2, 250, 91, 22, 241, 157, 50, 7, 4, 1, 111, 2, 250, 91, 22, 241, - 157, 50, 7, 6, 1, 111, 2, 250, 91, 22, 177, 7, 4, 1, 111, 2, 250, 91, 22, - 177, 7, 6, 1, 111, 2, 250, 91, 22, 62, 55, 7, 4, 1, 111, 2, 250, 91, 22, - 62, 55, 7, 6, 1, 111, 2, 251, 200, 22, 138, 7, 4, 1, 111, 2, 251, 200, - 22, 138, 7, 6, 1, 111, 2, 251, 200, 22, 209, 7, 4, 1, 111, 2, 251, 200, - 22, 209, 7, 6, 1, 111, 2, 251, 200, 22, 241, 157, 50, 7, 4, 1, 111, 2, - 251, 200, 22, 241, 157, 50, 7, 6, 1, 111, 2, 251, 200, 22, 177, 7, 4, 1, - 111, 2, 251, 200, 22, 177, 7, 6, 1, 111, 2, 251, 200, 22, 62, 55, 7, 4, - 1, 111, 2, 251, 200, 22, 62, 55, 7, 6, 1, 154, 2, 62, 55, 7, 4, 1, 154, - 2, 62, 55, 7, 6, 1, 154, 2, 241, 157, 50, 7, 4, 1, 154, 2, 241, 157, 50, - 7, 6, 1, 154, 2, 177, 7, 4, 1, 154, 2, 177, 7, 6, 1, 154, 2, 250, 91, 22, - 138, 7, 4, 1, 154, 2, 250, 91, 22, 138, 7, 6, 1, 154, 2, 250, 91, 22, - 209, 7, 4, 1, 154, 2, 250, 91, 22, 209, 7, 6, 1, 154, 2, 250, 91, 22, - 241, 157, 50, 7, 4, 1, 154, 2, 250, 91, 22, 241, 157, 50, 7, 6, 1, 154, - 2, 250, 91, 22, 177, 7, 4, 1, 154, 2, 250, 91, 22, 177, 7, 6, 1, 154, 2, - 250, 91, 22, 62, 55, 7, 4, 1, 154, 2, 250, 91, 22, 62, 55, 7, 6, 1, 241, - 7, 2, 241, 157, 50, 7, 4, 1, 241, 7, 2, 241, 157, 50, 7, 6, 1, 241, 7, 2, - 62, 55, 7, 4, 1, 241, 7, 2, 62, 55, 7, 6, 1, 141, 2, 62, 55, 7, 4, 1, - 141, 2, 62, 55, 7, 6, 1, 141, 2, 241, 157, 50, 7, 4, 1, 141, 2, 241, 157, - 50, 7, 6, 1, 141, 2, 250, 91, 22, 138, 7, 4, 1, 141, 2, 250, 91, 22, 138, - 7, 6, 1, 141, 2, 250, 91, 22, 209, 7, 4, 1, 141, 2, 250, 91, 22, 209, 7, - 6, 1, 141, 2, 250, 91, 22, 241, 157, 50, 7, 4, 1, 141, 2, 250, 91, 22, - 241, 157, 50, 7, 6, 1, 141, 2, 250, 91, 22, 177, 7, 4, 1, 141, 2, 250, - 91, 22, 177, 7, 6, 1, 141, 2, 250, 91, 22, 62, 55, 7, 4, 1, 141, 2, 250, - 91, 22, 62, 55, 7, 6, 1, 141, 2, 241, 98, 22, 138, 7, 4, 1, 141, 2, 241, - 98, 22, 138, 7, 6, 1, 141, 2, 241, 98, 22, 209, 7, 4, 1, 141, 2, 241, 98, - 22, 209, 7, 6, 1, 141, 2, 241, 98, 22, 241, 157, 50, 7, 4, 1, 141, 2, - 241, 98, 22, 241, 157, 50, 7, 6, 1, 141, 2, 241, 98, 22, 177, 7, 4, 1, - 141, 2, 241, 98, 22, 177, 7, 6, 1, 141, 2, 241, 98, 22, 62, 55, 7, 4, 1, - 141, 2, 241, 98, 22, 62, 55, 7, 6, 1, 103, 2, 62, 55, 7, 4, 1, 103, 2, - 62, 55, 7, 6, 1, 103, 2, 241, 157, 50, 7, 4, 1, 103, 2, 241, 157, 50, 7, - 6, 1, 103, 2, 241, 98, 22, 138, 7, 4, 1, 103, 2, 241, 98, 22, 138, 7, 6, - 1, 103, 2, 241, 98, 22, 209, 7, 4, 1, 103, 2, 241, 98, 22, 209, 7, 6, 1, - 103, 2, 241, 98, 22, 241, 157, 50, 7, 4, 1, 103, 2, 241, 98, 22, 241, - 157, 50, 7, 6, 1, 103, 2, 241, 98, 22, 177, 7, 4, 1, 103, 2, 241, 98, 22, - 177, 7, 6, 1, 103, 2, 241, 98, 22, 62, 55, 7, 4, 1, 103, 2, 241, 98, 22, - 62, 55, 7, 6, 1, 213, 109, 2, 209, 7, 4, 1, 213, 109, 2, 209, 7, 6, 1, - 213, 109, 2, 62, 55, 7, 4, 1, 213, 109, 2, 62, 55, 7, 6, 1, 213, 109, 2, - 241, 157, 50, 7, 4, 1, 213, 109, 2, 241, 157, 50, 7, 6, 1, 213, 109, 2, - 177, 7, 4, 1, 213, 109, 2, 177, 7, 6, 1, 231, 106, 233, 55, 7, 4, 1, 231, - 106, 233, 55, 7, 6, 1, 231, 106, 211, 211, 7, 4, 1, 231, 106, 211, 211, - 7, 6, 1, 213, 109, 2, 232, 251, 7, 4, 1, 213, 109, 2, 232, 251, 25, 4, 1, - 254, 180, 2, 225, 75, 25, 4, 1, 254, 180, 2, 248, 220, 25, 4, 1, 254, - 180, 2, 225, 76, 22, 214, 251, 25, 4, 1, 254, 180, 2, 248, 221, 22, 214, - 251, 25, 4, 1, 254, 180, 2, 225, 76, 22, 227, 16, 25, 4, 1, 254, 180, 2, - 248, 221, 22, 227, 16, 25, 4, 1, 254, 180, 2, 225, 76, 22, 226, 86, 25, - 4, 1, 254, 180, 2, 248, 221, 22, 226, 86, 25, 6, 1, 254, 180, 2, 225, 75, - 25, 6, 1, 254, 180, 2, 248, 220, 25, 6, 1, 254, 180, 2, 225, 76, 22, 214, - 251, 25, 6, 1, 254, 180, 2, 248, 221, 22, 214, 251, 25, 6, 1, 254, 180, - 2, 225, 76, 22, 227, 16, 25, 6, 1, 254, 180, 2, 248, 221, 22, 227, 16, - 25, 6, 1, 254, 180, 2, 225, 76, 22, 226, 86, 25, 6, 1, 254, 180, 2, 248, - 221, 22, 226, 86, 25, 4, 1, 245, 185, 2, 225, 75, 25, 4, 1, 245, 185, 2, - 248, 220, 25, 4, 1, 245, 185, 2, 225, 76, 22, 214, 251, 25, 4, 1, 245, - 185, 2, 248, 221, 22, 214, 251, 25, 4, 1, 245, 185, 2, 225, 76, 22, 227, - 16, 25, 4, 1, 245, 185, 2, 248, 221, 22, 227, 16, 25, 6, 1, 245, 185, 2, - 225, 75, 25, 6, 1, 245, 185, 2, 248, 220, 25, 6, 1, 245, 185, 2, 225, 76, - 22, 214, 251, 25, 6, 1, 245, 185, 2, 248, 221, 22, 214, 251, 25, 6, 1, - 245, 185, 2, 225, 76, 22, 227, 16, 25, 6, 1, 245, 185, 2, 248, 221, 22, - 227, 16, 25, 4, 1, 245, 150, 2, 225, 75, 25, 4, 1, 245, 150, 2, 248, 220, - 25, 4, 1, 245, 150, 2, 225, 76, 22, 214, 251, 25, 4, 1, 245, 150, 2, 248, - 221, 22, 214, 251, 25, 4, 1, 245, 150, 2, 225, 76, 22, 227, 16, 25, 4, 1, - 245, 150, 2, 248, 221, 22, 227, 16, 25, 4, 1, 245, 150, 2, 225, 76, 22, - 226, 86, 25, 4, 1, 245, 150, 2, 248, 221, 22, 226, 86, 25, 6, 1, 245, - 150, 2, 225, 75, 25, 6, 1, 245, 150, 2, 248, 220, 25, 6, 1, 245, 150, 2, - 225, 76, 22, 214, 251, 25, 6, 1, 245, 150, 2, 248, 221, 22, 214, 251, 25, - 6, 1, 245, 150, 2, 225, 76, 22, 227, 16, 25, 6, 1, 245, 150, 2, 248, 221, - 22, 227, 16, 25, 6, 1, 245, 150, 2, 225, 76, 22, 226, 86, 25, 6, 1, 245, - 150, 2, 248, 221, 22, 226, 86, 25, 4, 1, 236, 45, 2, 225, 75, 25, 4, 1, - 236, 45, 2, 248, 220, 25, 4, 1, 236, 45, 2, 225, 76, 22, 214, 251, 25, 4, - 1, 236, 45, 2, 248, 221, 22, 214, 251, 25, 4, 1, 236, 45, 2, 225, 76, 22, - 227, 16, 25, 4, 1, 236, 45, 2, 248, 221, 22, 227, 16, 25, 4, 1, 236, 45, - 2, 225, 76, 22, 226, 86, 25, 4, 1, 236, 45, 2, 248, 221, 22, 226, 86, 25, - 6, 1, 236, 45, 2, 225, 75, 25, 6, 1, 236, 45, 2, 248, 220, 25, 6, 1, 236, - 45, 2, 225, 76, 22, 214, 251, 25, 6, 1, 236, 45, 2, 248, 221, 22, 214, - 251, 25, 6, 1, 236, 45, 2, 225, 76, 22, 227, 16, 25, 6, 1, 236, 45, 2, - 248, 221, 22, 227, 16, 25, 6, 1, 236, 45, 2, 225, 76, 22, 226, 86, 25, 6, - 1, 236, 45, 2, 248, 221, 22, 226, 86, 25, 4, 1, 227, 103, 2, 225, 75, 25, - 4, 1, 227, 103, 2, 248, 220, 25, 4, 1, 227, 103, 2, 225, 76, 22, 214, - 251, 25, 4, 1, 227, 103, 2, 248, 221, 22, 214, 251, 25, 4, 1, 227, 103, - 2, 225, 76, 22, 227, 16, 25, 4, 1, 227, 103, 2, 248, 221, 22, 227, 16, - 25, 6, 1, 227, 103, 2, 225, 75, 25, 6, 1, 227, 103, 2, 248, 220, 25, 6, - 1, 227, 103, 2, 225, 76, 22, 214, 251, 25, 6, 1, 227, 103, 2, 248, 221, - 22, 214, 251, 25, 6, 1, 227, 103, 2, 225, 76, 22, 227, 16, 25, 6, 1, 227, - 103, 2, 248, 221, 22, 227, 16, 25, 4, 1, 215, 135, 2, 225, 75, 25, 4, 1, - 215, 135, 2, 248, 220, 25, 4, 1, 215, 135, 2, 225, 76, 22, 214, 251, 25, - 4, 1, 215, 135, 2, 248, 221, 22, 214, 251, 25, 4, 1, 215, 135, 2, 225, - 76, 22, 227, 16, 25, 4, 1, 215, 135, 2, 248, 221, 22, 227, 16, 25, 4, 1, - 215, 135, 2, 225, 76, 22, 226, 86, 25, 4, 1, 215, 135, 2, 248, 221, 22, - 226, 86, 25, 6, 1, 215, 135, 2, 248, 220, 25, 6, 1, 215, 135, 2, 248, - 221, 22, 214, 251, 25, 6, 1, 215, 135, 2, 248, 221, 22, 227, 16, 25, 6, - 1, 215, 135, 2, 248, 221, 22, 226, 86, 25, 4, 1, 227, 105, 2, 225, 75, - 25, 4, 1, 227, 105, 2, 248, 220, 25, 4, 1, 227, 105, 2, 225, 76, 22, 214, - 251, 25, 4, 1, 227, 105, 2, 248, 221, 22, 214, 251, 25, 4, 1, 227, 105, - 2, 225, 76, 22, 227, 16, 25, 4, 1, 227, 105, 2, 248, 221, 22, 227, 16, - 25, 4, 1, 227, 105, 2, 225, 76, 22, 226, 86, 25, 4, 1, 227, 105, 2, 248, - 221, 22, 226, 86, 25, 6, 1, 227, 105, 2, 225, 75, 25, 6, 1, 227, 105, 2, - 248, 220, 25, 6, 1, 227, 105, 2, 225, 76, 22, 214, 251, 25, 6, 1, 227, - 105, 2, 248, 221, 22, 214, 251, 25, 6, 1, 227, 105, 2, 225, 76, 22, 227, - 16, 25, 6, 1, 227, 105, 2, 248, 221, 22, 227, 16, 25, 6, 1, 227, 105, 2, - 225, 76, 22, 226, 86, 25, 6, 1, 227, 105, 2, 248, 221, 22, 226, 86, 25, - 4, 1, 254, 180, 2, 214, 251, 25, 4, 1, 254, 180, 2, 227, 16, 25, 4, 1, - 245, 185, 2, 214, 251, 25, 4, 1, 245, 185, 2, 227, 16, 25, 4, 1, 245, - 150, 2, 214, 251, 25, 4, 1, 245, 150, 2, 227, 16, 25, 4, 1, 236, 45, 2, - 214, 251, 25, 4, 1, 236, 45, 2, 227, 16, 25, 4, 1, 227, 103, 2, 214, 251, - 25, 4, 1, 227, 103, 2, 227, 16, 25, 4, 1, 215, 135, 2, 214, 251, 25, 4, - 1, 215, 135, 2, 227, 16, 25, 4, 1, 227, 105, 2, 214, 251, 25, 4, 1, 227, - 105, 2, 227, 16, 25, 4, 1, 254, 180, 2, 225, 76, 22, 212, 211, 25, 4, 1, - 254, 180, 2, 248, 221, 22, 212, 211, 25, 4, 1, 254, 180, 2, 225, 76, 22, - 214, 252, 22, 212, 211, 25, 4, 1, 254, 180, 2, 248, 221, 22, 214, 252, - 22, 212, 211, 25, 4, 1, 254, 180, 2, 225, 76, 22, 227, 17, 22, 212, 211, - 25, 4, 1, 254, 180, 2, 248, 221, 22, 227, 17, 22, 212, 211, 25, 4, 1, - 254, 180, 2, 225, 76, 22, 226, 87, 22, 212, 211, 25, 4, 1, 254, 180, 2, - 248, 221, 22, 226, 87, 22, 212, 211, 25, 6, 1, 254, 180, 2, 225, 76, 22, - 225, 87, 25, 6, 1, 254, 180, 2, 248, 221, 22, 225, 87, 25, 6, 1, 254, - 180, 2, 225, 76, 22, 214, 252, 22, 225, 87, 25, 6, 1, 254, 180, 2, 248, - 221, 22, 214, 252, 22, 225, 87, 25, 6, 1, 254, 180, 2, 225, 76, 22, 227, - 17, 22, 225, 87, 25, 6, 1, 254, 180, 2, 248, 221, 22, 227, 17, 22, 225, - 87, 25, 6, 1, 254, 180, 2, 225, 76, 22, 226, 87, 22, 225, 87, 25, 6, 1, - 254, 180, 2, 248, 221, 22, 226, 87, 22, 225, 87, 25, 4, 1, 245, 150, 2, - 225, 76, 22, 212, 211, 25, 4, 1, 245, 150, 2, 248, 221, 22, 212, 211, 25, - 4, 1, 245, 150, 2, 225, 76, 22, 214, 252, 22, 212, 211, 25, 4, 1, 245, - 150, 2, 248, 221, 22, 214, 252, 22, 212, 211, 25, 4, 1, 245, 150, 2, 225, - 76, 22, 227, 17, 22, 212, 211, 25, 4, 1, 245, 150, 2, 248, 221, 22, 227, - 17, 22, 212, 211, 25, 4, 1, 245, 150, 2, 225, 76, 22, 226, 87, 22, 212, - 211, 25, 4, 1, 245, 150, 2, 248, 221, 22, 226, 87, 22, 212, 211, 25, 6, - 1, 245, 150, 2, 225, 76, 22, 225, 87, 25, 6, 1, 245, 150, 2, 248, 221, - 22, 225, 87, 25, 6, 1, 245, 150, 2, 225, 76, 22, 214, 252, 22, 225, 87, - 25, 6, 1, 245, 150, 2, 248, 221, 22, 214, 252, 22, 225, 87, 25, 6, 1, - 245, 150, 2, 225, 76, 22, 227, 17, 22, 225, 87, 25, 6, 1, 245, 150, 2, - 248, 221, 22, 227, 17, 22, 225, 87, 25, 6, 1, 245, 150, 2, 225, 76, 22, - 226, 87, 22, 225, 87, 25, 6, 1, 245, 150, 2, 248, 221, 22, 226, 87, 22, - 225, 87, 25, 4, 1, 227, 105, 2, 225, 76, 22, 212, 211, 25, 4, 1, 227, - 105, 2, 248, 221, 22, 212, 211, 25, 4, 1, 227, 105, 2, 225, 76, 22, 214, - 252, 22, 212, 211, 25, 4, 1, 227, 105, 2, 248, 221, 22, 214, 252, 22, - 212, 211, 25, 4, 1, 227, 105, 2, 225, 76, 22, 227, 17, 22, 212, 211, 25, - 4, 1, 227, 105, 2, 248, 221, 22, 227, 17, 22, 212, 211, 25, 4, 1, 227, - 105, 2, 225, 76, 22, 226, 87, 22, 212, 211, 25, 4, 1, 227, 105, 2, 248, - 221, 22, 226, 87, 22, 212, 211, 25, 6, 1, 227, 105, 2, 225, 76, 22, 225, - 87, 25, 6, 1, 227, 105, 2, 248, 221, 22, 225, 87, 25, 6, 1, 227, 105, 2, - 225, 76, 22, 214, 252, 22, 225, 87, 25, 6, 1, 227, 105, 2, 248, 221, 22, - 214, 252, 22, 225, 87, 25, 6, 1, 227, 105, 2, 225, 76, 22, 227, 17, 22, - 225, 87, 25, 6, 1, 227, 105, 2, 248, 221, 22, 227, 17, 22, 225, 87, 25, - 6, 1, 227, 105, 2, 225, 76, 22, 226, 87, 22, 225, 87, 25, 6, 1, 227, 105, - 2, 248, 221, 22, 226, 87, 22, 225, 87, 25, 4, 1, 254, 180, 2, 214, 105, - 25, 4, 1, 254, 180, 2, 232, 110, 25, 4, 1, 254, 180, 2, 214, 252, 22, - 212, 211, 25, 4, 1, 254, 180, 2, 212, 211, 25, 4, 1, 254, 180, 2, 227, - 17, 22, 212, 211, 25, 4, 1, 254, 180, 2, 226, 86, 25, 4, 1, 254, 180, 2, - 226, 87, 22, 212, 211, 25, 6, 1, 254, 180, 2, 214, 105, 25, 6, 1, 254, - 180, 2, 232, 110, 25, 6, 1, 254, 180, 2, 214, 251, 25, 6, 1, 254, 180, 2, - 227, 16, 25, 6, 1, 254, 180, 2, 225, 87, 25, 234, 122, 25, 225, 87, 25, - 225, 75, 25, 226, 86, 25, 248, 69, 22, 226, 86, 25, 4, 1, 245, 150, 2, - 214, 252, 22, 212, 211, 25, 4, 1, 245, 150, 2, 212, 211, 25, 4, 1, 245, - 150, 2, 227, 17, 22, 212, 211, 25, 4, 1, 245, 150, 2, 226, 86, 25, 4, 1, - 245, 150, 2, 226, 87, 22, 212, 211, 25, 6, 1, 245, 185, 2, 214, 251, 25, - 6, 1, 245, 185, 2, 227, 16, 25, 6, 1, 245, 150, 2, 214, 251, 25, 6, 1, - 245, 150, 2, 227, 16, 25, 6, 1, 245, 150, 2, 225, 87, 25, 225, 76, 22, - 214, 251, 25, 225, 76, 22, 227, 16, 25, 225, 76, 22, 226, 86, 25, 4, 1, - 236, 45, 2, 214, 105, 25, 4, 1, 236, 45, 2, 232, 110, 25, 4, 1, 236, 45, - 2, 248, 69, 22, 214, 251, 25, 4, 1, 236, 45, 2, 248, 69, 22, 227, 16, 25, - 4, 1, 236, 45, 2, 226, 86, 25, 4, 1, 236, 45, 2, 248, 69, 22, 226, 86, - 25, 6, 1, 236, 45, 2, 214, 105, 25, 6, 1, 236, 45, 2, 232, 110, 25, 6, 1, - 236, 45, 2, 214, 251, 25, 6, 1, 236, 45, 2, 227, 16, 25, 248, 221, 22, - 214, 251, 25, 248, 221, 22, 227, 16, 25, 248, 221, 22, 226, 86, 25, 4, 1, - 215, 135, 2, 214, 105, 25, 4, 1, 215, 135, 2, 232, 110, 25, 4, 1, 215, - 135, 2, 248, 69, 22, 214, 251, 25, 4, 1, 215, 135, 2, 248, 69, 22, 227, - 16, 25, 4, 1, 223, 225, 2, 225, 75, 25, 4, 1, 223, 225, 2, 248, 220, 25, - 4, 1, 215, 135, 2, 226, 86, 25, 4, 1, 215, 135, 2, 248, 69, 22, 226, 86, - 25, 6, 1, 215, 135, 2, 214, 105, 25, 6, 1, 215, 135, 2, 232, 110, 25, 6, - 1, 215, 135, 2, 214, 251, 25, 6, 1, 215, 135, 2, 227, 16, 25, 6, 1, 223, - 225, 2, 248, 220, 25, 248, 69, 22, 214, 251, 25, 248, 69, 22, 227, 16, - 25, 214, 251, 25, 4, 1, 227, 105, 2, 214, 252, 22, 212, 211, 25, 4, 1, - 227, 105, 2, 212, 211, 25, 4, 1, 227, 105, 2, 227, 17, 22, 212, 211, 25, - 4, 1, 227, 105, 2, 226, 86, 25, 4, 1, 227, 105, 2, 226, 87, 22, 212, 211, - 25, 6, 1, 227, 103, 2, 214, 251, 25, 6, 1, 227, 103, 2, 227, 16, 25, 6, - 1, 227, 105, 2, 214, 251, 25, 6, 1, 227, 105, 2, 227, 16, 25, 6, 1, 227, - 105, 2, 225, 87, 25, 227, 16, 25, 248, 220, 245, 230, 224, 207, 245, 239, - 224, 207, 245, 230, 219, 225, 245, 239, 219, 225, 217, 108, 219, 225, - 244, 99, 219, 225, 220, 70, 219, 225, 244, 201, 219, 225, 225, 63, 219, - 225, 217, 136, 219, 225, 242, 137, 219, 225, 212, 80, 213, 233, 219, 225, - 212, 80, 213, 233, 228, 221, 212, 80, 213, 233, 235, 180, 233, 160, 79, - 223, 174, 79, 241, 21, 228, 222, 241, 21, 244, 201, 248, 223, 245, 230, - 248, 223, 245, 239, 248, 223, 201, 134, 52, 66, 233, 83, 52, 117, 233, - 83, 43, 220, 100, 224, 178, 79, 47, 220, 100, 224, 178, 79, 220, 100, - 232, 238, 224, 178, 79, 220, 100, 242, 12, 224, 178, 79, 43, 52, 224, - 178, 79, 47, 52, 224, 178, 79, 52, 232, 238, 224, 178, 79, 52, 242, 12, - 224, 178, 79, 249, 15, 52, 249, 15, 251, 167, 216, 193, 251, 167, 124, - 62, 233, 178, 119, 62, 233, 178, 201, 245, 241, 241, 19, 225, 180, 233, - 84, 221, 80, 226, 180, 221, 80, 233, 160, 245, 237, 223, 174, 245, 237, - 225, 162, 248, 13, 244, 108, 233, 160, 227, 23, 223, 174, 227, 23, 230, - 82, 228, 227, 219, 225, 226, 94, 231, 76, 53, 226, 94, 217, 214, 217, - 114, 53, 225, 107, 52, 225, 107, 216, 182, 225, 107, 223, 236, 225, 107, - 223, 236, 52, 225, 107, 223, 236, 216, 182, 225, 107, 251, 38, 220, 100, - 233, 164, 254, 146, 224, 178, 79, 220, 100, 223, 178, 254, 146, 224, 178, - 79, 224, 34, 79, 52, 245, 119, 79, 236, 59, 227, 25, 215, 156, 143, 217, - 78, 251, 39, 236, 74, 225, 180, 254, 1, 241, 22, 251, 167, 244, 92, 220, - 42, 43, 42, 251, 210, 2, 224, 187, 47, 42, 251, 210, 2, 224, 187, 52, - 224, 193, 79, 224, 193, 245, 119, 79, 245, 119, 224, 193, 79, 217, 37, 5, - 245, 151, 223, 236, 225, 236, 53, 85, 135, 251, 167, 85, 96, 251, 167, - 117, 254, 3, 223, 236, 221, 93, 250, 61, 215, 140, 119, 254, 2, 254, 194, - 214, 170, 250, 22, 231, 65, 53, 218, 193, 248, 223, 236, 52, 215, 156, - 244, 141, 225, 63, 79, 137, 62, 225, 62, 224, 204, 225, 107, 244, 101, - 62, 225, 62, 244, 170, 62, 225, 62, 119, 62, 225, 62, 244, 101, 62, 79, - 246, 193, 249, 193, 216, 192, 66, 244, 101, 247, 193, 231, 217, 14, 219, - 225, 213, 199, 235, 180, 244, 62, 254, 93, 236, 50, 217, 52, 236, 50, - 221, 80, 236, 50, 225, 192, 236, 86, 218, 141, 218, 210, 255, 38, 218, - 141, 218, 210, 236, 86, 12, 244, 109, 221, 25, 255, 38, 12, 244, 109, - 221, 25, 230, 78, 21, 221, 26, 228, 223, 21, 221, 26, 218, 237, 212, 79, - 218, 237, 7, 4, 1, 75, 218, 237, 167, 218, 237, 185, 218, 237, 192, 218, - 237, 200, 218, 237, 198, 218, 237, 203, 218, 237, 95, 53, 218, 237, 231, - 64, 218, 237, 245, 182, 53, 218, 237, 43, 226, 168, 218, 237, 47, 226, - 168, 218, 237, 7, 4, 1, 206, 219, 24, 212, 79, 219, 24, 118, 219, 24, - 112, 219, 24, 170, 219, 24, 167, 219, 24, 185, 219, 24, 192, 219, 24, - 200, 219, 24, 198, 219, 24, 203, 219, 24, 95, 53, 219, 24, 231, 64, 219, - 24, 245, 182, 53, 219, 24, 43, 226, 168, 219, 24, 47, 226, 168, 7, 219, - 24, 4, 1, 63, 7, 219, 24, 4, 1, 77, 7, 219, 24, 4, 1, 78, 7, 219, 24, 4, - 1, 213, 169, 7, 219, 24, 4, 1, 222, 136, 7, 219, 24, 4, 1, 242, 162, 7, - 219, 24, 4, 1, 235, 141, 7, 219, 24, 4, 1, 155, 7, 219, 24, 4, 1, 184, 7, - 219, 24, 4, 1, 206, 7, 219, 24, 4, 1, 227, 11, 7, 219, 24, 4, 1, 196, 7, - 219, 24, 4, 1, 218, 113, 245, 134, 53, 250, 31, 53, 249, 180, 53, 244, - 85, 244, 88, 53, 233, 68, 53, 231, 77, 53, 230, 97, 53, 226, 74, 53, 223, - 55, 53, 213, 207, 53, 163, 220, 250, 53, 247, 202, 53, 245, 135, 53, 234, - 196, 53, 216, 84, 53, 246, 176, 53, 243, 136, 226, 104, 53, 226, 72, 53, - 242, 209, 53, 253, 225, 53, 241, 77, 53, 250, 242, 53, 233, 61, 216, 229, - 53, 219, 207, 53, 217, 211, 53, 236, 99, 223, 55, 53, 38, 43, 242, 102, - 50, 38, 47, 242, 102, 50, 38, 187, 66, 233, 84, 227, 26, 38, 220, 196, - 66, 233, 84, 227, 26, 38, 254, 126, 80, 50, 38, 250, 62, 80, 50, 38, 43, - 80, 50, 38, 47, 80, 50, 38, 223, 165, 227, 26, 38, 250, 62, 223, 165, - 227, 26, 38, 254, 126, 223, 165, 227, 26, 38, 137, 181, 50, 38, 244, 101, - 181, 50, 38, 245, 225, 250, 95, 38, 245, 225, 219, 185, 38, 245, 225, - 248, 65, 38, 245, 225, 250, 96, 252, 224, 38, 43, 47, 80, 50, 38, 245, - 225, 222, 130, 38, 245, 225, 234, 253, 38, 245, 225, 215, 132, 225, 177, - 216, 196, 38, 223, 237, 219, 251, 227, 26, 38, 52, 66, 219, 59, 227, 26, - 38, 254, 136, 88, 38, 216, 182, 215, 158, 38, 213, 235, 251, 193, 50, 38, - 135, 80, 227, 26, 38, 187, 52, 219, 251, 227, 26, 38, 96, 242, 102, 2, - 252, 185, 246, 178, 38, 135, 242, 102, 2, 252, 185, 246, 178, 38, 43, 80, - 55, 38, 47, 80, 55, 38, 254, 4, 50, 255, 43, 227, 134, 255, 28, 217, 10, - 217, 162, 219, 33, 190, 6, 251, 121, 248, 143, 250, 235, 250, 232, 233, - 84, 88, 251, 40, 227, 134, 251, 81, 215, 165, 245, 136, 249, 253, 222, - 127, 248, 143, 245, 12, 115, 4, 244, 41, 115, 6, 242, 162, 252, 11, 6, - 242, 162, 190, 6, 242, 162, 225, 205, 249, 253, 225, 205, 249, 254, 113, - 119, 226, 20, 115, 6, 75, 252, 11, 6, 75, 115, 6, 155, 115, 4, 155, 234, - 13, 57, 252, 187, 88, 190, 6, 206, 228, 95, 53, 219, 237, 224, 46, 249, - 224, 115, 6, 227, 11, 190, 6, 227, 11, 190, 6, 225, 19, 115, 6, 152, 252, - 11, 6, 152, 190, 6, 152, 225, 112, 218, 34, 223, 248, 221, 76, 79, 217, - 223, 53, 216, 223, 156, 53, 214, 222, 190, 6, 212, 152, 227, 39, 53, 227, - 124, 53, 236, 52, 227, 124, 53, 252, 11, 6, 212, 152, 216, 66, 25, 4, 1, - 236, 44, 235, 35, 53, 254, 143, 53, 115, 6, 253, 201, 252, 11, 6, 251, - 121, 245, 154, 88, 115, 4, 77, 115, 6, 77, 115, 6, 245, 95, 216, 66, 6, - 245, 95, 115, 6, 184, 115, 4, 78, 108, 88, 252, 76, 88, 243, 42, 88, 249, - 1, 88, 236, 90, 219, 235, 223, 123, 6, 225, 19, 245, 15, 53, 190, 4, 226, - 20, 190, 4, 243, 203, 190, 6, 243, 203, 190, 6, 226, 20, 190, 230, 166, - 218, 255, 216, 66, 35, 6, 244, 41, 216, 66, 35, 6, 155, 223, 236, 35, 6, - 155, 216, 66, 35, 6, 213, 108, 190, 32, 6, 249, 125, 190, 32, 4, 249, - 125, 190, 32, 4, 77, 190, 32, 4, 75, 190, 32, 4, 236, 3, 225, 90, 233, - 83, 216, 66, 254, 162, 226, 94, 53, 254, 215, 216, 66, 4, 245, 95, 16, - 31, 222, 191, 219, 235, 214, 101, 244, 92, 124, 221, 62, 214, 101, 244, - 92, 124, 229, 89, 214, 101, 244, 92, 124, 217, 207, 214, 101, 244, 92, - 124, 217, 134, 214, 101, 244, 92, 119, 217, 132, 214, 101, 244, 92, 124, - 244, 206, 214, 101, 244, 92, 119, 244, 205, 214, 101, 244, 92, 137, 244, - 205, 214, 101, 244, 92, 244, 101, 244, 205, 214, 101, 244, 92, 124, 220, - 62, 214, 101, 244, 92, 244, 170, 220, 60, 214, 101, 244, 92, 124, 246, - 10, 214, 101, 244, 92, 137, 246, 8, 214, 101, 244, 92, 244, 170, 246, 8, - 214, 101, 244, 92, 221, 66, 246, 8, 244, 92, 228, 96, 118, 223, 134, 228, - 97, 118, 223, 134, 228, 97, 112, 223, 134, 228, 97, 170, 223, 134, 228, - 97, 167, 223, 134, 228, 97, 185, 223, 134, 228, 97, 192, 223, 134, 228, - 97, 200, 223, 134, 228, 97, 198, 223, 134, 228, 97, 203, 223, 134, 228, - 97, 217, 213, 223, 134, 228, 97, 245, 245, 223, 134, 228, 97, 216, 48, - 223, 134, 228, 97, 244, 203, 223, 134, 228, 97, 124, 241, 62, 223, 134, - 228, 97, 244, 170, 241, 62, 223, 134, 228, 97, 124, 217, 113, 4, 223, - 134, 228, 97, 118, 4, 223, 134, 228, 97, 112, 4, 223, 134, 228, 97, 170, - 4, 223, 134, 228, 97, 167, 4, 223, 134, 228, 97, 185, 4, 223, 134, 228, - 97, 192, 4, 223, 134, 228, 97, 200, 4, 223, 134, 228, 97, 198, 4, 223, - 134, 228, 97, 203, 4, 223, 134, 228, 97, 217, 213, 4, 223, 134, 228, 97, - 245, 245, 4, 223, 134, 228, 97, 216, 48, 4, 223, 134, 228, 97, 244, 203, - 4, 223, 134, 228, 97, 124, 241, 62, 4, 223, 134, 228, 97, 244, 170, 241, - 62, 4, 223, 134, 228, 97, 124, 217, 113, 223, 134, 228, 97, 124, 217, - 114, 251, 122, 249, 125, 223, 134, 228, 97, 244, 170, 217, 113, 223, 134, - 228, 97, 217, 214, 217, 113, 223, 134, 228, 97, 223, 236, 124, 241, 62, - 7, 4, 1, 223, 236, 251, 121, 223, 134, 228, 97, 220, 72, 233, 200, 17, - 223, 134, 228, 97, 244, 204, 246, 47, 17, 223, 134, 228, 97, 244, 204, - 217, 113, 223, 134, 228, 97, 124, 241, 63, 217, 113, 214, 101, 244, 92, - 212, 80, 217, 132, 135, 71, 215, 130, 71, 96, 71, 246, 179, 71, 43, 47, - 71, 116, 121, 71, 228, 210, 213, 253, 71, 228, 210, 246, 41, 71, 219, - 234, 246, 41, 71, 219, 234, 213, 253, 71, 135, 80, 2, 91, 96, 80, 2, 91, - 135, 214, 23, 71, 96, 214, 23, 71, 135, 119, 242, 81, 71, 215, 130, 119, - 242, 81, 71, 96, 119, 242, 81, 71, 246, 179, 119, 242, 81, 71, 135, 80, - 2, 218, 40, 96, 80, 2, 218, 40, 135, 80, 244, 77, 134, 215, 130, 80, 244, - 77, 134, 96, 80, 244, 77, 134, 246, 179, 80, 244, 77, 134, 116, 121, 80, - 2, 252, 173, 135, 80, 2, 102, 96, 80, 2, 102, 135, 80, 2, 232, 251, 96, - 80, 2, 232, 251, 43, 47, 214, 23, 71, 43, 47, 80, 2, 91, 246, 179, 212, - 28, 71, 215, 130, 80, 2, 217, 44, 233, 159, 215, 130, 80, 2, 217, 44, - 223, 172, 246, 179, 80, 2, 217, 44, 233, 159, 246, 179, 80, 2, 217, 44, - 223, 172, 96, 80, 2, 249, 223, 246, 178, 246, 179, 80, 2, 249, 223, 233, - 159, 254, 126, 216, 240, 221, 96, 71, 250, 62, 216, 240, 221, 96, 71, - 228, 210, 213, 253, 80, 217, 10, 187, 134, 135, 80, 217, 10, 252, 187, - 113, 96, 80, 217, 10, 134, 254, 126, 210, 250, 96, 71, 250, 62, 210, 250, - 96, 71, 135, 242, 102, 2, 252, 185, 215, 129, 135, 242, 102, 2, 252, 185, - 246, 178, 215, 130, 242, 102, 2, 252, 185, 223, 172, 215, 130, 242, 102, - 2, 252, 185, 233, 159, 96, 242, 102, 2, 252, 185, 215, 129, 96, 242, 102, - 2, 252, 185, 246, 178, 246, 179, 242, 102, 2, 252, 185, 223, 172, 246, - 179, 242, 102, 2, 252, 185, 233, 159, 96, 80, 113, 135, 71, 215, 130, 80, - 135, 68, 246, 179, 71, 135, 80, 113, 96, 71, 135, 226, 234, 254, 33, 215, - 130, 226, 234, 254, 33, 96, 226, 234, 254, 33, 246, 179, 226, 234, 254, - 33, 135, 242, 102, 113, 96, 242, 101, 96, 242, 102, 113, 135, 242, 101, - 135, 52, 80, 2, 91, 43, 47, 52, 80, 2, 91, 96, 52, 80, 2, 91, 135, 52, - 71, 215, 130, 52, 71, 96, 52, 71, 246, 179, 52, 71, 43, 47, 52, 71, 116, - 121, 52, 71, 228, 210, 213, 253, 52, 71, 228, 210, 246, 41, 52, 71, 219, - 234, 246, 41, 52, 71, 219, 234, 213, 253, 52, 71, 135, 216, 182, 71, 96, - 216, 182, 71, 135, 219, 181, 71, 96, 219, 181, 71, 215, 130, 80, 2, 52, - 91, 246, 179, 80, 2, 52, 91, 135, 248, 222, 71, 215, 130, 248, 222, 71, - 96, 248, 222, 71, 246, 179, 248, 222, 71, 135, 80, 217, 10, 134, 96, 80, - 217, 10, 134, 135, 69, 71, 215, 130, 69, 71, 96, 69, 71, 246, 179, 69, - 71, 215, 130, 69, 80, 244, 77, 134, 215, 130, 69, 80, 227, 100, 226, 125, - 215, 130, 69, 80, 227, 100, 226, 126, 2, 201, 134, 215, 130, 69, 80, 227, - 100, 226, 126, 2, 66, 134, 215, 130, 69, 52, 71, 215, 130, 69, 52, 80, - 227, 100, 226, 125, 96, 69, 80, 244, 77, 214, 43, 228, 210, 213, 253, 80, - 217, 10, 249, 222, 219, 234, 246, 41, 80, 217, 10, 249, 222, 116, 121, - 69, 71, 47, 80, 2, 4, 250, 95, 246, 179, 80, 135, 68, 215, 130, 71, 137, - 96, 254, 33, 135, 80, 2, 66, 91, 96, 80, 2, 66, 91, 43, 47, 80, 2, 66, - 91, 135, 80, 2, 52, 66, 91, 96, 80, 2, 52, 66, 91, 43, 47, 80, 2, 52, 66, - 91, 135, 227, 76, 71, 96, 227, 76, 71, 43, 47, 227, 76, 71, 31, 254, 190, - 250, 19, 226, 162, 248, 50, 217, 153, 245, 115, 217, 153, 247, 213, 228, - 206, 245, 116, 245, 231, 221, 71, 236, 102, 230, 108, 245, 248, 227, 134, - 228, 206, 254, 160, 245, 248, 227, 134, 4, 245, 248, 227, 134, 249, 248, - 254, 24, 231, 196, 247, 213, 228, 206, 249, 250, 254, 24, 231, 196, 4, - 249, 248, 254, 24, 231, 196, 245, 222, 68, 225, 92, 230, 166, 225, 99, - 230, 166, 249, 227, 230, 166, 218, 255, 231, 65, 53, 231, 63, 53, 62, - 225, 192, 247, 242, 220, 42, 221, 72, 231, 64, 254, 4, 227, 71, 223, 165, - 227, 71, 251, 168, 227, 71, 42, 223, 129, 249, 173, 223, 129, 244, 94, - 223, 129, 225, 88, 109, 236, 92, 47, 254, 145, 254, 145, 231, 223, 254, - 145, 219, 206, 254, 145, 247, 244, 247, 213, 228, 206, 247, 247, 226, - 173, 109, 228, 206, 226, 173, 109, 233, 17, 254, 154, 233, 17, 227, 62, - 236, 56, 215, 152, 236, 69, 52, 236, 69, 216, 182, 236, 69, 249, 244, - 236, 69, 218, 227, 236, 69, 214, 114, 236, 69, 250, 62, 236, 69, 250, 62, - 249, 244, 236, 69, 254, 126, 249, 244, 236, 69, 217, 152, 252, 113, 224, - 64, 225, 89, 62, 231, 64, 245, 121, 243, 142, 225, 89, 241, 162, 217, 56, - 227, 71, 223, 236, 177, 236, 52, 233, 187, 196, 220, 102, 214, 22, 213, - 191, 225, 99, 228, 206, 177, 231, 65, 177, 253, 253, 126, 109, 228, 206, - 253, 253, 126, 109, 254, 89, 126, 109, 254, 89, 251, 142, 228, 206, 255, - 37, 126, 109, 229, 248, 254, 89, 228, 213, 255, 37, 126, 109, 254, 184, - 126, 109, 228, 206, 254, 184, 126, 109, 254, 184, 126, 171, 126, 109, - 216, 182, 177, 254, 191, 126, 109, 245, 178, 109, 243, 141, 245, 178, - 109, 248, 51, 252, 70, 254, 91, 217, 162, 233, 91, 243, 141, 126, 109, - 254, 89, 126, 217, 10, 171, 217, 162, 236, 127, 227, 134, 236, 127, 68, - 171, 254, 89, 126, 109, 250, 31, 245, 181, 245, 182, 250, 30, 223, 165, - 236, 113, 126, 109, 223, 165, 126, 109, 249, 216, 109, 245, 153, 245, - 180, 109, 219, 110, 245, 181, 248, 127, 126, 109, 126, 217, 10, 251, 132, - 248, 144, 231, 223, 251, 131, 224, 191, 126, 109, 228, 206, 126, 109, - 240, 214, 109, 228, 206, 240, 214, 109, 219, 63, 245, 178, 109, 233, 137, - 171, 126, 109, 242, 228, 171, 126, 109, 233, 137, 113, 126, 109, 242, - 228, 113, 126, 109, 233, 137, 251, 142, 228, 206, 126, 109, 242, 228, - 251, 142, 228, 206, 126, 109, 230, 237, 233, 136, 230, 237, 242, 227, - 252, 70, 228, 206, 245, 178, 109, 228, 206, 233, 136, 228, 206, 242, 227, - 229, 248, 233, 137, 228, 213, 126, 109, 229, 248, 242, 228, 228, 213, - 126, 109, 233, 137, 171, 245, 178, 109, 242, 228, 171, 245, 178, 109, - 229, 248, 233, 137, 228, 213, 245, 178, 109, 229, 248, 242, 228, 228, - 213, 245, 178, 109, 233, 137, 171, 242, 227, 242, 228, 171, 233, 136, - 229, 248, 233, 137, 228, 213, 242, 227, 229, 248, 242, 228, 228, 213, - 233, 136, 225, 118, 219, 14, 225, 119, 171, 126, 109, 219, 15, 171, 126, - 109, 225, 119, 171, 245, 178, 109, 219, 15, 171, 245, 178, 109, 247, 213, - 228, 206, 225, 121, 247, 213, 228, 206, 219, 16, 219, 23, 227, 134, 218, - 236, 227, 134, 228, 206, 111, 219, 23, 227, 134, 228, 206, 111, 218, 236, - 227, 134, 219, 23, 68, 171, 126, 109, 218, 236, 68, 171, 126, 109, 229, - 248, 111, 219, 23, 68, 228, 213, 126, 109, 229, 248, 111, 218, 236, 68, - 228, 213, 126, 109, 219, 23, 68, 2, 228, 206, 126, 109, 218, 236, 68, 2, - 228, 206, 126, 109, 230, 221, 230, 222, 230, 223, 230, 222, 215, 152, 42, - 236, 127, 227, 134, 42, 227, 55, 227, 134, 42, 236, 127, 68, 171, 126, - 109, 42, 227, 55, 68, 171, 126, 109, 42, 251, 51, 42, 249, 166, 37, 225, - 192, 37, 231, 64, 37, 217, 52, 37, 247, 242, 220, 42, 37, 62, 227, 71, - 37, 223, 165, 227, 71, 37, 254, 4, 227, 71, 37, 245, 181, 37, 248, 223, - 92, 225, 192, 92, 231, 64, 92, 217, 52, 92, 62, 227, 71, 47, 218, 50, 43, - 218, 50, 121, 218, 50, 116, 218, 50, 254, 7, 231, 40, 216, 162, 244, 114, - 216, 182, 66, 252, 187, 47, 216, 65, 52, 66, 252, 187, 52, 47, 216, 65, - 247, 213, 228, 206, 225, 84, 228, 206, 216, 162, 247, 213, 228, 206, 244, - 115, 229, 250, 52, 66, 252, 187, 52, 47, 216, 65, 225, 119, 215, 160, - 224, 19, 219, 15, 215, 160, 224, 19, 228, 211, 219, 36, 227, 134, 249, - 248, 254, 24, 228, 211, 219, 35, 228, 211, 219, 36, 68, 171, 126, 109, - 249, 248, 254, 24, 228, 211, 219, 36, 171, 126, 109, 227, 55, 227, 134, - 236, 127, 227, 134, 230, 227, 242, 48, 250, 2, 232, 15, 236, 66, 213, - 136, 230, 90, 228, 212, 47, 254, 146, 2, 254, 66, 47, 216, 196, 230, 166, - 233, 17, 254, 154, 230, 166, 233, 17, 227, 62, 230, 166, 236, 56, 230, - 166, 215, 152, 248, 66, 227, 71, 62, 227, 71, 219, 110, 227, 71, 247, - 242, 217, 52, 251, 215, 43, 228, 211, 245, 14, 221, 92, 225, 99, 47, 228, - 211, 245, 14, 221, 92, 225, 99, 43, 221, 92, 225, 99, 47, 221, 92, 225, - 99, 223, 236, 217, 56, 245, 181, 249, 163, 233, 17, 227, 62, 249, 163, - 233, 17, 254, 154, 52, 219, 22, 52, 218, 235, 52, 236, 56, 52, 215, 152, - 225, 215, 126, 22, 226, 173, 109, 233, 137, 2, 247, 195, 242, 228, 2, - 247, 195, 214, 169, 230, 237, 233, 136, 214, 169, 230, 237, 242, 227, - 233, 137, 126, 217, 10, 171, 242, 227, 242, 228, 126, 217, 10, 171, 233, - 136, 126, 217, 10, 171, 233, 136, 126, 217, 10, 171, 242, 227, 126, 217, - 10, 171, 225, 118, 126, 217, 10, 171, 219, 14, 247, 213, 228, 206, 225, - 122, 171, 245, 183, 247, 213, 228, 206, 219, 17, 171, 245, 183, 228, 206, - 42, 236, 127, 68, 171, 126, 109, 228, 206, 42, 227, 55, 68, 171, 126, - 109, 42, 236, 127, 68, 171, 228, 206, 126, 109, 42, 227, 55, 68, 171, - 228, 206, 126, 109, 233, 137, 251, 142, 228, 206, 245, 178, 109, 242, - 228, 251, 142, 228, 206, 245, 178, 109, 225, 119, 251, 142, 228, 206, - 245, 178, 109, 219, 15, 251, 142, 228, 206, 245, 178, 109, 228, 206, 228, - 211, 219, 36, 227, 134, 247, 213, 228, 206, 249, 250, 254, 24, 228, 211, - 219, 35, 228, 206, 228, 211, 219, 36, 68, 171, 126, 109, 247, 213, 228, - 206, 249, 250, 254, 24, 228, 211, 219, 36, 171, 245, 183, 66, 245, 241, - 231, 105, 201, 245, 241, 116, 47, 248, 72, 245, 241, 121, 47, 248, 72, - 245, 241, 245, 248, 68, 2, 187, 201, 91, 245, 248, 68, 2, 66, 252, 187, - 253, 250, 245, 222, 68, 201, 91, 4, 245, 248, 68, 2, 66, 252, 187, 253, - 250, 245, 222, 68, 201, 91, 245, 248, 68, 2, 62, 50, 245, 248, 68, 2, - 227, 29, 4, 245, 248, 68, 2, 227, 29, 245, 248, 68, 2, 215, 159, 245, - 248, 68, 2, 119, 201, 219, 46, 249, 248, 2, 187, 201, 91, 249, 248, 2, - 66, 252, 187, 253, 250, 245, 222, 68, 201, 91, 4, 249, 248, 2, 66, 252, - 187, 253, 250, 245, 222, 68, 201, 91, 249, 248, 2, 227, 29, 4, 249, 248, - 2, 227, 29, 212, 153, 179, 252, 218, 231, 195, 248, 67, 53, 245, 250, 71, - 241, 83, 116, 254, 35, 121, 254, 35, 225, 95, 226, 77, 214, 19, 233, 83, - 43, 250, 238, 47, 250, 238, 43, 244, 146, 47, 244, 146, 251, 226, 47, - 249, 195, 251, 226, 43, 249, 195, 216, 240, 47, 249, 195, 216, 240, 43, - 249, 195, 223, 236, 228, 206, 53, 42, 232, 233, 254, 66, 222, 106, 222, - 113, 217, 223, 224, 47, 225, 157, 236, 96, 214, 150, 219, 185, 225, 209, - 68, 236, 65, 53, 216, 66, 228, 206, 53, 214, 29, 241, 85, 216, 240, 43, - 249, 222, 216, 240, 47, 249, 222, 251, 226, 43, 249, 222, 251, 226, 47, - 249, 222, 216, 240, 157, 236, 69, 251, 226, 157, 236, 69, 244, 74, 220, - 22, 116, 254, 36, 252, 71, 119, 201, 252, 175, 227, 64, 235, 0, 245, 174, - 217, 10, 217, 162, 223, 182, 213, 170, 236, 113, 111, 224, 44, 251, 214, - 234, 255, 233, 164, 254, 146, 125, 223, 178, 254, 146, 125, 245, 174, - 217, 10, 217, 162, 233, 168, 252, 82, 223, 164, 249, 135, 254, 191, 254, - 43, 218, 140, 216, 230, 223, 60, 248, 32, 227, 56, 250, 4, 218, 16, 220, - 33, 249, 213, 249, 212, 197, 199, 16, 241, 4, 197, 199, 16, 219, 179, - 224, 207, 197, 199, 16, 224, 208, 245, 183, 197, 199, 16, 224, 208, 247, - 247, 197, 199, 16, 224, 208, 248, 65, 197, 199, 16, 224, 208, 235, 173, - 197, 199, 16, 224, 208, 250, 95, 197, 199, 16, 250, 96, 219, 89, 197, - 199, 16, 250, 96, 235, 173, 197, 199, 16, 220, 43, 134, 197, 199, 16, - 252, 225, 134, 197, 199, 16, 224, 208, 220, 42, 197, 199, 16, 224, 208, - 252, 224, 197, 199, 16, 224, 208, 233, 136, 197, 199, 16, 224, 208, 242, - 227, 197, 199, 16, 135, 215, 1, 197, 199, 16, 96, 215, 1, 197, 199, 16, - 224, 208, 135, 71, 197, 199, 16, 224, 208, 96, 71, 197, 199, 16, 250, 96, - 252, 224, 197, 199, 16, 121, 218, 51, 215, 159, 197, 199, 16, 248, 127, - 219, 89, 197, 199, 16, 224, 208, 121, 251, 38, 197, 199, 16, 224, 208, - 248, 126, 197, 199, 16, 121, 218, 51, 235, 173, 197, 199, 16, 215, 130, - 215, 1, 197, 199, 16, 224, 208, 215, 130, 71, 197, 199, 16, 116, 218, 51, - 227, 29, 197, 199, 16, 248, 138, 219, 89, 197, 199, 16, 224, 208, 116, - 251, 38, 197, 199, 16, 224, 208, 248, 137, 197, 199, 16, 116, 218, 51, - 235, 173, 197, 199, 16, 246, 179, 215, 1, 197, 199, 16, 224, 208, 246, - 179, 71, 197, 199, 16, 224, 177, 215, 159, 197, 199, 16, 248, 127, 215, - 159, 197, 199, 16, 248, 66, 215, 159, 197, 199, 16, 235, 174, 215, 159, - 197, 199, 16, 250, 96, 215, 159, 197, 199, 16, 116, 220, 206, 235, 173, - 197, 199, 16, 224, 177, 224, 207, 197, 199, 16, 250, 96, 219, 109, 197, - 199, 16, 224, 208, 250, 30, 197, 199, 16, 116, 218, 51, 248, 74, 197, - 199, 16, 248, 138, 248, 74, 197, 199, 16, 219, 110, 248, 74, 197, 199, - 16, 235, 174, 248, 74, 197, 199, 16, 250, 96, 248, 74, 197, 199, 16, 121, - 220, 206, 219, 89, 197, 199, 16, 43, 220, 206, 219, 89, 197, 199, 16, - 217, 56, 248, 74, 197, 199, 16, 242, 228, 248, 74, 197, 199, 16, 250, 24, - 134, 197, 199, 16, 248, 138, 177, 197, 199, 16, 212, 27, 197, 199, 16, - 219, 90, 177, 197, 199, 16, 221, 94, 215, 159, 197, 199, 16, 224, 208, - 228, 206, 245, 183, 197, 199, 16, 224, 208, 224, 192, 197, 199, 16, 121, - 251, 39, 177, 197, 199, 16, 116, 251, 39, 177, 197, 199, 16, 236, 44, - 197, 199, 16, 223, 224, 197, 199, 16, 227, 104, 197, 199, 16, 254, 180, - 215, 159, 197, 199, 16, 245, 185, 215, 159, 197, 199, 16, 236, 45, 215, - 159, 197, 199, 16, 227, 105, 215, 159, 197, 199, 16, 254, 179, 228, 206, - 250, 189, 79, 47, 254, 146, 2, 246, 179, 212, 28, 71, 220, 180, 210, 251, - 214, 252, 92, 88, 66, 233, 84, 2, 231, 107, 247, 195, 236, 74, 88, 249, - 245, 215, 157, 88, 248, 6, 215, 157, 88, 245, 233, 88, 250, 15, 88, 69, - 42, 2, 250, 232, 66, 233, 83, 245, 210, 88, 254, 175, 235, 1, 88, 242, - 60, 88, 37, 201, 252, 187, 2, 228, 204, 37, 216, 197, 246, 181, 251, 188, - 250, 96, 2, 228, 208, 71, 215, 155, 88, 231, 21, 88, 241, 17, 88, 227, - 77, 242, 161, 88, 227, 77, 234, 11, 88, 226, 154, 88, 226, 153, 88, 248, - 14, 249, 161, 16, 244, 109, 112, 219, 253, 88, 197, 199, 16, 224, 207, - 248, 155, 221, 81, 235, 1, 88, 225, 109, 226, 238, 229, 231, 226, 238, - 225, 105, 222, 131, 88, 250, 77, 222, 131, 88, 43, 226, 169, 215, 137, - 102, 43, 226, 169, 245, 110, 43, 226, 169, 232, 237, 102, 47, 226, 169, - 215, 137, 102, 47, 226, 169, 245, 110, 47, 226, 169, 232, 237, 102, 43, - 42, 251, 210, 215, 137, 249, 222, 43, 42, 251, 210, 245, 110, 43, 42, - 251, 210, 232, 237, 249, 222, 47, 42, 251, 210, 215, 137, 249, 222, 47, - 42, 251, 210, 245, 110, 47, 42, 251, 210, 232, 237, 249, 222, 43, 249, - 163, 251, 210, 215, 137, 102, 43, 249, 163, 251, 210, 231, 107, 226, 13, - 43, 249, 163, 251, 210, 232, 237, 102, 249, 163, 251, 210, 245, 110, 47, - 249, 163, 251, 210, 215, 137, 102, 47, 249, 163, 251, 210, 231, 107, 226, - 13, 47, 249, 163, 251, 210, 232, 237, 102, 236, 70, 245, 110, 201, 233, - 84, 245, 110, 215, 137, 43, 171, 232, 237, 47, 249, 163, 251, 210, 222, - 114, 215, 137, 47, 171, 232, 237, 43, 249, 163, 251, 210, 222, 114, 219, - 0, 216, 239, 219, 0, 251, 225, 216, 240, 42, 125, 251, 226, 42, 125, 251, - 226, 42, 251, 210, 113, 216, 240, 42, 125, 34, 16, 251, 225, 43, 66, 93, - 233, 83, 47, 66, 93, 233, 83, 201, 222, 146, 233, 82, 201, 222, 146, 233, - 81, 201, 222, 146, 233, 80, 201, 222, 146, 233, 79, 248, 118, 16, 182, - 66, 22, 216, 240, 223, 182, 248, 118, 16, 182, 66, 22, 251, 226, 223, - 182, 248, 118, 16, 182, 66, 2, 250, 95, 248, 118, 16, 182, 121, 22, 201, - 2, 250, 95, 248, 118, 16, 182, 116, 22, 201, 2, 250, 95, 248, 118, 16, - 182, 66, 2, 216, 196, 248, 118, 16, 182, 121, 22, 201, 2, 216, 196, 248, - 118, 16, 182, 116, 22, 201, 2, 216, 196, 248, 118, 16, 182, 66, 22, 214, - 22, 248, 118, 16, 182, 121, 22, 201, 2, 214, 22, 248, 118, 16, 182, 116, - 22, 201, 2, 214, 22, 248, 118, 16, 182, 121, 22, 241, 149, 248, 118, 16, - 182, 116, 22, 241, 149, 248, 118, 16, 182, 66, 22, 216, 240, 233, 168, - 248, 118, 16, 182, 66, 22, 251, 226, 233, 168, 42, 244, 121, 223, 240, - 88, 246, 4, 88, 66, 233, 84, 245, 110, 231, 170, 251, 199, 231, 170, 187, - 113, 220, 195, 231, 170, 220, 196, 113, 233, 8, 231, 170, 187, 113, 119, - 220, 182, 231, 170, 119, 220, 183, 113, 233, 8, 231, 170, 119, 220, 183, - 235, 181, 231, 170, 216, 179, 231, 170, 217, 189, 231, 170, 226, 99, 246, - 45, 242, 221, 244, 55, 216, 240, 226, 168, 251, 226, 226, 168, 216, 240, - 249, 163, 125, 251, 226, 249, 163, 125, 216, 240, 216, 232, 220, 254, - 125, 251, 226, 216, 232, 220, 254, 125, 69, 216, 210, 252, 82, 223, 165, - 2, 250, 95, 219, 74, 244, 153, 255, 49, 249, 160, 245, 249, 236, 56, 248, - 155, 245, 112, 88, 85, 223, 178, 52, 216, 196, 85, 233, 164, 52, 216, - 196, 85, 215, 139, 52, 216, 196, 85, 246, 180, 52, 216, 196, 85, 223, - 178, 52, 216, 197, 2, 66, 134, 85, 233, 164, 52, 216, 197, 2, 66, 134, - 85, 223, 178, 216, 197, 2, 52, 66, 134, 254, 208, 250, 63, 219, 80, 217, - 53, 250, 63, 241, 86, 2, 244, 139, 222, 181, 16, 31, 228, 101, 16, 31, - 219, 105, 68, 242, 80, 16, 31, 219, 105, 68, 217, 178, 16, 31, 245, 222, - 68, 217, 178, 16, 31, 245, 222, 68, 216, 213, 16, 31, 245, 212, 16, 31, - 255, 40, 16, 31, 252, 91, 16, 31, 252, 223, 16, 31, 201, 218, 52, 16, 31, - 233, 84, 244, 234, 16, 31, 66, 218, 52, 16, 31, 244, 109, 244, 234, 16, - 31, 251, 30, 223, 239, 16, 31, 220, 229, 227, 36, 16, 31, 220, 229, 236, - 112, 16, 31, 248, 218, 233, 74, 245, 163, 16, 31, 248, 103, 249, 240, - 118, 16, 31, 248, 103, 249, 240, 112, 16, 31, 248, 103, 249, 240, 170, - 16, 31, 248, 103, 249, 240, 167, 16, 31, 150, 255, 40, 16, 31, 218, 137, - 236, 174, 16, 31, 245, 222, 68, 216, 214, 252, 5, 16, 31, 251, 61, 16, - 31, 245, 222, 68, 231, 216, 16, 31, 219, 20, 16, 31, 245, 163, 16, 31, - 244, 196, 221, 80, 16, 31, 242, 220, 221, 80, 16, 31, 224, 48, 221, 80, - 16, 31, 215, 151, 221, 80, 16, 31, 219, 225, 16, 31, 248, 135, 252, 8, - 88, 210, 251, 214, 16, 31, 229, 234, 16, 31, 248, 136, 244, 109, 112, 16, - 31, 219, 21, 244, 109, 112, 227, 142, 102, 227, 142, 250, 210, 227, 142, - 244, 112, 227, 142, 236, 52, 244, 112, 227, 142, 252, 89, 251, 178, 227, - 142, 251, 221, 217, 78, 227, 142, 251, 207, 252, 192, 240, 213, 227, 142, - 254, 163, 68, 250, 188, 227, 142, 248, 223, 227, 142, 249, 152, 255, 43, - 228, 99, 227, 142, 52, 252, 224, 37, 21, 118, 37, 21, 112, 37, 21, 170, - 37, 21, 167, 37, 21, 185, 37, 21, 192, 37, 21, 200, 37, 21, 198, 37, 21, - 203, 37, 51, 217, 213, 37, 51, 245, 245, 37, 51, 216, 48, 37, 51, 217, - 130, 37, 51, 244, 95, 37, 51, 244, 207, 37, 51, 220, 66, 37, 51, 221, 63, - 37, 51, 246, 12, 37, 51, 229, 92, 37, 51, 216, 45, 87, 21, 118, 87, 21, - 112, 87, 21, 170, 87, 21, 167, 87, 21, 185, 87, 21, 192, 87, 21, 200, 87, - 21, 198, 87, 21, 203, 87, 51, 217, 213, 87, 51, 245, 245, 87, 51, 216, - 48, 87, 51, 217, 130, 87, 51, 244, 95, 87, 51, 244, 207, 87, 51, 220, 66, - 87, 51, 221, 63, 87, 51, 246, 12, 87, 51, 229, 92, 87, 51, 216, 45, 21, - 124, 244, 64, 219, 83, 21, 119, 244, 64, 219, 83, 21, 137, 244, 64, 219, - 83, 21, 244, 101, 244, 64, 219, 83, 21, 244, 170, 244, 64, 219, 83, 21, - 220, 72, 244, 64, 219, 83, 21, 221, 66, 244, 64, 219, 83, 21, 246, 15, - 244, 64, 219, 83, 21, 229, 95, 244, 64, 219, 83, 51, 217, 214, 244, 64, - 219, 83, 51, 245, 246, 244, 64, 219, 83, 51, 216, 49, 244, 64, 219, 83, - 51, 217, 131, 244, 64, 219, 83, 51, 244, 96, 244, 64, 219, 83, 51, 244, - 208, 244, 64, 219, 83, 51, 220, 67, 244, 64, 219, 83, 51, 221, 64, 244, - 64, 219, 83, 51, 246, 13, 244, 64, 219, 83, 51, 229, 93, 244, 64, 219, - 83, 51, 216, 46, 244, 64, 219, 83, 87, 7, 4, 1, 63, 87, 7, 4, 1, 253, - 201, 87, 7, 4, 1, 251, 121, 87, 7, 4, 1, 249, 125, 87, 7, 4, 1, 77, 87, - 7, 4, 1, 245, 95, 87, 7, 4, 1, 244, 41, 87, 7, 4, 1, 242, 162, 87, 7, 4, - 1, 75, 87, 7, 4, 1, 236, 3, 87, 7, 4, 1, 235, 141, 87, 7, 4, 1, 155, 87, - 7, 4, 1, 184, 87, 7, 4, 1, 206, 87, 7, 4, 1, 78, 87, 7, 4, 1, 227, 11, - 87, 7, 4, 1, 225, 19, 87, 7, 4, 1, 152, 87, 7, 4, 1, 196, 87, 7, 4, 1, - 218, 113, 87, 7, 4, 1, 72, 87, 7, 4, 1, 211, 211, 87, 7, 4, 1, 214, 85, - 87, 7, 4, 1, 213, 169, 87, 7, 4, 1, 213, 108, 87, 7, 4, 1, 212, 152, 37, - 7, 6, 1, 63, 37, 7, 6, 1, 253, 201, 37, 7, 6, 1, 251, 121, 37, 7, 6, 1, - 249, 125, 37, 7, 6, 1, 77, 37, 7, 6, 1, 245, 95, 37, 7, 6, 1, 244, 41, - 37, 7, 6, 1, 242, 162, 37, 7, 6, 1, 75, 37, 7, 6, 1, 236, 3, 37, 7, 6, 1, - 235, 141, 37, 7, 6, 1, 155, 37, 7, 6, 1, 184, 37, 7, 6, 1, 206, 37, 7, 6, - 1, 78, 37, 7, 6, 1, 227, 11, 37, 7, 6, 1, 225, 19, 37, 7, 6, 1, 152, 37, - 7, 6, 1, 196, 37, 7, 6, 1, 218, 113, 37, 7, 6, 1, 72, 37, 7, 6, 1, 211, - 211, 37, 7, 6, 1, 214, 85, 37, 7, 6, 1, 213, 169, 37, 7, 6, 1, 213, 108, - 37, 7, 6, 1, 212, 152, 37, 7, 4, 1, 63, 37, 7, 4, 1, 253, 201, 37, 7, 4, - 1, 251, 121, 37, 7, 4, 1, 249, 125, 37, 7, 4, 1, 77, 37, 7, 4, 1, 245, - 95, 37, 7, 4, 1, 244, 41, 37, 7, 4, 1, 242, 162, 37, 7, 4, 1, 75, 37, 7, - 4, 1, 236, 3, 37, 7, 4, 1, 235, 141, 37, 7, 4, 1, 155, 37, 7, 4, 1, 184, - 37, 7, 4, 1, 206, 37, 7, 4, 1, 78, 37, 7, 4, 1, 227, 11, 37, 7, 4, 1, - 225, 19, 37, 7, 4, 1, 152, 37, 7, 4, 1, 196, 37, 7, 4, 1, 218, 113, 37, - 7, 4, 1, 72, 37, 7, 4, 1, 211, 211, 37, 7, 4, 1, 214, 85, 37, 7, 4, 1, - 213, 169, 37, 7, 4, 1, 213, 108, 37, 7, 4, 1, 212, 152, 37, 21, 212, 79, - 150, 37, 51, 245, 245, 150, 37, 51, 216, 48, 150, 37, 51, 217, 130, 150, - 37, 51, 244, 95, 150, 37, 51, 244, 207, 150, 37, 51, 220, 66, 150, 37, - 51, 221, 63, 150, 37, 51, 246, 12, 150, 37, 51, 229, 92, 150, 37, 51, - 216, 45, 52, 37, 21, 118, 52, 37, 21, 112, 52, 37, 21, 170, 52, 37, 21, - 167, 52, 37, 21, 185, 52, 37, 21, 192, 52, 37, 21, 200, 52, 37, 21, 198, - 52, 37, 21, 203, 52, 37, 51, 217, 213, 150, 37, 21, 212, 79, 93, 97, 182, - 241, 149, 93, 97, 110, 241, 149, 93, 97, 182, 214, 221, 93, 97, 110, 214, - 221, 93, 97, 182, 216, 182, 248, 224, 241, 149, 93, 97, 110, 216, 182, - 248, 224, 241, 149, 93, 97, 182, 216, 182, 248, 224, 214, 221, 93, 97, - 110, 216, 182, 248, 224, 214, 221, 93, 97, 182, 224, 204, 248, 224, 241, - 149, 93, 97, 110, 224, 204, 248, 224, 241, 149, 93, 97, 182, 224, 204, - 248, 224, 214, 221, 93, 97, 110, 224, 204, 248, 224, 214, 221, 93, 97, - 182, 121, 22, 223, 182, 93, 97, 121, 182, 22, 47, 242, 68, 93, 97, 121, - 110, 22, 47, 233, 100, 93, 97, 110, 121, 22, 223, 182, 93, 97, 182, 121, - 22, 233, 168, 93, 97, 121, 182, 22, 43, 242, 68, 93, 97, 121, 110, 22, - 43, 233, 100, 93, 97, 110, 121, 22, 233, 168, 93, 97, 182, 116, 22, 223, - 182, 93, 97, 116, 182, 22, 47, 242, 68, 93, 97, 116, 110, 22, 47, 233, - 100, 93, 97, 110, 116, 22, 223, 182, 93, 97, 182, 116, 22, 233, 168, 93, - 97, 116, 182, 22, 43, 242, 68, 93, 97, 116, 110, 22, 43, 233, 100, 93, - 97, 110, 116, 22, 233, 168, 93, 97, 182, 66, 22, 223, 182, 93, 97, 66, - 182, 22, 47, 242, 68, 93, 97, 116, 110, 22, 47, 121, 233, 100, 93, 97, - 121, 110, 22, 47, 116, 233, 100, 93, 97, 66, 110, 22, 47, 233, 100, 93, - 97, 121, 182, 22, 47, 116, 242, 68, 93, 97, 116, 182, 22, 47, 121, 242, - 68, 93, 97, 110, 66, 22, 223, 182, 93, 97, 182, 66, 22, 233, 168, 93, 97, - 66, 182, 22, 43, 242, 68, 93, 97, 116, 110, 22, 43, 121, 233, 100, 93, - 97, 121, 110, 22, 43, 116, 233, 100, 93, 97, 66, 110, 22, 43, 233, 100, - 93, 97, 121, 182, 22, 43, 116, 242, 68, 93, 97, 116, 182, 22, 43, 121, - 242, 68, 93, 97, 110, 66, 22, 233, 168, 93, 97, 182, 121, 22, 241, 149, - 93, 97, 43, 110, 22, 47, 121, 233, 100, 93, 97, 47, 110, 22, 43, 121, - 233, 100, 93, 97, 121, 182, 22, 201, 242, 68, 93, 97, 121, 110, 22, 201, - 233, 100, 93, 97, 47, 182, 22, 43, 121, 242, 68, 93, 97, 43, 182, 22, 47, - 121, 242, 68, 93, 97, 110, 121, 22, 241, 149, 93, 97, 182, 116, 22, 241, - 149, 93, 97, 43, 110, 22, 47, 116, 233, 100, 93, 97, 47, 110, 22, 43, - 116, 233, 100, 93, 97, 116, 182, 22, 201, 242, 68, 93, 97, 116, 110, 22, - 201, 233, 100, 93, 97, 47, 182, 22, 43, 116, 242, 68, 93, 97, 43, 182, - 22, 47, 116, 242, 68, 93, 97, 110, 116, 22, 241, 149, 93, 97, 182, 66, - 22, 241, 149, 93, 97, 43, 110, 22, 47, 66, 233, 100, 93, 97, 47, 110, 22, - 43, 66, 233, 100, 93, 97, 66, 182, 22, 201, 242, 68, 93, 97, 116, 110, - 22, 121, 201, 233, 100, 93, 97, 121, 110, 22, 116, 201, 233, 100, 93, 97, - 66, 110, 22, 201, 233, 100, 93, 97, 43, 116, 110, 22, 47, 121, 233, 100, - 93, 97, 47, 116, 110, 22, 43, 121, 233, 100, 93, 97, 43, 121, 110, 22, - 47, 116, 233, 100, 93, 97, 47, 121, 110, 22, 43, 116, 233, 100, 93, 97, - 121, 182, 22, 116, 201, 242, 68, 93, 97, 116, 182, 22, 121, 201, 242, 68, - 93, 97, 47, 182, 22, 43, 66, 242, 68, 93, 97, 43, 182, 22, 47, 66, 242, - 68, 93, 97, 110, 66, 22, 241, 149, 93, 97, 182, 52, 248, 224, 241, 149, - 93, 97, 110, 52, 248, 224, 241, 149, 93, 97, 182, 52, 248, 224, 214, 221, - 93, 97, 110, 52, 248, 224, 214, 221, 93, 97, 52, 241, 149, 93, 97, 52, - 214, 221, 93, 97, 121, 220, 100, 22, 47, 246, 188, 93, 97, 121, 52, 22, - 47, 220, 99, 93, 97, 52, 121, 22, 223, 182, 93, 97, 121, 220, 100, 22, - 43, 246, 188, 93, 97, 121, 52, 22, 43, 220, 99, 93, 97, 52, 121, 22, 233, - 168, 93, 97, 116, 220, 100, 22, 47, 246, 188, 93, 97, 116, 52, 22, 47, - 220, 99, 93, 97, 52, 116, 22, 223, 182, 93, 97, 116, 220, 100, 22, 43, - 246, 188, 93, 97, 116, 52, 22, 43, 220, 99, 93, 97, 52, 116, 22, 233, - 168, 93, 97, 66, 220, 100, 22, 47, 246, 188, 93, 97, 66, 52, 22, 47, 220, - 99, 93, 97, 52, 66, 22, 223, 182, 93, 97, 66, 220, 100, 22, 43, 246, 188, - 93, 97, 66, 52, 22, 43, 220, 99, 93, 97, 52, 66, 22, 233, 168, 93, 97, - 121, 220, 100, 22, 201, 246, 188, 93, 97, 121, 52, 22, 201, 220, 99, 93, - 97, 52, 121, 22, 241, 149, 93, 97, 116, 220, 100, 22, 201, 246, 188, 93, - 97, 116, 52, 22, 201, 220, 99, 93, 97, 52, 116, 22, 241, 149, 93, 97, 66, - 220, 100, 22, 201, 246, 188, 93, 97, 66, 52, 22, 201, 220, 99, 93, 97, - 52, 66, 22, 241, 149, 93, 97, 182, 254, 67, 121, 22, 223, 182, 93, 97, - 182, 254, 67, 121, 22, 233, 168, 93, 97, 182, 254, 67, 116, 22, 233, 168, - 93, 97, 182, 254, 67, 116, 22, 223, 182, 93, 97, 182, 248, 72, 215, 137, - 47, 217, 10, 232, 237, 233, 168, 93, 97, 182, 248, 72, 215, 137, 43, 217, - 10, 232, 237, 223, 182, 93, 97, 182, 248, 72, 249, 193, 93, 97, 182, 233, - 168, 93, 97, 182, 215, 140, 93, 97, 182, 223, 182, 93, 97, 182, 246, 181, - 93, 97, 110, 233, 168, 93, 97, 110, 215, 140, 93, 97, 110, 223, 182, 93, - 97, 110, 246, 181, 93, 97, 182, 43, 22, 110, 223, 182, 93, 97, 182, 116, - 22, 110, 246, 181, 93, 97, 110, 43, 22, 182, 223, 182, 93, 97, 110, 116, - 22, 182, 246, 181, 215, 137, 157, 252, 5, 232, 237, 124, 246, 11, 252, 5, - 232, 237, 124, 224, 202, 252, 5, 232, 237, 137, 246, 9, 252, 5, 232, 237, - 157, 252, 5, 232, 237, 244, 170, 246, 9, 252, 5, 232, 237, 137, 224, 200, - 252, 5, 232, 237, 221, 66, 246, 9, 252, 5, 244, 64, 252, 5, 43, 221, 66, - 246, 9, 252, 5, 43, 137, 224, 200, 252, 5, 43, 244, 170, 246, 9, 252, 5, - 43, 157, 252, 5, 43, 137, 246, 9, 252, 5, 43, 124, 224, 202, 252, 5, 43, - 124, 246, 11, 252, 5, 47, 157, 252, 5, 182, 221, 37, 231, 217, 221, 37, - 248, 229, 221, 37, 215, 137, 124, 246, 11, 252, 5, 47, 124, 246, 11, 252, - 5, 224, 206, 232, 237, 233, 168, 224, 206, 232, 237, 223, 182, 224, 206, - 215, 137, 233, 168, 224, 206, 215, 137, 43, 22, 232, 237, 43, 22, 232, - 237, 223, 182, 224, 206, 215, 137, 43, 22, 232, 237, 223, 182, 224, 206, - 215, 137, 43, 22, 215, 137, 47, 22, 232, 237, 233, 168, 224, 206, 215, - 137, 43, 22, 215, 137, 47, 22, 232, 237, 223, 182, 224, 206, 215, 137, - 223, 182, 224, 206, 215, 137, 47, 22, 232, 237, 233, 168, 224, 206, 215, - 137, 47, 22, 232, 237, 43, 22, 232, 237, 223, 182, 85, 219, 185, 69, 219, - 185, 69, 42, 2, 223, 119, 249, 221, 69, 42, 249, 249, 85, 4, 219, 185, - 42, 2, 201, 244, 194, 42, 2, 66, 244, 194, 42, 2, 227, 49, 249, 189, 244, - 194, 42, 2, 215, 137, 43, 217, 10, 232, 237, 47, 244, 194, 42, 2, 215, - 137, 47, 217, 10, 232, 237, 43, 244, 194, 42, 2, 248, 72, 249, 189, 244, - 194, 85, 4, 219, 185, 69, 4, 219, 185, 85, 224, 43, 69, 224, 43, 85, 66, - 224, 43, 69, 66, 224, 43, 85, 226, 171, 69, 226, 171, 85, 215, 139, 216, - 196, 69, 215, 139, 216, 196, 85, 215, 139, 4, 216, 196, 69, 215, 139, 4, - 216, 196, 85, 223, 178, 216, 196, 69, 223, 178, 216, 196, 85, 223, 178, - 4, 216, 196, 69, 223, 178, 4, 216, 196, 85, 223, 178, 225, 178, 69, 223, - 178, 225, 178, 85, 246, 180, 216, 196, 69, 246, 180, 216, 196, 85, 246, - 180, 4, 216, 196, 69, 246, 180, 4, 216, 196, 85, 233, 164, 216, 196, 69, - 233, 164, 216, 196, 85, 233, 164, 4, 216, 196, 69, 233, 164, 4, 216, 196, - 85, 233, 164, 225, 178, 69, 233, 164, 225, 178, 85, 248, 65, 69, 248, 65, - 69, 248, 66, 249, 249, 85, 4, 248, 65, 244, 178, 232, 233, 69, 250, 95, - 246, 193, 250, 95, 250, 96, 2, 66, 244, 194, 251, 165, 85, 250, 95, 250, - 96, 2, 43, 157, 252, 13, 250, 96, 2, 47, 157, 252, 13, 250, 96, 2, 232, - 237, 157, 252, 13, 250, 96, 2, 215, 137, 157, 252, 13, 250, 96, 2, 215, - 137, 47, 224, 206, 252, 13, 250, 96, 2, 254, 191, 251, 142, 215, 137, 43, - 224, 206, 252, 13, 43, 157, 85, 250, 95, 47, 157, 85, 250, 95, 236, 53, - 251, 167, 236, 53, 69, 250, 95, 215, 137, 157, 236, 53, 69, 250, 95, 232, - 237, 157, 236, 53, 69, 250, 95, 215, 137, 43, 224, 206, 250, 93, 254, 66, - 215, 137, 47, 224, 206, 250, 93, 254, 66, 232, 237, 47, 224, 206, 250, - 93, 254, 66, 232, 237, 43, 224, 206, 250, 93, 254, 66, 215, 137, 157, - 250, 95, 232, 237, 157, 250, 95, 85, 232, 237, 47, 216, 196, 85, 232, - 237, 43, 216, 196, 85, 215, 137, 43, 216, 196, 85, 215, 137, 47, 216, - 196, 69, 251, 167, 42, 2, 43, 157, 252, 13, 42, 2, 47, 157, 252, 13, 42, - 2, 215, 137, 43, 248, 72, 157, 252, 13, 42, 2, 232, 237, 47, 248, 72, - 157, 252, 13, 69, 42, 2, 66, 252, 24, 233, 83, 69, 215, 139, 216, 197, 2, - 247, 195, 215, 139, 216, 197, 2, 43, 157, 252, 13, 215, 139, 216, 197, 2, - 47, 157, 252, 13, 233, 207, 250, 95, 69, 42, 2, 215, 137, 43, 224, 205, - 69, 42, 2, 232, 237, 43, 224, 205, 69, 42, 2, 232, 237, 47, 224, 205, 69, - 42, 2, 215, 137, 47, 224, 205, 69, 250, 96, 2, 215, 137, 43, 224, 205, - 69, 250, 96, 2, 232, 237, 43, 224, 205, 69, 250, 96, 2, 232, 237, 47, - 224, 205, 69, 250, 96, 2, 215, 137, 47, 224, 205, 215, 137, 43, 216, 196, - 215, 137, 47, 216, 196, 232, 237, 43, 216, 196, 69, 231, 217, 219, 185, - 85, 231, 217, 219, 185, 69, 231, 217, 4, 219, 185, 85, 231, 217, 4, 219, - 185, 232, 237, 47, 216, 196, 85, 218, 253, 2, 224, 59, 250, 51, 215, 170, - 220, 7, 250, 26, 85, 219, 109, 69, 219, 109, 233, 98, 217, 99, 218, 252, - 254, 20, 228, 225, 248, 110, 228, 225, 250, 1, 227, 67, 85, 217, 222, 69, - 217, 222, 252, 202, 251, 214, 252, 202, 93, 2, 250, 188, 252, 202, 93, 2, - 213, 169, 222, 193, 215, 171, 2, 224, 86, 246, 160, 241, 92, 252, 69, 69, - 220, 203, 226, 13, 85, 220, 203, 226, 13, 221, 32, 223, 236, 223, 123, - 244, 144, 242, 75, 251, 167, 85, 43, 225, 177, 236, 100, 85, 47, 225, - 177, 236, 100, 69, 43, 225, 177, 236, 100, 69, 116, 225, 177, 236, 100, - 69, 47, 225, 177, 236, 100, 69, 121, 225, 177, 236, 100, 220, 48, 22, - 249, 192, 251, 19, 53, 224, 97, 53, 252, 31, 53, 251, 80, 254, 140, 227, - 50, 249, 193, 250, 171, 223, 224, 249, 194, 68, 232, 247, 249, 194, 68, - 235, 232, 219, 110, 22, 249, 199, 245, 1, 88, 255, 25, 221, 34, 242, 125, - 22, 220, 134, 226, 131, 88, 212, 246, 213, 60, 216, 186, 31, 242, 70, - 216, 186, 31, 233, 229, 216, 186, 31, 244, 185, 216, 186, 31, 217, 100, - 216, 186, 31, 213, 227, 216, 186, 31, 214, 27, 216, 186, 31, 230, 255, - 216, 186, 31, 246, 44, 213, 245, 68, 248, 91, 69, 244, 73, 245, 23, 69, - 220, 21, 245, 23, 85, 220, 21, 245, 23, 69, 218, 253, 2, 224, 59, 244, - 181, 224, 202, 231, 12, 233, 202, 224, 202, 231, 12, 231, 188, 244, 227, - 53, 246, 44, 232, 68, 53, 235, 155, 222, 161, 215, 122, 229, 242, 225, - 190, 254, 54, 218, 4, 243, 148, 251, 59, 233, 141, 214, 135, 233, 108, - 222, 133, 222, 213, 251, 48, 254, 83, 225, 220, 69, 250, 177, 234, 198, - 69, 250, 177, 224, 194, 69, 250, 177, 223, 131, 69, 250, 177, 252, 23, - 69, 250, 177, 234, 150, 69, 250, 177, 226, 141, 85, 250, 177, 234, 198, - 85, 250, 177, 224, 194, 85, 250, 177, 223, 131, 85, 250, 177, 252, 23, - 85, 250, 177, 234, 150, 85, 250, 177, 226, 141, 85, 219, 223, 219, 9, 69, - 242, 75, 219, 9, 69, 248, 66, 219, 9, 85, 250, 49, 219, 9, 69, 219, 223, - 219, 9, 85, 242, 75, 219, 9, 85, 248, 66, 219, 9, 69, 250, 49, 219, 9, - 241, 92, 219, 189, 224, 202, 228, 201, 246, 11, 228, 201, 252, 119, 246, - 11, 228, 196, 252, 119, 220, 65, 228, 196, 230, 197, 244, 155, 53, 230, - 197, 230, 77, 53, 230, 197, 221, 21, 53, 213, 253, 180, 249, 193, 246, - 41, 180, 249, 193, 215, 148, 224, 39, 88, 224, 39, 16, 31, 216, 21, 225, - 202, 224, 39, 16, 31, 216, 20, 225, 202, 224, 39, 16, 31, 216, 19, 225, - 202, 224, 39, 16, 31, 216, 18, 225, 202, 224, 39, 16, 31, 216, 17, 225, - 202, 224, 39, 16, 31, 216, 16, 225, 202, 224, 39, 16, 31, 216, 15, 225, - 202, 224, 39, 16, 31, 243, 146, 232, 16, 85, 215, 148, 224, 39, 88, 224, - 40, 226, 185, 88, 226, 161, 226, 185, 88, 226, 85, 226, 185, 53, 213, - 243, 88, 248, 58, 245, 22, 248, 58, 245, 21, 248, 58, 245, 20, 248, 58, - 245, 19, 248, 58, 245, 18, 248, 58, 245, 17, 69, 250, 96, 2, 62, 223, - 182, 69, 250, 96, 2, 119, 247, 193, 85, 250, 96, 2, 69, 62, 223, 182, 85, - 250, 96, 2, 119, 69, 247, 193, 231, 26, 31, 213, 60, 231, 26, 31, 212, - 245, 248, 41, 31, 242, 229, 213, 60, 248, 41, 31, 233, 135, 212, 245, - 248, 41, 31, 233, 135, 213, 60, 248, 41, 31, 242, 229, 212, 245, 69, 244, - 162, 85, 244, 162, 242, 125, 22, 226, 16, 254, 156, 249, 191, 218, 194, - 219, 117, 68, 255, 3, 222, 147, 254, 204, 244, 140, 243, 156, 219, 117, - 68, 242, 50, 253, 242, 88, 244, 151, 227, 32, 69, 219, 109, 137, 233, 78, - 249, 237, 223, 182, 137, 233, 78, 249, 237, 233, 168, 214, 37, 53, 127, - 214, 115, 53, 246, 185, 244, 227, 53, 246, 185, 232, 68, 53, 236, 61, - 244, 227, 22, 232, 68, 53, 232, 68, 22, 244, 227, 53, 232, 68, 2, 219, - 59, 53, 232, 68, 2, 219, 59, 22, 232, 68, 22, 244, 227, 53, 66, 232, 68, - 2, 219, 59, 53, 201, 232, 68, 2, 219, 59, 53, 231, 217, 69, 250, 95, 231, - 217, 85, 250, 95, 231, 217, 4, 69, 250, 95, 232, 31, 88, 247, 240, 88, - 215, 146, 226, 160, 88, 250, 35, 244, 60, 215, 118, 229, 237, 250, 218, - 226, 225, 235, 161, 214, 167, 250, 153, 85, 231, 13, 233, 95, 221, 56, - 221, 90, 224, 185, 221, 74, 220, 2, 252, 205, 252, 172, 92, 235, 0, 69, - 246, 169, 232, 63, 69, 246, 169, 234, 198, 85, 246, 169, 232, 63, 85, - 246, 169, 234, 198, 220, 8, 213, 219, 220, 11, 218, 253, 252, 97, 250, - 51, 224, 85, 85, 220, 7, 217, 101, 250, 52, 22, 224, 85, 216, 66, 69, - 220, 203, 226, 13, 216, 66, 85, 220, 203, 226, 13, 69, 248, 66, 236, 113, - 219, 185, 249, 188, 233, 213, 248, 10, 251, 44, 227, 70, 226, 16, 251, - 45, 220, 35, 242, 59, 2, 69, 249, 193, 37, 249, 188, 233, 213, 250, 211, - 228, 229, 245, 204, 254, 177, 227, 94, 43, 214, 13, 216, 221, 85, 216, - 28, 43, 214, 13, 216, 221, 69, 216, 28, 43, 214, 13, 216, 221, 85, 43, - 233, 214, 231, 187, 69, 43, 233, 214, 231, 187, 246, 165, 220, 29, 53, - 110, 69, 246, 180, 216, 196, 43, 250, 60, 245, 204, 92, 222, 193, 245, 8, - 248, 72, 236, 113, 69, 250, 96, 236, 113, 85, 219, 185, 85, 216, 163, - 223, 246, 43, 245, 203, 223, 246, 43, 245, 202, 253, 254, 16, 31, 215, - 122, 110, 250, 96, 2, 219, 59, 22, 119, 181, 50, 226, 100, 223, 179, 236, - 63, 226, 100, 233, 165, 236, 63, 226, 100, 236, 52, 226, 100, 85, 249, - 194, 227, 100, 220, 230, 220, 218, 220, 174, 250, 121, 251, 26, 242, 6, - 220, 73, 243, 157, 213, 219, 241, 72, 243, 157, 2, 242, 115, 232, 51, 16, - 31, 233, 99, 230, 255, 215, 171, 227, 100, 242, 221, 244, 102, 244, 163, - 236, 113, 241, 164, 244, 218, 222, 209, 42, 244, 101, 249, 221, 220, 51, - 240, 222, 220, 54, 226, 80, 2, 252, 205, 217, 208, 235, 247, 252, 192, - 88, 242, 78, 242, 231, 88, 244, 67, 225, 64, 249, 167, 227, 100, 85, 219, - 185, 69, 244, 163, 2, 201, 231, 107, 85, 219, 60, 215, 137, 252, 9, 222, - 135, 85, 222, 135, 232, 237, 252, 9, 222, 135, 69, 222, 135, 69, 110, - 250, 189, 79, 217, 223, 233, 24, 53, 218, 17, 246, 164, 254, 226, 245, - 199, 224, 83, 244, 174, 224, 83, 242, 118, 214, 157, 242, 118, 213, 189, - 242, 118, 232, 237, 47, 226, 109, 226, 109, 215, 137, 47, 226, 109, 69, - 229, 125, 85, 229, 125, 250, 189, 79, 110, 250, 189, 79, 230, 224, 213, - 169, 110, 230, 224, 213, 169, 252, 202, 213, 169, 110, 252, 202, 213, - 169, 227, 32, 25, 249, 193, 110, 25, 249, 193, 210, 250, 232, 249, 193, - 110, 210, 250, 232, 249, 193, 7, 249, 193, 221, 36, 69, 7, 249, 193, 227, - 32, 7, 249, 193, 232, 65, 249, 193, 219, 110, 68, 248, 216, 244, 101, - 217, 236, 254, 3, 244, 101, 252, 203, 254, 3, 110, 244, 101, 252, 203, - 254, 3, 244, 101, 250, 47, 254, 3, 85, 244, 101, 225, 179, 219, 109, 69, - 244, 101, 225, 179, 219, 109, 219, 218, 219, 65, 227, 32, 69, 219, 109, - 37, 69, 219, 109, 210, 250, 232, 85, 219, 109, 85, 250, 232, 69, 219, - 109, 227, 32, 85, 219, 109, 110, 227, 32, 85, 219, 109, 225, 228, 219, - 109, 221, 36, 69, 219, 109, 110, 254, 3, 210, 250, 232, 254, 3, 246, 15, - 219, 195, 254, 3, 246, 15, 225, 179, 85, 219, 109, 246, 15, 225, 179, - 225, 228, 219, 109, 220, 72, 225, 179, 85, 219, 109, 246, 15, 225, 179, - 224, 41, 85, 219, 109, 110, 246, 15, 225, 179, 224, 41, 85, 219, 109, - 216, 49, 225, 179, 85, 219, 109, 220, 67, 225, 179, 254, 3, 217, 236, - 254, 3, 210, 250, 232, 217, 236, 254, 3, 110, 217, 236, 254, 3, 220, 72, - 226, 69, 85, 22, 69, 244, 143, 85, 244, 143, 69, 244, 143, 246, 15, 226, - 69, 227, 32, 85, 244, 143, 37, 210, 250, 232, 246, 15, 225, 179, 219, - 109, 110, 217, 236, 225, 228, 254, 3, 220, 9, 217, 72, 216, 189, 220, 9, - 110, 250, 174, 220, 9, 219, 220, 110, 219, 220, 252, 203, 254, 3, 246, - 15, 217, 236, 225, 91, 254, 3, 110, 246, 15, 217, 236, 225, 91, 254, 3, - 249, 194, 79, 221, 36, 69, 250, 95, 150, 92, 249, 194, 79, 232, 237, 47, - 246, 162, 69, 219, 185, 215, 137, 47, 246, 162, 69, 219, 185, 232, 237, - 47, 221, 36, 69, 219, 185, 215, 137, 47, 221, 36, 69, 219, 185, 85, 224, - 193, 156, 227, 52, 69, 224, 193, 156, 227, 52, 69, 245, 119, 156, 227, - 52, 85, 248, 66, 231, 65, 69, 213, 169, 110, 245, 119, 156, 88, 182, 66, - 134, 231, 217, 66, 134, 110, 66, 134, 110, 220, 100, 216, 66, 250, 24, - 224, 178, 156, 227, 52, 110, 220, 100, 250, 24, 224, 178, 156, 227, 52, - 110, 52, 216, 66, 250, 24, 224, 178, 156, 227, 52, 110, 52, 250, 24, 224, - 178, 156, 227, 52, 110, 117, 220, 100, 250, 24, 224, 178, 156, 227, 52, - 110, 117, 52, 250, 24, 224, 178, 156, 227, 52, 249, 156, 219, 94, 226, - 180, 5, 227, 52, 110, 245, 119, 156, 227, 52, 110, 242, 75, 245, 119, - 156, 227, 52, 110, 85, 242, 74, 223, 123, 110, 85, 242, 75, 251, 167, - 244, 144, 242, 74, 223, 123, 244, 144, 242, 75, 251, 167, 231, 217, 43, - 226, 169, 227, 52, 231, 217, 47, 226, 169, 227, 52, 231, 217, 244, 152, - 43, 226, 169, 227, 52, 231, 217, 244, 152, 47, 226, 169, 227, 52, 231, - 217, 233, 164, 254, 146, 251, 210, 227, 52, 231, 217, 223, 178, 254, 146, - 251, 210, 227, 52, 110, 233, 164, 254, 146, 224, 178, 156, 227, 52, 110, - 223, 178, 254, 146, 224, 178, 156, 227, 52, 110, 233, 164, 254, 146, 251, - 210, 227, 52, 110, 223, 178, 254, 146, 251, 210, 227, 52, 182, 43, 216, - 232, 220, 254, 251, 210, 227, 52, 182, 47, 216, 232, 220, 254, 251, 210, - 227, 52, 231, 217, 43, 249, 163, 251, 210, 227, 52, 231, 217, 47, 249, - 163, 251, 210, 227, 52, 248, 21, 150, 37, 21, 118, 248, 21, 150, 37, 21, - 112, 248, 21, 150, 37, 21, 170, 248, 21, 150, 37, 21, 167, 248, 21, 150, - 37, 21, 185, 248, 21, 150, 37, 21, 192, 248, 21, 150, 37, 21, 200, 248, - 21, 150, 37, 21, 198, 248, 21, 150, 37, 21, 203, 248, 21, 150, 37, 51, - 217, 213, 248, 21, 37, 35, 21, 118, 248, 21, 37, 35, 21, 112, 248, 21, - 37, 35, 21, 170, 248, 21, 37, 35, 21, 167, 248, 21, 37, 35, 21, 185, 248, - 21, 37, 35, 21, 192, 248, 21, 37, 35, 21, 200, 248, 21, 37, 35, 21, 198, - 248, 21, 37, 35, 21, 203, 248, 21, 37, 35, 51, 217, 213, 248, 21, 150, - 37, 35, 21, 118, 248, 21, 150, 37, 35, 21, 112, 248, 21, 150, 37, 35, 21, - 170, 248, 21, 150, 37, 35, 21, 167, 248, 21, 150, 37, 35, 21, 185, 248, - 21, 150, 37, 35, 21, 192, 248, 21, 150, 37, 35, 21, 200, 248, 21, 150, - 37, 35, 21, 198, 248, 21, 150, 37, 35, 21, 203, 248, 21, 150, 37, 35, 51, - 217, 213, 110, 213, 234, 96, 71, 110, 95, 53, 110, 231, 65, 53, 110, 247, - 242, 53, 110, 219, 234, 246, 41, 71, 110, 96, 71, 110, 228, 210, 246, 41, - 71, 246, 173, 225, 181, 96, 71, 110, 223, 120, 96, 71, 216, 195, 96, 71, - 110, 216, 195, 96, 71, 248, 222, 216, 195, 96, 71, 110, 248, 222, 216, - 195, 96, 71, 85, 96, 71, 217, 110, 216, 238, 96, 254, 35, 217, 110, 251, - 224, 96, 254, 35, 85, 96, 254, 35, 110, 85, 249, 156, 246, 179, 22, 96, - 71, 110, 85, 249, 156, 215, 130, 22, 96, 71, 219, 182, 85, 96, 71, 110, - 250, 11, 85, 96, 71, 223, 177, 69, 96, 71, 233, 163, 69, 96, 71, 252, - 227, 221, 36, 69, 96, 71, 244, 75, 221, 36, 69, 96, 71, 110, 232, 237, - 223, 176, 69, 96, 71, 110, 215, 137, 223, 176, 69, 96, 71, 228, 203, 232, - 237, 223, 176, 69, 96, 71, 249, 163, 232, 251, 228, 203, 215, 137, 223, - 176, 69, 96, 71, 37, 110, 69, 96, 71, 213, 240, 96, 71, 252, 12, 219, - 234, 246, 41, 71, 252, 12, 96, 71, 252, 12, 228, 210, 246, 41, 71, 110, - 252, 12, 219, 234, 246, 41, 71, 110, 252, 12, 96, 71, 110, 252, 12, 228, - 210, 246, 41, 71, 217, 238, 96, 71, 110, 217, 237, 96, 71, 214, 5, 96, - 71, 110, 214, 5, 96, 71, 227, 75, 96, 71, 52, 249, 163, 232, 251, 137, - 248, 31, 254, 145, 69, 216, 197, 249, 249, 4, 69, 216, 196, 226, 83, 210, - 219, 22, 210, 218, 235, 43, 223, 28, 252, 218, 248, 132, 47, 223, 28, - 252, 218, 248, 132, 171, 2, 62, 236, 73, 223, 237, 219, 251, 225, 117, - 219, 22, 218, 236, 225, 117, 219, 250, 66, 252, 187, 2, 201, 91, 187, - 247, 241, 92, 233, 17, 254, 154, 92, 233, 17, 227, 62, 69, 248, 66, 2, - 250, 230, 247, 195, 22, 2, 247, 195, 245, 248, 68, 227, 73, 215, 129, - 232, 237, 47, 249, 223, 2, 247, 195, 215, 137, 43, 249, 223, 2, 247, 195, - 43, 227, 34, 235, 183, 47, 227, 34, 235, 183, 244, 64, 227, 34, 235, 183, - 233, 207, 116, 218, 50, 233, 207, 121, 218, 50, 43, 22, 47, 52, 216, 65, - 43, 22, 47, 218, 50, 43, 230, 227, 187, 47, 218, 50, 187, 43, 218, 50, - 116, 218, 51, 2, 250, 96, 50, 232, 234, 247, 246, 251, 132, 201, 223, 70, - 69, 250, 10, 248, 65, 69, 250, 10, 248, 66, 2, 135, 217, 81, 69, 250, 10, - 248, 66, 2, 96, 217, 81, 69, 42, 2, 135, 217, 81, 69, 42, 2, 96, 217, 81, - 14, 43, 69, 42, 125, 14, 47, 69, 42, 125, 14, 43, 254, 146, 125, 14, 47, - 254, 146, 125, 14, 43, 52, 254, 146, 125, 14, 47, 52, 254, 146, 125, 14, - 43, 69, 216, 232, 220, 254, 125, 14, 47, 69, 216, 232, 220, 254, 125, 14, - 43, 244, 152, 226, 168, 14, 47, 244, 152, 226, 168, 215, 130, 224, 204, - 71, 246, 179, 224, 204, 71, 254, 126, 243, 194, 250, 96, 71, 250, 62, - 243, 194, 250, 96, 71, 47, 80, 2, 37, 225, 192, 187, 135, 71, 187, 96, - 71, 187, 43, 47, 71, 187, 135, 52, 71, 187, 96, 52, 71, 187, 43, 47, 52, - 71, 187, 135, 80, 244, 77, 134, 187, 96, 80, 244, 77, 134, 187, 135, 52, - 80, 244, 77, 134, 187, 96, 52, 80, 244, 77, 134, 187, 96, 219, 181, 71, - 45, 46, 252, 7, 45, 46, 247, 192, 45, 46, 247, 64, 45, 46, 247, 191, 45, - 46, 247, 0, 45, 46, 247, 127, 45, 46, 247, 63, 45, 46, 247, 190, 45, 46, - 246, 224, 45, 46, 247, 95, 45, 46, 247, 31, 45, 46, 247, 158, 45, 46, - 246, 255, 45, 46, 247, 126, 45, 46, 247, 62, 45, 46, 247, 189, 45, 46, - 246, 208, 45, 46, 247, 79, 45, 46, 247, 15, 45, 46, 247, 142, 45, 46, - 246, 239, 45, 46, 247, 110, 45, 46, 247, 46, 45, 46, 247, 173, 45, 46, - 246, 223, 45, 46, 247, 94, 45, 46, 247, 30, 45, 46, 247, 157, 45, 46, - 246, 254, 45, 46, 247, 125, 45, 46, 247, 61, 45, 46, 247, 188, 45, 46, - 246, 200, 45, 46, 247, 71, 45, 46, 247, 7, 45, 46, 247, 134, 45, 46, 246, - 231, 45, 46, 247, 102, 45, 46, 247, 38, 45, 46, 247, 165, 45, 46, 246, - 215, 45, 46, 247, 86, 45, 46, 247, 22, 45, 46, 247, 149, 45, 46, 246, - 246, 45, 46, 247, 117, 45, 46, 247, 53, 45, 46, 247, 180, 45, 46, 246, - 207, 45, 46, 247, 78, 45, 46, 247, 14, 45, 46, 247, 141, 45, 46, 246, - 238, 45, 46, 247, 109, 45, 46, 247, 45, 45, 46, 247, 172, 45, 46, 246, - 222, 45, 46, 247, 93, 45, 46, 247, 29, 45, 46, 247, 156, 45, 46, 246, - 253, 45, 46, 247, 124, 45, 46, 247, 60, 45, 46, 247, 187, 45, 46, 246, - 196, 45, 46, 247, 67, 45, 46, 247, 3, 45, 46, 247, 130, 45, 46, 246, 227, - 45, 46, 247, 98, 45, 46, 247, 34, 45, 46, 247, 161, 45, 46, 246, 211, 45, - 46, 247, 82, 45, 46, 247, 18, 45, 46, 247, 145, 45, 46, 246, 242, 45, 46, - 247, 113, 45, 46, 247, 49, 45, 46, 247, 176, 45, 46, 246, 203, 45, 46, - 247, 74, 45, 46, 247, 10, 45, 46, 247, 137, 45, 46, 246, 234, 45, 46, - 247, 105, 45, 46, 247, 41, 45, 46, 247, 168, 45, 46, 246, 218, 45, 46, - 247, 89, 45, 46, 247, 25, 45, 46, 247, 152, 45, 46, 246, 249, 45, 46, - 247, 120, 45, 46, 247, 56, 45, 46, 247, 183, 45, 46, 246, 199, 45, 46, - 247, 70, 45, 46, 247, 6, 45, 46, 247, 133, 45, 46, 246, 230, 45, 46, 247, - 101, 45, 46, 247, 37, 45, 46, 247, 164, 45, 46, 246, 214, 45, 46, 247, - 85, 45, 46, 247, 21, 45, 46, 247, 148, 45, 46, 246, 245, 45, 46, 247, - 116, 45, 46, 247, 52, 45, 46, 247, 179, 45, 46, 246, 206, 45, 46, 247, - 77, 45, 46, 247, 13, 45, 46, 247, 140, 45, 46, 246, 237, 45, 46, 247, - 108, 45, 46, 247, 44, 45, 46, 247, 171, 45, 46, 246, 221, 45, 46, 247, - 92, 45, 46, 247, 28, 45, 46, 247, 155, 45, 46, 246, 252, 45, 46, 247, - 123, 45, 46, 247, 59, 45, 46, 247, 186, 45, 46, 246, 194, 45, 46, 247, - 65, 45, 46, 247, 1, 45, 46, 247, 128, 45, 46, 246, 225, 45, 46, 247, 96, - 45, 46, 247, 32, 45, 46, 247, 159, 45, 46, 246, 209, 45, 46, 247, 80, 45, - 46, 247, 16, 45, 46, 247, 143, 45, 46, 246, 240, 45, 46, 247, 111, 45, - 46, 247, 47, 45, 46, 247, 174, 45, 46, 246, 201, 45, 46, 247, 72, 45, 46, - 247, 8, 45, 46, 247, 135, 45, 46, 246, 232, 45, 46, 247, 103, 45, 46, - 247, 39, 45, 46, 247, 166, 45, 46, 246, 216, 45, 46, 247, 87, 45, 46, - 247, 23, 45, 46, 247, 150, 45, 46, 246, 247, 45, 46, 247, 118, 45, 46, - 247, 54, 45, 46, 247, 181, 45, 46, 246, 197, 45, 46, 247, 68, 45, 46, - 247, 4, 45, 46, 247, 131, 45, 46, 246, 228, 45, 46, 247, 99, 45, 46, 247, - 35, 45, 46, 247, 162, 45, 46, 246, 212, 45, 46, 247, 83, 45, 46, 247, 19, - 45, 46, 247, 146, 45, 46, 246, 243, 45, 46, 247, 114, 45, 46, 247, 50, - 45, 46, 247, 177, 45, 46, 246, 204, 45, 46, 247, 75, 45, 46, 247, 11, 45, - 46, 247, 138, 45, 46, 246, 235, 45, 46, 247, 106, 45, 46, 247, 42, 45, - 46, 247, 169, 45, 46, 246, 219, 45, 46, 247, 90, 45, 46, 247, 26, 45, 46, - 247, 153, 45, 46, 246, 250, 45, 46, 247, 121, 45, 46, 247, 57, 45, 46, - 247, 184, 45, 46, 246, 195, 45, 46, 247, 66, 45, 46, 247, 2, 45, 46, 247, - 129, 45, 46, 246, 226, 45, 46, 247, 97, 45, 46, 247, 33, 45, 46, 247, - 160, 45, 46, 246, 210, 45, 46, 247, 81, 45, 46, 247, 17, 45, 46, 247, - 144, 45, 46, 246, 241, 45, 46, 247, 112, 45, 46, 247, 48, 45, 46, 247, - 175, 45, 46, 246, 202, 45, 46, 247, 73, 45, 46, 247, 9, 45, 46, 247, 136, - 45, 46, 246, 233, 45, 46, 247, 104, 45, 46, 247, 40, 45, 46, 247, 167, - 45, 46, 246, 217, 45, 46, 247, 88, 45, 46, 247, 24, 45, 46, 247, 151, 45, - 46, 246, 248, 45, 46, 247, 119, 45, 46, 247, 55, 45, 46, 247, 182, 45, - 46, 246, 198, 45, 46, 247, 69, 45, 46, 247, 5, 45, 46, 247, 132, 45, 46, - 246, 229, 45, 46, 247, 100, 45, 46, 247, 36, 45, 46, 247, 163, 45, 46, - 246, 213, 45, 46, 247, 84, 45, 46, 247, 20, 45, 46, 247, 147, 45, 46, - 246, 244, 45, 46, 247, 115, 45, 46, 247, 51, 45, 46, 247, 178, 45, 46, - 246, 205, 45, 46, 247, 76, 45, 46, 247, 12, 45, 46, 247, 139, 45, 46, - 246, 236, 45, 46, 247, 107, 45, 46, 247, 43, 45, 46, 247, 170, 45, 46, - 246, 220, 45, 46, 247, 91, 45, 46, 247, 27, 45, 46, 247, 154, 45, 46, - 246, 251, 45, 46, 247, 122, 45, 46, 247, 58, 45, 46, 247, 185, 96, 216, - 31, 80, 2, 66, 91, 96, 216, 31, 80, 2, 52, 66, 91, 135, 52, 80, 2, 66, - 91, 96, 52, 80, 2, 66, 91, 43, 47, 52, 80, 2, 66, 91, 96, 216, 31, 80, - 244, 77, 134, 135, 52, 80, 244, 77, 134, 96, 52, 80, 244, 77, 134, 246, - 179, 80, 2, 201, 91, 215, 130, 80, 2, 201, 91, 215, 130, 216, 182, 71, - 246, 179, 216, 182, 71, 135, 52, 248, 224, 71, 96, 52, 248, 224, 71, 135, - 216, 182, 248, 224, 71, 96, 216, 182, 248, 224, 71, 96, 216, 31, 216, - 182, 248, 224, 71, 96, 80, 2, 246, 193, 219, 93, 215, 130, 80, 217, 10, - 134, 246, 179, 80, 217, 10, 134, 96, 80, 2, 218, 41, 2, 66, 91, 96, 80, - 2, 218, 41, 2, 52, 66, 91, 96, 216, 31, 80, 2, 218, 40, 96, 216, 31, 80, - 2, 218, 41, 2, 66, 91, 96, 216, 31, 80, 2, 218, 41, 2, 52, 66, 91, 135, - 254, 37, 96, 254, 37, 135, 52, 254, 37, 96, 52, 254, 37, 135, 80, 217, - 10, 85, 248, 65, 96, 80, 217, 10, 85, 248, 65, 135, 80, 244, 77, 252, - 187, 217, 10, 85, 248, 65, 96, 80, 244, 77, 252, 187, 217, 10, 85, 248, - 65, 228, 210, 213, 253, 22, 219, 234, 246, 41, 71, 228, 210, 246, 41, 22, - 219, 234, 213, 253, 71, 228, 210, 213, 253, 80, 2, 102, 228, 210, 246, - 41, 80, 2, 102, 219, 234, 246, 41, 80, 2, 102, 219, 234, 213, 253, 80, 2, - 102, 228, 210, 213, 253, 80, 22, 228, 210, 246, 41, 71, 228, 210, 246, - 41, 80, 22, 219, 234, 246, 41, 71, 219, 234, 246, 41, 80, 22, 219, 234, - 213, 253, 71, 219, 234, 213, 253, 80, 22, 228, 210, 213, 253, 71, 223, - 159, 248, 72, 249, 188, 245, 8, 248, 71, 245, 8, 248, 72, 249, 188, 223, - 159, 248, 71, 219, 234, 246, 41, 80, 249, 188, 228, 210, 246, 41, 71, - 228, 210, 246, 41, 80, 249, 188, 219, 234, 246, 41, 71, 245, 8, 248, 72, - 249, 188, 228, 210, 246, 41, 71, 223, 159, 248, 72, 249, 188, 219, 234, - 246, 41, 71, 228, 210, 246, 41, 80, 249, 188, 228, 210, 213, 253, 71, - 228, 210, 213, 253, 80, 249, 188, 228, 210, 246, 41, 71, 214, 23, 80, - 225, 177, 248, 12, 223, 182, 80, 225, 177, 96, 217, 154, 249, 155, 215, - 129, 80, 225, 177, 96, 217, 154, 249, 155, 246, 178, 80, 225, 177, 246, - 179, 217, 154, 249, 155, 233, 159, 80, 225, 177, 246, 179, 217, 154, 249, - 155, 223, 172, 223, 175, 254, 67, 250, 62, 71, 233, 162, 254, 67, 254, - 126, 71, 216, 240, 254, 67, 254, 126, 71, 251, 226, 254, 67, 254, 126, - 71, 216, 240, 254, 67, 250, 62, 80, 2, 231, 64, 216, 240, 254, 67, 254, - 126, 80, 2, 225, 192, 232, 237, 47, 221, 95, 250, 62, 71, 232, 237, 43, - 221, 95, 254, 126, 71, 254, 126, 250, 60, 250, 96, 71, 250, 62, 250, 60, - 250, 96, 71, 96, 80, 74, 220, 196, 135, 71, 135, 80, 74, 220, 196, 96, - 71, 220, 196, 96, 80, 74, 135, 71, 96, 80, 2, 95, 55, 135, 80, 2, 95, 55, - 96, 80, 217, 106, 213, 169, 43, 47, 80, 217, 106, 4, 250, 95, 215, 130, - 216, 31, 80, 244, 77, 4, 250, 95, 43, 252, 185, 116, 47, 252, 185, 121, - 242, 101, 43, 252, 185, 121, 47, 252, 185, 116, 242, 101, 116, 252, 185, - 47, 121, 252, 185, 43, 242, 101, 116, 252, 185, 43, 121, 252, 185, 47, - 242, 101, 43, 252, 185, 116, 47, 252, 185, 116, 242, 101, 116, 252, 185, - 47, 121, 252, 185, 47, 242, 101, 43, 252, 185, 121, 47, 252, 185, 121, - 242, 101, 116, 252, 185, 43, 121, 252, 185, 43, 242, 101, 135, 242, 102, - 2, 252, 185, 116, 217, 10, 134, 96, 242, 102, 2, 252, 185, 116, 217, 10, - 134, 215, 130, 242, 102, 2, 252, 185, 47, 217, 10, 134, 246, 179, 242, - 102, 2, 252, 185, 47, 217, 10, 134, 135, 242, 102, 2, 252, 185, 121, 217, - 10, 134, 96, 242, 102, 2, 252, 185, 121, 217, 10, 134, 215, 130, 242, - 102, 2, 252, 185, 43, 217, 10, 134, 246, 179, 242, 102, 2, 252, 185, 43, - 217, 10, 134, 135, 242, 102, 2, 252, 185, 116, 244, 77, 134, 96, 242, - 102, 2, 252, 185, 116, 244, 77, 134, 215, 130, 242, 102, 2, 252, 185, 47, - 244, 77, 134, 246, 179, 242, 102, 2, 252, 185, 47, 244, 77, 134, 135, - 242, 102, 2, 252, 185, 121, 244, 77, 134, 96, 242, 102, 2, 252, 185, 121, - 244, 77, 134, 215, 130, 242, 102, 2, 252, 185, 43, 244, 77, 134, 246, - 179, 242, 102, 2, 252, 185, 43, 244, 77, 134, 135, 242, 102, 2, 252, 185, - 116, 74, 135, 242, 102, 2, 252, 185, 246, 181, 215, 130, 242, 102, 2, - 252, 185, 43, 252, 77, 215, 130, 242, 102, 2, 252, 185, 223, 182, 96, - 242, 102, 2, 252, 185, 116, 74, 96, 242, 102, 2, 252, 185, 246, 181, 246, - 179, 242, 102, 2, 252, 185, 43, 252, 77, 246, 179, 242, 102, 2, 252, 185, - 223, 182, 135, 242, 102, 2, 252, 185, 116, 74, 96, 242, 102, 2, 252, 185, - 215, 140, 135, 242, 102, 2, 252, 185, 121, 74, 96, 242, 102, 2, 252, 185, - 246, 181, 96, 242, 102, 2, 252, 185, 116, 74, 135, 242, 102, 2, 252, 185, - 215, 140, 96, 242, 102, 2, 252, 185, 121, 74, 135, 242, 102, 2, 252, 185, - 246, 181, 135, 242, 102, 2, 252, 185, 116, 74, 187, 248, 223, 135, 242, - 102, 2, 252, 185, 121, 252, 90, 187, 248, 223, 96, 242, 102, 2, 252, 185, - 116, 74, 187, 248, 223, 96, 242, 102, 2, 252, 185, 121, 252, 90, 187, - 248, 223, 215, 130, 242, 102, 2, 252, 185, 43, 252, 77, 246, 179, 242, - 102, 2, 252, 185, 223, 182, 246, 179, 242, 102, 2, 252, 185, 43, 252, 77, - 215, 130, 242, 102, 2, 252, 185, 223, 182, 47, 52, 80, 2, 223, 119, 242, - 82, 245, 182, 5, 74, 96, 71, 217, 56, 227, 72, 74, 96, 71, 135, 80, 74, - 217, 56, 227, 71, 96, 80, 74, 217, 56, 227, 71, 96, 80, 74, 254, 184, - 126, 109, 233, 137, 74, 135, 71, 135, 80, 217, 106, 233, 136, 242, 228, - 74, 96, 71, 219, 23, 74, 96, 71, 135, 80, 217, 106, 219, 22, 218, 236, - 74, 135, 71, 43, 244, 180, 218, 40, 47, 244, 180, 218, 40, 116, 244, 180, - 218, 40, 121, 244, 180, 218, 40, 216, 182, 66, 252, 187, 248, 132, 212, - 153, 179, 219, 193, 212, 153, 179, 216, 22, 250, 30, 43, 69, 249, 163, - 125, 47, 69, 249, 163, 125, 43, 69, 226, 168, 47, 69, 226, 168, 212, 153, - 179, 43, 236, 127, 125, 212, 153, 179, 47, 236, 127, 125, 212, 153, 179, - 43, 252, 34, 125, 212, 153, 179, 47, 252, 34, 125, 43, 42, 251, 210, 2, - 215, 159, 47, 42, 251, 210, 2, 215, 159, 43, 42, 251, 210, 2, 217, 82, - 236, 113, 216, 240, 249, 222, 47, 42, 251, 210, 2, 217, 82, 236, 113, - 251, 226, 249, 222, 43, 42, 251, 210, 2, 217, 82, 236, 113, 251, 226, - 249, 222, 47, 42, 251, 210, 2, 217, 82, 236, 113, 216, 240, 249, 222, 43, - 254, 146, 251, 210, 2, 247, 195, 47, 254, 146, 251, 210, 2, 247, 195, 43, - 254, 67, 233, 137, 125, 47, 254, 67, 242, 228, 125, 52, 43, 254, 67, 242, - 228, 125, 52, 47, 254, 67, 233, 137, 125, 43, 85, 216, 232, 220, 254, - 125, 47, 85, 216, 232, 220, 254, 125, 246, 193, 244, 224, 66, 212, 28, - 233, 83, 231, 223, 254, 146, 227, 73, 233, 168, 47, 254, 146, 214, 250, - 2, 219, 185, 231, 223, 47, 254, 146, 2, 247, 195, 254, 146, 2, 223, 29, - 236, 73, 255, 36, 254, 145, 219, 206, 254, 146, 227, 73, 233, 168, 219, - 206, 254, 146, 227, 73, 215, 140, 216, 66, 254, 145, 223, 236, 254, 145, - 254, 146, 2, 215, 159, 223, 236, 254, 146, 2, 215, 159, 227, 149, 254, - 146, 227, 73, 215, 140, 227, 149, 254, 146, 227, 73, 246, 181, 231, 223, - 254, 146, 2, 210, 254, 47, 245, 219, 236, 113, 80, 225, 177, 116, 22, - 223, 182, 231, 223, 254, 146, 2, 210, 254, 47, 245, 219, 236, 113, 80, - 225, 177, 116, 22, 233, 168, 231, 223, 254, 146, 2, 210, 254, 47, 245, - 219, 236, 113, 80, 225, 177, 121, 22, 223, 182, 231, 223, 254, 146, 2, - 210, 254, 47, 245, 219, 236, 113, 80, 225, 177, 121, 22, 233, 168, 231, - 223, 254, 146, 2, 210, 254, 47, 245, 219, 236, 113, 80, 225, 177, 47, 22, - 215, 140, 231, 223, 254, 146, 2, 210, 254, 47, 245, 219, 236, 113, 80, - 225, 177, 43, 22, 215, 140, 231, 223, 254, 146, 2, 210, 254, 47, 245, - 219, 236, 113, 80, 225, 177, 47, 22, 246, 181, 231, 223, 254, 146, 2, - 210, 254, 47, 245, 219, 236, 113, 80, 225, 177, 43, 22, 246, 181, 223, - 236, 245, 231, 221, 71, 245, 231, 221, 72, 2, 227, 29, 245, 231, 221, 72, - 2, 4, 250, 96, 50, 245, 231, 221, 72, 2, 47, 80, 50, 245, 231, 221, 72, - 2, 43, 80, 50, 250, 96, 2, 201, 134, 37, 66, 134, 37, 226, 172, 37, 223, - 237, 219, 250, 37, 226, 83, 250, 96, 247, 246, 251, 132, 201, 252, 187, - 22, 216, 240, 157, 247, 246, 251, 132, 66, 134, 250, 96, 2, 218, 238, - 213, 169, 37, 254, 125, 247, 242, 53, 116, 80, 217, 106, 250, 95, 37, 69, - 251, 167, 37, 251, 167, 37, 233, 136, 37, 242, 227, 250, 96, 2, 4, 250, - 96, 217, 10, 217, 162, 223, 182, 250, 96, 2, 119, 201, 219, 47, 217, 10, - 217, 162, 223, 182, 92, 223, 159, 248, 72, 220, 42, 92, 245, 8, 248, 72, - 220, 42, 92, 254, 3, 92, 4, 250, 95, 92, 219, 185, 119, 235, 182, 219, - 183, 216, 197, 2, 62, 50, 216, 197, 2, 215, 159, 223, 29, 236, 113, 216, - 196, 216, 197, 2, 221, 78, 253, 250, 251, 225, 47, 216, 197, 74, 43, 216, - 196, 43, 216, 197, 252, 77, 66, 134, 66, 252, 187, 252, 77, 47, 216, 196, - 251, 216, 2, 43, 157, 252, 13, 251, 216, 2, 47, 157, 252, 13, 85, 251, - 215, 29, 2, 43, 157, 252, 13, 29, 2, 47, 157, 252, 13, 69, 241, 85, 85, - 241, 85, 43, 213, 232, 244, 224, 47, 213, 232, 244, 224, 43, 52, 213, - 232, 244, 224, 47, 52, 213, 232, 244, 224, 236, 105, 236, 92, 217, 79, - 113, 236, 92, 236, 93, 229, 250, 2, 66, 134, 246, 187, 230, 227, 42, 2, - 249, 243, 227, 33, 236, 103, 254, 23, 220, 164, 225, 99, 245, 182, 5, 22, - 220, 44, 226, 172, 245, 182, 5, 22, 220, 44, 226, 173, 2, 217, 56, 50, - 240, 214, 217, 10, 22, 220, 44, 226, 172, 243, 23, 219, 108, 217, 151, - 246, 180, 216, 197, 2, 43, 157, 252, 13, 246, 180, 216, 197, 2, 47, 157, - 252, 13, 85, 248, 66, 2, 121, 71, 85, 232, 233, 69, 250, 96, 2, 121, 71, - 85, 250, 96, 2, 121, 71, 245, 169, 69, 219, 185, 245, 169, 85, 219, 185, - 245, 169, 69, 248, 65, 245, 169, 85, 248, 65, 245, 169, 69, 250, 95, 245, - 169, 85, 250, 95, 223, 69, 223, 237, 219, 251, 227, 71, 219, 251, 2, 227, - 29, 223, 237, 219, 251, 2, 201, 91, 252, 41, 219, 250, 252, 41, 223, 237, - 219, 250, 52, 225, 192, 216, 182, 225, 192, 233, 164, 249, 156, 254, 146, - 125, 223, 178, 249, 156, 254, 146, 125, 217, 45, 231, 62, 230, 166, 37, - 62, 227, 71, 230, 166, 37, 95, 227, 71, 230, 166, 37, 29, 227, 71, 230, - 166, 215, 153, 227, 72, 2, 247, 195, 230, 166, 215, 153, 227, 72, 2, 225, - 192, 230, 166, 42, 236, 57, 227, 71, 230, 166, 42, 215, 153, 227, 71, - 119, 233, 17, 22, 227, 71, 119, 233, 17, 171, 227, 71, 230, 166, 29, 227, - 71, 231, 38, 119, 219, 2, 219, 0, 2, 236, 69, 224, 204, 236, 70, 227, 71, - 244, 188, 226, 164, 236, 69, 236, 70, 2, 52, 91, 236, 70, 253, 216, 2, - 220, 42, 250, 92, 244, 61, 254, 126, 236, 67, 233, 84, 236, 68, 2, 224, - 42, 226, 147, 254, 44, 225, 171, 233, 84, 236, 68, 2, 221, 95, 226, 147, - 254, 44, 225, 171, 233, 84, 236, 68, 228, 206, 236, 107, 217, 162, 225, - 171, 236, 70, 254, 44, 111, 225, 181, 227, 71, 224, 198, 236, 70, 227, - 71, 236, 70, 2, 135, 80, 2, 102, 236, 70, 2, 29, 53, 236, 70, 2, 236, 56, - 236, 70, 2, 215, 152, 236, 70, 2, 227, 29, 236, 70, 2, 215, 159, 235, - 183, 233, 207, 43, 216, 197, 227, 71, 212, 153, 179, 222, 142, 250, 14, - 212, 153, 179, 222, 142, 225, 224, 212, 153, 179, 222, 142, 225, 96, 95, - 5, 2, 4, 250, 96, 50, 95, 5, 2, 250, 91, 255, 47, 50, 95, 5, 2, 217, 56, - 50, 95, 5, 2, 62, 55, 95, 5, 2, 217, 56, 55, 95, 5, 2, 219, 24, 112, 95, - 5, 2, 85, 216, 196, 231, 65, 5, 2, 250, 24, 50, 231, 65, 5, 2, 62, 55, - 231, 65, 5, 2, 245, 8, 247, 193, 231, 65, 5, 2, 223, 159, 247, 193, 95, - 5, 236, 113, 43, 157, 250, 95, 95, 5, 236, 113, 47, 157, 250, 95, 214, - 236, 171, 249, 194, 225, 99, 230, 224, 5, 2, 62, 50, 230, 224, 5, 2, 215, - 159, 221, 92, 225, 100, 2, 251, 226, 250, 59, 220, 24, 225, 99, 230, 224, - 5, 236, 113, 43, 157, 250, 95, 230, 224, 5, 236, 113, 47, 157, 250, 95, - 37, 230, 224, 5, 2, 250, 91, 255, 46, 230, 224, 5, 236, 113, 52, 250, 95, - 37, 247, 242, 53, 95, 5, 236, 113, 216, 196, 231, 65, 5, 236, 113, 216, - 196, 230, 224, 5, 236, 113, 216, 196, 236, 64, 225, 99, 223, 173, 236, - 64, 225, 99, 212, 153, 179, 224, 18, 250, 14, 254, 170, 171, 249, 227, - 236, 57, 2, 247, 195, 215, 153, 2, 231, 65, 53, 215, 153, 2, 227, 29, - 236, 57, 2, 227, 29, 236, 57, 2, 233, 17, 254, 154, 215, 153, 2, 233, 17, - 227, 62, 215, 153, 74, 236, 56, 236, 57, 74, 215, 152, 215, 153, 74, 252, - 187, 74, 236, 56, 236, 57, 74, 252, 187, 74, 215, 152, 215, 153, 252, 77, - 22, 235, 182, 2, 215, 152, 236, 57, 252, 77, 22, 235, 182, 2, 236, 56, - 250, 60, 215, 153, 2, 221, 77, 250, 60, 236, 57, 2, 221, 77, 52, 42, 236, - 56, 52, 42, 215, 152, 250, 60, 215, 153, 2, 221, 78, 22, 220, 24, 225, - 99, 233, 17, 22, 2, 62, 50, 233, 17, 171, 2, 62, 50, 52, 233, 17, 254, - 154, 52, 233, 17, 227, 62, 119, 236, 58, 233, 17, 254, 154, 119, 236, 58, - 233, 17, 227, 62, 220, 32, 233, 207, 227, 62, 220, 32, 233, 207, 254, - 154, 233, 17, 171, 227, 27, 233, 17, 254, 154, 233, 17, 22, 2, 231, 107, - 219, 93, 233, 17, 171, 2, 231, 107, 219, 93, 233, 17, 22, 2, 201, 248, - 223, 233, 17, 171, 2, 201, 248, 223, 233, 17, 22, 2, 52, 227, 29, 233, - 17, 22, 2, 215, 159, 233, 17, 22, 2, 52, 215, 159, 4, 214, 233, 2, 215, - 159, 233, 17, 171, 2, 52, 227, 29, 233, 17, 171, 2, 52, 215, 159, 212, - 153, 179, 247, 204, 254, 117, 212, 153, 179, 224, 75, 254, 117, 245, 182, - 5, 2, 62, 55, 240, 214, 2, 62, 50, 216, 182, 201, 252, 187, 2, 52, 66, - 91, 216, 182, 201, 252, 187, 2, 216, 182, 66, 91, 217, 56, 227, 72, 2, - 62, 50, 217, 56, 227, 72, 2, 223, 159, 247, 193, 220, 107, 231, 65, 220, - 106, 250, 5, 2, 62, 50, 245, 182, 2, 254, 3, 254, 184, 126, 217, 10, 2, - 250, 91, 255, 46, 254, 89, 126, 171, 126, 109, 245, 182, 5, 74, 95, 53, - 95, 5, 74, 245, 182, 53, 245, 182, 5, 74, 217, 56, 227, 71, 52, 250, 31, - 245, 183, 119, 250, 0, 245, 182, 220, 121, 137, 250, 0, 245, 182, 220, - 121, 245, 182, 5, 2, 119, 181, 74, 22, 119, 181, 55, 245, 178, 2, 244, - 101, 181, 50, 233, 137, 2, 250, 96, 236, 73, 242, 228, 2, 250, 96, 236, - 73, 233, 137, 2, 224, 193, 156, 50, 242, 228, 2, 224, 193, 156, 50, 233, - 137, 171, 220, 44, 126, 109, 242, 228, 171, 220, 44, 126, 109, 233, 137, - 171, 220, 44, 126, 217, 10, 2, 62, 236, 73, 242, 228, 171, 220, 44, 126, - 217, 10, 2, 62, 236, 73, 233, 137, 171, 220, 44, 126, 217, 10, 2, 62, 50, - 242, 228, 171, 220, 44, 126, 217, 10, 2, 62, 50, 233, 137, 171, 220, 44, - 126, 217, 10, 2, 62, 74, 223, 182, 242, 228, 171, 220, 44, 126, 217, 10, - 2, 62, 74, 233, 168, 233, 137, 171, 254, 90, 242, 228, 171, 254, 90, 233, - 137, 22, 220, 98, 228, 206, 126, 109, 242, 228, 22, 220, 98, 228, 206, - 126, 109, 233, 137, 22, 228, 206, 254, 90, 242, 228, 22, 228, 206, 254, - 90, 233, 137, 74, 246, 186, 126, 74, 242, 227, 242, 228, 74, 246, 186, - 126, 74, 233, 136, 233, 137, 74, 220, 107, 171, 245, 183, 242, 228, 74, - 220, 107, 171, 245, 183, 233, 137, 74, 220, 107, 74, 242, 227, 242, 228, - 74, 220, 107, 74, 233, 136, 233, 137, 74, 242, 228, 74, 246, 186, 245, - 183, 242, 228, 74, 233, 137, 74, 246, 186, 245, 183, 233, 137, 74, 220, - 44, 126, 74, 242, 228, 74, 220, 44, 245, 183, 242, 228, 74, 220, 44, 126, - 74, 233, 137, 74, 220, 44, 245, 183, 220, 44, 126, 217, 10, 171, 233, - 136, 220, 44, 126, 217, 10, 171, 242, 227, 220, 44, 126, 217, 10, 171, - 233, 137, 2, 62, 236, 73, 220, 44, 126, 217, 10, 171, 242, 228, 2, 62, - 236, 73, 246, 186, 126, 217, 10, 171, 233, 136, 246, 186, 126, 217, 10, - 171, 242, 227, 246, 186, 220, 44, 126, 217, 10, 171, 233, 136, 246, 186, - 220, 44, 126, 217, 10, 171, 242, 227, 220, 107, 171, 233, 136, 220, 107, - 171, 242, 227, 220, 107, 74, 233, 137, 74, 245, 182, 53, 220, 107, 74, - 242, 228, 74, 245, 182, 53, 52, 229, 240, 233, 136, 52, 229, 240, 242, - 227, 52, 229, 240, 233, 137, 2, 215, 159, 242, 228, 227, 27, 233, 136, - 242, 228, 252, 77, 233, 136, 233, 137, 250, 60, 251, 132, 249, 157, 242, - 228, 250, 60, 251, 132, 249, 157, 233, 137, 250, 60, 251, 132, 249, 158, - 74, 220, 44, 245, 183, 242, 228, 250, 60, 251, 132, 249, 158, 74, 220, - 44, 245, 183, 220, 25, 217, 166, 233, 205, 217, 166, 220, 25, 217, 167, - 171, 126, 109, 233, 205, 217, 167, 171, 126, 109, 245, 182, 5, 2, 251, - 162, 50, 225, 119, 74, 220, 98, 245, 182, 53, 219, 15, 74, 220, 98, 245, - 182, 53, 225, 119, 74, 220, 98, 228, 206, 126, 109, 219, 15, 74, 220, 98, - 228, 206, 126, 109, 225, 119, 74, 245, 182, 53, 219, 15, 74, 245, 182, - 53, 225, 119, 74, 228, 206, 126, 109, 219, 15, 74, 228, 206, 126, 109, - 225, 119, 74, 254, 184, 126, 109, 219, 15, 74, 254, 184, 126, 109, 225, - 119, 74, 228, 206, 254, 184, 126, 109, 219, 15, 74, 228, 206, 254, 184, - 126, 109, 52, 225, 118, 52, 219, 14, 219, 23, 2, 247, 195, 218, 236, 2, - 247, 195, 219, 23, 2, 95, 5, 55, 218, 236, 2, 95, 5, 55, 219, 23, 2, 230, - 224, 5, 55, 218, 236, 2, 230, 224, 5, 55, 219, 23, 68, 171, 126, 217, 10, - 2, 62, 50, 218, 236, 68, 171, 126, 217, 10, 2, 62, 50, 219, 23, 68, 74, - 245, 182, 53, 218, 236, 68, 74, 245, 182, 53, 219, 23, 68, 74, 217, 56, - 227, 71, 218, 236, 68, 74, 217, 56, 227, 71, 219, 23, 68, 74, 254, 184, - 126, 109, 218, 236, 68, 74, 254, 184, 126, 109, 219, 23, 68, 74, 228, - 206, 126, 109, 218, 236, 68, 74, 228, 206, 126, 109, 42, 43, 210, 93, - 227, 71, 42, 47, 210, 93, 227, 71, 250, 60, 219, 22, 250, 60, 218, 235, - 250, 60, 219, 23, 171, 126, 109, 250, 60, 218, 236, 171, 126, 109, 219, - 23, 74, 218, 235, 218, 236, 74, 219, 22, 219, 23, 74, 219, 22, 218, 236, - 74, 218, 235, 218, 236, 252, 77, 219, 22, 218, 236, 252, 77, 22, 235, - 182, 251, 132, 248, 224, 2, 219, 22, 245, 248, 68, 227, 73, 246, 178, - 225, 216, 2, 217, 233, 216, 239, 216, 211, 236, 56, 244, 110, 228, 219, - 220, 196, 43, 218, 50, 220, 196, 121, 218, 50, 220, 196, 116, 218, 50, - 226, 84, 2, 196, 66, 252, 187, 216, 182, 47, 216, 65, 52, 66, 252, 187, - 43, 216, 65, 66, 252, 187, 52, 43, 216, 65, 52, 66, 252, 187, 52, 43, - 216, 65, 187, 248, 224, 244, 77, 43, 231, 197, 68, 52, 214, 221, 220, - 196, 121, 218, 51, 2, 227, 29, 220, 196, 116, 218, 51, 2, 215, 159, 220, - 196, 116, 218, 51, 74, 220, 196, 121, 218, 50, 52, 121, 218, 50, 52, 116, - 218, 50, 52, 219, 59, 228, 206, 53, 223, 236, 52, 219, 59, 228, 206, 53, - 247, 213, 228, 206, 247, 248, 2, 223, 236, 229, 249, 220, 42, 66, 233, - 84, 2, 250, 96, 50, 66, 233, 84, 2, 250, 96, 55, 121, 218, 51, 2, 250, - 96, 55, 226, 173, 2, 201, 91, 226, 173, 2, 217, 56, 227, 71, 216, 182, - 66, 252, 187, 252, 36, 224, 19, 216, 182, 66, 252, 187, 2, 201, 91, 216, - 182, 250, 31, 227, 71, 216, 182, 229, 240, 233, 136, 216, 182, 229, 240, - 242, 227, 246, 186, 220, 44, 233, 137, 171, 126, 109, 246, 186, 220, 44, - 242, 228, 171, 126, 109, 216, 182, 219, 251, 252, 36, 224, 19, 233, 207, - 216, 182, 66, 252, 187, 227, 71, 52, 219, 251, 227, 71, 69, 66, 134, 230, - 166, 69, 66, 134, 228, 210, 246, 41, 69, 71, 228, 210, 213, 253, 69, 71, - 219, 234, 246, 41, 69, 71, 219, 234, 213, 253, 69, 71, 43, 47, 69, 71, - 135, 85, 71, 215, 130, 85, 71, 246, 179, 85, 71, 228, 210, 246, 41, 85, - 71, 228, 210, 213, 253, 85, 71, 219, 234, 246, 41, 85, 71, 219, 234, 213, - 253, 85, 71, 43, 47, 85, 71, 116, 121, 85, 71, 96, 80, 2, 217, 44, 246, - 178, 96, 80, 2, 217, 44, 215, 129, 135, 80, 2, 217, 44, 246, 178, 135, - 80, 2, 217, 44, 215, 129, 42, 2, 216, 240, 157, 252, 13, 42, 2, 251, 226, - 157, 252, 13, 42, 2, 215, 137, 47, 248, 72, 157, 252, 13, 42, 2, 232, - 237, 43, 248, 72, 157, 252, 13, 248, 66, 2, 43, 157, 252, 13, 248, 66, 2, - 47, 157, 252, 13, 248, 66, 2, 216, 240, 157, 252, 13, 248, 66, 2, 251, - 226, 157, 252, 13, 246, 193, 219, 185, 85, 233, 207, 219, 185, 69, 233, - 207, 219, 185, 85, 214, 169, 4, 219, 185, 69, 214, 169, 4, 219, 185, 85, - 226, 101, 69, 226, 101, 69, 242, 41, 85, 242, 41, 201, 85, 242, 41, 85, - 233, 207, 250, 95, 85, 231, 217, 248, 65, 69, 231, 217, 248, 65, 85, 231, - 217, 232, 233, 69, 231, 217, 232, 233, 85, 4, 248, 65, 85, 4, 232, 233, - 69, 4, 232, 233, 85, 201, 245, 242, 69, 201, 245, 242, 85, 66, 245, 242, - 69, 66, 245, 242, 43, 80, 2, 4, 250, 95, 137, 135, 254, 33, 43, 80, 2, - 37, 225, 192, 187, 135, 219, 181, 71, 135, 216, 31, 80, 2, 66, 91, 135, - 216, 31, 80, 2, 52, 66, 91, 135, 216, 31, 80, 244, 77, 134, 135, 216, 31, - 216, 182, 248, 224, 71, 135, 80, 2, 246, 193, 219, 93, 135, 80, 2, 218, - 41, 2, 66, 91, 135, 80, 2, 218, 41, 2, 52, 66, 91, 135, 216, 31, 80, 2, - 218, 40, 135, 216, 31, 80, 2, 218, 41, 2, 66, 91, 135, 216, 31, 80, 2, - 218, 41, 2, 52, 66, 91, 135, 80, 217, 106, 213, 169, 214, 23, 80, 225, - 177, 248, 12, 233, 168, 245, 182, 5, 74, 135, 71, 223, 237, 217, 56, 227, - 72, 74, 135, 71, 135, 80, 74, 223, 237, 254, 184, 126, 109, 96, 80, 217, - 106, 242, 227, 96, 80, 217, 106, 218, 235, 135, 224, 204, 71, 96, 224, - 204, 71, 223, 237, 217, 56, 227, 72, 74, 96, 71, 96, 80, 74, 223, 237, - 254, 184, 126, 109, 217, 56, 227, 72, 74, 135, 71, 135, 80, 74, 254, 184, - 126, 109, 135, 80, 74, 223, 237, 217, 56, 227, 71, 96, 80, 74, 223, 237, - 217, 56, 227, 71, 69, 231, 217, 219, 109, 85, 4, 219, 109, 69, 4, 219, - 109, 85, 223, 178, 226, 101, 69, 223, 178, 226, 101, 110, 233, 207, 250, - 95, 110, 227, 30, 2, 227, 30, 236, 73, 110, 250, 96, 2, 250, 96, 236, 73, - 110, 250, 95, 110, 37, 222, 193, 140, 6, 1, 253, 202, 140, 6, 1, 251, - 171, 140, 6, 1, 214, 235, 140, 6, 1, 243, 25, 140, 6, 1, 247, 215, 140, - 6, 1, 213, 13, 140, 6, 1, 212, 61, 140, 6, 1, 246, 110, 140, 6, 1, 212, - 84, 140, 6, 1, 236, 7, 140, 6, 1, 73, 236, 7, 140, 6, 1, 75, 140, 6, 1, - 247, 233, 140, 6, 1, 235, 102, 140, 6, 1, 233, 56, 140, 6, 1, 230, 170, - 140, 6, 1, 230, 80, 140, 6, 1, 227, 88, 140, 6, 1, 225, 174, 140, 6, 1, - 223, 158, 140, 6, 1, 220, 30, 140, 6, 1, 216, 53, 140, 6, 1, 215, 177, - 140, 6, 1, 244, 80, 140, 6, 1, 242, 47, 140, 6, 1, 227, 41, 140, 6, 1, - 226, 132, 140, 6, 1, 220, 173, 140, 6, 1, 216, 138, 140, 6, 1, 250, 135, - 140, 6, 1, 221, 47, 140, 6, 1, 213, 19, 140, 6, 1, 213, 21, 140, 6, 1, - 213, 49, 140, 6, 1, 219, 204, 162, 140, 6, 1, 212, 204, 140, 6, 1, 4, - 212, 175, 140, 6, 1, 4, 212, 176, 2, 218, 40, 140, 6, 1, 212, 236, 140, - 6, 1, 236, 43, 4, 212, 175, 140, 6, 1, 252, 41, 212, 175, 140, 6, 1, 236, - 43, 252, 41, 212, 175, 140, 6, 1, 244, 171, 140, 6, 1, 236, 5, 140, 6, 1, - 220, 172, 140, 6, 1, 216, 173, 63, 140, 6, 1, 233, 197, 230, 170, 140, 4, - 1, 253, 202, 140, 4, 1, 251, 171, 140, 4, 1, 214, 235, 140, 4, 1, 243, - 25, 140, 4, 1, 247, 215, 140, 4, 1, 213, 13, 140, 4, 1, 212, 61, 140, 4, - 1, 246, 110, 140, 4, 1, 212, 84, 140, 4, 1, 236, 7, 140, 4, 1, 73, 236, - 7, 140, 4, 1, 75, 140, 4, 1, 247, 233, 140, 4, 1, 235, 102, 140, 4, 1, - 233, 56, 140, 4, 1, 230, 170, 140, 4, 1, 230, 80, 140, 4, 1, 227, 88, - 140, 4, 1, 225, 174, 140, 4, 1, 223, 158, 140, 4, 1, 220, 30, 140, 4, 1, - 216, 53, 140, 4, 1, 215, 177, 140, 4, 1, 244, 80, 140, 4, 1, 242, 47, - 140, 4, 1, 227, 41, 140, 4, 1, 226, 132, 140, 4, 1, 220, 173, 140, 4, 1, - 216, 138, 140, 4, 1, 250, 135, 140, 4, 1, 221, 47, 140, 4, 1, 213, 19, - 140, 4, 1, 213, 21, 140, 4, 1, 213, 49, 140, 4, 1, 219, 204, 162, 140, 4, - 1, 212, 204, 140, 4, 1, 4, 212, 175, 140, 4, 1, 4, 212, 176, 2, 218, 40, - 140, 4, 1, 212, 236, 140, 4, 1, 236, 43, 4, 212, 175, 140, 4, 1, 252, 41, - 212, 175, 140, 4, 1, 236, 43, 252, 41, 212, 175, 140, 4, 1, 244, 171, - 140, 4, 1, 236, 5, 140, 4, 1, 220, 172, 140, 4, 1, 216, 173, 63, 140, 4, - 1, 233, 197, 230, 170, 7, 6, 1, 234, 13, 2, 52, 134, 7, 4, 1, 234, 13, 2, - 52, 134, 7, 6, 1, 234, 13, 2, 231, 107, 177, 7, 6, 1, 227, 12, 2, 91, 7, - 6, 1, 224, 148, 2, 218, 40, 7, 4, 1, 111, 2, 91, 7, 4, 1, 218, 114, 2, - 248, 72, 91, 7, 6, 1, 242, 163, 2, 248, 111, 7, 4, 1, 242, 163, 2, 248, - 111, 7, 6, 1, 235, 142, 2, 248, 111, 7, 4, 1, 235, 142, 2, 248, 111, 7, - 6, 1, 212, 153, 2, 248, 111, 7, 4, 1, 212, 153, 2, 248, 111, 7, 6, 1, - 254, 179, 7, 6, 1, 232, 183, 2, 102, 7, 6, 1, 216, 66, 63, 7, 6, 1, 216, - 66, 254, 179, 7, 4, 1, 215, 86, 2, 47, 102, 7, 6, 1, 214, 86, 2, 102, 7, - 4, 1, 214, 86, 2, 102, 7, 4, 1, 215, 86, 2, 249, 164, 7, 6, 1, 157, 242, - 162, 7, 4, 1, 157, 242, 162, 7, 4, 1, 218, 38, 226, 45, 7, 4, 1, 154, 2, - 228, 204, 7, 4, 1, 216, 66, 224, 148, 2, 218, 40, 7, 4, 1, 141, 2, 117, - 223, 165, 236, 73, 7, 1, 4, 6, 216, 66, 77, 7, 219, 24, 4, 1, 236, 3, 59, - 1, 6, 211, 211, 7, 6, 1, 223, 29, 2, 218, 209, 218, 40, 7, 6, 1, 212, - 153, 2, 218, 209, 218, 40, 81, 6, 1, 254, 200, 81, 4, 1, 254, 200, 81, 6, - 1, 214, 156, 81, 4, 1, 214, 156, 81, 6, 1, 243, 203, 81, 4, 1, 243, 203, - 81, 6, 1, 249, 2, 81, 4, 1, 249, 2, 81, 6, 1, 246, 16, 81, 4, 1, 246, 16, - 81, 6, 1, 219, 239, 81, 4, 1, 219, 239, 81, 6, 1, 212, 94, 81, 4, 1, 212, - 94, 81, 6, 1, 242, 95, 81, 4, 1, 242, 95, 81, 6, 1, 217, 143, 81, 4, 1, - 217, 143, 81, 6, 1, 240, 226, 81, 4, 1, 240, 226, 81, 6, 1, 235, 89, 81, - 4, 1, 235, 89, 81, 6, 1, 233, 194, 81, 4, 1, 233, 194, 81, 6, 1, 231, - 112, 81, 4, 1, 231, 112, 81, 6, 1, 229, 128, 81, 4, 1, 229, 128, 81, 6, - 1, 234, 97, 81, 4, 1, 234, 97, 81, 6, 1, 78, 81, 4, 1, 78, 81, 6, 1, 226, - 20, 81, 4, 1, 226, 20, 81, 6, 1, 223, 146, 81, 4, 1, 223, 146, 81, 6, 1, - 220, 110, 81, 4, 1, 220, 110, 81, 6, 1, 218, 5, 81, 4, 1, 218, 5, 81, 6, - 1, 215, 202, 81, 4, 1, 215, 202, 81, 6, 1, 244, 210, 81, 4, 1, 244, 210, - 81, 6, 1, 234, 230, 81, 4, 1, 234, 230, 81, 6, 1, 225, 82, 81, 4, 1, 225, - 82, 81, 6, 1, 227, 81, 81, 4, 1, 227, 81, 81, 6, 1, 248, 70, 254, 205, - 81, 4, 1, 248, 70, 254, 205, 81, 6, 1, 54, 81, 254, 231, 81, 4, 1, 54, - 81, 254, 231, 81, 6, 1, 249, 178, 246, 16, 81, 4, 1, 249, 178, 246, 16, - 81, 6, 1, 248, 70, 235, 89, 81, 4, 1, 248, 70, 235, 89, 81, 6, 1, 248, - 70, 229, 128, 81, 4, 1, 248, 70, 229, 128, 81, 6, 1, 249, 178, 229, 128, - 81, 4, 1, 249, 178, 229, 128, 81, 6, 1, 54, 81, 227, 81, 81, 4, 1, 54, - 81, 227, 81, 81, 6, 1, 222, 185, 81, 4, 1, 222, 185, 81, 6, 1, 249, 191, - 221, 0, 81, 4, 1, 249, 191, 221, 0, 81, 6, 1, 54, 81, 221, 0, 81, 4, 1, - 54, 81, 221, 0, 81, 6, 1, 54, 81, 245, 161, 81, 4, 1, 54, 81, 245, 161, - 81, 6, 1, 254, 217, 234, 235, 81, 4, 1, 254, 217, 234, 235, 81, 6, 1, - 248, 70, 241, 150, 81, 4, 1, 248, 70, 241, 150, 81, 6, 1, 54, 81, 241, - 150, 81, 4, 1, 54, 81, 241, 150, 81, 6, 1, 54, 81, 162, 81, 4, 1, 54, 81, - 162, 81, 6, 1, 234, 12, 162, 81, 4, 1, 234, 12, 162, 81, 6, 1, 54, 81, - 242, 64, 81, 4, 1, 54, 81, 242, 64, 81, 6, 1, 54, 81, 242, 98, 81, 4, 1, - 54, 81, 242, 98, 81, 6, 1, 54, 81, 243, 198, 81, 4, 1, 54, 81, 243, 198, - 81, 6, 1, 54, 81, 247, 236, 81, 4, 1, 54, 81, 247, 236, 81, 6, 1, 54, 81, - 220, 223, 81, 4, 1, 54, 81, 220, 223, 81, 6, 1, 54, 228, 106, 220, 223, - 81, 4, 1, 54, 228, 106, 220, 223, 81, 6, 1, 54, 228, 106, 229, 178, 81, - 4, 1, 54, 228, 106, 229, 178, 81, 6, 1, 54, 228, 106, 228, 49, 81, 4, 1, - 54, 228, 106, 228, 49, 81, 6, 1, 54, 228, 106, 214, 24, 81, 4, 1, 54, - 228, 106, 214, 24, 81, 16, 235, 108, 81, 16, 231, 113, 223, 146, 81, 16, - 226, 21, 223, 146, 81, 16, 219, 101, 81, 16, 218, 6, 223, 146, 81, 16, - 234, 231, 223, 146, 81, 16, 220, 224, 220, 110, 81, 6, 1, 249, 178, 221, - 0, 81, 4, 1, 249, 178, 221, 0, 81, 6, 1, 249, 178, 243, 198, 81, 4, 1, - 249, 178, 243, 198, 81, 38, 229, 129, 50, 81, 38, 219, 198, 254, 10, 81, - 38, 219, 198, 233, 143, 81, 54, 228, 106, 244, 64, 219, 83, 81, 54, 228, - 106, 248, 14, 224, 193, 79, 81, 54, 228, 106, 236, 95, 224, 193, 79, 81, - 54, 228, 106, 214, 223, 247, 245, 81, 244, 92, 124, 242, 129, 81, 244, - 64, 219, 83, 81, 231, 8, 247, 245, 99, 4, 1, 254, 159, 99, 4, 1, 252, - 198, 99, 4, 1, 243, 202, 99, 4, 1, 247, 203, 99, 4, 1, 245, 229, 99, 4, - 1, 214, 145, 99, 4, 1, 212, 82, 99, 4, 1, 218, 24, 99, 4, 1, 236, 112, - 99, 4, 1, 235, 96, 99, 4, 1, 233, 203, 99, 4, 1, 232, 63, 99, 4, 1, 230, - 83, 99, 4, 1, 227, 99, 99, 4, 1, 226, 182, 99, 4, 1, 212, 71, 99, 4, 1, - 224, 96, 99, 4, 1, 222, 183, 99, 4, 1, 218, 14, 99, 4, 1, 215, 166, 99, - 4, 1, 226, 52, 99, 4, 1, 234, 239, 99, 4, 1, 243, 81, 99, 4, 1, 224, 252, - 99, 4, 1, 220, 221, 99, 4, 1, 250, 157, 99, 4, 1, 251, 63, 99, 4, 1, 235, - 217, 99, 4, 1, 250, 100, 99, 4, 1, 250, 202, 99, 4, 1, 213, 154, 99, 4, - 1, 235, 228, 99, 4, 1, 242, 145, 99, 4, 1, 242, 85, 99, 4, 1, 242, 23, - 99, 4, 1, 214, 9, 99, 4, 1, 242, 107, 99, 4, 1, 241, 170, 217, 75, 1, - 189, 217, 75, 1, 213, 90, 217, 75, 1, 213, 89, 217, 75, 1, 213, 79, 217, - 75, 1, 213, 77, 217, 75, 1, 252, 79, 255, 48, 213, 72, 217, 75, 1, 213, - 72, 217, 75, 1, 213, 87, 217, 75, 1, 213, 84, 217, 75, 1, 213, 86, 217, - 75, 1, 213, 85, 217, 75, 1, 213, 4, 217, 75, 1, 213, 81, 217, 75, 1, 213, - 70, 217, 75, 1, 216, 87, 213, 70, 217, 75, 1, 213, 67, 217, 75, 1, 213, - 75, 217, 75, 1, 252, 79, 255, 48, 213, 75, 217, 75, 1, 216, 87, 213, 75, - 217, 75, 1, 213, 74, 217, 75, 1, 213, 94, 217, 75, 1, 213, 68, 217, 75, - 1, 216, 87, 213, 68, 217, 75, 1, 213, 58, 217, 75, 1, 216, 87, 213, 58, - 217, 75, 1, 213, 0, 217, 75, 1, 213, 41, 217, 75, 1, 254, 240, 213, 41, - 217, 75, 1, 216, 87, 213, 41, 217, 75, 1, 213, 66, 217, 75, 1, 213, 65, - 217, 75, 1, 213, 62, 217, 75, 1, 216, 87, 213, 76, 217, 75, 1, 216, 87, - 213, 60, 217, 75, 1, 213, 59, 217, 75, 1, 212, 204, 217, 75, 1, 213, 56, - 217, 75, 1, 213, 55, 217, 75, 1, 213, 78, 217, 75, 1, 216, 87, 213, 78, - 217, 75, 1, 253, 206, 213, 78, 217, 75, 1, 213, 54, 217, 75, 1, 213, 52, - 217, 75, 1, 213, 53, 217, 75, 1, 213, 51, 217, 75, 1, 213, 50, 217, 75, - 1, 213, 88, 217, 75, 1, 213, 48, 217, 75, 1, 213, 46, 217, 75, 1, 213, - 45, 217, 75, 1, 213, 44, 217, 75, 1, 213, 42, 217, 75, 1, 217, 254, 213, - 42, 217, 75, 1, 213, 40, 217, 75, 59, 1, 233, 247, 79, 217, 75, 221, 81, - 79, 217, 75, 120, 235, 180, 28, 3, 233, 25, 28, 3, 231, 44, 28, 3, 223, - 144, 28, 3, 220, 4, 28, 3, 220, 207, 28, 3, 251, 252, 28, 3, 217, 9, 28, - 3, 250, 41, 28, 3, 228, 226, 28, 3, 228, 34, 28, 3, 243, 20, 227, 157, - 28, 3, 212, 15, 28, 3, 247, 218, 28, 3, 248, 176, 28, 3, 235, 184, 28, 3, - 217, 121, 28, 3, 250, 145, 28, 3, 226, 32, 28, 3, 225, 185, 28, 3, 243, - 95, 28, 3, 243, 91, 28, 3, 243, 92, 28, 3, 243, 93, 28, 3, 219, 176, 28, - 3, 219, 132, 28, 3, 219, 145, 28, 3, 219, 175, 28, 3, 219, 149, 28, 3, - 219, 150, 28, 3, 219, 137, 28, 3, 251, 13, 28, 3, 250, 249, 28, 3, 250, - 251, 28, 3, 251, 12, 28, 3, 251, 10, 28, 3, 251, 11, 28, 3, 250, 250, 28, - 3, 211, 242, 28, 3, 211, 222, 28, 3, 211, 233, 28, 3, 211, 241, 28, 3, - 211, 236, 28, 3, 211, 237, 28, 3, 211, 225, 28, 3, 251, 9, 28, 3, 250, - 252, 28, 3, 250, 254, 28, 3, 251, 8, 28, 3, 251, 6, 28, 3, 251, 7, 28, 3, - 250, 253, 28, 3, 224, 160, 28, 3, 224, 150, 28, 3, 224, 156, 28, 3, 224, - 159, 28, 3, 224, 157, 28, 3, 224, 158, 28, 3, 224, 155, 28, 3, 234, 23, - 28, 3, 234, 15, 28, 3, 234, 18, 28, 3, 234, 22, 28, 3, 234, 19, 28, 3, - 234, 20, 28, 3, 234, 16, 28, 3, 213, 121, 28, 3, 213, 111, 28, 3, 213, - 117, 28, 3, 213, 120, 28, 3, 213, 118, 28, 3, 213, 119, 28, 3, 213, 116, - 28, 3, 242, 173, 28, 3, 242, 164, 28, 3, 242, 167, 28, 3, 242, 172, 28, - 3, 242, 169, 28, 3, 242, 170, 28, 3, 242, 166, 38, 33, 1, 252, 121, 38, - 33, 1, 214, 237, 38, 33, 1, 243, 76, 38, 33, 1, 248, 162, 38, 33, 1, 212, - 67, 38, 33, 1, 212, 87, 38, 33, 1, 183, 38, 33, 1, 245, 252, 38, 33, 1, - 245, 238, 38, 33, 1, 245, 229, 38, 33, 1, 78, 38, 33, 1, 226, 132, 38, - 33, 1, 245, 176, 38, 33, 1, 245, 166, 38, 33, 1, 217, 242, 38, 33, 1, - 162, 38, 33, 1, 216, 149, 38, 33, 1, 250, 190, 38, 33, 1, 221, 47, 38, - 33, 1, 221, 10, 38, 33, 1, 244, 171, 38, 33, 1, 245, 165, 38, 33, 1, 63, - 38, 33, 1, 236, 172, 38, 33, 1, 247, 234, 38, 33, 1, 231, 24, 215, 181, - 38, 33, 1, 213, 51, 38, 33, 1, 212, 204, 38, 33, 1, 236, 42, 63, 38, 33, - 1, 233, 62, 212, 175, 38, 33, 1, 252, 41, 212, 175, 38, 33, 1, 236, 42, - 252, 41, 212, 175, 47, 254, 146, 219, 19, 232, 32, 47, 254, 146, 246, - 193, 219, 19, 232, 32, 43, 219, 19, 125, 47, 219, 19, 125, 43, 246, 193, - 219, 19, 125, 47, 246, 193, 219, 19, 125, 224, 83, 236, 60, 232, 32, 224, - 83, 246, 193, 236, 60, 232, 32, 246, 193, 216, 212, 232, 32, 43, 216, - 212, 125, 47, 216, 212, 125, 224, 83, 219, 185, 43, 224, 83, 227, 101, - 125, 47, 224, 83, 227, 101, 125, 246, 31, 249, 220, 226, 178, 244, 111, - 226, 178, 223, 236, 244, 111, 226, 178, 241, 18, 246, 193, 227, 152, 246, - 179, 254, 155, 215, 130, 254, 155, 246, 193, 223, 178, 254, 145, 52, 227, - 149, 241, 21, 236, 52, 236, 59, 226, 223, 251, 206, 241, 22, 2, 248, 74, - 217, 56, 2, 223, 165, 50, 43, 117, 226, 170, 125, 47, 117, 226, 170, 125, - 217, 56, 2, 62, 50, 217, 56, 2, 62, 55, 43, 66, 252, 187, 2, 224, 187, - 47, 66, 252, 187, 2, 224, 187, 216, 240, 43, 157, 125, 216, 240, 47, 157, - 125, 251, 226, 43, 157, 125, 251, 226, 47, 157, 125, 43, 220, 132, 103, - 125, 47, 220, 132, 103, 125, 43, 52, 226, 168, 47, 52, 226, 168, 119, - 181, 113, 124, 62, 225, 62, 124, 62, 113, 119, 181, 225, 62, 92, 244, - 101, 62, 225, 62, 244, 170, 62, 79, 223, 236, 224, 193, 79, 66, 177, 223, - 165, 225, 180, 213, 199, 221, 81, 231, 107, 247, 195, 9, 34, 224, 5, 9, - 34, 250, 70, 9, 34, 222, 118, 118, 9, 34, 222, 118, 112, 9, 34, 222, 118, - 170, 9, 34, 226, 79, 9, 34, 251, 214, 9, 34, 218, 54, 9, 34, 234, 153, - 118, 9, 34, 234, 153, 112, 9, 34, 247, 243, 9, 34, 222, 121, 9, 34, 4, - 118, 9, 34, 4, 112, 9, 34, 233, 219, 118, 9, 34, 233, 219, 112, 9, 34, - 233, 219, 170, 9, 34, 233, 219, 167, 9, 34, 220, 15, 9, 34, 217, 111, 9, - 34, 220, 13, 118, 9, 34, 220, 13, 112, 9, 34, 242, 75, 118, 9, 34, 242, - 75, 112, 9, 34, 242, 118, 9, 34, 224, 74, 9, 34, 250, 142, 9, 34, 218, - 252, 9, 34, 231, 12, 9, 34, 248, 160, 9, 34, 231, 4, 9, 34, 250, 85, 9, - 34, 214, 28, 118, 9, 34, 214, 28, 112, 9, 34, 244, 185, 9, 34, 226, 142, - 118, 9, 34, 226, 142, 112, 9, 34, 220, 105, 157, 216, 207, 216, 159, 9, - 34, 249, 207, 9, 34, 247, 211, 9, 34, 235, 252, 9, 34, 251, 247, 68, 250, - 54, 9, 34, 245, 104, 9, 34, 219, 200, 118, 9, 34, 219, 200, 112, 9, 34, - 252, 200, 9, 34, 220, 112, 9, 34, 251, 118, 220, 112, 9, 34, 229, 239, - 118, 9, 34, 229, 239, 112, 9, 34, 229, 239, 170, 9, 34, 229, 239, 167, 9, - 34, 231, 181, 9, 34, 221, 2, 9, 34, 224, 80, 9, 34, 245, 125, 9, 34, 227, - 112, 9, 34, 251, 186, 118, 9, 34, 251, 186, 112, 9, 34, 231, 221, 9, 34, - 231, 7, 9, 34, 242, 237, 118, 9, 34, 242, 237, 112, 9, 34, 242, 237, 170, - 9, 34, 217, 73, 9, 34, 250, 53, 9, 34, 213, 253, 118, 9, 34, 213, 253, - 112, 9, 34, 251, 118, 222, 112, 9, 34, 220, 105, 241, 97, 9, 34, 241, 97, - 9, 34, 251, 118, 219, 209, 9, 34, 251, 118, 220, 253, 9, 34, 244, 121, 9, - 34, 251, 118, 251, 28, 9, 34, 220, 105, 214, 44, 9, 34, 214, 45, 118, 9, - 34, 214, 45, 112, 9, 34, 250, 87, 9, 34, 251, 118, 243, 6, 9, 34, 187, - 118, 9, 34, 187, 112, 9, 34, 251, 118, 233, 8, 9, 34, 251, 118, 243, 184, - 9, 34, 231, 3, 118, 9, 34, 231, 3, 112, 9, 34, 224, 85, 9, 34, 251, 255, - 9, 34, 251, 118, 218, 20, 233, 174, 9, 34, 251, 118, 233, 175, 9, 34, - 251, 118, 213, 227, 9, 34, 251, 118, 244, 135, 9, 34, 246, 39, 118, 9, - 34, 246, 39, 112, 9, 34, 246, 39, 170, 9, 34, 251, 118, 246, 38, 9, 34, - 242, 82, 9, 34, 251, 118, 241, 94, 9, 34, 251, 244, 9, 34, 243, 62, 9, - 34, 251, 118, 244, 179, 9, 34, 251, 118, 252, 29, 9, 34, 251, 118, 222, - 196, 9, 34, 220, 105, 213, 246, 9, 34, 220, 105, 213, 33, 9, 34, 251, - 118, 244, 78, 9, 34, 236, 2, 245, 129, 9, 34, 251, 118, 245, 129, 9, 34, - 236, 2, 216, 241, 9, 34, 251, 118, 216, 241, 9, 34, 236, 2, 246, 171, 9, - 34, 251, 118, 246, 171, 9, 34, 216, 63, 9, 34, 236, 2, 216, 63, 9, 34, - 251, 118, 216, 63, 58, 34, 118, 58, 34, 233, 83, 58, 34, 247, 195, 58, - 34, 220, 42, 58, 34, 222, 117, 58, 34, 102, 58, 34, 112, 58, 34, 233, - 107, 58, 34, 232, 63, 58, 34, 233, 155, 58, 34, 245, 209, 58, 34, 198, - 58, 34, 121, 251, 214, 58, 34, 249, 209, 58, 34, 240, 221, 58, 34, 218, - 54, 58, 34, 210, 251, 214, 58, 34, 234, 152, 58, 34, 225, 140, 58, 34, - 213, 193, 58, 34, 219, 194, 58, 34, 47, 210, 251, 214, 58, 34, 242, 24, - 245, 224, 58, 34, 217, 213, 58, 34, 247, 243, 58, 34, 222, 121, 58, 34, - 250, 70, 58, 34, 225, 101, 58, 34, 254, 248, 58, 34, 230, 250, 58, 34, - 245, 224, 58, 34, 246, 44, 58, 34, 222, 141, 58, 34, 243, 14, 58, 34, - 243, 15, 220, 28, 58, 34, 245, 128, 58, 34, 252, 40, 58, 34, 213, 211, - 58, 34, 250, 161, 58, 34, 223, 132, 58, 34, 236, 108, 58, 34, 220, 26, - 58, 34, 233, 218, 58, 34, 249, 218, 58, 34, 219, 188, 58, 34, 230, 255, - 58, 34, 223, 155, 58, 34, 213, 196, 58, 34, 227, 93, 58, 34, 216, 69, 58, - 34, 246, 156, 58, 34, 220, 196, 217, 111, 58, 34, 246, 193, 250, 70, 58, - 34, 187, 219, 62, 58, 34, 119, 242, 113, 58, 34, 220, 201, 58, 34, 251, - 220, 58, 34, 220, 12, 58, 34, 251, 190, 58, 34, 219, 92, 58, 34, 242, 74, - 58, 34, 242, 130, 58, 34, 247, 198, 58, 34, 242, 118, 58, 34, 251, 206, - 58, 34, 224, 74, 58, 34, 222, 129, 58, 34, 248, 16, 58, 34, 253, 211, 58, - 34, 219, 185, 58, 34, 228, 205, 58, 34, 218, 252, 58, 34, 222, 152, 58, - 34, 231, 12, 58, 34, 216, 206, 58, 34, 233, 243, 58, 34, 219, 83, 58, 34, - 248, 160, 58, 34, 214, 8, 58, 34, 247, 221, 228, 205, 58, 34, 250, 20, - 58, 34, 244, 58, 58, 34, 250, 81, 58, 34, 219, 96, 58, 34, 214, 27, 58, - 34, 244, 185, 58, 34, 250, 78, 58, 34, 244, 250, 58, 34, 52, 213, 169, - 58, 34, 157, 216, 207, 216, 159, 58, 34, 220, 36, 58, 34, 245, 4, 58, 34, - 249, 207, 58, 34, 247, 211, 58, 34, 225, 98, 58, 34, 235, 252, 58, 34, - 231, 201, 58, 34, 217, 55, 58, 34, 218, 204, 58, 34, 233, 101, 58, 34, - 215, 109, 58, 34, 244, 209, 58, 34, 251, 247, 68, 250, 54, 58, 34, 220, - 133, 58, 34, 246, 193, 217, 208, 58, 34, 213, 241, 58, 34, 220, 50, 58, - 34, 248, 4, 58, 34, 245, 104, 58, 34, 219, 212, 58, 34, 71, 58, 34, 219, - 85, 58, 34, 219, 199, 58, 34, 216, 225, 58, 34, 242, 243, 58, 34, 251, - 18, 58, 34, 219, 113, 58, 34, 252, 200, 58, 34, 223, 218, 58, 34, 220, - 112, 58, 34, 235, 246, 58, 34, 229, 238, 58, 34, 221, 2, 58, 34, 244, - 238, 58, 34, 227, 112, 58, 34, 254, 154, 58, 34, 225, 198, 58, 34, 246, - 48, 58, 34, 251, 185, 58, 34, 231, 221, 58, 34, 231, 66, 58, 34, 221, 99, - 58, 34, 254, 38, 58, 34, 231, 7, 58, 34, 216, 245, 58, 34, 227, 69, 58, - 34, 251, 249, 58, 34, 219, 81, 58, 34, 250, 29, 58, 34, 242, 236, 58, 34, - 217, 73, 58, 34, 236, 75, 58, 34, 252, 3, 58, 34, 214, 45, 245, 224, 58, - 34, 250, 53, 58, 34, 213, 252, 58, 34, 222, 112, 58, 34, 241, 97, 58, 34, - 219, 209, 58, 34, 215, 4, 58, 34, 252, 118, 58, 34, 225, 241, 58, 34, - 252, 219, 58, 34, 220, 253, 58, 34, 224, 37, 58, 34, 223, 63, 58, 34, - 244, 121, 58, 34, 251, 248, 58, 34, 251, 28, 58, 34, 252, 18, 58, 34, - 231, 9, 58, 34, 214, 44, 58, 34, 250, 87, 58, 34, 213, 224, 58, 34, 247, - 253, 58, 34, 214, 146, 58, 34, 243, 6, 58, 34, 233, 8, 58, 34, 243, 184, - 58, 34, 231, 2, 58, 34, 220, 41, 58, 34, 220, 196, 218, 39, 252, 29, 58, - 34, 224, 85, 58, 34, 251, 255, 58, 34, 213, 188, 58, 34, 245, 23, 58, 34, - 233, 174, 58, 34, 218, 20, 233, 174, 58, 34, 233, 170, 58, 34, 219, 236, - 58, 34, 233, 175, 58, 34, 213, 227, 58, 34, 244, 135, 58, 34, 246, 38, - 58, 34, 242, 82, 58, 34, 244, 90, 58, 34, 241, 94, 58, 34, 251, 244, 58, - 34, 218, 27, 58, 34, 242, 136, 58, 34, 244, 202, 58, 34, 222, 222, 213, - 224, 58, 34, 251, 20, 58, 34, 243, 62, 58, 34, 244, 179, 58, 34, 252, 29, - 58, 34, 222, 196, 58, 34, 248, 146, 58, 34, 213, 246, 58, 34, 242, 57, - 58, 34, 213, 33, 58, 34, 231, 75, 58, 34, 252, 13, 58, 34, 245, 234, 58, - 34, 244, 78, 58, 34, 216, 180, 58, 34, 246, 158, 58, 34, 224, 68, 58, 34, - 228, 207, 58, 34, 245, 129, 58, 34, 216, 241, 58, 34, 246, 171, 58, 34, - 216, 63, 58, 34, 244, 137, 107, 248, 109, 143, 43, 217, 10, 223, 182, - 107, 248, 109, 143, 74, 217, 10, 55, 107, 248, 109, 143, 43, 217, 10, - 231, 107, 22, 223, 182, 107, 248, 109, 143, 74, 217, 10, 231, 107, 22, - 55, 107, 248, 109, 143, 244, 64, 218, 224, 107, 248, 109, 143, 218, 225, - 244, 77, 50, 107, 248, 109, 143, 218, 225, 244, 77, 55, 107, 248, 109, - 143, 218, 225, 244, 77, 233, 168, 107, 248, 109, 143, 218, 225, 244, 77, - 215, 137, 233, 168, 107, 248, 109, 143, 218, 225, 244, 77, 215, 137, 223, - 182, 107, 248, 109, 143, 218, 225, 244, 77, 232, 237, 233, 168, 107, 248, - 109, 143, 227, 28, 107, 219, 225, 107, 250, 23, 107, 244, 64, 219, 83, - 247, 250, 79, 235, 247, 236, 94, 219, 112, 88, 107, 236, 17, 79, 107, - 250, 56, 79, 107, 51, 212, 79, 43, 254, 146, 125, 47, 254, 146, 125, 43, - 52, 254, 146, 125, 47, 52, 254, 146, 125, 43, 249, 223, 125, 47, 249, - 223, 125, 43, 69, 249, 223, 125, 47, 69, 249, 223, 125, 43, 85, 233, 142, - 125, 47, 85, 233, 142, 125, 225, 153, 79, 243, 128, 79, 43, 216, 232, - 220, 254, 125, 47, 216, 232, 220, 254, 125, 43, 69, 233, 142, 125, 47, - 69, 233, 142, 125, 43, 69, 216, 232, 220, 254, 125, 47, 69, 216, 232, - 220, 254, 125, 43, 69, 42, 125, 47, 69, 42, 125, 214, 23, 248, 223, 223, - 236, 52, 225, 108, 224, 178, 79, 52, 225, 108, 224, 178, 79, 117, 52, - 225, 108, 224, 178, 79, 225, 153, 156, 245, 23, 242, 111, 228, 97, 118, - 242, 111, 228, 97, 112, 242, 111, 228, 97, 170, 242, 111, 228, 97, 167, - 242, 111, 228, 97, 185, 242, 111, 228, 97, 192, 242, 111, 228, 97, 200, - 242, 111, 228, 97, 198, 242, 111, 228, 97, 203, 107, 233, 127, 161, 79, - 107, 223, 159, 161, 79, 107, 248, 116, 161, 79, 107, 245, 208, 161, 79, - 24, 220, 100, 62, 161, 79, 24, 52, 62, 161, 79, 214, 19, 248, 223, 66, - 235, 95, 224, 6, 79, 66, 235, 95, 224, 6, 2, 214, 120, 219, 237, 79, 66, - 235, 95, 224, 6, 156, 215, 137, 242, 129, 66, 235, 95, 224, 6, 2, 214, - 120, 219, 237, 156, 215, 137, 242, 129, 66, 235, 95, 224, 6, 156, 232, - 237, 242, 129, 37, 225, 153, 79, 107, 204, 233, 84, 244, 235, 221, 81, - 88, 242, 111, 228, 97, 217, 213, 242, 111, 228, 97, 216, 45, 242, 111, - 228, 97, 217, 128, 66, 107, 236, 17, 79, 232, 18, 79, 226, 164, 254, 176, - 79, 107, 44, 236, 96, 107, 157, 244, 195, 219, 225, 136, 1, 4, 63, 136, - 1, 63, 136, 1, 4, 75, 136, 1, 75, 136, 1, 4, 72, 136, 1, 72, 136, 1, 4, - 77, 136, 1, 77, 136, 1, 4, 78, 136, 1, 78, 136, 1, 183, 136, 1, 243, 230, - 136, 1, 234, 212, 136, 1, 243, 54, 136, 1, 234, 81, 136, 1, 242, 213, - 136, 1, 235, 44, 136, 1, 243, 158, 136, 1, 234, 148, 136, 1, 243, 14, - 136, 1, 222, 227, 136, 1, 212, 109, 136, 1, 220, 136, 136, 1, 212, 37, - 136, 1, 219, 41, 136, 1, 212, 8, 136, 1, 222, 123, 136, 1, 212, 87, 136, - 1, 220, 5, 136, 1, 212, 16, 136, 1, 218, 66, 136, 1, 249, 30, 136, 1, - 217, 84, 136, 1, 248, 76, 136, 1, 4, 216, 90, 136, 1, 216, 90, 136, 1, - 246, 154, 136, 1, 217, 242, 136, 1, 248, 162, 136, 1, 109, 136, 1, 247, - 220, 136, 1, 207, 136, 1, 229, 128, 136, 1, 228, 135, 136, 1, 229, 254, - 136, 1, 228, 228, 136, 1, 162, 136, 1, 252, 234, 136, 1, 195, 136, 1, - 242, 28, 136, 1, 252, 54, 136, 1, 226, 20, 136, 1, 241, 74, 136, 1, 251, - 179, 136, 1, 225, 71, 136, 1, 242, 85, 136, 1, 252, 121, 136, 1, 226, - 132, 136, 1, 241, 173, 136, 1, 251, 253, 136, 1, 225, 186, 136, 1, 191, - 136, 1, 231, 112, 136, 1, 230, 242, 136, 1, 231, 226, 136, 1, 231, 45, - 136, 1, 4, 189, 136, 1, 189, 136, 1, 4, 212, 204, 136, 1, 212, 204, 136, - 1, 4, 212, 236, 136, 1, 212, 236, 136, 1, 208, 136, 1, 223, 222, 136, 1, - 223, 77, 136, 1, 224, 55, 136, 1, 223, 146, 136, 1, 4, 214, 52, 136, 1, - 214, 52, 136, 1, 213, 238, 136, 1, 214, 9, 136, 1, 213, 217, 136, 1, 206, - 136, 1, 214, 103, 136, 1, 4, 183, 136, 1, 4, 235, 44, 38, 235, 63, 214, - 120, 219, 237, 79, 38, 235, 63, 221, 98, 219, 237, 79, 235, 63, 214, 120, - 219, 237, 79, 235, 63, 221, 98, 219, 237, 79, 136, 236, 17, 79, 136, 214, - 120, 236, 17, 79, 136, 248, 38, 212, 217, 235, 63, 52, 241, 21, 56, 1, 4, - 63, 56, 1, 63, 56, 1, 4, 75, 56, 1, 75, 56, 1, 4, 72, 56, 1, 72, 56, 1, - 4, 77, 56, 1, 77, 56, 1, 4, 78, 56, 1, 78, 56, 1, 183, 56, 1, 243, 230, - 56, 1, 234, 212, 56, 1, 243, 54, 56, 1, 234, 81, 56, 1, 242, 213, 56, 1, - 235, 44, 56, 1, 243, 158, 56, 1, 234, 148, 56, 1, 243, 14, 56, 1, 222, - 227, 56, 1, 212, 109, 56, 1, 220, 136, 56, 1, 212, 37, 56, 1, 219, 41, - 56, 1, 212, 8, 56, 1, 222, 123, 56, 1, 212, 87, 56, 1, 220, 5, 56, 1, - 212, 16, 56, 1, 218, 66, 56, 1, 249, 30, 56, 1, 217, 84, 56, 1, 248, 76, - 56, 1, 4, 216, 90, 56, 1, 216, 90, 56, 1, 246, 154, 56, 1, 217, 242, 56, - 1, 248, 162, 56, 1, 109, 56, 1, 247, 220, 56, 1, 207, 56, 1, 229, 128, - 56, 1, 228, 135, 56, 1, 229, 254, 56, 1, 228, 228, 56, 1, 162, 56, 1, - 252, 234, 56, 1, 195, 56, 1, 242, 28, 56, 1, 252, 54, 56, 1, 226, 20, 56, - 1, 241, 74, 56, 1, 251, 179, 56, 1, 225, 71, 56, 1, 242, 85, 56, 1, 252, - 121, 56, 1, 226, 132, 56, 1, 241, 173, 56, 1, 251, 253, 56, 1, 225, 186, - 56, 1, 191, 56, 1, 231, 112, 56, 1, 230, 242, 56, 1, 231, 226, 56, 1, - 231, 45, 56, 1, 4, 189, 56, 1, 189, 56, 1, 4, 212, 204, 56, 1, 212, 204, - 56, 1, 4, 212, 236, 56, 1, 212, 236, 56, 1, 208, 56, 1, 223, 222, 56, 1, - 223, 77, 56, 1, 224, 55, 56, 1, 223, 146, 56, 1, 4, 214, 52, 56, 1, 214, - 52, 56, 1, 213, 238, 56, 1, 214, 9, 56, 1, 213, 217, 56, 1, 206, 56, 1, - 214, 103, 56, 1, 4, 183, 56, 1, 4, 235, 44, 56, 1, 215, 8, 56, 1, 214, - 159, 56, 1, 214, 237, 56, 1, 214, 123, 56, 231, 107, 247, 195, 235, 63, - 225, 93, 219, 237, 79, 56, 236, 17, 79, 56, 214, 120, 236, 17, 79, 56, - 248, 38, 234, 119, 205, 1, 253, 201, 205, 1, 227, 11, 205, 1, 184, 205, - 1, 245, 95, 205, 1, 249, 125, 205, 1, 218, 113, 205, 1, 206, 205, 1, 155, - 205, 1, 244, 41, 205, 1, 235, 141, 205, 1, 242, 162, 205, 1, 236, 3, 205, - 1, 225, 19, 205, 1, 213, 169, 205, 1, 212, 76, 205, 1, 250, 216, 205, 1, - 221, 49, 205, 1, 152, 205, 1, 212, 152, 205, 1, 251, 121, 205, 1, 196, - 205, 1, 63, 205, 1, 78, 205, 1, 77, 205, 1, 246, 19, 205, 1, 254, 236, - 205, 1, 246, 17, 205, 1, 253, 235, 205, 1, 227, 40, 205, 1, 254, 159, - 205, 1, 245, 229, 205, 1, 254, 151, 205, 1, 245, 217, 205, 1, 245, 176, - 205, 1, 75, 205, 1, 72, 205, 1, 236, 15, 205, 1, 211, 211, 205, 1, 229, - 228, 205, 1, 243, 18, 205, 1, 236, 146, 24, 1, 234, 178, 24, 1, 219, 168, - 24, 1, 234, 171, 24, 1, 229, 121, 24, 1, 229, 119, 24, 1, 229, 118, 24, - 1, 217, 68, 24, 1, 219, 157, 24, 1, 223, 213, 24, 1, 223, 208, 24, 1, - 223, 205, 24, 1, 223, 198, 24, 1, 223, 193, 24, 1, 223, 188, 24, 1, 223, - 199, 24, 1, 223, 211, 24, 1, 231, 100, 24, 1, 226, 7, 24, 1, 219, 165, - 24, 1, 225, 252, 24, 1, 220, 95, 24, 1, 219, 162, 24, 1, 236, 168, 24, 1, - 250, 106, 24, 1, 219, 172, 24, 1, 250, 166, 24, 1, 234, 228, 24, 1, 217, - 139, 24, 1, 226, 43, 24, 1, 242, 21, 24, 1, 63, 24, 1, 255, 20, 24, 1, - 189, 24, 1, 213, 83, 24, 1, 245, 197, 24, 1, 77, 24, 1, 213, 28, 24, 1, - 213, 39, 24, 1, 78, 24, 1, 214, 52, 24, 1, 214, 49, 24, 1, 227, 136, 24, - 1, 212, 236, 24, 1, 72, 24, 1, 213, 255, 24, 1, 214, 9, 24, 1, 213, 238, - 24, 1, 212, 204, 24, 1, 245, 143, 24, 1, 213, 0, 24, 1, 75, 24, 244, 192, - 24, 1, 219, 166, 24, 1, 229, 111, 24, 1, 229, 113, 24, 1, 229, 116, 24, - 1, 223, 206, 24, 1, 223, 187, 24, 1, 223, 195, 24, 1, 223, 200, 24, 1, - 223, 185, 24, 1, 231, 93, 24, 1, 231, 90, 24, 1, 231, 94, 24, 1, 235, 83, - 24, 1, 226, 2, 24, 1, 225, 244, 24, 1, 225, 250, 24, 1, 225, 247, 24, 1, - 226, 5, 24, 1, 225, 245, 24, 1, 235, 81, 24, 1, 235, 79, 24, 1, 220, 88, - 24, 1, 220, 86, 24, 1, 220, 78, 24, 1, 220, 83, 24, 1, 220, 93, 24, 1, - 226, 197, 24, 1, 219, 169, 24, 1, 213, 18, 24, 1, 213, 14, 24, 1, 213, - 15, 24, 1, 235, 82, 24, 1, 219, 170, 24, 1, 213, 24, 24, 1, 212, 230, 24, - 1, 212, 229, 24, 1, 212, 232, 24, 1, 212, 195, 24, 1, 212, 196, 24, 1, - 212, 199, 24, 1, 254, 75, 24, 1, 254, 69, 107, 254, 137, 233, 73, 79, - 107, 254, 137, 223, 237, 79, 107, 254, 137, 124, 79, 107, 254, 137, 119, - 79, 107, 254, 137, 137, 79, 107, 254, 137, 244, 101, 79, 107, 254, 137, - 216, 240, 79, 107, 254, 137, 231, 107, 79, 107, 254, 137, 251, 226, 79, - 107, 254, 137, 244, 181, 79, 107, 254, 137, 222, 118, 79, 107, 254, 137, - 217, 135, 79, 107, 254, 137, 244, 94, 79, 107, 254, 137, 242, 71, 79, - 107, 254, 137, 246, 45, 79, 107, 254, 137, 232, 64, 79, 205, 1, 251, 179, - 205, 1, 212, 37, 205, 1, 235, 225, 205, 1, 242, 213, 205, 1, 246, 30, - 205, 1, 245, 214, 205, 1, 227, 86, 205, 1, 227, 90, 205, 1, 236, 38, 205, - 1, 254, 139, 205, 1, 236, 82, 205, 1, 215, 145, 205, 1, 236, 128, 205, 1, - 229, 207, 205, 1, 254, 230, 205, 1, 253, 230, 205, 1, 254, 172, 205, 1, - 227, 107, 205, 1, 227, 92, 205, 1, 236, 79, 205, 41, 1, 227, 11, 205, 41, - 1, 218, 113, 205, 41, 1, 235, 141, 205, 41, 1, 242, 162, 205, 1, 243, 90, - 205, 1, 233, 124, 205, 1, 211, 249, 9, 219, 59, 218, 113, 9, 219, 59, - 213, 248, 9, 219, 59, 213, 149, 9, 219, 59, 251, 133, 9, 219, 59, 218, - 213, 9, 219, 59, 241, 11, 9, 219, 59, 241, 15, 9, 219, 59, 241, 80, 9, - 219, 59, 241, 12, 9, 219, 59, 218, 116, 9, 219, 59, 241, 14, 9, 219, 59, - 241, 10, 9, 219, 59, 241, 78, 9, 219, 59, 241, 13, 9, 219, 59, 241, 9, 9, - 219, 59, 206, 9, 219, 59, 242, 162, 9, 219, 59, 196, 9, 219, 59, 227, 11, - 9, 219, 59, 219, 227, 9, 219, 59, 249, 125, 9, 219, 59, 241, 16, 9, 219, - 59, 242, 38, 9, 219, 59, 218, 125, 9, 219, 59, 218, 192, 9, 219, 59, 219, - 121, 9, 219, 59, 221, 54, 9, 219, 59, 226, 134, 9, 219, 59, 225, 21, 9, - 219, 59, 217, 11, 9, 219, 59, 218, 115, 9, 219, 59, 218, 203, 9, 219, 59, - 241, 23, 9, 219, 59, 241, 8, 9, 219, 59, 226, 61, 9, 219, 59, 225, 19, - 56, 1, 4, 234, 81, 56, 1, 4, 220, 136, 56, 1, 4, 219, 41, 56, 1, 4, 109, - 56, 1, 4, 228, 135, 56, 1, 4, 162, 56, 1, 4, 242, 28, 56, 1, 4, 241, 74, - 56, 1, 4, 242, 85, 56, 1, 4, 241, 173, 56, 1, 4, 230, 242, 56, 1, 4, 208, - 56, 1, 4, 223, 222, 56, 1, 4, 223, 77, 56, 1, 4, 224, 55, 56, 1, 4, 223, - 146, 87, 24, 234, 178, 87, 24, 229, 121, 87, 24, 217, 68, 87, 24, 223, - 213, 87, 24, 231, 100, 87, 24, 226, 7, 87, 24, 220, 95, 87, 24, 236, 168, - 87, 24, 250, 106, 87, 24, 250, 166, 87, 24, 234, 228, 87, 24, 217, 139, - 87, 24, 226, 43, 87, 24, 242, 21, 87, 24, 234, 179, 63, 87, 24, 229, 122, - 63, 87, 24, 217, 69, 63, 87, 24, 223, 214, 63, 87, 24, 231, 101, 63, 87, - 24, 226, 8, 63, 87, 24, 220, 96, 63, 87, 24, 236, 169, 63, 87, 24, 250, - 107, 63, 87, 24, 250, 167, 63, 87, 24, 234, 229, 63, 87, 24, 217, 140, - 63, 87, 24, 226, 44, 63, 87, 24, 242, 22, 63, 87, 24, 250, 107, 72, 87, - 234, 123, 143, 227, 120, 87, 234, 123, 143, 141, 241, 74, 87, 147, 118, - 87, 147, 112, 87, 147, 170, 87, 147, 167, 87, 147, 185, 87, 147, 192, 87, - 147, 200, 87, 147, 198, 87, 147, 203, 87, 147, 217, 213, 87, 147, 231, - 12, 87, 147, 244, 185, 87, 147, 214, 27, 87, 147, 213, 204, 87, 147, 231, - 176, 87, 147, 246, 44, 87, 147, 218, 252, 87, 147, 219, 86, 87, 147, 242, - 91, 87, 147, 220, 1, 87, 147, 230, 92, 87, 147, 219, 211, 87, 147, 244, - 191, 87, 147, 250, 6, 87, 147, 233, 246, 87, 147, 224, 1, 87, 147, 251, - 71, 87, 147, 219, 44, 87, 147, 218, 234, 87, 147, 245, 207, 87, 147, 223, - 249, 87, 147, 254, 186, 87, 147, 244, 217, 87, 147, 223, 247, 87, 147, - 221, 99, 87, 147, 224, 54, 37, 147, 224, 192, 37, 147, 234, 200, 37, 147, - 222, 139, 37, 147, 234, 119, 37, 51, 217, 214, 227, 100, 85, 219, 185, - 37, 51, 216, 46, 227, 100, 85, 219, 185, 37, 51, 217, 129, 227, 100, 85, - 219, 185, 37, 51, 244, 105, 227, 100, 85, 219, 185, 37, 51, 244, 204, - 227, 100, 85, 219, 185, 37, 51, 220, 59, 227, 100, 85, 219, 185, 37, 51, - 221, 61, 227, 100, 85, 219, 185, 37, 51, 246, 7, 227, 100, 85, 219, 185, - 226, 160, 53, 37, 51, 216, 46, 118, 37, 51, 216, 46, 112, 37, 51, 216, - 46, 170, 37, 51, 216, 46, 167, 37, 51, 216, 46, 185, 37, 51, 216, 46, - 192, 37, 51, 216, 46, 200, 37, 51, 216, 46, 198, 37, 51, 216, 46, 203, - 37, 51, 217, 128, 37, 51, 217, 129, 118, 37, 51, 217, 129, 112, 37, 51, - 217, 129, 170, 37, 51, 217, 129, 167, 37, 51, 217, 129, 185, 37, 24, 234, - 178, 37, 24, 229, 121, 37, 24, 217, 68, 37, 24, 223, 213, 37, 24, 231, - 100, 37, 24, 226, 7, 37, 24, 220, 95, 37, 24, 236, 168, 37, 24, 250, 106, - 37, 24, 250, 166, 37, 24, 234, 228, 37, 24, 217, 139, 37, 24, 226, 43, - 37, 24, 242, 21, 37, 24, 234, 179, 63, 37, 24, 229, 122, 63, 37, 24, 217, - 69, 63, 37, 24, 223, 214, 63, 37, 24, 231, 101, 63, 37, 24, 226, 8, 63, - 37, 24, 220, 96, 63, 37, 24, 236, 169, 63, 37, 24, 250, 107, 63, 37, 24, - 250, 167, 63, 37, 24, 234, 229, 63, 37, 24, 217, 140, 63, 37, 24, 226, - 44, 63, 37, 24, 242, 22, 63, 37, 234, 123, 143, 250, 207, 37, 234, 123, - 143, 235, 164, 37, 24, 236, 169, 72, 234, 123, 219, 112, 88, 37, 147, - 118, 37, 147, 112, 37, 147, 170, 37, 147, 167, 37, 147, 185, 37, 147, - 192, 37, 147, 200, 37, 147, 198, 37, 147, 203, 37, 147, 217, 213, 37, - 147, 231, 12, 37, 147, 244, 185, 37, 147, 214, 27, 37, 147, 213, 204, 37, - 147, 231, 176, 37, 147, 246, 44, 37, 147, 218, 252, 37, 147, 219, 86, 37, - 147, 242, 91, 37, 147, 220, 1, 37, 147, 230, 92, 37, 147, 219, 211, 37, - 147, 244, 191, 37, 147, 250, 6, 37, 147, 233, 246, 37, 147, 222, 116, 37, - 147, 232, 67, 37, 147, 244, 226, 37, 147, 219, 8, 37, 147, 245, 122, 37, - 147, 225, 104, 37, 147, 253, 239, 37, 147, 236, 18, 37, 147, 223, 247, - 37, 147, 249, 226, 37, 147, 249, 217, 37, 147, 242, 14, 37, 147, 250, - 231, 37, 147, 232, 239, 37, 147, 233, 168, 37, 147, 223, 182, 37, 147, - 231, 218, 37, 147, 224, 15, 37, 147, 219, 44, 37, 147, 218, 234, 37, 147, - 245, 207, 37, 147, 223, 249, 37, 147, 254, 186, 37, 147, 229, 107, 37, - 51, 217, 129, 192, 37, 51, 217, 129, 200, 37, 51, 217, 129, 198, 37, 51, - 217, 129, 203, 37, 51, 244, 104, 37, 51, 244, 105, 118, 37, 51, 244, 105, - 112, 37, 51, 244, 105, 170, 37, 51, 244, 105, 167, 37, 51, 244, 105, 185, - 37, 51, 244, 105, 192, 37, 51, 244, 105, 200, 37, 51, 244, 105, 198, 37, - 51, 244, 105, 203, 37, 51, 244, 203, 107, 204, 16, 31, 235, 249, 107, - 204, 16, 31, 244, 237, 107, 204, 16, 31, 232, 38, 107, 204, 16, 31, 254, - 88, 107, 204, 16, 31, 232, 10, 107, 204, 16, 31, 235, 162, 107, 204, 16, - 31, 235, 163, 107, 204, 16, 31, 253, 231, 107, 204, 16, 31, 221, 79, 107, - 204, 16, 31, 227, 141, 107, 204, 16, 31, 228, 194, 107, 204, 16, 31, 248, - 157, 42, 242, 38, 42, 245, 172, 42, 245, 131, 233, 89, 233, 110, 53, 37, - 56, 63, 37, 56, 75, 37, 56, 72, 37, 56, 77, 37, 56, 78, 37, 56, 183, 37, - 56, 234, 212, 37, 56, 234, 81, 37, 56, 235, 44, 37, 56, 234, 148, 37, 56, - 222, 227, 37, 56, 220, 136, 37, 56, 219, 41, 37, 56, 222, 123, 37, 56, - 220, 5, 37, 56, 218, 66, 37, 56, 217, 84, 37, 56, 216, 90, 37, 56, 217, - 242, 37, 56, 109, 37, 56, 207, 37, 56, 229, 128, 37, 56, 228, 135, 37, - 56, 229, 254, 37, 56, 228, 228, 37, 56, 162, 37, 56, 242, 28, 37, 56, - 241, 74, 37, 56, 242, 85, 37, 56, 241, 173, 37, 56, 191, 37, 56, 231, - 112, 37, 56, 230, 242, 37, 56, 231, 226, 37, 56, 231, 45, 37, 56, 189, - 37, 56, 212, 204, 37, 56, 212, 236, 37, 56, 208, 37, 56, 223, 222, 37, - 56, 223, 77, 37, 56, 224, 55, 37, 56, 223, 146, 37, 56, 214, 52, 37, 56, - 213, 238, 37, 56, 214, 9, 37, 56, 213, 217, 42, 254, 109, 42, 254, 25, - 42, 254, 133, 42, 255, 62, 42, 236, 84, 42, 236, 54, 42, 215, 143, 42, - 245, 152, 42, 246, 28, 42, 227, 89, 42, 227, 83, 42, 235, 107, 42, 235, - 76, 42, 235, 73, 42, 243, 188, 42, 243, 197, 42, 243, 44, 42, 243, 40, - 42, 234, 14, 42, 243, 33, 42, 234, 192, 42, 234, 191, 42, 234, 190, 42, - 234, 189, 42, 242, 188, 42, 242, 187, 42, 234, 57, 42, 234, 59, 42, 235, - 40, 42, 234, 121, 42, 234, 128, 42, 222, 211, 42, 222, 177, 42, 220, 76, - 42, 221, 84, 42, 221, 83, 42, 249, 27, 42, 248, 108, 42, 247, 196, 42, - 217, 0, 42, 230, 88, 42, 228, 195, 42, 242, 134, 42, 226, 246, 42, 226, - 245, 42, 252, 232, 42, 226, 17, 42, 225, 237, 42, 225, 238, 42, 252, 26, - 42, 241, 73, 42, 241, 69, 42, 251, 145, 42, 241, 56, 42, 242, 62, 42, - 226, 71, 42, 226, 105, 42, 242, 46, 42, 226, 102, 42, 226, 118, 42, 252, - 107, 42, 225, 176, 42, 251, 231, 42, 241, 161, 42, 225, 166, 42, 241, - 153, 42, 241, 155, 42, 232, 79, 42, 232, 75, 42, 232, 84, 42, 232, 28, - 42, 232, 53, 42, 231, 80, 42, 231, 59, 42, 231, 58, 42, 231, 208, 42, - 231, 205, 42, 231, 209, 42, 213, 93, 42, 213, 91, 42, 212, 193, 42, 223, - 157, 42, 223, 161, 42, 223, 54, 42, 223, 48, 42, 224, 13, 42, 224, 10, - 42, 214, 25, 107, 204, 16, 31, 241, 88, 212, 79, 107, 204, 16, 31, 241, - 88, 118, 107, 204, 16, 31, 241, 88, 112, 107, 204, 16, 31, 241, 88, 170, - 107, 204, 16, 31, 241, 88, 167, 107, 204, 16, 31, 241, 88, 185, 107, 204, - 16, 31, 241, 88, 192, 107, 204, 16, 31, 241, 88, 200, 107, 204, 16, 31, - 241, 88, 198, 107, 204, 16, 31, 241, 88, 203, 107, 204, 16, 31, 241, 88, - 217, 213, 107, 204, 16, 31, 241, 88, 245, 245, 107, 204, 16, 31, 241, 88, - 216, 48, 107, 204, 16, 31, 241, 88, 217, 130, 107, 204, 16, 31, 241, 88, - 244, 95, 107, 204, 16, 31, 241, 88, 244, 207, 107, 204, 16, 31, 241, 88, - 220, 66, 107, 204, 16, 31, 241, 88, 221, 63, 107, 204, 16, 31, 241, 88, - 246, 12, 107, 204, 16, 31, 241, 88, 229, 92, 107, 204, 16, 31, 241, 88, - 216, 45, 107, 204, 16, 31, 241, 88, 216, 39, 107, 204, 16, 31, 241, 88, - 216, 35, 107, 204, 16, 31, 241, 88, 216, 36, 107, 204, 16, 31, 241, 88, - 216, 41, 42, 241, 79, 42, 249, 30, 42, 253, 235, 42, 134, 42, 227, 31, - 42, 226, 135, 42, 247, 222, 42, 247, 223, 219, 184, 42, 247, 223, 249, - 172, 42, 236, 15, 42, 245, 175, 230, 93, 242, 63, 42, 245, 175, 230, 93, - 218, 134, 42, 245, 175, 230, 93, 218, 37, 42, 245, 175, 230, 93, 231, - 204, 42, 249, 219, 42, 226, 252, 254, 161, 42, 207, 42, 230, 243, 63, 42, - 191, 42, 183, 42, 235, 47, 42, 232, 6, 42, 243, 176, 42, 251, 74, 42, - 235, 46, 42, 226, 62, 42, 229, 230, 42, 230, 243, 245, 95, 42, 230, 243, - 244, 41, 42, 231, 152, 42, 234, 252, 42, 241, 16, 42, 234, 214, 42, 231, - 114, 42, 243, 56, 42, 217, 86, 42, 230, 243, 155, 42, 231, 52, 42, 247, - 230, 42, 234, 160, 42, 244, 134, 42, 229, 8, 42, 230, 243, 184, 42, 231, - 49, 42, 250, 43, 42, 234, 154, 42, 231, 50, 219, 184, 42, 250, 44, 219, - 184, 42, 232, 183, 219, 184, 42, 234, 155, 219, 184, 42, 231, 50, 249, - 172, 42, 250, 44, 249, 172, 42, 232, 183, 249, 172, 42, 234, 155, 249, - 172, 42, 232, 183, 113, 196, 42, 232, 183, 113, 223, 29, 219, 184, 42, - 195, 42, 234, 115, 42, 230, 245, 42, 242, 247, 42, 224, 101, 42, 224, - 102, 113, 196, 42, 224, 102, 113, 223, 29, 219, 184, 42, 225, 83, 42, - 228, 167, 42, 230, 243, 196, 42, 230, 244, 42, 225, 39, 42, 228, 75, 42, - 230, 243, 211, 211, 42, 230, 189, 42, 234, 49, 42, 230, 190, 231, 208, - 42, 225, 38, 42, 228, 74, 42, 230, 243, 214, 85, 42, 230, 184, 42, 234, - 47, 42, 230, 185, 231, 208, 42, 235, 142, 227, 123, 42, 232, 183, 227, - 123, 42, 254, 172, 42, 251, 212, 42, 251, 14, 42, 250, 248, 42, 251, 122, - 113, 234, 252, 42, 250, 42, 42, 248, 209, 42, 242, 174, 42, 162, 42, 241, - 80, 42, 236, 112, 42, 234, 167, 42, 234, 155, 251, 50, 42, 234, 83, 42, - 233, 29, 42, 233, 28, 42, 233, 18, 42, 232, 195, 42, 232, 7, 220, 26, 42, - 231, 79, 42, 231, 36, 42, 226, 60, 42, 225, 189, 42, 225, 135, 42, 225, - 133, 42, 219, 178, 42, 218, 217, 42, 214, 11, 42, 215, 86, 113, 184, 42, - 111, 113, 184, 107, 204, 16, 31, 248, 213, 118, 107, 204, 16, 31, 248, - 213, 112, 107, 204, 16, 31, 248, 213, 170, 107, 204, 16, 31, 248, 213, - 167, 107, 204, 16, 31, 248, 213, 185, 107, 204, 16, 31, 248, 213, 192, - 107, 204, 16, 31, 248, 213, 200, 107, 204, 16, 31, 248, 213, 198, 107, - 204, 16, 31, 248, 213, 203, 107, 204, 16, 31, 248, 213, 217, 213, 107, - 204, 16, 31, 248, 213, 245, 245, 107, 204, 16, 31, 248, 213, 216, 48, - 107, 204, 16, 31, 248, 213, 217, 130, 107, 204, 16, 31, 248, 213, 244, - 95, 107, 204, 16, 31, 248, 213, 244, 207, 107, 204, 16, 31, 248, 213, - 220, 66, 107, 204, 16, 31, 248, 213, 221, 63, 107, 204, 16, 31, 248, 213, - 246, 12, 107, 204, 16, 31, 248, 213, 229, 92, 107, 204, 16, 31, 248, 213, - 216, 45, 107, 204, 16, 31, 248, 213, 216, 39, 107, 204, 16, 31, 248, 213, - 216, 35, 107, 204, 16, 31, 248, 213, 216, 36, 107, 204, 16, 31, 248, 213, - 216, 41, 107, 204, 16, 31, 248, 213, 216, 42, 107, 204, 16, 31, 248, 213, - 216, 37, 107, 204, 16, 31, 248, 213, 216, 38, 107, 204, 16, 31, 248, 213, - 216, 44, 107, 204, 16, 31, 248, 213, 216, 40, 107, 204, 16, 31, 248, 213, - 217, 128, 107, 204, 16, 31, 248, 213, 217, 127, 42, 243, 214, 242, 40, - 31, 217, 162, 249, 203, 242, 70, 242, 40, 31, 217, 162, 224, 49, 246, 44, - 242, 40, 31, 248, 48, 253, 250, 217, 162, 252, 102, 242, 40, 31, 212, - 215, 244, 127, 242, 40, 31, 214, 46, 242, 40, 31, 250, 8, 242, 40, 31, - 217, 162, 254, 45, 242, 40, 31, 241, 165, 217, 6, 242, 40, 31, 4, 218, - 25, 242, 40, 31, 216, 208, 242, 40, 31, 226, 130, 242, 40, 31, 219, 111, - 242, 40, 31, 244, 228, 242, 40, 31, 242, 230, 225, 156, 242, 40, 31, 231, - 39, 242, 40, 31, 245, 206, 242, 40, 31, 244, 128, 242, 40, 31, 213, 197, - 227, 100, 217, 162, 248, 158, 242, 40, 31, 254, 92, 242, 40, 31, 249, - 247, 242, 40, 31, 252, 19, 217, 105, 242, 40, 31, 242, 245, 242, 40, 31, - 219, 196, 254, 108, 242, 40, 31, 223, 239, 242, 40, 31, 236, 78, 242, 40, - 31, 242, 230, 218, 25, 242, 40, 31, 230, 251, 249, 221, 242, 40, 31, 242, - 230, 225, 113, 242, 40, 31, 217, 162, 255, 50, 214, 27, 242, 40, 31, 217, - 162, 250, 68, 244, 185, 242, 40, 31, 236, 91, 242, 40, 31, 246, 133, 242, - 40, 31, 223, 242, 242, 40, 31, 242, 230, 225, 140, 242, 40, 31, 225, 97, - 242, 40, 31, 248, 228, 68, 217, 162, 233, 100, 242, 40, 31, 217, 162, - 245, 7, 242, 40, 31, 227, 67, 242, 40, 31, 227, 145, 242, 40, 31, 248, - 131, 242, 40, 31, 248, 151, 242, 40, 31, 236, 104, 242, 40, 31, 251, 202, - 242, 40, 31, 250, 25, 217, 10, 231, 211, 242, 40, 31, 243, 183, 217, 6, - 242, 40, 31, 225, 48, 215, 131, 242, 40, 31, 227, 66, 242, 40, 31, 217, - 162, 214, 1, 242, 40, 31, 223, 232, 242, 40, 31, 217, 162, 251, 20, 242, - 40, 31, 217, 162, 254, 41, 217, 100, 242, 40, 31, 217, 162, 235, 41, 219, - 88, 230, 255, 242, 40, 31, 248, 104, 242, 40, 31, 217, 162, 232, 30, 232, - 80, 242, 40, 31, 255, 51, 242, 40, 31, 217, 162, 214, 41, 242, 40, 31, - 217, 162, 243, 143, 213, 227, 242, 40, 31, 217, 162, 235, 169, 233, 229, - 242, 40, 31, 248, 1, 242, 40, 31, 233, 90, 242, 40, 31, 236, 81, 216, - 158, 242, 40, 31, 4, 225, 113, 242, 40, 31, 254, 250, 250, 17, 242, 40, - 31, 252, 105, 250, 17, 8, 3, 236, 19, 8, 3, 236, 12, 8, 3, 75, 8, 3, 236, - 41, 8, 3, 236, 170, 8, 3, 236, 153, 8, 3, 236, 172, 8, 3, 236, 171, 8, 3, - 253, 249, 8, 3, 253, 212, 8, 3, 63, 8, 3, 254, 110, 8, 3, 215, 141, 8, 3, - 215, 144, 8, 3, 215, 142, 8, 3, 227, 46, 8, 3, 227, 20, 8, 3, 78, 8, 3, - 227, 78, 8, 3, 245, 123, 8, 3, 77, 8, 3, 213, 186, 8, 3, 252, 20, 8, 3, - 252, 17, 8, 3, 252, 54, 8, 3, 252, 30, 8, 3, 252, 43, 8, 3, 252, 42, 8, - 3, 252, 45, 8, 3, 252, 44, 8, 3, 252, 167, 8, 3, 252, 159, 8, 3, 252, - 234, 8, 3, 252, 188, 8, 3, 251, 155, 8, 3, 251, 159, 8, 3, 251, 156, 8, - 3, 251, 230, 8, 3, 251, 214, 8, 3, 251, 253, 8, 3, 251, 235, 8, 3, 252, - 68, 8, 3, 252, 121, 8, 3, 252, 80, 8, 3, 251, 141, 8, 3, 251, 138, 8, 3, - 251, 179, 8, 3, 251, 154, 8, 3, 251, 148, 8, 3, 251, 152, 8, 3, 251, 126, - 8, 3, 251, 125, 8, 3, 251, 131, 8, 3, 251, 129, 8, 3, 251, 127, 8, 3, - 251, 128, 8, 3, 225, 217, 8, 3, 225, 213, 8, 3, 226, 20, 8, 3, 225, 227, - 8, 3, 225, 243, 8, 3, 226, 14, 8, 3, 226, 10, 8, 3, 226, 150, 8, 3, 226, - 140, 8, 3, 195, 8, 3, 226, 186, 8, 3, 225, 57, 8, 3, 225, 59, 8, 3, 225, - 58, 8, 3, 225, 149, 8, 3, 225, 138, 8, 3, 225, 186, 8, 3, 225, 161, 8, 3, - 225, 44, 8, 3, 225, 40, 8, 3, 225, 71, 8, 3, 225, 56, 8, 3, 225, 49, 8, - 3, 225, 54, 8, 3, 225, 23, 8, 3, 225, 22, 8, 3, 225, 27, 8, 3, 225, 26, - 8, 3, 225, 24, 8, 3, 225, 25, 8, 3, 252, 142, 8, 3, 252, 141, 8, 3, 252, - 148, 8, 3, 252, 143, 8, 3, 252, 145, 8, 3, 252, 144, 8, 3, 252, 147, 8, - 3, 252, 146, 8, 3, 252, 154, 8, 3, 252, 153, 8, 3, 252, 157, 8, 3, 252, - 155, 8, 3, 252, 133, 8, 3, 252, 135, 8, 3, 252, 134, 8, 3, 252, 138, 8, - 3, 252, 137, 8, 3, 252, 140, 8, 3, 252, 139, 8, 3, 252, 149, 8, 3, 252, - 152, 8, 3, 252, 150, 8, 3, 252, 129, 8, 3, 252, 128, 8, 3, 252, 136, 8, - 3, 252, 132, 8, 3, 252, 130, 8, 3, 252, 131, 8, 3, 252, 125, 8, 3, 252, - 124, 8, 3, 252, 127, 8, 3, 252, 126, 8, 3, 230, 59, 8, 3, 230, 58, 8, 3, - 230, 64, 8, 3, 230, 60, 8, 3, 230, 61, 8, 3, 230, 63, 8, 3, 230, 62, 8, - 3, 230, 66, 8, 3, 230, 65, 8, 3, 230, 68, 8, 3, 230, 67, 8, 3, 230, 55, - 8, 3, 230, 54, 8, 3, 230, 57, 8, 3, 230, 56, 8, 3, 230, 49, 8, 3, 230, - 48, 8, 3, 230, 53, 8, 3, 230, 52, 8, 3, 230, 50, 8, 3, 230, 51, 8, 3, - 230, 43, 8, 3, 230, 42, 8, 3, 230, 47, 8, 3, 230, 46, 8, 3, 230, 44, 8, - 3, 230, 45, 8, 3, 241, 215, 8, 3, 241, 214, 8, 3, 241, 220, 8, 3, 241, - 216, 8, 3, 241, 217, 8, 3, 241, 219, 8, 3, 241, 218, 8, 3, 241, 223, 8, - 3, 241, 222, 8, 3, 241, 225, 8, 3, 241, 224, 8, 3, 241, 206, 8, 3, 241, - 208, 8, 3, 241, 207, 8, 3, 241, 211, 8, 3, 241, 210, 8, 3, 241, 213, 8, - 3, 241, 212, 8, 3, 241, 202, 8, 3, 241, 201, 8, 3, 241, 209, 8, 3, 241, - 205, 8, 3, 241, 203, 8, 3, 241, 204, 8, 3, 241, 196, 8, 3, 241, 200, 8, - 3, 241, 199, 8, 3, 241, 197, 8, 3, 241, 198, 8, 3, 231, 55, 8, 3, 231, - 54, 8, 3, 231, 112, 8, 3, 231, 61, 8, 3, 231, 86, 8, 3, 231, 104, 8, 3, - 231, 102, 8, 3, 232, 17, 8, 3, 232, 12, 8, 3, 191, 8, 3, 232, 50, 8, 3, - 230, 214, 8, 3, 230, 213, 8, 3, 230, 217, 8, 3, 230, 215, 8, 3, 231, 5, - 8, 3, 230, 247, 8, 3, 231, 45, 8, 3, 231, 10, 8, 3, 231, 163, 8, 3, 231, - 226, 8, 3, 230, 195, 8, 3, 230, 191, 8, 3, 230, 242, 8, 3, 230, 210, 8, - 3, 230, 203, 8, 3, 230, 208, 8, 3, 230, 169, 8, 3, 230, 168, 8, 3, 230, - 174, 8, 3, 230, 171, 8, 3, 244, 172, 8, 3, 244, 167, 8, 3, 244, 210, 8, - 3, 244, 187, 8, 3, 245, 0, 8, 3, 244, 247, 8, 3, 245, 29, 8, 3, 245, 3, - 8, 3, 244, 93, 8, 3, 244, 132, 8, 3, 244, 116, 8, 3, 244, 54, 8, 3, 244, - 53, 8, 3, 244, 69, 8, 3, 244, 59, 8, 3, 244, 57, 8, 3, 244, 58, 8, 3, - 244, 44, 8, 3, 244, 43, 8, 3, 244, 47, 8, 3, 244, 45, 8, 3, 214, 129, 8, - 3, 214, 124, 8, 3, 214, 159, 8, 3, 214, 138, 8, 3, 214, 151, 8, 3, 214, - 148, 8, 3, 214, 153, 8, 3, 214, 152, 8, 3, 214, 245, 8, 3, 214, 240, 8, - 3, 215, 8, 8, 3, 215, 0, 8, 3, 214, 110, 8, 3, 214, 106, 8, 3, 214, 123, - 8, 3, 214, 111, 8, 3, 214, 160, 8, 3, 214, 226, 8, 3, 214, 97, 8, 3, 214, - 95, 8, 3, 214, 103, 8, 3, 214, 100, 8, 3, 214, 98, 8, 3, 214, 99, 8, 3, - 214, 89, 8, 3, 214, 88, 8, 3, 214, 93, 8, 3, 214, 92, 8, 3, 214, 90, 8, - 3, 214, 91, 8, 3, 247, 251, 8, 3, 247, 239, 8, 3, 248, 76, 8, 3, 248, 20, - 8, 3, 248, 53, 8, 3, 248, 57, 8, 3, 248, 56, 8, 3, 248, 219, 8, 3, 248, - 214, 8, 3, 249, 30, 8, 3, 248, 239, 8, 3, 246, 138, 8, 3, 246, 139, 8, 3, - 247, 195, 8, 3, 246, 177, 8, 3, 247, 220, 8, 3, 247, 197, 8, 3, 248, 102, - 8, 3, 248, 162, 8, 3, 248, 117, 8, 3, 246, 129, 8, 3, 246, 127, 8, 3, - 246, 154, 8, 3, 246, 137, 8, 3, 246, 132, 8, 3, 246, 135, 8, 3, 217, 34, - 8, 3, 217, 28, 8, 3, 217, 84, 8, 3, 217, 43, 8, 3, 217, 76, 8, 3, 217, - 78, 8, 3, 217, 77, 8, 3, 218, 10, 8, 3, 217, 253, 8, 3, 218, 66, 8, 3, - 218, 18, 8, 3, 216, 74, 8, 3, 216, 73, 8, 3, 216, 76, 8, 3, 216, 75, 8, - 3, 216, 231, 8, 3, 216, 227, 8, 3, 109, 8, 3, 216, 239, 8, 3, 217, 179, - 8, 3, 217, 242, 8, 3, 217, 203, 8, 3, 216, 60, 8, 3, 216, 55, 8, 3, 216, - 90, 8, 3, 216, 72, 8, 3, 216, 61, 8, 3, 216, 70, 8, 3, 248, 179, 8, 3, - 248, 178, 8, 3, 248, 184, 8, 3, 248, 180, 8, 3, 248, 181, 8, 3, 248, 183, - 8, 3, 248, 182, 8, 3, 248, 200, 8, 3, 248, 199, 8, 3, 248, 207, 8, 3, - 248, 201, 8, 3, 248, 169, 8, 3, 248, 171, 8, 3, 248, 170, 8, 3, 248, 174, - 8, 3, 248, 173, 8, 3, 248, 177, 8, 3, 248, 175, 8, 3, 248, 192, 8, 3, - 248, 195, 8, 3, 248, 193, 8, 3, 248, 165, 8, 3, 248, 164, 8, 3, 248, 172, - 8, 3, 248, 168, 8, 3, 248, 166, 8, 3, 248, 167, 8, 3, 230, 17, 8, 3, 230, - 16, 8, 3, 230, 24, 8, 3, 230, 19, 8, 3, 230, 20, 8, 3, 230, 21, 8, 3, - 230, 33, 8, 3, 230, 32, 8, 3, 230, 39, 8, 3, 230, 34, 8, 3, 230, 9, 8, 3, - 230, 8, 8, 3, 230, 15, 8, 3, 230, 10, 8, 3, 230, 25, 8, 3, 230, 31, 8, 3, - 230, 29, 8, 3, 230, 1, 8, 3, 230, 0, 8, 3, 230, 6, 8, 3, 230, 4, 8, 3, - 230, 2, 8, 3, 230, 3, 8, 3, 241, 182, 8, 3, 241, 181, 8, 3, 241, 188, 8, - 3, 241, 183, 8, 3, 241, 185, 8, 3, 241, 184, 8, 3, 241, 187, 8, 3, 241, - 186, 8, 3, 241, 193, 8, 3, 241, 192, 8, 3, 241, 195, 8, 3, 241, 194, 8, - 3, 241, 176, 8, 3, 241, 177, 8, 3, 241, 179, 8, 3, 241, 178, 8, 3, 241, - 180, 8, 3, 241, 189, 8, 3, 241, 191, 8, 3, 241, 190, 8, 3, 241, 175, 8, - 3, 229, 84, 8, 3, 229, 82, 8, 3, 229, 128, 8, 3, 229, 87, 8, 3, 229, 110, - 8, 3, 229, 124, 8, 3, 229, 123, 8, 3, 230, 72, 8, 3, 207, 8, 3, 230, 85, - 8, 3, 228, 85, 8, 3, 228, 87, 8, 3, 228, 86, 8, 3, 228, 205, 8, 3, 228, - 192, 8, 3, 228, 228, 8, 3, 228, 214, 8, 3, 229, 232, 8, 3, 229, 254, 8, - 3, 229, 243, 8, 3, 228, 80, 8, 3, 228, 76, 8, 3, 228, 135, 8, 3, 228, 84, - 8, 3, 228, 82, 8, 3, 228, 83, 8, 3, 241, 246, 8, 3, 241, 245, 8, 3, 241, - 251, 8, 3, 241, 247, 8, 3, 241, 248, 8, 3, 241, 250, 8, 3, 241, 249, 8, - 3, 242, 0, 8, 3, 241, 255, 8, 3, 242, 2, 8, 3, 242, 1, 8, 3, 241, 238, 8, - 3, 241, 240, 8, 3, 241, 239, 8, 3, 241, 242, 8, 3, 241, 244, 8, 3, 241, - 243, 8, 3, 241, 252, 8, 3, 241, 254, 8, 3, 241, 253, 8, 3, 241, 234, 8, - 3, 241, 233, 8, 3, 241, 241, 8, 3, 241, 237, 8, 3, 241, 235, 8, 3, 241, - 236, 8, 3, 241, 228, 8, 3, 241, 227, 8, 3, 241, 232, 8, 3, 241, 231, 8, - 3, 241, 229, 8, 3, 241, 230, 8, 3, 233, 65, 8, 3, 233, 59, 8, 3, 233, - 111, 8, 3, 233, 72, 8, 3, 233, 103, 8, 3, 233, 102, 8, 3, 233, 106, 8, 3, - 233, 104, 8, 3, 233, 201, 8, 3, 233, 191, 8, 3, 233, 255, 8, 3, 233, 210, - 8, 3, 232, 211, 8, 3, 232, 210, 8, 3, 232, 213, 8, 3, 232, 212, 8, 3, - 232, 245, 8, 3, 232, 235, 8, 3, 233, 26, 8, 3, 232, 249, 8, 3, 233, 126, - 8, 3, 233, 180, 8, 3, 233, 139, 8, 3, 232, 206, 8, 3, 232, 204, 8, 3, - 232, 230, 8, 3, 232, 209, 8, 3, 232, 207, 8, 3, 232, 208, 8, 3, 232, 187, - 8, 3, 232, 186, 8, 3, 232, 194, 8, 3, 232, 190, 8, 3, 232, 188, 8, 3, - 232, 189, 8, 3, 243, 29, 8, 3, 243, 28, 8, 3, 243, 54, 8, 3, 243, 39, 8, - 3, 243, 46, 8, 3, 243, 45, 8, 3, 243, 48, 8, 3, 243, 47, 8, 3, 243, 185, - 8, 3, 243, 180, 8, 3, 243, 230, 8, 3, 243, 195, 8, 3, 242, 193, 8, 3, - 242, 192, 8, 3, 242, 195, 8, 3, 242, 194, 8, 3, 242, 250, 8, 3, 242, 248, - 8, 3, 243, 14, 8, 3, 243, 2, 8, 3, 243, 129, 8, 3, 243, 127, 8, 3, 243, - 158, 8, 3, 243, 140, 8, 3, 242, 183, 8, 3, 242, 182, 8, 3, 242, 213, 8, - 3, 242, 191, 8, 3, 242, 184, 8, 3, 242, 190, 8, 3, 234, 181, 8, 3, 234, - 180, 8, 3, 234, 212, 8, 3, 234, 195, 8, 3, 234, 205, 8, 3, 234, 208, 8, - 3, 234, 206, 8, 3, 235, 64, 8, 3, 235, 52, 8, 3, 183, 8, 3, 235, 90, 8, - 3, 234, 64, 8, 3, 234, 69, 8, 3, 234, 66, 8, 3, 234, 120, 8, 3, 234, 116, - 8, 3, 234, 148, 8, 3, 234, 127, 8, 3, 235, 18, 8, 3, 235, 2, 8, 3, 235, - 44, 8, 3, 235, 21, 8, 3, 234, 53, 8, 3, 234, 50, 8, 3, 234, 81, 8, 3, - 234, 63, 8, 3, 234, 56, 8, 3, 234, 60, 8, 3, 243, 111, 8, 3, 243, 110, 8, - 3, 243, 115, 8, 3, 243, 112, 8, 3, 243, 114, 8, 3, 243, 113, 8, 3, 243, - 122, 8, 3, 243, 121, 8, 3, 243, 125, 8, 3, 243, 123, 8, 3, 243, 102, 8, - 3, 243, 101, 8, 3, 243, 104, 8, 3, 243, 103, 8, 3, 243, 107, 8, 3, 243, - 106, 8, 3, 243, 109, 8, 3, 243, 108, 8, 3, 243, 117, 8, 3, 243, 116, 8, - 3, 243, 120, 8, 3, 243, 118, 8, 3, 243, 97, 8, 3, 243, 96, 8, 3, 243, - 105, 8, 3, 243, 100, 8, 3, 243, 98, 8, 3, 243, 99, 8, 3, 231, 130, 8, 3, - 231, 131, 8, 3, 231, 149, 8, 3, 231, 148, 8, 3, 231, 151, 8, 3, 231, 150, - 8, 3, 231, 121, 8, 3, 231, 123, 8, 3, 231, 122, 8, 3, 231, 126, 8, 3, - 231, 125, 8, 3, 231, 128, 8, 3, 231, 127, 8, 3, 231, 132, 8, 3, 231, 134, - 8, 3, 231, 133, 8, 3, 231, 117, 8, 3, 231, 116, 8, 3, 231, 124, 8, 3, - 231, 120, 8, 3, 231, 118, 8, 3, 231, 119, 8, 3, 241, 33, 8, 3, 241, 32, - 8, 3, 241, 39, 8, 3, 241, 34, 8, 3, 241, 36, 8, 3, 241, 35, 8, 3, 241, - 38, 8, 3, 241, 37, 8, 3, 241, 44, 8, 3, 241, 43, 8, 3, 241, 46, 8, 3, - 241, 45, 8, 3, 241, 25, 8, 3, 241, 24, 8, 3, 241, 27, 8, 3, 241, 26, 8, - 3, 241, 29, 8, 3, 241, 28, 8, 3, 241, 31, 8, 3, 241, 30, 8, 3, 241, 40, - 8, 3, 241, 42, 8, 3, 241, 41, 8, 3, 229, 175, 8, 3, 229, 177, 8, 3, 229, - 176, 8, 3, 229, 217, 8, 3, 229, 215, 8, 3, 229, 226, 8, 3, 229, 220, 8, - 3, 229, 138, 8, 3, 229, 137, 8, 3, 229, 139, 8, 3, 229, 147, 8, 3, 229, - 144, 8, 3, 229, 155, 8, 3, 229, 149, 8, 3, 229, 208, 8, 3, 229, 214, 8, - 3, 229, 210, 8, 3, 242, 5, 8, 3, 242, 15, 8, 3, 242, 23, 8, 3, 242, 98, - 8, 3, 242, 90, 8, 3, 162, 8, 3, 242, 109, 8, 3, 241, 58, 8, 3, 241, 57, - 8, 3, 241, 60, 8, 3, 241, 59, 8, 3, 241, 91, 8, 3, 241, 82, 8, 3, 241, - 173, 8, 3, 241, 152, 8, 3, 242, 42, 8, 3, 242, 85, 8, 3, 242, 53, 8, 3, - 214, 30, 8, 3, 214, 15, 8, 3, 214, 52, 8, 3, 214, 38, 8, 3, 213, 176, 8, - 3, 213, 178, 8, 3, 213, 177, 8, 3, 213, 194, 8, 3, 213, 217, 8, 3, 213, - 200, 8, 3, 213, 249, 8, 3, 214, 9, 8, 3, 213, 254, 8, 3, 212, 23, 8, 3, - 212, 22, 8, 3, 212, 37, 8, 3, 212, 25, 8, 3, 212, 30, 8, 3, 212, 32, 8, - 3, 212, 31, 8, 3, 212, 95, 8, 3, 212, 92, 8, 3, 212, 109, 8, 3, 212, 98, - 8, 3, 212, 1, 8, 3, 212, 3, 8, 3, 212, 2, 8, 3, 212, 12, 8, 3, 212, 11, - 8, 3, 212, 16, 8, 3, 212, 13, 8, 3, 212, 77, 8, 3, 212, 87, 8, 3, 212, - 81, 8, 3, 211, 253, 8, 3, 211, 252, 8, 3, 212, 8, 8, 3, 212, 0, 8, 3, - 211, 254, 8, 3, 211, 255, 8, 3, 211, 244, 8, 3, 211, 243, 8, 3, 211, 249, - 8, 3, 211, 247, 8, 3, 211, 245, 8, 3, 211, 246, 8, 3, 250, 88, 8, 3, 250, - 84, 8, 3, 250, 111, 8, 3, 250, 97, 8, 3, 250, 108, 8, 3, 250, 102, 8, 3, - 250, 110, 8, 3, 250, 109, 8, 3, 251, 24, 8, 3, 251, 17, 8, 3, 251, 88, 8, - 3, 251, 51, 8, 3, 249, 168, 8, 3, 249, 170, 8, 3, 249, 169, 8, 3, 249, - 215, 8, 3, 249, 206, 8, 3, 250, 42, 8, 3, 249, 231, 8, 3, 250, 217, 8, 3, - 250, 247, 8, 3, 250, 222, 8, 3, 249, 149, 8, 3, 249, 147, 8, 3, 249, 176, - 8, 3, 249, 166, 8, 3, 249, 154, 8, 3, 249, 165, 8, 3, 249, 128, 8, 3, - 249, 127, 8, 3, 249, 138, 8, 3, 249, 134, 8, 3, 249, 129, 8, 3, 249, 131, - 8, 3, 211, 227, 8, 3, 211, 226, 8, 3, 211, 233, 8, 3, 211, 228, 8, 3, - 211, 230, 8, 3, 211, 229, 8, 3, 211, 232, 8, 3, 211, 231, 8, 3, 211, 239, - 8, 3, 211, 238, 8, 3, 211, 242, 8, 3, 211, 240, 8, 3, 211, 223, 8, 3, - 211, 225, 8, 3, 211, 224, 8, 3, 211, 234, 8, 3, 211, 237, 8, 3, 211, 235, - 8, 3, 211, 218, 8, 3, 211, 222, 8, 3, 211, 221, 8, 3, 211, 219, 8, 3, - 211, 220, 8, 3, 211, 213, 8, 3, 211, 212, 8, 3, 211, 217, 8, 3, 211, 216, - 8, 3, 211, 214, 8, 3, 211, 215, 8, 3, 228, 5, 8, 3, 228, 4, 8, 3, 228, - 10, 8, 3, 228, 6, 8, 3, 228, 7, 8, 3, 228, 9, 8, 3, 228, 8, 8, 3, 228, - 15, 8, 3, 228, 14, 8, 3, 228, 18, 8, 3, 228, 17, 8, 3, 227, 254, 8, 3, - 227, 255, 8, 3, 228, 2, 8, 3, 228, 3, 8, 3, 228, 11, 8, 3, 228, 13, 8, 3, - 227, 249, 8, 3, 228, 1, 8, 3, 227, 253, 8, 3, 227, 250, 8, 3, 227, 251, - 8, 3, 227, 244, 8, 3, 227, 243, 8, 3, 227, 248, 8, 3, 227, 247, 8, 3, - 227, 245, 8, 3, 227, 246, 8, 3, 220, 74, 8, 3, 192, 8, 3, 220, 136, 8, 3, - 220, 77, 8, 3, 220, 128, 8, 3, 220, 131, 8, 3, 220, 129, 8, 3, 222, 166, - 8, 3, 222, 155, 8, 3, 222, 227, 8, 3, 222, 174, 8, 3, 218, 242, 8, 3, - 218, 244, 8, 3, 218, 243, 8, 3, 219, 240, 8, 3, 219, 229, 8, 3, 220, 5, - 8, 3, 219, 243, 8, 3, 221, 58, 8, 3, 222, 123, 8, 3, 221, 82, 8, 3, 218, - 220, 8, 3, 218, 218, 8, 3, 219, 41, 8, 3, 218, 241, 8, 3, 218, 223, 8, 3, - 218, 231, 8, 3, 218, 127, 8, 3, 218, 126, 8, 3, 218, 191, 8, 3, 218, 133, - 8, 3, 218, 128, 8, 3, 218, 132, 8, 3, 219, 139, 8, 3, 219, 138, 8, 3, - 219, 145, 8, 3, 219, 140, 8, 3, 219, 142, 8, 3, 219, 144, 8, 3, 219, 143, - 8, 3, 219, 153, 8, 3, 219, 151, 8, 3, 219, 176, 8, 3, 219, 154, 8, 3, - 219, 134, 8, 3, 219, 133, 8, 3, 219, 137, 8, 3, 219, 135, 8, 3, 219, 147, - 8, 3, 219, 150, 8, 3, 219, 148, 8, 3, 219, 130, 8, 3, 219, 128, 8, 3, - 219, 132, 8, 3, 219, 131, 8, 3, 219, 123, 8, 3, 219, 122, 8, 3, 219, 127, - 8, 3, 219, 126, 8, 3, 219, 124, 8, 3, 219, 125, 8, 3, 212, 70, 8, 3, 212, - 69, 8, 3, 212, 75, 8, 3, 212, 72, 8, 3, 212, 52, 8, 3, 212, 54, 8, 3, - 212, 53, 8, 3, 212, 57, 8, 3, 212, 56, 8, 3, 212, 60, 8, 3, 212, 58, 8, - 3, 212, 64, 8, 3, 212, 63, 8, 3, 212, 67, 8, 3, 212, 65, 8, 3, 212, 48, - 8, 3, 212, 47, 8, 3, 212, 55, 8, 3, 212, 51, 8, 3, 212, 49, 8, 3, 212, - 50, 8, 3, 212, 40, 8, 3, 212, 39, 8, 3, 212, 44, 8, 3, 212, 43, 8, 3, - 212, 41, 8, 3, 212, 42, 8, 3, 250, 195, 8, 3, 250, 192, 8, 3, 250, 215, - 8, 3, 250, 203, 8, 3, 250, 125, 8, 3, 250, 124, 8, 3, 250, 127, 8, 3, - 250, 126, 8, 3, 250, 139, 8, 3, 250, 138, 8, 3, 250, 146, 8, 3, 250, 141, - 8, 3, 250, 175, 8, 3, 250, 173, 8, 3, 250, 190, 8, 3, 250, 181, 8, 3, - 250, 119, 8, 3, 250, 129, 8, 3, 250, 123, 8, 3, 250, 120, 8, 3, 250, 122, - 8, 3, 250, 113, 8, 3, 250, 112, 8, 3, 250, 117, 8, 3, 250, 116, 8, 3, - 250, 114, 8, 3, 250, 115, 8, 3, 223, 111, 8, 3, 223, 115, 8, 3, 223, 94, - 8, 3, 223, 95, 8, 3, 223, 98, 8, 3, 223, 97, 8, 3, 223, 101, 8, 3, 223, - 99, 8, 3, 223, 105, 8, 3, 223, 104, 8, 3, 223, 110, 8, 3, 223, 106, 8, 3, - 223, 90, 8, 3, 223, 88, 8, 3, 223, 96, 8, 3, 223, 93, 8, 3, 223, 91, 8, - 3, 223, 92, 8, 3, 223, 83, 8, 3, 223, 82, 8, 3, 223, 87, 8, 3, 223, 86, - 8, 3, 223, 84, 8, 3, 223, 85, 8, 3, 228, 188, 8, 3, 228, 187, 8, 3, 228, - 190, 8, 3, 228, 189, 8, 3, 228, 180, 8, 3, 228, 182, 8, 3, 228, 181, 8, - 3, 228, 184, 8, 3, 228, 183, 8, 3, 228, 186, 8, 3, 228, 185, 8, 3, 228, - 175, 8, 3, 228, 174, 8, 3, 228, 179, 8, 3, 228, 178, 8, 3, 228, 176, 8, - 3, 228, 177, 8, 3, 228, 169, 8, 3, 228, 168, 8, 3, 228, 173, 8, 3, 228, - 172, 8, 3, 228, 170, 8, 3, 228, 171, 8, 3, 221, 17, 8, 3, 221, 12, 8, 3, - 221, 47, 8, 3, 221, 28, 8, 3, 220, 160, 8, 3, 220, 162, 8, 3, 220, 161, - 8, 3, 220, 181, 8, 3, 220, 178, 8, 3, 220, 208, 8, 3, 220, 199, 8, 3, - 220, 243, 8, 3, 220, 236, 8, 3, 221, 8, 8, 3, 220, 251, 8, 3, 220, 156, - 8, 3, 220, 154, 8, 3, 220, 170, 8, 3, 220, 159, 8, 3, 220, 157, 8, 3, - 220, 158, 8, 3, 220, 139, 8, 3, 220, 138, 8, 3, 220, 145, 8, 3, 220, 142, - 8, 3, 220, 140, 8, 3, 220, 141, 8, 3, 224, 68, 8, 3, 224, 62, 8, 3, 208, - 8, 3, 224, 74, 8, 3, 223, 57, 8, 3, 223, 59, 8, 3, 223, 58, 8, 3, 223, - 124, 8, 3, 223, 117, 8, 3, 223, 146, 8, 3, 223, 128, 8, 3, 223, 230, 8, - 3, 224, 55, 8, 3, 224, 9, 8, 3, 223, 50, 8, 3, 223, 47, 8, 3, 223, 77, 8, - 3, 223, 56, 8, 3, 223, 52, 8, 3, 223, 53, 8, 3, 223, 32, 8, 3, 223, 31, - 8, 3, 223, 37, 8, 3, 223, 35, 8, 3, 223, 33, 8, 3, 223, 34, 8, 3, 235, - 215, 8, 3, 235, 214, 8, 3, 235, 225, 8, 3, 235, 216, 8, 3, 235, 221, 8, - 3, 235, 220, 8, 3, 235, 223, 8, 3, 235, 222, 8, 3, 235, 158, 8, 3, 235, - 157, 8, 3, 235, 160, 8, 3, 235, 159, 8, 3, 235, 173, 8, 3, 235, 171, 8, - 3, 235, 185, 8, 3, 235, 175, 8, 3, 235, 152, 8, 3, 235, 150, 8, 3, 235, - 168, 8, 3, 235, 156, 8, 3, 235, 153, 8, 3, 235, 154, 8, 3, 235, 144, 8, - 3, 235, 143, 8, 3, 235, 148, 8, 3, 235, 147, 8, 3, 235, 145, 8, 3, 235, - 146, 8, 3, 224, 226, 8, 3, 224, 224, 8, 3, 224, 233, 8, 3, 224, 227, 8, - 3, 224, 230, 8, 3, 224, 229, 8, 3, 224, 232, 8, 3, 224, 231, 8, 3, 224, - 179, 8, 3, 224, 176, 8, 3, 224, 181, 8, 3, 224, 180, 8, 3, 224, 213, 8, - 3, 224, 212, 8, 3, 224, 222, 8, 3, 224, 216, 8, 3, 224, 171, 8, 3, 224, - 167, 8, 3, 224, 210, 8, 3, 224, 175, 8, 3, 224, 173, 8, 3, 224, 174, 8, - 3, 224, 151, 8, 3, 224, 149, 8, 3, 224, 161, 8, 3, 224, 154, 8, 3, 224, - 152, 8, 3, 224, 153, 8, 3, 235, 204, 8, 3, 235, 203, 8, 3, 235, 210, 8, - 3, 235, 205, 8, 3, 235, 207, 8, 3, 235, 206, 8, 3, 235, 209, 8, 3, 235, - 208, 8, 3, 235, 195, 8, 3, 235, 197, 8, 3, 235, 196, 8, 3, 235, 200, 8, - 3, 235, 199, 8, 3, 235, 202, 8, 3, 235, 201, 8, 3, 235, 191, 8, 3, 235, - 190, 8, 3, 235, 198, 8, 3, 235, 194, 8, 3, 235, 192, 8, 3, 235, 193, 8, - 3, 235, 187, 8, 3, 235, 186, 8, 3, 235, 189, 8, 3, 235, 188, 8, 3, 229, - 57, 8, 3, 229, 56, 8, 3, 229, 64, 8, 3, 229, 58, 8, 3, 229, 60, 8, 3, - 229, 59, 8, 3, 229, 63, 8, 3, 229, 61, 8, 3, 229, 46, 8, 3, 229, 47, 8, - 3, 229, 52, 8, 3, 229, 51, 8, 3, 229, 55, 8, 3, 229, 53, 8, 3, 229, 41, - 8, 3, 229, 50, 8, 3, 229, 45, 8, 3, 229, 42, 8, 3, 229, 43, 8, 3, 229, - 36, 8, 3, 229, 35, 8, 3, 229, 40, 8, 3, 229, 39, 8, 3, 229, 37, 8, 3, - 229, 38, 8, 3, 228, 38, 8, 3, 228, 37, 8, 3, 228, 49, 8, 3, 228, 42, 8, - 3, 228, 46, 8, 3, 228, 45, 8, 3, 228, 48, 8, 3, 228, 47, 8, 3, 228, 25, - 8, 3, 228, 27, 8, 3, 228, 26, 8, 3, 228, 31, 8, 3, 228, 30, 8, 3, 228, - 35, 8, 3, 228, 32, 8, 3, 228, 23, 8, 3, 228, 21, 8, 3, 228, 29, 8, 3, - 228, 24, 8, 3, 213, 141, 8, 3, 213, 140, 8, 3, 213, 148, 8, 3, 213, 143, - 8, 3, 213, 145, 8, 3, 213, 144, 8, 3, 213, 147, 8, 3, 213, 146, 8, 3, - 213, 130, 8, 3, 213, 131, 8, 3, 213, 135, 8, 3, 213, 134, 8, 3, 213, 139, - 8, 3, 213, 137, 8, 3, 213, 112, 8, 3, 213, 110, 8, 3, 213, 122, 8, 3, - 213, 115, 8, 3, 213, 113, 8, 3, 213, 114, 8, 3, 212, 242, 8, 3, 212, 240, - 8, 3, 213, 0, 8, 3, 212, 243, 8, 3, 212, 250, 8, 3, 212, 249, 8, 3, 212, - 253, 8, 3, 212, 251, 8, 3, 212, 183, 8, 3, 212, 182, 8, 3, 212, 186, 8, - 3, 212, 184, 8, 3, 212, 216, 8, 3, 212, 213, 8, 3, 212, 236, 8, 3, 212, - 220, 8, 3, 212, 174, 8, 3, 212, 170, 8, 3, 212, 204, 8, 3, 212, 181, 8, - 3, 212, 177, 8, 3, 212, 178, 8, 3, 212, 155, 8, 3, 212, 154, 8, 3, 212, - 161, 8, 3, 212, 158, 8, 3, 212, 156, 8, 3, 212, 157, 8, 34, 224, 213, 8, - 34, 233, 111, 8, 34, 234, 181, 8, 34, 228, 42, 8, 34, 249, 134, 8, 34, - 219, 145, 8, 34, 243, 108, 8, 34, 243, 140, 8, 34, 231, 112, 8, 34, 241, - 33, 8, 34, 232, 189, 8, 34, 252, 129, 8, 34, 231, 10, 8, 34, 212, 236, 8, - 34, 225, 44, 8, 34, 241, 27, 8, 34, 218, 10, 8, 34, 243, 230, 8, 34, 212, - 0, 8, 34, 249, 128, 8, 34, 248, 167, 8, 34, 251, 152, 8, 34, 243, 104, 8, - 34, 228, 32, 8, 34, 216, 90, 8, 34, 227, 78, 8, 34, 235, 191, 8, 34, 212, - 12, 8, 34, 225, 23, 8, 34, 241, 213, 8, 34, 212, 242, 8, 34, 214, 99, 8, - 34, 220, 145, 8, 34, 214, 226, 8, 34, 212, 109, 8, 34, 235, 185, 8, 34, - 227, 253, 8, 34, 235, 189, 8, 34, 242, 250, 8, 34, 235, 209, 8, 34, 213, - 217, 8, 34, 246, 154, 8, 34, 220, 158, 8, 34, 233, 106, 8, 34, 249, 138, - 8, 34, 249, 169, 8, 34, 250, 97, 8, 34, 241, 30, 8, 34, 221, 17, 8, 34, - 211, 255, 8, 34, 220, 199, 8, 34, 250, 190, 8, 34, 211, 230, 8, 34, 230, - 63, 8, 34, 235, 44, 233, 66, 1, 252, 234, 233, 66, 1, 195, 233, 66, 1, - 226, 59, 233, 66, 1, 249, 30, 233, 66, 1, 218, 66, 233, 66, 1, 217, 174, - 233, 66, 1, 243, 230, 233, 66, 1, 183, 233, 66, 1, 234, 250, 233, 66, 1, - 236, 0, 233, 66, 1, 251, 88, 233, 66, 1, 250, 215, 233, 66, 1, 246, 114, - 233, 66, 1, 216, 154, 233, 66, 1, 216, 146, 233, 66, 1, 191, 233, 66, 1, - 207, 233, 66, 1, 233, 255, 233, 66, 1, 222, 227, 233, 66, 1, 212, 75, - 233, 66, 1, 212, 109, 233, 66, 1, 229, 226, 233, 66, 1, 162, 233, 66, 1, - 213, 156, 233, 66, 1, 242, 37, 233, 66, 1, 245, 29, 233, 66, 1, 214, 52, - 233, 66, 1, 221, 47, 233, 66, 1, 189, 233, 66, 1, 243, 89, 233, 66, 1, - 63, 233, 66, 1, 255, 20, 233, 66, 1, 77, 233, 66, 1, 245, 143, 233, 66, - 1, 75, 233, 66, 1, 78, 233, 66, 1, 72, 233, 66, 1, 215, 189, 233, 66, 1, - 215, 184, 233, 66, 1, 227, 136, 233, 66, 1, 161, 230, 173, 217, 84, 233, - 66, 1, 161, 230, 115, 225, 186, 233, 66, 1, 161, 230, 173, 249, 137, 233, - 66, 1, 161, 230, 173, 251, 253, 233, 66, 1, 161, 230, 173, 207, 233, 66, - 1, 161, 230, 173, 235, 231, 233, 66, 225, 63, 250, 23, 233, 66, 225, 63, - 244, 64, 219, 83, 40, 3, 246, 30, 40, 3, 246, 27, 40, 3, 242, 67, 40, 3, - 214, 4, 40, 3, 214, 3, 40, 3, 226, 122, 40, 3, 252, 61, 40, 3, 252, 112, - 40, 3, 231, 249, 40, 3, 234, 111, 40, 3, 231, 143, 40, 3, 243, 171, 40, - 3, 244, 236, 40, 3, 214, 232, 40, 3, 217, 232, 40, 3, 217, 160, 40, 3, - 248, 89, 40, 3, 248, 86, 40, 3, 233, 172, 40, 3, 224, 35, 40, 3, 248, - 149, 40, 3, 230, 30, 40, 3, 222, 112, 40, 3, 221, 6, 40, 3, 212, 85, 40, - 3, 212, 66, 40, 3, 250, 239, 40, 3, 235, 240, 40, 3, 229, 71, 40, 3, 213, - 36, 40, 3, 235, 43, 40, 3, 229, 201, 40, 3, 243, 151, 40, 3, 231, 215, - 40, 3, 229, 251, 40, 3, 228, 55, 40, 3, 75, 40, 3, 236, 112, 40, 3, 242, - 28, 40, 3, 242, 9, 40, 3, 213, 238, 40, 3, 213, 229, 40, 3, 226, 20, 40, - 3, 252, 59, 40, 3, 252, 54, 40, 3, 231, 242, 40, 3, 234, 108, 40, 3, 231, - 140, 40, 3, 243, 167, 40, 3, 244, 210, 40, 3, 214, 159, 40, 3, 217, 84, - 40, 3, 217, 141, 40, 3, 248, 81, 40, 3, 248, 85, 40, 3, 233, 111, 40, 3, - 223, 222, 40, 3, 248, 76, 40, 3, 230, 24, 40, 3, 220, 136, 40, 3, 220, - 233, 40, 3, 212, 37, 40, 3, 212, 62, 40, 3, 250, 111, 40, 3, 235, 225, - 40, 3, 229, 64, 40, 3, 213, 0, 40, 3, 234, 212, 40, 3, 229, 193, 40, 3, - 243, 54, 40, 3, 231, 112, 40, 3, 229, 128, 40, 3, 228, 49, 40, 3, 63, 40, - 3, 254, 159, 40, 3, 229, 222, 40, 3, 162, 40, 3, 242, 121, 40, 3, 214, - 52, 40, 3, 214, 42, 40, 3, 195, 40, 3, 252, 65, 40, 3, 252, 234, 40, 3, - 232, 1, 40, 3, 234, 115, 40, 3, 234, 114, 40, 3, 231, 147, 40, 3, 243, - 175, 40, 3, 245, 29, 40, 3, 215, 8, 40, 3, 218, 66, 40, 3, 217, 174, 40, - 3, 248, 97, 40, 3, 248, 88, 40, 3, 233, 255, 40, 3, 208, 40, 3, 249, 30, - 40, 3, 230, 39, 40, 3, 222, 227, 40, 3, 221, 47, 40, 3, 212, 109, 40, 3, - 212, 75, 40, 3, 251, 88, 40, 3, 236, 0, 40, 3, 229, 80, 40, 3, 189, 40, - 3, 183, 40, 3, 235, 96, 40, 3, 229, 206, 40, 3, 243, 230, 40, 3, 191, 40, - 3, 207, 40, 3, 228, 64, 40, 3, 227, 86, 40, 3, 227, 82, 40, 3, 241, 158, - 40, 3, 213, 205, 40, 3, 213, 201, 40, 3, 225, 165, 40, 3, 252, 57, 40, 3, - 251, 243, 40, 3, 231, 237, 40, 3, 234, 106, 40, 3, 231, 136, 40, 3, 243, - 163, 40, 3, 244, 123, 40, 3, 214, 112, 40, 3, 216, 243, 40, 3, 217, 119, - 40, 3, 248, 79, 40, 3, 248, 83, 40, 3, 232, 254, 40, 3, 223, 133, 40, 3, - 247, 200, 40, 3, 230, 11, 40, 3, 219, 245, 40, 3, 220, 202, 40, 3, 212, - 14, 40, 3, 212, 59, 40, 3, 249, 236, 40, 3, 235, 176, 40, 3, 229, 54, 40, - 3, 212, 221, 40, 3, 234, 130, 40, 3, 229, 191, 40, 3, 243, 4, 40, 3, 231, - 16, 40, 3, 228, 218, 40, 3, 228, 33, 40, 3, 72, 40, 3, 215, 166, 40, 3, - 241, 74, 40, 3, 241, 64, 40, 3, 213, 186, 40, 3, 213, 180, 40, 3, 225, - 71, 40, 3, 252, 56, 40, 3, 251, 179, 40, 3, 231, 236, 40, 3, 234, 104, - 40, 3, 231, 135, 40, 3, 243, 162, 40, 3, 244, 69, 40, 3, 214, 103, 40, 3, - 216, 90, 40, 3, 217, 103, 40, 3, 248, 77, 40, 3, 248, 82, 40, 3, 232, - 230, 40, 3, 223, 77, 40, 3, 246, 154, 40, 3, 230, 6, 40, 3, 219, 41, 40, - 3, 220, 170, 40, 3, 212, 8, 40, 3, 212, 55, 40, 3, 249, 176, 40, 3, 235, - 168, 40, 3, 229, 50, 40, 3, 212, 204, 40, 3, 234, 81, 40, 3, 229, 190, - 40, 3, 242, 213, 40, 3, 230, 242, 40, 3, 228, 135, 40, 3, 228, 29, 40, 3, - 78, 40, 3, 227, 99, 40, 3, 229, 151, 40, 3, 241, 173, 40, 3, 241, 161, - 40, 3, 213, 217, 40, 3, 213, 206, 40, 3, 225, 186, 40, 3, 252, 58, 40, 3, - 251, 253, 40, 3, 231, 238, 40, 3, 234, 107, 40, 3, 231, 138, 40, 3, 243, - 165, 40, 3, 243, 164, 40, 3, 244, 132, 40, 3, 214, 123, 40, 3, 109, 40, - 3, 217, 122, 40, 3, 248, 80, 40, 3, 248, 84, 40, 3, 233, 26, 40, 3, 223, - 146, 40, 3, 247, 220, 40, 3, 230, 15, 40, 3, 220, 5, 40, 3, 220, 208, 40, - 3, 212, 16, 40, 3, 212, 60, 40, 3, 250, 42, 40, 3, 235, 185, 40, 3, 229, - 55, 40, 3, 212, 236, 40, 3, 234, 148, 40, 3, 229, 192, 40, 3, 243, 14, - 40, 3, 231, 45, 40, 3, 228, 228, 40, 3, 228, 35, 40, 3, 77, 40, 3, 245, - 229, 40, 3, 229, 211, 40, 3, 242, 85, 40, 3, 242, 56, 40, 3, 214, 9, 40, - 3, 214, 0, 40, 3, 226, 132, 40, 3, 252, 62, 40, 3, 252, 121, 40, 3, 231, - 250, 40, 3, 234, 112, 40, 3, 234, 110, 40, 3, 231, 144, 40, 3, 243, 172, - 40, 3, 243, 170, 40, 3, 244, 243, 40, 3, 214, 237, 40, 3, 217, 242, 40, - 3, 217, 161, 40, 3, 248, 90, 40, 3, 248, 87, 40, 3, 233, 180, 40, 3, 224, - 55, 40, 3, 248, 162, 40, 3, 230, 31, 40, 3, 222, 123, 40, 3, 221, 8, 40, - 3, 212, 87, 40, 3, 212, 67, 40, 3, 250, 247, 40, 3, 235, 242, 40, 3, 229, - 73, 40, 3, 213, 39, 40, 3, 235, 44, 40, 3, 229, 202, 40, 3, 229, 198, 40, - 3, 243, 158, 40, 3, 243, 147, 40, 3, 231, 226, 40, 3, 229, 254, 40, 3, - 228, 56, 40, 3, 229, 228, 40, 3, 233, 144, 40, 250, 23, 40, 244, 64, 219, - 83, 40, 224, 193, 79, 40, 3, 230, 14, 245, 29, 40, 3, 230, 14, 183, 40, - 3, 230, 14, 219, 245, 40, 16, 244, 233, 40, 16, 235, 42, 40, 16, 217, 48, - 40, 16, 229, 103, 40, 16, 252, 193, 40, 16, 245, 28, 40, 16, 218, 63, 40, - 16, 248, 243, 40, 16, 247, 199, 40, 16, 234, 70, 40, 16, 216, 247, 40, - 16, 247, 219, 40, 16, 235, 177, 40, 21, 212, 79, 40, 21, 118, 40, 21, - 112, 40, 21, 170, 40, 21, 167, 40, 21, 185, 40, 21, 192, 40, 21, 200, 40, - 21, 198, 40, 21, 203, 40, 3, 230, 14, 191, 40, 3, 230, 14, 247, 220, 33, - 6, 1, 212, 83, 33, 4, 1, 212, 83, 33, 6, 1, 246, 110, 33, 4, 1, 246, 110, - 33, 6, 1, 223, 236, 246, 112, 33, 4, 1, 223, 236, 246, 112, 33, 6, 1, - 236, 44, 33, 4, 1, 236, 44, 33, 6, 1, 247, 234, 33, 4, 1, 247, 234, 33, - 6, 1, 231, 24, 215, 181, 33, 4, 1, 231, 24, 215, 181, 33, 6, 1, 251, 189, - 227, 104, 33, 4, 1, 251, 189, 227, 104, 33, 6, 1, 229, 236, 213, 23, 33, - 4, 1, 229, 236, 213, 23, 33, 6, 1, 213, 20, 2, 252, 229, 213, 23, 33, 4, - 1, 213, 20, 2, 252, 229, 213, 23, 33, 6, 1, 236, 42, 213, 51, 33, 4, 1, - 236, 42, 213, 51, 33, 6, 1, 223, 236, 212, 204, 33, 4, 1, 223, 236, 212, - 204, 33, 6, 1, 236, 42, 63, 33, 4, 1, 236, 42, 63, 33, 6, 1, 250, 60, - 233, 62, 212, 175, 33, 4, 1, 250, 60, 233, 62, 212, 175, 33, 6, 1, 252, - 6, 212, 175, 33, 4, 1, 252, 6, 212, 175, 33, 6, 1, 236, 42, 250, 60, 233, - 62, 212, 175, 33, 4, 1, 236, 42, 250, 60, 233, 62, 212, 175, 33, 6, 1, - 212, 238, 33, 4, 1, 212, 238, 33, 6, 1, 223, 236, 216, 149, 33, 4, 1, - 223, 236, 216, 149, 33, 6, 1, 219, 255, 248, 162, 33, 4, 1, 219, 255, - 248, 162, 33, 6, 1, 219, 255, 245, 252, 33, 4, 1, 219, 255, 245, 252, 33, - 6, 1, 219, 255, 245, 238, 33, 4, 1, 219, 255, 245, 238, 33, 6, 1, 231, - 28, 78, 33, 4, 1, 231, 28, 78, 33, 6, 1, 252, 32, 78, 33, 4, 1, 252, 32, - 78, 33, 6, 1, 52, 231, 28, 78, 33, 4, 1, 52, 231, 28, 78, 33, 1, 230, - 226, 78, 38, 33, 214, 87, 38, 33, 217, 214, 231, 74, 53, 38, 33, 241, 63, - 231, 74, 53, 38, 33, 217, 114, 231, 74, 53, 220, 40, 254, 3, 38, 33, 235, - 54, 38, 33, 226, 137, 33, 235, 54, 33, 226, 137, 33, 6, 1, 246, 122, 33, - 4, 1, 246, 122, 33, 6, 1, 246, 103, 33, 4, 1, 246, 103, 33, 6, 1, 212, - 45, 33, 4, 1, 212, 45, 33, 6, 1, 251, 7, 33, 4, 1, 251, 7, 33, 6, 1, 246, - 102, 33, 4, 1, 246, 102, 33, 6, 1, 217, 243, 2, 231, 107, 102, 33, 4, 1, - 217, 243, 2, 231, 107, 102, 33, 6, 1, 216, 50, 33, 4, 1, 216, 50, 33, 6, - 1, 216, 132, 33, 4, 1, 216, 132, 33, 6, 1, 216, 136, 33, 4, 1, 216, 136, - 33, 6, 1, 217, 248, 33, 4, 1, 217, 248, 33, 6, 1, 241, 51, 33, 4, 1, 241, - 51, 33, 6, 1, 220, 151, 33, 4, 1, 220, 151, 20, 1, 63, 20, 1, 183, 20, 1, - 72, 20, 1, 234, 81, 20, 1, 246, 30, 20, 1, 224, 35, 20, 1, 218, 49, 20, - 1, 78, 20, 1, 228, 49, 20, 1, 75, 20, 1, 233, 255, 20, 1, 195, 20, 1, - 223, 170, 20, 1, 223, 216, 20, 1, 233, 171, 20, 1, 231, 214, 20, 1, 218, - 63, 20, 1, 230, 37, 20, 1, 229, 78, 20, 1, 184, 20, 1, 218, 219, 20, 1, - 230, 242, 20, 1, 220, 228, 20, 1, 220, 136, 20, 1, 220, 238, 20, 1, 221, - 67, 20, 1, 234, 19, 20, 1, 235, 18, 20, 1, 228, 107, 20, 1, 228, 135, 20, - 1, 229, 49, 20, 1, 212, 218, 20, 1, 220, 170, 20, 1, 212, 179, 20, 1, - 189, 20, 1, 228, 163, 20, 1, 235, 4, 20, 1, 226, 63, 20, 1, 229, 71, 20, - 1, 228, 144, 20, 1, 225, 66, 20, 1, 213, 183, 20, 1, 226, 122, 20, 1, - 244, 236, 20, 1, 223, 77, 20, 1, 232, 230, 20, 1, 231, 112, 20, 1, 229, - 128, 20, 1, 223, 238, 20, 1, 224, 96, 20, 1, 235, 27, 20, 1, 229, 158, - 20, 1, 229, 206, 20, 1, 229, 226, 20, 1, 220, 208, 20, 1, 225, 69, 20, 1, - 244, 69, 20, 1, 244, 126, 20, 1, 214, 52, 20, 1, 207, 20, 1, 233, 111, - 20, 1, 226, 20, 20, 1, 232, 248, 20, 1, 234, 148, 20, 1, 231, 247, 20, 1, - 224, 11, 20, 1, 231, 192, 20, 1, 191, 20, 1, 217, 84, 20, 1, 234, 212, - 20, 1, 231, 45, 20, 1, 231, 255, 20, 1, 217, 196, 20, 1, 234, 115, 20, 1, - 217, 213, 20, 1, 228, 136, 20, 1, 222, 190, 20, 1, 245, 25, 20, 1, 234, - 117, 20, 1, 234, 144, 20, 38, 156, 234, 125, 20, 38, 156, 216, 82, 20, - 229, 77, 20, 244, 64, 219, 83, 20, 250, 30, 20, 250, 23, 20, 221, 93, 20, - 224, 193, 79, 59, 1, 250, 156, 161, 212, 246, 225, 229, 59, 1, 250, 156, - 161, 213, 61, 225, 229, 59, 1, 250, 156, 161, 212, 246, 221, 29, 59, 1, - 250, 156, 161, 213, 61, 221, 29, 59, 1, 250, 156, 161, 212, 246, 224, - 210, 59, 1, 250, 156, 161, 213, 61, 224, 210, 59, 1, 250, 156, 161, 212, - 246, 223, 77, 59, 1, 250, 156, 161, 213, 61, 223, 77, 59, 1, 245, 109, - 246, 193, 161, 134, 59, 1, 127, 246, 193, 161, 134, 59, 1, 231, 108, 246, - 193, 161, 134, 59, 1, 117, 246, 193, 161, 134, 59, 1, 245, 108, 246, 193, - 161, 134, 59, 1, 245, 109, 246, 193, 233, 161, 161, 134, 59, 1, 127, 246, - 193, 233, 161, 161, 134, 59, 1, 231, 108, 246, 193, 233, 161, 161, 134, - 59, 1, 117, 246, 193, 233, 161, 161, 134, 59, 1, 245, 108, 246, 193, 233, - 161, 161, 134, 59, 1, 245, 109, 233, 161, 161, 134, 59, 1, 127, 233, 161, - 161, 134, 59, 1, 231, 108, 233, 161, 161, 134, 59, 1, 117, 233, 161, 161, - 134, 59, 1, 245, 108, 233, 161, 161, 134, 59, 1, 62, 66, 134, 59, 1, 62, - 220, 42, 59, 1, 62, 201, 134, 59, 1, 232, 237, 47, 249, 223, 254, 145, - 59, 1, 224, 83, 116, 71, 59, 1, 224, 83, 121, 71, 59, 1, 224, 83, 245, - 119, 79, 59, 1, 224, 83, 236, 52, 245, 119, 79, 59, 1, 117, 236, 52, 245, - 119, 79, 59, 1, 219, 65, 22, 127, 216, 254, 59, 1, 219, 65, 22, 117, 216, - 254, 7, 6, 1, 246, 21, 254, 205, 7, 4, 1, 246, 21, 254, 205, 7, 6, 1, - 246, 21, 254, 231, 7, 4, 1, 246, 21, 254, 231, 7, 6, 1, 242, 54, 7, 4, 1, - 242, 54, 7, 6, 1, 216, 13, 7, 4, 1, 216, 13, 7, 6, 1, 216, 200, 7, 4, 1, - 216, 200, 7, 6, 1, 249, 174, 7, 4, 1, 249, 174, 7, 6, 1, 249, 175, 2, - 250, 23, 7, 4, 1, 249, 175, 2, 250, 23, 7, 1, 4, 6, 245, 95, 7, 1, 4, 6, - 196, 7, 6, 1, 255, 104, 7, 4, 1, 255, 104, 7, 6, 1, 254, 111, 7, 4, 1, - 254, 111, 7, 6, 1, 253, 235, 7, 4, 1, 253, 235, 7, 6, 1, 253, 219, 7, 4, - 1, 253, 219, 7, 6, 1, 253, 220, 2, 201, 134, 7, 4, 1, 253, 220, 2, 201, - 134, 7, 6, 1, 253, 210, 7, 4, 1, 253, 210, 7, 6, 1, 223, 236, 251, 122, - 2, 247, 195, 7, 4, 1, 223, 236, 251, 122, 2, 247, 195, 7, 6, 1, 235, 142, - 2, 91, 7, 4, 1, 235, 142, 2, 91, 7, 6, 1, 235, 142, 2, 248, 72, 91, 7, 4, - 1, 235, 142, 2, 248, 72, 91, 7, 6, 1, 235, 142, 2, 219, 59, 22, 248, 72, - 91, 7, 4, 1, 235, 142, 2, 219, 59, 22, 248, 72, 91, 7, 6, 1, 251, 188, - 155, 7, 4, 1, 251, 188, 155, 7, 6, 1, 234, 13, 2, 127, 91, 7, 4, 1, 234, - 13, 2, 127, 91, 7, 6, 1, 141, 2, 187, 219, 59, 227, 26, 7, 4, 1, 141, 2, - 187, 219, 59, 227, 26, 7, 6, 1, 141, 2, 232, 251, 7, 4, 1, 141, 2, 232, - 251, 7, 6, 1, 227, 86, 7, 4, 1, 227, 86, 7, 6, 1, 227, 12, 2, 219, 59, - 217, 106, 248, 111, 7, 4, 1, 227, 12, 2, 219, 59, 217, 106, 248, 111, 7, - 6, 1, 227, 12, 2, 244, 142, 7, 4, 1, 227, 12, 2, 244, 142, 7, 6, 1, 227, - 12, 2, 219, 180, 218, 40, 7, 4, 1, 227, 12, 2, 219, 180, 218, 40, 7, 6, - 1, 225, 20, 2, 219, 59, 217, 106, 248, 111, 7, 4, 1, 225, 20, 2, 219, 59, - 217, 106, 248, 111, 7, 6, 1, 225, 20, 2, 248, 72, 91, 7, 4, 1, 225, 20, - 2, 248, 72, 91, 7, 6, 1, 224, 148, 223, 122, 7, 4, 1, 224, 148, 223, 122, - 7, 6, 1, 223, 67, 223, 122, 7, 4, 1, 223, 67, 223, 122, 7, 6, 1, 215, 86, - 2, 248, 72, 91, 7, 4, 1, 215, 86, 2, 248, 72, 91, 7, 6, 1, 214, 93, 7, 4, - 1, 214, 93, 7, 6, 1, 214, 130, 212, 152, 7, 4, 1, 214, 130, 212, 152, 7, - 6, 1, 217, 118, 2, 91, 7, 4, 1, 217, 118, 2, 91, 7, 6, 1, 217, 118, 2, - 219, 59, 217, 106, 248, 111, 7, 4, 1, 217, 118, 2, 219, 59, 217, 106, - 248, 111, 7, 6, 1, 214, 227, 7, 4, 1, 214, 227, 7, 6, 1, 245, 151, 7, 4, - 1, 245, 151, 7, 6, 1, 236, 30, 7, 4, 1, 236, 30, 7, 6, 1, 250, 12, 7, 4, - 1, 250, 12, 59, 1, 215, 110, 7, 4, 1, 246, 145, 7, 4, 1, 232, 216, 7, 4, - 1, 230, 220, 7, 4, 1, 228, 100, 7, 4, 1, 223, 66, 7, 1, 4, 6, 223, 66, 7, - 4, 1, 216, 80, 7, 4, 1, 215, 173, 7, 6, 1, 236, 71, 249, 125, 7, 4, 1, - 236, 71, 249, 125, 7, 6, 1, 236, 71, 245, 95, 7, 4, 1, 236, 71, 245, 95, - 7, 6, 1, 236, 71, 244, 41, 7, 6, 1, 216, 66, 236, 71, 244, 41, 7, 4, 1, - 216, 66, 236, 71, 244, 41, 7, 6, 1, 216, 66, 155, 7, 4, 1, 216, 66, 155, - 7, 6, 1, 236, 71, 152, 7, 4, 1, 236, 71, 152, 7, 6, 1, 236, 71, 196, 7, - 4, 1, 236, 71, 196, 7, 6, 1, 236, 71, 218, 113, 7, 4, 1, 236, 71, 218, - 113, 59, 1, 117, 250, 91, 255, 46, 59, 1, 250, 30, 59, 1, 220, 196, 245, - 182, 53, 7, 6, 1, 222, 194, 7, 4, 1, 222, 194, 7, 6, 1, 216, 66, 242, - 162, 7, 4, 1, 234, 13, 2, 223, 241, 241, 157, 22, 252, 88, 7, 6, 1, 230, - 167, 2, 248, 111, 7, 4, 1, 230, 167, 2, 248, 111, 7, 6, 1, 244, 42, 2, - 227, 149, 91, 7, 4, 1, 244, 42, 2, 227, 149, 91, 7, 6, 1, 235, 142, 2, - 227, 149, 91, 7, 4, 1, 235, 142, 2, 227, 149, 91, 7, 6, 1, 230, 167, 2, - 227, 149, 91, 7, 4, 1, 230, 167, 2, 227, 149, 91, 7, 6, 1, 224, 148, 2, - 227, 149, 91, 7, 4, 1, 224, 148, 2, 227, 149, 91, 7, 6, 1, 223, 29, 2, - 227, 149, 91, 7, 4, 1, 223, 29, 2, 227, 149, 91, 7, 1, 4, 6, 216, 66, - 184, 7, 245, 187, 1, 223, 236, 245, 95, 7, 245, 187, 1, 223, 236, 227, - 11, 7, 245, 187, 1, 236, 52, 184, 7, 245, 187, 1, 241, 7, 233, 0, 7, 245, - 187, 1, 254, 64, 184, 218, 189, 230, 101, 1, 63, 218, 189, 230, 101, 1, - 75, 218, 189, 230, 101, 5, 246, 124, 218, 189, 230, 101, 1, 72, 218, 189, - 230, 101, 1, 77, 218, 189, 230, 101, 1, 78, 218, 189, 230, 101, 5, 242, - 100, 218, 189, 230, 101, 1, 234, 148, 218, 189, 230, 101, 1, 234, 224, - 218, 189, 230, 101, 1, 243, 14, 218, 189, 230, 101, 1, 243, 64, 218, 189, - 230, 101, 5, 254, 113, 218, 189, 230, 101, 1, 250, 42, 218, 189, 230, - 101, 1, 250, 146, 218, 189, 230, 101, 1, 235, 185, 218, 189, 230, 101, 1, - 235, 226, 218, 189, 230, 101, 1, 216, 105, 218, 189, 230, 101, 1, 216, - 111, 218, 189, 230, 101, 1, 248, 177, 218, 189, 230, 101, 1, 248, 186, - 218, 189, 230, 101, 1, 109, 218, 189, 230, 101, 1, 217, 122, 218, 189, - 230, 101, 1, 247, 220, 218, 189, 230, 101, 1, 248, 80, 218, 189, 230, - 101, 1, 228, 228, 218, 189, 230, 101, 1, 225, 186, 218, 189, 230, 101, 1, - 226, 33, 218, 189, 230, 101, 1, 251, 253, 218, 189, 230, 101, 1, 252, 58, - 218, 189, 230, 101, 1, 231, 45, 218, 189, 230, 101, 1, 223, 146, 218, - 189, 230, 101, 1, 233, 26, 218, 189, 230, 101, 1, 223, 101, 218, 189, - 230, 101, 1, 220, 5, 218, 189, 230, 101, 1, 241, 173, 218, 189, 230, 101, - 30, 5, 63, 218, 189, 230, 101, 30, 5, 75, 218, 189, 230, 101, 30, 5, 72, - 218, 189, 230, 101, 30, 5, 77, 218, 189, 230, 101, 30, 5, 227, 86, 218, - 189, 230, 101, 225, 182, 232, 36, 218, 189, 230, 101, 225, 182, 232, 35, - 218, 189, 230, 101, 225, 182, 232, 34, 218, 189, 230, 101, 225, 182, 232, - 33, 228, 210, 236, 98, 244, 92, 124, 224, 201, 228, 210, 236, 98, 244, - 92, 124, 242, 129, 228, 210, 236, 98, 244, 92, 137, 224, 199, 228, 210, - 236, 98, 244, 92, 124, 220, 64, 228, 210, 236, 98, 244, 92, 124, 246, 10, - 228, 210, 236, 98, 244, 92, 137, 220, 63, 228, 210, 236, 98, 224, 202, - 79, 228, 210, 236, 98, 225, 208, 79, 228, 210, 236, 98, 223, 55, 79, 228, - 210, 236, 98, 224, 203, 79, 226, 56, 1, 183, 226, 56, 1, 234, 250, 226, - 56, 1, 243, 230, 226, 56, 1, 229, 226, 226, 56, 1, 251, 88, 226, 56, 1, - 250, 215, 226, 56, 1, 236, 0, 226, 56, 1, 228, 64, 226, 56, 1, 218, 66, - 226, 56, 1, 217, 174, 226, 56, 1, 249, 30, 226, 56, 1, 207, 226, 56, 1, - 195, 226, 56, 1, 226, 59, 226, 56, 1, 252, 234, 226, 56, 1, 191, 226, 56, - 1, 216, 154, 226, 56, 1, 216, 146, 226, 56, 1, 246, 114, 226, 56, 1, 214, - 52, 226, 56, 1, 212, 75, 226, 56, 1, 212, 109, 226, 56, 1, 4, 63, 226, - 56, 1, 189, 226, 56, 1, 208, 226, 56, 1, 233, 255, 226, 56, 1, 221, 47, - 226, 56, 1, 222, 227, 226, 56, 1, 162, 226, 56, 1, 63, 226, 56, 1, 75, - 226, 56, 1, 72, 226, 56, 1, 77, 226, 56, 1, 78, 226, 56, 1, 225, 11, 226, - 56, 1, 213, 156, 226, 56, 1, 245, 29, 226, 56, 1, 243, 125, 226, 56, 1, - 246, 30, 226, 56, 219, 32, 1, 214, 52, 226, 56, 219, 32, 1, 189, 226, 56, - 1, 216, 128, 226, 56, 1, 216, 116, 226, 56, 1, 248, 207, 226, 56, 1, 229, - 6, 226, 56, 1, 254, 177, 189, 226, 56, 1, 214, 119, 221, 47, 226, 56, 1, - 214, 120, 162, 226, 56, 1, 254, 9, 245, 29, 226, 56, 219, 32, 1, 208, - 226, 56, 218, 239, 1, 208, 226, 56, 1, 251, 55, 226, 56, 220, 100, 242, - 83, 79, 226, 56, 52, 242, 83, 79, 226, 56, 156, 221, 40, 226, 56, 156, - 52, 221, 40, 173, 5, 254, 113, 173, 5, 214, 132, 173, 1, 63, 173, 1, 255, - 104, 173, 1, 75, 173, 1, 236, 145, 173, 1, 72, 173, 1, 215, 98, 173, 1, - 165, 152, 173, 1, 165, 223, 116, 173, 1, 165, 155, 173, 1, 165, 233, 55, - 173, 1, 77, 173, 1, 246, 30, 173, 1, 254, 236, 173, 1, 78, 173, 1, 227, - 86, 173, 1, 253, 235, 173, 1, 183, 173, 1, 234, 250, 173, 1, 243, 230, - 173, 1, 243, 89, 173, 1, 229, 226, 173, 1, 251, 88, 173, 1, 250, 215, - 173, 1, 236, 0, 173, 1, 235, 230, 173, 1, 228, 64, 173, 1, 216, 128, 173, - 1, 216, 116, 173, 1, 248, 207, 173, 1, 248, 191, 173, 1, 229, 6, 173, 1, - 218, 66, 173, 1, 217, 174, 173, 1, 249, 30, 173, 1, 248, 97, 173, 1, 207, - 173, 1, 195, 173, 1, 226, 59, 173, 1, 252, 234, 173, 1, 252, 65, 173, 1, - 191, 173, 1, 189, 173, 1, 208, 173, 1, 233, 255, 173, 1, 215, 8, 173, 1, - 221, 47, 173, 1, 219, 176, 173, 1, 222, 227, 173, 1, 162, 173, 1, 233, - 54, 173, 120, 5, 242, 146, 173, 30, 5, 255, 104, 173, 30, 5, 75, 173, 30, - 5, 236, 145, 173, 30, 5, 72, 173, 30, 5, 215, 98, 173, 30, 5, 165, 152, - 173, 30, 5, 165, 223, 116, 173, 30, 5, 165, 155, 173, 30, 5, 165, 233, - 55, 173, 30, 5, 77, 173, 30, 5, 246, 30, 173, 30, 5, 254, 236, 173, 30, - 5, 78, 173, 30, 5, 227, 86, 173, 30, 5, 253, 235, 173, 5, 214, 137, 173, - 248, 245, 173, 52, 248, 245, 173, 21, 212, 79, 173, 21, 118, 173, 21, - 112, 173, 21, 170, 173, 21, 167, 173, 21, 185, 173, 21, 192, 173, 21, - 200, 173, 21, 198, 173, 21, 203, 38, 84, 21, 212, 79, 38, 84, 21, 118, - 38, 84, 21, 112, 38, 84, 21, 170, 38, 84, 21, 167, 38, 84, 21, 185, 38, - 84, 21, 192, 38, 84, 21, 200, 38, 84, 21, 198, 38, 84, 21, 203, 38, 84, - 1, 63, 38, 84, 1, 72, 38, 84, 1, 183, 38, 84, 1, 207, 38, 84, 1, 195, 38, - 84, 1, 208, 38, 84, 1, 214, 159, 38, 84, 5, 253, 218, 84, 5, 219, 224, - 251, 55, 84, 5, 251, 56, 214, 137, 84, 5, 52, 251, 56, 214, 137, 84, 5, - 251, 56, 112, 84, 5, 251, 56, 170, 84, 5, 251, 56, 253, 218, 84, 5, 225, - 47, 84, 243, 196, 244, 192, 84, 251, 38, 84, 242, 77, 235, 50, 233, 112, - 21, 212, 79, 235, 50, 233, 112, 21, 118, 235, 50, 233, 112, 21, 112, 235, - 50, 233, 112, 21, 170, 235, 50, 233, 112, 21, 167, 235, 50, 233, 112, 21, - 185, 235, 50, 233, 112, 21, 192, 235, 50, 233, 112, 21, 200, 235, 50, - 233, 112, 21, 198, 235, 50, 233, 112, 21, 203, 235, 50, 233, 112, 1, 183, - 235, 50, 233, 112, 1, 234, 250, 235, 50, 233, 112, 1, 243, 230, 235, 50, - 233, 112, 1, 229, 226, 235, 50, 233, 112, 1, 222, 227, 235, 50, 233, 112, - 1, 221, 47, 235, 50, 233, 112, 1, 212, 109, 235, 50, 233, 112, 1, 228, - 64, 235, 50, 233, 112, 1, 218, 66, 235, 50, 233, 112, 1, 241, 76, 235, - 50, 233, 112, 1, 207, 235, 50, 233, 112, 1, 195, 235, 50, 233, 112, 1, - 226, 59, 235, 50, 233, 112, 1, 191, 235, 50, 233, 112, 1, 249, 30, 235, - 50, 233, 112, 1, 252, 234, 235, 50, 233, 112, 1, 208, 235, 50, 233, 112, - 1, 189, 235, 50, 233, 112, 1, 233, 255, 235, 50, 233, 112, 1, 214, 52, - 235, 50, 233, 112, 1, 217, 174, 235, 50, 233, 112, 1, 162, 235, 50, 233, - 112, 1, 215, 8, 235, 50, 233, 112, 1, 251, 88, 235, 50, 233, 112, 1, 63, - 235, 50, 233, 112, 1, 227, 136, 235, 50, 233, 112, 1, 75, 235, 50, 233, - 112, 1, 227, 86, 235, 50, 233, 112, 30, 215, 189, 235, 50, 233, 112, 30, - 77, 235, 50, 233, 112, 30, 72, 235, 50, 233, 112, 30, 246, 30, 235, 50, - 233, 112, 30, 78, 235, 50, 233, 112, 161, 225, 199, 235, 50, 233, 112, - 161, 251, 68, 235, 50, 233, 112, 161, 251, 69, 225, 199, 235, 50, 233, - 112, 5, 249, 142, 235, 50, 233, 112, 5, 220, 144, 224, 21, 1, 183, 224, - 21, 1, 243, 230, 224, 21, 1, 229, 226, 224, 21, 1, 218, 66, 224, 21, 1, - 249, 30, 224, 21, 1, 207, 224, 21, 1, 195, 224, 21, 1, 252, 234, 224, 21, - 1, 191, 224, 21, 1, 251, 88, 224, 21, 1, 236, 0, 224, 21, 1, 228, 64, - 224, 21, 1, 222, 227, 224, 21, 1, 208, 224, 21, 1, 233, 255, 224, 21, 1, - 189, 224, 21, 1, 214, 52, 224, 21, 1, 162, 224, 21, 1, 232, 1, 224, 21, - 1, 229, 206, 224, 21, 1, 230, 39, 224, 21, 1, 228, 36, 224, 21, 1, 63, - 224, 21, 30, 5, 75, 224, 21, 30, 5, 72, 224, 21, 30, 5, 77, 224, 21, 30, - 5, 254, 236, 224, 21, 30, 5, 78, 224, 21, 30, 5, 253, 235, 224, 21, 30, - 5, 245, 143, 224, 21, 30, 5, 246, 54, 224, 21, 120, 5, 229, 228, 224, 21, - 120, 5, 206, 224, 21, 120, 5, 152, 224, 21, 120, 5, 242, 162, 224, 21, - 214, 137, 224, 21, 222, 115, 79, 24, 98, 217, 64, 24, 98, 217, 63, 24, - 98, 217, 61, 24, 98, 217, 66, 24, 98, 223, 208, 24, 98, 223, 192, 24, 98, - 223, 187, 24, 98, 223, 189, 24, 98, 223, 205, 24, 98, 223, 198, 24, 98, - 223, 191, 24, 98, 223, 210, 24, 98, 223, 193, 24, 98, 223, 212, 24, 98, - 223, 209, 24, 98, 231, 96, 24, 98, 231, 87, 24, 98, 231, 90, 24, 98, 225, - 248, 24, 98, 226, 3, 24, 98, 226, 4, 24, 98, 219, 160, 24, 98, 236, 158, - 24, 98, 236, 165, 24, 98, 219, 171, 24, 98, 219, 158, 24, 98, 226, 42, - 24, 98, 242, 16, 24, 98, 219, 155, 148, 5, 226, 192, 148, 5, 250, 244, - 148, 5, 233, 188, 148, 5, 213, 231, 148, 1, 63, 148, 1, 241, 7, 235, 53, - 148, 1, 75, 148, 1, 236, 145, 148, 1, 72, 148, 1, 226, 252, 250, 220, - 148, 1, 229, 227, 233, 150, 148, 1, 229, 227, 233, 151, 224, 69, 148, 1, - 77, 148, 1, 254, 236, 148, 1, 78, 148, 1, 183, 148, 1, 235, 131, 222, - 168, 148, 1, 235, 131, 230, 206, 148, 1, 243, 230, 148, 1, 243, 231, 230, - 206, 148, 1, 229, 226, 148, 1, 251, 88, 148, 1, 251, 89, 230, 206, 148, - 1, 236, 0, 148, 1, 228, 65, 230, 206, 148, 1, 236, 1, 232, 85, 148, 1, - 228, 64, 148, 1, 216, 128, 148, 1, 216, 129, 232, 85, 148, 1, 248, 207, - 148, 1, 248, 208, 232, 85, 148, 1, 230, 115, 230, 206, 148, 1, 218, 66, - 148, 1, 218, 67, 230, 206, 148, 1, 249, 30, 148, 1, 249, 31, 232, 85, - 148, 1, 207, 148, 1, 195, 148, 1, 226, 252, 230, 206, 148, 1, 252, 234, - 148, 1, 252, 235, 230, 206, 148, 1, 191, 148, 1, 189, 148, 1, 208, 148, - 1, 224, 112, 254, 243, 148, 1, 233, 255, 148, 1, 214, 52, 148, 1, 222, - 228, 230, 206, 148, 1, 222, 228, 232, 85, 148, 1, 222, 227, 148, 1, 162, - 148, 5, 250, 245, 217, 216, 148, 30, 5, 218, 11, 148, 30, 5, 217, 3, 148, - 30, 5, 213, 181, 148, 30, 5, 213, 182, 231, 203, 148, 30, 5, 219, 6, 148, - 30, 5, 219, 7, 231, 191, 148, 30, 5, 218, 29, 148, 30, 5, 248, 11, 230, - 205, 148, 30, 5, 226, 95, 148, 120, 5, 235, 20, 148, 120, 5, 226, 107, - 148, 120, 5, 251, 75, 148, 226, 204, 148, 43, 223, 255, 148, 47, 223, - 255, 148, 226, 241, 254, 153, 148, 226, 241, 232, 102, 148, 226, 241, - 232, 220, 148, 226, 241, 213, 226, 148, 226, 241, 226, 205, 148, 226, - 241, 233, 75, 148, 226, 241, 232, 214, 148, 226, 241, 255, 26, 148, 226, - 241, 255, 27, 255, 26, 148, 226, 241, 225, 219, 148, 216, 66, 226, 241, - 225, 219, 148, 226, 201, 148, 21, 212, 79, 148, 21, 118, 148, 21, 112, - 148, 21, 170, 148, 21, 167, 148, 21, 185, 148, 21, 192, 148, 21, 200, - 148, 21, 198, 148, 21, 203, 148, 226, 241, 217, 36, 216, 78, 148, 226, - 241, 236, 26, 166, 1, 63, 166, 1, 75, 166, 1, 72, 166, 1, 77, 166, 1, - 254, 236, 166, 1, 78, 166, 1, 183, 166, 1, 234, 250, 166, 1, 243, 230, - 166, 1, 243, 89, 166, 1, 229, 140, 166, 1, 229, 226, 166, 1, 250, 215, - 166, 1, 250, 172, 166, 1, 236, 0, 166, 1, 235, 230, 166, 1, 229, 130, - 166, 1, 229, 132, 166, 1, 229, 131, 166, 1, 218, 66, 166, 1, 217, 174, - 166, 1, 249, 30, 166, 1, 248, 97, 166, 1, 228, 105, 166, 1, 207, 166, 1, - 248, 207, 166, 1, 195, 166, 1, 225, 136, 166, 1, 226, 59, 166, 1, 252, - 234, 166, 1, 252, 65, 166, 1, 230, 235, 166, 1, 191, 166, 1, 252, 157, - 166, 1, 189, 166, 1, 208, 166, 1, 233, 255, 166, 1, 215, 8, 166, 1, 219, - 176, 166, 1, 222, 227, 166, 1, 162, 166, 30, 5, 255, 104, 166, 30, 5, 75, - 166, 30, 5, 236, 145, 166, 30, 5, 246, 17, 166, 30, 5, 72, 166, 30, 5, - 227, 136, 166, 30, 5, 78, 166, 30, 5, 254, 236, 166, 30, 5, 253, 235, - 166, 30, 5, 215, 189, 166, 120, 5, 189, 166, 120, 5, 208, 166, 120, 5, - 233, 255, 166, 120, 5, 214, 52, 166, 1, 41, 235, 141, 166, 1, 41, 244, - 41, 166, 1, 41, 229, 228, 166, 120, 5, 41, 229, 228, 166, 1, 41, 250, - 216, 166, 1, 41, 218, 113, 166, 1, 41, 206, 166, 1, 41, 227, 11, 166, 1, - 41, 213, 108, 166, 1, 41, 152, 166, 1, 41, 155, 166, 1, 41, 219, 177, - 166, 120, 5, 41, 184, 166, 120, 5, 41, 242, 162, 166, 21, 212, 79, 166, - 21, 118, 166, 21, 112, 166, 21, 170, 166, 21, 167, 166, 21, 185, 166, 21, - 192, 166, 21, 200, 166, 21, 198, 166, 21, 203, 166, 225, 63, 219, 202, - 166, 225, 63, 248, 245, 166, 225, 63, 52, 248, 245, 166, 225, 63, 216, - 182, 248, 245, 65, 1, 234, 244, 243, 230, 65, 1, 234, 244, 251, 88, 65, - 1, 234, 244, 250, 215, 65, 1, 234, 244, 236, 0, 65, 1, 234, 244, 235, - 230, 65, 1, 234, 244, 228, 64, 65, 1, 234, 244, 216, 128, 65, 1, 234, - 244, 216, 116, 65, 1, 234, 244, 248, 207, 65, 1, 234, 244, 248, 191, 65, - 1, 234, 244, 248, 97, 65, 1, 234, 244, 207, 65, 1, 234, 244, 222, 227, - 65, 1, 234, 244, 162, 65, 1, 234, 244, 242, 37, 65, 1, 234, 244, 245, 29, - 65, 59, 1, 234, 244, 224, 36, 65, 1, 234, 244, 213, 156, 65, 1, 234, 244, - 212, 109, 65, 1, 234, 244, 208, 65, 233, 16, 234, 244, 227, 154, 65, 233, - 16, 234, 244, 224, 223, 65, 233, 16, 234, 244, 241, 226, 65, 16, 254, - 225, 245, 118, 65, 16, 254, 225, 118, 65, 16, 254, 225, 112, 65, 1, 254, - 225, 208, 65, 5, 226, 188, 235, 75, 216, 254, 39, 193, 1, 117, 234, 148, - 39, 193, 1, 127, 234, 148, 39, 193, 1, 117, 234, 224, 39, 193, 1, 127, - 234, 224, 39, 193, 1, 117, 234, 232, 39, 193, 1, 127, 234, 232, 39, 193, - 1, 117, 243, 14, 39, 193, 1, 127, 243, 14, 39, 193, 1, 117, 229, 155, 39, - 193, 1, 127, 229, 155, 39, 193, 1, 117, 250, 42, 39, 193, 1, 127, 250, - 42, 39, 193, 1, 117, 250, 146, 39, 193, 1, 127, 250, 146, 39, 193, 1, - 117, 220, 5, 39, 193, 1, 127, 220, 5, 39, 193, 1, 117, 228, 35, 39, 193, - 1, 127, 228, 35, 39, 193, 1, 117, 247, 220, 39, 193, 1, 127, 247, 220, - 39, 193, 1, 117, 109, 39, 193, 1, 127, 109, 39, 193, 1, 117, 217, 122, - 39, 193, 1, 127, 217, 122, 39, 193, 1, 117, 228, 228, 39, 193, 1, 127, - 228, 228, 39, 193, 1, 117, 251, 253, 39, 193, 1, 127, 251, 253, 39, 193, - 1, 117, 225, 186, 39, 193, 1, 127, 225, 186, 39, 193, 1, 117, 226, 33, - 39, 193, 1, 127, 226, 33, 39, 193, 1, 117, 244, 132, 39, 193, 1, 127, - 244, 132, 39, 193, 1, 117, 231, 45, 39, 193, 1, 127, 231, 45, 39, 193, 1, - 117, 212, 236, 39, 193, 1, 127, 212, 236, 39, 193, 1, 117, 223, 146, 39, - 193, 1, 127, 223, 146, 39, 193, 1, 117, 233, 26, 39, 193, 1, 127, 233, - 26, 39, 193, 1, 117, 214, 123, 39, 193, 1, 127, 214, 123, 39, 193, 1, - 117, 241, 173, 39, 193, 1, 127, 241, 173, 39, 193, 1, 117, 78, 39, 193, - 1, 127, 78, 39, 193, 232, 82, 235, 92, 39, 193, 30, 255, 104, 39, 193, - 30, 75, 39, 193, 30, 215, 189, 39, 193, 30, 72, 39, 193, 30, 77, 39, 193, - 30, 78, 39, 193, 232, 82, 234, 226, 39, 193, 30, 240, 228, 39, 193, 30, - 215, 188, 39, 193, 30, 215, 202, 39, 193, 30, 253, 233, 39, 193, 30, 253, - 210, 39, 193, 30, 254, 159, 39, 193, 30, 254, 172, 39, 193, 161, 232, 82, - 246, 2, 39, 193, 161, 232, 82, 228, 104, 39, 193, 161, 232, 82, 217, 122, - 39, 193, 161, 232, 82, 219, 247, 39, 193, 16, 234, 133, 39, 193, 16, 228, - 104, 39, 193, 16, 222, 192, 39, 193, 16, 241, 174, 241, 169, 39, 193, 16, - 234, 142, 234, 141, 28, 3, 216, 109, 28, 3, 216, 112, 28, 3, 216, 115, - 28, 3, 216, 113, 28, 3, 216, 114, 28, 3, 216, 111, 28, 3, 248, 185, 28, - 3, 248, 187, 28, 3, 248, 190, 28, 3, 248, 188, 28, 3, 248, 189, 28, 3, - 248, 186, 28, 3, 246, 104, 28, 3, 246, 107, 28, 3, 246, 113, 28, 3, 246, - 111, 28, 3, 246, 112, 28, 3, 246, 105, 28, 3, 251, 5, 28, 3, 250, 255, - 28, 3, 251, 1, 28, 3, 251, 4, 28, 3, 251, 2, 28, 3, 251, 3, 28, 3, 251, - 0, 28, 3, 252, 157, 28, 3, 252, 136, 28, 3, 252, 148, 28, 3, 252, 156, - 28, 3, 252, 151, 28, 3, 252, 152, 28, 3, 252, 140, 231, 210, 232, 8, 1, - 234, 139, 231, 210, 232, 8, 1, 222, 192, 231, 210, 232, 8, 1, 233, 231, - 231, 210, 232, 8, 1, 231, 55, 231, 210, 232, 8, 1, 195, 231, 210, 232, 8, - 1, 207, 231, 210, 232, 8, 1, 250, 162, 231, 210, 232, 8, 1, 217, 57, 231, - 210, 232, 8, 1, 234, 220, 231, 210, 232, 8, 1, 229, 145, 231, 210, 232, - 8, 1, 217, 116, 231, 210, 232, 8, 1, 214, 47, 231, 210, 232, 8, 1, 213, - 60, 231, 210, 232, 8, 1, 241, 68, 231, 210, 232, 8, 1, 215, 166, 231, - 210, 232, 8, 1, 75, 231, 210, 232, 8, 1, 226, 54, 231, 210, 232, 8, 1, - 253, 245, 231, 210, 232, 8, 1, 243, 7, 231, 210, 232, 8, 1, 235, 229, - 231, 210, 232, 8, 1, 224, 92, 231, 210, 232, 8, 1, 252, 234, 231, 210, - 232, 8, 1, 235, 217, 231, 210, 232, 8, 1, 248, 36, 231, 210, 232, 8, 1, - 243, 61, 231, 210, 232, 8, 1, 248, 78, 231, 210, 232, 8, 1, 252, 64, 231, - 210, 232, 8, 1, 234, 140, 232, 255, 231, 210, 232, 8, 1, 233, 232, 232, - 255, 231, 210, 232, 8, 1, 231, 56, 232, 255, 231, 210, 232, 8, 1, 226, - 252, 232, 255, 231, 210, 232, 8, 1, 230, 115, 232, 255, 231, 210, 232, 8, - 1, 217, 58, 232, 255, 231, 210, 232, 8, 1, 229, 146, 232, 255, 231, 210, - 232, 8, 1, 241, 7, 232, 255, 231, 210, 232, 8, 30, 5, 227, 98, 231, 210, - 232, 8, 30, 5, 236, 110, 231, 210, 232, 8, 30, 5, 254, 158, 231, 210, - 232, 8, 30, 5, 213, 30, 231, 210, 232, 8, 30, 5, 219, 238, 231, 210, 232, - 8, 30, 5, 215, 163, 231, 210, 232, 8, 30, 5, 250, 183, 231, 210, 232, 8, - 30, 5, 228, 90, 231, 210, 232, 8, 250, 184, 231, 210, 232, 8, 232, 217, - 236, 9, 231, 210, 232, 8, 254, 87, 236, 9, 231, 210, 232, 8, 21, 212, 79, - 231, 210, 232, 8, 21, 118, 231, 210, 232, 8, 21, 112, 231, 210, 232, 8, - 21, 170, 231, 210, 232, 8, 21, 167, 231, 210, 232, 8, 21, 185, 231, 210, - 232, 8, 21, 192, 231, 210, 232, 8, 21, 200, 231, 210, 232, 8, 21, 198, - 231, 210, 232, 8, 21, 203, 24, 139, 227, 234, 24, 139, 227, 239, 24, 139, - 212, 235, 24, 139, 212, 234, 24, 139, 212, 233, 24, 139, 215, 252, 24, - 139, 215, 255, 24, 139, 212, 202, 24, 139, 212, 198, 24, 139, 245, 142, - 24, 139, 245, 140, 24, 139, 245, 141, 24, 139, 245, 138, 24, 139, 240, - 253, 24, 139, 240, 252, 24, 139, 240, 250, 24, 139, 240, 251, 24, 139, - 241, 0, 24, 139, 240, 249, 24, 139, 240, 248, 24, 139, 241, 2, 24, 139, - 254, 74, 24, 139, 254, 73, 24, 90, 229, 114, 24, 90, 229, 120, 24, 90, - 219, 157, 24, 90, 219, 156, 24, 90, 217, 63, 24, 90, 217, 61, 24, 90, - 217, 60, 24, 90, 217, 66, 24, 90, 217, 67, 24, 90, 217, 59, 24, 90, 223, - 192, 24, 90, 223, 207, 24, 90, 219, 163, 24, 90, 223, 204, 24, 90, 223, - 194, 24, 90, 223, 196, 24, 90, 223, 183, 24, 90, 223, 184, 24, 90, 235, - 80, 24, 90, 231, 95, 24, 90, 231, 89, 24, 90, 219, 167, 24, 90, 231, 92, - 24, 90, 231, 98, 24, 90, 225, 244, 24, 90, 225, 253, 24, 90, 226, 1, 24, - 90, 219, 165, 24, 90, 225, 247, 24, 90, 226, 5, 24, 90, 226, 6, 24, 90, - 220, 87, 24, 90, 220, 90, 24, 90, 219, 161, 24, 90, 219, 159, 24, 90, - 220, 85, 24, 90, 220, 93, 24, 90, 220, 94, 24, 90, 220, 79, 24, 90, 220, - 92, 24, 90, 226, 195, 24, 90, 226, 196, 24, 90, 213, 16, 24, 90, 213, 17, - 24, 90, 250, 104, 24, 90, 250, 103, 24, 90, 219, 172, 24, 90, 226, 40, - 24, 90, 226, 39, 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, - 9, 13, 238, 65, 9, 13, 238, 64, 9, 13, 238, 63, 9, 13, 238, 62, 9, 13, - 238, 61, 9, 13, 238, 60, 9, 13, 238, 59, 9, 13, 238, 58, 9, 13, 238, 57, - 9, 13, 238, 56, 9, 13, 238, 55, 9, 13, 238, 54, 9, 13, 238, 53, 9, 13, - 238, 52, 9, 13, 238, 51, 9, 13, 238, 50, 9, 13, 238, 49, 9, 13, 238, 48, - 9, 13, 238, 47, 9, 13, 238, 46, 9, 13, 238, 45, 9, 13, 238, 44, 9, 13, - 238, 43, 9, 13, 238, 42, 9, 13, 238, 41, 9, 13, 238, 40, 9, 13, 238, 39, - 9, 13, 238, 38, 9, 13, 238, 37, 9, 13, 238, 36, 9, 13, 238, 35, 9, 13, - 238, 34, 9, 13, 238, 33, 9, 13, 238, 32, 9, 13, 238, 31, 9, 13, 238, 30, - 9, 13, 238, 29, 9, 13, 238, 28, 9, 13, 238, 27, 9, 13, 238, 26, 9, 13, - 238, 25, 9, 13, 238, 24, 9, 13, 238, 23, 9, 13, 238, 22, 9, 13, 238, 21, - 9, 13, 238, 20, 9, 13, 238, 19, 9, 13, 238, 18, 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, 7, 4, - 26, 244, 214, 7, 4, 26, 244, 210, 7, 4, 26, 244, 165, 7, 4, 26, 244, 213, - 7, 4, 26, 244, 212, 7, 4, 26, 187, 223, 29, 218, 113, 7, 4, 26, 219, 121, - 146, 4, 26, 231, 193, 228, 193, 146, 4, 26, 231, 193, 246, 34, 146, 4, - 26, 231, 193, 236, 85, 146, 4, 26, 214, 162, 228, 193, 146, 4, 26, 231, - 193, 213, 151, 94, 1, 212, 226, 2, 242, 7, 94, 225, 181, 235, 167, 214, - 249, 94, 26, 212, 254, 212, 226, 212, 226, 226, 149, 94, 1, 254, 175, - 253, 205, 94, 1, 213, 235, 254, 205, 94, 1, 213, 235, 249, 0, 94, 1, 213, - 235, 242, 85, 94, 1, 213, 235, 235, 112, 94, 1, 213, 235, 233, 216, 94, - 1, 213, 235, 41, 231, 199, 94, 1, 213, 235, 223, 253, 94, 1, 213, 235, - 218, 2, 94, 1, 254, 175, 95, 53, 94, 1, 220, 222, 2, 220, 222, 247, 195, - 94, 1, 220, 222, 2, 220, 104, 247, 195, 94, 1, 220, 222, 2, 249, 17, 22, - 220, 222, 247, 195, 94, 1, 220, 222, 2, 249, 17, 22, 220, 104, 247, 195, - 94, 1, 108, 2, 226, 149, 94, 1, 108, 2, 224, 255, 94, 1, 108, 2, 232, 49, - 94, 1, 252, 76, 2, 249, 16, 94, 1, 243, 42, 2, 249, 16, 94, 1, 249, 1, 2, - 249, 16, 94, 1, 242, 86, 2, 232, 49, 94, 1, 214, 242, 2, 249, 16, 94, 1, - 212, 91, 2, 249, 16, 94, 1, 217, 197, 2, 249, 16, 94, 1, 212, 226, 2, - 249, 16, 94, 1, 41, 235, 113, 2, 249, 16, 94, 1, 235, 113, 2, 249, 16, - 94, 1, 233, 217, 2, 249, 16, 94, 1, 231, 200, 2, 249, 16, 94, 1, 228, 94, - 2, 249, 16, 94, 1, 222, 189, 2, 249, 16, 94, 1, 41, 226, 133, 2, 249, 16, - 94, 1, 226, 133, 2, 249, 16, 94, 1, 216, 151, 2, 249, 16, 94, 1, 224, - 220, 2, 249, 16, 94, 1, 223, 254, 2, 249, 16, 94, 1, 220, 222, 2, 249, - 16, 94, 1, 218, 3, 2, 249, 16, 94, 1, 214, 242, 2, 241, 166, 94, 1, 252, - 76, 2, 224, 94, 94, 1, 235, 113, 2, 224, 94, 94, 1, 226, 133, 2, 224, 94, - 94, 26, 108, 233, 216, 12, 1, 108, 214, 34, 49, 17, 12, 1, 108, 214, 34, - 41, 17, 12, 1, 252, 111, 49, 17, 12, 1, 252, 111, 41, 17, 12, 1, 252, - 111, 73, 17, 12, 1, 252, 111, 144, 17, 12, 1, 226, 117, 49, 17, 12, 1, - 226, 117, 41, 17, 12, 1, 226, 117, 73, 17, 12, 1, 226, 117, 144, 17, 12, - 1, 252, 99, 49, 17, 12, 1, 252, 99, 41, 17, 12, 1, 252, 99, 73, 17, 12, - 1, 252, 99, 144, 17, 12, 1, 216, 119, 49, 17, 12, 1, 216, 119, 41, 17, - 12, 1, 216, 119, 73, 17, 12, 1, 216, 119, 144, 17, 12, 1, 217, 227, 49, - 17, 12, 1, 217, 227, 41, 17, 12, 1, 217, 227, 73, 17, 12, 1, 217, 227, - 144, 17, 12, 1, 216, 121, 49, 17, 12, 1, 216, 121, 41, 17, 12, 1, 216, - 121, 73, 17, 12, 1, 216, 121, 144, 17, 12, 1, 214, 231, 49, 17, 12, 1, - 214, 231, 41, 17, 12, 1, 214, 231, 73, 17, 12, 1, 214, 231, 144, 17, 12, - 1, 226, 115, 49, 17, 12, 1, 226, 115, 41, 17, 12, 1, 226, 115, 73, 17, - 12, 1, 226, 115, 144, 17, 12, 1, 246, 120, 49, 17, 12, 1, 246, 120, 41, - 17, 12, 1, 246, 120, 73, 17, 12, 1, 246, 120, 144, 17, 12, 1, 228, 54, - 49, 17, 12, 1, 228, 54, 41, 17, 12, 1, 228, 54, 73, 17, 12, 1, 228, 54, - 144, 17, 12, 1, 217, 247, 49, 17, 12, 1, 217, 247, 41, 17, 12, 1, 217, - 247, 73, 17, 12, 1, 217, 247, 144, 17, 12, 1, 217, 245, 49, 17, 12, 1, - 217, 245, 41, 17, 12, 1, 217, 245, 73, 17, 12, 1, 217, 245, 144, 17, 12, - 1, 248, 205, 49, 17, 12, 1, 248, 205, 41, 17, 12, 1, 249, 13, 49, 17, 12, - 1, 249, 13, 41, 17, 12, 1, 246, 147, 49, 17, 12, 1, 246, 147, 41, 17, 12, - 1, 248, 203, 49, 17, 12, 1, 248, 203, 41, 17, 12, 1, 235, 237, 49, 17, - 12, 1, 235, 237, 41, 17, 12, 1, 223, 108, 49, 17, 12, 1, 223, 108, 41, - 17, 12, 1, 235, 37, 49, 17, 12, 1, 235, 37, 41, 17, 12, 1, 235, 37, 73, - 17, 12, 1, 235, 37, 144, 17, 12, 1, 243, 218, 49, 17, 12, 1, 243, 218, - 41, 17, 12, 1, 243, 218, 73, 17, 12, 1, 243, 218, 144, 17, 12, 1, 242, - 204, 49, 17, 12, 1, 242, 204, 41, 17, 12, 1, 242, 204, 73, 17, 12, 1, - 242, 204, 144, 17, 12, 1, 229, 154, 49, 17, 12, 1, 229, 154, 41, 17, 12, - 1, 229, 154, 73, 17, 12, 1, 229, 154, 144, 17, 12, 1, 228, 217, 243, 59, - 49, 17, 12, 1, 228, 217, 243, 59, 41, 17, 12, 1, 223, 150, 49, 17, 12, 1, - 223, 150, 41, 17, 12, 1, 223, 150, 73, 17, 12, 1, 223, 150, 144, 17, 12, - 1, 242, 66, 2, 76, 74, 49, 17, 12, 1, 242, 66, 2, 76, 74, 41, 17, 12, 1, - 242, 66, 243, 12, 49, 17, 12, 1, 242, 66, 243, 12, 41, 17, 12, 1, 242, - 66, 243, 12, 73, 17, 12, 1, 242, 66, 243, 12, 144, 17, 12, 1, 242, 66, - 247, 217, 49, 17, 12, 1, 242, 66, 247, 217, 41, 17, 12, 1, 242, 66, 247, - 217, 73, 17, 12, 1, 242, 66, 247, 217, 144, 17, 12, 1, 76, 252, 179, 49, - 17, 12, 1, 76, 252, 179, 41, 17, 12, 1, 76, 252, 179, 2, 194, 74, 49, 17, - 12, 1, 76, 252, 179, 2, 194, 74, 41, 17, 12, 16, 62, 50, 12, 16, 62, 55, - 12, 16, 119, 181, 50, 12, 16, 119, 181, 55, 12, 16, 137, 181, 50, 12, 16, - 137, 181, 55, 12, 16, 137, 181, 225, 177, 246, 179, 50, 12, 16, 137, 181, - 225, 177, 246, 179, 55, 12, 16, 244, 101, 181, 50, 12, 16, 244, 101, 181, - 55, 12, 16, 52, 66, 252, 187, 55, 12, 16, 119, 181, 214, 171, 50, 12, 16, - 119, 181, 214, 171, 55, 12, 16, 223, 164, 12, 16, 4, 218, 44, 50, 12, 16, - 4, 218, 44, 55, 12, 1, 229, 229, 49, 17, 12, 1, 229, 229, 41, 17, 12, 1, - 229, 229, 73, 17, 12, 1, 229, 229, 144, 17, 12, 1, 103, 49, 17, 12, 1, - 103, 41, 17, 12, 1, 227, 137, 49, 17, 12, 1, 227, 137, 41, 17, 12, 1, - 212, 205, 49, 17, 12, 1, 212, 205, 41, 17, 12, 1, 103, 2, 194, 74, 49, - 17, 12, 1, 214, 238, 49, 17, 12, 1, 214, 238, 41, 17, 12, 1, 234, 193, - 227, 137, 49, 17, 12, 1, 234, 193, 227, 137, 41, 17, 12, 1, 234, 193, - 212, 205, 49, 17, 12, 1, 234, 193, 212, 205, 41, 17, 12, 1, 154, 49, 17, - 12, 1, 154, 41, 17, 12, 1, 154, 73, 17, 12, 1, 154, 144, 17, 12, 1, 215, - 183, 235, 48, 234, 193, 108, 232, 71, 73, 17, 12, 1, 215, 183, 235, 48, - 234, 193, 108, 232, 71, 144, 17, 12, 26, 76, 2, 194, 74, 2, 108, 49, 17, - 12, 26, 76, 2, 194, 74, 2, 108, 41, 17, 12, 26, 76, 2, 194, 74, 2, 255, - 21, 49, 17, 12, 26, 76, 2, 194, 74, 2, 255, 21, 41, 17, 12, 26, 76, 2, - 194, 74, 2, 214, 18, 49, 17, 12, 26, 76, 2, 194, 74, 2, 214, 18, 41, 17, - 12, 26, 76, 2, 194, 74, 2, 103, 49, 17, 12, 26, 76, 2, 194, 74, 2, 103, - 41, 17, 12, 26, 76, 2, 194, 74, 2, 227, 137, 49, 17, 12, 26, 76, 2, 194, - 74, 2, 227, 137, 41, 17, 12, 26, 76, 2, 194, 74, 2, 212, 205, 49, 17, 12, - 26, 76, 2, 194, 74, 2, 212, 205, 41, 17, 12, 26, 76, 2, 194, 74, 2, 154, - 49, 17, 12, 26, 76, 2, 194, 74, 2, 154, 41, 17, 12, 26, 76, 2, 194, 74, - 2, 154, 73, 17, 12, 26, 215, 183, 234, 193, 76, 2, 194, 74, 2, 108, 232, - 71, 49, 17, 12, 26, 215, 183, 234, 193, 76, 2, 194, 74, 2, 108, 232, 71, - 41, 17, 12, 26, 215, 183, 234, 193, 76, 2, 194, 74, 2, 108, 232, 71, 73, - 17, 12, 1, 245, 1, 76, 49, 17, 12, 1, 245, 1, 76, 41, 17, 12, 1, 245, 1, - 76, 73, 17, 12, 1, 245, 1, 76, 144, 17, 12, 26, 76, 2, 194, 74, 2, 149, - 49, 17, 12, 26, 76, 2, 194, 74, 2, 123, 49, 17, 12, 26, 76, 2, 194, 74, - 2, 64, 49, 17, 12, 26, 76, 2, 194, 74, 2, 108, 232, 71, 49, 17, 12, 26, - 76, 2, 194, 74, 2, 76, 49, 17, 12, 26, 252, 101, 2, 149, 49, 17, 12, 26, - 252, 101, 2, 123, 49, 17, 12, 26, 252, 101, 2, 234, 248, 49, 17, 12, 26, - 252, 101, 2, 64, 49, 17, 12, 26, 252, 101, 2, 108, 232, 71, 49, 17, 12, - 26, 252, 101, 2, 76, 49, 17, 12, 26, 217, 229, 2, 149, 49, 17, 12, 26, - 217, 229, 2, 123, 49, 17, 12, 26, 217, 229, 2, 234, 248, 49, 17, 12, 26, - 217, 229, 2, 64, 49, 17, 12, 26, 217, 229, 2, 108, 232, 71, 49, 17, 12, - 26, 217, 229, 2, 76, 49, 17, 12, 26, 217, 159, 2, 149, 49, 17, 12, 26, - 217, 159, 2, 64, 49, 17, 12, 26, 217, 159, 2, 108, 232, 71, 49, 17, 12, - 26, 217, 159, 2, 76, 49, 17, 12, 26, 149, 2, 123, 49, 17, 12, 26, 149, 2, - 64, 49, 17, 12, 26, 123, 2, 149, 49, 17, 12, 26, 123, 2, 64, 49, 17, 12, - 26, 234, 248, 2, 149, 49, 17, 12, 26, 234, 248, 2, 123, 49, 17, 12, 26, - 234, 248, 2, 64, 49, 17, 12, 26, 222, 109, 2, 149, 49, 17, 12, 26, 222, - 109, 2, 123, 49, 17, 12, 26, 222, 109, 2, 234, 248, 49, 17, 12, 26, 222, - 109, 2, 64, 49, 17, 12, 26, 222, 221, 2, 123, 49, 17, 12, 26, 222, 221, - 2, 64, 49, 17, 12, 26, 249, 26, 2, 149, 49, 17, 12, 26, 249, 26, 2, 123, - 49, 17, 12, 26, 249, 26, 2, 234, 248, 49, 17, 12, 26, 249, 26, 2, 64, 49, - 17, 12, 26, 218, 44, 2, 123, 49, 17, 12, 26, 218, 44, 2, 64, 49, 17, 12, - 26, 212, 105, 2, 64, 49, 17, 12, 26, 254, 232, 2, 149, 49, 17, 12, 26, - 254, 232, 2, 64, 49, 17, 12, 26, 243, 85, 2, 149, 49, 17, 12, 26, 243, - 85, 2, 64, 49, 17, 12, 26, 244, 232, 2, 149, 49, 17, 12, 26, 244, 232, 2, - 123, 49, 17, 12, 26, 244, 232, 2, 234, 248, 49, 17, 12, 26, 244, 232, 2, - 64, 49, 17, 12, 26, 244, 232, 2, 108, 232, 71, 49, 17, 12, 26, 244, 232, - 2, 76, 49, 17, 12, 26, 225, 5, 2, 123, 49, 17, 12, 26, 225, 5, 2, 64, 49, - 17, 12, 26, 225, 5, 2, 108, 232, 71, 49, 17, 12, 26, 225, 5, 2, 76, 49, - 17, 12, 26, 235, 113, 2, 108, 49, 17, 12, 26, 235, 113, 2, 149, 49, 17, - 12, 26, 235, 113, 2, 123, 49, 17, 12, 26, 235, 113, 2, 234, 248, 49, 17, - 12, 26, 235, 113, 2, 233, 225, 49, 17, 12, 26, 235, 113, 2, 64, 49, 17, - 12, 26, 235, 113, 2, 108, 232, 71, 49, 17, 12, 26, 235, 113, 2, 76, 49, - 17, 12, 26, 233, 225, 2, 149, 49, 17, 12, 26, 233, 225, 2, 123, 49, 17, - 12, 26, 233, 225, 2, 234, 248, 49, 17, 12, 26, 233, 225, 2, 64, 49, 17, - 12, 26, 233, 225, 2, 108, 232, 71, 49, 17, 12, 26, 233, 225, 2, 76, 49, - 17, 12, 26, 64, 2, 149, 49, 17, 12, 26, 64, 2, 123, 49, 17, 12, 26, 64, - 2, 234, 248, 49, 17, 12, 26, 64, 2, 64, 49, 17, 12, 26, 64, 2, 108, 232, - 71, 49, 17, 12, 26, 64, 2, 76, 49, 17, 12, 26, 228, 217, 2, 149, 49, 17, - 12, 26, 228, 217, 2, 123, 49, 17, 12, 26, 228, 217, 2, 234, 248, 49, 17, - 12, 26, 228, 217, 2, 64, 49, 17, 12, 26, 228, 217, 2, 108, 232, 71, 49, - 17, 12, 26, 228, 217, 2, 76, 49, 17, 12, 26, 242, 66, 2, 149, 49, 17, 12, - 26, 242, 66, 2, 64, 49, 17, 12, 26, 242, 66, 2, 108, 232, 71, 49, 17, 12, - 26, 242, 66, 2, 76, 49, 17, 12, 26, 76, 2, 149, 49, 17, 12, 26, 76, 2, - 123, 49, 17, 12, 26, 76, 2, 234, 248, 49, 17, 12, 26, 76, 2, 64, 49, 17, - 12, 26, 76, 2, 108, 232, 71, 49, 17, 12, 26, 76, 2, 76, 49, 17, 12, 26, - 217, 169, 2, 218, 237, 108, 49, 17, 12, 26, 224, 24, 2, 218, 237, 108, - 49, 17, 12, 26, 108, 232, 71, 2, 218, 237, 108, 49, 17, 12, 26, 221, 39, - 2, 248, 250, 49, 17, 12, 26, 221, 39, 2, 235, 66, 49, 17, 12, 26, 221, - 39, 2, 244, 255, 49, 17, 12, 26, 221, 39, 2, 248, 252, 49, 17, 12, 26, - 221, 39, 2, 235, 68, 49, 17, 12, 26, 221, 39, 2, 218, 237, 108, 49, 17, - 12, 26, 76, 2, 194, 74, 2, 224, 24, 41, 17, 12, 26, 76, 2, 194, 74, 2, - 212, 102, 41, 17, 12, 26, 76, 2, 194, 74, 2, 64, 41, 17, 12, 26, 76, 2, - 194, 74, 2, 228, 217, 41, 17, 12, 26, 76, 2, 194, 74, 2, 108, 232, 71, - 41, 17, 12, 26, 76, 2, 194, 74, 2, 76, 41, 17, 12, 26, 252, 101, 2, 224, - 24, 41, 17, 12, 26, 252, 101, 2, 212, 102, 41, 17, 12, 26, 252, 101, 2, - 64, 41, 17, 12, 26, 252, 101, 2, 228, 217, 41, 17, 12, 26, 252, 101, 2, - 108, 232, 71, 41, 17, 12, 26, 252, 101, 2, 76, 41, 17, 12, 26, 217, 229, - 2, 224, 24, 41, 17, 12, 26, 217, 229, 2, 212, 102, 41, 17, 12, 26, 217, - 229, 2, 64, 41, 17, 12, 26, 217, 229, 2, 228, 217, 41, 17, 12, 26, 217, - 229, 2, 108, 232, 71, 41, 17, 12, 26, 217, 229, 2, 76, 41, 17, 12, 26, - 217, 159, 2, 224, 24, 41, 17, 12, 26, 217, 159, 2, 212, 102, 41, 17, 12, - 26, 217, 159, 2, 64, 41, 17, 12, 26, 217, 159, 2, 228, 217, 41, 17, 12, - 26, 217, 159, 2, 108, 232, 71, 41, 17, 12, 26, 217, 159, 2, 76, 41, 17, - 12, 26, 244, 232, 2, 108, 232, 71, 41, 17, 12, 26, 244, 232, 2, 76, 41, - 17, 12, 26, 225, 5, 2, 108, 232, 71, 41, 17, 12, 26, 225, 5, 2, 76, 41, - 17, 12, 26, 235, 113, 2, 108, 41, 17, 12, 26, 235, 113, 2, 233, 225, 41, - 17, 12, 26, 235, 113, 2, 64, 41, 17, 12, 26, 235, 113, 2, 108, 232, 71, - 41, 17, 12, 26, 235, 113, 2, 76, 41, 17, 12, 26, 233, 225, 2, 64, 41, 17, - 12, 26, 233, 225, 2, 108, 232, 71, 41, 17, 12, 26, 233, 225, 2, 76, 41, - 17, 12, 26, 64, 2, 108, 41, 17, 12, 26, 64, 2, 64, 41, 17, 12, 26, 228, - 217, 2, 224, 24, 41, 17, 12, 26, 228, 217, 2, 212, 102, 41, 17, 12, 26, - 228, 217, 2, 64, 41, 17, 12, 26, 228, 217, 2, 228, 217, 41, 17, 12, 26, - 228, 217, 2, 108, 232, 71, 41, 17, 12, 26, 228, 217, 2, 76, 41, 17, 12, - 26, 108, 232, 71, 2, 218, 237, 108, 41, 17, 12, 26, 76, 2, 224, 24, 41, - 17, 12, 26, 76, 2, 212, 102, 41, 17, 12, 26, 76, 2, 64, 41, 17, 12, 26, - 76, 2, 228, 217, 41, 17, 12, 26, 76, 2, 108, 232, 71, 41, 17, 12, 26, 76, - 2, 76, 41, 17, 12, 26, 76, 2, 194, 74, 2, 149, 73, 17, 12, 26, 76, 2, - 194, 74, 2, 123, 73, 17, 12, 26, 76, 2, 194, 74, 2, 234, 248, 73, 17, 12, - 26, 76, 2, 194, 74, 2, 64, 73, 17, 12, 26, 76, 2, 194, 74, 2, 242, 66, - 73, 17, 12, 26, 252, 101, 2, 149, 73, 17, 12, 26, 252, 101, 2, 123, 73, - 17, 12, 26, 252, 101, 2, 234, 248, 73, 17, 12, 26, 252, 101, 2, 64, 73, - 17, 12, 26, 252, 101, 2, 242, 66, 73, 17, 12, 26, 217, 229, 2, 149, 73, - 17, 12, 26, 217, 229, 2, 123, 73, 17, 12, 26, 217, 229, 2, 234, 248, 73, - 17, 12, 26, 217, 229, 2, 64, 73, 17, 12, 26, 217, 229, 2, 242, 66, 73, - 17, 12, 26, 217, 159, 2, 64, 73, 17, 12, 26, 149, 2, 123, 73, 17, 12, 26, - 149, 2, 64, 73, 17, 12, 26, 123, 2, 149, 73, 17, 12, 26, 123, 2, 64, 73, - 17, 12, 26, 234, 248, 2, 149, 73, 17, 12, 26, 234, 248, 2, 64, 73, 17, - 12, 26, 222, 109, 2, 149, 73, 17, 12, 26, 222, 109, 2, 123, 73, 17, 12, - 26, 222, 109, 2, 234, 248, 73, 17, 12, 26, 222, 109, 2, 64, 73, 17, 12, - 26, 222, 221, 2, 123, 73, 17, 12, 26, 222, 221, 2, 234, 248, 73, 17, 12, - 26, 222, 221, 2, 64, 73, 17, 12, 26, 249, 26, 2, 149, 73, 17, 12, 26, - 249, 26, 2, 123, 73, 17, 12, 26, 249, 26, 2, 234, 248, 73, 17, 12, 26, - 249, 26, 2, 64, 73, 17, 12, 26, 218, 44, 2, 123, 73, 17, 12, 26, 212, - 105, 2, 64, 73, 17, 12, 26, 254, 232, 2, 149, 73, 17, 12, 26, 254, 232, - 2, 64, 73, 17, 12, 26, 243, 85, 2, 149, 73, 17, 12, 26, 243, 85, 2, 64, - 73, 17, 12, 26, 244, 232, 2, 149, 73, 17, 12, 26, 244, 232, 2, 123, 73, - 17, 12, 26, 244, 232, 2, 234, 248, 73, 17, 12, 26, 244, 232, 2, 64, 73, - 17, 12, 26, 225, 5, 2, 123, 73, 17, 12, 26, 225, 5, 2, 64, 73, 17, 12, - 26, 235, 113, 2, 149, 73, 17, 12, 26, 235, 113, 2, 123, 73, 17, 12, 26, - 235, 113, 2, 234, 248, 73, 17, 12, 26, 235, 113, 2, 233, 225, 73, 17, 12, - 26, 235, 113, 2, 64, 73, 17, 12, 26, 233, 225, 2, 149, 73, 17, 12, 26, - 233, 225, 2, 123, 73, 17, 12, 26, 233, 225, 2, 234, 248, 73, 17, 12, 26, - 233, 225, 2, 64, 73, 17, 12, 26, 233, 225, 2, 242, 66, 73, 17, 12, 26, - 64, 2, 149, 73, 17, 12, 26, 64, 2, 123, 73, 17, 12, 26, 64, 2, 234, 248, - 73, 17, 12, 26, 64, 2, 64, 73, 17, 12, 26, 228, 217, 2, 149, 73, 17, 12, - 26, 228, 217, 2, 123, 73, 17, 12, 26, 228, 217, 2, 234, 248, 73, 17, 12, - 26, 228, 217, 2, 64, 73, 17, 12, 26, 228, 217, 2, 242, 66, 73, 17, 12, - 26, 242, 66, 2, 149, 73, 17, 12, 26, 242, 66, 2, 64, 73, 17, 12, 26, 242, - 66, 2, 218, 237, 108, 73, 17, 12, 26, 76, 2, 149, 73, 17, 12, 26, 76, 2, - 123, 73, 17, 12, 26, 76, 2, 234, 248, 73, 17, 12, 26, 76, 2, 64, 73, 17, - 12, 26, 76, 2, 242, 66, 73, 17, 12, 26, 76, 2, 194, 74, 2, 64, 144, 17, - 12, 26, 76, 2, 194, 74, 2, 242, 66, 144, 17, 12, 26, 252, 101, 2, 64, - 144, 17, 12, 26, 252, 101, 2, 242, 66, 144, 17, 12, 26, 217, 229, 2, 64, - 144, 17, 12, 26, 217, 229, 2, 242, 66, 144, 17, 12, 26, 217, 159, 2, 64, - 144, 17, 12, 26, 217, 159, 2, 242, 66, 144, 17, 12, 26, 222, 109, 2, 64, - 144, 17, 12, 26, 222, 109, 2, 242, 66, 144, 17, 12, 26, 221, 5, 2, 64, - 144, 17, 12, 26, 221, 5, 2, 242, 66, 144, 17, 12, 26, 235, 113, 2, 233, - 225, 144, 17, 12, 26, 235, 113, 2, 64, 144, 17, 12, 26, 233, 225, 2, 64, - 144, 17, 12, 26, 228, 217, 2, 64, 144, 17, 12, 26, 228, 217, 2, 242, 66, - 144, 17, 12, 26, 76, 2, 64, 144, 17, 12, 26, 76, 2, 242, 66, 144, 17, 12, - 26, 221, 39, 2, 244, 255, 144, 17, 12, 26, 221, 39, 2, 248, 252, 144, 17, - 12, 26, 221, 39, 2, 235, 68, 144, 17, 12, 26, 218, 44, 2, 108, 232, 71, - 49, 17, 12, 26, 218, 44, 2, 76, 49, 17, 12, 26, 254, 232, 2, 108, 232, - 71, 49, 17, 12, 26, 254, 232, 2, 76, 49, 17, 12, 26, 243, 85, 2, 108, - 232, 71, 49, 17, 12, 26, 243, 85, 2, 76, 49, 17, 12, 26, 222, 109, 2, - 108, 232, 71, 49, 17, 12, 26, 222, 109, 2, 76, 49, 17, 12, 26, 221, 5, 2, - 108, 232, 71, 49, 17, 12, 26, 221, 5, 2, 76, 49, 17, 12, 26, 123, 2, 108, - 232, 71, 49, 17, 12, 26, 123, 2, 76, 49, 17, 12, 26, 149, 2, 108, 232, - 71, 49, 17, 12, 26, 149, 2, 76, 49, 17, 12, 26, 234, 248, 2, 108, 232, - 71, 49, 17, 12, 26, 234, 248, 2, 76, 49, 17, 12, 26, 222, 221, 2, 108, - 232, 71, 49, 17, 12, 26, 222, 221, 2, 76, 49, 17, 12, 26, 249, 26, 2, - 108, 232, 71, 49, 17, 12, 26, 249, 26, 2, 76, 49, 17, 12, 26, 221, 5, 2, - 149, 49, 17, 12, 26, 221, 5, 2, 123, 49, 17, 12, 26, 221, 5, 2, 234, 248, - 49, 17, 12, 26, 221, 5, 2, 64, 49, 17, 12, 26, 221, 5, 2, 224, 24, 49, - 17, 12, 26, 222, 109, 2, 224, 24, 49, 17, 12, 26, 222, 221, 2, 224, 24, - 49, 17, 12, 26, 249, 26, 2, 224, 24, 49, 17, 12, 26, 218, 44, 2, 108, - 232, 71, 41, 17, 12, 26, 218, 44, 2, 76, 41, 17, 12, 26, 254, 232, 2, - 108, 232, 71, 41, 17, 12, 26, 254, 232, 2, 76, 41, 17, 12, 26, 243, 85, - 2, 108, 232, 71, 41, 17, 12, 26, 243, 85, 2, 76, 41, 17, 12, 26, 222, - 109, 2, 108, 232, 71, 41, 17, 12, 26, 222, 109, 2, 76, 41, 17, 12, 26, - 221, 5, 2, 108, 232, 71, 41, 17, 12, 26, 221, 5, 2, 76, 41, 17, 12, 26, - 123, 2, 108, 232, 71, 41, 17, 12, 26, 123, 2, 76, 41, 17, 12, 26, 149, 2, - 108, 232, 71, 41, 17, 12, 26, 149, 2, 76, 41, 17, 12, 26, 234, 248, 2, - 108, 232, 71, 41, 17, 12, 26, 234, 248, 2, 76, 41, 17, 12, 26, 222, 221, - 2, 108, 232, 71, 41, 17, 12, 26, 222, 221, 2, 76, 41, 17, 12, 26, 249, - 26, 2, 108, 232, 71, 41, 17, 12, 26, 249, 26, 2, 76, 41, 17, 12, 26, 221, - 5, 2, 149, 41, 17, 12, 26, 221, 5, 2, 123, 41, 17, 12, 26, 221, 5, 2, - 234, 248, 41, 17, 12, 26, 221, 5, 2, 64, 41, 17, 12, 26, 221, 5, 2, 224, - 24, 41, 17, 12, 26, 222, 109, 2, 224, 24, 41, 17, 12, 26, 222, 221, 2, - 224, 24, 41, 17, 12, 26, 249, 26, 2, 224, 24, 41, 17, 12, 26, 221, 5, 2, - 149, 73, 17, 12, 26, 221, 5, 2, 123, 73, 17, 12, 26, 221, 5, 2, 234, 248, - 73, 17, 12, 26, 221, 5, 2, 64, 73, 17, 12, 26, 222, 109, 2, 242, 66, 73, - 17, 12, 26, 221, 5, 2, 242, 66, 73, 17, 12, 26, 218, 44, 2, 64, 73, 17, - 12, 26, 222, 109, 2, 149, 144, 17, 12, 26, 222, 109, 2, 123, 144, 17, 12, - 26, 222, 109, 2, 234, 248, 144, 17, 12, 26, 221, 5, 2, 149, 144, 17, 12, - 26, 221, 5, 2, 123, 144, 17, 12, 26, 221, 5, 2, 234, 248, 144, 17, 12, - 26, 218, 44, 2, 64, 144, 17, 12, 26, 212, 105, 2, 64, 144, 17, 12, 26, - 108, 2, 244, 253, 41, 17, 12, 26, 108, 2, 244, 253, 49, 17, 227, 51, 43, - 226, 168, 227, 51, 47, 226, 168, 12, 26, 217, 229, 2, 149, 2, 64, 73, 17, - 12, 26, 217, 229, 2, 123, 2, 149, 41, 17, 12, 26, 217, 229, 2, 123, 2, - 149, 73, 17, 12, 26, 217, 229, 2, 123, 2, 64, 73, 17, 12, 26, 217, 229, - 2, 234, 248, 2, 64, 73, 17, 12, 26, 217, 229, 2, 64, 2, 149, 73, 17, 12, - 26, 217, 229, 2, 64, 2, 123, 73, 17, 12, 26, 217, 229, 2, 64, 2, 234, - 248, 73, 17, 12, 26, 149, 2, 64, 2, 123, 41, 17, 12, 26, 149, 2, 64, 2, - 123, 73, 17, 12, 26, 123, 2, 64, 2, 76, 41, 17, 12, 26, 123, 2, 64, 2, - 108, 232, 71, 41, 17, 12, 26, 222, 109, 2, 123, 2, 149, 73, 17, 12, 26, - 222, 109, 2, 149, 2, 123, 73, 17, 12, 26, 222, 109, 2, 149, 2, 108, 232, - 71, 41, 17, 12, 26, 222, 109, 2, 64, 2, 123, 41, 17, 12, 26, 222, 109, 2, - 64, 2, 123, 73, 17, 12, 26, 222, 109, 2, 64, 2, 149, 73, 17, 12, 26, 222, - 109, 2, 64, 2, 64, 41, 17, 12, 26, 222, 109, 2, 64, 2, 64, 73, 17, 12, - 26, 222, 221, 2, 123, 2, 123, 41, 17, 12, 26, 222, 221, 2, 123, 2, 123, - 73, 17, 12, 26, 222, 221, 2, 64, 2, 64, 41, 17, 12, 26, 221, 5, 2, 123, - 2, 64, 41, 17, 12, 26, 221, 5, 2, 123, 2, 64, 73, 17, 12, 26, 221, 5, 2, - 149, 2, 76, 41, 17, 12, 26, 221, 5, 2, 64, 2, 234, 248, 41, 17, 12, 26, - 221, 5, 2, 64, 2, 234, 248, 73, 17, 12, 26, 221, 5, 2, 64, 2, 64, 41, 17, - 12, 26, 221, 5, 2, 64, 2, 64, 73, 17, 12, 26, 249, 26, 2, 123, 2, 108, - 232, 71, 41, 17, 12, 26, 249, 26, 2, 234, 248, 2, 64, 41, 17, 12, 26, - 249, 26, 2, 234, 248, 2, 64, 73, 17, 12, 26, 218, 44, 2, 64, 2, 123, 41, - 17, 12, 26, 218, 44, 2, 64, 2, 123, 73, 17, 12, 26, 218, 44, 2, 64, 2, - 64, 73, 17, 12, 26, 218, 44, 2, 64, 2, 76, 41, 17, 12, 26, 254, 232, 2, - 149, 2, 64, 41, 17, 12, 26, 254, 232, 2, 64, 2, 64, 41, 17, 12, 26, 254, - 232, 2, 64, 2, 64, 73, 17, 12, 26, 254, 232, 2, 64, 2, 108, 232, 71, 41, - 17, 12, 26, 243, 85, 2, 64, 2, 64, 41, 17, 12, 26, 243, 85, 2, 64, 2, 76, - 41, 17, 12, 26, 243, 85, 2, 64, 2, 108, 232, 71, 41, 17, 12, 26, 244, - 232, 2, 234, 248, 2, 64, 41, 17, 12, 26, 244, 232, 2, 234, 248, 2, 64, - 73, 17, 12, 26, 225, 5, 2, 64, 2, 123, 41, 17, 12, 26, 225, 5, 2, 64, 2, - 64, 41, 17, 12, 26, 233, 225, 2, 123, 2, 64, 41, 17, 12, 26, 233, 225, 2, - 123, 2, 76, 41, 17, 12, 26, 233, 225, 2, 123, 2, 108, 232, 71, 41, 17, - 12, 26, 233, 225, 2, 149, 2, 149, 73, 17, 12, 26, 233, 225, 2, 149, 2, - 149, 41, 17, 12, 26, 233, 225, 2, 234, 248, 2, 64, 41, 17, 12, 26, 233, - 225, 2, 234, 248, 2, 64, 73, 17, 12, 26, 233, 225, 2, 64, 2, 123, 41, 17, - 12, 26, 233, 225, 2, 64, 2, 123, 73, 17, 12, 26, 64, 2, 123, 2, 149, 73, - 17, 12, 26, 64, 2, 123, 2, 64, 73, 17, 12, 26, 64, 2, 123, 2, 76, 41, 17, - 12, 26, 64, 2, 149, 2, 123, 73, 17, 12, 26, 64, 2, 149, 2, 64, 73, 17, - 12, 26, 64, 2, 234, 248, 2, 149, 73, 17, 12, 26, 64, 2, 234, 248, 2, 64, - 73, 17, 12, 26, 64, 2, 149, 2, 234, 248, 73, 17, 12, 26, 242, 66, 2, 64, - 2, 149, 73, 17, 12, 26, 242, 66, 2, 64, 2, 64, 73, 17, 12, 26, 228, 217, - 2, 123, 2, 64, 73, 17, 12, 26, 228, 217, 2, 123, 2, 108, 232, 71, 41, 17, - 12, 26, 228, 217, 2, 149, 2, 64, 41, 17, 12, 26, 228, 217, 2, 149, 2, 64, - 73, 17, 12, 26, 228, 217, 2, 149, 2, 108, 232, 71, 41, 17, 12, 26, 228, - 217, 2, 64, 2, 76, 41, 17, 12, 26, 228, 217, 2, 64, 2, 108, 232, 71, 41, - 17, 12, 26, 76, 2, 64, 2, 64, 41, 17, 12, 26, 76, 2, 64, 2, 64, 73, 17, - 12, 26, 252, 101, 2, 234, 248, 2, 76, 41, 17, 12, 26, 217, 229, 2, 149, - 2, 76, 41, 17, 12, 26, 217, 229, 2, 149, 2, 108, 232, 71, 41, 17, 12, 26, - 217, 229, 2, 234, 248, 2, 76, 41, 17, 12, 26, 217, 229, 2, 234, 248, 2, - 108, 232, 71, 41, 17, 12, 26, 217, 229, 2, 64, 2, 76, 41, 17, 12, 26, - 217, 229, 2, 64, 2, 108, 232, 71, 41, 17, 12, 26, 149, 2, 64, 2, 76, 41, - 17, 12, 26, 149, 2, 123, 2, 108, 232, 71, 41, 17, 12, 26, 149, 2, 64, 2, - 108, 232, 71, 41, 17, 12, 26, 222, 109, 2, 234, 248, 2, 108, 232, 71, 41, - 17, 12, 26, 222, 221, 2, 123, 2, 76, 41, 17, 12, 26, 221, 5, 2, 123, 2, - 76, 41, 17, 12, 26, 249, 26, 2, 123, 2, 76, 41, 17, 12, 26, 233, 225, 2, - 149, 2, 76, 41, 17, 12, 26, 233, 225, 2, 64, 2, 76, 41, 17, 12, 26, 76, - 2, 123, 2, 76, 41, 17, 12, 26, 76, 2, 149, 2, 76, 41, 17, 12, 26, 76, 2, - 64, 2, 76, 41, 17, 12, 26, 64, 2, 64, 2, 76, 41, 17, 12, 26, 225, 5, 2, - 64, 2, 76, 41, 17, 12, 26, 228, 217, 2, 123, 2, 76, 41, 17, 12, 26, 225, - 5, 2, 64, 2, 123, 73, 17, 12, 26, 233, 225, 2, 123, 2, 64, 73, 17, 12, - 26, 254, 232, 2, 64, 2, 76, 41, 17, 12, 26, 235, 113, 2, 64, 2, 76, 41, - 17, 12, 26, 228, 217, 2, 149, 2, 123, 73, 17, 12, 26, 64, 2, 234, 248, 2, - 76, 41, 17, 12, 26, 233, 225, 2, 149, 2, 64, 73, 17, 12, 26, 235, 113, 2, - 64, 2, 64, 41, 17, 12, 26, 233, 225, 2, 149, 2, 64, 41, 17, 12, 26, 228, - 217, 2, 149, 2, 123, 41, 17, 12, 26, 149, 2, 123, 2, 76, 41, 17, 12, 26, - 123, 2, 149, 2, 76, 41, 17, 12, 26, 64, 2, 149, 2, 76, 41, 17, 12, 26, - 244, 232, 2, 64, 2, 76, 41, 17, 12, 26, 252, 101, 2, 123, 2, 76, 41, 17, - 12, 26, 235, 113, 2, 64, 2, 64, 73, 17, 12, 26, 254, 232, 2, 149, 2, 64, - 73, 17, 12, 26, 222, 221, 2, 64, 2, 64, 73, 17, 12, 26, 222, 109, 2, 234, - 248, 2, 76, 41, 17, 12, 26, 228, 217, 2, 149, 2, 76, 41, 17, 12, 26, 222, - 199, 215, 108, 254, 24, 234, 124, 219, 84, 5, 49, 17, 12, 26, 225, 1, - 215, 108, 254, 24, 234, 124, 219, 84, 5, 49, 17, 12, 26, 254, 189, 49, - 17, 12, 26, 254, 218, 49, 17, 12, 26, 231, 37, 49, 17, 12, 26, 222, 200, - 49, 17, 12, 26, 224, 70, 49, 17, 12, 26, 254, 207, 49, 17, 12, 26, 214, - 36, 49, 17, 12, 26, 222, 199, 49, 17, 12, 26, 222, 198, 254, 207, 214, - 35, 12, 26, 235, 250, 223, 221, 53, 12, 26, 252, 22, 254, 80, 254, 81, - 44, 222, 99, 44, 221, 244, 44, 221, 176, 44, 221, 165, 44, 221, 154, 44, - 221, 143, 44, 221, 132, 44, 221, 121, 44, 221, 110, 44, 222, 98, 44, 222, - 87, 44, 222, 76, 44, 222, 65, 44, 222, 54, 44, 222, 43, 44, 222, 32, 225, - 110, 244, 109, 31, 66, 250, 23, 225, 110, 244, 109, 31, 66, 107, 250, 23, - 225, 110, 244, 109, 31, 66, 107, 244, 64, 219, 83, 225, 110, 244, 109, - 31, 66, 250, 30, 225, 110, 244, 109, 31, 66, 221, 93, 225, 110, 244, 109, - 31, 66, 245, 119, 79, 225, 110, 244, 109, 31, 66, 224, 193, 79, 225, 110, - 244, 109, 31, 66, 43, 69, 233, 142, 125, 225, 110, 244, 109, 31, 66, 47, - 69, 233, 142, 251, 208, 225, 110, 244, 109, 31, 66, 201, 245, 241, 38, - 26, 43, 242, 129, 38, 26, 47, 242, 129, 38, 52, 217, 56, 43, 242, 129, - 38, 52, 217, 56, 47, 242, 129, 38, 232, 111, 43, 242, 129, 38, 232, 111, - 47, 242, 129, 38, 250, 3, 232, 110, 225, 110, 244, 109, 31, 66, 119, 62, - 233, 178, 225, 110, 244, 109, 31, 66, 245, 239, 248, 223, 225, 110, 244, - 109, 31, 66, 245, 230, 248, 223, 225, 110, 244, 109, 31, 66, 117, 233, - 83, 225, 110, 244, 109, 31, 66, 214, 19, 117, 233, 83, 225, 110, 244, - 109, 31, 66, 43, 226, 168, 225, 110, 244, 109, 31, 66, 47, 226, 168, 225, - 110, 244, 109, 31, 66, 43, 249, 163, 125, 225, 110, 244, 109, 31, 66, 47, - 249, 163, 125, 225, 110, 244, 109, 31, 66, 43, 216, 232, 220, 254, 125, - 225, 110, 244, 109, 31, 66, 47, 216, 232, 220, 254, 125, 225, 110, 244, - 109, 31, 66, 43, 85, 233, 142, 125, 225, 110, 244, 109, 31, 66, 47, 85, - 233, 142, 125, 225, 110, 244, 109, 31, 66, 43, 52, 254, 146, 125, 225, - 110, 244, 109, 31, 66, 47, 52, 254, 146, 125, 225, 110, 244, 109, 31, 66, - 43, 254, 146, 125, 225, 110, 244, 109, 31, 66, 47, 254, 146, 125, 225, - 110, 244, 109, 31, 66, 43, 249, 223, 125, 225, 110, 244, 109, 31, 66, 47, - 249, 223, 125, 225, 110, 244, 109, 31, 66, 43, 69, 249, 223, 125, 225, - 110, 244, 109, 31, 66, 47, 69, 249, 223, 125, 221, 75, 247, 195, 69, 221, - 75, 247, 195, 225, 110, 244, 109, 31, 66, 43, 42, 125, 225, 110, 244, - 109, 31, 66, 47, 42, 125, 248, 222, 227, 25, 250, 229, 227, 25, 214, 19, - 227, 25, 52, 214, 19, 227, 25, 248, 222, 117, 233, 83, 250, 229, 117, - 233, 83, 214, 19, 117, 233, 83, 4, 250, 23, 4, 107, 250, 23, 4, 244, 64, - 219, 83, 4, 221, 93, 4, 250, 30, 4, 224, 193, 79, 4, 245, 119, 79, 4, - 245, 239, 248, 223, 4, 43, 226, 168, 4, 47, 226, 168, 4, 43, 249, 163, - 125, 4, 47, 249, 163, 125, 4, 43, 216, 232, 220, 254, 125, 4, 47, 216, - 232, 220, 254, 125, 4, 51, 53, 4, 254, 162, 4, 254, 3, 4, 95, 53, 4, 241, - 20, 4, 233, 137, 53, 4, 242, 228, 53, 4, 245, 182, 53, 4, 223, 237, 219, - 250, 4, 247, 207, 53, 4, 226, 93, 53, 4, 250, 22, 253, 249, 12, 244, 253, - 49, 17, 12, 218, 8, 2, 244, 253, 50, 12, 248, 250, 49, 17, 12, 218, 41, - 244, 91, 12, 235, 66, 49, 17, 12, 244, 255, 49, 17, 12, 244, 255, 144, - 17, 12, 248, 252, 49, 17, 12, 248, 252, 144, 17, 12, 235, 68, 49, 17, 12, - 235, 68, 144, 17, 12, 221, 39, 49, 17, 12, 221, 39, 144, 17, 12, 219, 5, - 49, 17, 12, 219, 5, 144, 17, 12, 1, 194, 49, 17, 12, 1, 108, 2, 232, 106, - 74, 49, 17, 12, 1, 108, 2, 232, 106, 74, 41, 17, 12, 1, 108, 2, 194, 74, - 49, 17, 12, 1, 108, 2, 194, 74, 41, 17, 12, 1, 214, 18, 2, 194, 74, 49, - 17, 12, 1, 214, 18, 2, 194, 74, 41, 17, 12, 1, 108, 2, 194, 252, 90, 49, - 17, 12, 1, 108, 2, 194, 252, 90, 41, 17, 12, 1, 76, 2, 194, 74, 49, 17, - 12, 1, 76, 2, 194, 74, 41, 17, 12, 1, 76, 2, 194, 74, 73, 17, 12, 1, 76, - 2, 194, 74, 144, 17, 12, 1, 108, 49, 17, 12, 1, 108, 41, 17, 12, 1, 252, - 101, 49, 17, 12, 1, 252, 101, 41, 17, 12, 1, 252, 101, 73, 17, 12, 1, - 252, 101, 144, 17, 12, 1, 217, 229, 232, 43, 49, 17, 12, 1, 217, 229, - 232, 43, 41, 17, 12, 1, 217, 229, 49, 17, 12, 1, 217, 229, 41, 17, 12, 1, - 217, 229, 73, 17, 12, 1, 217, 229, 144, 17, 12, 1, 217, 159, 49, 17, 12, - 1, 217, 159, 41, 17, 12, 1, 217, 159, 73, 17, 12, 1, 217, 159, 144, 17, - 12, 1, 149, 49, 17, 12, 1, 149, 41, 17, 12, 1, 149, 73, 17, 12, 1, 149, - 144, 17, 12, 1, 123, 49, 17, 12, 1, 123, 41, 17, 12, 1, 123, 73, 17, 12, - 1, 123, 144, 17, 12, 1, 234, 248, 49, 17, 12, 1, 234, 248, 41, 17, 12, 1, - 234, 248, 73, 17, 12, 1, 234, 248, 144, 17, 12, 1, 249, 7, 49, 17, 12, 1, - 249, 7, 41, 17, 12, 1, 217, 169, 49, 17, 12, 1, 217, 169, 41, 17, 12, 1, - 224, 24, 49, 17, 12, 1, 224, 24, 41, 17, 12, 1, 212, 102, 49, 17, 12, 1, - 212, 102, 41, 17, 12, 1, 222, 109, 49, 17, 12, 1, 222, 109, 41, 17, 12, - 1, 222, 109, 73, 17, 12, 1, 222, 109, 144, 17, 12, 1, 221, 5, 49, 17, 12, - 1, 221, 5, 41, 17, 12, 1, 221, 5, 73, 17, 12, 1, 221, 5, 144, 17, 12, 1, - 222, 221, 49, 17, 12, 1, 222, 221, 41, 17, 12, 1, 222, 221, 73, 17, 12, - 1, 222, 221, 144, 17, 12, 1, 249, 26, 49, 17, 12, 1, 249, 26, 41, 17, 12, - 1, 249, 26, 73, 17, 12, 1, 249, 26, 144, 17, 12, 1, 218, 44, 49, 17, 12, - 1, 218, 44, 41, 17, 12, 1, 218, 44, 73, 17, 12, 1, 218, 44, 144, 17, 12, - 1, 212, 105, 49, 17, 12, 1, 212, 105, 41, 17, 12, 1, 212, 105, 73, 17, - 12, 1, 212, 105, 144, 17, 12, 1, 254, 232, 49, 17, 12, 1, 254, 232, 41, - 17, 12, 1, 254, 232, 73, 17, 12, 1, 254, 232, 144, 17, 12, 1, 243, 85, - 49, 17, 12, 1, 243, 85, 41, 17, 12, 1, 243, 85, 73, 17, 12, 1, 243, 85, - 144, 17, 12, 1, 244, 232, 49, 17, 12, 1, 244, 232, 41, 17, 12, 1, 244, - 232, 73, 17, 12, 1, 244, 232, 144, 17, 12, 1, 225, 5, 49, 17, 12, 1, 225, - 5, 41, 17, 12, 1, 225, 5, 73, 17, 12, 1, 225, 5, 144, 17, 12, 1, 235, - 113, 49, 17, 12, 1, 235, 113, 41, 17, 12, 1, 235, 113, 73, 17, 12, 1, - 235, 113, 144, 17, 12, 1, 233, 225, 49, 17, 12, 1, 233, 225, 41, 17, 12, - 1, 233, 225, 73, 17, 12, 1, 233, 225, 144, 17, 12, 1, 64, 49, 17, 12, 1, - 64, 41, 17, 12, 1, 64, 73, 17, 12, 1, 64, 144, 17, 12, 1, 228, 217, 49, - 17, 12, 1, 228, 217, 41, 17, 12, 1, 228, 217, 73, 17, 12, 1, 228, 217, - 144, 17, 12, 1, 242, 66, 49, 17, 12, 1, 242, 66, 41, 17, 12, 1, 242, 66, - 73, 17, 12, 1, 242, 66, 144, 17, 12, 1, 214, 18, 49, 17, 12, 1, 214, 18, - 41, 17, 12, 1, 108, 232, 71, 49, 17, 12, 1, 108, 232, 71, 41, 17, 12, 1, - 76, 49, 17, 12, 1, 76, 41, 17, 12, 1, 76, 73, 17, 12, 1, 76, 144, 17, 12, - 26, 233, 225, 2, 108, 2, 232, 106, 74, 49, 17, 12, 26, 233, 225, 2, 108, - 2, 232, 106, 74, 41, 17, 12, 26, 233, 225, 2, 108, 2, 194, 74, 49, 17, - 12, 26, 233, 225, 2, 108, 2, 194, 74, 41, 17, 12, 26, 233, 225, 2, 108, - 2, 194, 252, 90, 49, 17, 12, 26, 233, 225, 2, 108, 2, 194, 252, 90, 41, - 17, 12, 26, 233, 225, 2, 108, 49, 17, 12, 26, 233, 225, 2, 108, 41, 17, - 212, 80, 213, 233, 228, 227, 219, 225, 122, 245, 119, 79, 122, 224, 178, - 79, 122, 51, 53, 122, 247, 207, 53, 122, 226, 93, 53, 122, 254, 162, 122, - 254, 97, 122, 43, 226, 168, 122, 47, 226, 168, 122, 254, 3, 122, 95, 53, - 122, 250, 23, 122, 241, 20, 122, 244, 64, 219, 83, 122, 219, 250, 122, - 21, 212, 79, 122, 21, 118, 122, 21, 112, 122, 21, 170, 122, 21, 167, 122, - 21, 185, 122, 21, 192, 122, 21, 200, 122, 21, 198, 122, 21, 203, 122, - 250, 30, 122, 221, 93, 122, 233, 137, 53, 122, 245, 182, 53, 122, 242, - 228, 53, 122, 224, 193, 79, 122, 250, 22, 253, 249, 122, 7, 6, 1, 63, - 122, 7, 6, 1, 253, 201, 122, 7, 6, 1, 251, 121, 122, 7, 6, 1, 249, 125, - 122, 7, 6, 1, 77, 122, 7, 6, 1, 245, 95, 122, 7, 6, 1, 244, 41, 122, 7, - 6, 1, 242, 162, 122, 7, 6, 1, 75, 122, 7, 6, 1, 236, 3, 122, 7, 6, 1, - 235, 141, 122, 7, 6, 1, 155, 122, 7, 6, 1, 184, 122, 7, 6, 1, 206, 122, - 7, 6, 1, 78, 122, 7, 6, 1, 227, 11, 122, 7, 6, 1, 225, 19, 122, 7, 6, 1, - 152, 122, 7, 6, 1, 196, 122, 7, 6, 1, 218, 113, 122, 7, 6, 1, 72, 122, 7, - 6, 1, 211, 211, 122, 7, 6, 1, 214, 85, 122, 7, 6, 1, 213, 169, 122, 7, 6, - 1, 213, 108, 122, 7, 6, 1, 212, 152, 122, 43, 42, 125, 122, 223, 237, - 219, 250, 122, 47, 42, 125, 122, 250, 91, 255, 46, 122, 117, 233, 83, - 122, 242, 234, 255, 46, 122, 7, 4, 1, 63, 122, 7, 4, 1, 253, 201, 122, 7, - 4, 1, 251, 121, 122, 7, 4, 1, 249, 125, 122, 7, 4, 1, 77, 122, 7, 4, 1, - 245, 95, 122, 7, 4, 1, 244, 41, 122, 7, 4, 1, 242, 162, 122, 7, 4, 1, 75, - 122, 7, 4, 1, 236, 3, 122, 7, 4, 1, 235, 141, 122, 7, 4, 1, 155, 122, 7, - 4, 1, 184, 122, 7, 4, 1, 206, 122, 7, 4, 1, 78, 122, 7, 4, 1, 227, 11, - 122, 7, 4, 1, 225, 19, 122, 7, 4, 1, 152, 122, 7, 4, 1, 196, 122, 7, 4, - 1, 218, 113, 122, 7, 4, 1, 72, 122, 7, 4, 1, 211, 211, 122, 7, 4, 1, 214, - 85, 122, 7, 4, 1, 213, 169, 122, 7, 4, 1, 213, 108, 122, 7, 4, 1, 212, - 152, 122, 43, 249, 163, 125, 122, 66, 233, 83, 122, 47, 249, 163, 125, - 122, 177, 122, 43, 69, 226, 168, 122, 47, 69, 226, 168, 100, 107, 244, - 64, 219, 83, 100, 43, 249, 223, 125, 100, 47, 249, 223, 125, 100, 107, - 250, 23, 100, 56, 231, 107, 247, 195, 100, 56, 1, 213, 217, 100, 56, 1, - 4, 63, 100, 56, 1, 4, 75, 100, 56, 1, 4, 72, 100, 56, 1, 4, 77, 100, 56, - 1, 4, 78, 100, 56, 1, 4, 189, 100, 56, 1, 4, 212, 204, 100, 56, 1, 4, - 212, 236, 100, 56, 1, 4, 216, 90, 100, 235, 63, 225, 93, 219, 237, 79, - 100, 56, 1, 63, 100, 56, 1, 75, 100, 56, 1, 72, 100, 56, 1, 77, 100, 56, - 1, 78, 100, 56, 1, 183, 100, 56, 1, 234, 212, 100, 56, 1, 234, 81, 100, - 56, 1, 235, 44, 100, 56, 1, 234, 148, 100, 56, 1, 222, 227, 100, 56, 1, - 220, 136, 100, 56, 1, 219, 41, 100, 56, 1, 222, 123, 100, 56, 1, 220, 5, - 100, 56, 1, 218, 66, 100, 56, 1, 217, 84, 100, 56, 1, 216, 90, 100, 56, - 1, 217, 242, 100, 56, 1, 109, 100, 56, 1, 207, 100, 56, 1, 229, 128, 100, - 56, 1, 228, 135, 100, 56, 1, 229, 254, 100, 56, 1, 228, 228, 100, 56, 1, - 162, 100, 56, 1, 242, 28, 100, 56, 1, 241, 74, 100, 56, 1, 242, 85, 100, - 56, 1, 241, 173, 100, 56, 1, 191, 100, 56, 1, 231, 112, 100, 56, 1, 230, - 242, 100, 56, 1, 231, 226, 100, 56, 1, 231, 45, 100, 56, 1, 189, 100, 56, - 1, 212, 204, 100, 56, 1, 212, 236, 100, 56, 1, 208, 100, 56, 1, 223, 222, - 100, 56, 1, 223, 77, 100, 56, 1, 224, 55, 100, 56, 1, 223, 146, 100, 56, - 1, 214, 52, 100, 56, 1, 206, 100, 56, 214, 120, 219, 237, 79, 100, 56, - 221, 98, 219, 237, 79, 100, 24, 244, 192, 100, 24, 1, 234, 178, 100, 24, - 1, 219, 168, 100, 24, 1, 234, 171, 100, 24, 1, 229, 121, 100, 24, 1, 229, - 119, 100, 24, 1, 229, 118, 100, 24, 1, 217, 68, 100, 24, 1, 219, 157, - 100, 24, 1, 223, 213, 100, 24, 1, 223, 208, 100, 24, 1, 223, 205, 100, - 24, 1, 223, 198, 100, 24, 1, 223, 193, 100, 24, 1, 223, 188, 100, 24, 1, - 223, 199, 100, 24, 1, 223, 211, 100, 24, 1, 231, 100, 100, 24, 1, 226, 7, - 100, 24, 1, 219, 165, 100, 24, 1, 225, 252, 100, 24, 1, 220, 95, 100, 24, - 1, 219, 162, 100, 24, 1, 236, 168, 100, 24, 1, 250, 106, 100, 24, 1, 219, - 172, 100, 24, 1, 250, 166, 100, 24, 1, 234, 228, 100, 24, 1, 217, 139, - 100, 24, 1, 226, 43, 100, 24, 1, 242, 21, 100, 24, 1, 63, 100, 24, 1, - 255, 20, 100, 24, 1, 189, 100, 24, 1, 213, 83, 100, 24, 1, 245, 197, 100, - 24, 1, 77, 100, 24, 1, 213, 28, 100, 24, 1, 213, 39, 100, 24, 1, 78, 100, - 24, 1, 214, 52, 100, 24, 1, 214, 49, 100, 24, 1, 227, 136, 100, 24, 1, - 212, 236, 100, 24, 1, 72, 100, 24, 1, 213, 255, 100, 24, 1, 214, 9, 100, - 24, 1, 213, 238, 100, 24, 1, 212, 204, 100, 24, 1, 245, 143, 100, 24, 1, - 213, 0, 100, 24, 1, 75, 122, 250, 233, 53, 122, 225, 144, 53, 122, 228, - 206, 53, 122, 232, 110, 122, 251, 188, 134, 122, 213, 32, 53, 122, 213, - 207, 53, 100, 244, 107, 182, 214, 221, 100, 135, 71, 100, 215, 130, 71, - 100, 96, 71, 100, 246, 179, 71, 100, 85, 219, 185, 100, 69, 250, 95, 236, - 62, 254, 137, 254, 156, 236, 62, 254, 137, 221, 80, 236, 62, 254, 137, - 217, 202, 227, 150, 224, 2, 250, 201, 224, 2, 250, 201, 60, 57, 3, 253, - 185, 63, 60, 57, 3, 253, 154, 77, 60, 57, 3, 253, 163, 75, 60, 57, 3, - 253, 131, 78, 60, 57, 3, 253, 181, 72, 60, 57, 3, 253, 200, 249, 30, 60, - 57, 3, 253, 147, 248, 162, 60, 57, 3, 253, 187, 248, 76, 60, 57, 3, 253, - 177, 247, 220, 60, 57, 3, 253, 141, 246, 154, 60, 57, 3, 253, 135, 236, - 0, 60, 57, 3, 253, 146, 235, 242, 60, 57, 3, 253, 156, 235, 185, 60, 57, - 3, 253, 127, 235, 168, 60, 57, 3, 253, 115, 183, 60, 57, 3, 253, 148, - 235, 44, 60, 57, 3, 253, 125, 234, 212, 60, 57, 3, 253, 122, 234, 148, - 60, 57, 3, 253, 111, 234, 81, 60, 57, 3, 253, 112, 191, 60, 57, 3, 253, - 178, 231, 226, 60, 57, 3, 253, 119, 231, 112, 60, 57, 3, 253, 176, 231, - 45, 60, 57, 3, 253, 168, 230, 242, 60, 57, 3, 253, 189, 207, 60, 57, 3, - 253, 167, 229, 254, 60, 57, 3, 253, 161, 229, 128, 60, 57, 3, 253, 140, - 228, 228, 60, 57, 3, 253, 137, 228, 135, 60, 57, 3, 253, 196, 195, 60, - 57, 3, 253, 120, 226, 132, 60, 57, 3, 253, 153, 226, 20, 60, 57, 3, 253, - 180, 225, 186, 60, 57, 3, 253, 142, 225, 71, 60, 57, 3, 253, 175, 225, - 11, 60, 57, 3, 253, 114, 224, 248, 60, 57, 3, 253, 170, 224, 233, 60, 57, - 3, 253, 159, 224, 222, 60, 57, 3, 253, 132, 208, 60, 57, 3, 253, 164, - 224, 55, 60, 57, 3, 253, 139, 223, 222, 60, 57, 3, 253, 198, 223, 146, - 60, 57, 3, 253, 165, 223, 77, 60, 57, 3, 253, 160, 222, 227, 60, 57, 3, - 253, 183, 222, 123, 60, 57, 3, 253, 151, 220, 136, 60, 57, 3, 253, 179, - 220, 5, 60, 57, 3, 253, 134, 219, 41, 60, 57, 3, 253, 133, 218, 66, 60, - 57, 3, 253, 194, 217, 242, 60, 57, 3, 253, 155, 217, 84, 60, 57, 3, 253, - 192, 109, 60, 57, 3, 253, 123, 216, 90, 60, 57, 3, 253, 138, 214, 52, 60, - 57, 3, 253, 117, 214, 9, 60, 57, 3, 253, 152, 213, 238, 60, 57, 3, 253, - 150, 213, 217, 60, 57, 3, 253, 174, 212, 109, 60, 57, 3, 253, 118, 212, - 87, 60, 57, 3, 253, 171, 212, 16, 60, 57, 3, 253, 166, 255, 106, 60, 57, - 3, 253, 149, 255, 105, 60, 57, 3, 253, 108, 253, 235, 60, 57, 3, 253, - 121, 246, 122, 60, 57, 3, 253, 104, 246, 121, 60, 57, 3, 253, 144, 228, - 73, 60, 57, 3, 253, 162, 225, 70, 60, 57, 3, 253, 130, 225, 73, 60, 57, - 3, 253, 116, 224, 111, 60, 57, 3, 253, 158, 224, 110, 60, 57, 3, 253, - 124, 223, 145, 60, 57, 3, 253, 126, 218, 64, 60, 57, 3, 253, 106, 216, - 50, 60, 57, 3, 253, 103, 112, 60, 57, 16, 253, 173, 60, 57, 16, 253, 172, - 60, 57, 16, 253, 169, 60, 57, 16, 253, 157, 60, 57, 16, 253, 145, 60, 57, - 16, 253, 143, 60, 57, 16, 253, 136, 60, 57, 16, 253, 129, 60, 57, 16, - 253, 128, 60, 57, 16, 253, 113, 60, 57, 16, 253, 110, 60, 57, 16, 253, - 109, 60, 57, 16, 253, 107, 60, 57, 16, 253, 105, 60, 57, 104, 253, 102, - 232, 63, 60, 57, 104, 253, 101, 213, 211, 60, 57, 104, 253, 100, 248, - 146, 60, 57, 104, 253, 99, 245, 179, 60, 57, 104, 253, 98, 232, 37, 60, - 57, 104, 253, 97, 219, 115, 60, 57, 104, 253, 96, 245, 125, 60, 57, 104, - 253, 95, 224, 80, 60, 57, 104, 253, 94, 221, 7, 60, 57, 104, 253, 93, - 242, 84, 60, 57, 104, 253, 92, 219, 231, 60, 57, 104, 253, 91, 251, 251, - 60, 57, 104, 253, 90, 249, 207, 60, 57, 104, 253, 89, 251, 169, 60, 57, - 104, 253, 88, 213, 246, 60, 57, 104, 253, 87, 252, 182, 60, 57, 104, 253, - 86, 227, 108, 60, 57, 104, 253, 85, 219, 205, 60, 57, 104, 253, 84, 249, - 133, 60, 57, 231, 26, 253, 83, 235, 86, 60, 57, 231, 26, 253, 82, 235, - 94, 60, 57, 104, 253, 81, 227, 121, 60, 57, 104, 253, 80, 213, 224, 60, - 57, 104, 253, 79, 60, 57, 231, 26, 253, 78, 254, 59, 60, 57, 231, 26, - 253, 77, 231, 186, 60, 57, 104, 253, 76, 251, 187, 60, 57, 104, 253, 75, - 243, 6, 60, 57, 104, 253, 74, 60, 57, 104, 253, 73, 213, 202, 60, 57, - 104, 253, 72, 60, 57, 104, 253, 71, 60, 57, 104, 253, 70, 241, 97, 60, - 57, 104, 253, 69, 60, 57, 104, 253, 68, 60, 57, 104, 253, 67, 60, 57, - 231, 26, 253, 65, 216, 64, 60, 57, 104, 253, 64, 60, 57, 104, 253, 63, - 60, 57, 104, 253, 62, 250, 54, 60, 57, 104, 253, 61, 60, 57, 104, 253, - 60, 60, 57, 104, 253, 59, 243, 189, 60, 57, 104, 253, 58, 254, 46, 60, - 57, 104, 253, 57, 60, 57, 104, 253, 56, 60, 57, 104, 253, 55, 60, 57, - 104, 253, 54, 60, 57, 104, 253, 53, 60, 57, 104, 253, 52, 60, 57, 104, - 253, 51, 60, 57, 104, 253, 50, 60, 57, 104, 253, 49, 60, 57, 104, 253, - 48, 231, 18, 60, 57, 104, 253, 47, 60, 57, 104, 253, 46, 216, 206, 60, - 57, 104, 253, 45, 60, 57, 104, 253, 44, 60, 57, 104, 253, 43, 60, 57, - 104, 253, 42, 60, 57, 104, 253, 41, 60, 57, 104, 253, 40, 60, 57, 104, - 253, 39, 60, 57, 104, 253, 38, 60, 57, 104, 253, 37, 60, 57, 104, 253, - 36, 60, 57, 104, 253, 35, 60, 57, 104, 253, 34, 242, 58, 60, 57, 104, - 253, 13, 244, 117, 60, 57, 104, 253, 10, 252, 162, 60, 57, 104, 253, 5, - 219, 212, 60, 57, 104, 253, 4, 71, 60, 57, 104, 253, 3, 60, 57, 104, 253, - 2, 218, 195, 60, 57, 104, 253, 1, 60, 57, 104, 253, 0, 60, 57, 104, 252, - 255, 213, 242, 250, 198, 60, 57, 104, 252, 254, 250, 198, 60, 57, 104, - 252, 253, 250, 199, 244, 89, 60, 57, 104, 252, 252, 213, 244, 60, 57, - 104, 252, 251, 60, 57, 104, 252, 250, 60, 57, 231, 26, 252, 249, 248, 15, - 60, 57, 104, 252, 248, 60, 57, 104, 252, 247, 60, 57, 104, 252, 245, 60, - 57, 104, 252, 244, 60, 57, 104, 252, 243, 60, 57, 104, 252, 242, 248, - 226, 60, 57, 104, 252, 241, 60, 57, 104, 252, 240, 60, 57, 104, 252, 239, - 60, 57, 104, 252, 238, 60, 57, 104, 252, 237, 60, 57, 104, 214, 168, 253, - 66, 60, 57, 104, 214, 168, 253, 33, 60, 57, 104, 214, 168, 253, 32, 60, - 57, 104, 214, 168, 253, 31, 60, 57, 104, 214, 168, 253, 30, 60, 57, 104, - 214, 168, 253, 29, 60, 57, 104, 214, 168, 253, 28, 60, 57, 104, 214, 168, - 253, 27, 60, 57, 104, 214, 168, 253, 26, 60, 57, 104, 214, 168, 253, 25, - 60, 57, 104, 214, 168, 253, 24, 60, 57, 104, 214, 168, 253, 23, 60, 57, - 104, 214, 168, 253, 22, 60, 57, 104, 214, 168, 253, 21, 60, 57, 104, 214, - 168, 253, 20, 60, 57, 104, 214, 168, 253, 19, 60, 57, 104, 214, 168, 253, - 18, 60, 57, 104, 214, 168, 253, 17, 60, 57, 104, 214, 168, 253, 16, 60, - 57, 104, 214, 168, 253, 15, 60, 57, 104, 214, 168, 253, 14, 60, 57, 104, - 214, 168, 253, 12, 60, 57, 104, 214, 168, 253, 11, 60, 57, 104, 214, 168, - 253, 9, 60, 57, 104, 214, 168, 253, 8, 60, 57, 104, 214, 168, 253, 7, 60, - 57, 104, 214, 168, 253, 6, 60, 57, 104, 214, 168, 252, 246, 60, 57, 104, - 214, 168, 252, 236, 255, 13, 213, 199, 221, 81, 233, 83, 255, 13, 213, - 199, 221, 81, 247, 195, 255, 13, 250, 189, 79, 255, 13, 51, 118, 255, 13, - 51, 112, 255, 13, 51, 170, 255, 13, 51, 167, 255, 13, 51, 185, 255, 13, - 51, 192, 255, 13, 51, 200, 255, 13, 51, 198, 255, 13, 51, 203, 255, 13, - 51, 217, 213, 255, 13, 51, 216, 45, 255, 13, 51, 217, 128, 255, 13, 51, - 244, 104, 255, 13, 51, 244, 203, 255, 13, 51, 220, 58, 255, 13, 51, 221, - 60, 255, 13, 51, 246, 6, 255, 13, 51, 229, 90, 255, 13, 51, 124, 241, 62, - 255, 13, 51, 119, 241, 62, 255, 13, 51, 137, 241, 62, 255, 13, 51, 244, - 101, 241, 62, 255, 13, 51, 244, 170, 241, 62, 255, 13, 51, 220, 72, 241, - 62, 255, 13, 51, 221, 66, 241, 62, 255, 13, 51, 246, 15, 241, 62, 255, - 13, 51, 229, 95, 241, 62, 255, 13, 51, 124, 217, 113, 255, 13, 51, 119, - 217, 113, 255, 13, 51, 137, 217, 113, 255, 13, 51, 244, 101, 217, 113, - 255, 13, 51, 244, 170, 217, 113, 255, 13, 51, 220, 72, 217, 113, 255, 13, - 51, 221, 66, 217, 113, 255, 13, 51, 246, 15, 217, 113, 255, 13, 51, 229, - 95, 217, 113, 255, 13, 51, 217, 214, 217, 113, 255, 13, 51, 216, 46, 217, - 113, 255, 13, 51, 217, 129, 217, 113, 255, 13, 51, 244, 105, 217, 113, - 255, 13, 51, 244, 204, 217, 113, 255, 13, 51, 220, 59, 217, 113, 255, 13, - 51, 221, 61, 217, 113, 255, 13, 51, 246, 7, 217, 113, 255, 13, 51, 229, - 91, 217, 113, 255, 13, 214, 2, 252, 174, 215, 150, 255, 13, 214, 2, 244, - 181, 219, 18, 255, 13, 214, 2, 222, 118, 219, 18, 255, 13, 214, 2, 217, - 135, 219, 18, 255, 13, 214, 2, 244, 94, 219, 18, 255, 13, 246, 157, 231, - 225, 244, 181, 219, 18, 255, 13, 233, 69, 231, 225, 244, 181, 219, 18, - 255, 13, 231, 225, 222, 118, 219, 18, 255, 13, 231, 225, 217, 135, 219, - 18, 25, 255, 39, 253, 237, 124, 224, 201, 25, 255, 39, 253, 237, 124, - 242, 129, 25, 255, 39, 253, 237, 124, 246, 175, 25, 255, 39, 253, 237, - 185, 25, 255, 39, 253, 237, 244, 203, 25, 255, 39, 253, 237, 244, 170, - 241, 62, 25, 255, 39, 253, 237, 244, 170, 217, 113, 25, 255, 39, 253, - 237, 244, 204, 217, 113, 25, 255, 39, 253, 237, 244, 170, 218, 31, 25, - 255, 39, 253, 237, 217, 214, 218, 31, 25, 255, 39, 253, 237, 244, 204, - 218, 31, 25, 255, 39, 253, 237, 124, 241, 63, 218, 31, 25, 255, 39, 253, - 237, 244, 170, 241, 63, 218, 31, 25, 255, 39, 253, 237, 124, 217, 114, - 218, 31, 25, 255, 39, 253, 237, 244, 170, 217, 114, 218, 31, 25, 255, 39, - 253, 237, 244, 170, 219, 104, 25, 255, 39, 253, 237, 217, 214, 219, 104, - 25, 255, 39, 253, 237, 244, 204, 219, 104, 25, 255, 39, 253, 237, 124, - 241, 63, 219, 104, 25, 255, 39, 253, 237, 244, 170, 241, 63, 219, 104, - 25, 255, 39, 253, 237, 124, 217, 114, 219, 104, 25, 255, 39, 253, 237, - 217, 214, 217, 114, 219, 104, 25, 255, 39, 253, 237, 244, 204, 217, 114, - 219, 104, 25, 255, 39, 253, 237, 217, 214, 231, 48, 25, 255, 39, 242, 52, - 124, 225, 200, 25, 255, 39, 217, 147, 118, 25, 255, 39, 242, 49, 118, 25, - 255, 39, 245, 188, 112, 25, 255, 39, 217, 147, 112, 25, 255, 39, 249, - 130, 119, 246, 174, 25, 255, 39, 245, 188, 119, 246, 174, 25, 255, 39, - 216, 174, 185, 25, 255, 39, 216, 174, 217, 213, 25, 255, 39, 216, 174, - 217, 214, 254, 177, 17, 25, 255, 39, 242, 49, 217, 213, 25, 255, 39, 231, - 178, 217, 213, 25, 255, 39, 217, 147, 217, 213, 25, 255, 39, 217, 147, - 217, 128, 25, 255, 39, 216, 174, 244, 203, 25, 255, 39, 216, 174, 244, - 204, 254, 177, 17, 25, 255, 39, 242, 49, 244, 203, 25, 255, 39, 217, 147, - 244, 203, 25, 255, 39, 217, 147, 124, 241, 62, 25, 255, 39, 217, 147, - 137, 241, 62, 25, 255, 39, 245, 188, 244, 170, 241, 62, 25, 255, 39, 216, - 174, 244, 170, 241, 62, 25, 255, 39, 217, 147, 244, 170, 241, 62, 25, - 255, 39, 251, 27, 244, 170, 241, 62, 25, 255, 39, 230, 71, 244, 170, 241, - 62, 25, 255, 39, 217, 147, 124, 217, 113, 25, 255, 39, 217, 147, 244, - 170, 217, 113, 25, 255, 39, 248, 129, 244, 170, 231, 48, 25, 255, 39, - 219, 72, 244, 204, 231, 48, 25, 124, 157, 53, 25, 124, 157, 5, 254, 177, - 17, 25, 119, 217, 133, 53, 25, 137, 224, 200, 53, 25, 213, 37, 53, 25, - 218, 32, 53, 25, 246, 176, 53, 25, 227, 147, 53, 25, 119, 227, 146, 53, - 25, 137, 227, 146, 53, 25, 244, 101, 227, 146, 53, 25, 244, 170, 227, - 146, 53, 25, 231, 172, 53, 25, 234, 21, 252, 174, 53, 25, 233, 64, 53, - 25, 227, 37, 53, 25, 213, 150, 53, 25, 254, 29, 53, 25, 254, 42, 53, 25, - 242, 240, 53, 25, 216, 157, 252, 174, 53, 25, 212, 80, 53, 223, 134, 221, - 57, 53, 223, 134, 215, 161, 53, 223, 134, 221, 85, 53, 223, 134, 221, 55, - 53, 223, 134, 248, 30, 221, 55, 53, 223, 134, 220, 113, 53, 223, 134, - 248, 125, 53, 223, 134, 224, 186, 53, 223, 134, 221, 73, 53, 223, 134, - 246, 136, 53, 223, 134, 254, 24, 53, 223, 134, 250, 228, 53, 226, 55, - 248, 8, 5, 226, 124, 226, 55, 248, 8, 5, 225, 194, 242, 82, 226, 55, 248, - 8, 5, 218, 9, 242, 82, 226, 55, 248, 8, 5, 251, 47, 226, 55, 248, 8, 5, - 250, 161, 226, 55, 248, 8, 5, 213, 211, 226, 55, 248, 8, 5, 242, 58, 226, - 55, 248, 8, 5, 243, 181, 226, 55, 248, 8, 5, 217, 83, 226, 55, 248, 8, 5, - 71, 226, 55, 248, 8, 5, 251, 220, 226, 55, 248, 8, 5, 220, 230, 226, 55, - 248, 8, 5, 250, 48, 226, 55, 248, 8, 5, 232, 62, 226, 55, 248, 8, 5, 232, - 14, 226, 55, 248, 8, 5, 222, 157, 226, 55, 248, 8, 5, 233, 107, 226, 55, - 248, 8, 5, 251, 238, 226, 55, 248, 8, 5, 251, 31, 225, 203, 226, 55, 248, - 8, 5, 247, 208, 226, 55, 248, 8, 5, 250, 27, 226, 55, 248, 8, 5, 220, 34, - 226, 55, 248, 8, 5, 250, 28, 226, 55, 248, 8, 5, 252, 109, 226, 55, 248, - 8, 5, 220, 217, 226, 55, 248, 8, 5, 241, 97, 226, 55, 248, 8, 5, 242, 26, - 226, 55, 248, 8, 5, 251, 166, 233, 158, 226, 55, 248, 8, 5, 251, 24, 226, - 55, 248, 8, 5, 224, 80, 226, 55, 248, 8, 5, 246, 51, 226, 55, 248, 8, 5, - 246, 182, 226, 55, 248, 8, 5, 216, 77, 226, 55, 248, 8, 5, 252, 112, 226, - 55, 248, 8, 5, 225, 204, 216, 206, 226, 55, 248, 8, 5, 214, 144, 226, 55, - 248, 8, 5, 226, 183, 226, 55, 248, 8, 5, 223, 126, 226, 55, 248, 8, 5, - 233, 94, 226, 55, 248, 8, 5, 227, 21, 252, 228, 226, 55, 248, 8, 5, 244, - 137, 226, 55, 248, 8, 5, 242, 235, 226, 55, 248, 8, 5, 219, 73, 226, 55, - 248, 8, 5, 4, 253, 211, 226, 55, 248, 8, 5, 214, 19, 252, 194, 226, 55, - 248, 8, 5, 38, 227, 149, 91, 232, 193, 1, 63, 232, 193, 1, 77, 232, 193, - 1, 253, 201, 232, 193, 1, 252, 66, 232, 193, 1, 244, 41, 232, 193, 1, - 249, 125, 232, 193, 1, 75, 232, 193, 1, 214, 85, 232, 193, 1, 212, 152, - 232, 193, 1, 217, 176, 232, 193, 1, 236, 3, 232, 193, 1, 235, 141, 232, - 193, 1, 225, 19, 232, 193, 1, 155, 232, 193, 1, 184, 232, 193, 1, 206, - 232, 193, 1, 231, 49, 232, 193, 1, 229, 7, 232, 193, 1, 72, 232, 193, 1, - 227, 11, 232, 193, 1, 234, 167, 232, 193, 1, 152, 232, 193, 1, 196, 232, - 193, 1, 218, 113, 232, 193, 1, 216, 131, 232, 193, 1, 254, 159, 232, 193, - 1, 245, 229, 232, 193, 1, 242, 162, 232, 193, 1, 213, 169, 251, 37, 1, - 63, 251, 37, 1, 226, 253, 251, 37, 1, 249, 125, 251, 37, 1, 155, 251, 37, - 1, 215, 96, 251, 37, 1, 152, 251, 37, 1, 233, 184, 251, 37, 1, 255, 106, - 251, 37, 1, 225, 19, 251, 37, 1, 253, 201, 251, 37, 1, 184, 251, 37, 1, - 78, 251, 37, 1, 249, 32, 251, 37, 1, 218, 113, 251, 37, 1, 221, 49, 251, - 37, 1, 221, 48, 251, 37, 1, 196, 251, 37, 1, 251, 120, 251, 37, 1, 72, - 251, 37, 1, 229, 7, 251, 37, 1, 213, 169, 251, 37, 1, 206, 251, 37, 1, - 216, 130, 251, 37, 1, 227, 11, 251, 37, 1, 219, 177, 251, 37, 1, 75, 251, - 37, 1, 77, 251, 37, 1, 215, 93, 251, 37, 1, 235, 141, 251, 37, 1, 235, - 132, 251, 37, 1, 230, 41, 251, 37, 1, 215, 98, 251, 37, 1, 244, 41, 251, - 37, 1, 243, 232, 251, 37, 1, 219, 121, 251, 37, 1, 219, 120, 251, 37, 1, - 229, 228, 251, 37, 1, 236, 145, 251, 37, 1, 251, 119, 251, 37, 1, 216, - 131, 251, 37, 1, 215, 95, 251, 37, 1, 223, 116, 251, 37, 1, 232, 6, 251, - 37, 1, 232, 5, 251, 37, 1, 232, 4, 251, 37, 1, 232, 3, 251, 37, 1, 233, - 183, 251, 37, 1, 246, 55, 251, 37, 1, 215, 94, 54, 32, 1, 63, 54, 32, 1, - 252, 121, 54, 32, 1, 235, 44, 54, 32, 1, 248, 162, 54, 32, 1, 77, 54, 32, - 1, 214, 237, 54, 32, 1, 212, 87, 54, 32, 1, 242, 85, 54, 32, 1, 217, 161, - 54, 32, 1, 75, 54, 32, 1, 183, 54, 32, 1, 245, 252, 54, 32, 1, 245, 238, - 54, 32, 1, 245, 229, 54, 32, 1, 245, 161, 54, 32, 1, 78, 54, 32, 1, 226, - 132, 54, 32, 1, 221, 8, 54, 32, 1, 234, 81, 54, 32, 1, 245, 176, 54, 32, - 1, 245, 166, 54, 32, 1, 217, 242, 54, 32, 1, 72, 54, 32, 1, 245, 255, 54, - 32, 1, 226, 48, 54, 32, 1, 234, 237, 54, 32, 1, 246, 24, 54, 32, 1, 245, - 168, 54, 32, 1, 250, 190, 54, 32, 1, 236, 145, 54, 32, 1, 215, 98, 54, - 32, 228, 97, 118, 54, 32, 228, 97, 185, 54, 32, 228, 97, 217, 213, 54, - 32, 228, 97, 244, 203, 242, 249, 1, 254, 239, 242, 249, 1, 252, 209, 242, - 249, 1, 243, 51, 242, 249, 1, 249, 14, 242, 249, 1, 254, 235, 242, 249, - 1, 225, 2, 242, 249, 1, 236, 14, 242, 249, 1, 242, 141, 242, 249, 1, 217, - 124, 242, 249, 1, 246, 5, 242, 249, 1, 234, 54, 242, 249, 1, 233, 234, - 242, 249, 1, 232, 57, 242, 249, 1, 230, 73, 242, 249, 1, 235, 235, 242, - 249, 1, 215, 113, 242, 249, 1, 226, 233, 242, 249, 1, 229, 90, 242, 249, - 1, 224, 91, 242, 249, 1, 222, 159, 242, 249, 1, 217, 225, 242, 249, 1, - 213, 222, 242, 249, 1, 245, 11, 242, 249, 1, 236, 149, 242, 249, 1, 241, - 52, 242, 249, 1, 227, 45, 242, 249, 1, 229, 95, 241, 62, 215, 185, 1, - 254, 183, 215, 185, 1, 252, 73, 215, 185, 1, 243, 204, 215, 185, 1, 234, - 250, 215, 185, 1, 248, 126, 215, 185, 1, 241, 173, 215, 185, 1, 213, 217, - 215, 185, 1, 212, 78, 215, 185, 1, 241, 90, 215, 185, 1, 217, 196, 215, - 185, 1, 212, 225, 215, 185, 1, 235, 112, 215, 185, 1, 220, 221, 215, 185, - 1, 233, 220, 215, 185, 1, 231, 199, 215, 185, 1, 248, 94, 215, 185, 1, - 228, 93, 215, 185, 1, 212, 8, 215, 185, 1, 222, 187, 215, 185, 1, 254, - 231, 215, 185, 1, 225, 71, 215, 185, 1, 222, 219, 215, 185, 1, 224, 215, - 215, 185, 1, 224, 71, 215, 185, 1, 217, 165, 215, 185, 1, 243, 84, 215, - 185, 1, 109, 215, 185, 1, 75, 215, 185, 1, 72, 215, 185, 1, 219, 132, - 215, 185, 213, 199, 247, 245, 54, 226, 81, 5, 63, 54, 226, 81, 5, 75, 54, - 226, 81, 5, 72, 54, 226, 81, 5, 183, 54, 226, 81, 5, 234, 81, 54, 226, - 81, 5, 243, 230, 54, 226, 81, 5, 242, 213, 54, 226, 81, 5, 213, 156, 54, - 226, 81, 5, 251, 88, 54, 226, 81, 5, 236, 0, 54, 226, 81, 5, 235, 225, - 54, 226, 81, 5, 218, 66, 54, 226, 81, 5, 216, 90, 54, 226, 81, 5, 249, - 30, 54, 226, 81, 5, 248, 76, 54, 226, 81, 5, 246, 154, 54, 226, 81, 5, - 217, 174, 54, 226, 81, 5, 195, 54, 226, 81, 5, 252, 234, 54, 226, 81, 5, - 245, 29, 54, 226, 81, 5, 207, 54, 226, 81, 5, 228, 135, 54, 226, 81, 5, - 191, 54, 226, 81, 5, 231, 112, 54, 226, 81, 5, 230, 242, 54, 226, 81, 5, - 189, 54, 226, 81, 5, 215, 8, 54, 226, 81, 5, 214, 159, 54, 226, 81, 5, - 208, 54, 226, 81, 5, 223, 77, 54, 226, 81, 5, 233, 255, 54, 226, 81, 5, - 222, 227, 54, 226, 81, 5, 212, 109, 54, 226, 81, 5, 221, 47, 54, 226, 81, - 5, 219, 176, 54, 226, 81, 5, 162, 54, 226, 81, 5, 253, 229, 54, 226, 81, - 5, 253, 228, 54, 226, 81, 5, 253, 227, 54, 226, 81, 5, 213, 133, 54, 226, - 81, 5, 249, 11, 54, 226, 81, 5, 249, 10, 54, 226, 81, 5, 252, 215, 54, - 226, 81, 5, 251, 139, 54, 226, 81, 213, 199, 247, 245, 54, 226, 81, 51, - 118, 54, 226, 81, 51, 112, 54, 226, 81, 51, 217, 213, 54, 226, 81, 51, - 216, 45, 54, 226, 81, 51, 241, 62, 175, 6, 1, 187, 75, 175, 6, 1, 187, - 77, 175, 6, 1, 187, 63, 175, 6, 1, 187, 254, 242, 175, 6, 1, 187, 78, - 175, 6, 1, 187, 227, 86, 175, 6, 1, 220, 196, 75, 175, 6, 1, 220, 196, - 77, 175, 6, 1, 220, 196, 63, 175, 6, 1, 220, 196, 254, 242, 175, 6, 1, - 220, 196, 78, 175, 6, 1, 220, 196, 227, 86, 175, 6, 1, 253, 210, 175, 6, - 1, 227, 22, 175, 6, 1, 213, 186, 175, 6, 1, 213, 36, 175, 6, 1, 242, 162, - 175, 6, 1, 226, 122, 175, 6, 1, 252, 112, 175, 6, 1, 217, 232, 175, 6, 1, - 248, 149, 175, 6, 1, 250, 187, 175, 6, 1, 235, 240, 175, 6, 1, 235, 51, - 175, 6, 1, 243, 179, 175, 6, 1, 246, 24, 175, 6, 1, 214, 232, 175, 6, 1, - 245, 146, 175, 6, 1, 217, 160, 175, 6, 1, 245, 166, 175, 6, 1, 212, 85, - 175, 6, 1, 245, 161, 175, 6, 1, 212, 66, 175, 6, 1, 245, 176, 175, 6, 1, - 245, 252, 175, 6, 1, 245, 238, 175, 6, 1, 245, 229, 175, 6, 1, 245, 217, - 175, 6, 1, 227, 122, 175, 6, 1, 245, 126, 175, 4, 1, 187, 75, 175, 4, 1, - 187, 77, 175, 4, 1, 187, 63, 175, 4, 1, 187, 254, 242, 175, 4, 1, 187, - 78, 175, 4, 1, 187, 227, 86, 175, 4, 1, 220, 196, 75, 175, 4, 1, 220, - 196, 77, 175, 4, 1, 220, 196, 63, 175, 4, 1, 220, 196, 254, 242, 175, 4, - 1, 220, 196, 78, 175, 4, 1, 220, 196, 227, 86, 175, 4, 1, 253, 210, 175, - 4, 1, 227, 22, 175, 4, 1, 213, 186, 175, 4, 1, 213, 36, 175, 4, 1, 242, - 162, 175, 4, 1, 226, 122, 175, 4, 1, 252, 112, 175, 4, 1, 217, 232, 175, - 4, 1, 248, 149, 175, 4, 1, 250, 187, 175, 4, 1, 235, 240, 175, 4, 1, 235, - 51, 175, 4, 1, 243, 179, 175, 4, 1, 246, 24, 175, 4, 1, 214, 232, 175, 4, - 1, 245, 146, 175, 4, 1, 217, 160, 175, 4, 1, 245, 166, 175, 4, 1, 212, - 85, 175, 4, 1, 245, 161, 175, 4, 1, 212, 66, 175, 4, 1, 245, 176, 175, 4, - 1, 245, 252, 175, 4, 1, 245, 238, 175, 4, 1, 245, 229, 175, 4, 1, 245, - 217, 175, 4, 1, 227, 122, 175, 4, 1, 245, 126, 221, 14, 1, 226, 120, 221, - 14, 1, 216, 231, 221, 14, 1, 234, 211, 221, 14, 1, 244, 236, 221, 14, 1, - 217, 138, 221, 14, 1, 220, 5, 221, 14, 1, 218, 228, 221, 14, 1, 250, 121, - 221, 14, 1, 213, 38, 221, 14, 1, 241, 61, 221, 14, 1, 252, 53, 221, 14, - 1, 248, 161, 221, 14, 1, 243, 216, 221, 14, 1, 214, 108, 221, 14, 1, 217, - 142, 221, 14, 1, 212, 14, 221, 14, 1, 231, 224, 221, 14, 1, 235, 166, - 221, 14, 1, 213, 215, 221, 14, 1, 242, 150, 221, 14, 1, 233, 13, 221, 14, - 1, 231, 72, 221, 14, 1, 236, 152, 221, 14, 1, 246, 23, 221, 14, 1, 254, - 17, 221, 14, 1, 255, 24, 221, 14, 1, 227, 99, 221, 14, 1, 213, 202, 221, - 14, 1, 227, 36, 221, 14, 1, 254, 242, 221, 14, 1, 223, 143, 221, 14, 1, - 228, 93, 221, 14, 1, 246, 38, 221, 14, 1, 254, 247, 221, 14, 1, 240, 221, - 221, 14, 1, 215, 140, 221, 14, 1, 227, 155, 221, 14, 1, 227, 79, 221, 14, - 1, 227, 121, 221, 14, 1, 253, 213, 221, 14, 1, 254, 60, 221, 14, 1, 227, - 62, 221, 14, 1, 254, 227, 221, 14, 1, 245, 170, 221, 14, 1, 254, 39, 221, - 14, 1, 246, 48, 221, 14, 1, 240, 227, 221, 14, 1, 213, 5, 227, 47, 1, - 254, 205, 227, 47, 1, 252, 234, 227, 47, 1, 218, 66, 227, 47, 1, 236, 0, - 227, 47, 1, 213, 156, 227, 47, 1, 234, 250, 227, 47, 1, 248, 148, 227, - 47, 1, 208, 227, 47, 1, 222, 227, 227, 47, 1, 220, 227, 227, 47, 1, 248, - 97, 227, 47, 1, 251, 15, 227, 47, 1, 243, 230, 227, 47, 1, 245, 29, 227, - 47, 1, 225, 9, 227, 47, 1, 235, 127, 227, 47, 1, 233, 250, 227, 47, 1, - 231, 83, 227, 47, 1, 228, 77, 227, 47, 1, 214, 17, 227, 47, 1, 162, 227, - 47, 1, 189, 227, 47, 1, 63, 227, 47, 1, 77, 227, 47, 1, 75, 227, 47, 1, - 78, 227, 47, 1, 72, 227, 47, 1, 255, 104, 227, 47, 1, 246, 30, 227, 47, - 1, 227, 86, 227, 47, 21, 212, 79, 227, 47, 21, 118, 227, 47, 21, 112, - 227, 47, 21, 170, 227, 47, 21, 167, 227, 47, 21, 185, 227, 47, 21, 192, - 227, 47, 21, 200, 227, 47, 21, 198, 227, 47, 21, 203, 249, 132, 3, 63, - 249, 132, 3, 77, 249, 132, 3, 75, 249, 132, 3, 78, 249, 132, 3, 72, 249, - 132, 3, 236, 0, 249, 132, 3, 235, 185, 249, 132, 3, 183, 249, 132, 3, - 235, 44, 249, 132, 3, 234, 212, 249, 132, 3, 234, 148, 249, 132, 3, 234, - 81, 249, 132, 3, 233, 255, 249, 132, 3, 233, 180, 249, 132, 3, 233, 111, - 249, 132, 3, 233, 26, 249, 132, 3, 232, 230, 249, 132, 3, 191, 249, 132, - 3, 231, 226, 249, 132, 3, 231, 112, 249, 132, 3, 231, 45, 249, 132, 3, - 230, 242, 249, 132, 3, 207, 249, 132, 3, 229, 254, 249, 132, 3, 229, 128, - 249, 132, 3, 228, 228, 249, 132, 3, 228, 135, 249, 132, 3, 195, 249, 132, - 3, 226, 132, 249, 132, 3, 226, 20, 249, 132, 3, 225, 186, 249, 132, 3, - 225, 71, 249, 132, 3, 208, 249, 132, 3, 224, 55, 249, 132, 3, 223, 222, - 249, 132, 3, 223, 146, 249, 132, 3, 223, 77, 249, 132, 3, 222, 227, 249, - 132, 3, 222, 123, 249, 132, 3, 220, 136, 249, 132, 3, 220, 5, 249, 132, - 3, 219, 41, 249, 132, 3, 218, 66, 249, 132, 3, 217, 242, 249, 132, 3, - 217, 84, 249, 132, 3, 109, 249, 132, 3, 216, 90, 249, 132, 3, 214, 52, - 249, 132, 3, 214, 9, 249, 132, 3, 213, 238, 249, 132, 3, 213, 217, 249, - 132, 3, 213, 156, 249, 132, 3, 213, 153, 249, 132, 3, 212, 109, 249, 132, - 3, 212, 16, 236, 114, 254, 68, 1, 254, 203, 236, 114, 254, 68, 1, 252, - 72, 236, 114, 254, 68, 1, 243, 41, 236, 114, 254, 68, 1, 248, 255, 236, - 114, 254, 68, 1, 242, 85, 236, 114, 254, 68, 1, 214, 17, 236, 114, 254, - 68, 1, 212, 90, 236, 114, 254, 68, 1, 242, 43, 236, 114, 254, 68, 1, 217, - 192, 236, 114, 254, 68, 1, 212, 224, 236, 114, 254, 68, 1, 235, 87, 236, - 114, 254, 68, 1, 233, 215, 236, 114, 254, 68, 1, 231, 199, 236, 114, 254, - 68, 1, 228, 93, 236, 114, 254, 68, 1, 222, 188, 236, 114, 254, 68, 1, - 253, 205, 236, 114, 254, 68, 1, 226, 132, 236, 114, 254, 68, 1, 222, 218, - 236, 114, 254, 68, 1, 224, 214, 236, 114, 254, 68, 1, 223, 253, 236, 114, - 254, 68, 1, 220, 221, 236, 114, 254, 68, 1, 218, 0, 236, 114, 254, 68, - 222, 115, 53, 236, 114, 254, 68, 51, 118, 236, 114, 254, 68, 51, 112, - 236, 114, 254, 68, 51, 170, 236, 114, 254, 68, 51, 217, 213, 236, 114, - 254, 68, 51, 216, 45, 236, 114, 254, 68, 51, 124, 241, 62, 236, 114, 254, - 68, 51, 124, 217, 113, 236, 114, 254, 68, 51, 217, 214, 217, 113, 226, - 31, 1, 254, 201, 226, 31, 1, 252, 75, 226, 31, 1, 243, 205, 226, 31, 1, - 248, 128, 226, 31, 1, 242, 85, 226, 31, 1, 214, 24, 226, 31, 1, 212, 103, - 226, 31, 1, 242, 45, 226, 31, 1, 217, 196, 226, 31, 1, 212, 225, 226, 31, - 1, 235, 112, 226, 31, 1, 233, 221, 226, 31, 1, 231, 199, 226, 31, 1, 228, - 93, 226, 31, 1, 221, 87, 226, 31, 1, 254, 231, 226, 31, 1, 226, 132, 226, - 31, 1, 222, 219, 226, 31, 1, 224, 219, 226, 31, 1, 223, 125, 226, 31, 1, - 220, 221, 226, 31, 1, 218, 5, 226, 31, 51, 118, 226, 31, 51, 217, 213, - 226, 31, 51, 216, 45, 226, 31, 51, 124, 241, 62, 226, 31, 51, 112, 226, - 31, 51, 170, 226, 31, 213, 199, 221, 80, 232, 192, 1, 63, 232, 192, 1, - 253, 201, 232, 192, 1, 244, 41, 232, 192, 1, 249, 125, 232, 192, 1, 77, - 232, 192, 1, 211, 211, 232, 192, 1, 75, 232, 192, 1, 213, 108, 232, 192, - 1, 235, 141, 232, 192, 1, 155, 232, 192, 1, 184, 232, 192, 1, 206, 232, - 192, 1, 78, 232, 192, 1, 152, 232, 192, 1, 219, 177, 232, 192, 1, 218, - 113, 232, 192, 1, 72, 232, 192, 1, 245, 95, 232, 192, 1, 225, 19, 232, - 192, 1, 196, 232, 192, 1, 216, 131, 232, 192, 1, 254, 159, 232, 192, 1, - 245, 229, 232, 192, 1, 232, 194, 232, 192, 1, 229, 7, 232, 192, 1, 251, - 121, 232, 192, 216, 193, 79, 234, 238, 1, 63, 234, 238, 30, 5, 75, 234, - 238, 30, 5, 72, 234, 238, 30, 5, 165, 152, 234, 238, 30, 5, 77, 234, 238, - 30, 5, 78, 234, 238, 30, 233, 145, 79, 234, 238, 5, 52, 223, 165, 55, - 234, 238, 5, 254, 113, 234, 238, 5, 214, 132, 234, 238, 1, 183, 234, 238, - 1, 234, 250, 234, 238, 1, 243, 230, 234, 238, 1, 243, 89, 234, 238, 1, - 251, 88, 234, 238, 1, 250, 215, 234, 238, 1, 236, 0, 234, 238, 1, 228, - 64, 234, 238, 1, 216, 128, 234, 238, 1, 216, 116, 234, 238, 1, 248, 207, - 234, 238, 1, 248, 191, 234, 238, 1, 229, 6, 234, 238, 1, 218, 66, 234, - 238, 1, 217, 174, 234, 238, 1, 249, 30, 234, 238, 1, 248, 97, 234, 238, - 1, 207, 234, 238, 1, 195, 234, 238, 1, 226, 59, 234, 238, 1, 252, 234, - 234, 238, 1, 252, 65, 234, 238, 1, 191, 234, 238, 1, 189, 234, 238, 1, - 208, 234, 238, 1, 233, 255, 234, 238, 1, 215, 8, 234, 238, 1, 221, 47, - 234, 238, 1, 219, 176, 234, 238, 1, 222, 227, 234, 238, 1, 212, 109, 234, - 238, 1, 162, 234, 238, 1, 234, 166, 234, 238, 1, 216, 96, 234, 238, 5, - 252, 187, 50, 234, 238, 5, 251, 21, 234, 238, 5, 62, 55, 234, 238, 214, - 137, 234, 238, 21, 118, 234, 238, 21, 112, 234, 238, 21, 170, 234, 238, - 21, 167, 234, 238, 51, 217, 213, 234, 238, 51, 216, 45, 234, 238, 51, - 124, 241, 62, 234, 238, 51, 124, 217, 113, 234, 238, 225, 63, 247, 195, - 234, 238, 225, 63, 4, 250, 95, 234, 238, 225, 63, 250, 95, 234, 238, 225, - 63, 249, 200, 134, 234, 238, 225, 63, 232, 58, 234, 238, 225, 63, 232, - 244, 234, 238, 225, 63, 248, 245, 234, 238, 225, 63, 52, 248, 245, 234, - 238, 225, 63, 233, 77, 54, 219, 234, 254, 79, 1, 242, 85, 54, 219, 234, - 254, 79, 1, 233, 215, 54, 219, 234, 254, 79, 1, 242, 43, 54, 219, 234, - 254, 79, 1, 231, 199, 54, 219, 234, 254, 79, 1, 224, 214, 54, 219, 234, - 254, 79, 1, 214, 17, 54, 219, 234, 254, 79, 1, 220, 221, 54, 219, 234, - 254, 79, 1, 223, 253, 54, 219, 234, 254, 79, 1, 252, 72, 54, 219, 234, - 254, 79, 1, 218, 0, 54, 219, 234, 254, 79, 1, 222, 166, 54, 219, 234, - 254, 79, 1, 235, 87, 54, 219, 234, 254, 79, 1, 228, 93, 54, 219, 234, - 254, 79, 1, 234, 234, 54, 219, 234, 254, 79, 1, 222, 218, 54, 219, 234, - 254, 79, 1, 222, 188, 54, 219, 234, 254, 79, 1, 244, 243, 54, 219, 234, - 254, 79, 1, 254, 205, 54, 219, 234, 254, 79, 1, 253, 204, 54, 219, 234, - 254, 79, 1, 248, 95, 54, 219, 234, 254, 79, 1, 243, 41, 54, 219, 234, - 254, 79, 1, 248, 255, 54, 219, 234, 254, 79, 1, 243, 78, 54, 219, 234, - 254, 79, 1, 217, 192, 54, 219, 234, 254, 79, 1, 212, 89, 54, 219, 234, - 254, 79, 1, 248, 92, 54, 219, 234, 254, 79, 1, 212, 224, 54, 219, 234, - 254, 79, 1, 217, 163, 54, 219, 234, 254, 79, 1, 217, 144, 54, 219, 234, - 254, 79, 51, 118, 54, 219, 234, 254, 79, 51, 244, 203, 54, 219, 234, 254, - 79, 130, 236, 96, 253, 215, 1, 63, 253, 215, 1, 255, 104, 253, 215, 1, - 254, 111, 253, 215, 1, 255, 63, 253, 215, 1, 254, 159, 253, 215, 1, 255, - 64, 253, 215, 1, 255, 20, 253, 215, 1, 255, 16, 253, 215, 1, 77, 253, - 215, 1, 246, 30, 253, 215, 1, 78, 253, 215, 1, 227, 86, 253, 215, 1, 75, - 253, 215, 1, 236, 145, 253, 215, 1, 72, 253, 215, 1, 215, 98, 253, 215, - 1, 235, 44, 253, 215, 1, 213, 153, 253, 215, 1, 213, 119, 253, 215, 1, - 213, 128, 253, 215, 1, 243, 158, 253, 215, 1, 243, 120, 253, 215, 1, 243, - 76, 253, 215, 1, 250, 247, 253, 215, 1, 235, 242, 253, 215, 1, 217, 242, - 253, 215, 1, 217, 161, 253, 215, 1, 248, 162, 253, 215, 1, 248, 90, 253, - 215, 1, 216, 123, 253, 215, 1, 226, 132, 253, 215, 1, 244, 243, 253, 215, - 1, 252, 121, 253, 215, 1, 252, 62, 253, 215, 1, 229, 214, 253, 215, 1, - 229, 134, 253, 215, 1, 229, 135, 253, 215, 1, 229, 254, 253, 215, 1, 228, - 56, 253, 215, 1, 229, 2, 253, 215, 1, 231, 226, 253, 215, 1, 241, 221, - 253, 215, 1, 212, 159, 253, 215, 1, 213, 39, 253, 215, 1, 214, 237, 253, - 215, 1, 224, 55, 253, 215, 1, 233, 180, 253, 215, 1, 222, 123, 253, 215, - 1, 212, 87, 253, 215, 1, 221, 8, 253, 215, 1, 212, 67, 253, 215, 1, 220, - 143, 253, 215, 1, 219, 146, 253, 215, 1, 242, 85, 253, 215, 255, 53, 79, - 217, 46, 119, 181, 113, 124, 62, 225, 62, 4, 119, 181, 113, 124, 62, 225, - 62, 233, 207, 119, 181, 113, 124, 62, 225, 62, 233, 207, 124, 62, 113, - 119, 181, 225, 62, 233, 207, 119, 223, 163, 113, 124, 223, 165, 225, 62, - 233, 207, 124, 223, 165, 113, 119, 223, 163, 225, 62, 236, 76, 226, 163, - 1, 254, 203, 236, 76, 226, 163, 1, 252, 72, 236, 76, 226, 163, 1, 243, - 41, 236, 76, 226, 163, 1, 248, 255, 236, 76, 226, 163, 1, 242, 85, 236, - 76, 226, 163, 1, 214, 17, 236, 76, 226, 163, 1, 212, 90, 236, 76, 226, - 163, 1, 242, 43, 236, 76, 226, 163, 1, 217, 192, 236, 76, 226, 163, 1, - 212, 224, 236, 76, 226, 163, 1, 235, 87, 236, 76, 226, 163, 1, 233, 215, - 236, 76, 226, 163, 1, 231, 199, 236, 76, 226, 163, 1, 228, 93, 236, 76, - 226, 163, 1, 222, 188, 236, 76, 226, 163, 1, 253, 205, 236, 76, 226, 163, - 1, 226, 132, 236, 76, 226, 163, 1, 222, 218, 236, 76, 226, 163, 1, 224, - 214, 236, 76, 226, 163, 1, 223, 253, 236, 76, 226, 163, 1, 220, 221, 236, - 76, 226, 163, 1, 218, 0, 236, 76, 226, 163, 51, 118, 236, 76, 226, 163, - 51, 112, 236, 76, 226, 163, 51, 170, 236, 76, 226, 163, 51, 167, 236, 76, - 226, 163, 51, 217, 213, 236, 76, 226, 163, 51, 216, 45, 236, 76, 226, - 163, 51, 124, 241, 62, 236, 76, 226, 163, 51, 124, 217, 113, 236, 76, - 226, 236, 1, 254, 203, 236, 76, 226, 236, 1, 252, 72, 236, 76, 226, 236, - 1, 243, 41, 236, 76, 226, 236, 1, 248, 255, 236, 76, 226, 236, 1, 242, - 85, 236, 76, 226, 236, 1, 214, 16, 236, 76, 226, 236, 1, 212, 90, 236, - 76, 226, 236, 1, 242, 43, 236, 76, 226, 236, 1, 217, 192, 236, 76, 226, - 236, 1, 212, 224, 236, 76, 226, 236, 1, 235, 87, 236, 76, 226, 236, 1, - 233, 215, 236, 76, 226, 236, 1, 231, 198, 236, 76, 226, 236, 1, 228, 93, - 236, 76, 226, 236, 1, 222, 188, 236, 76, 226, 236, 1, 226, 132, 236, 76, - 226, 236, 1, 222, 218, 236, 76, 226, 236, 1, 220, 221, 236, 76, 226, 236, - 1, 218, 0, 236, 76, 226, 236, 51, 118, 236, 76, 226, 236, 51, 112, 236, - 76, 226, 236, 51, 170, 236, 76, 226, 236, 51, 167, 236, 76, 226, 236, 51, - 217, 213, 236, 76, 226, 236, 51, 216, 45, 236, 76, 226, 236, 51, 124, - 241, 62, 236, 76, 226, 236, 51, 124, 217, 113, 54, 188, 1, 227, 54, 63, - 54, 188, 1, 213, 29, 63, 54, 188, 1, 213, 29, 255, 20, 54, 188, 1, 227, - 54, 75, 54, 188, 1, 213, 29, 75, 54, 188, 1, 213, 29, 77, 54, 188, 1, - 227, 54, 78, 54, 188, 1, 227, 54, 227, 136, 54, 188, 1, 213, 29, 227, - 136, 54, 188, 1, 227, 54, 255, 57, 54, 188, 1, 213, 29, 255, 57, 54, 188, - 1, 227, 54, 255, 19, 54, 188, 1, 213, 29, 255, 19, 54, 188, 1, 227, 54, - 254, 249, 54, 188, 1, 213, 29, 254, 249, 54, 188, 1, 227, 54, 255, 14, - 54, 188, 1, 213, 29, 255, 14, 54, 188, 1, 227, 54, 255, 32, 54, 188, 1, - 213, 29, 255, 32, 54, 188, 1, 227, 54, 255, 18, 54, 188, 1, 227, 54, 245, - 101, 54, 188, 1, 213, 29, 245, 101, 54, 188, 1, 227, 54, 253, 210, 54, - 188, 1, 213, 29, 253, 210, 54, 188, 1, 227, 54, 255, 1, 54, 188, 1, 213, - 29, 255, 1, 54, 188, 1, 227, 54, 255, 12, 54, 188, 1, 213, 29, 255, 12, - 54, 188, 1, 227, 54, 227, 135, 54, 188, 1, 213, 29, 227, 135, 54, 188, 1, - 227, 54, 254, 213, 54, 188, 1, 213, 29, 254, 213, 54, 188, 1, 227, 54, - 255, 11, 54, 188, 1, 227, 54, 245, 240, 54, 188, 1, 227, 54, 245, 238, - 54, 188, 1, 227, 54, 254, 159, 54, 188, 1, 227, 54, 255, 9, 54, 188, 1, - 213, 29, 255, 9, 54, 188, 1, 227, 54, 245, 211, 54, 188, 1, 213, 29, 245, - 211, 54, 188, 1, 227, 54, 245, 226, 54, 188, 1, 213, 29, 245, 226, 54, - 188, 1, 227, 54, 245, 198, 54, 188, 1, 213, 29, 245, 198, 54, 188, 1, - 213, 29, 254, 151, 54, 188, 1, 227, 54, 245, 217, 54, 188, 1, 213, 29, - 255, 8, 54, 188, 1, 227, 54, 245, 191, 54, 188, 1, 227, 54, 227, 78, 54, - 188, 1, 227, 54, 240, 223, 54, 188, 1, 227, 54, 246, 36, 54, 188, 1, 213, - 29, 246, 36, 54, 188, 1, 227, 54, 254, 86, 54, 188, 1, 213, 29, 254, 86, - 54, 188, 1, 227, 54, 236, 40, 54, 188, 1, 213, 29, 236, 40, 54, 188, 1, - 227, 54, 227, 63, 54, 188, 1, 213, 29, 227, 63, 54, 188, 1, 227, 54, 254, - 82, 54, 188, 1, 213, 29, 254, 82, 54, 188, 1, 227, 54, 255, 7, 54, 188, - 1, 227, 54, 254, 23, 54, 188, 1, 227, 54, 255, 5, 54, 188, 1, 227, 54, - 254, 17, 54, 188, 1, 213, 29, 254, 17, 54, 188, 1, 227, 54, 245, 161, 54, - 188, 1, 213, 29, 245, 161, 54, 188, 1, 227, 54, 253, 249, 54, 188, 1, - 213, 29, 253, 249, 54, 188, 1, 227, 54, 255, 2, 54, 188, 1, 213, 29, 255, - 2, 54, 188, 1, 227, 54, 227, 46, 54, 188, 1, 227, 54, 252, 171, 223, 64, - 21, 118, 223, 64, 21, 112, 223, 64, 21, 170, 223, 64, 21, 167, 223, 64, - 21, 185, 223, 64, 21, 192, 223, 64, 21, 200, 223, 64, 21, 198, 223, 64, - 21, 203, 223, 64, 51, 217, 213, 223, 64, 51, 216, 45, 223, 64, 51, 217, - 128, 223, 64, 51, 244, 104, 223, 64, 51, 244, 203, 223, 64, 51, 220, 58, - 223, 64, 51, 221, 60, 223, 64, 51, 246, 6, 223, 64, 51, 229, 90, 223, 64, - 51, 124, 241, 62, 223, 64, 51, 119, 241, 62, 223, 64, 51, 137, 241, 62, - 223, 64, 51, 244, 101, 241, 62, 223, 64, 51, 244, 170, 241, 62, 223, 64, - 51, 220, 72, 241, 62, 223, 64, 51, 221, 66, 241, 62, 223, 64, 51, 246, - 15, 241, 62, 223, 64, 51, 229, 95, 241, 62, 223, 64, 244, 92, 124, 242, - 129, 223, 64, 244, 92, 124, 224, 201, 223, 64, 244, 92, 124, 217, 134, - 223, 64, 244, 92, 119, 217, 132, 114, 5, 251, 55, 114, 5, 254, 113, 114, - 5, 214, 132, 114, 5, 235, 219, 114, 5, 215, 138, 114, 1, 63, 114, 1, 255, - 104, 114, 1, 75, 114, 1, 236, 145, 114, 1, 72, 114, 1, 215, 98, 114, 1, - 165, 152, 114, 1, 165, 223, 116, 114, 1, 165, 155, 114, 1, 165, 233, 55, - 114, 1, 77, 114, 1, 254, 236, 114, 1, 78, 114, 1, 253, 235, 114, 1, 183, - 114, 1, 234, 250, 114, 1, 243, 230, 114, 1, 243, 89, 114, 1, 229, 226, - 114, 1, 251, 88, 114, 1, 250, 215, 114, 1, 236, 0, 114, 1, 235, 230, 114, - 1, 228, 64, 114, 1, 216, 128, 114, 1, 216, 116, 114, 1, 248, 207, 114, 1, - 248, 191, 114, 1, 229, 6, 114, 1, 218, 66, 114, 1, 217, 174, 114, 1, 249, - 30, 114, 1, 248, 97, 114, 1, 207, 114, 1, 195, 114, 1, 226, 59, 114, 1, - 252, 234, 114, 1, 252, 65, 114, 1, 191, 114, 1, 189, 114, 1, 208, 114, 1, - 233, 255, 114, 1, 215, 8, 114, 1, 221, 47, 114, 1, 219, 176, 114, 1, 222, - 227, 114, 1, 162, 114, 1, 233, 54, 114, 1, 54, 36, 233, 45, 114, 1, 54, - 36, 223, 115, 114, 1, 54, 36, 228, 246, 114, 30, 5, 255, 104, 114, 30, 5, - 252, 63, 255, 104, 114, 30, 5, 75, 114, 30, 5, 236, 145, 114, 30, 5, 72, - 114, 30, 5, 215, 98, 114, 30, 5, 165, 152, 114, 30, 5, 165, 223, 116, - 114, 30, 5, 165, 155, 114, 30, 5, 165, 233, 55, 114, 30, 5, 77, 114, 30, - 5, 254, 236, 114, 30, 5, 78, 114, 30, 5, 253, 235, 114, 214, 137, 114, - 248, 245, 114, 52, 248, 245, 114, 225, 63, 247, 195, 114, 225, 63, 52, - 247, 195, 114, 225, 63, 233, 83, 114, 225, 63, 249, 200, 134, 114, 225, - 63, 232, 244, 114, 51, 118, 114, 51, 112, 114, 51, 170, 114, 51, 167, - 114, 51, 185, 114, 51, 192, 114, 51, 200, 114, 51, 198, 114, 51, 203, - 114, 51, 217, 213, 114, 51, 216, 45, 114, 51, 217, 128, 114, 51, 244, - 104, 114, 51, 244, 203, 114, 51, 220, 58, 114, 51, 221, 60, 114, 51, 246, - 6, 114, 51, 229, 90, 114, 51, 124, 241, 62, 114, 51, 124, 217, 113, 114, - 21, 212, 79, 114, 21, 118, 114, 21, 112, 114, 21, 170, 114, 21, 167, 114, - 21, 185, 114, 21, 192, 114, 21, 200, 114, 21, 198, 114, 21, 203, 235, - 106, 5, 251, 55, 235, 106, 5, 254, 113, 235, 106, 5, 214, 132, 235, 106, - 1, 63, 235, 106, 1, 255, 104, 235, 106, 1, 75, 235, 106, 1, 236, 145, - 235, 106, 1, 72, 235, 106, 1, 215, 98, 235, 106, 1, 77, 235, 106, 1, 254, - 236, 235, 106, 1, 78, 235, 106, 1, 253, 235, 235, 106, 1, 183, 235, 106, - 1, 234, 250, 235, 106, 1, 243, 230, 235, 106, 1, 243, 89, 235, 106, 1, - 229, 226, 235, 106, 1, 251, 88, 235, 106, 1, 250, 215, 235, 106, 1, 236, - 0, 235, 106, 1, 235, 230, 235, 106, 1, 228, 64, 235, 106, 1, 216, 128, - 235, 106, 1, 216, 116, 235, 106, 1, 248, 207, 235, 106, 1, 248, 196, 235, - 106, 1, 248, 191, 235, 106, 1, 223, 226, 235, 106, 1, 229, 6, 235, 106, - 1, 218, 66, 235, 106, 1, 217, 174, 235, 106, 1, 249, 30, 235, 106, 1, - 248, 97, 235, 106, 1, 207, 235, 106, 1, 195, 235, 106, 1, 226, 59, 235, - 106, 1, 252, 234, 235, 106, 1, 252, 65, 235, 106, 1, 191, 235, 106, 1, - 189, 235, 106, 1, 208, 235, 106, 1, 233, 255, 235, 106, 1, 215, 8, 235, - 106, 1, 221, 47, 235, 106, 1, 219, 176, 235, 106, 1, 222, 227, 235, 106, - 1, 162, 235, 106, 30, 5, 255, 104, 235, 106, 30, 5, 75, 235, 106, 30, 5, - 236, 145, 235, 106, 30, 5, 72, 235, 106, 30, 5, 215, 98, 235, 106, 30, 5, - 77, 235, 106, 30, 5, 254, 236, 235, 106, 30, 5, 78, 235, 106, 30, 5, 253, - 235, 235, 106, 5, 214, 137, 235, 106, 5, 228, 103, 235, 106, 255, 53, 53, - 235, 106, 245, 201, 53, 235, 106, 51, 53, 235, 106, 222, 115, 79, 235, - 106, 52, 222, 115, 79, 235, 106, 248, 245, 235, 106, 52, 248, 245, 15, 5, - 63, 15, 5, 111, 29, 63, 15, 5, 111, 29, 252, 221, 15, 5, 111, 29, 243, - 201, 217, 205, 15, 5, 111, 29, 162, 15, 5, 111, 29, 236, 147, 15, 5, 111, - 29, 233, 237, 242, 196, 15, 5, 111, 29, 230, 201, 15, 5, 111, 29, 222, - 215, 15, 5, 255, 106, 15, 5, 255, 57, 15, 5, 255, 58, 29, 254, 15, 15, 5, - 255, 58, 29, 246, 143, 242, 196, 15, 5, 255, 58, 29, 243, 214, 15, 5, - 255, 58, 29, 243, 201, 217, 205, 15, 5, 255, 58, 29, 162, 15, 5, 255, 58, - 29, 236, 148, 242, 196, 15, 5, 255, 58, 29, 236, 121, 15, 5, 255, 58, 29, - 233, 238, 15, 5, 255, 58, 29, 220, 249, 15, 5, 255, 58, 29, 103, 95, 103, - 95, 72, 15, 5, 255, 58, 242, 196, 15, 5, 255, 55, 15, 5, 255, 56, 29, - 252, 206, 15, 5, 255, 56, 29, 243, 201, 217, 205, 15, 5, 255, 56, 29, - 231, 227, 95, 245, 229, 15, 5, 255, 56, 29, 221, 45, 15, 5, 255, 56, 29, - 218, 35, 15, 5, 255, 32, 15, 5, 254, 221, 15, 5, 254, 222, 29, 245, 171, - 15, 5, 254, 222, 29, 220, 211, 95, 243, 30, 15, 5, 254, 213, 15, 5, 254, - 214, 29, 254, 213, 15, 5, 254, 214, 29, 248, 33, 15, 5, 254, 214, 29, - 243, 30, 15, 5, 254, 214, 29, 162, 15, 5, 254, 214, 29, 235, 117, 15, 5, - 254, 214, 29, 234, 212, 15, 5, 254, 214, 29, 221, 8, 15, 5, 254, 214, 29, - 215, 106, 15, 5, 254, 210, 15, 5, 254, 203, 15, 5, 254, 168, 15, 5, 254, - 169, 29, 221, 8, 15, 5, 254, 159, 15, 5, 254, 160, 113, 254, 159, 15, 5, - 254, 160, 137, 217, 52, 15, 5, 254, 160, 95, 230, 104, 227, 68, 254, 160, - 95, 230, 103, 15, 5, 254, 160, 95, 230, 104, 219, 184, 15, 5, 254, 132, - 15, 5, 254, 106, 15, 5, 254, 76, 15, 5, 254, 77, 29, 234, 60, 15, 5, 254, - 50, 15, 5, 254, 22, 15, 5, 254, 17, 15, 5, 254, 18, 212, 33, 217, 205, - 15, 5, 254, 18, 235, 121, 217, 205, 15, 5, 254, 18, 113, 254, 18, 216, - 86, 113, 216, 86, 216, 86, 113, 216, 86, 226, 186, 15, 5, 254, 18, 113, - 254, 18, 113, 254, 17, 15, 5, 254, 18, 113, 254, 18, 113, 254, 18, 249, - 188, 254, 18, 113, 254, 18, 113, 254, 17, 15, 5, 254, 15, 15, 5, 254, 12, - 15, 5, 252, 234, 15, 5, 252, 221, 15, 5, 252, 216, 15, 5, 252, 213, 15, - 5, 252, 207, 15, 5, 252, 208, 113, 252, 207, 15, 5, 252, 206, 15, 5, 134, - 15, 5, 252, 186, 15, 5, 252, 54, 15, 5, 252, 55, 29, 63, 15, 5, 252, 55, - 29, 243, 192, 15, 5, 252, 55, 29, 236, 148, 242, 196, 15, 5, 251, 179, - 15, 5, 251, 180, 113, 251, 180, 255, 57, 15, 5, 251, 180, 113, 251, 180, - 215, 166, 15, 5, 251, 180, 249, 188, 251, 179, 15, 5, 251, 163, 15, 5, - 251, 164, 113, 251, 163, 15, 5, 251, 152, 15, 5, 251, 151, 15, 5, 249, - 30, 15, 5, 249, 21, 15, 5, 249, 22, 234, 186, 29, 111, 95, 232, 25, 15, - 5, 249, 22, 234, 186, 29, 254, 168, 15, 5, 249, 22, 234, 186, 29, 252, - 206, 15, 5, 249, 22, 234, 186, 29, 252, 54, 15, 5, 249, 22, 234, 186, 29, - 243, 230, 15, 5, 249, 22, 234, 186, 29, 243, 231, 95, 232, 25, 15, 5, - 249, 22, 234, 186, 29, 243, 54, 15, 5, 249, 22, 234, 186, 29, 243, 37, - 15, 5, 249, 22, 234, 186, 29, 242, 205, 15, 5, 249, 22, 234, 186, 29, - 162, 15, 5, 249, 22, 234, 186, 29, 236, 38, 15, 5, 249, 22, 234, 186, 29, - 236, 39, 95, 232, 230, 15, 5, 249, 22, 234, 186, 29, 235, 104, 15, 5, - 249, 22, 234, 186, 29, 233, 255, 15, 5, 249, 22, 234, 186, 29, 232, 230, - 15, 5, 249, 22, 234, 186, 29, 232, 231, 95, 232, 24, 15, 5, 249, 22, 234, - 186, 29, 232, 216, 15, 5, 249, 22, 234, 186, 29, 229, 254, 15, 5, 249, - 22, 234, 186, 29, 226, 187, 95, 226, 186, 15, 5, 249, 22, 234, 186, 29, - 220, 136, 15, 5, 249, 22, 234, 186, 29, 218, 35, 15, 5, 249, 22, 234, - 186, 29, 215, 204, 95, 243, 37, 15, 5, 249, 22, 234, 186, 29, 215, 106, - 15, 5, 248, 254, 15, 5, 248, 233, 15, 5, 248, 232, 15, 5, 248, 231, 15, - 5, 248, 76, 15, 5, 248, 59, 15, 5, 248, 34, 15, 5, 248, 35, 29, 221, 8, - 15, 5, 248, 33, 15, 5, 248, 23, 15, 5, 248, 24, 235, 70, 103, 242, 197, - 248, 4, 15, 5, 248, 4, 15, 5, 246, 154, 15, 5, 246, 155, 113, 246, 154, - 15, 5, 246, 155, 242, 196, 15, 5, 246, 155, 220, 246, 15, 5, 246, 152, - 15, 5, 246, 153, 29, 245, 158, 15, 5, 246, 151, 15, 5, 246, 150, 15, 5, - 246, 149, 15, 5, 246, 148, 15, 5, 246, 144, 15, 5, 246, 142, 15, 5, 246, - 143, 242, 196, 15, 5, 246, 143, 242, 197, 242, 196, 15, 5, 246, 141, 15, - 5, 246, 134, 15, 5, 77, 15, 5, 154, 29, 226, 186, 15, 5, 154, 113, 154, - 228, 94, 113, 228, 93, 15, 5, 246, 55, 15, 5, 246, 56, 29, 111, 95, 242, - 151, 95, 249, 30, 15, 5, 246, 56, 29, 243, 192, 15, 5, 246, 56, 29, 231, - 112, 15, 5, 246, 56, 29, 222, 203, 15, 5, 246, 56, 29, 221, 8, 15, 5, - 246, 56, 29, 72, 15, 5, 246, 32, 15, 5, 246, 22, 15, 5, 245, 252, 15, 5, - 245, 229, 15, 5, 245, 230, 29, 243, 200, 15, 5, 245, 230, 29, 243, 201, - 217, 205, 15, 5, 245, 230, 29, 231, 226, 15, 5, 245, 230, 249, 188, 245, - 229, 15, 5, 245, 230, 227, 68, 245, 229, 15, 5, 245, 230, 219, 184, 15, - 5, 245, 173, 15, 5, 245, 171, 15, 5, 245, 158, 15, 5, 245, 99, 15, 5, - 245, 100, 29, 63, 15, 5, 245, 100, 29, 111, 95, 233, 226, 15, 5, 245, - 100, 29, 111, 95, 233, 227, 29, 233, 226, 15, 5, 245, 100, 29, 254, 159, - 15, 5, 245, 100, 29, 252, 221, 15, 5, 245, 100, 29, 246, 143, 242, 196, - 15, 5, 245, 100, 29, 246, 143, 242, 197, 242, 196, 15, 5, 245, 100, 29, - 162, 15, 5, 245, 100, 29, 242, 151, 242, 196, 15, 5, 245, 100, 29, 236, - 148, 242, 196, 15, 5, 245, 100, 29, 235, 69, 15, 5, 245, 100, 29, 235, - 70, 219, 184, 15, 5, 245, 100, 29, 234, 79, 15, 5, 245, 100, 29, 233, - 255, 15, 5, 245, 100, 29, 233, 227, 29, 233, 226, 15, 5, 245, 100, 29, - 233, 111, 15, 5, 245, 100, 29, 232, 230, 15, 5, 245, 100, 29, 215, 203, - 15, 5, 245, 100, 29, 215, 194, 15, 5, 243, 230, 15, 5, 243, 231, 242, - 196, 15, 5, 243, 228, 15, 5, 243, 229, 29, 111, 95, 249, 31, 95, 162, 15, - 5, 243, 229, 29, 111, 95, 162, 15, 5, 243, 229, 29, 111, 95, 236, 147, - 15, 5, 243, 229, 29, 255, 56, 217, 206, 95, 218, 55, 15, 5, 243, 229, 29, - 254, 159, 15, 5, 243, 229, 29, 254, 17, 15, 5, 243, 229, 29, 254, 16, 95, - 243, 214, 15, 5, 243, 229, 29, 252, 221, 15, 5, 243, 229, 29, 252, 187, - 95, 208, 15, 5, 243, 229, 29, 251, 152, 15, 5, 243, 229, 29, 251, 153, - 95, 208, 15, 5, 243, 229, 29, 249, 30, 15, 5, 243, 229, 29, 248, 76, 15, - 5, 243, 229, 29, 248, 35, 29, 221, 8, 15, 5, 243, 229, 29, 246, 152, 15, - 5, 243, 229, 29, 245, 252, 15, 5, 243, 229, 29, 245, 253, 95, 233, 255, - 15, 5, 243, 229, 29, 245, 229, 15, 5, 243, 229, 29, 245, 230, 29, 243, - 201, 217, 205, 15, 5, 243, 229, 29, 243, 201, 217, 205, 15, 5, 243, 229, - 29, 243, 192, 15, 5, 243, 229, 29, 243, 54, 15, 5, 243, 229, 29, 243, 52, - 15, 5, 243, 229, 29, 243, 53, 95, 63, 15, 5, 243, 229, 29, 243, 38, 95, - 219, 41, 15, 5, 243, 229, 29, 242, 151, 95, 232, 231, 95, 245, 158, 15, - 5, 243, 229, 29, 242, 132, 15, 5, 243, 229, 29, 242, 133, 95, 233, 255, - 15, 5, 243, 229, 29, 242, 29, 95, 233, 111, 15, 5, 243, 229, 29, 241, 70, - 15, 5, 243, 229, 29, 236, 148, 242, 196, 15, 5, 243, 229, 29, 236, 25, - 95, 241, 75, 95, 254, 17, 15, 5, 243, 229, 29, 235, 104, 15, 5, 243, 229, - 29, 235, 69, 15, 5, 243, 229, 29, 234, 209, 15, 5, 243, 229, 29, 234, - 210, 95, 233, 226, 15, 5, 243, 229, 29, 234, 80, 95, 254, 159, 15, 5, - 243, 229, 29, 233, 255, 15, 5, 243, 229, 29, 231, 227, 95, 245, 229, 15, - 5, 243, 229, 29, 231, 112, 15, 5, 243, 229, 29, 228, 93, 15, 5, 243, 229, - 29, 228, 94, 113, 228, 93, 15, 5, 243, 229, 29, 195, 15, 5, 243, 229, 29, - 222, 203, 15, 5, 243, 229, 29, 222, 171, 15, 5, 243, 229, 29, 221, 8, 15, - 5, 243, 229, 29, 221, 9, 95, 216, 70, 15, 5, 243, 229, 29, 220, 231, 15, - 5, 243, 229, 29, 219, 2, 15, 5, 243, 229, 29, 218, 35, 15, 5, 243, 229, - 29, 72, 15, 5, 243, 229, 29, 215, 194, 15, 5, 243, 229, 29, 215, 195, 95, - 246, 154, 15, 5, 243, 229, 113, 243, 228, 15, 5, 243, 223, 15, 5, 243, - 224, 249, 188, 243, 223, 15, 5, 243, 221, 15, 5, 243, 222, 113, 243, 222, - 243, 193, 113, 243, 192, 15, 5, 243, 214, 15, 5, 243, 215, 243, 222, 113, - 243, 222, 243, 193, 113, 243, 192, 15, 5, 243, 213, 15, 5, 243, 211, 15, - 5, 243, 202, 15, 5, 243, 200, 15, 5, 243, 201, 217, 205, 15, 5, 243, 201, - 113, 243, 200, 15, 5, 243, 201, 249, 188, 243, 200, 15, 5, 243, 192, 15, - 5, 243, 191, 15, 5, 243, 186, 15, 5, 243, 132, 15, 5, 243, 133, 29, 234, - 60, 15, 5, 243, 54, 15, 5, 243, 55, 29, 77, 15, 5, 243, 55, 29, 72, 15, - 5, 243, 55, 249, 188, 243, 54, 15, 5, 243, 52, 15, 5, 243, 53, 113, 243, - 52, 15, 5, 243, 53, 249, 188, 243, 52, 15, 5, 243, 49, 15, 5, 243, 37, - 15, 5, 243, 38, 242, 196, 15, 5, 243, 35, 15, 5, 243, 36, 29, 111, 95, - 236, 147, 15, 5, 243, 36, 29, 243, 201, 217, 205, 15, 5, 243, 36, 29, - 236, 147, 15, 5, 243, 36, 29, 232, 231, 95, 236, 147, 15, 5, 243, 36, 29, - 195, 15, 5, 243, 32, 15, 5, 243, 30, 15, 5, 243, 31, 249, 188, 243, 30, - 15, 5, 243, 31, 29, 252, 221, 15, 5, 243, 31, 29, 218, 35, 15, 5, 243, - 31, 217, 205, 15, 5, 242, 213, 15, 5, 242, 214, 249, 188, 242, 213, 15, - 5, 242, 211, 15, 5, 242, 212, 29, 235, 104, 15, 5, 242, 212, 29, 235, - 105, 29, 236, 148, 242, 196, 15, 5, 242, 212, 29, 228, 93, 15, 5, 242, - 212, 29, 222, 204, 95, 216, 85, 15, 5, 242, 212, 242, 196, 15, 5, 242, - 205, 15, 5, 242, 206, 29, 111, 95, 234, 60, 15, 5, 242, 206, 29, 234, 60, - 15, 5, 242, 206, 113, 242, 206, 232, 223, 15, 5, 242, 200, 15, 5, 242, - 198, 15, 5, 242, 199, 29, 221, 8, 15, 5, 242, 190, 15, 5, 242, 189, 15, - 5, 242, 186, 15, 5, 242, 185, 15, 5, 162, 15, 5, 242, 151, 217, 205, 15, - 5, 242, 151, 242, 196, 15, 5, 242, 132, 15, 5, 242, 28, 15, 5, 242, 29, - 29, 254, 17, 15, 5, 242, 29, 29, 254, 15, 15, 5, 242, 29, 29, 252, 221, - 15, 5, 242, 29, 29, 248, 4, 15, 5, 242, 29, 29, 243, 221, 15, 5, 242, 29, - 29, 234, 201, 15, 5, 242, 29, 29, 228, 93, 15, 5, 242, 29, 29, 221, 8, - 15, 5, 242, 29, 29, 72, 15, 5, 241, 74, 15, 5, 241, 70, 15, 5, 241, 71, - 29, 254, 159, 15, 5, 241, 71, 29, 242, 132, 15, 5, 241, 71, 29, 235, 69, - 15, 5, 241, 71, 29, 233, 67, 15, 5, 241, 71, 29, 215, 194, 15, 5, 241, - 67, 15, 5, 75, 15, 5, 241, 7, 63, 15, 5, 240, 225, 15, 5, 236, 175, 15, - 5, 236, 176, 113, 236, 176, 251, 152, 15, 5, 236, 176, 113, 236, 176, - 219, 184, 15, 5, 236, 150, 15, 5, 236, 147, 15, 5, 236, 148, 248, 59, 15, - 5, 236, 148, 223, 222, 15, 5, 236, 148, 113, 236, 148, 220, 215, 113, - 220, 215, 215, 195, 113, 215, 194, 15, 5, 236, 148, 242, 196, 15, 5, 236, - 139, 15, 5, 236, 140, 29, 243, 201, 217, 205, 15, 5, 236, 138, 15, 5, - 236, 128, 15, 5, 236, 129, 29, 218, 35, 15, 5, 236, 129, 249, 188, 236, - 128, 15, 5, 236, 129, 227, 68, 236, 128, 15, 5, 236, 129, 219, 184, 15, - 5, 236, 121, 15, 5, 236, 112, 15, 5, 236, 38, 15, 5, 236, 24, 15, 5, 183, - 15, 5, 235, 131, 29, 63, 15, 5, 235, 131, 29, 255, 32, 15, 5, 235, 131, - 29, 255, 33, 95, 234, 79, 15, 5, 235, 131, 29, 254, 15, 15, 5, 235, 131, - 29, 252, 221, 15, 5, 235, 131, 29, 252, 206, 15, 5, 235, 131, 29, 134, - 15, 5, 235, 131, 29, 252, 54, 15, 5, 235, 131, 29, 245, 171, 15, 5, 235, - 131, 29, 245, 158, 15, 5, 235, 131, 29, 243, 230, 15, 5, 235, 131, 29, - 243, 214, 15, 5, 235, 131, 29, 243, 201, 217, 205, 15, 5, 235, 131, 29, - 243, 192, 15, 5, 235, 131, 29, 243, 193, 95, 221, 46, 95, 63, 15, 5, 235, - 131, 29, 243, 54, 15, 5, 235, 131, 29, 243, 37, 15, 5, 235, 131, 29, 243, - 31, 95, 222, 171, 15, 5, 235, 131, 29, 243, 31, 249, 188, 243, 30, 15, 5, - 235, 131, 29, 242, 213, 15, 5, 235, 131, 29, 242, 189, 15, 5, 235, 131, - 29, 236, 147, 15, 5, 235, 131, 29, 236, 128, 15, 5, 235, 131, 29, 235, - 104, 15, 5, 235, 131, 29, 234, 212, 15, 5, 235, 131, 29, 234, 209, 15, 5, - 235, 131, 29, 233, 111, 15, 5, 235, 131, 29, 232, 230, 15, 5, 235, 131, - 29, 231, 226, 15, 5, 235, 131, 29, 231, 227, 95, 246, 154, 15, 5, 235, - 131, 29, 231, 227, 95, 243, 54, 15, 5, 235, 131, 29, 231, 227, 95, 217, - 242, 15, 5, 235, 131, 29, 231, 112, 15, 5, 235, 131, 29, 231, 113, 95, - 228, 88, 15, 5, 235, 131, 29, 229, 254, 15, 5, 235, 131, 29, 228, 93, 15, - 5, 235, 131, 29, 226, 20, 15, 5, 235, 131, 29, 223, 77, 15, 5, 235, 131, - 29, 222, 227, 15, 5, 235, 131, 29, 222, 171, 15, 5, 235, 131, 29, 221, - 47, 15, 5, 235, 131, 29, 221, 8, 15, 5, 235, 131, 29, 220, 231, 15, 5, - 235, 131, 29, 220, 170, 15, 5, 235, 131, 29, 220, 127, 15, 5, 235, 131, - 29, 219, 10, 15, 5, 235, 131, 29, 218, 14, 15, 5, 235, 131, 29, 72, 15, - 5, 235, 131, 29, 215, 203, 15, 5, 235, 131, 29, 215, 194, 15, 5, 235, - 131, 29, 215, 169, 29, 195, 15, 5, 235, 131, 29, 215, 106, 15, 5, 235, - 131, 29, 212, 37, 15, 5, 235, 129, 15, 5, 235, 130, 249, 188, 235, 129, - 15, 5, 235, 122, 15, 5, 235, 119, 15, 5, 235, 117, 15, 5, 235, 116, 15, - 5, 235, 114, 15, 5, 235, 115, 113, 235, 114, 15, 5, 235, 104, 15, 5, 235, - 105, 29, 236, 148, 242, 196, 15, 5, 235, 100, 15, 5, 235, 101, 29, 252, - 221, 15, 5, 235, 101, 249, 188, 235, 100, 15, 5, 235, 98, 15, 5, 235, 97, - 15, 5, 235, 69, 15, 5, 235, 70, 233, 239, 29, 103, 113, 233, 239, 29, 72, - 15, 5, 235, 70, 113, 235, 70, 233, 239, 29, 103, 113, 233, 239, 29, 72, - 15, 5, 235, 19, 15, 5, 234, 212, 15, 5, 234, 213, 29, 252, 221, 15, 5, - 234, 213, 29, 72, 15, 5, 234, 213, 29, 215, 194, 15, 5, 234, 209, 15, 5, - 234, 201, 15, 5, 234, 188, 15, 5, 234, 187, 15, 5, 234, 185, 15, 5, 234, - 186, 113, 234, 185, 15, 5, 234, 81, 15, 5, 234, 82, 113, 242, 29, 29, - 254, 16, 234, 82, 113, 242, 29, 29, 254, 15, 15, 5, 234, 79, 15, 5, 234, - 77, 15, 5, 234, 78, 214, 250, 17, 15, 5, 234, 76, 15, 5, 234, 73, 15, 5, - 234, 74, 242, 196, 15, 5, 234, 72, 15, 5, 234, 60, 15, 5, 234, 61, 227, - 68, 234, 60, 15, 5, 234, 55, 15, 5, 234, 36, 15, 5, 233, 255, 15, 5, 233, - 238, 15, 5, 233, 239, 29, 63, 15, 5, 233, 239, 29, 111, 95, 249, 31, 95, - 162, 15, 5, 233, 239, 29, 111, 95, 243, 192, 15, 5, 233, 239, 29, 111, - 95, 233, 226, 15, 5, 233, 239, 29, 254, 213, 15, 5, 233, 239, 29, 254, - 159, 15, 5, 233, 239, 29, 254, 18, 212, 33, 217, 205, 15, 5, 233, 239, - 29, 252, 221, 15, 5, 233, 239, 29, 252, 54, 15, 5, 233, 239, 29, 248, - 233, 15, 5, 233, 239, 29, 245, 229, 15, 5, 233, 239, 29, 243, 230, 15, 5, - 233, 239, 29, 243, 192, 15, 5, 233, 239, 29, 242, 205, 15, 5, 233, 239, - 29, 242, 206, 95, 242, 205, 15, 5, 233, 239, 29, 162, 15, 5, 233, 239, - 29, 242, 132, 15, 5, 233, 239, 29, 242, 29, 29, 228, 93, 15, 5, 233, 239, - 29, 236, 148, 242, 196, 15, 5, 233, 239, 29, 236, 128, 15, 5, 233, 239, - 29, 236, 129, 95, 162, 15, 5, 233, 239, 29, 236, 129, 95, 232, 230, 15, - 5, 233, 239, 29, 234, 212, 15, 5, 233, 239, 29, 234, 201, 15, 5, 233, - 239, 29, 234, 79, 15, 5, 233, 239, 29, 234, 73, 15, 5, 233, 239, 29, 234, - 74, 95, 242, 29, 95, 63, 15, 5, 233, 239, 29, 233, 238, 15, 5, 233, 239, - 29, 233, 67, 15, 5, 233, 239, 29, 232, 230, 15, 5, 233, 239, 29, 232, - 218, 15, 5, 233, 239, 29, 231, 226, 15, 5, 233, 239, 29, 231, 227, 95, - 245, 229, 15, 5, 233, 239, 29, 230, 201, 15, 5, 233, 239, 29, 229, 254, - 15, 5, 233, 239, 29, 221, 9, 95, 219, 2, 15, 5, 233, 239, 29, 220, 211, - 95, 243, 31, 95, 245, 171, 15, 5, 233, 239, 29, 220, 211, 95, 243, 31, - 217, 205, 15, 5, 233, 239, 29, 220, 168, 15, 5, 233, 239, 29, 220, 169, - 95, 220, 168, 15, 5, 233, 239, 29, 219, 2, 15, 5, 233, 239, 29, 218, 47, - 15, 5, 233, 239, 29, 218, 35, 15, 5, 233, 239, 29, 217, 243, 95, 111, 95, - 219, 42, 95, 207, 15, 5, 233, 239, 29, 72, 15, 5, 233, 239, 29, 103, 95, - 63, 15, 5, 233, 239, 29, 103, 95, 103, 95, 72, 15, 5, 233, 239, 29, 215, - 204, 95, 254, 17, 15, 5, 233, 239, 29, 215, 194, 15, 5, 233, 239, 29, - 215, 106, 15, 5, 233, 239, 219, 184, 15, 5, 233, 236, 15, 5, 233, 237, - 29, 221, 8, 15, 5, 233, 237, 29, 221, 9, 95, 219, 2, 15, 5, 233, 237, - 242, 196, 15, 5, 233, 237, 242, 197, 113, 233, 237, 242, 197, 221, 8, 15, - 5, 233, 233, 15, 5, 233, 226, 15, 5, 233, 227, 29, 233, 226, 15, 5, 233, - 224, 15, 5, 233, 225, 29, 234, 60, 15, 5, 233, 225, 29, 234, 61, 95, 223, - 77, 15, 5, 233, 111, 15, 5, 233, 96, 15, 5, 233, 86, 15, 5, 233, 67, 15, - 5, 232, 230, 15, 5, 232, 231, 29, 252, 221, 15, 5, 232, 228, 15, 5, 232, - 229, 29, 254, 213, 15, 5, 232, 229, 29, 252, 221, 15, 5, 232, 229, 29, - 245, 158, 15, 5, 232, 229, 29, 245, 159, 217, 205, 15, 5, 232, 229, 29, - 243, 201, 217, 205, 15, 5, 232, 229, 29, 242, 29, 29, 252, 221, 15, 5, - 232, 229, 29, 236, 128, 15, 5, 232, 229, 29, 235, 119, 15, 5, 232, 229, - 29, 235, 117, 15, 5, 232, 229, 29, 235, 118, 95, 254, 17, 15, 5, 232, - 229, 29, 234, 212, 15, 5, 232, 229, 29, 234, 0, 95, 254, 17, 15, 5, 232, - 229, 29, 233, 238, 15, 5, 232, 229, 29, 231, 227, 95, 245, 229, 15, 5, - 232, 229, 29, 229, 254, 15, 5, 232, 229, 29, 228, 135, 15, 5, 232, 229, - 29, 220, 137, 95, 254, 17, 15, 5, 232, 229, 29, 220, 119, 95, 251, 179, - 15, 5, 232, 229, 29, 216, 85, 15, 5, 232, 229, 217, 205, 15, 5, 232, 229, - 249, 188, 232, 228, 15, 5, 232, 229, 227, 68, 232, 228, 15, 5, 232, 229, - 219, 184, 15, 5, 232, 229, 220, 246, 15, 5, 232, 227, 15, 5, 232, 223, - 15, 5, 232, 224, 113, 232, 223, 15, 5, 232, 224, 227, 68, 232, 223, 15, - 5, 232, 224, 220, 246, 15, 5, 232, 221, 15, 5, 232, 218, 15, 5, 232, 216, - 15, 5, 232, 217, 113, 232, 216, 15, 5, 232, 217, 113, 232, 217, 243, 193, - 113, 243, 192, 15, 5, 191, 15, 5, 232, 116, 29, 218, 35, 15, 5, 232, 116, - 242, 196, 15, 5, 232, 115, 15, 5, 232, 88, 15, 5, 232, 44, 15, 5, 232, - 25, 15, 5, 232, 24, 15, 5, 231, 226, 15, 5, 231, 182, 15, 5, 231, 112, - 15, 5, 231, 71, 15, 5, 230, 242, 15, 5, 230, 243, 113, 230, 242, 15, 5, - 230, 233, 15, 5, 230, 234, 242, 196, 15, 5, 230, 218, 15, 5, 230, 204, - 15, 5, 230, 201, 15, 5, 230, 202, 29, 63, 15, 5, 230, 202, 29, 234, 60, - 15, 5, 230, 202, 29, 212, 109, 15, 5, 230, 202, 113, 230, 201, 15, 5, - 230, 202, 113, 230, 202, 29, 111, 95, 207, 15, 5, 230, 202, 249, 188, - 230, 201, 15, 5, 230, 199, 15, 5, 230, 200, 29, 63, 15, 5, 230, 200, 29, - 111, 95, 248, 76, 15, 5, 230, 200, 29, 248, 76, 15, 5, 230, 200, 242, - 196, 15, 5, 207, 15, 5, 230, 114, 15, 5, 230, 103, 15, 5, 230, 104, 236, - 51, 15, 5, 230, 104, 29, 220, 171, 217, 205, 15, 5, 230, 104, 227, 68, - 230, 103, 15, 5, 230, 102, 15, 5, 230, 96, 228, 79, 15, 5, 230, 95, 15, - 5, 230, 94, 15, 5, 229, 254, 15, 5, 229, 255, 29, 63, 15, 5, 229, 255, - 29, 215, 194, 15, 5, 229, 255, 220, 246, 15, 5, 229, 128, 15, 5, 229, - 129, 29, 77, 15, 5, 229, 127, 15, 5, 229, 98, 15, 5, 229, 99, 29, 243, - 201, 217, 205, 15, 5, 229, 99, 29, 243, 193, 95, 243, 201, 217, 205, 15, - 5, 229, 96, 15, 5, 229, 97, 29, 254, 159, 15, 5, 229, 97, 29, 254, 17, - 15, 5, 229, 97, 29, 254, 18, 95, 254, 17, 15, 5, 229, 97, 29, 242, 205, - 15, 5, 229, 97, 29, 231, 227, 95, 243, 201, 217, 205, 15, 5, 229, 97, 29, - 229, 254, 15, 5, 229, 97, 29, 228, 93, 15, 5, 229, 97, 29, 221, 8, 15, 5, - 229, 97, 29, 221, 9, 95, 111, 254, 159, 15, 5, 229, 97, 29, 221, 9, 95, - 254, 17, 15, 5, 229, 97, 29, 221, 9, 95, 254, 18, 95, 254, 17, 15, 5, - 229, 97, 29, 215, 204, 95, 254, 17, 15, 5, 229, 97, 29, 215, 106, 15, 5, - 229, 85, 15, 5, 228, 135, 15, 5, 228, 108, 15, 5, 228, 93, 15, 5, 228, - 94, 233, 237, 29, 243, 192, 15, 5, 228, 94, 233, 237, 29, 232, 25, 15, 5, - 228, 94, 233, 237, 29, 222, 203, 15, 5, 228, 94, 233, 237, 29, 222, 204, - 113, 228, 94, 233, 237, 29, 222, 203, 15, 5, 228, 94, 233, 237, 29, 215, - 106, 15, 5, 228, 94, 217, 205, 15, 5, 228, 94, 113, 228, 93, 15, 5, 228, - 94, 249, 188, 228, 93, 15, 5, 228, 94, 249, 188, 228, 94, 233, 237, 113, - 233, 236, 15, 5, 228, 88, 15, 5, 228, 89, 255, 56, 29, 254, 12, 15, 5, - 228, 89, 255, 56, 29, 252, 54, 15, 5, 228, 89, 255, 56, 29, 246, 150, 15, - 5, 228, 89, 255, 56, 29, 242, 205, 15, 5, 228, 89, 255, 56, 29, 236, 148, - 242, 196, 15, 5, 228, 89, 255, 56, 29, 235, 117, 15, 5, 228, 89, 255, 56, - 29, 233, 255, 15, 5, 228, 89, 255, 56, 29, 229, 254, 15, 5, 228, 89, 255, - 56, 29, 220, 116, 15, 5, 228, 89, 255, 56, 29, 215, 203, 15, 5, 228, 89, - 234, 186, 29, 252, 54, 15, 5, 228, 89, 234, 186, 29, 252, 55, 72, 15, 5, - 195, 15, 5, 226, 242, 15, 5, 226, 211, 15, 5, 226, 186, 15, 5, 226, 73, - 15, 5, 226, 20, 15, 5, 226, 21, 29, 63, 15, 5, 226, 21, 29, 255, 57, 15, - 5, 226, 21, 29, 252, 54, 15, 5, 226, 21, 29, 251, 179, 15, 5, 226, 21, - 29, 77, 15, 5, 226, 21, 29, 75, 15, 5, 226, 21, 29, 240, 225, 15, 5, 226, - 21, 29, 72, 15, 5, 226, 21, 29, 215, 203, 15, 5, 226, 21, 249, 188, 226, - 20, 15, 5, 225, 221, 15, 5, 225, 222, 29, 235, 100, 15, 5, 225, 222, 29, - 215, 194, 15, 5, 225, 222, 29, 212, 109, 15, 5, 225, 222, 227, 68, 225, - 221, 15, 5, 208, 15, 5, 224, 107, 15, 5, 223, 222, 15, 5, 223, 77, 15, 5, - 222, 227, 15, 5, 222, 216, 228, 79, 15, 5, 222, 215, 15, 5, 222, 216, 29, - 63, 15, 5, 222, 216, 29, 246, 154, 15, 5, 222, 216, 29, 246, 152, 15, 5, - 222, 216, 29, 162, 15, 5, 222, 216, 29, 235, 104, 15, 5, 222, 216, 29, - 234, 60, 15, 5, 222, 216, 29, 232, 216, 15, 5, 222, 216, 29, 231, 112, - 15, 5, 222, 216, 29, 228, 93, 15, 5, 222, 216, 29, 222, 203, 15, 5, 222, - 216, 29, 220, 231, 15, 5, 222, 216, 29, 218, 55, 15, 5, 222, 216, 29, - 215, 203, 15, 5, 222, 216, 29, 215, 200, 15, 5, 222, 216, 29, 215, 173, - 15, 5, 222, 216, 29, 215, 127, 15, 5, 222, 216, 29, 215, 106, 15, 5, 222, - 216, 113, 222, 215, 15, 5, 222, 216, 242, 196, 15, 5, 222, 203, 15, 5, - 222, 204, 233, 239, 29, 254, 15, 15, 5, 222, 179, 15, 5, 222, 171, 15, 5, - 221, 47, 15, 5, 221, 45, 15, 5, 221, 46, 29, 63, 15, 5, 221, 46, 29, 252, - 221, 15, 5, 221, 46, 29, 243, 30, 15, 5, 221, 46, 29, 229, 254, 15, 5, - 221, 46, 29, 220, 168, 15, 5, 221, 46, 29, 216, 70, 15, 5, 221, 46, 29, - 72, 15, 5, 221, 46, 29, 103, 95, 63, 15, 5, 221, 44, 15, 5, 221, 42, 15, - 5, 221, 23, 15, 5, 221, 8, 15, 5, 221, 9, 241, 74, 15, 5, 221, 9, 113, - 221, 9, 243, 222, 113, 243, 222, 243, 193, 113, 243, 192, 15, 5, 221, 9, - 113, 221, 9, 218, 56, 113, 218, 56, 243, 193, 113, 243, 192, 15, 5, 221, - 1, 15, 5, 220, 252, 15, 5, 220, 249, 15, 5, 220, 248, 15, 5, 220, 245, - 15, 5, 220, 231, 15, 5, 220, 232, 29, 63, 15, 5, 220, 232, 29, 236, 128, - 15, 5, 220, 225, 15, 5, 220, 226, 29, 63, 15, 5, 220, 226, 29, 252, 207, - 15, 5, 220, 226, 29, 251, 163, 15, 5, 220, 226, 29, 248, 23, 15, 5, 220, - 226, 29, 243, 192, 15, 5, 220, 226, 29, 236, 147, 15, 5, 220, 226, 29, - 236, 148, 242, 196, 15, 5, 220, 226, 29, 234, 55, 15, 5, 220, 226, 29, - 232, 218, 15, 5, 220, 226, 29, 230, 233, 15, 5, 220, 226, 29, 222, 203, - 15, 5, 220, 219, 15, 5, 220, 214, 15, 5, 220, 215, 217, 205, 15, 5, 220, - 215, 113, 220, 215, 251, 153, 113, 251, 152, 15, 5, 220, 210, 15, 5, 220, - 170, 15, 5, 220, 171, 113, 236, 52, 220, 170, 15, 5, 220, 168, 15, 5, - 220, 167, 15, 5, 220, 136, 15, 5, 220, 137, 242, 196, 15, 5, 220, 127, - 15, 5, 220, 125, 15, 5, 220, 126, 113, 220, 126, 220, 168, 15, 5, 220, - 118, 15, 5, 220, 116, 15, 5, 219, 41, 15, 5, 219, 42, 113, 219, 41, 15, - 5, 219, 13, 15, 5, 219, 12, 15, 5, 219, 10, 15, 5, 219, 2, 15, 5, 219, 1, - 15, 5, 218, 231, 15, 5, 218, 230, 15, 5, 218, 66, 15, 5, 218, 67, 254, 3, - 15, 5, 218, 67, 29, 242, 28, 15, 5, 218, 67, 29, 231, 112, 15, 5, 218, - 67, 242, 196, 15, 5, 218, 55, 15, 5, 218, 56, 113, 218, 56, 229, 129, - 113, 229, 129, 248, 5, 113, 248, 4, 15, 5, 218, 56, 219, 184, 15, 5, 218, - 47, 15, 5, 128, 29, 252, 54, 15, 5, 128, 29, 242, 205, 15, 5, 128, 29, - 221, 8, 15, 5, 128, 29, 220, 170, 15, 5, 128, 29, 216, 85, 15, 5, 128, - 29, 215, 194, 15, 5, 218, 35, 15, 5, 218, 14, 15, 5, 217, 242, 15, 5, - 217, 243, 242, 196, 15, 5, 217, 84, 15, 5, 217, 85, 217, 205, 15, 5, 217, - 57, 15, 5, 217, 39, 15, 5, 217, 40, 29, 218, 35, 15, 5, 217, 40, 113, - 217, 39, 15, 5, 217, 40, 113, 217, 40, 243, 222, 113, 243, 222, 243, 193, - 113, 243, 192, 15, 5, 216, 90, 15, 5, 216, 85, 15, 5, 216, 83, 15, 5, - 216, 80, 15, 5, 216, 70, 15, 5, 216, 71, 113, 216, 71, 212, 110, 113, - 212, 109, 15, 5, 72, 15, 5, 103, 242, 205, 15, 5, 103, 103, 72, 15, 5, - 103, 113, 103, 226, 252, 113, 226, 252, 243, 193, 113, 243, 192, 15, 5, - 103, 113, 103, 218, 232, 113, 218, 231, 15, 5, 103, 113, 103, 103, 223, - 236, 113, 103, 223, 235, 15, 5, 215, 203, 15, 5, 215, 200, 15, 5, 215, - 194, 15, 5, 215, 195, 234, 55, 15, 5, 215, 195, 29, 252, 221, 15, 5, 215, - 195, 29, 231, 112, 15, 5, 215, 195, 29, 103, 95, 103, 95, 72, 15, 5, 215, - 195, 29, 103, 95, 103, 95, 103, 242, 196, 15, 5, 215, 195, 242, 196, 15, - 5, 215, 195, 220, 246, 15, 5, 215, 195, 220, 247, 29, 252, 221, 15, 5, - 215, 190, 15, 5, 215, 173, 15, 5, 215, 174, 29, 233, 238, 15, 5, 215, - 174, 29, 231, 227, 95, 249, 30, 15, 5, 215, 174, 29, 221, 45, 15, 5, 215, - 174, 29, 72, 15, 5, 215, 172, 15, 5, 215, 168, 15, 5, 215, 169, 29, 235, - 69, 15, 5, 215, 169, 29, 195, 15, 5, 215, 166, 15, 5, 215, 167, 242, 196, - 15, 5, 215, 127, 15, 5, 215, 128, 249, 188, 215, 127, 15, 5, 215, 128, - 220, 246, 15, 5, 215, 125, 15, 5, 215, 126, 29, 111, 95, 162, 15, 5, 215, - 126, 29, 111, 95, 207, 15, 5, 215, 126, 29, 254, 213, 15, 5, 215, 126, - 29, 162, 15, 5, 215, 126, 29, 228, 93, 15, 5, 215, 126, 29, 215, 203, 15, - 5, 215, 126, 29, 215, 204, 95, 254, 17, 15, 5, 215, 126, 29, 215, 204, - 95, 252, 54, 15, 5, 215, 124, 15, 5, 215, 121, 15, 5, 215, 120, 15, 5, - 215, 116, 15, 5, 215, 117, 29, 63, 15, 5, 215, 117, 29, 254, 12, 15, 5, - 215, 117, 29, 134, 15, 5, 215, 117, 29, 246, 144, 15, 5, 215, 117, 29, - 243, 230, 15, 5, 215, 117, 29, 243, 214, 15, 5, 215, 117, 29, 243, 201, - 217, 205, 15, 5, 215, 117, 29, 243, 192, 15, 5, 215, 117, 29, 242, 213, - 15, 5, 215, 117, 29, 162, 15, 5, 215, 117, 29, 236, 147, 15, 5, 215, 117, - 29, 236, 128, 15, 5, 215, 117, 29, 236, 24, 15, 5, 215, 117, 29, 234, - 212, 15, 5, 215, 117, 29, 232, 216, 15, 5, 215, 117, 29, 231, 71, 15, 5, - 215, 117, 29, 195, 15, 5, 215, 117, 29, 221, 8, 15, 5, 215, 117, 29, 220, - 125, 15, 5, 215, 117, 29, 216, 90, 15, 5, 215, 117, 29, 103, 95, 242, - 205, 15, 5, 215, 117, 29, 215, 194, 15, 5, 215, 117, 29, 215, 114, 15, 5, - 215, 114, 15, 5, 215, 115, 29, 72, 15, 5, 215, 106, 15, 5, 215, 107, 29, - 63, 15, 5, 215, 107, 29, 234, 81, 15, 5, 215, 107, 29, 234, 60, 15, 5, - 215, 107, 29, 218, 35, 15, 5, 215, 102, 15, 5, 215, 105, 15, 5, 215, 103, - 15, 5, 215, 99, 15, 5, 215, 88, 15, 5, 215, 89, 29, 235, 69, 15, 5, 215, - 87, 15, 5, 212, 109, 15, 5, 212, 110, 217, 205, 15, 5, 212, 110, 92, 29, - 234, 60, 15, 5, 212, 106, 15, 5, 212, 99, 15, 5, 212, 86, 15, 5, 212, 37, - 15, 5, 212, 38, 113, 212, 37, 15, 5, 212, 36, 15, 5, 212, 34, 15, 5, 212, - 35, 235, 121, 217, 205, 15, 5, 212, 29, 15, 5, 212, 21, 15, 5, 212, 8, - 15, 5, 212, 6, 15, 5, 212, 7, 29, 63, 15, 5, 212, 5, 15, 5, 212, 4, 15, - 130, 5, 119, 254, 17, 15, 130, 5, 137, 254, 17, 15, 130, 5, 244, 101, - 254, 17, 15, 130, 5, 244, 170, 254, 17, 15, 130, 5, 220, 72, 254, 17, 15, - 130, 5, 221, 66, 254, 17, 15, 130, 5, 246, 15, 254, 17, 15, 130, 5, 229, - 95, 254, 17, 15, 130, 5, 137, 248, 4, 15, 130, 5, 244, 101, 248, 4, 15, - 130, 5, 244, 170, 248, 4, 15, 130, 5, 220, 72, 248, 4, 15, 130, 5, 221, - 66, 248, 4, 15, 130, 5, 246, 15, 248, 4, 15, 130, 5, 229, 95, 248, 4, 15, - 130, 5, 244, 101, 72, 15, 130, 5, 244, 170, 72, 15, 130, 5, 220, 72, 72, - 15, 130, 5, 221, 66, 72, 15, 130, 5, 246, 15, 72, 15, 130, 5, 229, 95, - 72, 15, 130, 5, 124, 243, 134, 15, 130, 5, 119, 243, 134, 15, 130, 5, - 137, 243, 134, 15, 130, 5, 244, 101, 243, 134, 15, 130, 5, 244, 170, 243, - 134, 15, 130, 5, 220, 72, 243, 134, 15, 130, 5, 221, 66, 243, 134, 15, - 130, 5, 246, 15, 243, 134, 15, 130, 5, 229, 95, 243, 134, 15, 130, 5, - 124, 243, 131, 15, 130, 5, 119, 243, 131, 15, 130, 5, 137, 243, 131, 15, - 130, 5, 244, 101, 243, 131, 15, 130, 5, 244, 170, 243, 131, 15, 130, 5, - 119, 221, 23, 15, 130, 5, 137, 221, 23, 15, 130, 5, 137, 221, 24, 214, - 250, 17, 15, 130, 5, 244, 101, 221, 23, 15, 130, 5, 244, 170, 221, 23, - 15, 130, 5, 220, 72, 221, 23, 15, 130, 5, 221, 66, 221, 23, 15, 130, 5, - 246, 15, 221, 23, 15, 130, 5, 229, 95, 221, 23, 15, 130, 5, 124, 221, 18, - 15, 130, 5, 119, 221, 18, 15, 130, 5, 137, 221, 18, 15, 130, 5, 137, 221, - 19, 214, 250, 17, 15, 130, 5, 244, 101, 221, 18, 15, 130, 5, 244, 170, - 221, 18, 15, 130, 5, 221, 24, 29, 243, 215, 95, 248, 4, 15, 130, 5, 221, - 24, 29, 243, 215, 95, 231, 71, 15, 130, 5, 124, 251, 149, 15, 130, 5, - 119, 251, 149, 15, 130, 5, 137, 251, 149, 15, 130, 5, 137, 251, 150, 214, - 250, 17, 15, 130, 5, 244, 101, 251, 149, 15, 130, 5, 244, 170, 251, 149, - 15, 130, 5, 137, 214, 250, 244, 109, 245, 160, 15, 130, 5, 137, 214, 250, - 244, 109, 245, 157, 15, 130, 5, 244, 101, 214, 250, 244, 109, 233, 87, - 15, 130, 5, 244, 101, 214, 250, 244, 109, 233, 85, 15, 130, 5, 244, 101, - 214, 250, 244, 109, 233, 88, 63, 15, 130, 5, 244, 101, 214, 250, 244, - 109, 233, 88, 253, 201, 15, 130, 5, 220, 72, 214, 250, 244, 109, 254, 14, - 15, 130, 5, 221, 66, 214, 250, 244, 109, 236, 120, 15, 130, 5, 221, 66, - 214, 250, 244, 109, 236, 122, 63, 15, 130, 5, 221, 66, 214, 250, 244, - 109, 236, 122, 253, 201, 15, 130, 5, 246, 15, 214, 250, 244, 109, 215, - 101, 15, 130, 5, 246, 15, 214, 250, 244, 109, 215, 100, 15, 130, 5, 229, - 95, 214, 250, 244, 109, 236, 136, 15, 130, 5, 229, 95, 214, 250, 244, - 109, 236, 135, 15, 130, 5, 229, 95, 214, 250, 244, 109, 236, 134, 15, - 130, 5, 229, 95, 214, 250, 244, 109, 236, 137, 63, 15, 130, 5, 119, 254, - 18, 217, 205, 15, 130, 5, 137, 254, 18, 217, 205, 15, 130, 5, 244, 101, - 254, 18, 217, 205, 15, 130, 5, 244, 170, 254, 18, 217, 205, 15, 130, 5, - 220, 72, 254, 18, 217, 205, 15, 130, 5, 124, 252, 196, 15, 130, 5, 119, - 252, 196, 15, 130, 5, 137, 252, 196, 15, 130, 5, 244, 101, 252, 196, 15, - 130, 5, 244, 101, 252, 197, 214, 250, 17, 15, 130, 5, 244, 170, 252, 196, - 15, 130, 5, 244, 170, 252, 197, 214, 250, 17, 15, 130, 5, 229, 105, 15, - 130, 5, 229, 106, 15, 130, 5, 124, 245, 156, 15, 130, 5, 119, 245, 156, - 15, 130, 5, 124, 217, 135, 248, 4, 15, 130, 5, 119, 217, 133, 248, 4, 15, - 130, 5, 244, 170, 220, 61, 248, 4, 15, 130, 5, 124, 217, 135, 214, 250, - 244, 109, 63, 15, 130, 5, 119, 217, 133, 214, 250, 244, 109, 63, 15, 130, - 5, 124, 246, 11, 254, 17, 15, 130, 5, 124, 224, 202, 254, 17, 15, 130, 5, - 54, 254, 6, 124, 220, 62, 15, 130, 5, 54, 254, 6, 124, 224, 201, 15, 225, - 63, 5, 54, 254, 6, 213, 199, 247, 245, 15, 225, 63, 5, 66, 250, 30, 15, - 225, 63, 5, 248, 72, 250, 30, 15, 225, 63, 5, 248, 72, 216, 192, 10, 11, - 255, 186, 10, 11, 255, 185, 10, 11, 255, 184, 10, 11, 255, 183, 10, 11, - 255, 182, 10, 11, 255, 181, 10, 11, 255, 180, 10, 11, 255, 179, 10, 11, - 255, 178, 10, 11, 255, 177, 10, 11, 255, 176, 10, 11, 255, 175, 10, 11, - 255, 174, 10, 11, 255, 173, 10, 11, 255, 172, 10, 11, 255, 171, 10, 11, - 255, 170, 10, 11, 255, 169, 10, 11, 255, 168, 10, 11, 255, 167, 10, 11, - 255, 166, 10, 11, 255, 165, 10, 11, 255, 164, 10, 11, 255, 163, 10, 11, - 255, 162, 10, 11, 255, 161, 10, 11, 255, 160, 10, 11, 255, 159, 10, 11, - 255, 158, 10, 11, 255, 157, 10, 11, 255, 156, 10, 11, 255, 155, 10, 11, - 255, 154, 10, 11, 255, 153, 10, 11, 255, 152, 10, 11, 255, 151, 10, 11, - 255, 150, 10, 11, 255, 149, 10, 11, 255, 148, 10, 11, 255, 147, 10, 11, - 255, 146, 10, 11, 255, 145, 10, 11, 255, 144, 10, 11, 255, 143, 10, 11, - 255, 142, 10, 11, 255, 141, 10, 11, 255, 140, 10, 11, 255, 139, 10, 11, - 255, 138, 10, 11, 255, 137, 10, 11, 255, 136, 10, 11, 255, 135, 10, 11, - 255, 134, 10, 11, 255, 133, 10, 11, 255, 132, 10, 11, 255, 131, 10, 11, - 255, 130, 10, 11, 255, 129, 10, 11, 255, 128, 10, 11, 255, 127, 10, 11, - 255, 126, 10, 11, 255, 125, 10, 11, 255, 124, 10, 11, 255, 123, 10, 11, - 255, 122, 10, 11, 255, 121, 10, 11, 255, 120, 10, 11, 255, 119, 10, 11, - 255, 118, 10, 11, 255, 117, 10, 11, 255, 116, 10, 11, 255, 115, 10, 11, - 255, 114, 10, 11, 255, 113, 10, 11, 255, 112, 10, 11, 255, 111, 10, 11, - 255, 110, 10, 11, 255, 109, 10, 11, 255, 108, 10, 11, 255, 107, 10, 11, - 253, 199, 10, 11, 253, 197, 10, 11, 253, 195, 10, 11, 253, 193, 10, 11, - 253, 191, 10, 11, 253, 190, 10, 11, 253, 188, 10, 11, 253, 186, 10, 11, - 253, 184, 10, 11, 253, 182, 10, 11, 251, 117, 10, 11, 251, 116, 10, 11, - 251, 115, 10, 11, 251, 114, 10, 11, 251, 113, 10, 11, 251, 112, 10, 11, - 251, 111, 10, 11, 251, 110, 10, 11, 251, 109, 10, 11, 251, 108, 10, 11, - 251, 107, 10, 11, 251, 106, 10, 11, 251, 105, 10, 11, 251, 104, 10, 11, - 251, 103, 10, 11, 251, 102, 10, 11, 251, 101, 10, 11, 251, 100, 10, 11, - 251, 99, 10, 11, 251, 98, 10, 11, 251, 97, 10, 11, 251, 96, 10, 11, 251, - 95, 10, 11, 251, 94, 10, 11, 251, 93, 10, 11, 251, 92, 10, 11, 251, 91, - 10, 11, 251, 90, 10, 11, 249, 124, 10, 11, 249, 123, 10, 11, 249, 122, - 10, 11, 249, 121, 10, 11, 249, 120, 10, 11, 249, 119, 10, 11, 249, 118, - 10, 11, 249, 117, 10, 11, 249, 116, 10, 11, 249, 115, 10, 11, 249, 114, - 10, 11, 249, 113, 10, 11, 249, 112, 10, 11, 249, 111, 10, 11, 249, 110, - 10, 11, 249, 109, 10, 11, 249, 108, 10, 11, 249, 107, 10, 11, 249, 106, - 10, 11, 249, 105, 10, 11, 249, 104, 10, 11, 249, 103, 10, 11, 249, 102, - 10, 11, 249, 101, 10, 11, 249, 100, 10, 11, 249, 99, 10, 11, 249, 98, 10, - 11, 249, 97, 10, 11, 249, 96, 10, 11, 249, 95, 10, 11, 249, 94, 10, 11, - 249, 93, 10, 11, 249, 92, 10, 11, 249, 91, 10, 11, 249, 90, 10, 11, 249, - 89, 10, 11, 249, 88, 10, 11, 249, 87, 10, 11, 249, 86, 10, 11, 249, 85, - 10, 11, 249, 84, 10, 11, 249, 83, 10, 11, 249, 82, 10, 11, 249, 81, 10, - 11, 249, 80, 10, 11, 249, 79, 10, 11, 249, 78, 10, 11, 249, 77, 10, 11, - 249, 76, 10, 11, 249, 75, 10, 11, 249, 74, 10, 11, 249, 73, 10, 11, 249, - 72, 10, 11, 249, 71, 10, 11, 249, 70, 10, 11, 249, 69, 10, 11, 249, 68, - 10, 11, 249, 67, 10, 11, 249, 66, 10, 11, 249, 65, 10, 11, 249, 64, 10, - 11, 249, 63, 10, 11, 249, 62, 10, 11, 249, 61, 10, 11, 249, 60, 10, 11, - 249, 59, 10, 11, 249, 58, 10, 11, 249, 57, 10, 11, 249, 56, 10, 11, 249, - 55, 10, 11, 249, 54, 10, 11, 249, 53, 10, 11, 249, 52, 10, 11, 249, 51, - 10, 11, 249, 50, 10, 11, 249, 49, 10, 11, 249, 48, 10, 11, 249, 47, 10, - 11, 249, 46, 10, 11, 249, 45, 10, 11, 249, 44, 10, 11, 249, 43, 10, 11, - 249, 42, 10, 11, 249, 41, 10, 11, 249, 40, 10, 11, 249, 39, 10, 11, 249, - 38, 10, 11, 249, 37, 10, 11, 249, 36, 10, 11, 249, 35, 10, 11, 249, 34, - 10, 11, 249, 33, 10, 11, 246, 100, 10, 11, 246, 99, 10, 11, 246, 98, 10, - 11, 246, 97, 10, 11, 246, 96, 10, 11, 246, 95, 10, 11, 246, 94, 10, 11, - 246, 93, 10, 11, 246, 92, 10, 11, 246, 91, 10, 11, 246, 90, 10, 11, 246, - 89, 10, 11, 246, 88, 10, 11, 246, 87, 10, 11, 246, 86, 10, 11, 246, 85, - 10, 11, 246, 84, 10, 11, 246, 83, 10, 11, 246, 82, 10, 11, 246, 81, 10, - 11, 246, 80, 10, 11, 246, 79, 10, 11, 246, 78, 10, 11, 246, 77, 10, 11, - 246, 76, 10, 11, 246, 75, 10, 11, 246, 74, 10, 11, 246, 73, 10, 11, 246, - 72, 10, 11, 246, 71, 10, 11, 246, 70, 10, 11, 246, 69, 10, 11, 246, 68, - 10, 11, 246, 67, 10, 11, 246, 66, 10, 11, 246, 65, 10, 11, 246, 64, 10, - 11, 246, 63, 10, 11, 246, 62, 10, 11, 246, 61, 10, 11, 246, 60, 10, 11, - 246, 59, 10, 11, 246, 58, 10, 11, 246, 57, 10, 11, 245, 94, 10, 11, 245, - 93, 10, 11, 245, 92, 10, 11, 245, 91, 10, 11, 245, 90, 10, 11, 245, 89, - 10, 11, 245, 88, 10, 11, 245, 87, 10, 11, 245, 86, 10, 11, 245, 85, 10, - 11, 245, 84, 10, 11, 245, 83, 10, 11, 245, 82, 10, 11, 245, 81, 10, 11, - 245, 80, 10, 11, 245, 79, 10, 11, 245, 78, 10, 11, 245, 77, 10, 11, 245, - 76, 10, 11, 245, 75, 10, 11, 245, 74, 10, 11, 245, 73, 10, 11, 245, 72, - 10, 11, 245, 71, 10, 11, 245, 70, 10, 11, 245, 69, 10, 11, 245, 68, 10, - 11, 245, 67, 10, 11, 245, 66, 10, 11, 245, 65, 10, 11, 245, 64, 10, 11, - 245, 63, 10, 11, 245, 62, 10, 11, 245, 61, 10, 11, 245, 60, 10, 11, 245, - 59, 10, 11, 245, 58, 10, 11, 245, 57, 10, 11, 245, 56, 10, 11, 245, 55, - 10, 11, 245, 54, 10, 11, 245, 53, 10, 11, 245, 52, 10, 11, 245, 51, 10, - 11, 245, 50, 10, 11, 245, 49, 10, 11, 245, 48, 10, 11, 245, 47, 10, 11, - 245, 46, 10, 11, 245, 45, 10, 11, 245, 44, 10, 11, 245, 43, 10, 11, 245, - 42, 10, 11, 245, 41, 10, 11, 245, 40, 10, 11, 245, 39, 10, 11, 245, 38, - 10, 11, 245, 37, 10, 11, 245, 36, 10, 11, 245, 35, 10, 11, 245, 34, 10, - 11, 245, 33, 10, 11, 245, 32, 10, 11, 245, 31, 10, 11, 245, 30, 10, 11, - 244, 40, 10, 11, 244, 39, 10, 11, 244, 38, 10, 11, 244, 37, 10, 11, 244, - 36, 10, 11, 244, 35, 10, 11, 244, 34, 10, 11, 244, 33, 10, 11, 244, 32, - 10, 11, 244, 31, 10, 11, 244, 30, 10, 11, 244, 29, 10, 11, 244, 28, 10, - 11, 244, 27, 10, 11, 244, 26, 10, 11, 244, 25, 10, 11, 244, 24, 10, 11, - 244, 23, 10, 11, 244, 22, 10, 11, 244, 21, 10, 11, 244, 20, 10, 11, 244, - 19, 10, 11, 244, 18, 10, 11, 244, 17, 10, 11, 244, 16, 10, 11, 244, 15, - 10, 11, 244, 14, 10, 11, 244, 13, 10, 11, 244, 12, 10, 11, 244, 11, 10, - 11, 244, 10, 10, 11, 244, 9, 10, 11, 244, 8, 10, 11, 244, 7, 10, 11, 244, - 6, 10, 11, 244, 5, 10, 11, 244, 4, 10, 11, 244, 3, 10, 11, 244, 2, 10, - 11, 244, 1, 10, 11, 244, 0, 10, 11, 243, 255, 10, 11, 243, 254, 10, 11, - 243, 253, 10, 11, 243, 252, 10, 11, 243, 251, 10, 11, 243, 250, 10, 11, - 243, 249, 10, 11, 243, 248, 10, 11, 243, 247, 10, 11, 243, 246, 10, 11, - 243, 245, 10, 11, 243, 244, 10, 11, 243, 243, 10, 11, 243, 242, 10, 11, - 243, 241, 10, 11, 243, 240, 10, 11, 243, 239, 10, 11, 243, 238, 10, 11, - 243, 237, 10, 11, 243, 236, 10, 11, 243, 235, 10, 11, 243, 234, 10, 11, - 243, 233, 10, 11, 242, 160, 10, 11, 242, 159, 10, 11, 242, 158, 10, 11, - 242, 157, 10, 11, 242, 156, 10, 11, 242, 155, 10, 11, 242, 154, 10, 11, - 242, 153, 10, 11, 242, 152, 10, 11, 240, 247, 10, 11, 240, 246, 10, 11, - 240, 245, 10, 11, 240, 244, 10, 11, 240, 243, 10, 11, 240, 242, 10, 11, - 240, 241, 10, 11, 240, 240, 10, 11, 240, 239, 10, 11, 240, 238, 10, 11, - 240, 237, 10, 11, 240, 236, 10, 11, 240, 235, 10, 11, 240, 234, 10, 11, - 240, 233, 10, 11, 240, 232, 10, 11, 240, 231, 10, 11, 240, 230, 10, 11, - 240, 229, 10, 11, 235, 140, 10, 11, 235, 139, 10, 11, 235, 138, 10, 11, - 235, 137, 10, 11, 235, 136, 10, 11, 235, 135, 10, 11, 235, 134, 10, 11, - 235, 133, 10, 11, 234, 10, 10, 11, 234, 9, 10, 11, 234, 8, 10, 11, 234, - 7, 10, 11, 234, 6, 10, 11, 234, 5, 10, 11, 234, 4, 10, 11, 234, 3, 10, - 11, 234, 2, 10, 11, 234, 1, 10, 11, 232, 182, 10, 11, 232, 181, 10, 11, - 232, 180, 10, 11, 232, 179, 10, 11, 232, 178, 10, 11, 232, 177, 10, 11, - 232, 176, 10, 11, 232, 175, 10, 11, 232, 174, 10, 11, 232, 173, 10, 11, - 232, 172, 10, 11, 232, 171, 10, 11, 232, 170, 10, 11, 232, 169, 10, 11, - 232, 168, 10, 11, 232, 167, 10, 11, 232, 166, 10, 11, 232, 165, 10, 11, - 232, 164, 10, 11, 232, 163, 10, 11, 232, 162, 10, 11, 232, 161, 10, 11, - 232, 160, 10, 11, 232, 159, 10, 11, 232, 158, 10, 11, 232, 157, 10, 11, - 232, 156, 10, 11, 232, 155, 10, 11, 232, 154, 10, 11, 232, 153, 10, 11, - 232, 152, 10, 11, 232, 151, 10, 11, 232, 150, 10, 11, 232, 149, 10, 11, - 232, 148, 10, 11, 232, 147, 10, 11, 232, 146, 10, 11, 232, 145, 10, 11, - 232, 144, 10, 11, 232, 143, 10, 11, 232, 142, 10, 11, 232, 141, 10, 11, - 232, 140, 10, 11, 232, 139, 10, 11, 232, 138, 10, 11, 232, 137, 10, 11, - 232, 136, 10, 11, 232, 135, 10, 11, 232, 134, 10, 11, 232, 133, 10, 11, - 232, 132, 10, 11, 232, 131, 10, 11, 232, 130, 10, 11, 232, 129, 10, 11, - 232, 128, 10, 11, 232, 127, 10, 11, 232, 126, 10, 11, 232, 125, 10, 11, - 232, 124, 10, 11, 232, 123, 10, 11, 232, 122, 10, 11, 232, 121, 10, 11, - 232, 120, 10, 11, 232, 119, 10, 11, 232, 118, 10, 11, 232, 117, 10, 11, - 230, 164, 10, 11, 230, 163, 10, 11, 230, 162, 10, 11, 230, 161, 10, 11, - 230, 160, 10, 11, 230, 159, 10, 11, 230, 158, 10, 11, 230, 157, 10, 11, - 230, 156, 10, 11, 230, 155, 10, 11, 230, 154, 10, 11, 230, 153, 10, 11, - 230, 152, 10, 11, 230, 151, 10, 11, 230, 150, 10, 11, 230, 149, 10, 11, - 230, 148, 10, 11, 230, 147, 10, 11, 230, 146, 10, 11, 230, 145, 10, 11, - 230, 144, 10, 11, 230, 143, 10, 11, 230, 142, 10, 11, 230, 141, 10, 11, - 230, 140, 10, 11, 230, 139, 10, 11, 230, 138, 10, 11, 230, 137, 10, 11, - 230, 136, 10, 11, 230, 135, 10, 11, 230, 134, 10, 11, 230, 133, 10, 11, - 230, 132, 10, 11, 230, 131, 10, 11, 230, 130, 10, 11, 230, 129, 10, 11, - 230, 128, 10, 11, 230, 127, 10, 11, 230, 126, 10, 11, 230, 125, 10, 11, - 230, 124, 10, 11, 230, 123, 10, 11, 230, 122, 10, 11, 230, 121, 10, 11, - 230, 120, 10, 11, 230, 119, 10, 11, 230, 118, 10, 11, 230, 117, 10, 11, - 230, 116, 10, 11, 229, 30, 10, 11, 229, 29, 10, 11, 229, 28, 10, 11, 229, - 27, 10, 11, 229, 26, 10, 11, 229, 25, 10, 11, 229, 24, 10, 11, 229, 23, - 10, 11, 229, 22, 10, 11, 229, 21, 10, 11, 229, 20, 10, 11, 229, 19, 10, - 11, 229, 18, 10, 11, 229, 17, 10, 11, 229, 16, 10, 11, 229, 15, 10, 11, - 229, 14, 10, 11, 229, 13, 10, 11, 229, 12, 10, 11, 229, 11, 10, 11, 229, - 10, 10, 11, 229, 9, 10, 11, 228, 134, 10, 11, 228, 133, 10, 11, 228, 132, - 10, 11, 228, 131, 10, 11, 228, 130, 10, 11, 228, 129, 10, 11, 228, 128, - 10, 11, 228, 127, 10, 11, 228, 126, 10, 11, 228, 125, 10, 11, 228, 124, - 10, 11, 228, 123, 10, 11, 228, 122, 10, 11, 228, 121, 10, 11, 228, 120, - 10, 11, 228, 119, 10, 11, 228, 118, 10, 11, 228, 117, 10, 11, 228, 116, - 10, 11, 228, 115, 10, 11, 228, 114, 10, 11, 228, 113, 10, 11, 228, 112, - 10, 11, 228, 111, 10, 11, 228, 110, 10, 11, 228, 109, 10, 11, 227, 233, - 10, 11, 227, 232, 10, 11, 227, 231, 10, 11, 227, 230, 10, 11, 227, 229, - 10, 11, 227, 228, 10, 11, 227, 227, 10, 11, 227, 226, 10, 11, 227, 225, - 10, 11, 227, 224, 10, 11, 227, 223, 10, 11, 227, 222, 10, 11, 227, 221, - 10, 11, 227, 220, 10, 11, 227, 219, 10, 11, 227, 218, 10, 11, 227, 217, - 10, 11, 227, 216, 10, 11, 227, 215, 10, 11, 227, 214, 10, 11, 227, 213, - 10, 11, 227, 212, 10, 11, 227, 211, 10, 11, 227, 210, 10, 11, 227, 209, - 10, 11, 227, 208, 10, 11, 227, 207, 10, 11, 227, 206, 10, 11, 227, 205, - 10, 11, 227, 204, 10, 11, 227, 203, 10, 11, 227, 202, 10, 11, 227, 201, - 10, 11, 227, 200, 10, 11, 227, 199, 10, 11, 227, 198, 10, 11, 227, 197, - 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, 10, 10, 11, 227, 9, 10, - 11, 227, 8, 10, 11, 227, 7, 10, 11, 227, 6, 10, 11, 227, 5, 10, 11, 227, - 4, 10, 11, 227, 3, 10, 11, 227, 2, 10, 11, 227, 1, 10, 11, 227, 0, 10, - 11, 226, 255, 10, 11, 226, 254, 10, 11, 225, 18, 10, 11, 225, 17, 10, 11, - 225, 16, 10, 11, 225, 15, 10, 11, 225, 14, 10, 11, 225, 13, 10, 11, 225, - 12, 10, 11, 224, 146, 10, 11, 224, 145, 10, 11, 224, 144, 10, 11, 224, - 143, 10, 11, 224, 142, 10, 11, 224, 141, 10, 11, 224, 140, 10, 11, 224, - 139, 10, 11, 224, 138, 10, 11, 224, 137, 10, 11, 224, 136, 10, 11, 224, - 135, 10, 11, 224, 134, 10, 11, 224, 133, 10, 11, 224, 132, 10, 11, 224, - 131, 10, 11, 224, 130, 10, 11, 224, 129, 10, 11, 224, 128, 10, 11, 224, - 127, 10, 11, 224, 126, 10, 11, 224, 125, 10, 11, 224, 124, 10, 11, 224, - 123, 10, 11, 224, 122, 10, 11, 224, 121, 10, 11, 224, 120, 10, 11, 224, - 119, 10, 11, 224, 118, 10, 11, 224, 117, 10, 11, 224, 116, 10, 11, 224, - 115, 10, 11, 224, 114, 10, 11, 224, 113, 10, 11, 223, 26, 10, 11, 223, - 25, 10, 11, 223, 24, 10, 11, 223, 23, 10, 11, 223, 22, 10, 11, 223, 21, - 10, 11, 223, 20, 10, 11, 223, 19, 10, 11, 223, 18, 10, 11, 223, 17, 10, - 11, 223, 16, 10, 11, 223, 15, 10, 11, 223, 14, 10, 11, 223, 13, 10, 11, - 223, 12, 10, 11, 223, 11, 10, 11, 223, 10, 10, 11, 223, 9, 10, 11, 223, - 8, 10, 11, 223, 7, 10, 11, 223, 6, 10, 11, 223, 5, 10, 11, 223, 4, 10, - 11, 223, 3, 10, 11, 223, 2, 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, 218, 111, 10, 11, 218, - 110, 10, 11, 218, 109, 10, 11, 218, 108, 10, 11, 218, 107, 10, 11, 218, - 106, 10, 11, 218, 105, 10, 11, 218, 104, 10, 11, 218, 103, 10, 11, 218, - 102, 10, 11, 218, 101, 10, 11, 218, 100, 10, 11, 218, 99, 10, 11, 218, - 98, 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, 215, 251, 10, 11, 215, 250, 10, 11, 215, 249, 10, 11, - 215, 248, 10, 11, 215, 247, 10, 11, 215, 246, 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, 85, 10, 11, 215, 84, 10, 11, 215, 83, 10, 11, 215, 82, 10, 11, 215, - 81, 10, 11, 215, 80, 10, 11, 215, 79, 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, 214, 84, 10, 11, 214, 83, 10, 11, 214, 82, 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, 213, 168, 10, 11, 213, 167, - 10, 11, 213, 166, 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, 106, 10, 11, 213, 105, - 10, 11, 213, 104, 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, 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, 255, 103, 10, 11, 255, 102, 10, 11, 255, 101, 10, 11, 255, 100, 10, - 11, 255, 99, 10, 11, 255, 98, 10, 11, 255, 97, 10, 11, 255, 96, 10, 11, - 255, 95, 10, 11, 255, 94, 10, 11, 255, 93, 10, 11, 255, 92, 10, 11, 255, - 91, 10, 11, 255, 90, 10, 11, 255, 89, 10, 11, 255, 88, 10, 11, 255, 87, - 10, 11, 255, 86, 10, 11, 255, 85, 10, 11, 255, 84, 10, 11, 255, 83, 10, - 11, 255, 82, 10, 11, 255, 81, 10, 11, 255, 80, 10, 11, 255, 79, 10, 11, - 255, 78, 10, 11, 255, 77, 10, 11, 255, 76, 10, 11, 255, 75, 10, 11, 255, - 74, 10, 11, 255, 73, 10, 11, 255, 72, 10, 11, 255, 71, 10, 11, 255, 70, - 20, 1, 159, 229, 163, 231, 153, 20, 1, 159, 243, 166, 244, 125, 20, 1, - 159, 225, 167, 231, 154, 225, 225, 20, 1, 159, 225, 167, 231, 154, 225, - 226, 20, 1, 159, 230, 113, 231, 153, 20, 1, 159, 220, 166, 20, 1, 159, - 217, 33, 231, 153, 20, 1, 159, 228, 19, 231, 153, 20, 1, 159, 220, 220, - 226, 252, 229, 64, 20, 1, 159, 225, 167, 226, 252, 229, 65, 225, 225, 20, - 1, 159, 225, 167, 226, 252, 229, 65, 225, 226, 20, 1, 159, 232, 96, 20, - 1, 159, 216, 91, 232, 97, 20, 1, 159, 229, 221, 20, 1, 159, 232, 93, 20, - 1, 159, 232, 54, 20, 1, 159, 230, 188, 20, 1, 159, 221, 68, 20, 1, 159, - 228, 139, 20, 1, 159, 235, 11, 20, 1, 159, 229, 33, 20, 1, 159, 218, 219, - 20, 1, 159, 229, 162, 20, 1, 159, 233, 209, 20, 1, 159, 233, 134, 234, - 53, 20, 1, 159, 228, 146, 231, 161, 20, 1, 159, 232, 100, 20, 1, 159, - 226, 156, 20, 1, 159, 243, 71, 20, 1, 159, 226, 214, 20, 1, 159, 231, 35, - 229, 195, 20, 1, 159, 228, 0, 231, 164, 20, 1, 159, 103, 212, 180, 230, - 107, 20, 1, 159, 243, 72, 20, 1, 159, 228, 146, 228, 147, 20, 1, 159, - 220, 75, 20, 1, 159, 231, 146, 20, 1, 159, 231, 167, 20, 1, 159, 231, 14, - 20, 1, 159, 235, 111, 20, 1, 159, 226, 252, 233, 169, 20, 1, 159, 230, - 40, 233, 169, 20, 1, 159, 226, 70, 20, 1, 159, 232, 94, 20, 1, 159, 229, - 102, 20, 1, 159, 225, 56, 20, 1, 159, 216, 88, 20, 1, 159, 232, 226, 20, - 1, 159, 219, 246, 20, 1, 159, 217, 182, 20, 1, 159, 232, 91, 20, 1, 159, - 235, 18, 20, 1, 159, 230, 36, 20, 1, 159, 234, 65, 20, 1, 159, 231, 15, - 20, 1, 159, 220, 163, 20, 1, 159, 233, 9, 20, 1, 159, 244, 182, 20, 1, - 159, 223, 135, 20, 1, 159, 234, 105, 20, 1, 159, 219, 242, 20, 1, 159, - 232, 51, 226, 11, 20, 1, 159, 220, 213, 20, 1, 159, 228, 145, 20, 1, 159, - 220, 198, 228, 156, 212, 188, 20, 1, 159, 228, 39, 231, 32, 20, 1, 159, - 226, 247, 20, 1, 159, 229, 34, 20, 1, 159, 215, 147, 20, 1, 159, 229, - 198, 20, 1, 159, 232, 90, 20, 1, 159, 229, 76, 20, 1, 159, 231, 252, 20, - 1, 159, 228, 51, 20, 1, 159, 217, 186, 20, 1, 159, 219, 240, 20, 1, 159, - 226, 248, 20, 1, 159, 228, 160, 20, 1, 159, 232, 98, 20, 1, 159, 228, 49, - 20, 1, 159, 235, 78, 20, 1, 159, 228, 163, 20, 1, 159, 214, 232, 20, 1, - 159, 232, 230, 20, 1, 159, 229, 247, 20, 1, 159, 230, 84, 20, 1, 159, - 231, 251, 20, 1, 226, 50, 228, 158, 20, 1, 226, 50, 216, 91, 232, 95, 20, - 1, 226, 50, 220, 130, 20, 1, 226, 50, 221, 72, 216, 90, 20, 1, 226, 50, - 233, 11, 228, 142, 20, 1, 226, 50, 232, 2, 232, 99, 20, 1, 226, 50, 234, - 207, 20, 1, 226, 50, 213, 7, 20, 1, 226, 50, 231, 253, 20, 1, 226, 50, - 235, 99, 20, 1, 226, 50, 226, 119, 20, 1, 226, 50, 213, 80, 233, 169, 20, - 1, 226, 50, 233, 225, 228, 156, 228, 60, 20, 1, 226, 50, 228, 140, 220, - 239, 20, 1, 226, 50, 230, 7, 229, 79, 20, 1, 226, 50, 243, 69, 20, 1, - 226, 50, 225, 217, 20, 1, 226, 50, 216, 91, 228, 154, 20, 1, 226, 50, - 220, 244, 229, 74, 20, 1, 226, 50, 220, 240, 20, 1, 226, 50, 231, 154, - 217, 185, 20, 1, 226, 50, 231, 240, 231, 254, 20, 1, 226, 50, 228, 50, - 228, 142, 20, 1, 226, 50, 235, 7, 20, 1, 226, 50, 243, 70, 20, 1, 226, - 50, 235, 3, 20, 1, 226, 50, 233, 249, 20, 1, 226, 50, 226, 158, 20, 1, - 226, 50, 214, 164, 20, 1, 226, 50, 229, 164, 230, 186, 20, 1, 226, 50, - 229, 197, 231, 236, 20, 1, 226, 50, 213, 184, 20, 1, 226, 50, 222, 206, - 20, 1, 226, 50, 218, 59, 20, 1, 226, 50, 231, 166, 20, 1, 226, 50, 229, - 182, 20, 1, 226, 50, 229, 183, 233, 206, 20, 1, 226, 50, 231, 156, 20, 1, - 226, 50, 219, 11, 20, 1, 226, 50, 231, 244, 20, 1, 226, 50, 231, 17, 20, - 1, 226, 50, 228, 62, 20, 1, 226, 50, 225, 60, 20, 1, 226, 50, 231, 165, - 229, 199, 20, 1, 226, 50, 244, 215, 20, 1, 226, 50, 231, 231, 20, 1, 226, - 50, 244, 236, 20, 1, 226, 50, 235, 15, 20, 1, 226, 50, 232, 116, 229, 68, - 20, 1, 226, 50, 232, 116, 229, 44, 20, 1, 226, 50, 233, 133, 20, 1, 226, - 50, 229, 205, 20, 1, 226, 50, 228, 165, 20, 1, 226, 50, 191, 20, 1, 226, - 50, 234, 194, 20, 1, 226, 50, 229, 152, 20, 1, 133, 229, 163, 232, 97, - 20, 1, 133, 228, 18, 20, 1, 133, 212, 188, 20, 1, 133, 214, 40, 20, 1, - 133, 229, 198, 20, 1, 133, 230, 28, 20, 1, 133, 229, 170, 20, 1, 133, - 243, 79, 20, 1, 133, 231, 248, 20, 1, 133, 243, 173, 20, 1, 133, 228, 41, - 231, 53, 231, 168, 20, 1, 133, 228, 138, 231, 239, 20, 1, 133, 231, 245, - 20, 1, 133, 225, 223, 20, 1, 133, 230, 13, 20, 1, 133, 232, 0, 251, 84, - 20, 1, 133, 235, 5, 20, 1, 133, 243, 80, 20, 1, 133, 235, 12, 20, 1, 133, - 212, 205, 230, 216, 20, 1, 133, 228, 12, 20, 1, 133, 231, 233, 20, 1, - 133, 228, 164, 20, 1, 133, 231, 239, 20, 1, 133, 213, 8, 20, 1, 133, 234, - 113, 20, 1, 133, 235, 128, 20, 1, 133, 221, 67, 20, 1, 133, 230, 22, 20, - 1, 133, 218, 57, 20, 1, 133, 229, 48, 20, 1, 133, 217, 33, 212, 190, 20, - 1, 133, 219, 37, 20, 1, 133, 229, 189, 228, 60, 20, 1, 133, 214, 163, 20, - 1, 133, 230, 87, 20, 1, 133, 232, 116, 235, 14, 20, 1, 133, 228, 147, 20, - 1, 133, 229, 184, 20, 1, 133, 233, 210, 20, 1, 133, 231, 241, 20, 1, 133, - 231, 145, 20, 1, 133, 228, 141, 20, 1, 133, 217, 181, 20, 1, 133, 229, - 186, 20, 1, 133, 244, 68, 20, 1, 133, 230, 27, 20, 1, 133, 228, 166, 20, - 1, 133, 228, 162, 20, 1, 133, 251, 161, 20, 1, 133, 214, 165, 20, 1, 133, - 231, 246, 20, 1, 133, 223, 77, 20, 1, 133, 229, 78, 20, 1, 133, 233, 224, - 20, 1, 133, 217, 31, 20, 1, 133, 228, 148, 229, 152, 20, 1, 133, 229, 70, - 20, 1, 133, 235, 18, 20, 1, 133, 229, 190, 20, 1, 133, 232, 90, 20, 1, - 133, 231, 234, 20, 1, 133, 232, 230, 20, 1, 133, 234, 53, 20, 1, 133, - 229, 76, 20, 1, 133, 229, 152, 20, 1, 133, 213, 175, 20, 1, 133, 229, - 187, 20, 1, 133, 228, 151, 20, 1, 133, 228, 143, 20, 1, 133, 234, 67, - 229, 34, 20, 1, 133, 228, 149, 20, 1, 133, 230, 35, 20, 1, 133, 232, 116, - 228, 154, 20, 1, 133, 213, 94, 20, 1, 133, 230, 34, 20, 1, 133, 220, 165, - 20, 1, 133, 221, 70, 20, 1, 133, 231, 242, 20, 1, 133, 232, 97, 20, 1, - 133, 231, 252, 20, 1, 133, 235, 6, 20, 1, 133, 231, 243, 20, 1, 133, 235, - 10, 20, 1, 133, 232, 0, 226, 15, 20, 1, 133, 212, 171, 20, 1, 133, 229, - 66, 20, 1, 133, 231, 103, 20, 1, 133, 230, 240, 20, 1, 133, 220, 216, 20, - 1, 133, 235, 28, 233, 192, 20, 1, 133, 235, 28, 244, 249, 20, 1, 133, - 229, 219, 20, 1, 133, 230, 84, 20, 1, 133, 233, 70, 20, 1, 133, 225, 233, - 20, 1, 133, 226, 110, 20, 1, 133, 217, 196, 20, 1, 105, 231, 232, 20, 1, - 105, 214, 38, 20, 1, 105, 229, 64, 20, 1, 105, 231, 153, 20, 1, 105, 229, - 62, 20, 1, 105, 233, 105, 20, 1, 105, 229, 67, 20, 1, 105, 228, 161, 20, - 1, 105, 229, 204, 20, 1, 105, 228, 60, 20, 1, 105, 213, 185, 20, 1, 105, - 229, 160, 20, 1, 105, 221, 6, 20, 1, 105, 229, 171, 20, 1, 105, 235, 13, - 20, 1, 105, 217, 183, 20, 1, 105, 220, 242, 20, 1, 105, 229, 75, 20, 1, - 105, 219, 11, 20, 1, 105, 235, 18, 20, 1, 105, 213, 82, 20, 1, 105, 234, - 68, 20, 1, 105, 222, 174, 20, 1, 105, 231, 158, 20, 1, 105, 230, 26, 20, - 1, 105, 232, 66, 20, 1, 105, 231, 164, 20, 1, 105, 221, 69, 20, 1, 105, - 213, 31, 20, 1, 105, 229, 69, 20, 1, 105, 235, 9, 231, 235, 20, 1, 105, - 229, 167, 20, 1, 105, 216, 90, 20, 1, 105, 243, 88, 20, 1, 105, 229, 157, - 20, 1, 105, 244, 216, 20, 1, 105, 230, 30, 20, 1, 105, 231, 137, 20, 1, - 105, 233, 129, 20, 1, 105, 230, 12, 20, 1, 105, 231, 31, 20, 1, 105, 231, - 141, 20, 1, 105, 225, 41, 20, 1, 105, 231, 139, 20, 1, 105, 231, 155, 20, - 1, 105, 232, 216, 20, 1, 105, 228, 153, 20, 1, 105, 231, 255, 20, 1, 105, - 234, 44, 20, 1, 105, 228, 51, 20, 1, 105, 217, 186, 20, 1, 105, 219, 240, - 20, 1, 105, 212, 171, 20, 1, 105, 235, 10, 20, 1, 105, 224, 95, 20, 1, - 105, 217, 231, 20, 1, 105, 229, 168, 20, 1, 105, 231, 160, 20, 1, 105, - 228, 152, 20, 1, 105, 235, 8, 20, 1, 105, 225, 227, 20, 1, 105, 226, 64, - 20, 1, 105, 228, 28, 20, 1, 105, 233, 133, 20, 1, 105, 229, 205, 20, 1, - 105, 231, 157, 20, 1, 105, 229, 179, 20, 1, 105, 212, 185, 20, 1, 105, - 226, 186, 20, 1, 105, 212, 184, 20, 1, 105, 230, 35, 20, 1, 105, 228, - 142, 20, 1, 105, 219, 39, 20, 1, 105, 234, 72, 20, 1, 105, 229, 194, 20, - 1, 105, 229, 165, 20, 1, 105, 216, 74, 20, 1, 105, 231, 168, 20, 1, 105, - 234, 62, 20, 1, 105, 228, 150, 20, 1, 105, 217, 184, 20, 1, 105, 232, 92, - 20, 1, 105, 229, 203, 20, 1, 105, 233, 128, 20, 1, 105, 229, 185, 20, 1, - 105, 228, 155, 20, 1, 105, 229, 48, 20, 1, 105, 243, 73, 20, 1, 105, 234, - 81, 20, 1, 105, 224, 12, 227, 112, 20, 1, 105, 218, 49, 20, 1, 105, 216, - 236, 20, 1, 105, 228, 49, 20, 1, 105, 223, 170, 20, 1, 105, 233, 171, 20, - 1, 105, 231, 214, 20, 1, 105, 184, 20, 1, 105, 218, 219, 20, 1, 105, 230, - 242, 20, 1, 105, 220, 228, 20, 1, 105, 220, 238, 20, 1, 105, 234, 19, 20, - 1, 105, 228, 135, 20, 1, 105, 220, 170, 20, 1, 105, 228, 144, 20, 1, 105, - 226, 122, 20, 1, 105, 229, 128, 20, 1, 105, 220, 197, 20, 1, 105, 225, - 55, 20, 1, 105, 230, 186, 20, 1, 105, 232, 248, 20, 1, 105, 224, 12, 230, - 236, 20, 1, 105, 217, 84, 20, 1, 105, 228, 136, 20, 1, 105, 232, 0, 200, - 20, 1, 105, 222, 172, 20, 1, 105, 245, 28, 20, 1, 82, 230, 34, 20, 1, 82, - 216, 242, 20, 1, 82, 231, 245, 20, 1, 82, 233, 210, 20, 1, 82, 214, 113, - 20, 1, 82, 232, 252, 20, 1, 82, 226, 251, 20, 1, 82, 219, 249, 20, 1, 82, - 224, 72, 20, 1, 82, 228, 157, 20, 1, 82, 230, 5, 20, 1, 82, 225, 69, 20, - 1, 82, 218, 26, 20, 1, 82, 229, 173, 20, 1, 82, 234, 109, 20, 1, 82, 213, - 178, 20, 1, 82, 222, 112, 20, 1, 82, 229, 195, 20, 1, 82, 226, 248, 20, - 1, 82, 216, 243, 20, 1, 82, 234, 66, 20, 1, 82, 233, 10, 20, 1, 82, 228, - 160, 20, 1, 82, 229, 149, 20, 1, 82, 232, 98, 20, 1, 82, 229, 166, 20, 1, - 82, 229, 148, 20, 1, 82, 228, 159, 20, 1, 82, 223, 168, 20, 1, 82, 229, - 66, 20, 1, 82, 226, 121, 20, 1, 82, 222, 225, 20, 1, 82, 229, 180, 20, 1, - 82, 231, 147, 20, 1, 82, 243, 67, 20, 1, 82, 229, 169, 20, 1, 82, 229, - 77, 20, 1, 82, 232, 50, 20, 1, 82, 232, 250, 20, 1, 82, 229, 200, 20, 1, - 82, 230, 18, 20, 1, 82, 218, 48, 228, 142, 20, 1, 82, 221, 71, 20, 1, 82, - 225, 65, 20, 1, 82, 230, 38, 219, 254, 20, 1, 82, 229, 188, 228, 60, 20, - 1, 82, 212, 252, 20, 1, 82, 243, 68, 20, 1, 82, 216, 89, 20, 1, 82, 213, - 11, 20, 1, 82, 225, 186, 20, 1, 82, 216, 79, 20, 1, 82, 235, 16, 20, 1, - 82, 219, 38, 20, 1, 82, 217, 185, 20, 1, 82, 214, 166, 20, 1, 82, 213, - 250, 20, 1, 82, 233, 252, 20, 1, 82, 225, 71, 20, 1, 82, 218, 58, 20, 1, - 82, 243, 87, 20, 1, 82, 229, 209, 20, 1, 82, 220, 241, 20, 1, 82, 231, - 142, 20, 1, 82, 231, 249, 20, 1, 82, 228, 16, 20, 1, 82, 229, 31, 20, 1, - 82, 243, 169, 20, 1, 82, 216, 80, 20, 1, 82, 234, 75, 20, 1, 82, 213, 59, - 20, 1, 82, 228, 50, 250, 76, 20, 1, 82, 212, 242, 20, 1, 82, 231, 159, - 20, 1, 82, 230, 23, 20, 1, 82, 226, 12, 20, 1, 82, 212, 189, 20, 1, 82, - 233, 130, 20, 1, 82, 244, 68, 20, 1, 82, 243, 168, 20, 1, 82, 229, 159, - 20, 1, 82, 235, 18, 20, 1, 82, 232, 101, 20, 1, 82, 229, 172, 20, 1, 82, - 243, 74, 20, 1, 82, 245, 29, 20, 1, 82, 228, 137, 20, 1, 82, 226, 65, 20, - 1, 82, 213, 9, 20, 1, 82, 229, 196, 20, 1, 82, 228, 50, 252, 70, 20, 1, - 82, 227, 252, 20, 1, 82, 225, 163, 20, 1, 82, 231, 103, 20, 1, 82, 244, - 66, 20, 1, 82, 230, 107, 20, 1, 82, 230, 240, 20, 1, 82, 243, 73, 20, 1, - 82, 244, 70, 75, 20, 1, 82, 230, 187, 20, 1, 82, 225, 68, 20, 1, 82, 229, - 161, 20, 1, 82, 234, 53, 20, 1, 82, 226, 9, 20, 1, 82, 228, 145, 20, 1, - 82, 213, 10, 20, 1, 82, 229, 181, 20, 1, 82, 226, 252, 226, 98, 20, 1, - 82, 244, 70, 251, 71, 20, 1, 82, 244, 126, 20, 1, 82, 229, 71, 20, 1, 82, - 63, 20, 1, 82, 216, 236, 20, 1, 82, 78, 20, 1, 82, 75, 20, 1, 82, 233, - 208, 20, 1, 82, 226, 252, 225, 193, 20, 1, 82, 218, 63, 20, 1, 82, 218, - 15, 20, 1, 82, 230, 38, 230, 175, 241, 83, 20, 1, 82, 220, 216, 20, 1, - 82, 213, 6, 20, 1, 82, 229, 142, 20, 1, 82, 212, 194, 20, 1, 82, 212, - 219, 218, 199, 20, 1, 82, 212, 219, 249, 209, 20, 1, 82, 212, 179, 20, 1, - 82, 212, 187, 20, 1, 82, 235, 4, 20, 1, 82, 226, 63, 20, 1, 82, 229, 72, - 245, 186, 20, 1, 82, 225, 66, 20, 1, 82, 213, 183, 20, 1, 82, 244, 236, - 20, 1, 82, 214, 232, 20, 1, 82, 232, 230, 20, 1, 82, 231, 112, 20, 1, 82, - 223, 238, 20, 1, 82, 224, 96, 20, 1, 82, 229, 141, 20, 1, 82, 229, 226, - 20, 1, 82, 220, 208, 20, 1, 82, 220, 197, 20, 1, 82, 244, 70, 224, 14, - 20, 1, 82, 207, 20, 1, 82, 226, 20, 20, 1, 82, 232, 248, 20, 1, 82, 234, - 148, 20, 1, 82, 231, 192, 20, 1, 82, 191, 20, 1, 82, 232, 47, 20, 1, 82, - 217, 187, 20, 1, 82, 234, 212, 20, 1, 82, 231, 34, 20, 1, 82, 217, 213, - 20, 1, 82, 245, 2, 20, 1, 82, 243, 63, 20, 1, 226, 49, 183, 20, 1, 226, - 49, 72, 20, 1, 226, 49, 234, 81, 20, 1, 226, 49, 246, 30, 20, 1, 226, 49, - 224, 35, 20, 1, 226, 49, 218, 49, 20, 1, 226, 49, 228, 49, 20, 1, 226, - 49, 233, 255, 20, 1, 226, 49, 223, 170, 20, 1, 226, 49, 223, 216, 20, 1, - 226, 49, 231, 214, 20, 1, 226, 49, 218, 63, 20, 1, 226, 49, 230, 37, 20, - 1, 226, 49, 229, 78, 20, 1, 226, 49, 184, 20, 1, 226, 49, 218, 219, 20, - 1, 226, 49, 220, 228, 20, 1, 226, 49, 220, 136, 20, 1, 226, 49, 221, 67, - 20, 1, 226, 49, 234, 19, 20, 1, 226, 49, 235, 18, 20, 1, 226, 49, 228, - 107, 20, 1, 226, 49, 228, 135, 20, 1, 226, 49, 229, 49, 20, 1, 226, 49, - 212, 218, 20, 1, 226, 49, 220, 170, 20, 1, 226, 49, 189, 20, 1, 226, 49, - 228, 163, 20, 1, 226, 49, 226, 63, 20, 1, 226, 49, 228, 144, 20, 1, 226, - 49, 213, 183, 20, 1, 226, 49, 226, 122, 20, 1, 226, 49, 223, 77, 20, 1, - 226, 49, 229, 128, 20, 1, 226, 49, 223, 238, 20, 1, 226, 49, 235, 27, 20, - 1, 226, 49, 229, 158, 20, 1, 226, 49, 229, 206, 20, 1, 226, 49, 220, 208, - 20, 1, 226, 49, 225, 69, 20, 1, 226, 49, 244, 126, 20, 1, 226, 49, 214, - 52, 20, 1, 226, 49, 233, 111, 20, 1, 226, 49, 232, 248, 20, 1, 226, 49, - 234, 148, 20, 1, 226, 49, 231, 247, 20, 1, 226, 49, 224, 11, 20, 1, 226, - 49, 191, 20, 1, 226, 49, 231, 45, 20, 1, 226, 49, 231, 255, 20, 1, 226, - 49, 217, 196, 20, 1, 226, 49, 234, 115, 20, 1, 226, 49, 222, 190, 20, 1, - 226, 49, 214, 102, 56, 1, 254, 64, 77, 136, 1, 254, 64, 213, 39, 48, 27, - 16, 225, 75, 48, 27, 16, 248, 225, 48, 27, 16, 226, 86, 48, 27, 16, 227, - 19, 246, 0, 48, 27, 16, 227, 19, 248, 18, 48, 27, 16, 214, 254, 246, 0, - 48, 27, 16, 214, 254, 248, 18, 48, 27, 16, 235, 59, 48, 27, 16, 218, 129, - 48, 27, 16, 226, 174, 48, 27, 16, 212, 209, 48, 27, 16, 212, 210, 248, - 18, 48, 27, 16, 234, 98, 48, 27, 16, 254, 107, 246, 0, 48, 27, 16, 245, - 114, 246, 0, 48, 27, 16, 217, 224, 48, 27, 16, 235, 23, 48, 27, 16, 254, - 98, 48, 27, 16, 254, 99, 248, 18, 48, 27, 16, 218, 135, 48, 27, 16, 217, - 125, 48, 27, 16, 227, 109, 254, 62, 48, 27, 16, 242, 255, 254, 62, 48, - 27, 16, 225, 74, 48, 27, 16, 250, 208, 48, 27, 16, 214, 244, 48, 27, 16, - 236, 23, 254, 62, 48, 27, 16, 235, 25, 254, 62, 48, 27, 16, 235, 24, 254, - 62, 48, 27, 16, 222, 154, 48, 27, 16, 226, 165, 48, 27, 16, 219, 100, - 254, 101, 48, 27, 16, 227, 18, 254, 62, 48, 27, 16, 214, 253, 254, 62, - 48, 27, 16, 254, 102, 254, 62, 48, 27, 16, 254, 96, 48, 27, 16, 234, 157, - 48, 27, 16, 223, 233, 48, 27, 16, 226, 18, 254, 62, 48, 27, 16, 217, 50, - 48, 27, 16, 254, 157, 48, 27, 16, 222, 101, 48, 27, 16, 218, 138, 254, - 62, 48, 27, 16, 218, 138, 231, 177, 219, 98, 48, 27, 16, 227, 13, 254, - 62, 48, 27, 16, 217, 156, 48, 27, 16, 233, 149, 48, 27, 16, 246, 117, 48, - 27, 16, 216, 198, 48, 27, 16, 217, 198, 48, 27, 16, 234, 101, 48, 27, 16, - 254, 107, 245, 114, 229, 244, 48, 27, 16, 244, 71, 254, 62, 48, 27, 16, - 236, 124, 48, 27, 16, 216, 170, 254, 62, 48, 27, 16, 235, 62, 216, 169, - 48, 27, 16, 226, 111, 48, 27, 16, 225, 79, 48, 27, 16, 234, 131, 48, 27, - 16, 250, 140, 254, 62, 48, 27, 16, 224, 73, 48, 27, 16, 226, 177, 254, - 62, 48, 27, 16, 226, 175, 254, 62, 48, 27, 16, 240, 219, 48, 27, 16, 230, - 91, 48, 27, 16, 226, 68, 48, 27, 16, 234, 132, 254, 185, 48, 27, 16, 216, - 170, 254, 185, 48, 27, 16, 219, 77, 48, 27, 16, 242, 222, 48, 27, 16, - 236, 23, 229, 244, 48, 27, 16, 227, 109, 229, 244, 48, 27, 16, 227, 19, - 229, 244, 48, 27, 16, 226, 67, 48, 27, 16, 234, 118, 48, 27, 16, 226, 66, - 48, 27, 16, 234, 100, 48, 27, 16, 226, 112, 229, 244, 48, 27, 16, 235, - 24, 229, 245, 254, 134, 48, 27, 16, 235, 25, 229, 245, 254, 134, 48, 27, - 16, 212, 207, 48, 27, 16, 254, 99, 229, 244, 48, 27, 16, 254, 100, 218, - 136, 229, 244, 48, 27, 16, 212, 208, 48, 27, 16, 234, 99, 48, 27, 16, - 245, 251, 48, 27, 16, 250, 209, 48, 27, 16, 231, 81, 236, 22, 48, 27, 16, - 214, 254, 229, 244, 48, 27, 16, 226, 18, 229, 244, 48, 27, 16, 225, 80, - 229, 244, 48, 27, 16, 227, 106, 48, 27, 16, 254, 122, 48, 27, 16, 232, - 191, 48, 27, 16, 226, 175, 229, 244, 48, 27, 16, 226, 177, 229, 244, 48, - 27, 16, 245, 147, 226, 176, 48, 27, 16, 234, 17, 48, 27, 16, 254, 123, - 48, 27, 16, 216, 170, 229, 244, 48, 27, 16, 245, 254, 48, 27, 16, 218, - 138, 229, 244, 48, 27, 16, 218, 130, 48, 27, 16, 250, 140, 229, 244, 48, - 27, 16, 245, 190, 48, 27, 16, 222, 102, 229, 244, 48, 27, 16, 213, 142, - 234, 157, 48, 27, 16, 216, 167, 48, 27, 16, 225, 81, 48, 27, 16, 216, - 171, 48, 27, 16, 216, 168, 48, 27, 16, 225, 78, 48, 27, 16, 216, 166, 48, - 27, 16, 225, 77, 48, 27, 16, 242, 254, 48, 27, 16, 254, 56, 48, 27, 16, - 245, 147, 254, 56, 48, 27, 16, 227, 13, 229, 244, 48, 27, 16, 217, 155, - 245, 155, 48, 27, 16, 217, 155, 245, 113, 48, 27, 16, 217, 157, 254, 103, - 48, 27, 16, 217, 150, 235, 109, 254, 95, 48, 27, 16, 235, 61, 48, 27, 16, - 245, 218, 48, 27, 16, 213, 3, 235, 58, 48, 27, 16, 213, 3, 254, 134, 48, - 27, 16, 219, 99, 48, 27, 16, 234, 158, 254, 134, 48, 27, 16, 248, 19, - 254, 62, 48, 27, 16, 234, 102, 254, 62, 48, 27, 16, 234, 102, 254, 185, - 48, 27, 16, 234, 102, 229, 244, 48, 27, 16, 254, 102, 229, 244, 48, 27, - 16, 254, 104, 48, 27, 16, 248, 18, 48, 27, 16, 216, 181, 48, 27, 16, 217, - 190, 48, 27, 16, 234, 122, 48, 27, 16, 233, 154, 245, 213, 250, 131, 48, - 27, 16, 233, 154, 246, 118, 250, 132, 48, 27, 16, 233, 154, 216, 183, - 250, 132, 48, 27, 16, 233, 154, 217, 200, 250, 132, 48, 27, 16, 233, 154, - 236, 119, 250, 131, 48, 27, 16, 242, 255, 229, 245, 254, 134, 48, 27, 16, - 242, 255, 226, 166, 254, 52, 48, 27, 16, 242, 255, 226, 166, 248, 101, - 48, 27, 16, 248, 42, 48, 27, 16, 248, 43, 226, 166, 254, 53, 235, 58, 48, - 27, 16, 248, 43, 226, 166, 254, 53, 254, 134, 48, 27, 16, 248, 43, 226, - 166, 248, 101, 48, 27, 16, 216, 187, 48, 27, 16, 254, 57, 48, 27, 16, - 236, 126, 48, 27, 16, 248, 63, 48, 27, 16, 254, 244, 225, 170, 254, 58, - 48, 27, 16, 254, 244, 254, 55, 48, 27, 16, 254, 244, 254, 58, 48, 27, 16, - 254, 244, 231, 171, 48, 27, 16, 254, 244, 231, 180, 48, 27, 16, 254, 244, - 243, 0, 48, 27, 16, 254, 244, 242, 253, 48, 27, 16, 254, 244, 225, 170, - 243, 0, 48, 27, 16, 232, 29, 225, 86, 240, 217, 48, 27, 16, 232, 29, 254, - 187, 225, 86, 240, 217, 48, 27, 16, 232, 29, 248, 100, 240, 217, 48, 27, - 16, 232, 29, 254, 187, 248, 100, 240, 217, 48, 27, 16, 232, 29, 216, 176, - 240, 217, 48, 27, 16, 232, 29, 216, 188, 48, 27, 16, 232, 29, 217, 194, - 240, 217, 48, 27, 16, 232, 29, 217, 194, 233, 157, 240, 217, 48, 27, 16, - 232, 29, 233, 157, 240, 217, 48, 27, 16, 232, 29, 225, 207, 240, 217, 48, - 27, 16, 236, 28, 217, 217, 240, 218, 48, 27, 16, 254, 100, 217, 217, 240, - 218, 48, 27, 16, 245, 5, 217, 191, 48, 27, 16, 245, 5, 231, 27, 48, 27, - 16, 245, 5, 248, 47, 48, 27, 16, 232, 29, 214, 248, 240, 217, 48, 27, 16, - 232, 29, 225, 85, 240, 217, 48, 27, 16, 232, 29, 225, 207, 217, 194, 240, - 217, 48, 27, 16, 242, 251, 230, 167, 254, 103, 48, 27, 16, 242, 251, 230, - 167, 248, 17, 48, 27, 16, 245, 227, 235, 109, 244, 71, 214, 109, 48, 27, - 16, 236, 125, 48, 27, 16, 236, 123, 48, 27, 16, 244, 71, 254, 63, 248, - 99, 240, 216, 48, 27, 16, 244, 71, 248, 61, 195, 48, 27, 16, 244, 71, - 248, 61, 230, 91, 48, 27, 16, 244, 71, 230, 86, 240, 217, 48, 27, 16, - 244, 71, 248, 61, 248, 76, 48, 27, 16, 244, 71, 220, 49, 248, 60, 248, - 76, 48, 27, 16, 244, 71, 248, 61, 235, 44, 48, 27, 16, 244, 71, 248, 61, - 212, 16, 48, 27, 16, 244, 71, 248, 61, 229, 129, 235, 58, 48, 27, 16, - 244, 71, 248, 61, 229, 129, 254, 134, 48, 27, 16, 244, 71, 232, 69, 250, - 133, 248, 47, 48, 27, 16, 244, 71, 232, 69, 250, 133, 231, 27, 48, 27, - 16, 244, 211, 220, 49, 250, 133, 214, 247, 48, 27, 16, 244, 71, 220, 49, - 250, 133, 218, 139, 48, 27, 16, 244, 71, 229, 246, 48, 27, 16, 250, 134, - 211, 248, 48, 27, 16, 250, 134, 234, 156, 48, 27, 16, 250, 134, 219, 216, - 48, 27, 16, 244, 71, 241, 7, 213, 2, 217, 195, 48, 27, 16, 244, 71, 245, - 228, 254, 124, 48, 27, 16, 213, 2, 216, 177, 48, 27, 16, 248, 55, 216, - 177, 48, 27, 16, 248, 55, 217, 195, 48, 27, 16, 248, 55, 254, 105, 246, - 118, 247, 214, 48, 27, 16, 248, 55, 231, 25, 217, 199, 247, 214, 48, 27, - 16, 248, 55, 248, 39, 245, 124, 247, 214, 48, 27, 16, 248, 55, 216, 185, - 227, 114, 247, 214, 48, 27, 16, 213, 2, 254, 105, 246, 118, 247, 214, 48, - 27, 16, 213, 2, 231, 25, 217, 199, 247, 214, 48, 27, 16, 213, 2, 248, 39, - 245, 124, 247, 214, 48, 27, 16, 213, 2, 216, 185, 227, 114, 247, 214, 48, - 27, 16, 243, 145, 248, 54, 48, 27, 16, 243, 145, 213, 1, 48, 27, 16, 248, - 62, 254, 105, 231, 82, 48, 27, 16, 248, 62, 254, 105, 231, 207, 48, 27, - 16, 248, 62, 248, 18, 48, 27, 16, 248, 62, 217, 148, 48, 27, 16, 220, - 108, 217, 148, 48, 27, 16, 220, 108, 217, 149, 248, 3, 48, 27, 16, 220, - 108, 217, 149, 216, 178, 48, 27, 16, 220, 108, 217, 149, 217, 188, 48, - 27, 16, 220, 108, 254, 30, 48, 27, 16, 220, 108, 254, 31, 248, 3, 48, 27, - 16, 220, 108, 254, 31, 216, 178, 48, 27, 16, 220, 108, 254, 31, 217, 188, - 48, 27, 16, 248, 40, 243, 126, 48, 27, 16, 248, 46, 227, 40, 48, 27, 16, - 219, 91, 48, 27, 16, 254, 49, 195, 48, 27, 16, 254, 49, 214, 109, 48, 27, - 16, 254, 49, 243, 230, 48, 27, 16, 254, 49, 248, 76, 48, 27, 16, 254, 49, - 235, 44, 48, 27, 16, 254, 49, 212, 16, 48, 27, 16, 254, 49, 229, 128, 48, - 27, 16, 235, 24, 229, 245, 231, 179, 48, 27, 16, 235, 25, 229, 245, 231, - 179, 48, 27, 16, 235, 24, 229, 245, 235, 58, 48, 27, 16, 235, 25, 229, - 245, 235, 58, 48, 27, 16, 234, 158, 235, 58, 48, 27, 16, 242, 255, 229, - 245, 235, 58, 27, 16, 220, 100, 252, 181, 27, 16, 52, 252, 181, 27, 16, - 41, 252, 181, 27, 16, 223, 237, 41, 252, 181, 27, 16, 248, 222, 252, 181, - 27, 16, 220, 196, 252, 181, 27, 16, 43, 224, 6, 53, 27, 16, 47, 224, 6, - 53, 27, 16, 224, 6, 247, 193, 27, 16, 249, 7, 222, 105, 27, 16, 249, 31, - 251, 49, 27, 16, 222, 105, 27, 16, 250, 38, 27, 16, 224, 4, 244, 200, 27, - 16, 224, 4, 244, 199, 27, 16, 224, 4, 244, 198, 27, 16, 244, 220, 27, 16, - 244, 221, 55, 27, 16, 251, 201, 79, 27, 16, 251, 79, 27, 16, 251, 211, - 27, 16, 125, 27, 16, 227, 96, 219, 116, 27, 16, 216, 30, 219, 116, 27, - 16, 217, 109, 219, 116, 27, 16, 244, 100, 219, 116, 27, 16, 244, 169, - 219, 116, 27, 16, 220, 71, 219, 116, 27, 16, 220, 69, 244, 84, 27, 16, - 244, 98, 244, 84, 27, 16, 244, 42, 250, 74, 27, 16, 244, 42, 250, 75, - 227, 42, 254, 178, 27, 16, 244, 42, 250, 75, 227, 42, 252, 168, 27, 16, - 251, 122, 250, 74, 27, 16, 245, 96, 250, 74, 27, 16, 245, 96, 250, 75, - 227, 42, 254, 178, 27, 16, 245, 96, 250, 75, 227, 42, 252, 168, 27, 16, - 246, 159, 250, 73, 27, 16, 246, 159, 250, 72, 27, 16, 230, 225, 231, 225, - 223, 247, 27, 16, 52, 221, 20, 27, 16, 52, 244, 154, 27, 16, 244, 155, - 215, 140, 27, 16, 244, 155, 246, 181, 27, 16, 230, 77, 215, 140, 27, 16, - 230, 77, 246, 181, 27, 16, 221, 21, 215, 140, 27, 16, 221, 21, 246, 181, - 27, 16, 224, 202, 161, 221, 20, 27, 16, 224, 202, 161, 244, 154, 27, 16, - 250, 21, 217, 54, 27, 16, 249, 150, 217, 54, 27, 16, 227, 42, 254, 178, - 27, 16, 227, 42, 252, 168, 27, 16, 224, 184, 254, 178, 27, 16, 224, 184, - 252, 168, 27, 16, 230, 228, 223, 247, 27, 16, 213, 239, 223, 247, 27, 16, - 157, 223, 247, 27, 16, 224, 202, 223, 247, 27, 16, 246, 11, 223, 247, 27, - 16, 220, 65, 223, 247, 27, 16, 217, 126, 223, 247, 27, 16, 220, 57, 223, - 247, 27, 16, 124, 241, 63, 216, 43, 223, 247, 27, 16, 213, 170, 228, 197, - 27, 16, 95, 228, 197, 27, 16, 250, 96, 213, 170, 228, 197, 27, 16, 42, - 228, 198, 213, 241, 27, 16, 42, 228, 198, 252, 13, 27, 16, 216, 197, 228, - 198, 116, 213, 241, 27, 16, 216, 197, 228, 198, 116, 252, 13, 27, 16, - 216, 197, 228, 198, 43, 213, 241, 27, 16, 216, 197, 228, 198, 43, 252, - 13, 27, 16, 216, 197, 228, 198, 47, 213, 241, 27, 16, 216, 197, 228, 198, - 47, 252, 13, 27, 16, 216, 197, 228, 198, 121, 213, 241, 27, 16, 216, 197, - 228, 198, 121, 252, 13, 27, 16, 216, 197, 228, 198, 116, 47, 213, 241, - 27, 16, 216, 197, 228, 198, 116, 47, 252, 13, 27, 16, 231, 13, 228, 198, - 213, 241, 27, 16, 231, 13, 228, 198, 252, 13, 27, 16, 216, 194, 228, 198, - 121, 213, 241, 27, 16, 216, 194, 228, 198, 121, 252, 13, 27, 16, 226, - 169, 228, 197, 27, 16, 214, 117, 228, 197, 27, 16, 228, 198, 252, 13, 27, - 16, 228, 102, 228, 197, 27, 16, 250, 45, 228, 198, 213, 241, 27, 16, 250, - 45, 228, 198, 252, 13, 27, 16, 251, 199, 27, 16, 213, 239, 228, 201, 27, - 16, 157, 228, 201, 27, 16, 224, 202, 228, 201, 27, 16, 246, 11, 228, 201, - 27, 16, 220, 65, 228, 201, 27, 16, 217, 126, 228, 201, 27, 16, 220, 57, - 228, 201, 27, 16, 124, 241, 63, 216, 43, 228, 201, 27, 16, 38, 219, 93, - 27, 16, 38, 219, 191, 219, 93, 27, 16, 38, 216, 205, 27, 16, 38, 216, - 204, 27, 16, 38, 216, 203, 27, 16, 244, 190, 216, 205, 27, 16, 244, 190, - 216, 204, 27, 16, 244, 190, 216, 203, 27, 16, 38, 253, 232, 247, 195, 27, - 16, 38, 244, 161, 27, 16, 38, 244, 160, 27, 16, 38, 244, 159, 27, 16, 38, - 244, 158, 27, 16, 38, 244, 157, 27, 16, 252, 104, 252, 120, 27, 16, 245, - 222, 252, 120, 27, 16, 252, 104, 217, 78, 27, 16, 245, 222, 217, 78, 27, - 16, 252, 104, 220, 27, 27, 16, 245, 222, 220, 27, 27, 16, 252, 104, 226, - 27, 27, 16, 245, 222, 226, 27, 27, 16, 38, 255, 46, 27, 16, 38, 219, 118, - 27, 16, 38, 217, 204, 27, 16, 38, 219, 119, 27, 16, 38, 232, 40, 27, 16, - 38, 232, 39, 27, 16, 38, 255, 45, 27, 16, 38, 232, 241, 27, 16, 254, 40, - 215, 140, 27, 16, 254, 40, 246, 181, 27, 16, 38, 247, 210, 27, 16, 38, - 223, 162, 27, 16, 38, 244, 147, 27, 16, 38, 220, 23, 27, 16, 38, 252, 85, - 27, 16, 38, 52, 216, 245, 27, 16, 38, 216, 182, 216, 245, 27, 16, 223, - 166, 27, 16, 219, 34, 27, 16, 212, 152, 27, 16, 226, 19, 27, 16, 231, - 162, 27, 16, 244, 106, 27, 16, 249, 201, 27, 16, 248, 150, 27, 16, 242, - 246, 228, 202, 220, 42, 27, 16, 242, 246, 228, 202, 228, 229, 220, 42, - 27, 16, 216, 226, 27, 16, 216, 67, 27, 16, 236, 52, 216, 67, 27, 16, 216, - 68, 220, 42, 27, 16, 216, 68, 215, 140, 27, 16, 227, 53, 219, 58, 27, 16, - 227, 53, 219, 55, 27, 16, 227, 53, 219, 54, 27, 16, 227, 53, 219, 53, 27, - 16, 227, 53, 219, 52, 27, 16, 227, 53, 219, 51, 27, 16, 227, 53, 219, 50, - 27, 16, 227, 53, 219, 49, 27, 16, 227, 53, 219, 48, 27, 16, 227, 53, 219, - 57, 27, 16, 227, 53, 219, 56, 27, 16, 242, 92, 27, 16, 229, 253, 27, 16, - 245, 222, 68, 219, 87, 27, 16, 248, 143, 220, 42, 27, 16, 38, 121, 251, - 220, 27, 16, 38, 116, 251, 220, 27, 16, 38, 242, 103, 27, 16, 38, 220, - 14, 225, 211, 27, 16, 226, 127, 79, 27, 16, 226, 127, 116, 79, 27, 16, - 157, 226, 127, 79, 27, 16, 243, 22, 215, 140, 27, 16, 243, 22, 246, 181, - 27, 16, 2, 244, 189, 27, 16, 248, 247, 27, 16, 248, 248, 254, 190, 27, - 16, 232, 11, 27, 16, 233, 0, 27, 16, 251, 196, 27, 16, 221, 97, 213, 241, - 27, 16, 221, 97, 252, 13, 27, 16, 231, 67, 27, 16, 231, 68, 252, 13, 27, - 16, 221, 91, 213, 241, 27, 16, 221, 91, 252, 13, 27, 16, 244, 56, 213, - 241, 27, 16, 244, 56, 252, 13, 27, 16, 233, 1, 226, 91, 223, 247, 27, 16, - 233, 1, 236, 117, 223, 247, 27, 16, 251, 197, 223, 247, 27, 16, 221, 97, - 223, 247, 27, 16, 231, 68, 223, 247, 27, 16, 221, 91, 223, 247, 27, 16, - 217, 215, 226, 89, 249, 171, 225, 94, 226, 90, 27, 16, 217, 215, 226, 89, - 249, 171, 225, 94, 236, 116, 27, 16, 217, 215, 226, 89, 249, 171, 225, - 94, 226, 91, 248, 28, 27, 16, 217, 215, 236, 115, 249, 171, 225, 94, 226, - 90, 27, 16, 217, 215, 236, 115, 249, 171, 225, 94, 236, 116, 27, 16, 217, - 215, 236, 115, 249, 171, 225, 94, 236, 117, 248, 28, 27, 16, 217, 215, - 236, 115, 249, 171, 225, 94, 236, 117, 248, 27, 27, 16, 217, 215, 236, - 115, 249, 171, 225, 94, 236, 117, 248, 26, 27, 16, 249, 196, 27, 16, 242, - 224, 251, 122, 250, 74, 27, 16, 242, 224, 245, 96, 250, 74, 27, 16, 42, - 253, 201, 27, 16, 214, 136, 27, 16, 225, 184, 27, 16, 250, 65, 27, 16, - 222, 144, 27, 16, 250, 69, 27, 16, 216, 233, 27, 16, 225, 158, 27, 16, - 225, 159, 244, 149, 27, 16, 222, 145, 244, 149, 27, 16, 216, 234, 223, - 244, 27, 16, 226, 75, 219, 25, 25, 214, 122, 179, 218, 188, 25, 214, 122, - 179, 218, 177, 25, 214, 122, 179, 218, 167, 25, 214, 122, 179, 218, 160, - 25, 214, 122, 179, 218, 152, 25, 214, 122, 179, 218, 146, 25, 214, 122, - 179, 218, 145, 25, 214, 122, 179, 218, 144, 25, 214, 122, 179, 218, 143, - 25, 214, 122, 179, 218, 187, 25, 214, 122, 179, 218, 186, 25, 214, 122, - 179, 218, 185, 25, 214, 122, 179, 218, 184, 25, 214, 122, 179, 218, 183, - 25, 214, 122, 179, 218, 182, 25, 214, 122, 179, 218, 181, 25, 214, 122, - 179, 218, 180, 25, 214, 122, 179, 218, 179, 25, 214, 122, 179, 218, 178, - 25, 214, 122, 179, 218, 176, 25, 214, 122, 179, 218, 175, 25, 214, 122, - 179, 218, 174, 25, 214, 122, 179, 218, 173, 25, 214, 122, 179, 218, 172, - 25, 214, 122, 179, 218, 151, 25, 214, 122, 179, 218, 150, 25, 214, 122, - 179, 218, 149, 25, 214, 122, 179, 218, 148, 25, 214, 122, 179, 218, 147, - 25, 236, 72, 179, 218, 188, 25, 236, 72, 179, 218, 177, 25, 236, 72, 179, - 218, 160, 25, 236, 72, 179, 218, 152, 25, 236, 72, 179, 218, 145, 25, - 236, 72, 179, 218, 144, 25, 236, 72, 179, 218, 186, 25, 236, 72, 179, - 218, 185, 25, 236, 72, 179, 218, 184, 25, 236, 72, 179, 218, 183, 25, - 236, 72, 179, 218, 180, 25, 236, 72, 179, 218, 179, 25, 236, 72, 179, - 218, 178, 25, 236, 72, 179, 218, 173, 25, 236, 72, 179, 218, 172, 25, - 236, 72, 179, 218, 171, 25, 236, 72, 179, 218, 170, 25, 236, 72, 179, - 218, 169, 25, 236, 72, 179, 218, 168, 25, 236, 72, 179, 218, 166, 25, - 236, 72, 179, 218, 165, 25, 236, 72, 179, 218, 164, 25, 236, 72, 179, - 218, 163, 25, 236, 72, 179, 218, 162, 25, 236, 72, 179, 218, 161, 25, - 236, 72, 179, 218, 159, 25, 236, 72, 179, 218, 158, 25, 236, 72, 179, - 218, 157, 25, 236, 72, 179, 218, 156, 25, 236, 72, 179, 218, 155, 25, - 236, 72, 179, 218, 154, 25, 236, 72, 179, 218, 153, 25, 236, 72, 179, - 218, 151, 25, 236, 72, 179, 218, 150, 25, 236, 72, 179, 218, 149, 25, - 236, 72, 179, 218, 148, 25, 236, 72, 179, 218, 147, 38, 25, 27, 216, 179, - 38, 25, 27, 217, 189, 38, 25, 27, 226, 99, 25, 27, 233, 153, 231, 26, 31, - 246, 44, 248, 41, 31, 242, 69, 246, 44, 248, 41, 31, 241, 66, 246, 44, - 248, 41, 31, 246, 43, 242, 70, 248, 41, 31, 246, 43, 241, 65, 248, 41, - 31, 246, 44, 174, 31, 250, 231, 174, 31, 244, 64, 250, 95, 174, 31, 231, - 60, 174, 31, 252, 176, 174, 31, 235, 41, 220, 26, 174, 31, 249, 241, 174, - 31, 254, 19, 174, 31, 227, 67, 174, 31, 251, 205, 227, 36, 174, 31, 248, - 145, 171, 247, 252, 174, 31, 247, 249, 174, 31, 212, 214, 174, 31, 236, - 104, 174, 31, 226, 108, 174, 31, 224, 54, 174, 31, 249, 251, 174, 31, - 241, 165, 252, 228, 174, 31, 214, 46, 174, 31, 244, 128, 174, 31, 255, - 23, 174, 31, 224, 17, 174, 31, 223, 251, 174, 31, 246, 42, 174, 31, 235, - 170, 174, 31, 249, 246, 174, 31, 245, 221, 174, 31, 246, 128, 174, 31, - 250, 204, 174, 31, 248, 154, 174, 31, 23, 223, 250, 174, 31, 226, 243, - 174, 31, 233, 156, 174, 31, 250, 58, 174, 31, 234, 197, 174, 31, 243, - 182, 174, 31, 219, 66, 174, 31, 225, 52, 174, 31, 244, 63, 174, 31, 223, - 252, 174, 31, 233, 193, 171, 231, 41, 174, 31, 223, 248, 174, 31, 243, 8, - 217, 10, 231, 211, 174, 31, 245, 223, 174, 31, 219, 78, 174, 31, 242, - 226, 174, 31, 245, 215, 174, 31, 226, 145, 174, 31, 223, 156, 174, 31, - 244, 148, 174, 31, 214, 246, 171, 214, 31, 174, 31, 249, 255, 174, 31, - 231, 224, 174, 31, 245, 148, 174, 31, 215, 149, 174, 31, 248, 29, 174, - 31, 250, 60, 230, 250, 174, 31, 242, 208, 174, 31, 243, 183, 236, 112, - 174, 31, 232, 19, 174, 31, 255, 42, 174, 31, 245, 236, 174, 31, 246, 184, - 174, 31, 214, 29, 174, 31, 220, 97, 174, 31, 236, 80, 174, 31, 248, 114, - 174, 31, 248, 227, 174, 31, 248, 25, 174, 31, 245, 117, 174, 31, 221, 59, - 174, 31, 219, 82, 174, 31, 242, 105, 174, 31, 250, 17, 174, 31, 250, 55, - 174, 31, 245, 10, 174, 31, 254, 245, 174, 31, 250, 16, 174, 31, 227, 100, - 217, 162, 214, 224, 174, 31, 248, 49, 174, 31, 233, 245, 174, 31, 244, - 103, 249, 211, 223, 137, 215, 151, 21, 118, 249, 211, 223, 137, 215, 151, - 21, 112, 249, 211, 223, 137, 215, 151, 21, 170, 249, 211, 223, 137, 215, - 151, 21, 167, 249, 211, 223, 137, 215, 151, 21, 185, 249, 211, 223, 137, - 215, 151, 21, 192, 249, 211, 223, 137, 215, 151, 21, 200, 249, 211, 223, - 137, 215, 151, 21, 198, 249, 211, 223, 137, 215, 151, 21, 203, 249, 211, - 223, 137, 217, 209, 21, 118, 249, 211, 223, 137, 217, 209, 21, 112, 249, - 211, 223, 137, 217, 209, 21, 170, 249, 211, 223, 137, 217, 209, 21, 167, - 249, 211, 223, 137, 217, 209, 21, 185, 249, 211, 223, 137, 217, 209, 21, - 192, 249, 211, 223, 137, 217, 209, 21, 200, 249, 211, 223, 137, 217, 209, - 21, 198, 249, 211, 223, 137, 217, 209, 21, 203, 14, 23, 6, 63, 14, 23, 6, - 253, 201, 14, 23, 6, 251, 121, 14, 23, 6, 249, 125, 14, 23, 6, 77, 14, - 23, 6, 245, 95, 14, 23, 6, 244, 41, 14, 23, 6, 242, 162, 14, 23, 6, 75, - 14, 23, 6, 236, 3, 14, 23, 6, 235, 141, 14, 23, 6, 155, 14, 23, 6, 184, - 14, 23, 6, 206, 14, 23, 6, 78, 14, 23, 6, 227, 11, 14, 23, 6, 225, 19, - 14, 23, 6, 152, 14, 23, 6, 196, 14, 23, 6, 218, 113, 14, 23, 6, 72, 14, - 23, 6, 211, 211, 14, 23, 6, 214, 85, 14, 23, 6, 213, 169, 14, 23, 6, 213, - 108, 14, 23, 6, 212, 152, 14, 23, 4, 63, 14, 23, 4, 253, 201, 14, 23, 4, - 251, 121, 14, 23, 4, 249, 125, 14, 23, 4, 77, 14, 23, 4, 245, 95, 14, 23, - 4, 244, 41, 14, 23, 4, 242, 162, 14, 23, 4, 75, 14, 23, 4, 236, 3, 14, - 23, 4, 235, 141, 14, 23, 4, 155, 14, 23, 4, 184, 14, 23, 4, 206, 14, 23, - 4, 78, 14, 23, 4, 227, 11, 14, 23, 4, 225, 19, 14, 23, 4, 152, 14, 23, 4, - 196, 14, 23, 4, 218, 113, 14, 23, 4, 72, 14, 23, 4, 211, 211, 14, 23, 4, - 214, 85, 14, 23, 4, 213, 169, 14, 23, 4, 213, 108, 14, 23, 4, 212, 152, - 14, 32, 6, 63, 14, 32, 6, 253, 201, 14, 32, 6, 251, 121, 14, 32, 6, 249, - 125, 14, 32, 6, 77, 14, 32, 6, 245, 95, 14, 32, 6, 244, 41, 14, 32, 6, - 242, 162, 14, 32, 6, 75, 14, 32, 6, 236, 3, 14, 32, 6, 235, 141, 14, 32, - 6, 155, 14, 32, 6, 184, 14, 32, 6, 206, 14, 32, 6, 78, 14, 32, 6, 227, - 11, 14, 32, 6, 225, 19, 14, 32, 6, 152, 14, 32, 6, 196, 14, 32, 6, 218, - 113, 14, 32, 6, 72, 14, 32, 6, 211, 211, 14, 32, 6, 214, 85, 14, 32, 6, - 213, 169, 14, 32, 6, 213, 108, 14, 32, 6, 212, 152, 14, 32, 4, 63, 14, - 32, 4, 253, 201, 14, 32, 4, 251, 121, 14, 32, 4, 249, 125, 14, 32, 4, 77, - 14, 32, 4, 245, 95, 14, 32, 4, 244, 41, 14, 32, 4, 75, 14, 32, 4, 236, 3, - 14, 32, 4, 235, 141, 14, 32, 4, 155, 14, 32, 4, 184, 14, 32, 4, 206, 14, - 32, 4, 78, 14, 32, 4, 227, 11, 14, 32, 4, 225, 19, 14, 32, 4, 152, 14, - 32, 4, 196, 14, 32, 4, 218, 113, 14, 32, 4, 72, 14, 32, 4, 211, 211, 14, - 32, 4, 214, 85, 14, 32, 4, 213, 169, 14, 32, 4, 213, 108, 14, 32, 4, 212, - 152, 14, 23, 32, 6, 63, 14, 23, 32, 6, 253, 201, 14, 23, 32, 6, 251, 121, - 14, 23, 32, 6, 249, 125, 14, 23, 32, 6, 77, 14, 23, 32, 6, 245, 95, 14, - 23, 32, 6, 244, 41, 14, 23, 32, 6, 242, 162, 14, 23, 32, 6, 75, 14, 23, - 32, 6, 236, 3, 14, 23, 32, 6, 235, 141, 14, 23, 32, 6, 155, 14, 23, 32, - 6, 184, 14, 23, 32, 6, 206, 14, 23, 32, 6, 78, 14, 23, 32, 6, 227, 11, - 14, 23, 32, 6, 225, 19, 14, 23, 32, 6, 152, 14, 23, 32, 6, 196, 14, 23, - 32, 6, 218, 113, 14, 23, 32, 6, 72, 14, 23, 32, 6, 211, 211, 14, 23, 32, - 6, 214, 85, 14, 23, 32, 6, 213, 169, 14, 23, 32, 6, 213, 108, 14, 23, 32, - 6, 212, 152, 14, 23, 32, 4, 63, 14, 23, 32, 4, 253, 201, 14, 23, 32, 4, - 251, 121, 14, 23, 32, 4, 249, 125, 14, 23, 32, 4, 77, 14, 23, 32, 4, 245, - 95, 14, 23, 32, 4, 244, 41, 14, 23, 32, 4, 242, 162, 14, 23, 32, 4, 75, - 14, 23, 32, 4, 236, 3, 14, 23, 32, 4, 235, 141, 14, 23, 32, 4, 155, 14, - 23, 32, 4, 184, 14, 23, 32, 4, 206, 14, 23, 32, 4, 78, 14, 23, 32, 4, - 227, 11, 14, 23, 32, 4, 225, 19, 14, 23, 32, 4, 152, 14, 23, 32, 4, 196, - 14, 23, 32, 4, 218, 113, 14, 23, 32, 4, 72, 14, 23, 32, 4, 211, 211, 14, - 23, 32, 4, 214, 85, 14, 23, 32, 4, 213, 169, 14, 23, 32, 4, 213, 108, 14, - 23, 32, 4, 212, 152, 14, 115, 6, 63, 14, 115, 6, 251, 121, 14, 115, 6, - 249, 125, 14, 115, 6, 244, 41, 14, 115, 6, 236, 3, 14, 115, 6, 235, 141, - 14, 115, 6, 206, 14, 115, 6, 78, 14, 115, 6, 227, 11, 14, 115, 6, 225, - 19, 14, 115, 6, 196, 14, 115, 6, 218, 113, 14, 115, 6, 72, 14, 115, 6, - 211, 211, 14, 115, 6, 214, 85, 14, 115, 6, 213, 169, 14, 115, 6, 213, - 108, 14, 115, 6, 212, 152, 14, 115, 4, 63, 14, 115, 4, 253, 201, 14, 115, - 4, 251, 121, 14, 115, 4, 249, 125, 14, 115, 4, 245, 95, 14, 115, 4, 242, - 162, 14, 115, 4, 75, 14, 115, 4, 236, 3, 14, 115, 4, 235, 141, 14, 115, - 4, 155, 14, 115, 4, 184, 14, 115, 4, 206, 14, 115, 4, 227, 11, 14, 115, - 4, 225, 19, 14, 115, 4, 152, 14, 115, 4, 196, 14, 115, 4, 218, 113, 14, - 115, 4, 72, 14, 115, 4, 211, 211, 14, 115, 4, 214, 85, 14, 115, 4, 213, - 169, 14, 115, 4, 213, 108, 14, 115, 4, 212, 152, 14, 23, 115, 6, 63, 14, - 23, 115, 6, 253, 201, 14, 23, 115, 6, 251, 121, 14, 23, 115, 6, 249, 125, - 14, 23, 115, 6, 77, 14, 23, 115, 6, 245, 95, 14, 23, 115, 6, 244, 41, 14, - 23, 115, 6, 242, 162, 14, 23, 115, 6, 75, 14, 23, 115, 6, 236, 3, 14, 23, - 115, 6, 235, 141, 14, 23, 115, 6, 155, 14, 23, 115, 6, 184, 14, 23, 115, - 6, 206, 14, 23, 115, 6, 78, 14, 23, 115, 6, 227, 11, 14, 23, 115, 6, 225, - 19, 14, 23, 115, 6, 152, 14, 23, 115, 6, 196, 14, 23, 115, 6, 218, 113, - 14, 23, 115, 6, 72, 14, 23, 115, 6, 211, 211, 14, 23, 115, 6, 214, 85, - 14, 23, 115, 6, 213, 169, 14, 23, 115, 6, 213, 108, 14, 23, 115, 6, 212, - 152, 14, 23, 115, 4, 63, 14, 23, 115, 4, 253, 201, 14, 23, 115, 4, 251, - 121, 14, 23, 115, 4, 249, 125, 14, 23, 115, 4, 77, 14, 23, 115, 4, 245, - 95, 14, 23, 115, 4, 244, 41, 14, 23, 115, 4, 242, 162, 14, 23, 115, 4, - 75, 14, 23, 115, 4, 236, 3, 14, 23, 115, 4, 235, 141, 14, 23, 115, 4, - 155, 14, 23, 115, 4, 184, 14, 23, 115, 4, 206, 14, 23, 115, 4, 78, 14, - 23, 115, 4, 227, 11, 14, 23, 115, 4, 225, 19, 14, 23, 115, 4, 152, 14, - 23, 115, 4, 196, 14, 23, 115, 4, 218, 113, 14, 23, 115, 4, 72, 14, 23, - 115, 4, 211, 211, 14, 23, 115, 4, 214, 85, 14, 23, 115, 4, 213, 169, 14, - 23, 115, 4, 213, 108, 14, 23, 115, 4, 212, 152, 14, 131, 6, 63, 14, 131, - 6, 253, 201, 14, 131, 6, 249, 125, 14, 131, 6, 77, 14, 131, 6, 245, 95, - 14, 131, 6, 244, 41, 14, 131, 6, 236, 3, 14, 131, 6, 235, 141, 14, 131, - 6, 155, 14, 131, 6, 184, 14, 131, 6, 206, 14, 131, 6, 78, 14, 131, 6, - 227, 11, 14, 131, 6, 225, 19, 14, 131, 6, 196, 14, 131, 6, 218, 113, 14, - 131, 6, 72, 14, 131, 6, 211, 211, 14, 131, 6, 214, 85, 14, 131, 6, 213, - 169, 14, 131, 6, 213, 108, 14, 131, 4, 63, 14, 131, 4, 253, 201, 14, 131, - 4, 251, 121, 14, 131, 4, 249, 125, 14, 131, 4, 77, 14, 131, 4, 245, 95, - 14, 131, 4, 244, 41, 14, 131, 4, 242, 162, 14, 131, 4, 75, 14, 131, 4, - 236, 3, 14, 131, 4, 235, 141, 14, 131, 4, 155, 14, 131, 4, 184, 14, 131, - 4, 206, 14, 131, 4, 78, 14, 131, 4, 227, 11, 14, 131, 4, 225, 19, 14, - 131, 4, 152, 14, 131, 4, 196, 14, 131, 4, 218, 113, 14, 131, 4, 72, 14, - 131, 4, 211, 211, 14, 131, 4, 214, 85, 14, 131, 4, 213, 169, 14, 131, 4, - 213, 108, 14, 131, 4, 212, 152, 14, 190, 6, 63, 14, 190, 6, 253, 201, 14, - 190, 6, 249, 125, 14, 190, 6, 77, 14, 190, 6, 245, 95, 14, 190, 6, 244, - 41, 14, 190, 6, 75, 14, 190, 6, 236, 3, 14, 190, 6, 235, 141, 14, 190, 6, - 155, 14, 190, 6, 184, 14, 190, 6, 78, 14, 190, 6, 196, 14, 190, 6, 218, - 113, 14, 190, 6, 72, 14, 190, 6, 211, 211, 14, 190, 6, 214, 85, 14, 190, - 6, 213, 169, 14, 190, 6, 213, 108, 14, 190, 4, 63, 14, 190, 4, 253, 201, - 14, 190, 4, 251, 121, 14, 190, 4, 249, 125, 14, 190, 4, 77, 14, 190, 4, - 245, 95, 14, 190, 4, 244, 41, 14, 190, 4, 242, 162, 14, 190, 4, 75, 14, - 190, 4, 236, 3, 14, 190, 4, 235, 141, 14, 190, 4, 155, 14, 190, 4, 184, - 14, 190, 4, 206, 14, 190, 4, 78, 14, 190, 4, 227, 11, 14, 190, 4, 225, - 19, 14, 190, 4, 152, 14, 190, 4, 196, 14, 190, 4, 218, 113, 14, 190, 4, - 72, 14, 190, 4, 211, 211, 14, 190, 4, 214, 85, 14, 190, 4, 213, 169, 14, - 190, 4, 213, 108, 14, 190, 4, 212, 152, 14, 23, 131, 6, 63, 14, 23, 131, - 6, 253, 201, 14, 23, 131, 6, 251, 121, 14, 23, 131, 6, 249, 125, 14, 23, - 131, 6, 77, 14, 23, 131, 6, 245, 95, 14, 23, 131, 6, 244, 41, 14, 23, - 131, 6, 242, 162, 14, 23, 131, 6, 75, 14, 23, 131, 6, 236, 3, 14, 23, - 131, 6, 235, 141, 14, 23, 131, 6, 155, 14, 23, 131, 6, 184, 14, 23, 131, - 6, 206, 14, 23, 131, 6, 78, 14, 23, 131, 6, 227, 11, 14, 23, 131, 6, 225, - 19, 14, 23, 131, 6, 152, 14, 23, 131, 6, 196, 14, 23, 131, 6, 218, 113, - 14, 23, 131, 6, 72, 14, 23, 131, 6, 211, 211, 14, 23, 131, 6, 214, 85, - 14, 23, 131, 6, 213, 169, 14, 23, 131, 6, 213, 108, 14, 23, 131, 6, 212, - 152, 14, 23, 131, 4, 63, 14, 23, 131, 4, 253, 201, 14, 23, 131, 4, 251, - 121, 14, 23, 131, 4, 249, 125, 14, 23, 131, 4, 77, 14, 23, 131, 4, 245, - 95, 14, 23, 131, 4, 244, 41, 14, 23, 131, 4, 242, 162, 14, 23, 131, 4, - 75, 14, 23, 131, 4, 236, 3, 14, 23, 131, 4, 235, 141, 14, 23, 131, 4, - 155, 14, 23, 131, 4, 184, 14, 23, 131, 4, 206, 14, 23, 131, 4, 78, 14, - 23, 131, 4, 227, 11, 14, 23, 131, 4, 225, 19, 14, 23, 131, 4, 152, 14, - 23, 131, 4, 196, 14, 23, 131, 4, 218, 113, 14, 23, 131, 4, 72, 14, 23, - 131, 4, 211, 211, 14, 23, 131, 4, 214, 85, 14, 23, 131, 4, 213, 169, 14, - 23, 131, 4, 213, 108, 14, 23, 131, 4, 212, 152, 14, 35, 6, 63, 14, 35, 6, - 253, 201, 14, 35, 6, 251, 121, 14, 35, 6, 249, 125, 14, 35, 6, 77, 14, - 35, 6, 245, 95, 14, 35, 6, 244, 41, 14, 35, 6, 242, 162, 14, 35, 6, 75, - 14, 35, 6, 236, 3, 14, 35, 6, 235, 141, 14, 35, 6, 155, 14, 35, 6, 184, - 14, 35, 6, 206, 14, 35, 6, 78, 14, 35, 6, 227, 11, 14, 35, 6, 225, 19, - 14, 35, 6, 152, 14, 35, 6, 196, 14, 35, 6, 218, 113, 14, 35, 6, 72, 14, - 35, 6, 211, 211, 14, 35, 6, 214, 85, 14, 35, 6, 213, 169, 14, 35, 6, 213, - 108, 14, 35, 6, 212, 152, 14, 35, 4, 63, 14, 35, 4, 253, 201, 14, 35, 4, - 251, 121, 14, 35, 4, 249, 125, 14, 35, 4, 77, 14, 35, 4, 245, 95, 14, 35, - 4, 244, 41, 14, 35, 4, 242, 162, 14, 35, 4, 75, 14, 35, 4, 236, 3, 14, - 35, 4, 235, 141, 14, 35, 4, 155, 14, 35, 4, 184, 14, 35, 4, 206, 14, 35, - 4, 78, 14, 35, 4, 227, 11, 14, 35, 4, 225, 19, 14, 35, 4, 152, 14, 35, 4, - 196, 14, 35, 4, 218, 113, 14, 35, 4, 72, 14, 35, 4, 211, 211, 14, 35, 4, - 214, 85, 14, 35, 4, 213, 169, 14, 35, 4, 213, 108, 14, 35, 4, 212, 152, - 14, 35, 23, 6, 63, 14, 35, 23, 6, 253, 201, 14, 35, 23, 6, 251, 121, 14, - 35, 23, 6, 249, 125, 14, 35, 23, 6, 77, 14, 35, 23, 6, 245, 95, 14, 35, - 23, 6, 244, 41, 14, 35, 23, 6, 242, 162, 14, 35, 23, 6, 75, 14, 35, 23, - 6, 236, 3, 14, 35, 23, 6, 235, 141, 14, 35, 23, 6, 155, 14, 35, 23, 6, - 184, 14, 35, 23, 6, 206, 14, 35, 23, 6, 78, 14, 35, 23, 6, 227, 11, 14, - 35, 23, 6, 225, 19, 14, 35, 23, 6, 152, 14, 35, 23, 6, 196, 14, 35, 23, - 6, 218, 113, 14, 35, 23, 6, 72, 14, 35, 23, 6, 211, 211, 14, 35, 23, 6, - 214, 85, 14, 35, 23, 6, 213, 169, 14, 35, 23, 6, 213, 108, 14, 35, 23, 6, - 212, 152, 14, 35, 23, 4, 63, 14, 35, 23, 4, 253, 201, 14, 35, 23, 4, 251, - 121, 14, 35, 23, 4, 249, 125, 14, 35, 23, 4, 77, 14, 35, 23, 4, 245, 95, - 14, 35, 23, 4, 244, 41, 14, 35, 23, 4, 242, 162, 14, 35, 23, 4, 75, 14, - 35, 23, 4, 236, 3, 14, 35, 23, 4, 235, 141, 14, 35, 23, 4, 155, 14, 35, - 23, 4, 184, 14, 35, 23, 4, 206, 14, 35, 23, 4, 78, 14, 35, 23, 4, 227, - 11, 14, 35, 23, 4, 225, 19, 14, 35, 23, 4, 152, 14, 35, 23, 4, 196, 14, - 35, 23, 4, 218, 113, 14, 35, 23, 4, 72, 14, 35, 23, 4, 211, 211, 14, 35, - 23, 4, 214, 85, 14, 35, 23, 4, 213, 169, 14, 35, 23, 4, 213, 108, 14, 35, - 23, 4, 212, 152, 14, 35, 32, 6, 63, 14, 35, 32, 6, 253, 201, 14, 35, 32, - 6, 251, 121, 14, 35, 32, 6, 249, 125, 14, 35, 32, 6, 77, 14, 35, 32, 6, - 245, 95, 14, 35, 32, 6, 244, 41, 14, 35, 32, 6, 242, 162, 14, 35, 32, 6, - 75, 14, 35, 32, 6, 236, 3, 14, 35, 32, 6, 235, 141, 14, 35, 32, 6, 155, - 14, 35, 32, 6, 184, 14, 35, 32, 6, 206, 14, 35, 32, 6, 78, 14, 35, 32, 6, - 227, 11, 14, 35, 32, 6, 225, 19, 14, 35, 32, 6, 152, 14, 35, 32, 6, 196, - 14, 35, 32, 6, 218, 113, 14, 35, 32, 6, 72, 14, 35, 32, 6, 211, 211, 14, - 35, 32, 6, 214, 85, 14, 35, 32, 6, 213, 169, 14, 35, 32, 6, 213, 108, 14, - 35, 32, 6, 212, 152, 14, 35, 32, 4, 63, 14, 35, 32, 4, 253, 201, 14, 35, - 32, 4, 251, 121, 14, 35, 32, 4, 249, 125, 14, 35, 32, 4, 77, 14, 35, 32, - 4, 245, 95, 14, 35, 32, 4, 244, 41, 14, 35, 32, 4, 242, 162, 14, 35, 32, - 4, 75, 14, 35, 32, 4, 236, 3, 14, 35, 32, 4, 235, 141, 14, 35, 32, 4, - 155, 14, 35, 32, 4, 184, 14, 35, 32, 4, 206, 14, 35, 32, 4, 78, 14, 35, - 32, 4, 227, 11, 14, 35, 32, 4, 225, 19, 14, 35, 32, 4, 152, 14, 35, 32, - 4, 196, 14, 35, 32, 4, 218, 113, 14, 35, 32, 4, 72, 14, 35, 32, 4, 211, - 211, 14, 35, 32, 4, 214, 85, 14, 35, 32, 4, 213, 169, 14, 35, 32, 4, 213, - 108, 14, 35, 32, 4, 212, 152, 14, 35, 23, 32, 6, 63, 14, 35, 23, 32, 6, - 253, 201, 14, 35, 23, 32, 6, 251, 121, 14, 35, 23, 32, 6, 249, 125, 14, - 35, 23, 32, 6, 77, 14, 35, 23, 32, 6, 245, 95, 14, 35, 23, 32, 6, 244, - 41, 14, 35, 23, 32, 6, 242, 162, 14, 35, 23, 32, 6, 75, 14, 35, 23, 32, - 6, 236, 3, 14, 35, 23, 32, 6, 235, 141, 14, 35, 23, 32, 6, 155, 14, 35, - 23, 32, 6, 184, 14, 35, 23, 32, 6, 206, 14, 35, 23, 32, 6, 78, 14, 35, - 23, 32, 6, 227, 11, 14, 35, 23, 32, 6, 225, 19, 14, 35, 23, 32, 6, 152, - 14, 35, 23, 32, 6, 196, 14, 35, 23, 32, 6, 218, 113, 14, 35, 23, 32, 6, - 72, 14, 35, 23, 32, 6, 211, 211, 14, 35, 23, 32, 6, 214, 85, 14, 35, 23, - 32, 6, 213, 169, 14, 35, 23, 32, 6, 213, 108, 14, 35, 23, 32, 6, 212, - 152, 14, 35, 23, 32, 4, 63, 14, 35, 23, 32, 4, 253, 201, 14, 35, 23, 32, - 4, 251, 121, 14, 35, 23, 32, 4, 249, 125, 14, 35, 23, 32, 4, 77, 14, 35, - 23, 32, 4, 245, 95, 14, 35, 23, 32, 4, 244, 41, 14, 35, 23, 32, 4, 242, - 162, 14, 35, 23, 32, 4, 75, 14, 35, 23, 32, 4, 236, 3, 14, 35, 23, 32, 4, - 235, 141, 14, 35, 23, 32, 4, 155, 14, 35, 23, 32, 4, 184, 14, 35, 23, 32, - 4, 206, 14, 35, 23, 32, 4, 78, 14, 35, 23, 32, 4, 227, 11, 14, 35, 23, - 32, 4, 225, 19, 14, 35, 23, 32, 4, 152, 14, 35, 23, 32, 4, 196, 14, 35, - 23, 32, 4, 218, 113, 14, 35, 23, 32, 4, 72, 14, 35, 23, 32, 4, 211, 211, - 14, 35, 23, 32, 4, 214, 85, 14, 35, 23, 32, 4, 213, 169, 14, 35, 23, 32, - 4, 213, 108, 14, 35, 23, 32, 4, 212, 152, 14, 231, 22, 6, 63, 14, 231, - 22, 6, 253, 201, 14, 231, 22, 6, 251, 121, 14, 231, 22, 6, 249, 125, 14, - 231, 22, 6, 77, 14, 231, 22, 6, 245, 95, 14, 231, 22, 6, 244, 41, 14, - 231, 22, 6, 242, 162, 14, 231, 22, 6, 75, 14, 231, 22, 6, 236, 3, 14, - 231, 22, 6, 235, 141, 14, 231, 22, 6, 155, 14, 231, 22, 6, 184, 14, 231, - 22, 6, 206, 14, 231, 22, 6, 78, 14, 231, 22, 6, 227, 11, 14, 231, 22, 6, - 225, 19, 14, 231, 22, 6, 152, 14, 231, 22, 6, 196, 14, 231, 22, 6, 218, - 113, 14, 231, 22, 6, 72, 14, 231, 22, 6, 211, 211, 14, 231, 22, 6, 214, - 85, 14, 231, 22, 6, 213, 169, 14, 231, 22, 6, 213, 108, 14, 231, 22, 6, - 212, 152, 14, 231, 22, 4, 63, 14, 231, 22, 4, 253, 201, 14, 231, 22, 4, - 251, 121, 14, 231, 22, 4, 249, 125, 14, 231, 22, 4, 77, 14, 231, 22, 4, - 245, 95, 14, 231, 22, 4, 244, 41, 14, 231, 22, 4, 242, 162, 14, 231, 22, - 4, 75, 14, 231, 22, 4, 236, 3, 14, 231, 22, 4, 235, 141, 14, 231, 22, 4, - 155, 14, 231, 22, 4, 184, 14, 231, 22, 4, 206, 14, 231, 22, 4, 78, 14, - 231, 22, 4, 227, 11, 14, 231, 22, 4, 225, 19, 14, 231, 22, 4, 152, 14, - 231, 22, 4, 196, 14, 231, 22, 4, 218, 113, 14, 231, 22, 4, 72, 14, 231, - 22, 4, 211, 211, 14, 231, 22, 4, 214, 85, 14, 231, 22, 4, 213, 169, 14, - 231, 22, 4, 213, 108, 14, 231, 22, 4, 212, 152, 14, 32, 4, 247, 194, 75, - 14, 32, 4, 247, 194, 236, 3, 14, 23, 6, 254, 179, 14, 23, 6, 252, 73, 14, - 23, 6, 243, 203, 14, 23, 6, 248, 126, 14, 23, 6, 245, 184, 14, 23, 6, - 212, 78, 14, 23, 6, 245, 149, 14, 23, 6, 217, 145, 14, 23, 6, 236, 44, - 14, 23, 6, 235, 84, 14, 23, 6, 233, 220, 14, 23, 6, 230, 242, 14, 23, 6, - 228, 135, 14, 23, 6, 213, 148, 14, 23, 6, 227, 102, 14, 23, 6, 226, 20, - 14, 23, 6, 223, 224, 14, 23, 6, 217, 146, 88, 14, 23, 6, 220, 122, 14, - 23, 6, 218, 5, 14, 23, 6, 215, 134, 14, 23, 6, 226, 45, 14, 23, 6, 250, - 170, 14, 23, 6, 225, 82, 14, 23, 6, 227, 104, 14, 23, 230, 108, 14, 23, - 4, 254, 179, 14, 23, 4, 252, 73, 14, 23, 4, 243, 203, 14, 23, 4, 248, - 126, 14, 23, 4, 245, 184, 14, 23, 4, 212, 78, 14, 23, 4, 245, 149, 14, - 23, 4, 217, 145, 14, 23, 4, 236, 44, 14, 23, 4, 235, 84, 14, 23, 4, 233, - 220, 14, 23, 4, 230, 242, 14, 23, 4, 228, 135, 14, 23, 4, 213, 148, 14, - 23, 4, 227, 102, 14, 23, 4, 226, 20, 14, 23, 4, 223, 224, 14, 23, 4, 41, - 220, 122, 14, 23, 4, 220, 122, 14, 23, 4, 218, 5, 14, 23, 4, 215, 134, - 14, 23, 4, 226, 45, 14, 23, 4, 250, 170, 14, 23, 4, 225, 82, 14, 23, 4, - 227, 104, 14, 23, 226, 162, 248, 50, 14, 23, 245, 185, 88, 14, 23, 217, - 146, 88, 14, 23, 235, 85, 88, 14, 23, 226, 46, 88, 14, 23, 223, 225, 88, - 14, 23, 226, 21, 88, 14, 32, 6, 254, 179, 14, 32, 6, 252, 73, 14, 32, 6, - 243, 203, 14, 32, 6, 248, 126, 14, 32, 6, 245, 184, 14, 32, 6, 212, 78, - 14, 32, 6, 245, 149, 14, 32, 6, 217, 145, 14, 32, 6, 236, 44, 14, 32, 6, - 235, 84, 14, 32, 6, 233, 220, 14, 32, 6, 230, 242, 14, 32, 6, 228, 135, - 14, 32, 6, 213, 148, 14, 32, 6, 227, 102, 14, 32, 6, 226, 20, 14, 32, 6, - 223, 224, 14, 32, 6, 217, 146, 88, 14, 32, 6, 220, 122, 14, 32, 6, 218, - 5, 14, 32, 6, 215, 134, 14, 32, 6, 226, 45, 14, 32, 6, 250, 170, 14, 32, - 6, 225, 82, 14, 32, 6, 227, 104, 14, 32, 230, 108, 14, 32, 4, 254, 179, - 14, 32, 4, 252, 73, 14, 32, 4, 243, 203, 14, 32, 4, 248, 126, 14, 32, 4, - 245, 184, 14, 32, 4, 212, 78, 14, 32, 4, 245, 149, 14, 32, 4, 217, 145, - 14, 32, 4, 236, 44, 14, 32, 4, 235, 84, 14, 32, 4, 233, 220, 14, 32, 4, - 230, 242, 14, 32, 4, 228, 135, 14, 32, 4, 213, 148, 14, 32, 4, 227, 102, - 14, 32, 4, 226, 20, 14, 32, 4, 223, 224, 14, 32, 4, 41, 220, 122, 14, 32, - 4, 220, 122, 14, 32, 4, 218, 5, 14, 32, 4, 215, 134, 14, 32, 4, 226, 45, - 14, 32, 4, 250, 170, 14, 32, 4, 225, 82, 14, 32, 4, 227, 104, 14, 32, - 226, 162, 248, 50, 14, 32, 245, 185, 88, 14, 32, 217, 146, 88, 14, 32, - 235, 85, 88, 14, 32, 226, 46, 88, 14, 32, 223, 225, 88, 14, 32, 226, 21, - 88, 14, 23, 32, 6, 254, 179, 14, 23, 32, 6, 252, 73, 14, 23, 32, 6, 243, - 203, 14, 23, 32, 6, 248, 126, 14, 23, 32, 6, 245, 184, 14, 23, 32, 6, - 212, 78, 14, 23, 32, 6, 245, 149, 14, 23, 32, 6, 217, 145, 14, 23, 32, 6, - 236, 44, 14, 23, 32, 6, 235, 84, 14, 23, 32, 6, 233, 220, 14, 23, 32, 6, - 230, 242, 14, 23, 32, 6, 228, 135, 14, 23, 32, 6, 213, 148, 14, 23, 32, - 6, 227, 102, 14, 23, 32, 6, 226, 20, 14, 23, 32, 6, 223, 224, 14, 23, 32, - 6, 217, 146, 88, 14, 23, 32, 6, 220, 122, 14, 23, 32, 6, 218, 5, 14, 23, - 32, 6, 215, 134, 14, 23, 32, 6, 226, 45, 14, 23, 32, 6, 250, 170, 14, 23, - 32, 6, 225, 82, 14, 23, 32, 6, 227, 104, 14, 23, 32, 230, 108, 14, 23, - 32, 4, 254, 179, 14, 23, 32, 4, 252, 73, 14, 23, 32, 4, 243, 203, 14, 23, - 32, 4, 248, 126, 14, 23, 32, 4, 245, 184, 14, 23, 32, 4, 212, 78, 14, 23, - 32, 4, 245, 149, 14, 23, 32, 4, 217, 145, 14, 23, 32, 4, 236, 44, 14, 23, - 32, 4, 235, 84, 14, 23, 32, 4, 233, 220, 14, 23, 32, 4, 230, 242, 14, 23, - 32, 4, 228, 135, 14, 23, 32, 4, 213, 148, 14, 23, 32, 4, 227, 102, 14, - 23, 32, 4, 226, 20, 14, 23, 32, 4, 223, 224, 14, 23, 32, 4, 41, 220, 122, - 14, 23, 32, 4, 220, 122, 14, 23, 32, 4, 218, 5, 14, 23, 32, 4, 215, 134, - 14, 23, 32, 4, 226, 45, 14, 23, 32, 4, 250, 170, 14, 23, 32, 4, 225, 82, - 14, 23, 32, 4, 227, 104, 14, 23, 32, 226, 162, 248, 50, 14, 23, 32, 245, - 185, 88, 14, 23, 32, 217, 146, 88, 14, 23, 32, 235, 85, 88, 14, 23, 32, - 226, 46, 88, 14, 23, 32, 223, 225, 88, 14, 23, 32, 226, 21, 88, 14, 35, - 23, 6, 254, 179, 14, 35, 23, 6, 252, 73, 14, 35, 23, 6, 243, 203, 14, 35, - 23, 6, 248, 126, 14, 35, 23, 6, 245, 184, 14, 35, 23, 6, 212, 78, 14, 35, - 23, 6, 245, 149, 14, 35, 23, 6, 217, 145, 14, 35, 23, 6, 236, 44, 14, 35, - 23, 6, 235, 84, 14, 35, 23, 6, 233, 220, 14, 35, 23, 6, 230, 242, 14, 35, - 23, 6, 228, 135, 14, 35, 23, 6, 213, 148, 14, 35, 23, 6, 227, 102, 14, - 35, 23, 6, 226, 20, 14, 35, 23, 6, 223, 224, 14, 35, 23, 6, 217, 146, 88, - 14, 35, 23, 6, 220, 122, 14, 35, 23, 6, 218, 5, 14, 35, 23, 6, 215, 134, - 14, 35, 23, 6, 226, 45, 14, 35, 23, 6, 250, 170, 14, 35, 23, 6, 225, 82, - 14, 35, 23, 6, 227, 104, 14, 35, 23, 230, 108, 14, 35, 23, 4, 254, 179, - 14, 35, 23, 4, 252, 73, 14, 35, 23, 4, 243, 203, 14, 35, 23, 4, 248, 126, - 14, 35, 23, 4, 245, 184, 14, 35, 23, 4, 212, 78, 14, 35, 23, 4, 245, 149, - 14, 35, 23, 4, 217, 145, 14, 35, 23, 4, 236, 44, 14, 35, 23, 4, 235, 84, - 14, 35, 23, 4, 233, 220, 14, 35, 23, 4, 230, 242, 14, 35, 23, 4, 228, - 135, 14, 35, 23, 4, 213, 148, 14, 35, 23, 4, 227, 102, 14, 35, 23, 4, - 226, 20, 14, 35, 23, 4, 223, 224, 14, 35, 23, 4, 41, 220, 122, 14, 35, - 23, 4, 220, 122, 14, 35, 23, 4, 218, 5, 14, 35, 23, 4, 215, 134, 14, 35, - 23, 4, 226, 45, 14, 35, 23, 4, 250, 170, 14, 35, 23, 4, 225, 82, 14, 35, - 23, 4, 227, 104, 14, 35, 23, 226, 162, 248, 50, 14, 35, 23, 245, 185, 88, - 14, 35, 23, 217, 146, 88, 14, 35, 23, 235, 85, 88, 14, 35, 23, 226, 46, - 88, 14, 35, 23, 223, 225, 88, 14, 35, 23, 226, 21, 88, 14, 35, 23, 32, 6, - 254, 179, 14, 35, 23, 32, 6, 252, 73, 14, 35, 23, 32, 6, 243, 203, 14, - 35, 23, 32, 6, 248, 126, 14, 35, 23, 32, 6, 245, 184, 14, 35, 23, 32, 6, - 212, 78, 14, 35, 23, 32, 6, 245, 149, 14, 35, 23, 32, 6, 217, 145, 14, - 35, 23, 32, 6, 236, 44, 14, 35, 23, 32, 6, 235, 84, 14, 35, 23, 32, 6, - 233, 220, 14, 35, 23, 32, 6, 230, 242, 14, 35, 23, 32, 6, 228, 135, 14, - 35, 23, 32, 6, 213, 148, 14, 35, 23, 32, 6, 227, 102, 14, 35, 23, 32, 6, - 226, 20, 14, 35, 23, 32, 6, 223, 224, 14, 35, 23, 32, 6, 217, 146, 88, - 14, 35, 23, 32, 6, 220, 122, 14, 35, 23, 32, 6, 218, 5, 14, 35, 23, 32, - 6, 215, 134, 14, 35, 23, 32, 6, 226, 45, 14, 35, 23, 32, 6, 250, 170, 14, - 35, 23, 32, 6, 225, 82, 14, 35, 23, 32, 6, 227, 104, 14, 35, 23, 32, 230, - 108, 14, 35, 23, 32, 4, 254, 179, 14, 35, 23, 32, 4, 252, 73, 14, 35, 23, - 32, 4, 243, 203, 14, 35, 23, 32, 4, 248, 126, 14, 35, 23, 32, 4, 245, - 184, 14, 35, 23, 32, 4, 212, 78, 14, 35, 23, 32, 4, 245, 149, 14, 35, 23, - 32, 4, 217, 145, 14, 35, 23, 32, 4, 236, 44, 14, 35, 23, 32, 4, 235, 84, - 14, 35, 23, 32, 4, 233, 220, 14, 35, 23, 32, 4, 230, 242, 14, 35, 23, 32, - 4, 228, 135, 14, 35, 23, 32, 4, 213, 148, 14, 35, 23, 32, 4, 227, 102, - 14, 35, 23, 32, 4, 226, 20, 14, 35, 23, 32, 4, 223, 224, 14, 35, 23, 32, - 4, 41, 220, 122, 14, 35, 23, 32, 4, 220, 122, 14, 35, 23, 32, 4, 218, 5, - 14, 35, 23, 32, 4, 215, 134, 14, 35, 23, 32, 4, 226, 45, 14, 35, 23, 32, - 4, 250, 170, 14, 35, 23, 32, 4, 225, 82, 14, 35, 23, 32, 4, 227, 104, 14, - 35, 23, 32, 226, 162, 248, 50, 14, 35, 23, 32, 245, 185, 88, 14, 35, 23, - 32, 217, 146, 88, 14, 35, 23, 32, 235, 85, 88, 14, 35, 23, 32, 226, 46, - 88, 14, 35, 23, 32, 223, 225, 88, 14, 35, 23, 32, 226, 21, 88, 14, 23, 6, - 248, 44, 14, 23, 4, 248, 44, 14, 23, 21, 212, 79, 14, 23, 21, 118, 14, - 23, 21, 112, 14, 23, 21, 170, 14, 23, 21, 167, 14, 23, 21, 185, 14, 23, - 21, 192, 14, 23, 21, 200, 14, 23, 21, 198, 14, 23, 21, 203, 14, 190, 21, - 212, 79, 14, 190, 21, 118, 14, 190, 21, 112, 14, 190, 21, 170, 14, 190, - 21, 167, 14, 190, 21, 185, 14, 190, 21, 192, 14, 190, 21, 200, 14, 190, - 21, 198, 14, 190, 21, 203, 14, 35, 21, 212, 79, 14, 35, 21, 118, 14, 35, - 21, 112, 14, 35, 21, 170, 14, 35, 21, 167, 14, 35, 21, 185, 14, 35, 21, - 192, 14, 35, 21, 200, 14, 35, 21, 198, 14, 35, 21, 203, 14, 35, 23, 21, - 212, 79, 14, 35, 23, 21, 118, 14, 35, 23, 21, 112, 14, 35, 23, 21, 170, - 14, 35, 23, 21, 167, 14, 35, 23, 21, 185, 14, 35, 23, 21, 192, 14, 35, - 23, 21, 200, 14, 35, 23, 21, 198, 14, 35, 23, 21, 203, 14, 231, 22, 21, - 212, 79, 14, 231, 22, 21, 118, 14, 231, 22, 21, 112, 14, 231, 22, 21, - 170, 14, 231, 22, 21, 167, 14, 231, 22, 21, 185, 14, 231, 22, 21, 192, - 14, 231, 22, 21, 200, 14, 231, 22, 21, 198, 14, 231, 22, 21, 203, 232, - 83, 86, 246, 41, 213, 227, 232, 83, 86, 219, 234, 213, 227, 232, 83, 86, - 213, 253, 213, 227, 232, 83, 86, 228, 210, 213, 227, 232, 83, 86, 224, - 38, 246, 171, 232, 83, 86, 242, 225, 246, 171, 232, 83, 86, 69, 246, 171, - 232, 83, 86, 124, 68, 250, 200, 232, 83, 86, 119, 68, 250, 200, 232, 83, - 86, 137, 68, 250, 200, 232, 83, 86, 244, 101, 68, 250, 200, 232, 83, 86, - 244, 170, 68, 250, 200, 232, 83, 86, 220, 72, 68, 250, 200, 232, 83, 86, - 221, 66, 68, 250, 200, 232, 83, 86, 246, 15, 68, 250, 200, 232, 83, 86, - 229, 95, 68, 250, 200, 232, 83, 86, 124, 68, 252, 199, 232, 83, 86, 119, - 68, 252, 199, 232, 83, 86, 137, 68, 252, 199, 232, 83, 86, 244, 101, 68, - 252, 199, 232, 83, 86, 244, 170, 68, 252, 199, 232, 83, 86, 220, 72, 68, - 252, 199, 232, 83, 86, 221, 66, 68, 252, 199, 232, 83, 86, 246, 15, 68, - 252, 199, 232, 83, 86, 229, 95, 68, 252, 199, 232, 83, 86, 124, 68, 250, - 94, 232, 83, 86, 119, 68, 250, 94, 232, 83, 86, 137, 68, 250, 94, 232, - 83, 86, 244, 101, 68, 250, 94, 232, 83, 86, 244, 170, 68, 250, 94, 232, - 83, 86, 220, 72, 68, 250, 94, 232, 83, 86, 221, 66, 68, 250, 94, 232, 83, - 86, 246, 15, 68, 250, 94, 232, 83, 86, 229, 95, 68, 250, 94, 232, 83, 86, - 225, 195, 232, 83, 86, 227, 60, 232, 83, 86, 252, 200, 232, 83, 86, 250, - 130, 232, 83, 86, 219, 190, 232, 83, 86, 218, 254, 232, 83, 86, 253, 222, - 232, 83, 86, 213, 220, 232, 83, 86, 235, 179, 232, 83, 86, 252, 228, 129, - 86, 201, 252, 228, 129, 86, 241, 148, 129, 86, 241, 147, 129, 86, 241, - 146, 129, 86, 241, 145, 129, 86, 241, 144, 129, 86, 241, 143, 129, 86, - 241, 142, 129, 86, 241, 141, 129, 86, 241, 140, 129, 86, 241, 139, 129, - 86, 241, 138, 129, 86, 241, 137, 129, 86, 241, 136, 129, 86, 241, 135, - 129, 86, 241, 134, 129, 86, 241, 133, 129, 86, 241, 132, 129, 86, 241, - 131, 129, 86, 241, 130, 129, 86, 241, 129, 129, 86, 241, 128, 129, 86, - 241, 127, 129, 86, 241, 126, 129, 86, 241, 125, 129, 86, 241, 124, 129, - 86, 241, 123, 129, 86, 241, 122, 129, 86, 241, 121, 129, 86, 241, 120, - 129, 86, 241, 119, 129, 86, 241, 118, 129, 86, 241, 117, 129, 86, 241, - 116, 129, 86, 241, 115, 129, 86, 241, 114, 129, 86, 241, 113, 129, 86, - 241, 112, 129, 86, 241, 111, 129, 86, 241, 110, 129, 86, 241, 109, 129, - 86, 241, 108, 129, 86, 241, 107, 129, 86, 241, 106, 129, 86, 241, 105, - 129, 86, 241, 104, 129, 86, 241, 103, 129, 86, 241, 102, 129, 86, 241, - 101, 129, 86, 241, 100, 129, 86, 66, 252, 228, 129, 86, 214, 220, 129, - 86, 214, 219, 129, 86, 214, 218, 129, 86, 214, 217, 129, 86, 214, 216, - 129, 86, 214, 215, 129, 86, 214, 214, 129, 86, 214, 213, 129, 86, 214, - 212, 129, 86, 214, 211, 129, 86, 214, 210, 129, 86, 214, 209, 129, 86, - 214, 208, 129, 86, 214, 207, 129, 86, 214, 206, 129, 86, 214, 205, 129, - 86, 214, 204, 129, 86, 214, 203, 129, 86, 214, 202, 129, 86, 214, 201, - 129, 86, 214, 200, 129, 86, 214, 199, 129, 86, 214, 198, 129, 86, 214, - 197, 129, 86, 214, 196, 129, 86, 214, 195, 129, 86, 214, 194, 129, 86, - 214, 193, 129, 86, 214, 192, 129, 86, 214, 191, 129, 86, 214, 190, 129, - 86, 214, 189, 129, 86, 214, 188, 129, 86, 214, 187, 129, 86, 214, 186, - 129, 86, 214, 185, 129, 86, 214, 184, 129, 86, 214, 183, 129, 86, 214, - 182, 129, 86, 214, 181, 129, 86, 214, 180, 129, 86, 214, 179, 129, 86, - 214, 178, 129, 86, 214, 177, 129, 86, 214, 176, 129, 86, 214, 175, 129, - 86, 214, 174, 129, 86, 214, 173, 129, 86, 214, 172, 225, 201, 251, 43, - 252, 228, 225, 201, 251, 43, 255, 41, 68, 219, 222, 225, 201, 251, 43, - 119, 68, 219, 222, 225, 201, 251, 43, 137, 68, 219, 222, 225, 201, 251, - 43, 244, 101, 68, 219, 222, 225, 201, 251, 43, 244, 170, 68, 219, 222, - 225, 201, 251, 43, 220, 72, 68, 219, 222, 225, 201, 251, 43, 221, 66, 68, - 219, 222, 225, 201, 251, 43, 246, 15, 68, 219, 222, 225, 201, 251, 43, - 229, 95, 68, 219, 222, 225, 201, 251, 43, 217, 214, 68, 219, 222, 225, - 201, 251, 43, 235, 254, 68, 219, 222, 225, 201, 251, 43, 234, 151, 68, - 219, 222, 225, 201, 251, 43, 224, 195, 68, 219, 222, 225, 201, 251, 43, - 234, 199, 68, 219, 222, 225, 201, 251, 43, 255, 41, 68, 242, 72, 225, - 201, 251, 43, 119, 68, 242, 72, 225, 201, 251, 43, 137, 68, 242, 72, 225, - 201, 251, 43, 244, 101, 68, 242, 72, 225, 201, 251, 43, 244, 170, 68, - 242, 72, 225, 201, 251, 43, 220, 72, 68, 242, 72, 225, 201, 251, 43, 221, - 66, 68, 242, 72, 225, 201, 251, 43, 246, 15, 68, 242, 72, 225, 201, 251, - 43, 229, 95, 68, 242, 72, 225, 201, 251, 43, 217, 214, 68, 242, 72, 225, - 201, 251, 43, 235, 254, 68, 242, 72, 225, 201, 251, 43, 234, 151, 68, - 242, 72, 225, 201, 251, 43, 224, 195, 68, 242, 72, 225, 201, 251, 43, - 234, 199, 68, 242, 72, 225, 201, 251, 43, 255, 41, 68, 248, 64, 225, 201, - 251, 43, 119, 68, 248, 64, 225, 201, 251, 43, 137, 68, 248, 64, 225, 201, - 251, 43, 244, 101, 68, 248, 64, 225, 201, 251, 43, 244, 170, 68, 248, 64, - 225, 201, 251, 43, 220, 72, 68, 248, 64, 225, 201, 251, 43, 221, 66, 68, - 248, 64, 225, 201, 251, 43, 246, 15, 68, 248, 64, 225, 201, 251, 43, 229, - 95, 68, 248, 64, 225, 201, 251, 43, 217, 214, 68, 248, 64, 225, 201, 251, - 43, 235, 254, 68, 248, 64, 225, 201, 251, 43, 234, 151, 68, 248, 64, 225, - 201, 251, 43, 224, 195, 68, 248, 64, 225, 201, 251, 43, 234, 199, 68, - 248, 64, 225, 201, 251, 43, 85, 235, 179, 225, 201, 251, 43, 255, 41, 68, - 250, 46, 225, 201, 251, 43, 119, 68, 250, 46, 225, 201, 251, 43, 137, 68, - 250, 46, 225, 201, 251, 43, 244, 101, 68, 250, 46, 225, 201, 251, 43, - 244, 170, 68, 250, 46, 225, 201, 251, 43, 220, 72, 68, 250, 46, 225, 201, - 251, 43, 221, 66, 68, 250, 46, 225, 201, 251, 43, 246, 15, 68, 250, 46, - 225, 201, 251, 43, 229, 95, 68, 250, 46, 225, 201, 251, 43, 217, 214, 68, - 250, 46, 225, 201, 251, 43, 235, 254, 68, 250, 46, 225, 201, 251, 43, - 234, 151, 68, 250, 46, 225, 201, 251, 43, 224, 195, 68, 250, 46, 225, - 201, 251, 43, 234, 199, 68, 250, 46, 225, 201, 251, 43, 69, 235, 179, 21, - 212, 80, 244, 64, 219, 83, 21, 212, 80, 250, 23, 21, 124, 250, 23, 21, - 119, 250, 23, 21, 137, 250, 23, 21, 244, 101, 250, 23, 21, 244, 170, 250, - 23, 21, 220, 72, 250, 23, 21, 221, 66, 250, 23, 21, 246, 15, 250, 23, 21, - 229, 95, 250, 23, 87, 7, 6, 1, 63, 87, 7, 6, 1, 253, 201, 87, 7, 6, 1, - 251, 121, 87, 7, 6, 1, 249, 125, 87, 7, 6, 1, 77, 87, 7, 6, 1, 245, 95, - 87, 7, 6, 1, 244, 41, 87, 7, 6, 1, 242, 162, 87, 7, 6, 1, 75, 87, 7, 6, - 1, 236, 3, 87, 7, 6, 1, 235, 141, 87, 7, 6, 1, 155, 87, 7, 6, 1, 184, 87, - 7, 6, 1, 206, 87, 7, 6, 1, 78, 87, 7, 6, 1, 227, 11, 87, 7, 6, 1, 225, - 19, 87, 7, 6, 1, 152, 87, 7, 6, 1, 196, 87, 7, 6, 1, 218, 113, 87, 7, 6, - 1, 72, 87, 7, 6, 1, 211, 211, 87, 7, 6, 1, 214, 85, 87, 7, 6, 1, 213, - 169, 87, 7, 6, 1, 213, 108, 87, 7, 6, 1, 212, 152, 216, 232, 220, 254, - 251, 209, 7, 6, 1, 196, 37, 32, 7, 6, 1, 251, 121, 37, 32, 7, 6, 1, 152, - 37, 250, 248, 37, 213, 171, 92, 7, 6, 1, 63, 92, 7, 6, 1, 253, 201, 92, - 7, 6, 1, 251, 121, 92, 7, 6, 1, 249, 125, 92, 7, 6, 1, 77, 92, 7, 6, 1, - 245, 95, 92, 7, 6, 1, 244, 41, 92, 7, 6, 1, 242, 162, 92, 7, 6, 1, 75, - 92, 7, 6, 1, 236, 3, 92, 7, 6, 1, 235, 141, 92, 7, 6, 1, 155, 92, 7, 6, - 1, 184, 92, 7, 6, 1, 206, 92, 7, 6, 1, 78, 92, 7, 6, 1, 227, 11, 92, 7, - 6, 1, 225, 19, 92, 7, 6, 1, 152, 92, 7, 6, 1, 196, 92, 7, 6, 1, 218, 113, - 92, 7, 6, 1, 72, 92, 7, 6, 1, 211, 211, 92, 7, 6, 1, 214, 85, 92, 7, 6, - 1, 213, 169, 92, 7, 6, 1, 213, 108, 92, 7, 6, 1, 212, 152, 92, 241, 54, - 92, 230, 189, 92, 222, 125, 92, 219, 177, 92, 225, 134, 92, 214, 10, 150, - 37, 7, 6, 1, 63, 150, 37, 7, 6, 1, 253, 201, 150, 37, 7, 6, 1, 251, 121, - 150, 37, 7, 6, 1, 249, 125, 150, 37, 7, 6, 1, 77, 150, 37, 7, 6, 1, 245, - 95, 150, 37, 7, 6, 1, 244, 41, 150, 37, 7, 6, 1, 242, 162, 150, 37, 7, 6, - 1, 75, 150, 37, 7, 6, 1, 236, 3, 150, 37, 7, 6, 1, 235, 141, 150, 37, 7, - 6, 1, 155, 150, 37, 7, 6, 1, 184, 150, 37, 7, 6, 1, 206, 150, 37, 7, 6, - 1, 78, 150, 37, 7, 6, 1, 227, 11, 150, 37, 7, 6, 1, 225, 19, 150, 37, 7, - 6, 1, 152, 150, 37, 7, 6, 1, 196, 150, 37, 7, 6, 1, 218, 113, 150, 37, 7, - 6, 1, 72, 150, 37, 7, 6, 1, 211, 211, 150, 37, 7, 6, 1, 214, 85, 150, 37, - 7, 6, 1, 213, 169, 150, 37, 7, 6, 1, 213, 108, 150, 37, 7, 6, 1, 212, - 152, 150, 92, 7, 6, 1, 63, 150, 92, 7, 6, 1, 253, 201, 150, 92, 7, 6, 1, - 251, 121, 150, 92, 7, 6, 1, 249, 125, 150, 92, 7, 6, 1, 77, 150, 92, 7, - 6, 1, 245, 95, 150, 92, 7, 6, 1, 244, 41, 150, 92, 7, 6, 1, 242, 162, - 150, 92, 7, 6, 1, 75, 150, 92, 7, 6, 1, 236, 3, 150, 92, 7, 6, 1, 235, - 141, 150, 92, 7, 6, 1, 155, 150, 92, 7, 6, 1, 184, 150, 92, 7, 6, 1, 206, - 150, 92, 7, 6, 1, 78, 150, 92, 7, 6, 1, 227, 11, 150, 92, 7, 6, 1, 225, - 19, 150, 92, 7, 6, 1, 152, 150, 92, 7, 6, 1, 196, 150, 92, 7, 6, 1, 218, - 113, 150, 92, 7, 6, 1, 72, 150, 92, 7, 6, 1, 211, 211, 150, 92, 7, 6, 1, - 214, 85, 150, 92, 7, 6, 1, 213, 169, 150, 92, 7, 6, 1, 213, 108, 150, 92, - 7, 6, 1, 212, 152, 249, 191, 150, 92, 7, 6, 1, 227, 11, 150, 92, 240, - 223, 150, 92, 195, 150, 92, 222, 227, 150, 92, 255, 57, 150, 92, 214, 10, - 42, 247, 237, 92, 250, 83, 92, 249, 232, 92, 244, 86, 92, 240, 215, 92, - 229, 235, 92, 229, 228, 92, 227, 117, 92, 219, 241, 92, 116, 2, 245, 119, - 79, 92, 214, 104, 224, 31, 236, 97, 16, 1, 63, 224, 31, 236, 97, 16, 1, - 253, 201, 224, 31, 236, 97, 16, 1, 251, 121, 224, 31, 236, 97, 16, 1, - 249, 125, 224, 31, 236, 97, 16, 1, 77, 224, 31, 236, 97, 16, 1, 245, 95, - 224, 31, 236, 97, 16, 1, 244, 41, 224, 31, 236, 97, 16, 1, 242, 162, 224, - 31, 236, 97, 16, 1, 75, 224, 31, 236, 97, 16, 1, 236, 3, 224, 31, 236, - 97, 16, 1, 235, 141, 224, 31, 236, 97, 16, 1, 155, 224, 31, 236, 97, 16, - 1, 184, 224, 31, 236, 97, 16, 1, 206, 224, 31, 236, 97, 16, 1, 78, 224, - 31, 236, 97, 16, 1, 227, 11, 224, 31, 236, 97, 16, 1, 225, 19, 224, 31, - 236, 97, 16, 1, 152, 224, 31, 236, 97, 16, 1, 196, 224, 31, 236, 97, 16, - 1, 218, 113, 224, 31, 236, 97, 16, 1, 72, 224, 31, 236, 97, 16, 1, 211, - 211, 224, 31, 236, 97, 16, 1, 214, 85, 224, 31, 236, 97, 16, 1, 213, 169, - 224, 31, 236, 97, 16, 1, 213, 108, 224, 31, 236, 97, 16, 1, 212, 152, 42, - 136, 241, 168, 92, 56, 234, 138, 92, 56, 222, 227, 92, 9, 215, 154, 238, - 160, 92, 9, 215, 154, 238, 164, 92, 9, 215, 154, 238, 172, 92, 56, 248, - 162, 92, 9, 215, 154, 238, 179, 92, 9, 215, 154, 238, 166, 92, 9, 215, - 154, 238, 138, 92, 9, 215, 154, 238, 165, 92, 9, 215, 154, 238, 178, 92, - 9, 215, 154, 238, 152, 92, 9, 215, 154, 238, 145, 92, 9, 215, 154, 238, - 154, 92, 9, 215, 154, 238, 175, 92, 9, 215, 154, 238, 161, 92, 9, 215, - 154, 238, 177, 92, 9, 215, 154, 238, 153, 92, 9, 215, 154, 238, 176, 92, - 9, 215, 154, 238, 139, 92, 9, 215, 154, 238, 144, 92, 9, 215, 154, 238, - 137, 92, 9, 215, 154, 238, 167, 92, 9, 215, 154, 238, 169, 92, 9, 215, - 154, 238, 147, 92, 9, 215, 154, 238, 158, 92, 9, 215, 154, 238, 156, 92, - 9, 215, 154, 238, 182, 92, 9, 215, 154, 238, 181, 92, 9, 215, 154, 238, - 135, 92, 9, 215, 154, 238, 162, 92, 9, 215, 154, 238, 180, 92, 9, 215, - 154, 238, 171, 92, 9, 215, 154, 238, 157, 92, 9, 215, 154, 238, 136, 92, - 9, 215, 154, 238, 159, 92, 9, 215, 154, 238, 141, 92, 9, 215, 154, 238, - 140, 92, 9, 215, 154, 238, 170, 92, 9, 215, 154, 238, 148, 92, 9, 215, - 154, 238, 150, 92, 9, 215, 154, 238, 151, 92, 9, 215, 154, 238, 143, 92, - 9, 215, 154, 238, 174, 92, 9, 215, 154, 238, 168, 216, 232, 220, 254, - 251, 209, 9, 215, 154, 238, 149, 216, 232, 220, 254, 251, 209, 9, 215, - 154, 238, 181, 216, 232, 220, 254, 251, 209, 9, 215, 154, 238, 179, 216, - 232, 220, 254, 251, 209, 9, 215, 154, 238, 163, 216, 232, 220, 254, 251, - 209, 9, 215, 154, 238, 146, 216, 232, 220, 254, 251, 209, 9, 215, 154, - 238, 159, 216, 232, 220, 254, 251, 209, 9, 215, 154, 238, 142, 216, 232, - 220, 254, 251, 209, 9, 215, 154, 238, 173, 216, 232, 220, 254, 251, 209, - 9, 215, 154, 238, 155, 37, 147, 255, 22, 37, 147, 255, 44, 249, 136, 244, - 131, 250, 60, 215, 170, 229, 108, 2, 219, 106, 218, 247, 113, 230, 254, - 218, 246, 250, 86, 253, 250, 246, 130, 218, 245, 113, 251, 172, 224, 84, - 251, 193, 253, 250, 229, 107, 214, 28, 214, 22, 214, 116, 231, 78, 214, - 12, 246, 45, 243, 21, 245, 133, 246, 45, 243, 21, 254, 164, 246, 45, 243, - 21, 254, 11, 243, 21, 2, 231, 185, 163, 231, 13, 88, 214, 14, 249, 200, - 231, 13, 88, 244, 181, 224, 202, 231, 13, 88, 214, 14, 243, 50, 231, 13, - 88, 244, 64, 231, 13, 88, 214, 39, 243, 50, 231, 13, 88, 233, 202, 224, - 202, 231, 13, 88, 214, 39, 249, 200, 231, 13, 88, 249, 200, 231, 12, 163, - 231, 13, 2, 245, 23, 244, 181, 224, 202, 231, 13, 2, 245, 23, 233, 202, - 224, 202, 231, 13, 2, 245, 23, 244, 64, 231, 13, 2, 245, 23, 218, 253, 2, - 245, 23, 243, 19, 219, 109, 220, 200, 219, 109, 250, 176, 222, 110, 245, - 127, 216, 206, 248, 156, 216, 206, 226, 223, 216, 206, 251, 82, 216, 81, - 250, 178, 252, 2, 223, 127, 242, 27, 218, 250, 252, 2, 246, 49, 68, 232, - 72, 246, 49, 68, 223, 218, 242, 51, 244, 101, 233, 176, 250, 50, 232, 48, - 233, 175, 245, 9, 233, 175, 233, 176, 244, 136, 236, 113, 213, 227, 230, - 198, 217, 2, 253, 234, 242, 239, 231, 201, 214, 26, 218, 21, 233, 148, - 252, 195, 225, 230, 224, 38, 254, 94, 242, 225, 254, 94, 226, 128, 226, - 129, 250, 179, 219, 68, 242, 126, 220, 37, 68, 225, 212, 231, 222, 227, - 100, 251, 244, 225, 145, 233, 158, 223, 219, 249, 205, 223, 219, 252, - 205, 249, 235, 223, 218, 249, 159, 22, 223, 218, 219, 95, 251, 218, 219, - 221, 251, 203, 244, 85, 244, 81, 223, 142, 218, 205, 225, 147, 248, 242, - 227, 138, 218, 222, 244, 82, 220, 175, 244, 180, 251, 77, 2, 218, 198, - 248, 107, 219, 255, 240, 222, 249, 204, 221, 15, 240, 221, 240, 222, 249, - 204, 246, 183, 249, 234, 250, 144, 134, 251, 54, 233, 12, 249, 153, 241, - 160, 225, 149, 220, 185, 252, 83, 251, 214, 225, 150, 68, 244, 122, 249, - 233, 244, 113, 22, 234, 152, 217, 240, 213, 219, 242, 116, 222, 207, 251, - 228, 22, 249, 166, 213, 225, 243, 24, 250, 39, 243, 24, 216, 164, 246, - 166, 252, 108, 230, 233, 250, 67, 252, 108, 230, 232, 252, 231, 251, 227, - 223, 220, 213, 192, 225, 111, 252, 27, 251, 76, 235, 253, 250, 137, 216, - 206, 244, 251, 250, 136, 244, 183, 244, 184, 219, 219, 252, 204, 226, - 159, 225, 160, 250, 9, 252, 205, 218, 23, 216, 206, 249, 191, 244, 156, - 225, 231, 248, 153, 235, 247, 247, 206, 251, 32, 219, 67, 213, 228, 250, - 158, 231, 13, 214, 149, 250, 219, 222, 140, 222, 165, 242, 244, 251, 51, - 251, 33, 241, 94, 244, 219, 213, 244, 223, 136, 250, 40, 244, 175, 225, - 172, 22, 244, 179, 231, 110, 230, 248, 251, 66, 250, 99, 242, 79, 254, - 27, 226, 226, 216, 240, 242, 98, 250, 89, 217, 208, 217, 80, 250, 80, - 251, 250, 226, 88, 254, 26, 214, 155, 243, 206, 248, 14, 242, 5, 220, 31, - 232, 112, 252, 37, 243, 207, 248, 57, 251, 217, 244, 141, 225, 201, 251, - 41, 27, 228, 201, 230, 225, 27, 228, 196, 222, 153, 242, 201, 27, 234, - 255, 216, 161, 214, 139, 27, 222, 134, 223, 61, 220, 212, 2, 222, 167, - 217, 210, 224, 103, 22, 252, 205, 220, 52, 22, 220, 52, 251, 237, 252, - 169, 22, 241, 154, 250, 180, 244, 162, 220, 10, 223, 62, 218, 226, 216, - 165, 241, 95, 224, 104, 254, 165, 244, 120, 223, 73, 244, 120, 218, 200, - 241, 84, 251, 173, 241, 84, 2, 243, 190, 227, 132, 251, 173, 235, 247, - 225, 155, 227, 131, 245, 132, 225, 155, 227, 131, 241, 93, 252, 191, 253, - 224, 217, 218, 232, 112, 241, 89, 232, 240, 241, 89, 249, 238, 219, 79, - 222, 139, 248, 115, 219, 79, 245, 13, 236, 8, 233, 211, 235, 247, 251, - 26, 245, 132, 251, 26, 224, 68, 230, 252, 227, 20, 214, 28, 251, 177, - 249, 207, 217, 73, 233, 140, 224, 105, 251, 24, 246, 171, 249, 198, 213, - 247, 220, 17, 220, 15, 241, 94, 224, 80, 243, 10, 221, 2, 231, 29, 223, - 130, 250, 168, 247, 211, 225, 241, 251, 251, 245, 247, 227, 140, 219, - 203, 220, 253, 251, 176, 254, 130, 241, 159, 233, 242, 252, 106, 244, - 179, 216, 164, 244, 179, 252, 1, 216, 63, 242, 96, 250, 169, 252, 231, - 250, 169, 244, 76, 252, 231, 250, 169, 252, 29, 226, 106, 234, 146, 225, - 164, 246, 163, 251, 67, 252, 222, 251, 67, 247, 205, 230, 253, 245, 23, - 249, 208, 245, 23, 217, 74, 245, 23, 224, 106, 245, 23, 251, 25, 245, 23, - 246, 172, 245, 23, 219, 192, 213, 247, 241, 95, 245, 23, 231, 30, 245, - 23, 247, 212, 245, 23, 225, 242, 245, 23, 244, 79, 245, 23, 242, 123, - 245, 23, 213, 214, 245, 23, 252, 117, 245, 23, 226, 209, 245, 23, 225, - 242, 228, 207, 226, 142, 225, 103, 245, 102, 246, 48, 228, 207, 230, 250, - 216, 245, 69, 116, 225, 177, 252, 226, 236, 100, 69, 121, 225, 177, 252, - 226, 236, 100, 69, 43, 225, 177, 252, 226, 236, 100, 69, 47, 225, 177, - 252, 226, 236, 100, 244, 173, 242, 119, 53, 214, 20, 242, 119, 53, 227, - 118, 242, 119, 53, 217, 102, 116, 53, 217, 102, 121, 53, 250, 79, 242, - 114, 53, 210, 242, 114, 53, 249, 186, 213, 210, 242, 98, 245, 103, 229, - 252, 218, 112, 235, 241, 246, 168, 234, 202, 252, 39, 213, 210, 250, 53, - 225, 50, 242, 117, 225, 146, 232, 55, 220, 205, 253, 246, 220, 205, 242, - 13, 220, 205, 213, 210, 222, 180, 213, 210, 251, 236, 244, 118, 251, 144, - 236, 113, 220, 114, 251, 143, 236, 113, 220, 114, 251, 213, 243, 34, 232, - 63, 213, 211, 245, 7, 232, 64, 22, 213, 212, 241, 165, 242, 113, 119, - 231, 193, 241, 165, 242, 113, 119, 213, 209, 241, 165, 242, 113, 225, - 169, 227, 130, 213, 212, 2, 251, 160, 246, 46, 251, 194, 2, 214, 228, - 226, 80, 2, 252, 4, 242, 136, 232, 64, 2, 242, 210, 226, 21, 232, 52, - 232, 64, 2, 216, 69, 227, 111, 232, 63, 227, 111, 213, 211, 252, 230, - 249, 252, 213, 195, 225, 106, 235, 247, 227, 126, 235, 247, 243, 9, 243, - 62, 252, 231, 254, 149, 245, 107, 254, 196, 254, 197, 231, 20, 236, 118, - 220, 47, 236, 90, 248, 106, 226, 79, 242, 207, 248, 246, 233, 71, 230, - 98, 225, 168, 245, 24, 232, 20, 242, 135, 252, 184, 225, 171, 218, 131, - 225, 234, 234, 184, 79, 232, 240, 233, 132, 223, 164, 243, 150, 219, 85, - 234, 183, 251, 222, 249, 210, 2, 242, 74, 214, 6, 252, 115, 242, 74, 251, - 188, 242, 74, 119, 242, 72, 219, 217, 242, 74, 242, 219, 242, 74, 242, - 75, 2, 71, 252, 0, 242, 74, 242, 225, 242, 74, 213, 34, 242, 74, 225, 51, - 242, 74, 242, 75, 2, 223, 220, 223, 231, 242, 72, 242, 75, 248, 153, 248, - 66, 221, 27, 2, 111, 62, 236, 73, 245, 250, 182, 251, 170, 254, 148, 88, - 251, 245, 220, 39, 88, 250, 32, 88, 219, 197, 218, 207, 88, 246, 161, - 248, 224, 88, 225, 235, 68, 225, 165, 244, 150, 252, 51, 247, 238, 88, - 219, 210, 252, 204, 217, 115, 252, 204, 69, 244, 140, 241, 63, 225, 175, - 88, 231, 33, 252, 217, 249, 162, 245, 120, 110, 247, 207, 53, 249, 202, - 251, 42, 252, 190, 2, 213, 32, 53, 252, 190, 2, 247, 207, 53, 252, 190, - 2, 245, 135, 53, 252, 190, 2, 225, 144, 53, 231, 33, 2, 213, 223, 250, - 197, 2, 215, 130, 216, 202, 22, 213, 32, 53, 222, 120, 226, 78, 250, 13, - 251, 192, 231, 69, 244, 145, 248, 2, 227, 65, 248, 7, 246, 125, 244, 196, - 244, 129, 210, 244, 196, 244, 129, 226, 239, 2, 249, 164, 226, 239, 245, - 16, 215, 140, 251, 72, 217, 239, 251, 72, 251, 43, 236, 100, 250, 197, 2, - 215, 130, 216, 201, 250, 197, 2, 246, 179, 216, 201, 252, 187, 250, 196, - 250, 66, 225, 46, 223, 121, 225, 46, 226, 184, 219, 75, 223, 68, 216, - 193, 223, 68, 251, 241, 218, 53, 233, 173, 228, 199, 228, 200, 2, 248, - 152, 249, 209, 250, 60, 251, 242, 210, 251, 242, 242, 225, 251, 242, 252, - 0, 251, 242, 227, 61, 251, 242, 251, 239, 230, 93, 252, 220, 222, 128, - 231, 194, 217, 223, 224, 50, 226, 237, 244, 248, 232, 112, 222, 164, 254, - 127, 225, 67, 255, 29, 232, 242, 250, 186, 231, 206, 227, 35, 216, 209, - 236, 109, 216, 209, 226, 244, 246, 101, 88, 236, 106, 245, 199, 245, 200, - 2, 246, 179, 80, 50, 250, 60, 232, 78, 2, 232, 236, 244, 162, 250, 60, - 232, 78, 2, 224, 83, 244, 162, 210, 232, 78, 2, 224, 83, 244, 162, 210, - 232, 78, 2, 232, 236, 244, 162, 225, 152, 225, 153, 241, 97, 229, 233, - 231, 43, 226, 29, 231, 43, 226, 30, 2, 96, 80, 253, 250, 233, 168, 214, - 158, 231, 42, 231, 43, 226, 30, 227, 133, 228, 229, 231, 43, 226, 28, - 254, 128, 2, 252, 175, 251, 66, 214, 155, 251, 66, 217, 220, 224, 98, - 214, 154, 216, 32, 96, 254, 33, 250, 62, 96, 22, 135, 210, 250, 96, 254, - 33, 250, 62, 96, 22, 135, 210, 250, 96, 254, 34, 2, 37, 124, 227, 26, - 250, 62, 246, 179, 22, 215, 130, 210, 250, 96, 254, 33, 254, 126, 246, - 179, 22, 215, 130, 210, 250, 96, 254, 33, 117, 251, 191, 88, 127, 251, - 191, 88, 219, 214, 2, 251, 60, 91, 219, 213, 219, 214, 2, 124, 219, 237, - 214, 22, 219, 214, 2, 137, 219, 237, 214, 21, 252, 161, 245, 250, 225, - 197, 233, 164, 232, 89, 243, 24, 223, 178, 232, 89, 243, 24, 233, 22, 2, - 236, 83, 226, 110, 250, 60, 233, 22, 2, 235, 0, 235, 0, 233, 21, 210, - 233, 21, 252, 91, 252, 92, 2, 251, 60, 91, 251, 240, 233, 74, 88, 224, - 99, 251, 140, 252, 229, 2, 135, 80, 50, 245, 222, 2, 135, 80, 50, 227, - 100, 2, 245, 119, 156, 2, 43, 47, 80, 50, 219, 244, 2, 96, 80, 50, 216, - 240, 2, 215, 130, 80, 50, 228, 229, 124, 215, 160, 246, 13, 88, 234, 254, - 217, 213, 236, 77, 16, 31, 7, 6, 233, 131, 236, 77, 16, 31, 7, 4, 233, - 131, 236, 77, 16, 31, 228, 98, 236, 77, 16, 31, 218, 142, 236, 77, 16, - 31, 7, 233, 131, 244, 185, 245, 250, 216, 235, 213, 190, 242, 124, 228, - 81, 22, 251, 246, 241, 171, 225, 218, 231, 109, 217, 221, 249, 177, 252, - 205, 220, 72, 225, 179, 219, 110, 2, 231, 107, 247, 195, 235, 247, 16, - 31, 252, 103, 216, 191, 245, 235, 85, 42, 251, 140, 69, 42, 251, 140, - 233, 207, 224, 38, 250, 95, 233, 207, 252, 0, 250, 95, 233, 207, 227, 61, - 248, 65, 233, 207, 252, 0, 248, 65, 4, 227, 61, 248, 65, 4, 252, 0, 248, - 65, 215, 139, 224, 38, 216, 196, 246, 180, 224, 38, 216, 196, 215, 139, - 4, 224, 38, 216, 196, 246, 180, 4, 224, 38, 216, 196, 250, 64, 245, 24, - 124, 227, 143, 250, 64, 245, 24, 119, 227, 143, 250, 64, 245, 24, 137, - 227, 143, 250, 64, 245, 24, 244, 101, 227, 143, 250, 64, 245, 24, 244, - 170, 227, 143, 250, 64, 245, 24, 220, 72, 227, 143, 250, 64, 245, 24, - 221, 66, 227, 143, 250, 64, 245, 24, 246, 15, 227, 143, 250, 64, 245, 24, - 229, 95, 227, 143, 250, 64, 245, 24, 217, 214, 227, 143, 250, 64, 245, - 24, 245, 246, 227, 143, 250, 64, 245, 24, 216, 49, 227, 143, 250, 64, - 245, 24, 227, 95, 250, 64, 245, 24, 216, 29, 250, 64, 245, 24, 217, 107, - 250, 64, 245, 24, 244, 97, 250, 64, 245, 24, 244, 168, 250, 64, 245, 24, - 220, 68, 250, 64, 245, 24, 221, 65, 250, 64, 245, 24, 246, 14, 250, 64, - 245, 24, 229, 94, 250, 64, 245, 24, 217, 212, 250, 64, 245, 24, 245, 244, - 250, 64, 245, 24, 216, 47, 231, 1, 244, 65, 217, 4, 216, 228, 219, 102, - 68, 233, 109, 220, 115, 68, 235, 248, 230, 246, 242, 223, 245, 24, 2, - 220, 21, 245, 102, 245, 24, 2, 217, 235, 68, 235, 170, 220, 21, 245, 24, - 2, 210, 230, 250, 220, 21, 245, 24, 2, 210, 230, 251, 22, 220, 21, 245, - 102, 220, 21, 245, 24, 2, 210, 230, 251, 22, 250, 34, 218, 206, 220, 21, - 245, 24, 2, 210, 230, 251, 22, 217, 71, 245, 102, 220, 21, 245, 24, 2, - 242, 128, 220, 21, 245, 24, 2, 241, 96, 213, 221, 245, 23, 220, 21, 245, - 24, 2, 220, 21, 245, 102, 245, 24, 222, 158, 248, 134, 244, 122, 224, 16, - 245, 23, 220, 21, 245, 24, 2, 242, 73, 245, 102, 220, 21, 245, 24, 2, - 218, 248, 220, 20, 245, 23, 229, 236, 245, 23, 215, 164, 245, 23, 245, - 24, 2, 250, 34, 218, 206, 226, 103, 245, 23, 250, 7, 245, 23, 245, 24, - 217, 104, 111, 234, 183, 234, 182, 245, 24, 2, 250, 60, 245, 102, 245, - 24, 2, 219, 45, 216, 246, 22, 213, 221, 245, 104, 245, 24, 2, 219, 45, - 216, 246, 22, 217, 71, 245, 102, 248, 9, 245, 23, 254, 144, 245, 23, 225, - 143, 245, 23, 249, 179, 245, 23, 226, 82, 245, 23, 245, 24, 2, 232, 253, - 68, 216, 175, 248, 9, 251, 142, 224, 16, 245, 23, 244, 241, 245, 23, 214, - 7, 245, 23, 220, 38, 245, 23, 217, 38, 245, 23, 232, 243, 249, 179, 245, - 23, 245, 24, 2, 210, 230, 251, 22, 250, 34, 218, 206, 245, 24, 222, 132, - 236, 113, 244, 242, 254, 0, 245, 23, 244, 138, 245, 23, 247, 238, 245, - 23, 245, 24, 213, 219, 230, 250, 245, 24, 2, 231, 219, 232, 22, 242, 223, - 251, 25, 245, 24, 2, 220, 21, 245, 102, 251, 25, 245, 24, 2, 217, 235, - 68, 235, 170, 220, 21, 251, 25, 245, 24, 2, 210, 230, 250, 220, 21, 251, - 25, 245, 24, 2, 242, 73, 245, 102, 251, 25, 245, 24, 2, 213, 187, 220, - 22, 234, 182, 251, 25, 245, 24, 2, 250, 60, 245, 102, 225, 143, 251, 25, - 245, 23, 249, 179, 251, 25, 245, 23, 214, 7, 251, 25, 245, 23, 245, 24, - 2, 228, 229, 243, 3, 243, 130, 245, 24, 2, 227, 118, 243, 130, 226, 80, - 251, 219, 248, 147, 222, 111, 231, 29, 242, 76, 231, 29, 219, 215, 231, - 29, 242, 108, 226, 80, 224, 82, 124, 242, 118, 226, 80, 224, 82, 251, - 229, 242, 114, 236, 113, 250, 236, 226, 80, 244, 72, 226, 80, 2, 225, - 143, 245, 23, 226, 80, 2, 244, 130, 242, 113, 223, 138, 242, 61, 219, 97, - 233, 20, 224, 88, 251, 44, 242, 11, 216, 218, 242, 11, 216, 219, 2, 251, - 168, 228, 207, 216, 218, 231, 169, 182, 224, 89, 219, 103, 216, 216, 216, - 217, 251, 44, 251, 146, 227, 97, 251, 146, 216, 172, 251, 147, 219, 83, - 231, 70, 254, 166, 244, 186, 245, 216, 225, 169, 251, 44, 227, 97, 225, - 169, 251, 44, 217, 252, 227, 97, 217, 252, 253, 223, 227, 97, 253, 223, - 224, 45, 214, 229, 248, 130, 216, 163, 254, 28, 232, 246, 216, 224, 231, - 23, 231, 0, 224, 87, 218, 221, 224, 87, 231, 0, 251, 83, 255, 6, 216, - 215, 220, 217, 223, 118, 219, 208, 201, 216, 222, 233, 100, 66, 216, 222, - 233, 100, 249, 252, 53, 225, 169, 251, 29, 223, 231, 233, 100, 216, 193, - 244, 163, 227, 100, 225, 154, 247, 198, 228, 229, 245, 205, 53, 220, 19, - 88, 228, 229, 220, 19, 88, 225, 45, 233, 63, 236, 113, 236, 16, 225, 209, - 88, 247, 221, 228, 206, 233, 63, 88, 225, 148, 214, 28, 88, 228, 220, - 214, 28, 88, 252, 50, 228, 229, 252, 49, 252, 48, 231, 0, 252, 48, 226, - 124, 228, 229, 226, 123, 250, 160, 249, 187, 231, 190, 88, 213, 208, 88, - 223, 245, 252, 231, 88, 217, 5, 214, 28, 250, 57, 220, 179, 252, 164, - 252, 162, 226, 152, 249, 239, 249, 151, 252, 214, 250, 82, 43, 232, 222, - 106, 16, 31, 224, 183, 106, 16, 31, 254, 227, 106, 16, 31, 244, 185, 106, - 16, 31, 246, 44, 106, 16, 31, 214, 27, 106, 16, 31, 254, 84, 106, 16, 31, - 254, 85, 224, 33, 106, 16, 31, 254, 85, 224, 32, 106, 16, 31, 254, 85, - 214, 128, 106, 16, 31, 254, 85, 214, 127, 106, 16, 31, 214, 142, 106, 16, - 31, 214, 141, 106, 16, 31, 214, 140, 106, 16, 31, 219, 3, 106, 16, 31, - 226, 37, 219, 3, 106, 16, 31, 85, 219, 3, 106, 16, 31, 231, 189, 219, 30, - 106, 16, 31, 231, 189, 219, 29, 106, 16, 31, 231, 189, 219, 28, 106, 16, - 31, 250, 98, 106, 16, 31, 222, 196, 106, 16, 31, 229, 83, 106, 16, 31, - 214, 126, 106, 16, 31, 214, 125, 106, 16, 31, 223, 139, 222, 196, 106, - 16, 31, 223, 139, 222, 195, 106, 16, 31, 243, 6, 106, 16, 31, 220, 111, - 106, 16, 31, 236, 36, 227, 58, 106, 16, 31, 236, 36, 227, 57, 106, 16, - 31, 249, 197, 68, 236, 35, 106, 16, 31, 224, 29, 68, 236, 35, 106, 16, - 31, 249, 230, 227, 58, 106, 16, 31, 236, 34, 227, 58, 106, 16, 31, 219, - 31, 68, 249, 229, 106, 16, 31, 249, 197, 68, 249, 229, 106, 16, 31, 249, - 197, 68, 249, 228, 106, 16, 31, 249, 230, 254, 121, 106, 16, 31, 222, - 197, 68, 249, 230, 254, 121, 106, 16, 31, 219, 31, 68, 222, 197, 68, 249, - 229, 106, 16, 31, 214, 225, 106, 16, 31, 217, 51, 227, 58, 106, 16, 31, - 233, 179, 227, 58, 106, 16, 31, 254, 120, 227, 58, 106, 16, 31, 219, 31, - 68, 254, 119, 106, 16, 31, 222, 197, 68, 254, 119, 106, 16, 31, 219, 31, - 68, 222, 197, 68, 254, 119, 106, 16, 31, 214, 143, 68, 254, 119, 106, 16, - 31, 224, 29, 68, 254, 119, 106, 16, 31, 224, 29, 68, 254, 118, 106, 16, - 31, 224, 28, 106, 16, 31, 224, 27, 106, 16, 31, 224, 26, 106, 16, 31, - 224, 25, 106, 16, 31, 254, 193, 106, 16, 31, 254, 192, 106, 16, 31, 232, - 41, 106, 16, 31, 222, 202, 106, 16, 31, 254, 32, 106, 16, 31, 224, 52, - 106, 16, 31, 224, 51, 106, 16, 31, 253, 226, 106, 16, 31, 252, 21, 227, - 58, 106, 16, 31, 218, 13, 106, 16, 31, 218, 12, 106, 16, 31, 224, 188, - 233, 92, 106, 16, 31, 251, 234, 106, 16, 31, 251, 233, 106, 16, 31, 251, - 232, 106, 16, 31, 254, 174, 106, 16, 31, 227, 121, 106, 16, 31, 219, 199, - 106, 16, 31, 217, 49, 106, 16, 31, 242, 198, 106, 16, 31, 214, 15, 106, - 16, 31, 225, 142, 106, 16, 31, 251, 70, 106, 16, 31, 216, 58, 106, 16, - 31, 251, 46, 231, 6, 106, 16, 31, 222, 143, 68, 235, 172, 106, 16, 31, - 251, 80, 106, 16, 31, 216, 190, 106, 16, 31, 219, 107, 216, 190, 106, 16, - 31, 233, 19, 106, 16, 31, 220, 3, 106, 16, 31, 215, 119, 106, 16, 31, - 241, 95, 246, 140, 106, 16, 31, 254, 13, 106, 16, 31, 225, 150, 254, 13, - 106, 16, 31, 251, 195, 106, 16, 31, 225, 141, 251, 195, 106, 16, 31, 254, - 171, 106, 16, 31, 219, 71, 218, 240, 219, 70, 106, 16, 31, 219, 71, 218, - 240, 219, 69, 106, 16, 31, 219, 27, 106, 16, 31, 225, 116, 106, 16, 31, - 247, 254, 106, 16, 31, 248, 0, 106, 16, 31, 247, 255, 106, 16, 31, 225, - 53, 106, 16, 31, 225, 43, 106, 16, 31, 249, 185, 106, 16, 31, 249, 184, - 106, 16, 31, 249, 183, 106, 16, 31, 249, 182, 106, 16, 31, 249, 181, 106, - 16, 31, 254, 204, 106, 16, 31, 252, 165, 68, 232, 27, 106, 16, 31, 252, - 165, 68, 214, 255, 106, 16, 31, 223, 243, 106, 16, 31, 241, 87, 106, 16, - 31, 229, 107, 106, 16, 31, 248, 212, 106, 16, 31, 231, 18, 106, 16, 31, - 157, 246, 170, 106, 16, 31, 157, 227, 38, 9, 13, 240, 212, 9, 13, 240, - 211, 9, 13, 240, 210, 9, 13, 240, 209, 9, 13, 240, 208, 9, 13, 240, 207, - 9, 13, 240, 206, 9, 13, 240, 205, 9, 13, 240, 204, 9, 13, 240, 203, 9, - 13, 240, 202, 9, 13, 240, 201, 9, 13, 240, 200, 9, 13, 240, 199, 9, 13, - 240, 198, 9, 13, 240, 197, 9, 13, 240, 196, 9, 13, 240, 195, 9, 13, 240, - 194, 9, 13, 240, 193, 9, 13, 240, 192, 9, 13, 240, 191, 9, 13, 240, 190, - 9, 13, 240, 189, 9, 13, 240, 188, 9, 13, 240, 187, 9, 13, 240, 186, 9, - 13, 240, 185, 9, 13, 240, 184, 9, 13, 240, 183, 9, 13, 240, 182, 9, 13, - 240, 181, 9, 13, 240, 180, 9, 13, 240, 179, 9, 13, 240, 178, 9, 13, 240, - 177, 9, 13, 240, 176, 9, 13, 240, 175, 9, 13, 240, 174, 9, 13, 240, 173, - 9, 13, 240, 172, 9, 13, 240, 171, 9, 13, 240, 170, 9, 13, 240, 169, 9, - 13, 240, 168, 9, 13, 240, 167, 9, 13, 240, 166, 9, 13, 240, 165, 9, 13, - 240, 164, 9, 13, 240, 163, 9, 13, 240, 162, 9, 13, 240, 161, 9, 13, 240, - 160, 9, 13, 240, 159, 9, 13, 240, 158, 9, 13, 240, 157, 9, 13, 240, 156, - 9, 13, 240, 155, 9, 13, 240, 154, 9, 13, 240, 153, 9, 13, 240, 152, 9, - 13, 240, 151, 9, 13, 240, 150, 9, 13, 240, 149, 9, 13, 240, 148, 9, 13, - 240, 147, 9, 13, 240, 146, 9, 13, 240, 145, 9, 13, 240, 144, 9, 13, 240, - 143, 9, 13, 240, 142, 9, 13, 240, 141, 9, 13, 240, 140, 9, 13, 240, 139, - 9, 13, 240, 138, 9, 13, 240, 137, 9, 13, 240, 136, 9, 13, 240, 135, 9, - 13, 240, 134, 9, 13, 240, 133, 9, 13, 240, 132, 9, 13, 240, 131, 9, 13, - 240, 130, 9, 13, 240, 129, 9, 13, 240, 128, 9, 13, 240, 127, 9, 13, 240, - 126, 9, 13, 240, 125, 9, 13, 240, 124, 9, 13, 240, 123, 9, 13, 240, 122, - 9, 13, 240, 121, 9, 13, 240, 120, 9, 13, 240, 119, 9, 13, 240, 118, 9, - 13, 240, 117, 9, 13, 240, 116, 9, 13, 240, 115, 9, 13, 240, 114, 9, 13, - 240, 113, 9, 13, 240, 112, 9, 13, 240, 111, 9, 13, 240, 110, 9, 13, 240, - 109, 9, 13, 240, 108, 9, 13, 240, 107, 9, 13, 240, 106, 9, 13, 240, 105, - 9, 13, 240, 104, 9, 13, 240, 103, 9, 13, 240, 102, 9, 13, 240, 101, 9, - 13, 240, 100, 9, 13, 240, 99, 9, 13, 240, 98, 9, 13, 240, 97, 9, 13, 240, - 96, 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, 233, 212, 218, 47, 128, 219, 225, 128, 245, 119, 79, 128, - 224, 178, 79, 128, 51, 53, 128, 247, 207, 53, 128, 226, 93, 53, 128, 254, - 162, 128, 254, 97, 128, 43, 226, 168, 128, 47, 226, 168, 128, 254, 3, - 128, 95, 53, 128, 250, 23, 128, 241, 20, 128, 244, 64, 219, 83, 128, 219, - 250, 128, 21, 212, 79, 128, 21, 118, 128, 21, 112, 128, 21, 170, 128, 21, - 167, 128, 21, 185, 128, 21, 192, 128, 21, 200, 128, 21, 198, 128, 21, - 203, 128, 250, 30, 128, 221, 93, 128, 233, 137, 53, 128, 245, 182, 53, - 128, 242, 228, 53, 128, 224, 193, 79, 128, 250, 22, 253, 249, 128, 7, 6, - 1, 63, 128, 7, 6, 1, 253, 201, 128, 7, 6, 1, 251, 121, 128, 7, 6, 1, 249, - 125, 128, 7, 6, 1, 77, 128, 7, 6, 1, 245, 95, 128, 7, 6, 1, 244, 41, 128, - 7, 6, 1, 242, 162, 128, 7, 6, 1, 75, 128, 7, 6, 1, 236, 3, 128, 7, 6, 1, - 235, 141, 128, 7, 6, 1, 155, 128, 7, 6, 1, 184, 128, 7, 6, 1, 206, 128, - 7, 6, 1, 78, 128, 7, 6, 1, 227, 11, 128, 7, 6, 1, 225, 19, 128, 7, 6, 1, - 152, 128, 7, 6, 1, 196, 128, 7, 6, 1, 218, 113, 128, 7, 6, 1, 72, 128, 7, - 6, 1, 211, 211, 128, 7, 6, 1, 214, 85, 128, 7, 6, 1, 213, 169, 128, 7, 6, - 1, 213, 108, 128, 7, 6, 1, 212, 152, 128, 43, 42, 125, 128, 223, 237, - 219, 250, 128, 47, 42, 125, 128, 250, 91, 255, 46, 128, 117, 233, 83, - 128, 242, 234, 255, 46, 128, 7, 4, 1, 63, 128, 7, 4, 1, 253, 201, 128, 7, - 4, 1, 251, 121, 128, 7, 4, 1, 249, 125, 128, 7, 4, 1, 77, 128, 7, 4, 1, - 245, 95, 128, 7, 4, 1, 244, 41, 128, 7, 4, 1, 242, 162, 128, 7, 4, 1, 75, - 128, 7, 4, 1, 236, 3, 128, 7, 4, 1, 235, 141, 128, 7, 4, 1, 155, 128, 7, - 4, 1, 184, 128, 7, 4, 1, 206, 128, 7, 4, 1, 78, 128, 7, 4, 1, 227, 11, - 128, 7, 4, 1, 225, 19, 128, 7, 4, 1, 152, 128, 7, 4, 1, 196, 128, 7, 4, - 1, 218, 113, 128, 7, 4, 1, 72, 128, 7, 4, 1, 211, 211, 128, 7, 4, 1, 214, - 85, 128, 7, 4, 1, 213, 169, 128, 7, 4, 1, 213, 108, 128, 7, 4, 1, 212, - 152, 128, 43, 249, 163, 125, 128, 66, 233, 83, 128, 47, 249, 163, 125, - 128, 177, 251, 62, 218, 47, 44, 222, 21, 44, 222, 10, 44, 221, 255, 44, - 221, 243, 44, 221, 232, 44, 221, 221, 44, 221, 210, 44, 221, 199, 44, - 221, 188, 44, 221, 180, 44, 221, 179, 44, 221, 178, 44, 221, 177, 44, - 221, 175, 44, 221, 174, 44, 221, 173, 44, 221, 172, 44, 221, 171, 44, - 221, 170, 44, 221, 169, 44, 221, 168, 44, 221, 167, 44, 221, 166, 44, - 221, 164, 44, 221, 163, 44, 221, 162, 44, 221, 161, 44, 221, 160, 44, - 221, 159, 44, 221, 158, 44, 221, 157, 44, 221, 156, 44, 221, 155, 44, - 221, 153, 44, 221, 152, 44, 221, 151, 44, 221, 150, 44, 221, 149, 44, - 221, 148, 44, 221, 147, 44, 221, 146, 44, 221, 145, 44, 221, 144, 44, - 221, 142, 44, 221, 141, 44, 221, 140, 44, 221, 139, 44, 221, 138, 44, - 221, 137, 44, 221, 136, 44, 221, 135, 44, 221, 134, 44, 221, 133, 44, - 221, 131, 44, 221, 130, 44, 221, 129, 44, 221, 128, 44, 221, 127, 44, - 221, 126, 44, 221, 125, 44, 221, 124, 44, 221, 123, 44, 221, 122, 44, - 221, 120, 44, 221, 119, 44, 221, 118, 44, 221, 117, 44, 221, 116, 44, - 221, 115, 44, 221, 114, 44, 221, 113, 44, 221, 112, 44, 221, 111, 44, - 221, 109, 44, 221, 108, 44, 221, 107, 44, 221, 106, 44, 221, 105, 44, - 221, 104, 44, 221, 103, 44, 221, 102, 44, 221, 101, 44, 221, 100, 44, - 222, 97, 44, 222, 96, 44, 222, 95, 44, 222, 94, 44, 222, 93, 44, 222, 92, - 44, 222, 91, 44, 222, 90, 44, 222, 89, 44, 222, 88, 44, 222, 86, 44, 222, - 85, 44, 222, 84, 44, 222, 83, 44, 222, 82, 44, 222, 81, 44, 222, 80, 44, - 222, 79, 44, 222, 78, 44, 222, 77, 44, 222, 75, 44, 222, 74, 44, 222, 73, - 44, 222, 72, 44, 222, 71, 44, 222, 70, 44, 222, 69, 44, 222, 68, 44, 222, - 67, 44, 222, 66, 44, 222, 64, 44, 222, 63, 44, 222, 62, 44, 222, 61, 44, - 222, 60, 44, 222, 59, 44, 222, 58, 44, 222, 57, 44, 222, 56, 44, 222, 55, - 44, 222, 53, 44, 222, 52, 44, 222, 51, 44, 222, 50, 44, 222, 49, 44, 222, - 48, 44, 222, 47, 44, 222, 46, 44, 222, 45, 44, 222, 44, 44, 222, 42, 44, - 222, 41, 44, 222, 40, 44, 222, 39, 44, 222, 38, 44, 222, 37, 44, 222, 36, - 44, 222, 35, 44, 222, 34, 44, 222, 33, 44, 222, 31, 44, 222, 30, 44, 222, - 29, 44, 222, 28, 44, 222, 27, 44, 222, 26, 44, 222, 25, 44, 222, 24, 44, - 222, 23, 44, 222, 22, 44, 222, 20, 44, 222, 19, 44, 222, 18, 44, 222, 17, - 44, 222, 16, 44, 222, 15, 44, 222, 14, 44, 222, 13, 44, 222, 12, 44, 222, - 11, 44, 222, 9, 44, 222, 8, 44, 222, 7, 44, 222, 6, 44, 222, 5, 44, 222, - 4, 44, 222, 3, 44, 222, 2, 44, 222, 1, 44, 222, 0, 44, 221, 254, 44, 221, - 253, 44, 221, 252, 44, 221, 251, 44, 221, 250, 44, 221, 249, 44, 221, - 248, 44, 221, 247, 44, 221, 246, 44, 221, 245, 44, 221, 242, 44, 221, - 241, 44, 221, 240, 44, 221, 239, 44, 221, 238, 44, 221, 237, 44, 221, - 236, 44, 221, 235, 44, 221, 234, 44, 221, 233, 44, 221, 231, 44, 221, - 230, 44, 221, 229, 44, 221, 228, 44, 221, 227, 44, 221, 226, 44, 221, - 225, 44, 221, 224, 44, 221, 223, 44, 221, 222, 44, 221, 220, 44, 221, - 219, 44, 221, 218, 44, 221, 217, 44, 221, 216, 44, 221, 215, 44, 221, - 214, 44, 221, 213, 44, 221, 212, 44, 221, 211, 44, 221, 209, 44, 221, - 208, 44, 221, 207, 44, 221, 206, 44, 221, 205, 44, 221, 204, 44, 221, - 203, 44, 221, 202, 44, 221, 201, 44, 221, 200, 44, 221, 198, 44, 221, - 197, 44, 221, 196, 44, 221, 195, 44, 221, 194, 44, 221, 193, 44, 221, - 192, 44, 221, 191, 44, 221, 190, 44, 221, 189, 44, 221, 187, 44, 221, - 186, 44, 221, 185, 44, 221, 184, 44, 221, 183, 44, 221, 182, 44, 221, - 181, 7, 6, 1, 243, 89, 7, 4, 1, 243, 89, 158, 1, 233, 45, 202, 1, 244, - 133, 244, 125, 202, 1, 244, 133, 244, 246, 202, 1, 223, 146, 202, 1, 233, - 26, 61, 156, 252, 15, 220, 204, 243, 55, 231, 129, 223, 228, 8, 3, 236, - 17, 79, 225, 110, 244, 109, 31, 66, 47, 69, 233, 142, 125, 48, 27, 16, - 244, 71, 220, 49, 250, 133, 214, 247, 7, 6, 1, 111, 2, 232, 111, 22, 209, - 7, 4, 1, 111, 2, 232, 111, 22, 209, 7, 6, 1, 154, 2, 66, 233, 84, 55, 7, - 4, 1, 154, 2, 66, 233, 84, 55, 7, 6, 1, 154, 2, 66, 233, 84, 252, 90, 22, - 209, 7, 4, 1, 154, 2, 66, 233, 84, 252, 90, 22, 209, 7, 6, 1, 154, 2, 66, - 233, 84, 252, 90, 22, 138, 7, 4, 1, 154, 2, 66, 233, 84, 252, 90, 22, - 138, 7, 6, 1, 154, 2, 250, 91, 22, 232, 110, 7, 4, 1, 154, 2, 250, 91, - 22, 232, 110, 7, 6, 1, 154, 2, 250, 91, 22, 251, 34, 7, 4, 1, 154, 2, - 250, 91, 22, 251, 34, 7, 6, 1, 241, 7, 2, 232, 111, 22, 209, 7, 4, 1, - 241, 7, 2, 232, 111, 22, 209, 7, 4, 1, 241, 7, 2, 62, 74, 22, 138, 7, 4, - 1, 229, 229, 2, 217, 56, 50, 7, 6, 1, 141, 2, 66, 233, 84, 55, 7, 4, 1, - 141, 2, 66, 233, 84, 55, 7, 6, 1, 141, 2, 66, 233, 84, 252, 90, 22, 209, - 7, 4, 1, 141, 2, 66, 233, 84, 252, 90, 22, 209, 7, 6, 1, 141, 2, 66, 233, - 84, 252, 90, 22, 138, 7, 4, 1, 141, 2, 66, 233, 84, 252, 90, 22, 138, 7, - 6, 1, 223, 29, 2, 66, 233, 84, 55, 7, 4, 1, 223, 29, 2, 66, 233, 84, 55, - 7, 6, 1, 103, 2, 232, 111, 22, 209, 7, 4, 1, 103, 2, 232, 111, 22, 209, - 7, 6, 1, 111, 2, 227, 128, 22, 138, 7, 4, 1, 111, 2, 227, 128, 22, 138, - 7, 6, 1, 111, 2, 227, 128, 22, 177, 7, 4, 1, 111, 2, 227, 128, 22, 177, - 7, 6, 1, 154, 2, 227, 128, 22, 138, 7, 4, 1, 154, 2, 227, 128, 22, 138, - 7, 6, 1, 154, 2, 227, 128, 22, 177, 7, 4, 1, 154, 2, 227, 128, 22, 177, - 7, 6, 1, 154, 2, 62, 74, 22, 138, 7, 4, 1, 154, 2, 62, 74, 22, 138, 7, 6, - 1, 154, 2, 62, 74, 22, 177, 7, 4, 1, 154, 2, 62, 74, 22, 177, 7, 4, 1, - 241, 7, 2, 62, 74, 22, 209, 7, 4, 1, 241, 7, 2, 62, 74, 22, 177, 7, 6, 1, - 241, 7, 2, 227, 128, 22, 138, 7, 4, 1, 241, 7, 2, 227, 128, 22, 62, 74, - 22, 138, 7, 6, 1, 241, 7, 2, 227, 128, 22, 177, 7, 4, 1, 241, 7, 2, 227, - 128, 22, 62, 74, 22, 177, 7, 6, 1, 236, 4, 2, 177, 7, 4, 1, 236, 4, 2, - 62, 74, 22, 177, 7, 6, 1, 234, 13, 2, 177, 7, 4, 1, 234, 13, 2, 177, 7, - 6, 1, 232, 183, 2, 177, 7, 4, 1, 232, 183, 2, 177, 7, 6, 1, 224, 148, 2, - 177, 7, 4, 1, 224, 148, 2, 177, 7, 6, 1, 103, 2, 227, 128, 22, 138, 7, 4, - 1, 103, 2, 227, 128, 22, 138, 7, 6, 1, 103, 2, 227, 128, 22, 177, 7, 4, - 1, 103, 2, 227, 128, 22, 177, 7, 6, 1, 103, 2, 232, 111, 22, 138, 7, 4, - 1, 103, 2, 232, 111, 22, 138, 7, 6, 1, 103, 2, 232, 111, 22, 177, 7, 4, - 1, 103, 2, 232, 111, 22, 177, 7, 4, 1, 255, 21, 2, 209, 7, 4, 1, 210, - 141, 2, 209, 7, 4, 1, 210, 141, 2, 138, 7, 4, 1, 216, 66, 215, 86, 2, - 209, 7, 4, 1, 216, 66, 215, 86, 2, 138, 7, 4, 1, 222, 137, 2, 209, 7, 4, - 1, 222, 137, 2, 138, 7, 4, 1, 241, 156, 222, 137, 2, 209, 7, 4, 1, 241, - 156, 222, 137, 2, 138, 142, 1, 234, 227, 36, 120, 235, 141, 36, 120, 229, - 228, 36, 120, 251, 121, 36, 120, 228, 66, 36, 120, 216, 131, 36, 120, - 229, 7, 36, 120, 218, 113, 36, 120, 206, 36, 120, 227, 11, 36, 120, 184, - 36, 120, 213, 108, 36, 120, 152, 36, 120, 155, 36, 120, 211, 211, 36, - 120, 233, 46, 36, 120, 233, 55, 36, 120, 223, 116, 36, 120, 228, 247, 36, - 120, 236, 3, 36, 120, 221, 49, 36, 120, 219, 177, 36, 120, 196, 36, 120, - 242, 162, 36, 120, 234, 96, 36, 3, 235, 128, 36, 3, 234, 212, 36, 3, 234, - 203, 36, 3, 234, 81, 36, 3, 234, 52, 36, 3, 235, 44, 36, 3, 235, 43, 36, - 3, 235, 108, 36, 3, 234, 148, 36, 3, 234, 130, 36, 3, 235, 57, 36, 3, - 229, 225, 36, 3, 229, 178, 36, 3, 229, 174, 36, 3, 229, 143, 36, 3, 229, - 136, 36, 3, 229, 214, 36, 3, 229, 212, 36, 3, 229, 223, 36, 3, 229, 155, - 36, 3, 229, 150, 36, 3, 229, 216, 36, 3, 251, 87, 36, 3, 250, 111, 36, 3, - 250, 101, 36, 3, 249, 176, 36, 3, 249, 148, 36, 3, 250, 247, 36, 3, 250, - 239, 36, 3, 251, 78, 36, 3, 250, 42, 36, 3, 249, 236, 36, 3, 251, 22, 36, - 3, 228, 63, 36, 3, 228, 49, 36, 3, 228, 44, 36, 3, 228, 29, 36, 3, 228, - 22, 36, 3, 228, 56, 36, 3, 228, 55, 36, 3, 228, 61, 36, 3, 228, 35, 36, - 3, 228, 33, 36, 3, 228, 59, 36, 3, 216, 127, 36, 3, 216, 107, 36, 3, 216, - 106, 36, 3, 216, 95, 36, 3, 216, 92, 36, 3, 216, 123, 36, 3, 216, 122, - 36, 3, 216, 126, 36, 3, 216, 105, 36, 3, 216, 104, 36, 3, 216, 125, 36, - 3, 229, 5, 36, 3, 228, 249, 36, 3, 228, 248, 36, 3, 228, 232, 36, 3, 228, - 231, 36, 3, 229, 2, 36, 3, 229, 1, 36, 3, 229, 4, 36, 3, 228, 234, 36, 3, - 228, 233, 36, 3, 229, 3, 36, 3, 218, 63, 36, 3, 217, 84, 36, 3, 217, 70, - 36, 3, 216, 90, 36, 3, 216, 57, 36, 3, 217, 242, 36, 3, 217, 232, 36, 3, - 218, 42, 36, 3, 109, 36, 3, 216, 243, 36, 3, 218, 5, 36, 3, 230, 112, 36, - 3, 229, 128, 36, 3, 229, 103, 36, 3, 228, 135, 36, 3, 228, 78, 36, 3, - 229, 254, 36, 3, 229, 251, 36, 3, 230, 99, 36, 3, 228, 228, 36, 3, 228, - 218, 36, 3, 230, 76, 36, 3, 226, 251, 36, 3, 226, 20, 36, 3, 225, 239, - 36, 3, 225, 71, 36, 3, 225, 42, 36, 3, 226, 132, 36, 3, 226, 122, 36, 3, - 226, 235, 36, 3, 225, 186, 36, 3, 225, 165, 36, 3, 226, 144, 36, 3, 232, - 114, 36, 3, 231, 112, 36, 3, 231, 84, 36, 3, 230, 242, 36, 3, 230, 194, - 36, 3, 231, 226, 36, 3, 231, 215, 36, 3, 232, 81, 36, 3, 231, 45, 36, 3, - 231, 16, 36, 3, 232, 13, 36, 3, 213, 94, 36, 3, 213, 0, 36, 3, 212, 247, - 36, 3, 212, 204, 36, 3, 212, 173, 36, 3, 213, 39, 36, 3, 213, 36, 36, 3, - 213, 73, 36, 3, 212, 236, 36, 3, 212, 221, 36, 3, 213, 47, 36, 3, 224, - 109, 36, 3, 223, 222, 36, 3, 223, 170, 36, 3, 223, 77, 36, 3, 223, 49, - 36, 3, 224, 55, 36, 3, 224, 35, 36, 3, 224, 92, 36, 3, 223, 146, 36, 3, - 223, 133, 36, 3, 224, 63, 36, 3, 233, 254, 36, 3, 233, 111, 36, 3, 233, - 97, 36, 3, 232, 230, 36, 3, 232, 205, 36, 3, 233, 180, 36, 3, 233, 172, - 36, 3, 233, 231, 36, 3, 233, 26, 36, 3, 232, 254, 36, 3, 233, 196, 36, 3, - 215, 7, 36, 3, 214, 159, 36, 3, 214, 147, 36, 3, 214, 103, 36, 3, 214, - 96, 36, 3, 214, 237, 36, 3, 214, 232, 36, 3, 215, 5, 36, 3, 214, 123, 36, - 3, 214, 112, 36, 3, 214, 243, 36, 3, 233, 44, 36, 3, 233, 39, 36, 3, 233, - 38, 36, 3, 233, 35, 36, 3, 233, 34, 36, 3, 233, 41, 36, 3, 233, 40, 36, - 3, 233, 43, 36, 3, 233, 37, 36, 3, 233, 36, 36, 3, 233, 42, 36, 3, 233, - 53, 36, 3, 233, 48, 36, 3, 233, 47, 36, 3, 233, 31, 36, 3, 233, 30, 36, - 3, 233, 50, 36, 3, 233, 49, 36, 3, 233, 52, 36, 3, 233, 33, 36, 3, 233, - 32, 36, 3, 233, 51, 36, 3, 223, 114, 36, 3, 223, 103, 36, 3, 223, 102, - 36, 3, 223, 96, 36, 3, 223, 89, 36, 3, 223, 110, 36, 3, 223, 109, 36, 3, - 223, 113, 36, 3, 223, 101, 36, 3, 223, 100, 36, 3, 223, 112, 36, 3, 228, - 245, 36, 3, 228, 240, 36, 3, 228, 239, 36, 3, 228, 236, 36, 3, 228, 235, - 36, 3, 228, 242, 36, 3, 228, 241, 36, 3, 228, 244, 36, 3, 228, 238, 36, - 3, 228, 237, 36, 3, 228, 243, 36, 3, 235, 255, 36, 3, 235, 225, 36, 3, - 235, 218, 36, 3, 235, 168, 36, 3, 235, 151, 36, 3, 235, 242, 36, 3, 235, - 240, 36, 3, 235, 251, 36, 3, 235, 185, 36, 3, 235, 176, 36, 3, 235, 245, - 36, 3, 221, 43, 36, 3, 220, 233, 36, 3, 220, 228, 36, 3, 220, 170, 36, 3, - 220, 155, 36, 3, 221, 8, 36, 3, 221, 6, 36, 3, 221, 35, 36, 3, 220, 208, - 36, 3, 220, 202, 36, 3, 221, 16, 36, 3, 219, 175, 36, 3, 219, 145, 36, 3, - 219, 141, 36, 3, 219, 132, 36, 3, 219, 129, 36, 3, 219, 150, 36, 3, 219, - 149, 36, 3, 219, 174, 36, 3, 219, 137, 36, 3, 219, 136, 36, 3, 219, 152, - 36, 3, 222, 225, 36, 3, 220, 136, 36, 3, 220, 120, 36, 3, 219, 41, 36, 3, - 218, 219, 36, 3, 222, 123, 36, 3, 222, 112, 36, 3, 222, 212, 36, 3, 220, - 5, 36, 3, 219, 245, 36, 3, 222, 160, 36, 3, 242, 148, 36, 3, 242, 28, 36, - 3, 242, 10, 36, 3, 241, 74, 36, 3, 241, 55, 36, 3, 242, 85, 36, 3, 242, - 67, 36, 3, 242, 138, 36, 3, 241, 173, 36, 3, 241, 158, 36, 3, 242, 93, - 36, 3, 234, 95, 36, 3, 234, 94, 36, 3, 234, 89, 36, 3, 234, 88, 36, 3, - 234, 85, 36, 3, 234, 84, 36, 3, 234, 91, 36, 3, 234, 90, 36, 3, 234, 93, - 36, 3, 234, 87, 36, 3, 234, 86, 36, 3, 234, 92, 36, 3, 220, 176, 99, 1, - 216, 1, 67, 120, 5, 250, 37, 183, 67, 120, 5, 250, 37, 234, 250, 67, 120, - 5, 250, 37, 234, 148, 67, 120, 5, 250, 37, 234, 224, 67, 120, 5, 250, 37, - 229, 155, 67, 120, 5, 250, 37, 251, 88, 67, 120, 5, 250, 37, 250, 215, - 67, 120, 5, 250, 37, 250, 42, 67, 120, 5, 250, 37, 250, 146, 67, 120, 5, - 250, 37, 228, 35, 67, 120, 5, 250, 37, 249, 30, 67, 120, 5, 250, 37, 216, - 116, 67, 120, 5, 250, 37, 247, 220, 67, 120, 5, 250, 37, 216, 111, 67, - 120, 5, 250, 37, 207, 67, 120, 5, 250, 37, 218, 66, 67, 120, 5, 250, 37, - 217, 174, 67, 120, 5, 250, 37, 109, 67, 120, 5, 250, 37, 217, 122, 67, - 120, 5, 250, 37, 228, 228, 67, 120, 5, 250, 37, 252, 234, 67, 120, 5, - 250, 37, 226, 59, 67, 120, 5, 250, 37, 225, 186, 67, 120, 5, 250, 37, - 226, 33, 67, 120, 5, 250, 37, 231, 45, 67, 120, 5, 250, 37, 212, 236, 67, - 120, 5, 250, 37, 223, 146, 67, 120, 5, 250, 37, 233, 26, 67, 120, 5, 250, - 37, 214, 123, 67, 120, 5, 250, 37, 221, 47, 67, 120, 5, 250, 37, 219, - 176, 67, 120, 5, 250, 37, 222, 227, 67, 120, 5, 250, 37, 162, 67, 120, 5, - 250, 37, 233, 255, 67, 30, 5, 250, 37, 225, 11, 67, 236, 101, 30, 5, 250, - 37, 224, 210, 67, 236, 101, 30, 5, 250, 37, 223, 37, 67, 236, 101, 30, 5, - 250, 37, 223, 30, 67, 236, 101, 30, 5, 250, 37, 224, 248, 67, 30, 5, 227, - 107, 67, 30, 5, 255, 65, 136, 1, 252, 47, 229, 226, 136, 1, 252, 47, 229, - 178, 136, 1, 252, 47, 229, 143, 136, 1, 252, 47, 229, 214, 136, 1, 252, - 47, 229, 155, 56, 1, 252, 47, 229, 226, 56, 1, 252, 47, 229, 178, 56, 1, - 252, 47, 229, 143, 56, 1, 252, 47, 229, 214, 56, 1, 252, 47, 229, 155, - 56, 1, 254, 229, 250, 247, 56, 1, 254, 229, 216, 90, 56, 1, 254, 229, - 109, 56, 1, 254, 229, 227, 11, 59, 1, 245, 109, 245, 108, 249, 244, 161, - 134, 59, 1, 245, 108, 245, 109, 249, 244, 161, 134, + 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[] = { @@ -13285,488 +13824,488 @@ 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, 219, 17, 220, 221, 222, 223, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 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[] = { @@ -13774,1228 +14313,1217 @@ 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, 355, 359, 364, - 367, 370, 373, 376, 379, 382, 384, 387, 393, 401, 404, 408, 411, 413, - 416, 419, 422, 425, 429, 432, 435, 439, 441, 444, 450, 458, 465, 472, - 479, 484, 490, 496, 503, 509, 516, 524, 529, 537, 543, 549, 556, 563, - 570, 577, 585, 593, 598, 605, 611, 617, 624, 630, 637, 640, 646, 652, - 658, 665, 672, 679, 684, 690, 696, 702, 709, 715, 722, 730, 735, 743, - 749, 755, 762, 769, 776, 783, 791, 799, 804, 811, 817, 823, 830, 836, - 843, 846, 852, 858, 864, 871, 878, 885, 890, 898, 905, 912, 919, 926, - 933, 940, 947, 954, 962, 970, 978, 986, 994, 1002, 1010, 1018, 1025, - 1032, 1039, 1046, 1053, 1060, 1067, 1074, 1081, 1088, 1095, 1102, 1110, - 1118, 1126, 1134, 1142, 1150, 1158, 1166, 1174, 1182, 1189, 1196, 1203, - 1210, 1218, 1226, 1234, 1242, 1250, 1258, 1266, 1272, 1277, 1282, 1290, - 1298, 1306, 1314, 1319, 1326, 1333, 1341, 1349, 1357, 1365, 1375, 1385, - 1392, 1399, 1406, 1413, 1421, 1429, 1437, 1445, 1456, 1461, 1466, 1473, - 1480, 1487, 1494, 1501, 1508, 1513, 1518, 1525, 1532, 1540, 1548, 1556, - 1564, 1571, 1578, 1586, 1594, 1602, 1610, 1618, 1626, 1634, 1642, 1650, - 1658, 1665, 1672, 1678, 1684, 1691, 1698, 1705, 1712, 1720, 1728, 1735, - 1742, 1749, 1756, 1764, 1772, 1780, 1788, 1796, 1803, 1810, 1818, 1826, - 1834, 1842, 1847, 1853, 1859, 1866, 1873, 1878, 1883, 1888, 1895, 1902, - 1909, 1916, 1924, 1932, 1939, 1945, 1950, 1955, 1962, 1969, 1976, 1981, - 1986, 1991, 1998, 2005, 2012, 2019, 2026, 2032, 2040, 2050, 2058, 2065, - 2072, 2077, 2082, 2089, 2096, 2100, 2105, 2110, 2115, 2123, 2132, 2139, - 2146, 2155, 2162, 2169, 2174, 2181, 2188, 2195, 2202, 2209, 2214, 2221, - 2228, 2236, 2241, 2246, 2251, 2261, 2265, 2271, 2277, 2283, 2289, 2297, - 2310, 2318, 2323, 2333, 2338, 2343, 2353, 2358, 2365, 2372, 2380, 2388, - 2395, 2402, 2409, 2416, 2426, 2436, 2445, 2454, 2464, 2474, 2483, 2492, - 2498, 2508, 2518, 2528, 2538, 2546, 2554, 2561, 2568, 2576, 2584, 2592, - 2600, 2607, 2614, 2624, 2634, 2642, 2650, 2658, 2663, 2673, 2678, 2685, - 2692, 2697, 2702, 2709, 2716, 2726, 2736, 2743, 2750, 2759, 2768, 2775, - 2782, 2791, 2800, 2807, 2814, 2823, 2832, 2840, 2848, 2858, 2868, 2875, - 2882, 2891, 2900, 2908, 2916, 2926, 2936, 2943, 2950, 2959, 2968, 2977, - 2986, 2995, 3004, 3009, 3014, 3022, 3030, 3040, 3048, 3053, 3058, 3065, - 3072, 3079, 3086, 3093, 3100, 3110, 3120, 3130, 3140, 3147, 3154, 3164, - 3174, 3182, 3190, 3198, 3206, 3214, 3221, 3228, 3235, 3241, 3248, 3255, - 3262, 3271, 3281, 3291, 3298, 3305, 3311, 3316, 3323, 3329, 3335, 3342, - 3349, 3360, 3370, 3377, 3384, 3391, 3398, 3404, 3409, 3416, 3422, 3427, - 3435, 3443, 3450, 3456, 3461, 3468, 3473, 3480, 3489, 3498, 3507, 3514, - 3520, 3526, 3531, 3538, 3545, 3552, 3559, 3566, 3571, 3576, 3585, 3593, - 3602, 3607, 3613, 3624, 3631, 3639, 3648, 3653, 3659, 3665, 3672, 3677, - 3683, 3694, 3703, 3712, 3720, 3728, 3738, 3743, 3750, 3757, 3762, 3774, - 3783, 3791, 3798, 3807, 3812, 3817, 3824, 3831, 3838, 3845, 3851, 3860, - 3868, 3873, 3881, 3887, 3895, 3903, 3909, 3915, 3921, 3928, 3936, 3942, - 3950, 3957, 3962, 3969, 3977, 3987, 3994, 4001, 4011, 4018, 4025, 4035, - 4042, 4049, 4056, 4062, 4068, 4078, 4091, 4096, 4103, 4108, 4112, 4118, - 4127, 4134, 4139, 4144, 4148, 4153, 4159, 4163, 4169, 4175, 4181, 4187, - 4195, 4200, 4205, 4210, 4215, 4221, 4223, 4228, 4232, 4238, 4244, 4250, - 4255, 4262, 4269, 4275, 4282, 4290, 4298, 4303, 4308, 4312, 4317, 4319, - 4321, 4324, 4326, 4328, 4333, 4338, 4344, 4349, 4353, 4357, 4362, 4371, - 4377, 4382, 4388, 4393, 4399, 4407, 4415, 4419, 4423, 4428, 4434, 4440, - 4446, 4452, 4457, 4465, 4474, 4483, 4487, 4493, 4500, 4507, 4514, 4521, - 4525, 4530, 4535, 4540, 4545, 4550, 4552, 4555, 4558, 4561, 4564, 4567, - 4571, 4575, 4581, 4584, 4589, 4595, 4601, 4604, 4609, 4615, 4619, 4625, - 4631, 4637, 4643, 4648, 4653, 4658, 4661, 4667, 4672, 4677, 4681, 4686, - 4692, 4698, 4701, 4705, 4709, 4713, 4716, 4719, 4724, 4728, 4735, 4739, - 4745, 4749, 4755, 4759, 4763, 4767, 4772, 4777, 4784, 4790, 4797, 4803, - 4809, 4815, 4818, 4822, 4826, 4829, 4833, 4838, 4843, 4847, 4851, 4857, - 4861, 4865, 4870, 4876, 4881, 4887, 4891, 4898, 4903, 4908, 4913, 4918, - 4924, 4927, 4931, 4936, 4941, 4950, 4956, 4961, 4965, 4970, 4974, 4979, - 4983, 4987, 4992, 4995, 5001, 5006, 5011, 5016, 5021, 5026, 5031, 5037, - 5043, 5049, 5054, 5059, 5065, 5071, 5077, 5082, 5087, 5094, 5101, 5105, - 5111, 5118, 0, 0, 5125, 5128, 5137, 5146, 5157, 0, 0, 0, 0, 0, 5161, - 5164, 5169, 5177, 5182, 5190, 5198, 0, 5206, 0, 5214, 5222, 5230, 5241, - 5246, 5251, 5256, 5261, 5266, 5271, 5276, 5281, 5286, 5291, 5296, 5301, - 5306, 5311, 5316, 5321, 0, 5326, 5331, 5336, 5341, 5346, 5351, 5356, - 5361, 5369, 5377, 5385, 5393, 5401, 5409, 5420, 5425, 5430, 5435, 5440, - 5445, 5450, 5455, 5460, 5465, 5470, 5475, 5480, 5485, 5490, 5495, 5500, - 5505, 5511, 5516, 5521, 5526, 5531, 5536, 5541, 5546, 5554, 5562, 5570, - 5578, 5586, 5591, 5595, 5599, 5606, 5616, 5626, 5630, 5634, 5638, 5644, - 5651, 5655, 5660, 5664, 5669, 5673, 5678, 5682, 5687, 5692, 5697, 5702, - 5707, 5712, 5717, 5722, 5727, 5732, 5737, 5742, 5747, 5752, 5757, 5761, - 5765, 5771, 5775, 5780, 5786, 5794, 5799, 5804, 5811, 5816, 5821, 5828, - 5837, 5846, 5857, 5864, 5869, 5874, 5879, 5886, 5891, 5897, 5902, 5907, - 5912, 5917, 5922, 5927, 5934, 5940, 5945, 5949, 5954, 5959, 5964, 5969, - 5974, 5979, 5984, 5988, 5994, 5998, 6003, 6008, 6013, 6017, 6022, 6027, - 6032, 6037, 6041, 6046, 6050, 6055, 6060, 6065, 6070, 6076, 6081, 6087, - 6091, 6096, 6100, 6104, 6109, 6114, 6119, 6124, 6129, 6134, 6139, 6143, - 6149, 6153, 6158, 6163, 6168, 6172, 6177, 6182, 6187, 6192, 6196, 6201, - 6205, 6210, 6215, 6220, 6225, 6231, 6236, 6242, 6246, 6251, 6255, 6262, - 6267, 6272, 6277, 6284, 6289, 6295, 6300, 6305, 6310, 6315, 6320, 6325, - 6332, 6338, 6343, 6348, 6353, 6358, 6363, 6369, 6375, 6382, 6389, 6398, - 6407, 6414, 6421, 6430, 6439, 6444, 6449, 6454, 6459, 6464, 6469, 6474, - 6479, 6490, 6501, 6506, 6511, 6518, 6525, 6533, 6541, 6546, 6551, 6556, - 6561, 6565, 6569, 6573, 6579, 6585, 6589, 6596, 6601, 6611, 6621, 6627, - 6633, 6641, 6649, 6657, 6665, 6672, 6679, 6688, 6697, 6705, 6713, 6721, - 6729, 6737, 6745, 6753, 6761, 6768, 6775, 6781, 6787, 6795, 6803, 6810, - 6817, 6826, 6835, 6841, 6847, 6855, 6863, 6871, 6879, 6885, 6891, 6899, - 6907, 6915, 6923, 6930, 6937, 6945, 6953, 6961, 6969, 6974, 6979, 6986, - 6993, 7003, 7013, 7017, 7025, 7033, 7040, 7047, 7055, 7063, 7070, 7077, - 7085, 7093, 7100, 7107, 7115, 7123, 7128, 7135, 7142, 7149, 7156, 7162, - 7168, 7176, 7184, 7189, 7194, 7202, 7210, 7218, 7226, 7234, 7242, 7249, - 7256, 7264, 7272, 7280, 7288, 7295, 7302, 7308, 7314, 7323, 7332, 7339, - 7346, 7353, 7360, 7367, 7374, 7381, 7388, 7396, 7404, 7412, 7420, 7428, - 7436, 7446, 7456, 7463, 7470, 7477, 7484, 7491, 7498, 7505, 7512, 7519, - 7526, 7533, 7540, 7547, 7554, 7561, 7568, 7575, 7582, 7589, 7596, 7603, - 7610, 7617, 7624, 7629, 7634, 7639, 7644, 7649, 7654, 7659, 7664, 7669, - 7674, 7680, 7686, 7695, 7704, 7713, 7722, 7730, 7738, 7746, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 7754, 7759, 7764, 7769, 7774, 7779, 7784, 7789, 7794, - 7798, 7803, 7808, 7813, 7818, 7823, 7828, 7833, 7838, 7843, 7848, 7853, - 7858, 7863, 7868, 7873, 7878, 7883, 7888, 7892, 7897, 7902, 7907, 7912, - 7917, 7922, 7927, 7932, 7937, 0, 0, 7942, 7949, 7952, 7956, 7960, 7963, - 7967, 0, 7971, 7976, 7981, 7986, 7991, 7996, 8001, 8006, 8011, 8015, - 8020, 8025, 8030, 8035, 8040, 8045, 8050, 8055, 8060, 8065, 8070, 8075, - 8080, 8085, 8090, 8095, 8100, 8105, 8109, 8114, 8119, 8124, 8129, 8134, - 8139, 8144, 8149, 8154, 8159, 0, 8166, 8171, 0, 0, 0, 0, 0, 0, 8174, - 8179, 8184, 8189, 8196, 8203, 8208, 8213, 8218, 8223, 8228, 8233, 8238, - 8245, 8250, 8257, 8264, 8269, 8276, 8281, 8286, 8291, 8298, 8303, 8308, - 8315, 8324, 8329, 8334, 8339, 8344, 8350, 8355, 8362, 8369, 8376, 8381, - 8386, 8391, 8396, 8401, 8406, 8416, 8421, 8429, 8434, 8439, 8444, 8449, - 8456, 8463, 8470, 8476, 8482, 8489, 0, 0, 0, 0, 0, 0, 0, 0, 8496, 8500, - 8504, 8508, 8512, 8516, 8520, 8524, 8528, 8532, 8536, 8541, 8545, 8549, - 8554, 8558, 8563, 8567, 8571, 8575, 8580, 8584, 8589, 8593, 8597, 8601, - 8605, 0, 0, 0, 0, 0, 8609, 8616, 8624, 8631, 8636, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 8641, 8644, 8648, 8653, 0, 0, 8657, 8663, 8669, 8672, 8679, - 8688, 8691, 8694, 8699, 8705, 8709, 8717, 8723, 8729, 8737, 8741, 8746, - 8757, 8762, 8766, 8770, 8774, 0, 0, 8777, 8784, 8788, 8794, 8798, 8805, - 8811, 8818, 8824, 8830, 8834, 8838, 8844, 8848, 8852, 8856, 8860, 8864, - 8868, 8872, 8876, 8880, 8884, 8888, 8892, 8896, 8900, 8904, 8908, 8912, - 8920, 8928, 8938, 8947, 8956, 8959, 8963, 8967, 8971, 8975, 8979, 8983, - 8987, 8991, 8996, 9000, 9003, 9006, 9009, 9012, 9015, 9018, 9021, 9024, - 9028, 9031, 9034, 9039, 9044, 9050, 9053, 9060, 9069, 9074, 9079, 9086, - 9091, 9096, 9100, 9104, 9108, 9112, 9116, 9120, 9124, 9128, 9132, 9136, - 9141, 9146, 9153, 9159, 9165, 9171, 9176, 9184, 9192, 9197, 9203, 9209, - 9215, 9221, 9225, 9229, 9233, 9240, 9250, 9254, 9258, 9262, 9268, 9276, - 9280, 9284, 9291, 9295, 9299, 9303, 9310, 9317, 9329, 9333, 9337, 9341, - 9351, 9360, 9364, 9372, 9379, 9386, 9395, 9406, 9414, 9418, 9427, 9438, - 9446, 9459, 9467, 9475, 9483, 9491, 9497, 9506, 9513, 9517, 9525, 9529, - 9536, 9544, 9548, 9554, 9561, 9568, 9572, 9580, 9584, 9591, 9595, 9603, - 9607, 9615, 9623, 9630, 9638, 9646, 9653, 9659, 9663, 9670, 9678, 9684, - 9691, 9698, 9704, 9713, 9721, 9728, 9734, 9738, 9741, 9745, 9751, 9759, - 9763, 9769, 9775, 9782, 9789, 9792, 9799, 9804, 9812, 9817, 9821, 9834, - 9847, 9853, 9860, 9865, 9871, 9876, 9882, 9892, 9899, 9908, 9918, 9924, - 9929, 9934, 9938, 9942, 9947, 9952, 9958, 9966, 9974, 9985, 9990, 9999, - 10008, 10015, 10021, 10027, 10033, 10039, 10045, 10051, 10057, 10063, - 10069, 10076, 10083, 10090, 10096, 10104, 10113, 10119, 10126, 10133, - 10138, 10143, 10147, 10154, 10161, 10170, 10179, 10182, 10187, 10192, 0, - 10197, 10201, 10205, 10211, 10215, 10219, 10225, 10229, 10237, 10241, - 10245, 10249, 10253, 10257, 10263, 10267, 10273, 10277, 10281, 10285, - 10289, 10293, 10298, 10301, 10305, 10311, 10315, 10319, 10323, 10327, - 10331, 10337, 10343, 10349, 10353, 10357, 10362, 10366, 10370, 10375, - 10379, 10383, 10390, 10397, 10401, 10405, 10410, 10414, 10418, 10421, - 10426, 10429, 10432, 10437, 10442, 10446, 10450, 10456, 10462, 10465, 0, - 0, 10468, 10474, 10480, 10486, 10496, 10508, 10520, 10537, 10549, 10560, - 10568, 10575, 10586, 10601, 10612, 10618, 10627, 10635, 10647, 10657, - 10665, 10677, 10684, 10692, 10704, 10710, 10716, 10724, 10732, 10740, - 10746, 10756, 10763, 10773, 10783, 10796, 10810, 10824, 10834, 10845, - 10856, 10869, 10882, 10896, 10908, 10920, 10933, 10946, 10958, 10971, - 10980, 10988, 10993, 10998, 11003, 11008, 11013, 11018, 11023, 11028, - 11033, 11038, 11043, 11048, 11053, 11058, 11063, 11068, 11073, 11078, - 11083, 11088, 11093, 11098, 11103, 11108, 11113, 11118, 11123, 11128, - 11133, 11138, 11143, 11148, 11152, 11157, 11162, 11167, 11172, 11177, - 11181, 11185, 11189, 11193, 11197, 11201, 11205, 11209, 11213, 11217, - 11221, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11226, 11231, 11235, - 11239, 11243, 11247, 11251, 11255, 11259, 11263, 11267, 11271, 11276, - 11280, 11284, 11288, 11293, 11297, 11302, 11306, 11311, 11315, 11320, - 11325, 11330, 11335, 11339, 11344, 11349, 11354, 11359, 11363, 11368, - 11375, 11379, 11384, 11388, 11392, 11397, 11401, 11408, 11415, 11422, - 11428, 11436, 11444, 11453, 11461, 11468, 11475, 11483, 11489, 11495, - 11501, 11507, 11514, 11519, 11523, 11528, 0, 0, 0, 0, 0, 11532, 11537, - 11542, 11547, 11552, 11557, 11562, 11567, 11572, 11577, 11582, 11587, - 11592, 11597, 11602, 11607, 11612, 11617, 11622, 11627, 11632, 11637, - 11642, 11647, 11652, 11657, 11662, 11670, 11677, 11683, 11688, 11696, - 11703, 11709, 11716, 11722, 11727, 11734, 11741, 11747, 11752, 11757, - 11763, 11768, 11773, 11779, 0, 0, 11784, 11790, 11796, 11802, 11808, - 11814, 11820, 11825, 11833, 11839, 11845, 11851, 11857, 11863, 11871, 0, - 11877, 11882, 11887, 11892, 11897, 11902, 11907, 11912, 11917, 11922, - 11927, 11932, 11937, 11942, 11947, 11952, 11957, 11962, 11967, 11972, - 11977, 11982, 11987, 11992, 11997, 12002, 12007, 12012, 0, 0, 12017, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12021, 12027, 12031, - 12035, 12039, 12044, 12047, 12051, 12054, 12058, 12061, 12065, 12069, - 12073, 12078, 12083, 12086, 12090, 12095, 12100, 12103, 12107, 12110, - 12114, 12118, 12122, 12126, 12130, 12134, 12138, 12142, 12146, 12150, - 12154, 12158, 12162, 12166, 12170, 12174, 12178, 12182, 12185, 12189, - 12192, 12196, 12200, 12204, 12207, 12210, 12213, 12217, 12221, 12225, - 12229, 12233, 12237, 12241, 12245, 12248, 12253, 12258, 12262, 12266, - 12271, 12275, 12280, 12284, 12289, 12294, 12300, 12306, 12312, 12316, - 12321, 12327, 12333, 12337, 12342, 12346, 12352, 12357, 12360, 12366, - 12372, 12377, 12382, 12389, 12394, 12399, 12403, 12407, 12411, 12415, - 12419, 12423, 12427, 12431, 12436, 12441, 12446, 12452, 12455, 12459, - 12463, 12466, 12469, 12472, 12475, 12478, 12481, 12484, 12487, 12490, - 12494, 12501, 12506, 12510, 12514, 12518, 12522, 0, 12526, 12530, 12534, - 12538, 12542, 12548, 12552, 0, 12556, 12560, 12564, 0, 12568, 12571, - 12575, 12578, 12582, 12585, 12589, 12593, 0, 0, 12597, 12600, 0, 0, - 12604, 12607, 12611, 12614, 12618, 12622, 12626, 12630, 12634, 12638, - 12642, 12646, 12650, 12654, 12658, 12662, 12666, 12670, 12674, 12678, - 12682, 12686, 0, 12689, 12692, 12696, 12700, 12704, 12707, 12710, 0, - 12713, 0, 0, 0, 12717, 12721, 12725, 12729, 0, 0, 12732, 12736, 12740, - 12745, 12749, 12754, 12758, 12763, 12768, 0, 0, 12774, 12778, 0, 0, - 12783, 12787, 12792, 12796, 0, 0, 0, 0, 0, 0, 0, 0, 12802, 0, 0, 0, 0, - 12808, 12812, 0, 12816, 12820, 12825, 12830, 12835, 0, 0, 12841, 12845, - 12848, 12851, 12854, 12857, 12860, 12863, 12866, 12869, 12872, 12881, - 12890, 12894, 12898, 12904, 12910, 12916, 12922, 12936, 12943, 12946, 0, - 0, 0, 0, 0, 12950, 12956, 12960, 0, 12964, 12967, 12971, 12974, 12978, - 12981, 0, 0, 0, 0, 12985, 12989, 0, 0, 12993, 12997, 13001, 13004, 13008, - 13012, 13016, 13020, 13024, 13028, 13032, 13036, 13040, 13044, 13048, - 13052, 13056, 13060, 13064, 13068, 13072, 13076, 0, 13079, 13082, 13086, - 13090, 13094, 13097, 13100, 0, 13103, 13107, 0, 13111, 13115, 0, 13119, - 13123, 0, 0, 13126, 0, 13130, 13135, 13139, 13144, 13148, 0, 0, 0, 0, - 13153, 13158, 0, 0, 13163, 13168, 13173, 0, 0, 0, 13177, 0, 0, 0, 0, 0, - 0, 0, 13181, 13185, 13189, 13193, 0, 13197, 0, 0, 0, 0, 0, 0, 0, 13201, - 13205, 13208, 13211, 13214, 13217, 13220, 13223, 13226, 13229, 13232, - 13235, 13238, 13241, 13244, 13249, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 13253, 13257, 13261, 0, 13265, 13268, 13272, 13275, 13279, 13282, 13286, - 13290, 13294, 0, 13299, 13302, 13306, 0, 13311, 13314, 13318, 13321, - 13325, 13329, 13333, 13337, 13341, 13345, 13349, 13353, 13357, 13361, - 13365, 13369, 13373, 13377, 13381, 13385, 13389, 13393, 0, 13396, 13399, - 13403, 13407, 13411, 13414, 13417, 0, 13420, 13424, 0, 13428, 13432, - 13436, 13440, 13444, 0, 0, 13447, 13451, 13455, 13460, 13464, 13469, - 13473, 13478, 13483, 13489, 0, 13495, 13499, 13504, 0, 13510, 13514, - 13519, 0, 0, 13523, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13526, - 13531, 13536, 13541, 0, 0, 13547, 13551, 13554, 13557, 13560, 13563, - 13566, 13569, 13572, 13575, 0, 13578, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 13582, 13586, 13590, 0, 13594, 13597, 13601, 13604, 13608, - 13611, 13615, 13619, 0, 0, 13623, 13626, 0, 0, 13630, 13633, 13637, - 13640, 13644, 13648, 13652, 13656, 13660, 13664, 13668, 13672, 13676, - 13680, 13684, 13688, 13692, 13696, 13700, 13704, 13708, 13712, 0, 13715, - 13718, 13722, 13726, 13730, 13733, 13736, 0, 13739, 13743, 0, 13747, - 13751, 13755, 13759, 13763, 0, 0, 13766, 13770, 13774, 13779, 13783, - 13788, 13792, 13797, 13802, 0, 0, 13808, 13812, 0, 0, 13817, 13821, - 13826, 0, 0, 0, 0, 0, 0, 0, 0, 13830, 13836, 0, 0, 0, 0, 13842, 13846, 0, - 13850, 13854, 13859, 13864, 13869, 0, 0, 13875, 13879, 13882, 13885, - 13888, 13891, 13894, 13897, 13900, 13903, 13906, 13909, 13913, 13919, - 13925, 13931, 13937, 13943, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13949, 13953, - 0, 13957, 13960, 13964, 13967, 13971, 13974, 0, 0, 0, 13978, 13981, - 13985, 0, 13989, 13992, 13996, 14000, 0, 0, 0, 14003, 14007, 0, 14011, 0, - 14015, 14019, 0, 0, 0, 14023, 14027, 0, 0, 0, 14031, 14034, 14038, 0, 0, - 0, 14041, 14044, 14047, 14050, 14054, 14058, 14062, 14066, 14070, 14074, - 14078, 14082, 0, 0, 0, 0, 14085, 14090, 14094, 14099, 14103, 0, 0, 0, - 14108, 14112, 14117, 0, 14122, 14126, 14131, 14136, 0, 0, 14140, 0, 0, 0, - 0, 0, 0, 14143, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14149, 14153, - 14156, 14159, 14162, 14165, 14168, 14171, 14174, 14177, 14180, 14184, - 14189, 14194, 14198, 14202, 14206, 14210, 14214, 14219, 14223, 0, 0, 0, - 0, 0, 0, 14226, 14230, 14234, 0, 14238, 14241, 14245, 14248, 14252, - 14255, 14259, 14263, 0, 14267, 14270, 14274, 0, 14278, 14281, 14285, - 14289, 14292, 14296, 14300, 14304, 14308, 14312, 14316, 14320, 14324, - 14328, 14332, 14336, 14340, 14344, 14348, 14352, 14356, 14360, 14364, 0, - 14367, 14370, 14374, 14378, 14382, 14385, 14388, 14391, 14395, 14399, 0, - 14403, 14407, 14411, 14415, 14419, 0, 0, 0, 14422, 14426, 14431, 14435, - 14440, 14444, 14449, 14454, 0, 14460, 14464, 14469, 0, 14474, 14478, - 14483, 14488, 0, 0, 0, 0, 0, 0, 0, 14492, 14496, 0, 14502, 14506, 0, 0, - 0, 0, 0, 0, 14510, 14515, 14520, 14525, 0, 0, 14531, 14535, 14538, 14541, - 14544, 14547, 14550, 14553, 14556, 14559, 0, 0, 0, 0, 0, 0, 0, 0, 14562, - 14575, 14587, 14599, 14611, 14623, 14635, 14647, 0, 0, 14651, 14655, 0, - 14659, 14662, 14666, 14669, 14673, 14676, 14680, 14684, 0, 14688, 14691, - 14695, 0, 14699, 14702, 14706, 14710, 14713, 14717, 14721, 14725, 14729, - 14733, 14737, 14741, 14745, 14749, 14753, 14757, 14761, 14765, 14769, - 14773, 14777, 14781, 14785, 0, 14788, 14791, 14795, 14799, 14803, 14806, - 14809, 14812, 14816, 14820, 0, 14824, 14828, 14832, 14836, 14840, 0, 0, - 14843, 14847, 14851, 14856, 14860, 14865, 14869, 14874, 14879, 0, 14885, - 14889, 14894, 0, 14899, 14903, 14908, 14913, 0, 0, 0, 0, 0, 0, 0, 14917, - 14921, 0, 0, 0, 0, 0, 0, 0, 14927, 0, 14931, 14936, 14941, 14946, 0, 0, - 14952, 14956, 14959, 14962, 14965, 14968, 14971, 14974, 14977, 14980, 0, - 14983, 14987, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14991, 14995, - 0, 14999, 15002, 15006, 15009, 15013, 15016, 15020, 15024, 0, 15028, - 15031, 15035, 0, 15039, 15042, 15046, 15050, 15053, 15057, 15061, 15065, - 15069, 15073, 15077, 15081, 15085, 15089, 15093, 15097, 15101, 15105, - 15109, 15113, 15117, 15121, 15125, 15128, 15132, 15135, 15139, 15143, - 15147, 15150, 15153, 15156, 15160, 15164, 15168, 15172, 15176, 15180, - 15184, 15188, 15191, 0, 0, 15195, 15199, 15204, 15208, 15213, 15217, - 15222, 15227, 0, 15233, 15237, 15242, 0, 15247, 15251, 15256, 15261, - 15265, 0, 0, 0, 0, 0, 0, 0, 0, 15270, 0, 0, 0, 0, 0, 0, 0, 0, 15276, - 15281, 15286, 15291, 0, 0, 15297, 15301, 15304, 15307, 15310, 15313, - 15316, 15319, 15322, 15325, 15328, 15332, 15337, 15342, 15348, 15354, 0, - 0, 0, 15360, 15364, 15370, 15375, 15381, 15386, 15392, 0, 0, 15398, - 15402, 0, 15406, 15410, 15414, 15418, 15422, 15426, 15430, 15434, 15438, - 15442, 15446, 15450, 15454, 15458, 15462, 15466, 15470, 15474, 0, 0, 0, - 15478, 15484, 15490, 15496, 15502, 15508, 15514, 15520, 15526, 15532, - 15538, 15544, 15552, 15558, 15564, 15570, 15576, 15582, 15588, 15594, - 15600, 15606, 15612, 15618, 0, 15624, 15630, 15636, 15642, 15648, 15654, - 15658, 15664, 15668, 0, 15672, 0, 0, 15678, 15682, 15688, 15694, 15700, - 15704, 15710, 0, 0, 0, 15714, 0, 0, 0, 0, 15718, 15723, 15730, 15737, - 15744, 15751, 0, 15758, 0, 15765, 15770, 15775, 15782, 15789, 15798, - 15809, 15818, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 15823, 15830, 15837, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15842, 15848, - 15854, 15860, 15866, 15872, 15878, 15884, 15890, 15896, 15902, 15908, - 15914, 15920, 15926, 15932, 15938, 15944, 15950, 15956, 15962, 15968, - 15974, 15980, 15986, 15992, 15998, 16004, 16010, 16016, 16022, 16028, - 16034, 16039, 16045, 16051, 16055, 16061, 16065, 16071, 16077, 16083, - 16089, 16095, 16101, 16106, 16112, 16116, 16121, 16127, 16133, 16139, - 16144, 16150, 16156, 16162, 16167, 16173, 0, 0, 0, 0, 16177, 16183, - 16188, 16194, 16199, 16207, 16215, 16219, 16223, 16227, 16233, 16239, - 16245, 16251, 16255, 16259, 16263, 16267, 16271, 16274, 16277, 16280, - 16283, 16286, 16289, 16292, 16295, 16298, 16302, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 16306, 16310, 0, 16316, 0, 0, 16322, 16326, 0, 16330, 0, - 0, 16336, 0, 0, 0, 0, 0, 0, 16340, 16344, 16347, 16353, 0, 16359, 16363, - 16367, 16371, 16377, 16383, 16389, 0, 16395, 16399, 16403, 0, 16409, 0, - 16415, 0, 0, 16419, 16425, 0, 16431, 16434, 16440, 16443, 16447, 16454, - 16459, 16464, 16468, 16473, 16478, 16483, 16487, 0, 16492, 16499, 16505, - 0, 0, 16511, 16515, 16520, 16524, 16529, 0, 16534, 0, 16539, 16545, - 16551, 16557, 16563, 16567, 0, 0, 16570, 16574, 16577, 16580, 16583, - 16586, 16589, 16592, 16595, 16598, 0, 0, 16601, 16606, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 16611, 16615, 16626, 16641, 16656, 16666, 16677, 16690, - 16701, 16707, 16715, 16725, 16731, 16739, 16743, 16749, 16755, 16763, - 16773, 16781, 16794, 16800, 16808, 16816, 16828, 16835, 16843, 16851, - 16859, 16867, 16875, 16883, 16893, 16897, 16900, 16903, 16906, 16909, - 16912, 16915, 16918, 16921, 16924, 16928, 16932, 16936, 16940, 16944, - 16948, 16952, 16956, 16960, 16965, 16971, 16981, 16995, 17005, 17011, - 17017, 17025, 17033, 17041, 17049, 17055, 17061, 17064, 17068, 17072, - 17076, 17080, 17084, 17088, 0, 17092, 17096, 17100, 17104, 17108, 17112, - 17116, 17120, 17124, 17128, 17132, 17135, 17138, 17142, 17146, 17150, - 17153, 17157, 17161, 17165, 17169, 17173, 17177, 17181, 17185, 17188, - 17191, 17195, 17199, 17203, 17207, 17210, 17213, 17217, 17222, 17226, 0, - 0, 0, 0, 17230, 17235, 17239, 17244, 17248, 17253, 17258, 17264, 17269, - 17275, 17279, 17284, 17288, 17293, 17303, 17309, 17315, 17322, 17332, - 17338, 17342, 17346, 17352, 17358, 17366, 17372, 17380, 17388, 17396, - 17406, 17414, 17424, 17429, 17435, 17441, 17447, 17453, 17459, 17465, 0, - 17471, 17477, 17483, 17489, 17495, 17501, 17507, 17513, 17519, 17525, - 17531, 17536, 17541, 17547, 17553, 17559, 17564, 17570, 17576, 17582, - 17588, 17594, 17600, 17606, 17612, 17617, 17622, 17628, 17634, 17640, - 17646, 17651, 17656, 17662, 17670, 17677, 0, 17684, 17691, 17704, 17711, - 17718, 17726, 17734, 17740, 17746, 17752, 17762, 17767, 17773, 17783, - 17793, 0, 17803, 17813, 17821, 17833, 17845, 17851, 17865, 17880, 17885, - 17890, 17898, 17906, 17914, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17922, - 17925, 17929, 17933, 17937, 17941, 17945, 17949, 17953, 17957, 17961, - 17965, 17969, 17973, 17977, 17981, 17985, 17989, 17993, 17997, 18001, - 18004, 18007, 18011, 18015, 18019, 18022, 18025, 18028, 18032, 18036, - 18040, 18043, 18047, 18050, 18055, 18058, 18062, 18065, 18069, 18072, - 18077, 18080, 18084, 18091, 18096, 18100, 18105, 18109, 18114, 18118, - 18123, 18130, 18136, 18141, 18145, 18149, 18153, 18157, 18161, 18166, - 18171, 18177, 18182, 18188, 18192, 18195, 18198, 18201, 18204, 18207, - 18210, 18213, 18216, 18219, 18225, 18229, 18233, 18237, 18241, 18245, - 18249, 18253, 18257, 18262, 18266, 18271, 18276, 18282, 18287, 18293, - 18299, 18305, 18311, 18317, 18324, 18331, 18339, 18347, 18356, 18365, - 18376, 18386, 18396, 18407, 18418, 18428, 18438, 18448, 18458, 18468, - 18478, 18488, 18498, 18506, 18513, 18519, 18526, 18531, 18537, 18543, - 18549, 18555, 18561, 18567, 18572, 18578, 18584, 18590, 18596, 18601, - 18609, 18616, 18622, 18629, 18637, 18643, 18649, 18655, 18661, 18669, - 18677, 18687, 18695, 18703, 18709, 18714, 18719, 18724, 18729, 18734, - 18739, 18744, 18749, 18754, 18760, 18766, 18772, 18779, 18784, 18790, - 18795, 18800, 18805, 18810, 18815, 18820, 18825, 18830, 18835, 18840, - 18845, 18850, 18855, 18860, 18865, 18870, 18875, 18880, 18885, 18890, - 18895, 18900, 18905, 18910, 18915, 18920, 18925, 18930, 18935, 18940, - 18945, 18950, 18955, 18960, 18965, 18970, 18975, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 18980, 18984, 18988, 18992, 18996, 19000, 19004, 19008, 19012, - 19016, 19020, 19024, 19028, 19032, 19036, 19040, 19044, 19048, 19052, - 19056, 19060, 19064, 19068, 19072, 19076, 19080, 19084, 19088, 19092, - 19096, 19100, 19104, 19108, 19112, 19116, 19120, 19124, 19128, 19132, - 19136, 19140, 19144, 19150, 19154, 19159, 0, 0, 0, 19164, 19168, 19172, - 19176, 19180, 19184, 19188, 19192, 19196, 19200, 19204, 19208, 19212, - 19216, 19220, 19224, 19228, 19232, 19236, 19240, 19244, 19248, 19252, - 19256, 19260, 19264, 19268, 19272, 19276, 19280, 19284, 19288, 19292, - 19296, 19300, 19304, 19308, 19312, 19316, 19320, 19324, 19328, 19332, - 19336, 19340, 19344, 19348, 19352, 19356, 19360, 19364, 19368, 19372, - 19376, 19380, 19384, 19388, 19392, 19396, 19400, 19404, 19408, 19412, - 19416, 19420, 19424, 19428, 19432, 19436, 19440, 19444, 19448, 19452, - 19456, 19460, 19464, 19468, 19472, 19476, 19480, 19484, 19488, 19492, - 19496, 19500, 19504, 19508, 19512, 19516, 19520, 19524, 19528, 19532, - 19536, 19540, 19544, 19548, 19552, 19555, 19559, 19562, 19566, 19570, - 19573, 19577, 19581, 19584, 19588, 19592, 19596, 19600, 19603, 19607, - 19611, 19615, 19619, 19623, 19627, 19630, 19634, 19638, 19642, 19646, - 19650, 19654, 19658, 19662, 19666, 19670, 19674, 19678, 19682, 19686, - 19690, 19694, 19698, 19702, 19706, 19710, 19714, 19718, 19722, 19726, - 19730, 19734, 19738, 19742, 19746, 19750, 19754, 19758, 19762, 19766, - 19770, 19774, 19778, 19782, 19786, 19790, 19794, 19798, 19802, 19806, - 19810, 19814, 19818, 19822, 19826, 19830, 19834, 19838, 19842, 19846, - 19850, 19854, 19858, 19862, 19866, 19870, 19874, 19878, 19882, 19886, - 19890, 19894, 19898, 19902, 19906, 19910, 19914, 19918, 19922, 19926, - 19930, 19934, 19938, 19942, 19946, 19950, 19954, 19958, 19962, 19966, - 19970, 19974, 19978, 19982, 19986, 19990, 19994, 19998, 20002, 20006, - 20010, 20014, 20018, 20022, 20026, 20030, 20034, 20038, 20042, 20046, - 20050, 20054, 20058, 20062, 20066, 20070, 20074, 20078, 20082, 20086, - 20090, 20094, 20098, 20102, 20106, 20110, 20114, 20118, 20122, 20126, - 20130, 20134, 20138, 20142, 20146, 20150, 20154, 20158, 20162, 20166, - 20170, 20174, 20178, 20182, 20185, 20189, 20193, 20197, 20201, 20205, - 20209, 20213, 20217, 20221, 20225, 20229, 20233, 20237, 20241, 20245, - 20249, 20253, 20257, 20261, 20265, 20269, 20273, 20277, 20280, 20284, - 20288, 20292, 20296, 20300, 20304, 20308, 20312, 20316, 20320, 20324, - 20328, 20332, 20336, 20340, 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, 0, 20471, 20475, 20479, 20483, - 0, 0, 20487, 20491, 20495, 20499, 20503, 20507, 20511, 0, 20515, 0, - 20519, 20523, 20527, 20531, 0, 0, 20535, 20539, 20543, 20547, 20551, - 20555, 20559, 20563, 20567, 20571, 20575, 20579, 20583, 20587, 20591, - 20595, 20599, 20603, 20607, 20611, 20615, 20619, 20623, 20626, 20630, - 20634, 20638, 20642, 20646, 20650, 20654, 20658, 20662, 20666, 20670, - 20674, 20678, 20682, 20686, 20690, 20694, 0, 20698, 20702, 20706, 20710, - 0, 0, 20714, 20717, 20721, 20725, 20729, 20733, 20737, 20741, 20745, - 20749, 20753, 20757, 20761, 20765, 20769, 20773, 20777, 20782, 20787, - 20792, 20798, 20804, 20809, 20814, 20820, 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, 20956, 20961, 20966, 20972, 20978, 20983, 0, 20988, 20992, - 20996, 21000, 21004, 21008, 21012, 21016, 21020, 21024, 21028, 21032, - 21036, 21040, 21044, 21048, 21052, 21055, 21059, 21063, 21067, 21071, - 21075, 21079, 21083, 21087, 21091, 21095, 21099, 21103, 21107, 21111, - 21115, 21119, 21123, 21127, 21131, 21135, 21139, 21143, 21147, 21151, - 21155, 21159, 21163, 21167, 21171, 21175, 21179, 21183, 21187, 21191, - 21195, 21199, 21203, 21207, 21211, 0, 21215, 21219, 21223, 21227, 0, 0, - 21231, 21235, 21239, 21243, 21247, 21251, 21255, 21259, 21263, 21267, - 21271, 21275, 21279, 21283, 21287, 21291, 21295, 21299, 21303, 21307, - 21311, 21315, 21319, 21323, 21327, 21331, 21335, 21339, 21343, 21347, - 21351, 21355, 21359, 21363, 21367, 21371, 21375, 21379, 21383, 21387, - 21391, 21395, 21399, 21403, 21407, 21411, 21415, 21419, 21423, 21427, - 21431, 21435, 21439, 21443, 21447, 21451, 21455, 21458, 21462, 21466, - 21470, 21474, 21478, 21482, 21486, 21490, 21494, 0, 0, 21498, 21507, - 21513, 21518, 21522, 21525, 21530, 21533, 21536, 21539, 21544, 21548, - 21553, 21556, 21559, 21562, 21565, 21568, 21571, 21574, 21577, 21580, - 21584, 21588, 21592, 21596, 21600, 21604, 21608, 21612, 21616, 21620, 0, - 0, 0, 21626, 21632, 21636, 21640, 21644, 21650, 21654, 21658, 21662, - 21668, 21672, 21676, 21680, 21686, 21690, 21694, 21698, 21704, 21710, - 21716, 21724, 21730, 21736, 21742, 21748, 21754, 0, 0, 0, 0, 0, 0, 21760, - 21763, 21766, 21769, 21772, 21775, 21779, 21783, 21786, 21790, 21794, - 21798, 21802, 21806, 21809, 21813, 21817, 21821, 21825, 21829, 21833, - 21837, 21841, 21845, 21849, 21853, 21856, 21860, 21864, 21868, 21872, - 21875, 21879, 21883, 21887, 21891, 21895, 21899, 21903, 21907, 21911, - 21915, 21919, 21923, 21927, 21931, 21934, 21938, 21942, 21946, 21950, - 21954, 21958, 21962, 21966, 21970, 21974, 21978, 21982, 21986, 21990, - 21994, 21998, 22002, 22006, 22010, 22014, 22018, 22022, 22026, 22030, - 22034, 22038, 22042, 22046, 22050, 22054, 22058, 22062, 22066, 22069, - 22073, 22077, 22081, 22085, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 22089, - 22093, 22096, 22100, 22103, 22107, 22110, 22114, 22120, 22125, 22129, - 22132, 22136, 22140, 22145, 22149, 22154, 22158, 22163, 22167, 22172, - 22176, 22181, 22187, 22191, 22196, 22200, 22205, 22211, 22215, 22221, - 22227, 22231, 22235, 22243, 22251, 22258, 22263, 22268, 22277, 22284, - 22291, 22296, 22302, 22306, 22310, 22314, 22318, 22322, 22326, 22330, - 22334, 22338, 22342, 22348, 22353, 22358, 22361, 22365, 22369, 22374, - 22378, 22383, 22387, 22392, 22396, 22401, 22405, 22410, 22414, 22419, - 22423, 22428, 22434, 22438, 22443, 22448, 22452, 22456, 22460, 22464, - 22467, 22471, 22477, 22482, 22487, 22491, 22495, 22499, 22504, 22508, - 22513, 22517, 22522, 22525, 22529, 22533, 22538, 22542, 22547, 22551, - 22556, 22562, 22566, 22570, 22574, 22578, 22582, 22586, 22590, 22594, - 22598, 22602, 22606, 22612, 22615, 22619, 22623, 22628, 22632, 22637, - 22641, 22646, 22650, 22655, 22659, 22664, 22668, 22673, 22677, 22682, - 22688, 22692, 22696, 22702, 22708, 22714, 22720, 22724, 22728, 22732, - 22736, 22740, 22744, 22750, 22754, 22758, 22762, 22767, 22771, 22776, - 22780, 22785, 22789, 22794, 22798, 22803, 22807, 22812, 22816, 22821, - 22827, 22831, 22837, 22841, 22845, 22849, 22853, 22857, 22861, 22867, - 22870, 22874, 22878, 22883, 22887, 22892, 22896, 22901, 22905, 22910, - 22914, 22919, 22923, 22928, 22932, 22937, 22943, 22946, 22950, 22954, - 22959, 22964, 22968, 22972, 22976, 22980, 22984, 22988, 22994, 22997, - 23001, 23005, 23010, 23014, 23019, 23023, 23028, 23034, 23037, 23042, - 23046, 23050, 23054, 23058, 23062, 23066, 23070, 23076, 23080, 23084, - 23088, 23093, 23097, 23102, 23106, 23111, 23115, 23120, 23124, 23129, - 23133, 23138, 23142, 23147, 23150, 23154, 23158, 23162, 23166, 23170, - 23174, 23178, 23182, 23188, 23192, 23196, 23200, 23205, 23209, 23214, - 23218, 23223, 23227, 23232, 23236, 23241, 23245, 23250, 23254, 23259, - 23265, 23268, 23273, 23277, 23282, 23288, 23294, 23300, 23306, 23312, - 23318, 23324, 23328, 23332, 23336, 23340, 23344, 23348, 23352, 23356, - 23361, 23365, 23370, 23374, 23379, 23383, 23388, 23392, 23397, 23401, - 23406, 23410, 23415, 23419, 23423, 23427, 23431, 23435, 23439, 23443, - 23449, 23452, 23456, 23460, 23465, 23469, 23474, 23478, 23483, 23487, - 23492, 23496, 23501, 23505, 23510, 23514, 23519, 23525, 23529, 23535, - 23540, 23546, 23550, 23556, 23561, 23565, 23569, 23573, 23577, 23581, - 23586, 23589, 23593, 23598, 23602, 23607, 23610, 23614, 23618, 23622, - 23626, 23630, 23634, 23638, 23642, 23646, 23650, 23654, 23659, 23663, - 23667, 23673, 23677, 23683, 23687, 23693, 23697, 23701, 23705, 23709, - 23713, 23718, 23722, 23726, 23730, 23734, 23738, 23742, 23746, 23750, - 23754, 23758, 23764, 23770, 23776, 23782, 23788, 23793, 23799, 23805, - 23811, 23815, 23819, 23823, 23827, 23831, 23835, 23839, 23843, 23847, - 23851, 23855, 23859, 23863, 23868, 23873, 23878, 23882, 23886, 23890, - 23894, 23898, 23902, 23906, 23910, 23914, 23918, 23924, 23930, 23936, - 23942, 23948, 23954, 23960, 23966, 23972, 23976, 23980, 23984, 23988, - 23992, 23996, 24000, 24006, 24012, 24018, 24024, 24030, 24036, 24042, - 24048, 24054, 24059, 24064, 24069, 24074, 24080, 24086, 24092, 24098, - 24104, 24110, 24116, 24121, 24127, 24133, 24139, 24144, 24150, 24156, - 24162, 24167, 24172, 24177, 24182, 24187, 24192, 24197, 24202, 24207, - 24212, 24217, 24222, 24226, 24231, 24236, 24241, 24246, 24251, 24256, - 24261, 24266, 24271, 24276, 24281, 24286, 24291, 24296, 24301, 24306, - 24311, 24316, 24321, 24326, 24331, 24336, 24341, 24346, 24351, 24356, - 24361, 24366, 24371, 24375, 24380, 24385, 24390, 24395, 24400, 24405, - 24410, 24415, 24420, 24425, 24430, 24435, 24440, 24445, 24450, 24455, - 24460, 24465, 24470, 24475, 24480, 24485, 24490, 24495, 24500, 24504, - 24509, 24514, 24519, 24524, 24529, 24533, 24538, 24543, 24548, 24553, - 24558, 24562, 24567, 24573, 24578, 24583, 24588, 24593, 24599, 24604, - 24609, 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, 24764, 24769, 24774, 24779, 24784, 24789, 24794, 24799, 24804, - 24809, 24814, 24819, 24825, 24830, 24835, 24840, 24845, 24850, 24855, - 24860, 24865, 24870, 24875, 24880, 24885, 24890, 24895, 24900, 24905, - 24910, 24915, 24920, 24925, 24930, 24935, 24940, 24945, 24950, 24955, - 24960, 24965, 24970, 24975, 24980, 24985, 24990, 24995, 25000, 25005, - 25010, 25015, 25021, 25025, 25029, 25033, 25037, 25041, 25045, 25049, - 25053, 25059, 25065, 25071, 25077, 25083, 25089, 25095, 25102, 25108, - 25113, 25118, 25123, 25128, 25133, 25138, 25143, 25148, 25153, 25158, - 25163, 25168, 25173, 25178, 25183, 25188, 25193, 25198, 25203, 25208, - 25213, 25218, 25223, 25228, 25233, 25238, 25243, 25248, 0, 0, 0, 25255, - 25265, 25269, 25276, 25280, 25284, 25288, 25296, 25300, 25305, 25310, - 25315, 25319, 25324, 25329, 25332, 25336, 25340, 25349, 25353, 25357, - 25363, 25367, 25371, 25379, 25383, 25391, 25397, 25403, 25409, 25415, - 25424, 25429, 25433, 25442, 25445, 25451, 25455, 25461, 25466, 25472, - 25480, 25486, 25491, 25498, 25503, 25507, 25511, 25521, 25527, 25531, - 25541, 25547, 25551, 25555, 25562, 25569, 25574, 25579, 25588, 25592, - 25596, 25600, 25608, 25615, 25619, 25623, 25627, 25631, 25635, 25639, - 25643, 25647, 25651, 25655, 25659, 25664, 25669, 25674, 25678, 25682, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25686, 25690, 25694, 25698, - 25702, 25707, 25712, 25717, 25722, 25726, 25730, 25735, 25739, 0, 25743, - 25748, 25753, 25758, 25762, 25767, 25772, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 25777, 25781, 25785, 25789, 25793, 25798, 25803, 25808, 25813, 25817, - 25821, 25826, 25830, 25834, 25838, 25843, 25848, 25853, 25857, 25862, - 25867, 25872, 25878, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25883, 25887, 25891, - 25895, 25899, 25904, 25909, 25914, 25919, 25923, 25927, 25932, 25936, - 25940, 25944, 25949, 25954, 25959, 25963, 25968, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 25973, 25977, 25981, 25985, 25989, 25994, 25999, 26004, - 26009, 26013, 26017, 26022, 26026, 0, 26030, 26035, 26040, 0, 26045, - 26050, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26055, 26058, 26062, 26066, - 26070, 26074, 26078, 26082, 26086, 26090, 26094, 26098, 26102, 26106, - 26110, 26114, 26118, 26122, 26125, 26129, 26133, 26137, 26141, 26145, - 26149, 26153, 26157, 26161, 26165, 26169, 26173, 26177, 26181, 26184, - 26188, 26192, 26198, 26204, 26210, 26216, 26222, 26228, 26234, 26240, - 26246, 26252, 26258, 26264, 26270, 26276, 26285, 26294, 26300, 26306, - 26312, 26317, 26321, 26326, 26331, 26336, 26340, 26345, 26350, 26355, - 26359, 26364, 26368, 26373, 26378, 26383, 26388, 26392, 26396, 26400, - 26404, 26408, 26412, 26416, 26420, 26424, 26428, 26434, 26438, 26442, - 26446, 26450, 26454, 26462, 26468, 26472, 26478, 26482, 26488, 26492, 0, - 0, 26496, 26500, 26503, 26506, 26509, 26512, 26515, 26518, 26521, 26524, - 0, 0, 0, 0, 0, 0, 26527, 26535, 26543, 26551, 26559, 26567, 26575, 26583, - 26591, 26599, 0, 0, 0, 0, 0, 0, 26607, 26610, 26613, 26616, 26621, 26624, - 26629, 26636, 26644, 26649, 26656, 26659, 26666, 26673, 26680, 0, 26684, - 26688, 26691, 26694, 26697, 26700, 26703, 26706, 26709, 26712, 0, 0, 0, - 0, 0, 0, 26715, 26718, 26721, 26724, 26727, 26730, 26734, 26738, 26742, - 26745, 26749, 26753, 26756, 26760, 26764, 26767, 26771, 26775, 26779, - 26783, 26787, 26791, 26795, 26798, 26801, 26805, 26809, 26812, 26816, - 26820, 26824, 26828, 26832, 26836, 26840, 26844, 26851, 26856, 26861, - 26866, 26871, 26877, 26883, 26889, 26895, 26900, 26906, 26912, 26917, - 26923, 26929, 26935, 26941, 26947, 26952, 26958, 26963, 26969, 26975, - 26981, 26987, 26993, 26998, 27003, 27009, 27015, 27020, 27026, 27031, - 27037, 27042, 27047, 27053, 27059, 27065, 27071, 27077, 27083, 27089, - 27095, 27101, 27107, 27113, 27119, 27124, 27129, 27134, 27140, 0, 0, 0, - 0, 0, 0, 0, 0, 27146, 27155, 27164, 27172, 27180, 27190, 27198, 27207, - 27214, 27221, 27228, 27236, 27244, 27252, 27260, 27268, 27276, 27284, - 27292, 27299, 27307, 27315, 27323, 27331, 27339, 27349, 27359, 27369, - 27379, 27389, 27399, 27409, 27419, 27429, 27439, 27449, 27459, 27469, - 27479, 27487, 27495, 27505, 27513, 0, 0, 0, 0, 0, 27523, 27527, 27531, - 27535, 27539, 27543, 27547, 27551, 27555, 27559, 27563, 27567, 27571, - 27575, 27579, 27583, 27587, 27591, 27595, 27599, 27603, 27607, 27611, - 27615, 27621, 27625, 27631, 27635, 27641, 27645, 27651, 27655, 27659, - 27663, 27667, 27671, 27675, 27681, 27687, 27693, 27699, 27704, 27709, - 27714, 27720, 27726, 27732, 27738, 27745, 27751, 27756, 27761, 27765, - 27769, 27773, 27777, 27781, 27785, 27789, 27795, 27801, 27807, 27812, - 27819, 27824, 27829, 27835, 27840, 27847, 27854, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 27860, 27866, 27870, 27875, 27880, 27885, 27890, 27895, 27900, - 27905, 27910, 27915, 27920, 27925, 27930, 27935, 27939, 27943, 27948, - 27953, 27958, 27962, 27966, 27970, 27975, 27980, 27985, 27990, 27995, 0, - 0, 0, 27999, 28004, 28009, 28014, 28020, 28026, 28032, 28038, 28043, - 28048, 28054, 28060, 0, 0, 0, 0, 28067, 28072, 28078, 28084, 28090, - 28095, 28100, 28105, 28110, 28116, 28121, 28126, 0, 0, 0, 0, 28131, 0, 0, - 0, 28136, 28141, 28146, 28151, 28155, 28159, 28163, 28167, 28171, 28175, - 28179, 28183, 28187, 28192, 28198, 28204, 28210, 28216, 28221, 28227, - 28233, 28239, 28244, 28250, 28255, 28261, 28267, 28272, 28278, 28284, - 28290, 28295, 28300, 28305, 28311, 28317, 28322, 28328, 28333, 28339, - 28344, 28350, 0, 0, 28356, 28362, 28368, 28374, 28380, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 28386, 28393, 28400, 28406, 28413, 28420, 28426, 28433, - 28440, 28447, 28454, 28460, 28467, 28474, 28480, 28487, 28494, 28500, - 28507, 28514, 28520, 28526, 28533, 28539, 28545, 28552, 28558, 28565, - 28572, 28579, 28586, 28593, 28600, 28606, 28613, 28620, 28626, 28633, - 28640, 28647, 28654, 28661, 28668, 28675, 0, 0, 0, 0, 28682, 28690, - 28697, 28704, 28710, 28717, 28723, 28730, 28736, 28743, 28750, 28757, - 28764, 28771, 28778, 28785, 28792, 28799, 28806, 28813, 28819, 28825, - 28832, 28839, 28846, 28852, 0, 0, 0, 0, 0, 0, 28858, 28864, 28869, 28874, - 28879, 28884, 28889, 28894, 28899, 28904, 28909, 0, 0, 0, 28915, 28921, - 28927, 28931, 28937, 28943, 28949, 28955, 28961, 28967, 28973, 28979, - 28985, 28991, 28997, 29003, 29009, 29015, 29021, 29025, 29031, 29037, - 29043, 29049, 29055, 29061, 29067, 29073, 29079, 29085, 29091, 29097, - 29103, 29109, 29115, 29119, 29124, 29129, 29134, 29138, 29143, 29147, - 29152, 29157, 29162, 29166, 29171, 29176, 29181, 29186, 29191, 29195, - 29199, 29204, 29209, 29214, 29218, 29222, 29227, 29232, 29237, 29242, 0, - 0, 29248, 29252, 29259, 29264, 29270, 29276, 29281, 29287, 29293, 29298, - 29304, 29310, 29316, 29322, 29328, 29333, 29338, 29344, 29349, 29355, - 29360, 29366, 29372, 29378, 29384, 29388, 29393, 29398, 29404, 29410, - 29415, 29421, 29427, 29431, 29436, 29441, 29445, 29450, 29455, 29460, - 29465, 29471, 29477, 29483, 29488, 29493, 29497, 29502, 29506, 29511, - 29515, 29520, 29525, 29530, 29535, 29542, 29548, 29555, 29565, 29574, - 29581, 29587, 29597, 29602, 29608, 0, 29614, 29619, 29624, 29632, 29638, - 29646, 29651, 29657, 29663, 29669, 29674, 29680, 29685, 29692, 29698, - 29703, 29709, 29715, 29721, 29728, 29735, 29742, 29747, 29752, 29759, - 29766, 29773, 29780, 29787, 0, 0, 29794, 29801, 29808, 29814, 29820, - 29826, 29832, 29838, 29844, 29850, 29856, 0, 0, 0, 0, 0, 0, 29862, 29868, - 29873, 29878, 29883, 29888, 29893, 29898, 29903, 29908, 0, 0, 0, 0, 0, 0, - 29913, 29918, 29923, 29928, 29933, 29938, 29943, 29952, 29959, 29964, - 29969, 29974, 29979, 29984, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 29989, 29995, - 30001, 30005, 30009, 30013, 30017, 30023, 30027, 30033, 30037, 30043, - 30049, 30057, 30063, 30071, 30075, 30079, 30083, 30089, 30092, 30098, - 30102, 30108, 30112, 30116, 30122, 30126, 30132, 30136, 30142, 30150, - 30158, 30166, 30172, 30176, 30182, 30186, 30192, 30195, 30198, 30204, - 30208, 30214, 30217, 30220, 30223, 30227, 30231, 30237, 30243, 30247, - 30250, 30254, 30259, 30264, 30271, 30276, 30283, 30290, 30299, 30306, - 30315, 30320, 30327, 30334, 30343, 30348, 30355, 30360, 30366, 30372, - 30378, 30384, 30390, 30396, 0, 0, 0, 0, 30402, 30406, 30409, 30412, - 30415, 30418, 30421, 30424, 30427, 30430, 30433, 30436, 30439, 30442, - 30447, 30452, 30457, 30460, 30465, 30470, 30475, 30480, 30487, 30492, - 30497, 30502, 30507, 30514, 30520, 30526, 30532, 30538, 30544, 30553, - 30562, 30568, 30574, 30582, 30590, 30599, 30608, 30616, 30624, 30633, - 30642, 0, 0, 0, 30650, 30655, 30660, 30665, 30669, 30673, 30677, 30682, - 30686, 30690, 30695, 30699, 30704, 30709, 30714, 30719, 30724, 30729, - 30734, 30739, 30744, 30748, 30752, 30757, 30762, 30767, 30771, 30775, - 30779, 30784, 30789, 30794, 30799, 30803, 30809, 30815, 30821, 30827, - 30833, 30839, 30845, 30851, 30857, 0, 0, 0, 30862, 30867, 30872, 30877, - 30881, 30885, 30889, 30893, 30897, 30901, 30905, 30909, 0, 0, 0, 0, 0, 0, - 30913, 30917, 30923, 30927, 30933, 30939, 30944, 30951, 30955, 30961, - 30965, 30971, 30976, 30983, 30990, 30995, 31002, 31007, 31012, 31016, - 31022, 31026, 31032, 31039, 31046, 31051, 31058, 31065, 31069, 31075, - 31080, 31085, 31092, 31097, 31102, 31107, 31112, 31116, 31120, 31125, - 31130, 31137, 31143, 31148, 31155, 31160, 31167, 31172, 31182, 31188, - 31194, 31198, 0, 0, 0, 0, 0, 0, 0, 0, 31202, 31211, 31218, 31225, 31232, - 31235, 31239, 31243, 31247, 31251, 31255, 31259, 31263, 31267, 31271, - 31275, 31279, 31283, 31286, 31289, 31293, 31297, 31301, 31305, 31309, - 31313, 31316, 31320, 31324, 31328, 31332, 31335, 31338, 31342, 31345, - 31349, 31353, 31357, 31361, 31365, 31368, 31373, 31378, 31383, 31387, - 31391, 31396, 31400, 31405, 31409, 31414, 31418, 31422, 31426, 31431, - 31435, 31440, 31445, 31450, 31454, 0, 0, 0, 31458, 31463, 31472, 31477, - 31484, 31489, 31493, 31496, 31499, 31502, 31505, 31508, 31511, 31514, - 31517, 0, 0, 0, 31520, 31524, 31528, 31532, 31539, 31545, 31551, 31557, - 31563, 31569, 31575, 31581, 31587, 31593, 31600, 31607, 31614, 31621, - 31628, 31635, 31642, 31649, 31656, 31663, 31670, 31677, 31684, 31691, - 31698, 31705, 31712, 31719, 31726, 31733, 31740, 31747, 31754, 31761, - 31768, 31775, 31782, 31789, 31796, 31803, 31811, 31819, 31827, 31833, - 31839, 31845, 31853, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31862, 31867, 31872, 31877, - 31882, 31891, 31902, 31911, 31922, 31928, 31941, 31947, 31954, 31961, - 31966, 31972, 31978, 31989, 31998, 32005, 32012, 32021, 32028, 32037, - 32047, 32057, 32064, 32071, 32078, 32088, 32093, 32101, 32107, 32115, - 32124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32129, 32134, 32140, 32147, - 32155, 32161, 32167, 32173, 32178, 32185, 32191, 32197, 32203, 32211, - 32216, 32223, 32228, 32234, 32240, 32247, 32255, 32262, 32268, 32275, - 32282, 32288, 32295, 32302, 32308, 32313, 32319, 32327, 32335, 32341, - 32347, 32353, 32359, 32367, 32371, 32377, 32383, 32389, 32395, 32401, - 32407, 32411, 32416, 32421, 32428, 32433, 32437, 32443, 32448, 32453, - 32457, 32462, 32467, 32471, 32475, 32479, 32485, 32489, 32494, 32499, - 32503, 32508, 32512, 32517, 32521, 32527, 32532, 32539, 32544, 32549, - 32553, 32558, 32563, 32570, 32575, 32581, 32586, 32590, 32595, 32599, - 32604, 32611, 32618, 32623, 32628, 32632, 32638, 32644, 32649, 32654, - 32659, 32665, 32670, 32676, 32681, 32687, 32693, 32699, 32706, 32713, - 32720, 32727, 32734, 32741, 32746, 32754, 32763, 32772, 32781, 32790, - 32799, 32808, 32820, 32829, 32838, 32847, 32854, 32859, 32866, 32874, - 32882, 32889, 32896, 32903, 32910, 32918, 32927, 32936, 32945, 32954, - 32963, 32972, 32981, 32990, 32999, 33008, 33017, 33026, 33035, 33044, - 33052, 33061, 33072, 33080, 33089, 33100, 33109, 33118, 33127, 33136, - 33144, 33153, 33160, 33165, 33173, 33178, 33185, 33190, 33199, 33205, - 33212, 33219, 33224, 33229, 33237, 33245, 33254, 33263, 33268, 33275, - 33286, 33294, 33303, 33308, 33314, 33319, 33326, 33331, 33340, 33345, - 33350, 33355, 33362, 33369, 33374, 33383, 33391, 33396, 33401, 33408, - 33415, 33419, 33423, 33426, 33429, 33432, 33435, 33438, 33441, 33448, - 33451, 33454, 33459, 33463, 33467, 33471, 33475, 33479, 33488, 33494, - 33500, 33506, 33514, 33522, 33528, 33534, 33541, 33547, 33552, 33558, - 33564, 33569, 33575, 33581, 33589, 33594, 33600, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 33606, 33613, 33620, 33625, 33634, - 33642, 33650, 33657, 33664, 33671, 33678, 33686, 33694, 33704, 33714, - 33722, 33730, 33738, 33746, 33755, 33764, 33772, 33780, 33789, 33798, - 33807, 33816, 33825, 33834, 33842, 33850, 33858, 33866, 33876, 33886, - 33894, 33902, 33910, 33918, 33926, 33934, 33942, 33950, 33958, 33966, - 33974, 33982, 33991, 34000, 34009, 34018, 34028, 34038, 34045, 34052, - 34060, 34068, 34077, 34086, 34094, 34102, 34114, 34126, 34135, 34144, - 34153, 34162, 34169, 34176, 34184, 34192, 34200, 34208, 34216, 34224, - 34232, 34240, 34249, 34258, 34267, 34276, 34285, 34294, 34304, 34314, - 34323, 34332, 34341, 34350, 34357, 34364, 34372, 34380, 34388, 34396, - 34404, 34412, 34424, 34436, 34445, 34454, 34462, 34470, 34478, 34486, - 34497, 34508, 34519, 34530, 34542, 34554, 34562, 34570, 34578, 34586, - 34595, 34604, 34613, 34622, 34630, 34638, 34646, 34654, 34662, 34670, - 34679, 34688, 34698, 34708, 34715, 34722, 34730, 34738, 34745, 34752, - 34759, 34766, 34774, 34782, 34790, 34798, 34806, 34814, 34822, 34830, - 34838, 34846, 34854, 34862, 34870, 34878, 34886, 34894, 34903, 34912, - 34921, 34929, 34938, 34947, 34956, 34965, 34975, 34984, 34990, 34995, - 35002, 35009, 35017, 35025, 35034, 35043, 35052, 35061, 35072, 35083, - 35092, 35101, 35111, 35121, 35130, 35139, 35148, 35157, 35168, 35179, - 35188, 35197, 35207, 35217, 35224, 35231, 35239, 35247, 35253, 35259, - 35268, 35277, 35286, 35295, 35306, 35317, 35326, 35335, 35345, 35355, - 35364, 35373, 35381, 35389, 35396, 35403, 35411, 35419, 35428, 35437, - 35446, 35455, 35466, 35477, 35486, 35495, 35505, 35515, 35524, 35533, - 35542, 35551, 35562, 35573, 35582, 35591, 35601, 35611, 35618, 35625, - 35633, 35641, 35650, 35659, 35668, 35677, 35688, 35699, 35708, 35717, - 35727, 35737, 35744, 35751, 35759, 35767, 35776, 35785, 35792, 35799, - 35806, 35813, 35820, 35827, 35835, 35843, 35851, 35859, 35870, 35881, - 35892, 35903, 35914, 35925, 35933, 35941, 35952, 35963, 35974, 35985, - 35996, 36007, 36015, 36023, 36034, 36045, 36056, 0, 0, 36067, 36075, - 36083, 36094, 36105, 36116, 0, 0, 36127, 36135, 36143, 36154, 36165, - 36176, 36187, 36198, 36209, 36217, 36225, 36236, 36247, 36258, 36269, - 36280, 36291, 36299, 36307, 36318, 36329, 36340, 36351, 36362, 36373, - 36381, 36389, 36400, 36411, 36422, 36433, 36444, 36455, 36463, 36471, - 36482, 36493, 36504, 0, 0, 36515, 36523, 36531, 36542, 36553, 36564, 0, - 0, 36575, 36583, 36591, 36602, 36613, 36624, 36635, 36646, 0, 36657, 0, - 36665, 0, 36676, 0, 36687, 36698, 36706, 36714, 36725, 36736, 36747, - 36758, 36769, 36780, 36788, 36796, 36807, 36818, 36829, 36840, 36851, - 36862, 36870, 36878, 36886, 36894, 36902, 36910, 36918, 36926, 36934, - 36942, 36950, 36958, 36966, 0, 0, 36974, 36985, 36996, 37010, 37024, - 37038, 37052, 37066, 37080, 37091, 37102, 37116, 37130, 37144, 37158, - 37172, 37186, 37197, 37208, 37222, 37236, 37250, 37264, 37278, 37292, - 37303, 37314, 37328, 37342, 37356, 37370, 37384, 37398, 37409, 37420, - 37434, 37448, 37462, 37476, 37490, 37504, 37515, 37526, 37540, 37554, - 37568, 37582, 37596, 37610, 37618, 37626, 37637, 37645, 0, 37656, 37664, - 37675, 37683, 37691, 37699, 37707, 37715, 37718, 37721, 37724, 37727, - 37733, 37744, 37752, 0, 37763, 37771, 37782, 37790, 37798, 37806, 37814, - 37822, 37828, 37834, 37840, 37848, 37856, 37867, 0, 0, 37878, 37886, - 37897, 37905, 37913, 37921, 0, 37929, 37935, 37941, 37947, 37955, 37963, - 37974, 37985, 37993, 38001, 38009, 38020, 38028, 38036, 38044, 38052, - 38060, 38066, 38072, 0, 0, 38075, 38086, 38094, 0, 38105, 38113, 38124, - 38132, 38140, 38148, 38156, 38164, 38167, 0, 38170, 38174, 38178, 38182, - 38186, 38190, 38194, 38198, 38202, 38206, 38210, 38214, 38220, 38226, - 38232, 38235, 38238, 38240, 38244, 38248, 38252, 38256, 38258, 38262, - 38266, 38272, 38278, 38285, 38292, 38297, 38302, 38308, 38314, 38316, - 38319, 38321, 38325, 38329, 38333, 38336, 38340, 38344, 38348, 38352, - 38356, 38362, 38366, 38370, 38376, 38381, 38388, 38390, 38393, 38397, - 38401, 38406, 38412, 38414, 38423, 38432, 38435, 38439, 38441, 38443, - 38445, 38448, 38454, 38456, 38460, 38464, 38471, 38478, 38482, 38487, - 38492, 38497, 38502, 38506, 38510, 38513, 38517, 38521, 38528, 38533, - 38537, 38541, 38546, 38550, 38554, 38559, 38564, 38568, 38572, 38576, - 38578, 38583, 38588, 38592, 38596, 38600, 38604, 0, 0, 0, 0, 0, 38608, - 38614, 38620, 38627, 38634, 38639, 38644, 38648, 0, 0, 38654, 38657, - 38660, 38663, 38666, 38669, 38672, 38676, 38680, 38685, 38690, 38695, - 38701, 38705, 38708, 38711, 38714, 38717, 38720, 38723, 38726, 38729, - 38732, 38736, 38740, 38745, 38750, 0, 38755, 38761, 38767, 38773, 38780, - 38787, 38794, 38801, 38807, 38813, 38819, 38826, 38832, 0, 0, 0, 38839, - 38842, 38845, 38848, 38853, 38856, 38859, 38862, 38865, 38868, 38871, - 38875, 38878, 38881, 38884, 38887, 38890, 38895, 38898, 38901, 38904, - 38907, 38910, 38915, 38918, 38921, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 38926, 38931, 38936, 38943, 38951, 38956, - 38961, 38965, 38969, 38974, 38981, 38988, 38992, 38997, 39002, 39007, - 39012, 39019, 39024, 39029, 39034, 39043, 39050, 39057, 39061, 39066, - 39072, 39077, 39084, 39093, 39102, 39106, 39110, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 39114, 39118, 39126, 39130, 39134, 39139, 39143, - 39147, 39151, 39153, 39157, 39161, 39165, 39170, 39174, 39178, 39186, - 39189, 39193, 39196, 39199, 39205, 39208, 39211, 39217, 39221, 39225, - 39229, 39232, 39236, 39239, 39243, 39245, 39248, 39251, 39255, 39257, - 39261, 39264, 39267, 39272, 39277, 39284, 39287, 39290, 39294, 39299, - 39302, 39305, 39308, 39312, 39317, 39320, 39323, 39325, 39328, 39331, - 39334, 39338, 39343, 39346, 39350, 39354, 39358, 39362, 39367, 39373, - 39378, 39383, 39389, 39394, 39399, 39403, 39407, 39412, 39416, 39420, - 39423, 39425, 39430, 39436, 39443, 39450, 39457, 39464, 39471, 39478, - 39485, 39492, 39500, 39507, 39515, 39522, 39529, 39537, 39545, 39550, - 39555, 39560, 39565, 39570, 39575, 39580, 39585, 39590, 39595, 39601, - 39607, 39613, 39619, 39626, 39634, 39641, 39647, 39653, 39659, 39665, - 39671, 39677, 39683, 39689, 39695, 39702, 39709, 39716, 39723, 39731, - 39740, 39748, 39759, 39767, 39775, 39784, 39791, 39800, 39809, 39817, - 39826, 0, 0, 0, 0, 0, 0, 39834, 39836, 39839, 39841, 39844, 39847, 39850, - 39855, 39860, 39865, 39870, 39874, 39878, 39882, 39886, 39891, 39897, - 39902, 39908, 39913, 39918, 39923, 39929, 39934, 39940, 39946, 39950, - 39954, 39959, 39964, 39969, 39974, 39979, 39987, 39995, 40003, 40011, - 40018, 40026, 40033, 40040, 40049, 40061, 40067, 40073, 40081, 40089, - 40098, 40107, 40115, 40123, 40132, 40141, 40146, 40154, 40159, 40164, - 40170, 40175, 40181, 40188, 40195, 40200, 40206, 40211, 40214, 40218, - 40221, 40225, 40229, 40233, 40239, 40245, 40251, 40257, 40261, 40265, - 40269, 40273, 40279, 40285, 40289, 40294, 40298, 40303, 40308, 40313, - 40316, 40320, 40323, 40327, 40334, 40342, 40353, 40364, 40369, 40378, - 40385, 40394, 40403, 40407, 40413, 40421, 40425, 40430, 40435, 40441, - 40447, 40453, 40460, 40464, 40468, 40473, 40476, 40478, 40482, 40486, - 40494, 40498, 40500, 40502, 40506, 40514, 40519, 40525, 40535, 40542, - 40547, 40551, 40555, 40559, 40562, 40565, 40568, 40572, 40576, 40580, - 40584, 40588, 40591, 40595, 40599, 40602, 40604, 40607, 40609, 40613, - 40617, 40619, 40625, 40628, 40633, 40637, 40641, 40643, 40645, 40647, - 40650, 40654, 40658, 40662, 40666, 40670, 40676, 40682, 40684, 40686, - 40688, 40690, 40693, 40695, 40699, 40701, 40705, 40708, 40713, 40717, - 40721, 40724, 40727, 40731, 40737, 40741, 40751, 40761, 40765, 40771, - 40777, 40780, 40784, 40787, 40792, 40796, 40802, 40806, 40818, 40826, - 40830, 40834, 40840, 40844, 40847, 40849, 40852, 40856, 40860, 40867, - 40871, 40875, 40879, 40882, 40887, 40892, 40897, 40902, 40907, 40912, - 40920, 40928, 40932, 40936, 40938, 40943, 40947, 40951, 40959, 40967, - 40973, 40979, 40988, 40997, 41002, 41007, 41015, 41023, 41025, 41027, - 41032, 41037, 41043, 41049, 41055, 41061, 41065, 41069, 41076, 41083, - 41089, 41095, 41105, 41115, 41123, 41131, 41133, 41137, 41141, 41146, - 41151, 41158, 41165, 41168, 41171, 41174, 41177, 41180, 41185, 41189, - 41194, 41199, 41202, 41205, 41208, 41211, 41214, 41218, 41221, 41224, - 41227, 41230, 41232, 41234, 41236, 41238, 41246, 41254, 41260, 41264, - 41270, 41280, 41286, 41292, 41298, 41306, 41314, 41325, 41329, 41333, - 41335, 41341, 41343, 41345, 41347, 41349, 41355, 41358, 41364, 41370, - 41374, 41378, 41382, 41385, 41389, 41393, 41395, 41404, 41413, 41418, - 41423, 41429, 41435, 41441, 41444, 41447, 41450, 41453, 41455, 41460, - 41465, 41470, 41476, 41482, 41490, 41498, 41504, 41510, 41516, 41522, - 41531, 41540, 41549, 41558, 41567, 41576, 41585, 41594, 41603, 41612, - 41620, 41632, 41642, 41657, 41660, 41665, 41671, 41677, 41684, 41698, - 41713, 41719, 41725, 41732, 41738, 41746, 41752, 41765, 41779, 41784, - 41790, 41797, 41800, 41803, 41805, 41808, 41811, 41813, 41815, 41819, - 41822, 41825, 41828, 41831, 41836, 41841, 41846, 41851, 41856, 41859, - 41861, 41863, 41865, 41869, 41873, 41877, 41883, 41888, 41890, 41892, - 41897, 41902, 41907, 41912, 41917, 41922, 41924, 41926, 41935, 41939, - 41947, 41956, 41958, 41963, 41968, 41976, 41980, 41982, 41986, 41988, - 41992, 41996, 42000, 42002, 42004, 42006, 42011, 42018, 42025, 42032, - 42039, 42046, 42053, 42060, 42067, 42073, 42079, 42086, 42093, 42100, - 42107, 42113, 42119, 42126, 42133, 42140, 42148, 42155, 42163, 42170, - 42178, 42185, 42193, 42201, 42208, 42216, 42223, 42231, 42238, 42246, - 42253, 42260, 42267, 42274, 42281, 42289, 42296, 42303, 42310, 42318, - 42325, 42332, 42339, 42346, 42354, 42362, 42369, 42376, 42382, 42388, - 42393, 42399, 42406, 42415, 42422, 42429, 42436, 42441, 42446, 42451, - 42458, 42465, 42472, 42479, 42484, 42489, 42498, 42503, 42506, 42514, - 42517, 42522, 42527, 42530, 42533, 42541, 42544, 42549, 42552, 42559, - 42564, 42572, 42575, 42578, 42581, 42586, 42591, 42594, 42597, 42605, - 42608, 42613, 42620, 42624, 42628, 42633, 42638, 42644, 42649, 42655, - 42661, 42666, 42672, 42680, 42686, 42694, 42702, 42708, 42716, 42724, - 42733, 42741, 42747, 42755, 42764, 42772, 42776, 42781, 42794, 42807, - 42811, 42815, 42819, 42823, 42833, 42837, 42842, 42847, 42852, 42857, - 42862, 42867, 42877, 42887, 42895, 42905, 42915, 42923, 42933, 42943, - 42951, 42961, 42971, 42979, 42987, 42997, 43007, 43010, 43013, 43016, - 43021, 43025, 43031, 43038, 43045, 43053, 43060, 43064, 43068, 43072, - 43076, 43078, 43082, 43086, 43091, 43096, 43103, 43110, 43113, 43120, - 43122, 43124, 43128, 43132, 43137, 43143, 43149, 43155, 43161, 43170, - 43179, 43188, 43192, 43194, 43198, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 43205, 43209, 43216, 43223, 43230, 43237, 43241, 43245, 43249, 43253, - 43258, 43264, 43269, 43275, 43281, 43287, 43293, 43301, 43308, 43315, - 43322, 43329, 43334, 43340, 43349, 43353, 43360, 43364, 43368, 43374, - 43380, 43386, 43392, 43396, 43400, 43403, 43406, 43410, 43417, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 43424, - 43427, 43431, 43435, 43441, 43447, 43453, 43461, 43468, 43472, 43480, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 43485, 43488, - 43491, 43494, 43497, 43500, 43503, 43506, 43509, 43512, 43516, 43520, - 43524, 43528, 43532, 43536, 43540, 43544, 43548, 43552, 43556, 43559, - 43562, 43565, 43568, 43571, 43574, 43577, 43580, 43583, 43587, 43591, - 43595, 43599, 43603, 43607, 43611, 43615, 43619, 43623, 43627, 43633, - 43639, 43645, 43652, 43659, 43666, 43673, 43680, 43687, 43694, 43701, - 43708, 43715, 43722, 43729, 43736, 43743, 43750, 43757, 43764, 43769, - 43775, 43781, 43787, 43792, 43798, 43804, 43810, 43815, 43821, 43827, - 43832, 43837, 43842, 43847, 43853, 43859, 43864, 43869, 43875, 43880, - 43886, 43892, 43898, 43904, 43910, 43915, 43921, 43927, 43933, 43938, - 43944, 43950, 43956, 43961, 43967, 43973, 43978, 43983, 43988, 43993, - 43999, 44005, 44010, 44015, 44021, 44026, 44032, 44038, 44044, 44050, - 44056, 44061, 44067, 44073, 44079, 44084, 44090, 44096, 44102, 44107, - 44113, 44119, 44124, 44129, 44134, 44139, 44145, 44151, 44156, 44161, - 44167, 44172, 44178, 44184, 44190, 44196, 44202, 44206, 44211, 44216, - 44221, 44226, 44231, 44236, 44241, 44246, 44251, 44256, 44260, 44264, - 44268, 44272, 44276, 44280, 44284, 44288, 44292, 44297, 44302, 44307, - 44312, 44317, 44322, 44331, 44340, 44349, 44358, 44367, 44376, 44385, - 44394, 44401, 44409, 44417, 44424, 44431, 44439, 44447, 44454, 44461, - 44469, 44477, 44484, 44491, 44499, 44507, 44514, 44521, 44529, 44538, - 44547, 44555, 44564, 44573, 44580, 44587, 44595, 44604, 44613, 44621, - 44630, 44639, 44646, 44653, 44662, 44671, 44679, 44687, 44696, 44705, - 44712, 44719, 44728, 44737, 44745, 44753, 44762, 44771, 44778, 44785, - 44794, 44803, 44811, 44820, 44829, 44837, 44847, 44857, 44867, 44877, - 44886, 44895, 44904, 44913, 44920, 44928, 44936, 44944, 44952, 44957, - 44962, 44971, 44979, 44986, 44995, 45003, 45010, 45019, 45027, 45034, - 45043, 45051, 45058, 45067, 45075, 45082, 45091, 45099, 45106, 45115, - 45123, 45130, 45139, 45147, 45154, 45163, 45171, 45178, 45187, 45196, - 45205, 45214, 45228, 45242, 45249, 45254, 45259, 45264, 45269, 45274, - 45279, 45284, 45289, 45297, 45305, 45313, 45321, 45326, 45333, 45340, - 45347, 45352, 45360, 45367, 45375, 45379, 45386, 45392, 45399, 45403, - 45409, 45415, 45421, 45425, 45428, 45432, 45436, 45443, 45449, 45455, - 45461, 45467, 45481, 45491, 45505, 45519, 45525, 45535, 45549, 45552, - 45555, 45562, 45570, 45575, 45580, 45588, 45600, 45612, 45620, 45624, - 45628, 45631, 45634, 45638, 45642, 45645, 45648, 45653, 45658, 45664, - 45670, 45675, 45680, 45686, 45692, 45697, 45702, 45707, 45712, 45718, - 45724, 45729, 45734, 45740, 45746, 45751, 45756, 45759, 45762, 45771, - 45773, 45775, 45778, 45782, 45788, 45790, 45793, 45800, 45807, 45815, - 45823, 45833, 45847, 45852, 45857, 45861, 45866, 45874, 45882, 45891, - 45900, 45909, 45918, 45923, 45928, 45934, 45940, 45946, 45952, 45955, - 45961, 45967, 45977, 45987, 45995, 46003, 46012, 46021, 46025, 46033, - 46041, 46049, 46057, 46066, 46075, 46084, 46093, 46098, 46103, 46108, - 46113, 46118, 46124, 46130, 46135, 46141, 46143, 46145, 46147, 46149, - 46152, 46155, 46157, 46159, 46161, 46165, 46169, 46171, 46173, 46176, - 46179, 46183, 46189, 46195, 46197, 46204, 46208, 46213, 46218, 46220, - 46230, 46236, 46242, 46248, 46254, 46260, 46266, 46271, 46274, 46277, - 46280, 46282, 46284, 46288, 46292, 46297, 46302, 46307, 46310, 46314, - 46319, 46322, 46326, 46331, 46336, 46341, 46346, 46351, 46356, 46361, - 46366, 46371, 46376, 46381, 46386, 46392, 46398, 46404, 46406, 46409, - 46411, 46414, 46416, 46418, 46420, 46422, 46424, 46426, 46428, 46430, - 46432, 46434, 46436, 46438, 46440, 46442, 46444, 46446, 46448, 46453, - 46458, 46463, 46468, 46473, 46478, 46483, 46488, 46493, 46498, 46503, - 46508, 46513, 46518, 46523, 46528, 46533, 46538, 46543, 46548, 46552, - 46556, 46560, 46566, 46572, 46577, 46582, 46587, 46592, 46597, 46602, - 46610, 46618, 46626, 46634, 46642, 46650, 46658, 46666, 46672, 46677, - 46682, 46687, 46690, 46694, 46698, 46702, 46706, 46710, 46714, 46721, - 46728, 46736, 46744, 46749, 46754, 46761, 46768, 46775, 46782, 46785, - 46788, 46793, 46795, 46799, 46804, 46806, 46808, 46810, 46812, 46817, - 46820, 46822, 46827, 46834, 46841, 46844, 46848, 46853, 46858, 46866, - 46872, 46878, 46890, 46897, 46904, 46909, 46914, 46920, 46923, 46926, - 46931, 46933, 46937, 46939, 46941, 46943, 46945, 46947, 46949, 46954, - 46956, 46958, 46960, 46962, 46966, 46968, 46971, 46976, 46981, 46986, - 46991, 46997, 47003, 47005, 47008, 47015, 47022, 47029, 47036, 47040, - 47044, 47046, 47048, 47052, 47058, 47063, 47065, 47069, 47078, 47086, - 47094, 47100, 47106, 47111, 47117, 47122, 47125, 47139, 47142, 47147, - 47152, 47158, 47168, 47170, 47176, 47182, 47186, 47193, 47197, 47199, - 47201, 47205, 47211, 47216, 47222, 47224, 47230, 47232, 47238, 47240, - 47242, 47247, 47249, 47253, 47258, 47260, 47265, 47270, 47274, 47281, 0, - 47291, 47297, 47300, 47306, 47309, 47314, 47319, 47323, 47325, 47327, - 47331, 47335, 47339, 47343, 47348, 47350, 47355, 47358, 47361, 47364, - 47368, 47372, 47377, 47381, 47386, 47391, 47395, 47400, 47406, 47409, - 47415, 47420, 47424, 47429, 47435, 47441, 47448, 47454, 47461, 47468, - 47470, 47477, 47481, 47487, 47493, 47498, 47504, 47508, 47513, 47516, - 47521, 47527, 47534, 47542, 47549, 47558, 47568, 47575, 47581, 47585, - 47592, 47597, 47606, 47609, 47612, 47621, 47631, 47638, 47640, 47646, - 47651, 47653, 47656, 47660, 47668, 47677, 47680, 47685, 47690, 47698, - 47706, 47714, 47722, 47728, 47734, 47740, 47748, 47753, 47756, 47760, - 47763, 47775, 47785, 47796, 47805, 47816, 47826, 47835, 47841, 47849, - 47853, 47861, 47865, 47873, 47880, 47887, 47896, 47905, 47915, 47925, - 47935, 47945, 47954, 47963, 47973, 47983, 47992, 48001, 48007, 48013, - 48019, 48025, 48031, 48037, 48043, 48049, 48055, 48062, 48068, 48074, - 48080, 48086, 48092, 48098, 48104, 48110, 48116, 48123, 48130, 48137, - 48144, 48151, 48158, 48165, 48172, 48179, 48186, 48194, 48199, 48202, - 48206, 48210, 48216, 48219, 48225, 48231, 48236, 48240, 48245, 48251, - 48258, 48261, 48268, 48275, 48279, 48288, 48297, 48302, 48308, 48313, - 48318, 48325, 48332, 48340, 48348, 48357, 48361, 48370, 48375, 48379, - 48386, 48390, 48397, 48405, 48410, 48418, 48422, 48427, 48431, 48436, - 48440, 48445, 48450, 48459, 48461, 48464, 48467, 48474, 48481, 48486, - 48494, 48500, 0, 48506, 0, 48509, 48514, 48519, 48527, 48531, 48538, - 48546, 48554, 48559, 48564, 48570, 48575, 48580, 48586, 48591, 48594, - 48598, 48602, 48609, 48618, 48623, 48632, 48641, 48647, 48653, 48658, - 48663, 48668, 48673, 48679, 48685, 48693, 48701, 48707, 48713, 48718, - 48723, 48730, 48737, 48743, 48746, 48749, 48753, 48757, 48761, 48766, - 48772, 48778, 48785, 48792, 48797, 48801, 48805, 48809, 48813, 48817, - 48821, 48825, 48829, 48833, 48837, 48841, 48845, 48849, 48853, 48857, - 48861, 48865, 48869, 48873, 48877, 48881, 48885, 48889, 48893, 48897, - 48901, 48905, 48909, 48913, 48917, 48921, 48925, 48929, 48933, 48937, - 48941, 48945, 48949, 48953, 48957, 48961, 48965, 48969, 48973, 48977, - 48981, 48985, 48989, 48993, 48997, 49001, 49005, 49009, 49013, 49017, - 49021, 49025, 49029, 49033, 49037, 49041, 49045, 49049, 49053, 49057, - 49061, 49065, 49069, 49073, 49077, 49081, 49085, 49089, 49093, 49097, - 49101, 49105, 49109, 49113, 49117, 49121, 49125, 49129, 49133, 49137, - 49141, 49145, 49149, 49153, 49157, 49161, 49165, 49169, 49173, 49177, - 49181, 49185, 49189, 49193, 49197, 49201, 49205, 49209, 49213, 49217, - 49221, 49225, 49229, 49233, 49237, 49241, 49245, 49249, 49253, 49257, - 49261, 49265, 49269, 49273, 49277, 49281, 49285, 49289, 49293, 49297, - 49301, 49305, 49309, 49313, 49317, 49321, 49325, 49329, 49333, 49337, - 49341, 49345, 49349, 49353, 49357, 49361, 49365, 49369, 49373, 49377, - 49381, 49385, 49389, 49393, 49397, 49401, 49405, 49409, 49413, 49417, - 49421, 49425, 49429, 49433, 49437, 49441, 49445, 49449, 49453, 49457, - 49461, 49465, 49469, 49473, 49477, 49481, 49485, 49489, 49493, 49497, - 49501, 49505, 49509, 49513, 49517, 49521, 49525, 49529, 49533, 49537, - 49541, 49545, 49549, 49553, 49557, 49561, 49565, 49569, 49573, 49577, - 49581, 49585, 49589, 49593, 49597, 49601, 49605, 49609, 49613, 49617, - 49621, 49625, 49629, 49633, 49637, 49641, 49645, 49649, 49653, 49657, - 49661, 49665, 49669, 49673, 49677, 49681, 49685, 49689, 49693, 49697, - 49701, 49705, 49709, 49713, 49717, 49721, 49725, 49729, 49733, 49737, - 49741, 49745, 49749, 49753, 49757, 49761, 49765, 49769, 49773, 49777, - 49781, 49785, 49789, 49793, 49797, 49801, 49805, 49809, 49813, 49817, - 49821, 49828, 49836, 49842, 49848, 49855, 49862, 49868, 49874, 49880, - 49886, 49891, 49896, 49901, 49906, 49912, 49918, 49926, 49933, 49939, - 49945, 49953, 49962, 49969, 49979, 49990, 49993, 49996, 50000, 50004, - 50011, 50018, 50029, 50040, 50050, 50060, 50067, 50074, 50081, 50088, - 50099, 50110, 50121, 50132, 50142, 50152, 50164, 50176, 50187, 50198, - 50210, 50222, 50231, 50241, 50251, 50262, 50273, 50280, 50287, 50294, - 50301, 50311, 50321, 50329, 50337, 50344, 50351, 50358, 50365, 50372, - 50377, 50382, 50388, 50396, 50406, 50416, 50426, 50436, 50446, 50456, - 50466, 50476, 50486, 50496, 50506, 50517, 50528, 50538, 50548, 50559, - 50570, 50580, 50590, 50601, 50612, 50622, 50632, 50643, 50654, 50670, - 50689, 50705, 50724, 50740, 50756, 50772, 50788, 50799, 50811, 50822, - 50834, 50853, 50872, 50880, 50886, 50893, 50900, 50907, 50914, 50919, - 50925, 50930, 50935, 50941, 50946, 50951, 50956, 50961, 50966, 50973, - 50978, 50985, 50990, 50995, 50999, 51003, 51010, 51017, 51024, 51031, - 51038, 51045, 51058, 51071, 51084, 51097, 51105, 51113, 51119, 51125, - 51132, 51139, 51146, 51153, 51157, 51162, 51170, 51178, 51186, 51193, - 51197, 51205, 51213, 51217, 51221, 51226, 51233, 51241, 51249, 51268, - 51287, 51306, 51325, 51344, 51363, 51382, 51401, 51407, 51414, 51423, - 51431, 51439, 51444, 51447, 51450, 51455, 51458, 51477, 51484, 51490, - 51496, 51500, 51503, 51506, 51509, 51521, 51534, 51541, 51548, 51551, - 51555, 51558, 51563, 51568, 51573, 51579, 51588, 51595, 51602, 51610, - 51617, 51624, 51627, 51633, 51639, 51642, 51645, 51650, 51655, 51661, - 51667, 51671, 51676, 51683, 51687, 51693, 51697, 51701, 51709, 51721, - 51730, 51734, 51736, 51745, 51754, 51760, 51763, 51769, 51775, 51780, - 51785, 51790, 51795, 51800, 51805, 51807, 51813, 51818, 51825, 51829, - 51835, 51838, 51842, 51849, 51856, 51858, 51860, 51866, 51872, 51878, - 51887, 51896, 51903, 51910, 51916, 51922, 51927, 51932, 51937, 51943, - 51949, 51954, 51961, 51965, 51969, 51982, 51995, 52007, 52016, 52022, - 52029, 52034, 52039, 52044, 52049, 52054, 52056, 52063, 52070, 52077, - 52084, 52091, 52099, 52105, 52110, 52116, 52122, 52128, 52135, 52141, - 52149, 52157, 52165, 52173, 52180, 52186, 52192, 52201, 52205, 52214, - 52223, 52232, 52240, 52244, 52250, 52257, 52264, 52268, 52274, 52281, - 52286, 52291, 52297, 52302, 52307, 52314, 52321, 52326, 52331, 52339, - 52347, 52357, 52367, 52374, 52381, 52385, 52389, 52401, 52407, 52413, - 52418, 52423, 52430, 52437, 52443, 52449, 52458, 52466, 52474, 52481, - 52488, 52495, 52501, 52508, 52514, 52521, 52528, 52535, 52542, 52548, - 52553, 52562, 52572, 52579, 52588, 52594, 52599, 52604, 52614, 52620, - 52626, 52632, 52640, 52645, 52652, 52659, 52670, 52677, 52684, 52691, - 52698, 52705, 52712, 52719, 52731, 52743, 52754, 52765, 52778, 52791, - 52796, 52801, 52810, 52819, 52826, 52833, 52842, 52851, 52859, 52867, - 52875, 52883, 52893, 52903, 52917, 52931, 52939, 52947, 52959, 52971, - 52979, 52987, 52997, 53007, 53012, 53017, 53026, 53035, 53040, 53045, - 53053, 53059, 53065, 53073, 53081, 53094, 53107, 53111, 53115, 53122, - 53129, 53136, 53144, 53152, 53161, 53170, 53176, 53182, 53189, 53196, - 53203, 53210, 53219, 53228, 53231, 53234, 53239, 53244, 53250, 53256, - 53263, 53270, 53280, 53290, 53297, 53304, 53312, 53320, 53328, 53336, - 53344, 53352, 53358, 53364, 53368, 53372, 53379, 53386, 53391, 53396, - 53401, 53406, 53412, 53426, 53433, 53440, 53444, 53446, 53448, 53453, - 53458, 53463, 53467, 53475, 53482, 53489, 53497, 53509, 53517, 53525, - 53536, 53540, 53544, 53550, 53558, 53571, 53578, 53585, 53592, 53597, - 53604, 53613, 53621, 53627, 53633, 53639, 53648, 53657, 53665, 53674, - 53679, 53682, 53687, 53693, 53699, 53705, 53711, 53715, 53718, 53722, - 53726, 53732, 53738, 53744, 53750, 53754, 53758, 53765, 53772, 53779, - 53786, 53793, 53800, 53810, 53820, 53827, 53834, 53842, 53850, 53854, - 53859, 53864, 53870, 53876, 53879, 53882, 53885, 53888, 53892, 53897, - 53902, 53907, 53912, 53917, 53921, 53925, 53929, 53933, 53937, 53941, - 53945, 53951, 53955, 53961, 53966, 53973, 53981, 53988, 53996, 54003, - 54011, 54020, 54027, 54037, 54048, 54054, 54063, 54069, 54078, 54087, - 54093, 54099, 54103, 54107, 54116, 54125, 54132, 54139, 54148, 0, 0, 0, - 54157, 54162, 54166, 54170, 54175, 54180, 54185, 54193, 54201, 54204, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 54208, 54213, 54218, 54223, 54228, - 54233, 54238, 54243, 54248, 54253, 54258, 54264, 54268, 54273, 54278, - 54283, 54288, 54293, 54298, 54303, 54308, 54313, 54318, 54323, 54328, - 54333, 54338, 54343, 54348, 54353, 54358, 54363, 54368, 54373, 54378, - 54384, 54389, 54395, 54404, 54409, 54417, 54424, 54433, 54438, 54443, - 54448, 54454, 0, 54461, 54466, 54471, 54476, 54481, 54486, 54491, 54496, - 54501, 54506, 54511, 54517, 54521, 54526, 54531, 54536, 54541, 54546, - 54551, 54556, 54561, 54566, 54571, 54576, 54581, 54586, 54591, 54596, - 54601, 54606, 54611, 54616, 54621, 54626, 54631, 54637, 54642, 54648, - 54657, 54662, 54670, 54677, 54686, 54691, 54696, 54701, 54707, 0, 54714, - 54722, 54730, 54739, 54746, 54754, 54760, 54769, 54777, 54785, 54793, - 54801, 54809, 54817, 54822, 54829, 54835, 54842, 54850, 54857, 54864, - 54872, 54878, 54884, 54891, 54898, 54908, 54918, 54925, 54932, 54937, - 54947, 54957, 54962, 54967, 54972, 54977, 54982, 54987, 54992, 54997, - 55002, 55007, 55012, 55017, 55022, 55027, 55032, 55037, 55042, 55047, - 55052, 55057, 55062, 55067, 55072, 55077, 55082, 55087, 55092, 55097, - 55102, 55107, 55111, 55115, 55120, 55125, 55130, 55135, 55140, 55145, - 55150, 55155, 55160, 55165, 55170, 55175, 55180, 55185, 55190, 55195, - 55200, 55205, 55212, 55219, 55226, 55233, 55240, 55247, 55254, 55261, - 55268, 55275, 55282, 55289, 55296, 55303, 55308, 55313, 55320, 55327, - 55334, 55341, 55348, 55355, 55362, 55369, 55376, 55383, 55390, 55397, - 55403, 55409, 55415, 55421, 55428, 55435, 55442, 55449, 55456, 55463, - 55470, 55477, 55484, 55491, 55499, 55507, 55515, 55523, 55531, 55539, - 55547, 55555, 55559, 55565, 55571, 55575, 55581, 55587, 55593, 55600, - 55607, 55614, 55621, 55626, 55632, 0, 0, 0, 0, 0, 0, 0, 55638, 55646, - 55655, 55664, 55672, 55678, 55683, 55688, 55693, 55698, 55703, 55708, - 55713, 55718, 55723, 55728, 55733, 55738, 55743, 55748, 55753, 55758, - 55763, 55768, 55773, 55778, 55783, 55788, 55793, 55798, 55803, 55808, - 55813, 55818, 55823, 55828, 55833, 55838, 55843, 55848, 55853, 55858, - 55863, 55868, 55873, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55878, 55882, 55887, - 55892, 55897, 55902, 55911, 55916, 55921, 55926, 55931, 55936, 55941, - 55946, 55951, 55958, 55963, 55968, 55977, 55984, 55989, 55994, 55999, - 56006, 56011, 56018, 56023, 56028, 56035, 56042, 56047, 56052, 56057, - 56064, 56071, 56076, 56081, 56086, 56091, 56096, 56103, 56110, 56115, - 56120, 56125, 56130, 56135, 56140, 56145, 56150, 56155, 56160, 56165, - 56172, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56177, 56184, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 56189, 56194, 56198, 56202, 56206, 56210, 56214, 56218, - 56222, 56226, 56230, 56234, 56240, 56244, 56248, 56252, 56256, 56260, - 56264, 56268, 56272, 56276, 56280, 56284, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 56288, 56292, 56296, 56300, 56304, 56308, 56312, 0, 56316, 56320, 56324, - 56328, 56332, 56336, 56340, 0, 56344, 56348, 56352, 56356, 56360, 56364, - 56368, 0, 56372, 56376, 56380, 56384, 56388, 56392, 56396, 0, 56400, - 56404, 56408, 56412, 56416, 56420, 56424, 0, 56428, 56432, 56436, 56440, - 56444, 56448, 56452, 0, 56456, 56460, 56464, 56468, 56472, 56476, 56480, - 0, 56484, 56488, 56492, 56496, 56500, 56504, 56508, 0, 56512, 56517, - 56522, 56527, 56532, 56537, 56542, 56546, 56551, 56556, 56561, 56565, - 56570, 56575, 56580, 56585, 56589, 56594, 56599, 56604, 56609, 56614, - 56619, 56623, 56628, 56633, 56640, 56645, 56650, 56656, 56663, 56670, - 56679, 56686, 56695, 56699, 56703, 56709, 56715, 56721, 56729, 56735, - 56739, 56743, 56747, 56753, 56759, 56763, 56765, 56769, 56775, 56777, - 56781, 56785, 56789, 56795, 56800, 56804, 56808, 56813, 56819, 56824, - 56829, 56834, 56839, 56846, 56853, 56858, 56863, 56868, 56873, 56878, - 56883, 56887, 56891, 56898, 56905, 56911, 56915, 56920, 56922, 56926, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 56934, 56938, 56942, 56947, 56952, 56957, 56961, 56965, - 56969, 56974, 56979, 56983, 56987, 56991, 56995, 57000, 57005, 57010, - 57015, 57019, 57023, 57028, 57033, 57038, 57043, 57047, 0, 57051, 57055, - 57059, 57063, 57067, 57071, 57075, 57080, 57085, 57089, 57094, 57099, - 57108, 57112, 57116, 57120, 57127, 57131, 57136, 57141, 57145, 57149, - 57155, 57160, 57165, 57170, 57175, 57179, 57183, 57187, 57191, 57195, - 57200, 57205, 57209, 57213, 57218, 57223, 57228, 57232, 57236, 57241, - 57246, 57252, 57258, 57262, 57268, 57274, 57278, 57284, 57290, 57295, - 57300, 57304, 57310, 57314, 57318, 57324, 57330, 57335, 57340, 57344, - 57348, 57356, 57362, 57368, 57374, 57379, 57384, 57389, 57395, 57399, - 57405, 57409, 57413, 57419, 57425, 57431, 57437, 57443, 57449, 57455, - 57461, 57467, 57473, 57479, 57485, 57489, 57495, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 57501, 57504, 57508, 57512, 57516, 57520, 57523, 57526, - 57530, 57534, 57538, 57542, 57545, 57550, 57554, 57558, 57562, 57567, - 57571, 57575, 57579, 57583, 57589, 57595, 57599, 57603, 57607, 57611, - 57615, 57619, 57623, 57627, 57631, 57635, 57639, 57645, 57649, 57653, - 57657, 57661, 57665, 57669, 57673, 57677, 57681, 57685, 57689, 57693, - 57697, 57701, 57705, 57709, 57715, 57721, 57726, 57731, 57735, 57739, - 57743, 57747, 57751, 57755, 57759, 57763, 57767, 57771, 57775, 57779, - 57783, 57787, 57791, 57795, 57799, 57803, 57807, 57811, 57815, 57819, - 57823, 57827, 57833, 57837, 57841, 57845, 57849, 57853, 57857, 57861, - 57865, 57870, 57877, 57881, 57885, 57889, 57893, 57897, 57901, 57905, - 57909, 57913, 57917, 57921, 57925, 57932, 57936, 57942, 57946, 57950, - 57954, 57958, 57962, 57965, 57969, 57973, 57977, 57981, 57985, 57989, - 57993, 57997, 58001, 58005, 58009, 58013, 58017, 58021, 58025, 58029, - 58033, 58037, 58041, 58045, 58049, 58053, 58057, 58061, 58065, 58069, - 58073, 58077, 58081, 58085, 58089, 58093, 58099, 58103, 58107, 58111, - 58115, 58119, 58123, 58127, 58131, 58135, 58139, 58143, 58147, 58151, - 58155, 58159, 58163, 58167, 58171, 58175, 58179, 58183, 58187, 58191, - 58195, 58199, 58203, 58207, 58215, 58219, 58223, 58227, 58231, 58235, - 58241, 58245, 58249, 58253, 58257, 58261, 58265, 58269, 58273, 58277, - 58281, 58285, 58289, 58293, 58299, 58303, 58307, 58311, 58315, 58319, - 58323, 58327, 58331, 58335, 58339, 58343, 58347, 58351, 58355, 58359, - 58363, 58367, 58371, 58375, 58379, 58383, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 58387, 58396, 58404, - 58416, 58427, 58435, 58444, 58453, 58463, 58475, 58487, 58499, 0, 0, 0, - 0, 58505, 58508, 58511, 58516, 58519, 58526, 58530, 58534, 58538, 58542, - 58546, 58551, 58556, 58560, 58564, 58569, 58574, 58579, 58584, 58587, - 58590, 58596, 58602, 58607, 58612, 58619, 58626, 58630, 58634, 58638, - 58646, 58652, 58659, 58664, 58669, 58674, 58679, 58684, 58689, 58694, - 58699, 58704, 58709, 58714, 58719, 58724, 58729, 58735, 58740, 58744, - 58750, 58761, 58771, 58786, 58796, 58800, 58809, 58815, 58821, 58827, - 58832, 58835, 58840, 58844, 0, 58850, 58854, 58857, 58861, 58864, 58868, - 58871, 58875, 58878, 58882, 58885, 58888, 58892, 58896, 58900, 58904, - 58908, 58912, 58916, 58920, 58924, 58928, 58932, 58936, 58940, 58944, - 58948, 58952, 58956, 58960, 58964, 58968, 58972, 58976, 58980, 58985, - 58989, 58993, 58997, 59001, 59004, 59008, 59011, 59015, 59019, 59023, - 59027, 59030, 59034, 59037, 59041, 59045, 59049, 59053, 59057, 59061, - 59065, 59069, 59073, 59077, 59081, 59085, 59088, 59092, 59096, 59100, - 59104, 59108, 59111, 59116, 59120, 59125, 59129, 59132, 59136, 59140, - 59144, 59148, 59153, 59157, 59161, 59165, 59169, 59172, 59176, 59180, 0, - 0, 59185, 59193, 59201, 59208, 59215, 59219, 59225, 59230, 59235, 59239, - 59242, 59246, 59249, 59253, 59256, 59260, 59263, 59267, 59270, 59273, - 59277, 59281, 59285, 59289, 59293, 59297, 59301, 59305, 59309, 59313, - 59317, 59321, 59325, 59329, 59333, 59337, 59341, 59345, 59349, 59353, - 59357, 59361, 59365, 59370, 59374, 59378, 59382, 59386, 59389, 59393, - 59396, 59400, 59404, 59408, 59412, 59415, 59419, 59422, 59426, 59430, - 59434, 59438, 59442, 59446, 59450, 59454, 59458, 59462, 59466, 59470, - 59473, 59477, 59481, 59485, 59489, 59493, 59496, 59501, 59505, 59510, - 59514, 59517, 59521, 59525, 59529, 59533, 59538, 59542, 59546, 59550, - 59554, 59557, 59561, 59565, 59570, 59574, 59578, 59582, 59586, 59591, - 59598, 59602, 59608, 0, 0, 0, 0, 0, 59613, 59617, 59621, 59624, 59628, - 59632, 59636, 59639, 59642, 59646, 59650, 59654, 59658, 59662, 59666, - 59670, 59674, 59678, 59681, 59685, 59689, 59692, 59695, 59698, 59701, - 59705, 59709, 59713, 59717, 59721, 59725, 59729, 59733, 59737, 59741, - 59744, 59747, 59751, 59755, 59759, 59763, 0, 0, 0, 59767, 59771, 59775, - 59779, 59783, 59787, 59791, 59795, 59799, 59803, 59807, 59811, 59815, - 59819, 59823, 59827, 59831, 59835, 59839, 59843, 59847, 59851, 59855, - 59859, 59863, 59867, 59871, 59875, 59879, 59883, 59887, 59890, 59894, - 59897, 59901, 59905, 59908, 59912, 59916, 59919, 59923, 59927, 59931, - 59935, 59938, 59942, 59946, 59950, 59954, 59958, 59962, 59965, 59968, - 59972, 59976, 59980, 59984, 59988, 59992, 59996, 60000, 60004, 60008, - 60012, 60016, 60020, 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, 0, 60136, 60142, 60148, 60153, 60158, 60163, 60169, 60175, 60181, - 60187, 60193, 60199, 60205, 60211, 60217, 60223, 60229, 60233, 60237, - 60241, 60245, 60249, 60253, 60257, 60261, 60265, 60269, 60273, 60277, - 60281, 60285, 60289, 60293, 60297, 60301, 60305, 60309, 60314, 60319, - 60324, 60329, 60333, 60337, 0, 0, 0, 0, 0, 60341, 60346, 60351, 60356, - 60361, 60366, 60371, 60376, 60381, 60386, 60391, 60396, 60401, 60406, - 60411, 60416, 60420, 60425, 60429, 60434, 60439, 60444, 60449, 60454, - 60459, 60464, 60469, 60474, 60479, 60484, 60489, 60494, 60499, 60504, - 60509, 60514, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 60519, 60524, 60529, - 60534, 60538, 60543, 60547, 60552, 60557, 60562, 60567, 60572, 60576, - 60581, 60586, 60591, 60596, 60600, 60604, 60608, 60612, 60616, 60620, - 60624, 60628, 60632, 60636, 60640, 60644, 60648, 60652, 60657, 60662, - 60667, 60672, 60677, 60682, 60687, 60692, 60697, 60702, 60707, 60712, - 60717, 60722, 60727, 60733, 0, 60740, 60743, 60746, 60749, 60752, 60755, - 60758, 60761, 60764, 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, 60900, 60909, 60918, 60927, 60936, - 60945, 60954, 60963, 60966, 60971, 60976, 60981, 60986, 60991, 60996, - 61001, 61006, 61011, 61015, 61020, 61025, 61030, 61035, 61040, 61044, - 61048, 61052, 61056, 61060, 61064, 61068, 61072, 61076, 61080, 61084, - 61088, 61092, 61096, 61101, 61106, 61111, 61116, 61121, 61126, 61131, - 61136, 61141, 61146, 61151, 61156, 61161, 61166, 61172, 61178, 61183, - 61188, 61191, 61194, 61197, 61200, 61203, 61206, 61209, 61212, 61215, - 61219, 61223, 61227, 61231, 61235, 61239, 61243, 61247, 61251, 61255, - 61259, 61263, 61267, 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, - 61380, 61385, 61390, 61395, 61399, 61404, 61409, 61414, 61419, 61424, - 61429, 61434, 61439, 61444, 61448, 61454, 61460, 61466, 61472, 61478, - 61484, 61490, 61496, 61502, 61508, 61514, 61520, 61523, 61526, 61529, - 61534, 61537, 61540, 61543, 61546, 61549, 61552, 61556, 61560, 61564, - 61568, 61572, 61576, 61580, 61584, 61588, 61592, 61596, 61600, 61604, - 61607, 61610, 61614, 61618, 61622, 61626, 61629, 61633, 61637, 61641, - 61645, 61648, 61652, 61656, 61660, 61664, 61667, 61671, 61675, 61678, - 61682, 61686, 61690, 61694, 61698, 61702, 61706, 0, 61710, 61713, 61716, - 61719, 61722, 61725, 61728, 61731, 61734, 61737, 61740, 61743, 61746, - 61749, 61752, 61755, 61758, 61761, 61764, 61767, 61770, 61773, 61776, - 61779, 61782, 61785, 61788, 61791, 61794, 61797, 61800, 61803, 61806, - 61809, 61812, 61815, 61818, 61821, 61824, 61827, 61830, 61833, 61836, - 61839, 61842, 61845, 61848, 61851, 61854, 61857, 61860, 61863, 61866, - 61869, 61872, 61875, 61878, 61881, 61884, 61887, 61890, 61893, 61896, - 61899, 61902, 61905, 61908, 61911, 61914, 61917, 61920, 61923, 61926, - 61929, 61932, 61935, 61938, 61941, 61944, 61947, 61950, 61953, 61956, - 61959, 61962, 61965, 61968, 61971, 61974, 61982, 61989, 61996, 62003, - 62010, 62017, 62024, 62031, 62038, 62045, 62053, 62061, 62069, 62077, - 62085, 62093, 62101, 62109, 62117, 62125, 62133, 62141, 62149, 62157, - 62165, 62168, 62171, 62174, 62176, 62179, 62182, 62185, 62190, 62195, - 62198, 62205, 62212, 62219, 62226, 62229, 62234, 62236, 62240, 62242, - 62244, 62247, 62250, 62253, 62256, 62259, 62262, 62265, 62270, 62275, - 62278, 62281, 62284, 62287, 62290, 62293, 62296, 62300, 62303, 62306, - 62309, 62312, 62315, 62319, 62322, 62325, 62328, 62333, 62338, 62343, - 62348, 62353, 62358, 62363, 62368, 62373, 62381, 62383, 62386, 62389, - 62392, 62395, 62400, 62408, 62411, 62414, 62418, 62421, 62424, 62427, - 62432, 62435, 62438, 62443, 62446, 62449, 62454, 62457, 62460, 62465, - 62470, 62475, 62478, 62481, 62484, 62487, 62493, 62496, 62499, 62502, - 62504, 62507, 62510, 62513, 62518, 62521, 62524, 62527, 62530, 62533, - 62538, 62541, 62544, 62547, 62550, 62553, 62556, 62559, 62562, 62565, - 62570, 62574, 62581, 62588, 62595, 62602, 62609, 62616, 62623, 62630, - 62637, 62645, 62653, 62661, 62669, 62677, 62685, 62693, 62701, 62709, - 62717, 62725, 62733, 62741, 62749, 62757, 62765, 62773, 62781, 62789, - 62797, 62805, 62813, 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, - 62816, 62825, 62834, 62845, 62852, 62857, 62862, 62869, 62876, 62882, - 62887, 62892, 62897, 62902, 62909, 62914, 62919, 62924, 62935, 62940, - 62945, 62952, 62957, 62964, 62969, 62974, 62981, 62988, 62995, 63004, - 63013, 63018, 63023, 63028, 63035, 63040, 63050, 63057, 63062, 63067, - 63072, 63077, 63082, 63087, 63096, 63103, 63110, 63115, 63122, 63127, - 63134, 63143, 63154, 63159, 63168, 63173, 63180, 63189, 63198, 63203, - 63208, 63215, 63221, 63228, 63235, 63239, 63243, 63246, 63250, 63254, - 63258, 63262, 63266, 63270, 63274, 63277, 63281, 63285, 63289, 63293, - 63297, 63301, 63304, 63308, 63312, 63315, 63319, 63323, 63327, 63331, - 63335, 63339, 63343, 63347, 63351, 63355, 63359, 63363, 63367, 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, - 63494, 63498, 63502, 63506, 63510, 63514, 63518, 63522, 63526, 63530, - 63534, 63538, 63542, 63546, 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, 63965, 63969, - 63973, 63977, 63981, 63985, 63989, 63993, 63997, 64001, 64005, 64009, - 64013, 64017, 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, + 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 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, 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, 64357, 64361, 64365, 64369, - 64373, 64377, 64381, 64385, 64389, 64393, 64397, 64401, 64405, 64409, - 64413, 64417, 64421, 64425, 64428, 64432, 64436, 64440, 64444, 64448, + 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, @@ -15004,8 +15532,8 @@ 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, 64787, 64791, 64795, 64799, 64803, 64807, - 64811, 64815, 64819, 64823, 64827, 64831, 64835, 64839, 64843, 64847, + 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, @@ -15016,7 +15544,7 @@ 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, 65282, 65286, + 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, @@ -15026,9 +15554,9 @@ 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, 65737, 65741, 65745, 65749, 65753, 65757, 65761, 65765, + 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, @@ -15038,1599 +15566,1762 @@ 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, 66340, 66344, 66348, 66352, 66356, 66360, 66364, + 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, 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, 67099, 67103, 67107, 67111, 67115, 67119, 67123, + 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, 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, 0, 0, 0, - 67883, 67887, 67891, 67895, 67899, 67903, 67907, 67911, 67915, 67919, - 67923, 67927, 67931, 67935, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68103, - 68108, 68112, 68117, 68122, 68127, 68132, 68137, 68141, 68146, 68151, - 68156, 68161, 68166, 68171, 68176, 68180, 68184, 68189, 68194, 68199, - 68204, 68209, 68213, 68218, 68223, 68228, 68233, 68238, 68242, 68247, - 68251, 68256, 68260, 68265, 68269, 68273, 68277, 68282, 68287, 68292, - 68300, 68308, 68316, 68324, 68331, 68339, 68345, 68353, 68357, 68361, - 68365, 68369, 68373, 68377, 68381, 68385, 68389, 68393, 68397, 68401, - 68405, 68409, 68413, 68417, 68421, 68425, 68429, 68433, 68437, 68441, - 68445, 68449, 68453, 68457, 68461, 68465, 68469, 68473, 68477, 68481, - 68485, 68489, 68493, 68497, 68500, 68504, 68508, 68512, 68516, 68520, + 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, 68647, 68651, 68655, 68658, 68662, 68666, 68670, 68673, 68677, - 68681, 68685, 68689, 68693, 68697, 68701, 68705, 68709, 68713, 68717, - 68721, 68725, 68729, 68732, 68736, 68740, 68744, 68748, 68752, 68756, - 68760, 68764, 68768, 68771, 68774, 68778, 68782, 68786, 68789, 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, 68943, 68947, 68951, - 68955, 68959, 68963, 68967, 68971, 68975, 68979, 68983, 68987, 68991, - 68995, 68999, 69003, 69007, 69011, 69015, 69019, 69023, 69027, 69031, - 69035, 69039, 69043, 69047, 69051, 69055, 69059, 69063, 69067, 69071, - 69075, 69079, 69083, 69087, 69090, 69094, 69098, 69102, 69106, 69110, - 69114, 69118, 69122, 69126, 69130, 69134, 69138, 69142, 69146, 69150, - 69154, 69157, 69161, 69165, 69169, 69173, 69177, 69181, 69185, 69189, - 69193, 69197, 69201, 69205, 69209, 69213, 69217, 69221, 69225, 69229, - 69233, 69237, 69241, 69244, 69248, 69252, 69256, 69260, 69264, 69268, - 69272, 69276, 69280, 69284, 69288, 69292, 69296, 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, 69419, 69424, 69428, - 69434, 69439, 69445, 69449, 69453, 69457, 69461, 69465, 69469, 69473, - 69477, 69481, 69485, 69489, 69493, 69497, 69501, 69504, 69507, 69510, - 69513, 69516, 69519, 69522, 69525, 69528, 69533, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 69539, 69544, 69549, 69554, 69559, - 69566, 69573, 69578, 69583, 69588, 69593, 69600, 69607, 69614, 69621, - 69628, 69635, 69645, 69655, 69662, 69669, 69676, 69683, 69689, 69695, - 69704, 69713, 69720, 69727, 69738, 69749, 69754, 69759, 69766, 69773, - 69780, 69787, 69794, 69801, 69808, 69815, 69821, 69827, 69833, 69839, - 69846, 69853, 69858, 69862, 69869, 69876, 69883, 0, 0, 0, 0, 0, 0, 0, 0, - 69887, 69891, 69895, 69898, 69901, 69906, 69911, 69916, 69921, 69926, - 69931, 69936, 69941, 69946, 69951, 69960, 69969, 69974, 69979, 69984, - 69989, 69994, 69999, 70004, 70009, 70014, 70019, 70024, 0, 0, 0, 0, 0, 0, - 0, 0, 70029, 70032, 70035, 70038, 70042, 70046, 70050, 70054, 70057, - 70061, 70064, 70068, 70071, 70075, 70079, 70083, 70087, 70091, 70095, - 70099, 70102, 70106, 70110, 70114, 70118, 70122, 70126, 70130, 70134, - 70138, 70142, 70146, 70150, 70154, 70158, 70161, 70165, 70169, 70173, - 70177, 70181, 70185, 70189, 70193, 70197, 70201, 70205, 70209, 70213, - 70217, 70221, 70225, 70229, 70233, 70237, 70241, 70245, 70249, 70253, - 70257, 70260, 70264, 70268, 70272, 70276, 70280, 70284, 70288, 70291, - 70295, 70299, 70303, 70307, 70311, 70315, 70319, 70323, 70327, 70331, - 70335, 70339, 70344, 70349, 70352, 70357, 70360, 70363, 70366, 0, 0, 0, - 0, 0, 0, 0, 0, 70370, 70379, 70388, 70397, 70406, 70415, 70424, 70433, - 70442, 70450, 70457, 70465, 70472, 70480, 70490, 70499, 70509, 70518, - 70528, 70536, 70543, 70551, 70558, 70566, 70571, 70576, 70581, 70590, - 70596, 70602, 70609, 70618, 70626, 70634, 70642, 70649, 70656, 70663, - 70670, 70675, 70680, 70685, 70690, 70695, 70700, 70705, 70710, 70718, - 70726, 70732, 70737, 70742, 70747, 70752, 70757, 70762, 70767, 70772, - 70777, 70785, 70793, 70798, 70803, 70813, 70823, 70830, 70837, 70846, - 70855, 70867, 70879, 70885, 70891, 70899, 70907, 70917, 70927, 70934, - 70941, 70946, 70951, 70963, 70975, 70983, 70991, 71001, 71011, 71023, - 71035, 71044, 71053, 71060, 71067, 71074, 71081, 71090, 71099, 71104, - 71109, 71116, 71123, 71130, 71137, 71149, 71161, 71166, 71171, 71176, - 71181, 71186, 71191, 71196, 71201, 71205, 71210, 71215, 71220, 71225, - 71230, 71236, 71241, 71246, 71253, 71260, 71267, 71274, 71281, 71290, - 71299, 71305, 71311, 71317, 71323, 71329, 71335, 71342, 71349, 71356, - 71360, 71367, 71372, 71377, 71384, 0, 71397, 71405, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 71413, 71422, 71431, 71440, 71449, 71458, 71467, - 71476, 71485, 71494, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 71503, 71510, 71518, 71526, - 71533, 71541, 71548, 71554, 71560, 71567, 71573, 71579, 71585, 71592, - 71599, 71606, 71613, 71620, 71627, 71634, 71641, 71648, 71655, 71662, - 71669, 71676, 71683, 71689, 71696, 71703, 71710, 71717, 71724, 71731, - 71738, 71745, 71752, 71759, 71766, 71773, 71780, 71787, 71794, 71801, - 71808, 71815, 71823, 71831, 71839, 71847, 0, 0, 0, 0, 71855, 71864, - 71873, 71882, 71891, 71900, 71909, 71916, 71923, 71930, 0, 0, 0, 0, 0, 0, - 71937, 71941, 71946, 71951, 71956, 71961, 71966, 71971, 71976, 71981, - 71986, 71991, 71995, 71999, 72004, 72009, 72013, 72018, 72023, 72028, - 72033, 72038, 72043, 72048, 72052, 72056, 72061, 72066, 72071, 72075, - 72079, 72083, 72087, 72091, 72095, 72100, 72105, 72110, 72115, 72120, - 72127, 72133, 72138, 72143, 72148, 72153, 72159, 72166, 72172, 72179, - 72185, 72191, 72196, 72203, 72209, 72214, 0, 0, 0, 0, 0, 0, 0, 0, 72220, - 72224, 72228, 72231, 72235, 72238, 72242, 72245, 72249, 72253, 72258, - 72262, 72267, 72270, 72274, 72278, 72281, 72285, 72289, 72292, 72296, - 72300, 72304, 72308, 72312, 72316, 72320, 72324, 72328, 72332, 72336, - 72340, 72344, 72348, 72352, 72356, 72360, 72364, 72367, 72370, 72374, - 72378, 72382, 72385, 72388, 72391, 72395, 72399, 72403, 72407, 72411, - 72414, 72418, 72423, 72428, 72432, 72437, 72441, 72446, 72451, 72457, - 72462, 72468, 72472, 72477, 72482, 72486, 72491, 72496, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 72500, 72503, 72507, 72511, 72514, 72517, 72520, 72523, 72526, - 72529, 72532, 72535, 0, 0, 0, 0, 0, 0, 72538, 72543, 72547, 72551, 72555, - 72559, 72563, 72567, 72571, 72575, 72579, 72583, 72587, 72591, 72595, - 72599, 72603, 72608, 72613, 72619, 72625, 72632, 72637, 72642, 72648, - 72652, 72657, 72660, 0, 0, 0, 0, 72663, 72670, 72676, 72682, 72688, - 72694, 72700, 72706, 72712, 72718, 72724, 72730, 72737, 72744, 72751, - 72758, 72765, 72772, 72779, 72786, 72793, 72799, 72805, 72812, 72818, - 72825, 72832, 72838, 72844, 72851, 72858, 72865, 72871, 72878, 72885, - 72891, 72898, 72904, 72911, 72918, 72924, 72930, 72937, 72943, 72950, - 72957, 72966, 72973, 72980, 72984, 72989, 72994, 72999, 73004, 73008, - 73012, 73017, 73021, 73026, 73031, 73036, 73041, 73045, 73050, 73054, - 73059, 73063, 73068, 73073, 73078, 73083, 73087, 73092, 73097, 73102, - 73108, 73113, 73119, 73125, 73131, 73137, 73142, 73147, 73153, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 73157, 73162, 73166, 73170, 73174, 73178, 73182, - 73186, 73190, 73194, 73198, 73202, 73206, 73210, 73214, 73218, 73222, - 73226, 73230, 73234, 73238, 73242, 73246, 73250, 73254, 73258, 73262, - 73266, 73270, 73274, 0, 0, 0, 73278, 73282, 73286, 73290, 73294, 73297, - 73303, 73306, 73310, 73313, 73319, 73325, 73333, 73336, 73340, 73343, - 73346, 73352, 73358, 73362, 73368, 73372, 73376, 73382, 73386, 73392, - 73398, 73402, 73406, 73412, 73416, 73422, 73428, 73432, 73438, 73442, - 73448, 73451, 73454, 73460, 73464, 73470, 73473, 73476, 73479, 73485, - 73489, 73493, 73499, 73505, 73509, 73512, 73518, 73523, 73528, 73533, - 73540, 73545, 73552, 73557, 73564, 73569, 73574, 73579, 73584, 73587, - 73591, 73595, 73600, 73605, 73610, 73615, 73620, 73625, 73630, 73635, - 73642, 73647, 0, 73654, 73657, 73661, 73664, 73667, 73670, 73673, 73676, - 73679, 73682, 73685, 0, 0, 0, 0, 73688, 73695, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 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, - 73700, 73703, 73706, 73709, 73712, 73716, 73719, 73722, 73726, 73730, - 73734, 73738, 73742, 73746, 73750, 73754, 73758, 73762, 73766, 73770, - 73774, 73778, 73782, 73786, 73790, 73793, 73797, 73800, 73804, 73808, - 73812, 73816, 73820, 73823, 73827, 73830, 73833, 73837, 73841, 73845, - 73849, 73852, 73857, 73861, 73866, 73871, 73875, 73880, 73884, 73889, - 73894, 73899, 73903, 73907, 73912, 0, 0, 0, 0, 0, 0, 0, 0, 0, 73917, - 73922, 73927, 73932, 73938, 73943, 73948, 73952, 73957, 73962, 73966, - 73970, 73975, 73980, 0, 0, 73986, 73990, 73993, 73996, 73999, 74002, - 74005, 74008, 74011, 74014, 0, 0, 74017, 74022, 74027, 74033, 74040, - 74046, 74052, 74058, 74064, 74070, 74076, 74082, 74088, 74094, 74100, - 74106, 74111, 74117, 74122, 74128, 74134, 74141, 74147, 74153, 74158, - 74165, 74172, 74179, 74185, 74190, 74195, 74200, 0, 0, 0, 0, 74208, - 74214, 74220, 74226, 74232, 74238, 74244, 74250, 74256, 74262, 74268, - 74274, 74280, 74286, 74292, 74298, 74304, 74310, 74316, 74322, 74328, - 74333, 74338, 74344, 74350, 74356, 74362, 74368, 74374, 74380, 74386, - 74392, 74398, 74404, 74410, 74416, 74422, 74428, 74434, 74440, 74446, - 74452, 74458, 74464, 74470, 74476, 74482, 74487, 74492, 74498, 74503, - 74507, 74512, 74516, 74520, 74524, 74530, 74535, 74540, 74545, 74550, - 74555, 74560, 74565, 74572, 74579, 74586, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 74593, 74598, 74603, 74608, - 74615, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 74622, 74626, 74630, 74634, 74638, - 74642, 0, 0, 74646, 74650, 74654, 74658, 74662, 74666, 0, 0, 74670, - 74674, 74678, 74682, 74686, 74690, 0, 0, 0, 0, 0, 0, 0, 0, 0, 74694, - 74698, 74702, 74706, 74710, 74714, 74718, 0, 74722, 74726, 74730, 74734, - 74738, 74742, 74746, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 74750, 74757, 74764, 74771, 74778, 74784, 74790, - 74797, 74804, 74811, 74818, 74825, 74832, 74839, 74846, 74853, 74859, - 74866, 74873, 74880, 74887, 74894, 74901, 74908, 74915, 74922, 74929, - 74936, 74945, 74954, 74963, 74972, 74981, 74990, 74999, 75008, 75016, - 75024, 75032, 75040, 75048, 75056, 75064, 75072, 75078, 75086, 0, 0, - 75094, 75101, 75107, 75113, 75119, 75125, 75131, 75137, 75143, 75149, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 75155, 75159, 75163, 75167, 75171, 75175, 75179, 75183, - 75187, 75191, 75195, 75199, 75203, 75207, 75211, 75215, 75219, 75223, - 75227, 75231, 75235, 75239, 75243, 0, 0, 0, 0, 75247, 75251, 75255, - 75259, 75263, 75267, 75271, 75275, 75279, 75283, 75287, 75291, 75295, - 75299, 75303, 75307, 75311, 75315, 75319, 75323, 75327, 75331, 75335, - 75339, 75343, 75347, 75351, 75355, 75359, 75363, 75367, 75371, 75375, - 75379, 75383, 75387, 75391, 75395, 75399, 75403, 75407, 75411, 75415, - 75419, 75423, 75427, 75431, 75435, 75439, 0, 0, 0, 0, 75443, 75447, - 75451, 75455, 75459, 75463, 75467, 75471, 75475, 75479, 75483, 75487, - 75491, 75495, 75499, 75503, 75507, 75511, 75515, 75519, 75523, 75527, - 75531, 75535, 75539, 75543, 75547, 75551, 75555, 75559, 75563, 75567, - 75571, 75575, 75579, 75583, 75587, 75591, 75595, 75599, 75603, 75607, - 75611, 75615, 75619, 75623, 75627, 75631, 75635, 75639, 75643, 75647, - 75651, 75655, 75659, 75663, 75667, 75671, 75675, 75679, 75683, 75687, - 75691, 75695, 75699, 75703, 75707, 75711, 75715, 75719, 75723, 75727, - 75731, 75735, 75739, 75743, 75747, 75751, 75755, 75759, 75763, 75767, - 75771, 75775, 75779, 75783, 75787, 75791, 75795, 75799, 75803, 75807, - 75811, 75815, 75819, 75823, 75827, 75831, 75835, 75839, 75843, 75847, - 75851, 75855, 75859, 75863, 75867, 75871, 75875, 75879, 75883, 75887, - 75891, 75895, 75899, 75903, 75907, 75911, 75915, 75919, 75923, 75927, - 75931, 75935, 75939, 75943, 75947, 75951, 75955, 75959, 75963, 75967, - 75971, 75975, 75979, 75983, 75987, 75991, 75995, 75999, 76003, 76007, - 76011, 76015, 76019, 76023, 76027, 76031, 76035, 76039, 76043, 76047, - 76051, 76055, 76059, 76063, 76067, 76071, 76075, 76079, 76083, 76087, - 76091, 76095, 76099, 76103, 76107, 76111, 76115, 76119, 76123, 76127, - 76131, 76135, 76139, 76143, 76147, 76151, 76155, 76159, 76163, 76167, - 76171, 76175, 76179, 76183, 76187, 76191, 76195, 76199, 76203, 76207, - 76211, 76215, 76219, 76223, 76227, 76231, 76235, 76239, 76243, 76247, - 76251, 76255, 76259, 76263, 76267, 76271, 76275, 76279, 76283, 76287, - 76291, 76295, 76299, 76303, 76307, 76311, 76315, 76319, 76323, 76327, - 76331, 76335, 76339, 76343, 76347, 76351, 76355, 76359, 76363, 76367, - 76371, 76375, 76379, 76383, 76387, 76391, 76395, 76399, 76403, 76407, - 76411, 76415, 76419, 76423, 76427, 76431, 76435, 76439, 76443, 76447, - 76451, 76455, 76459, 76463, 76467, 76471, 76475, 76479, 76483, 76487, - 76491, 76495, 76499, 76503, 76507, 76511, 76515, 76519, 76523, 76527, - 76531, 76535, 76539, 76543, 76547, 76551, 76555, 76559, 76563, 76567, - 76571, 76575, 76579, 76583, 76587, 76591, 76595, 76599, 76603, 76607, - 76611, 76615, 76619, 76623, 76627, 76631, 76635, 76639, 76643, 76647, 0, - 0, 76651, 76655, 76659, 76663, 76667, 76671, 76675, 76679, 76683, 76687, - 76691, 76695, 76699, 76703, 76707, 76711, 76715, 76719, 76723, 76727, - 76731, 76735, 76739, 76743, 76747, 76751, 76755, 76759, 76763, 76767, - 76771, 76775, 76779, 76783, 76787, 76791, 76795, 76799, 76803, 76807, - 76811, 76815, 76819, 76823, 76827, 76831, 76835, 76839, 76843, 76847, - 76851, 76855, 76859, 76863, 76867, 76871, 76875, 76879, 76883, 76887, - 76891, 76895, 0, 0, 76899, 76903, 76907, 76911, 76915, 76919, 76923, - 76927, 76931, 76935, 76939, 76943, 76947, 76951, 76955, 76959, 76963, - 76967, 76971, 76975, 76979, 76983, 76987, 76991, 76995, 76999, 77003, - 77007, 77011, 77015, 77019, 77023, 77027, 77031, 77035, 77039, 77043, - 77047, 77051, 77055, 77059, 77063, 77067, 77071, 77075, 77079, 77083, - 77087, 77091, 77095, 77099, 77103, 77107, 77111, 77115, 77119, 77123, - 77127, 77131, 77135, 77139, 77143, 77147, 77151, 77155, 77159, 77163, - 77167, 77171, 77175, 77179, 77183, 77187, 77191, 77195, 77199, 77203, - 77207, 77211, 77215, 77219, 77223, 77227, 77231, 77235, 77239, 77243, - 77247, 77251, 77255, 77259, 77263, 77267, 77271, 77275, 77279, 77283, - 77287, 77291, 77295, 77299, 77303, 77307, 77311, 77315, 77319, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 77323, 77328, 77333, 77338, 77343, - 77348, 77356, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 77361, 77368, 77375, - 77382, 77389, 0, 0, 0, 0, 0, 77396, 77403, 77410, 77420, 77426, 77432, - 77438, 77444, 77450, 77456, 77463, 77469, 77475, 77481, 77490, 77499, - 77511, 77523, 77529, 77535, 77541, 77548, 77555, 77562, 77569, 77576, 0, - 77583, 77590, 77597, 77605, 77612, 0, 77619, 0, 77626, 77633, 0, 77640, - 77648, 0, 77655, 77662, 77669, 77676, 77683, 77690, 77697, 77704, 77711, - 77718, 77723, 77730, 77737, 77743, 77749, 77755, 77761, 77767, 77773, - 77779, 77785, 77791, 77797, 77803, 77809, 77815, 77821, 77827, 77833, - 77839, 77845, 77851, 77857, 77863, 77869, 77875, 77881, 77887, 77893, - 77899, 77905, 77911, 77917, 77923, 77929, 77935, 77941, 77947, 77953, - 77959, 77965, 77971, 77977, 77983, 77989, 77995, 78001, 78007, 78013, - 78019, 78025, 78031, 78037, 78043, 78049, 78055, 78061, 78067, 78073, - 78079, 78085, 78091, 78097, 78103, 78109, 78115, 78121, 78127, 78133, - 78139, 78145, 78151, 78157, 78163, 78169, 78175, 78181, 78187, 78193, - 78201, 78209, 78215, 78221, 78227, 78233, 78242, 78251, 78259, 78267, - 78275, 78283, 78291, 78299, 78307, 78315, 78322, 78329, 78339, 78349, - 78353, 78357, 78362, 78367, 78372, 78377, 78386, 78395, 78401, 78407, - 78414, 78421, 78428, 78432, 78438, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 78444, 78450, 78456, 78462, 78468, 78473, 78478, 78484, - 78490, 78496, 78502, 78510, 78516, 78522, 78530, 78538, 78546, 78554, - 78559, 78564, 78569, 78574, 78587, 78600, 78610, 78620, 78631, 78642, - 78653, 78664, 78674, 78684, 78695, 78706, 78717, 78728, 78738, 78748, - 78758, 78774, 78790, 78806, 78813, 78820, 78827, 78834, 78844, 78854, - 78864, 78876, 78886, 78894, 78902, 78911, 78919, 78929, 78937, 78945, - 78953, 78962, 78970, 78980, 78988, 78996, 79004, 79014, 79022, 79029, - 79036, 79043, 79050, 79058, 79066, 79074, 79082, 79090, 79099, 79107, - 79115, 79123, 79131, 79139, 79148, 79156, 79164, 79172, 79180, 79188, - 79196, 79204, 79212, 79220, 79228, 79237, 79245, 79255, 79263, 79271, - 79279, 79289, 79297, 79305, 79313, 79321, 79330, 79339, 79347, 79357, - 79365, 79373, 79381, 79390, 79398, 79408, 79416, 79423, 79430, 79438, - 79445, 79454, 79461, 79469, 79477, 79486, 79494, 79504, 79512, 79520, - 79528, 79538, 79546, 79553, 79560, 79568, 79575, 79584, 79591, 79601, - 79611, 79622, 79631, 79640, 79649, 79658, 79667, 79677, 79688, 79699, - 79709, 79720, 79732, 79742, 79751, 79760, 79768, 79777, 79787, 79795, - 79804, 79813, 79821, 79830, 79840, 79848, 79857, 79866, 79874, 79883, - 79893, 79901, 79911, 79919, 79929, 79937, 79945, 79954, 79962, 79972, - 79980, 79988, 79998, 80006, 80013, 80020, 80029, 80038, 80046, 80055, - 80065, 80073, 80084, 80092, 80100, 80107, 80115, 80124, 80131, 80141, - 80151, 80162, 80172, 80183, 80191, 80199, 80208, 80216, 80225, 80233, - 80241, 80250, 80258, 80267, 80275, 80282, 80289, 80296, 80303, 80311, - 80319, 80327, 80335, 80344, 80352, 80360, 80369, 80377, 80385, 80393, - 80402, 80410, 80418, 80426, 80434, 80442, 80450, 80458, 80466, 80474, - 80483, 80491, 80499, 80507, 80515, 80523, 80532, 80541, 80549, 80557, - 80565, 80574, 80582, 80591, 80598, 80605, 80613, 80620, 80628, 80636, - 80645, 80653, 80662, 80670, 80678, 80688, 80695, 80702, 80710, 80717, - 80725, 80735, 80746, 80754, 80763, 80771, 80780, 80788, 80797, 80805, - 80814, 80822, 80831, 80840, 80848, 80856, 80864, 80873, 80880, 80888, - 80897, 80906, 80915, 80925, 80933, 80943, 80951, 80961, 80969, 80979, - 80987, 80997, 81005, 81014, 81021, 81030, 81037, 81047, 81055, 81065, - 81073, 81083, 81091, 81099, 81107, 81116, 81124, 81133, 81142, 81151, - 81160, 81170, 81178, 81188, 81196, 81206, 81214, 81224, 81232, 81242, - 81250, 81259, 81266, 81275, 81282, 81292, 81300, 81310, 81318, 81328, - 81336, 81344, 81352, 81361, 81369, 81378, 81387, 81396, 81405, 81413, - 81421, 81430, 81438, 81447, 81456, 81464, 81472, 81480, 81489, 81497, - 81505, 81514, 81522, 81530, 81538, 81546, 81551, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 81556, 81566, 81576, 81586, 81596, 81607, 81617, - 81627, 81638, 81647, 81656, 81665, 81676, 81686, 81696, 81708, 81718, - 81728, 81738, 81748, 81758, 81768, 81778, 81788, 81798, 81808, 81818, - 81829, 81840, 81850, 81860, 81872, 81883, 81894, 81904, 81914, 81924, - 81934, 81944, 81954, 81964, 81976, 81986, 81996, 82008, 82019, 82030, - 82040, 82050, 82060, 82070, 82082, 82092, 82102, 82113, 82124, 82134, - 82144, 82153, 82162, 82171, 82180, 82189, 82199, 0, 0, 82209, 82219, - 82229, 82239, 82249, 82261, 82271, 82281, 82293, 82303, 82315, 82324, - 82333, 82344, 82354, 82366, 82377, 82390, 82400, 82412, 82421, 82432, - 82443, 82456, 82466, 82476, 82486, 82496, 82506, 82515, 82524, 82533, - 82542, 82552, 82562, 82572, 82582, 82592, 82602, 82612, 82622, 82632, - 82642, 82652, 82662, 82671, 82680, 82689, 82699, 82709, 82719, 82729, - 82739, 82750, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82760, 82775, - 82790, 82796, 82802, 82808, 82814, 82820, 82826, 82832, 82838, 82846, - 82850, 82853, 0, 0, 82861, 82864, 82867, 82870, 82873, 82876, 82879, - 82882, 82885, 82888, 82891, 82894, 82897, 82900, 82903, 82906, 82909, - 82917, 82926, 82937, 82945, 82953, 82962, 82971, 82982, 82994, 0, 0, 0, - 0, 0, 0, 83003, 83008, 83013, 83020, 83027, 83033, 83039, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 83044, 83054, 83064, 83074, 83083, 83094, 83103, 83112, - 83122, 83132, 83144, 83156, 83167, 83178, 83189, 83200, 83210, 83220, - 83230, 83240, 83251, 83262, 83266, 83271, 83280, 83289, 83293, 83297, - 83301, 83306, 83311, 83316, 83321, 83324, 83328, 0, 83333, 83336, 83339, - 83343, 83347, 83352, 83356, 83360, 83365, 83370, 83377, 83384, 83387, - 83390, 83393, 83396, 83399, 83403, 83407, 0, 83411, 83416, 83420, 83424, - 0, 0, 0, 0, 83429, 83434, 83441, 83446, 83451, 0, 83456, 83461, 83466, - 83471, 83476, 83481, 83486, 83491, 83496, 83501, 83506, 83511, 83520, - 83529, 83537, 83545, 83554, 83563, 83572, 83581, 83589, 83597, 83605, - 83613, 83618, 83623, 83629, 83635, 83641, 83647, 83655, 83663, 83669, - 83675, 83681, 83687, 83693, 83699, 83705, 83711, 83716, 83721, 83726, - 83731, 83736, 83741, 83746, 83751, 83757, 83763, 83769, 83775, 83781, - 83787, 83793, 83799, 83805, 83811, 83817, 83823, 83829, 83835, 83841, - 83847, 83853, 83859, 83865, 83871, 83877, 83883, 83889, 83895, 83901, - 83907, 83913, 83919, 83925, 83931, 83937, 83943, 83949, 83955, 83961, - 83967, 83973, 83979, 83985, 83991, 83997, 84003, 84009, 84015, 84021, - 84027, 84033, 84039, 84045, 84051, 84057, 84063, 84069, 84075, 84081, - 84087, 84093, 84099, 84105, 84111, 84116, 84121, 84126, 84131, 84137, - 84143, 84149, 84155, 84161, 84167, 84173, 84179, 84185, 84191, 84198, - 84205, 84210, 84215, 84220, 84225, 84237, 84249, 84260, 84271, 84283, - 84295, 84303, 0, 0, 84311, 0, 84319, 84323, 84327, 84330, 84334, 84338, - 84341, 84344, 84348, 84352, 84355, 84358, 84361, 84364, 84369, 84372, - 84376, 84379, 84382, 84385, 84388, 84391, 84394, 84397, 84400, 84403, - 84406, 84409, 84413, 84417, 84421, 84425, 84430, 84435, 84441, 84447, - 84453, 84458, 84464, 84470, 84476, 84481, 84487, 84493, 84498, 84503, - 84508, 84513, 84519, 84525, 84530, 84535, 84541, 84546, 84552, 84558, - 84564, 84570, 84576, 84580, 84585, 84589, 84594, 84598, 84603, 84608, - 84614, 84620, 84626, 84631, 84637, 84643, 84649, 84654, 84660, 84666, - 84671, 84676, 84681, 84686, 84692, 84698, 84703, 84708, 84714, 84719, - 84725, 84731, 84737, 84743, 84749, 84754, 84758, 84763, 84765, 84770, - 84775, 84781, 84786, 84791, 84795, 84801, 84806, 84811, 84816, 84821, - 84826, 84831, 84836, 84842, 84848, 84854, 84862, 84866, 84870, 84874, - 84878, 84882, 84886, 84891, 84896, 84901, 84906, 84911, 84916, 84921, - 84926, 84931, 84936, 84941, 84946, 84951, 84955, 84959, 84964, 84969, - 84974, 84979, 84983, 84988, 84993, 84998, 85003, 85007, 85012, 85017, - 85022, 85027, 85031, 85036, 85041, 85045, 85050, 85055, 85060, 85065, - 85070, 85074, 85081, 85088, 85092, 85097, 85102, 85107, 85112, 85117, - 85122, 85127, 85132, 85137, 85142, 85147, 85152, 85157, 85162, 85167, - 85172, 85177, 85182, 85187, 85192, 85197, 85202, 85207, 85212, 85217, - 85222, 85227, 85232, 85237, 0, 0, 0, 85242, 85246, 85251, 85255, 85260, - 85265, 0, 0, 85269, 85274, 85279, 85283, 85288, 85293, 0, 0, 85298, - 85303, 85307, 85312, 85317, 85322, 0, 0, 85327, 85332, 85337, 0, 0, 0, - 85341, 85345, 85349, 85353, 85356, 85360, 85364, 0, 85368, 85374, 85377, - 85381, 85384, 85388, 85392, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 85396, 85402, - 85408, 85414, 85420, 0, 0, 85424, 85430, 85436, 85442, 85448, 85454, - 85461, 85468, 85475, 85482, 85489, 85496, 0, 85503, 85510, 85517, 85523, - 85530, 85537, 85544, 85551, 85557, 85564, 85571, 85578, 85585, 85591, - 85598, 85605, 85612, 85619, 85625, 85632, 85639, 85646, 85653, 85660, - 85667, 85674, 0, 85681, 85687, 85694, 85701, 85708, 85715, 85722, 85729, - 85736, 85743, 85750, 85757, 85764, 85771, 85777, 85784, 85791, 85798, - 85805, 0, 85812, 85819, 0, 85826, 85833, 85840, 85847, 85854, 85861, - 85868, 85875, 85882, 85889, 85896, 85903, 85910, 85917, 85924, 0, 0, - 85930, 85935, 85940, 85945, 85950, 85955, 85960, 85965, 85970, 85975, - 85980, 85985, 85990, 85995, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 86000, 86007, - 86014, 86021, 86028, 86035, 86042, 86049, 86056, 86063, 86070, 86077, - 86084, 86091, 86098, 86105, 86112, 86119, 86126, 86133, 86141, 86149, - 86156, 86163, 86168, 86176, 86184, 86191, 86198, 86203, 86210, 86215, - 86220, 86227, 86232, 86237, 86242, 86250, 86255, 86260, 86267, 86272, - 86277, 86284, 86291, 86296, 86301, 86306, 86311, 86316, 86321, 86326, - 86331, 86336, 86343, 86348, 86355, 86360, 86365, 86370, 86375, 86380, - 86385, 86390, 86395, 86400, 86405, 86410, 86417, 86424, 86431, 86438, - 86444, 86449, 86456, 86461, 86466, 86475, 86482, 86491, 86498, 86503, - 86508, 86516, 86521, 86526, 86531, 86536, 86541, 86548, 86553, 86558, - 86563, 86568, 86573, 86580, 86587, 86594, 86601, 86608, 86615, 86622, - 86629, 86636, 86643, 86650, 86657, 86664, 86671, 86678, 86685, 86692, - 86699, 86706, 86713, 86720, 86727, 86734, 86741, 86748, 86755, 86762, - 86769, 0, 0, 0, 0, 0, 86776, 86784, 86792, 0, 0, 0, 0, 86797, 86801, - 86805, 86809, 86813, 86817, 86821, 86825, 86829, 86833, 86838, 86843, - 86848, 86853, 86858, 86863, 86868, 86873, 86878, 86884, 86890, 86896, - 86903, 86910, 86917, 86924, 86931, 86938, 86944, 86950, 86956, 86963, - 86970, 86977, 86984, 86991, 86998, 87005, 87012, 87019, 87026, 87033, - 87040, 87047, 87054, 0, 0, 0, 87061, 87069, 87077, 87085, 87093, 87101, - 87111, 87121, 87129, 87137, 87145, 87153, 87161, 87167, 87174, 87183, - 87192, 87201, 87210, 87219, 87228, 87238, 87249, 87259, 87270, 87279, - 87288, 87297, 87307, 87318, 87328, 87339, 87350, 87359, 87367, 87373, - 87379, 87385, 87391, 87399, 87407, 87413, 87420, 87430, 87437, 87444, - 87451, 87458, 87465, 87475, 87482, 87489, 87497, 87505, 87514, 87523, - 87532, 87541, 87550, 87558, 87567, 87576, 87585, 87589, 87596, 87601, - 87606, 87610, 87614, 87618, 87622, 87627, 87632, 87638, 87644, 87648, - 87654, 87658, 87662, 87666, 87670, 87674, 87678, 87684, 0, 0, 0, 0, 0, - 87688, 87693, 87698, 87703, 87708, 87715, 87720, 87725, 87730, 87735, - 87740, 87745, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 87750, 87757, 87766, 87775, 87782, 87789, 87796, - 87803, 87810, 87817, 87823, 87830, 87837, 87844, 87851, 87858, 87865, - 87872, 87879, 87888, 87895, 87902, 87909, 87916, 87923, 87930, 87937, - 87944, 87953, 87960, 87967, 87974, 87981, 87988, 87995, 88004, 88011, - 88018, 88025, 88032, 88041, 88048, 88055, 88062, 88070, 88079, 0, 0, - 88088, 88092, 88096, 88101, 88106, 88111, 88116, 88120, 88125, 88130, - 88135, 88140, 88145, 88150, 88154, 88158, 88162, 88167, 88172, 88176, - 88181, 88186, 88190, 88194, 88199, 88204, 88209, 88214, 88219, 0, 0, 0, - 88224, 88228, 88233, 88238, 88242, 88247, 88251, 88256, 88261, 88266, - 88271, 88275, 88279, 88284, 88289, 88294, 88299, 88303, 88308, 88312, - 88317, 88322, 88326, 88331, 88336, 88341, 88345, 88349, 88354, 88359, - 88364, 88369, 88374, 88379, 88384, 88389, 88394, 88399, 88404, 88409, - 88414, 88419, 88424, 88429, 88434, 88439, 88444, 88449, 88454, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 88459, 88463, - 88468, 88473, 88478, 88482, 88487, 88492, 88497, 88502, 88506, 88510, - 88515, 88520, 88525, 88530, 88534, 88539, 88544, 88549, 88554, 88559, - 88564, 88568, 88573, 88578, 88583, 88588, 88593, 88598, 88603, 0, 88608, - 88613, 88618, 88624, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 88630, 88635, - 88640, 88645, 88650, 88655, 88660, 88665, 88670, 88675, 88680, 88685, - 88690, 88695, 88700, 88705, 88710, 88715, 88720, 88725, 88730, 88735, - 88740, 88745, 88750, 88755, 88760, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 88767, 88772, 88777, - 88782, 88787, 88792, 88797, 88802, 88807, 88812, 88817, 88822, 88827, - 88832, 88837, 88842, 88847, 88852, 88857, 88862, 88867, 88872, 88877, - 88882, 88887, 88892, 88897, 88901, 88905, 88909, 0, 88914, 88920, 88925, - 88930, 88935, 88940, 88946, 88952, 88958, 88964, 88970, 88976, 88982, - 88988, 88994, 89000, 89006, 89012, 89018, 89023, 89029, 89035, 89040, - 89046, 89051, 89057, 89063, 89068, 89074, 89080, 89085, 89091, 89097, - 89103, 89109, 89115, 89121, 0, 0, 0, 0, 89126, 89132, 89138, 89144, - 89150, 89156, 89162, 89168, 89174, 89181, 89186, 89191, 89197, 89203, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 89209, 89214, 89219, - 89224, 89230, 89235, 89241, 89247, 89253, 89259, 89266, 89272, 89279, - 89284, 89289, 89294, 89299, 89304, 89309, 89314, 89319, 89324, 89329, - 89334, 89339, 89344, 89349, 89354, 89359, 89364, 89369, 89374, 89379, - 89384, 89389, 89394, 89399, 89404, 89409, 89414, 89419, 89424, 89429, - 89434, 89440, 89445, 89451, 89457, 89463, 89469, 89476, 89482, 89489, - 89494, 89499, 89504, 89509, 89514, 89519, 89524, 89529, 89534, 89539, - 89544, 89549, 89554, 89559, 89564, 89569, 89574, 89579, 89584, 89589, - 89594, 89599, 89604, 89609, 89614, 89619, 89624, 89629, 89634, 89639, - 89644, 89649, 89654, 89659, 89664, 89669, 89674, 89679, 89684, 89689, - 89694, 89699, 89704, 89709, 89714, 89719, 89724, 89729, 89734, 89739, + 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, 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, 89864, 89869, 89874, 89879, 89884, 89889, - 89894, 89899, 89904, 89908, 89913, 89918, 89923, 89928, 89933, 89938, - 89943, 89948, 89953, 89958, 89963, 89968, 89972, 89976, 89980, 89984, - 89988, 89992, 89996, 90001, 90006, 0, 0, 90011, 90016, 90020, 90024, - 90028, 90032, 90036, 90040, 90044, 90048, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 90052, 90056, 90060, 90064, 90068, 90072, 0, 0, 90077, 0, - 90082, 90086, 90091, 90096, 90101, 90106, 90111, 90116, 90121, 90126, - 90131, 90135, 90140, 90145, 90150, 90155, 90159, 90164, 90169, 90174, - 90179, 90183, 90188, 90193, 90198, 90203, 90207, 90212, 90217, 90222, - 90227, 90232, 90237, 90242, 90247, 90252, 90257, 90262, 90267, 90271, - 90276, 90281, 90286, 90291, 0, 90296, 90301, 0, 0, 0, 90306, 0, 0, 90311, - 90316, 90323, 90330, 90337, 90344, 90351, 90358, 90365, 90372, 90379, - 90386, 90393, 90400, 90407, 90414, 90421, 90428, 90435, 90442, 90449, - 90456, 90463, 0, 90470, 90477, 90483, 90489, 90495, 90502, 90509, 90517, - 90525, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 90534, 90539, 90544, 90549, 90554, 90559, - 90564, 90569, 90574, 90579, 90584, 90589, 90594, 90599, 90604, 90609, - 90614, 90619, 90624, 90629, 90634, 90639, 90644, 90648, 90653, 90658, - 90664, 90668, 0, 0, 0, 90672, 90678, 90682, 90687, 90692, 90697, 90701, - 90706, 90710, 90715, 90720, 90724, 90728, 90732, 90736, 90740, 90745, - 90750, 90754, 90759, 90764, 90768, 90773, 90778, 90783, 90788, 90793, 0, - 0, 0, 0, 0, 90798, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 90803, - 90807, 90812, 90817, 0, 90823, 90828, 0, 0, 0, 0, 0, 90833, 90839, 90846, - 90851, 90856, 90860, 90865, 90870, 0, 90875, 90880, 90885, 0, 90890, - 90895, 90900, 90905, 90910, 90915, 90920, 90925, 90930, 90935, 90940, - 90944, 90948, 90953, 90958, 90963, 90967, 90971, 90975, 90980, 90985, - 90990, 90995, 91000, 91005, 91009, 91014, 0, 0, 0, 0, 91019, 91025, - 91030, 0, 0, 0, 0, 91035, 91039, 91043, 91047, 91051, 91055, 91060, - 91065, 91071, 0, 0, 0, 0, 0, 0, 0, 0, 91077, 91083, 91090, 91096, 91103, - 91109, 91115, 91121, 91128, 0, 0, 0, 0, 0, 0, 0, 91134, 91142, 91150, - 91158, 91166, 91174, 91182, 91190, 91198, 91206, 91214, 91222, 91230, - 91238, 91246, 91254, 91262, 91270, 91278, 91286, 91294, 91302, 91310, - 91318, 91326, 91334, 91342, 91350, 91358, 91366, 91373, 91381, 91389, - 91393, 91398, 91403, 91408, 91413, 91418, 91423, 91428, 91432, 91437, - 91441, 91446, 91450, 91455, 91459, 91464, 91469, 91474, 91479, 91484, - 91489, 91494, 91499, 91504, 91509, 91514, 91519, 91524, 91529, 91534, - 91539, 91544, 91549, 91554, 91559, 91564, 91569, 91574, 91579, 91584, - 91589, 91594, 91599, 91604, 91609, 91614, 91619, 91624, 91629, 91634, - 91639, 91644, 91649, 0, 0, 0, 91654, 91659, 91668, 91676, 91685, 91694, - 91705, 91716, 91723, 91730, 91737, 91744, 91751, 91758, 91765, 91772, - 91779, 91786, 91793, 91800, 91807, 91814, 91821, 91828, 91835, 91842, - 91849, 91856, 91863, 0, 0, 91870, 91876, 91882, 91888, 91894, 91901, - 91908, 91916, 91924, 91931, 91938, 91945, 91952, 91959, 91966, 91973, - 91980, 91987, 91994, 92001, 92008, 92015, 92022, 92029, 92036, 92043, - 92050, 0, 0, 0, 0, 0, 92057, 92063, 92069, 92075, 92081, 92088, 92095, - 92103, 92111, 92117, 92123, 92130, 92136, 92142, 92148, 92154, 92161, - 92168, 92175, 92182, 92189, 92196, 92203, 92210, 92217, 92224, 92231, - 92238, 92245, 92252, 92259, 92266, 92273, 92280, 92287, 92294, 92301, - 92308, 92315, 92322, 92329, 92336, 92343, 92350, 92357, 92364, 92371, - 92378, 92385, 92392, 92399, 92406, 92413, 92420, 92427, 92434, 92441, - 92448, 92455, 92462, 92469, 92476, 92483, 92490, 92497, 92504, 92511, - 92518, 92525, 92532, 92539, 92546, 92553, 92560, 92567, 92574, 92581, - 92588, 92595, 92602, 92609, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 92616, 92620, 92624, - 92628, 92632, 92636, 92640, 92644, 92648, 92652, 92657, 92662, 92667, - 92672, 92677, 92682, 92687, 92692, 92697, 92703, 92709, 92715, 92722, - 92729, 92736, 92743, 92750, 92757, 92764, 92771, 92778, 0, 92785, 92789, - 92793, 92797, 92801, 92805, 92808, 92812, 92815, 92819, 92822, 92826, - 92830, 92835, 92839, 92844, 92847, 92851, 92854, 92858, 92861, 92865, - 92869, 92873, 92877, 92881, 92885, 92889, 92893, 92897, 92901, 92905, - 92909, 92913, 92917, 92921, 92925, 92929, 92933, 92936, 92939, 92943, - 92947, 92951, 92954, 92957, 92960, 92964, 92968, 92972, 92976, 92980, - 92983, 92987, 92993, 92999, 93005, 93010, 93017, 93021, 93026, 93030, - 93035, 93040, 93046, 93051, 93057, 93061, 93066, 93070, 93075, 93078, - 93081, 93085, 93090, 93096, 93101, 93107, 0, 0, 0, 0, 93112, 93115, - 93118, 93121, 93124, 93127, 93130, 93133, 93136, 93139, 93143, 93147, - 93151, 93155, 93159, 93163, 93167, 93171, 93175, 93180, 93185, 93189, - 93192, 93195, 93198, 93201, 93204, 93207, 93210, 93213, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 93216, 93221, 93226, 93231, 93235, 93240, - 93244, 93249, 93253, 93258, 93262, 93267, 93271, 93276, 93280, 93285, - 93290, 93295, 93300, 93305, 93310, 93315, 93320, 93325, 93330, 93335, - 93340, 93345, 93350, 93355, 93360, 93365, 93370, 93375, 93380, 93384, - 93388, 93393, 93398, 93403, 93407, 93411, 93415, 93420, 93425, 93430, - 93435, 93440, 93444, 93450, 93455, 93461, 93466, 93472, 93477, 93483, - 93488, 93494, 93499, 93504, 93509, 93514, 93518, 93523, 93529, 93533, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 93538, 93541, 93546, 93552, 93560, - 93565, 93571, 93579, 93585, 93591, 93595, 93599, 93606, 93615, 93622, - 93631, 93637, 93646, 93653, 93660, 93667, 93677, 93683, 93687, 93694, - 93703, 93713, 93720, 93727, 93731, 93735, 93742, 93752, 93756, 93763, - 93770, 93777, 93783, 93790, 93797, 93804, 93811, 93815, 93819, 93823, - 93830, 93834, 93841, 93848, 93862, 93871, 93875, 93879, 93883, 93890, - 93894, 93898, 93902, 93910, 93918, 93937, 93947, 93967, 93971, 93975, - 93979, 93983, 93987, 93991, 93995, 94002, 94006, 94009, 94013, 94017, - 94023, 94030, 94039, 94043, 94052, 94061, 94069, 94073, 94080, 94084, - 94088, 94092, 94096, 94107, 94116, 94125, 94134, 94143, 94155, 94164, - 94173, 94182, 94190, 94199, 94211, 94220, 94229, 94238, 94250, 94259, - 94268, 94280, 94289, 94298, 94310, 94319, 94323, 94327, 94331, 94335, - 94339, 94343, 94347, 94354, 94358, 94362, 94373, 94377, 94381, 94388, - 94394, 94400, 94404, 94411, 94415, 94419, 94423, 94427, 94431, 94435, - 94441, 94449, 94453, 94457, 94460, 94466, 94476, 94480, 94492, 94499, - 94506, 94513, 94520, 94526, 94530, 94534, 94538, 94542, 94549, 94558, - 94565, 94573, 94581, 94587, 94591, 94595, 94599, 94603, 94609, 94618, - 94630, 94637, 94644, 94653, 94664, 94670, 94679, 94688, 94695, 94704, - 94711, 94718, 94728, 94735, 94742, 94749, 94756, 94760, 94766, 94770, - 94781, 94789, 94798, 94810, 94817, 94824, 94834, 94841, 94850, 94857, - 94866, 94873, 94880, 94890, 94897, 94904, 94914, 94921, 94933, 94942, - 94949, 94956, 94963, 94972, 94982, 94995, 95002, 95012, 95022, 95029, - 95038, 95051, 95058, 95065, 95072, 95082, 95092, 95099, 95109, 95116, - 95123, 95133, 95139, 95146, 95153, 95160, 95170, 95177, 95184, 95191, - 95197, 95204, 95214, 95221, 95225, 95233, 95237, 95249, 95253, 95267, - 95271, 95275, 95279, 95283, 95289, 95296, 95304, 95308, 95312, 95316, - 95320, 95327, 95331, 95337, 95343, 95351, 95355, 95362, 95370, 95374, - 95378, 95384, 95388, 95397, 95406, 95413, 95423, 95429, 95433, 95437, - 95445, 95452, 95459, 95465, 95469, 95477, 95481, 95488, 95500, 95507, - 95517, 95523, 95527, 95536, 95543, 95552, 95556, 95560, 95567, 95571, - 95575, 95579, 95583, 95586, 95592, 95598, 95602, 95606, 95613, 95620, - 95627, 95634, 95641, 95648, 95655, 95662, 95668, 95672, 95676, 95683, - 95690, 95697, 95704, 95711, 95715, 95718, 95723, 95727, 95731, 95740, - 95749, 95753, 95757, 95763, 95769, 95786, 95792, 95796, 95805, 95809, - 95813, 95820, 95828, 95836, 95842, 95846, 95850, 95854, 95858, 95861, - 95867, 95874, 95884, 95891, 95898, 95905, 95911, 95918, 95925, 95932, - 95939, 95946, 95955, 95962, 95974, 95981, 95988, 95998, 96009, 96016, - 96023, 96030, 96037, 96044, 96051, 96058, 96065, 96072, 96079, 96089, - 96099, 96109, 96116, 96126, 96133, 96140, 96147, 96154, 96161, 96168, - 96175, 96182, 96189, 96196, 96203, 96210, 96217, 96223, 96230, 96237, - 96246, 96253, 96260, 96264, 96272, 96276, 96280, 96284, 96288, 96292, - 96299, 96303, 96312, 96316, 96323, 96331, 96335, 96339, 96343, 96356, - 96372, 96376, 96380, 96387, 96393, 96400, 96404, 96408, 96412, 96416, - 96420, 96427, 96431, 96449, 96453, 96457, 96464, 96468, 96472, 96478, - 96482, 96486, 96494, 96498, 96502, 96506, 96510, 96516, 96527, 96536, - 96545, 96552, 96559, 96570, 96577, 96584, 96591, 96598, 96605, 96612, - 96619, 96629, 96635, 96642, 96652, 96661, 96668, 96677, 96687, 96694, - 96701, 96708, 96715, 96727, 96734, 96741, 96748, 96755, 96762, 96772, - 96779, 96786, 96796, 96809, 96821, 96828, 96838, 96845, 96852, 96859, - 96873, 96879, 96887, 96897, 96907, 96914, 96921, 96927, 96931, 96938, - 96948, 96954, 96967, 96971, 96975, 96982, 96986, 96993, 97003, 97007, - 97011, 97015, 97019, 97023, 97030, 97034, 97041, 97048, 97055, 97064, - 97073, 97083, 97090, 97097, 97104, 97114, 97121, 97131, 97138, 97148, - 97155, 97162, 97172, 97182, 97189, 97195, 97203, 97211, 97217, 97223, - 97227, 97231, 97238, 97246, 97252, 97256, 97260, 97264, 97271, 97283, - 97286, 97293, 97299, 97303, 97307, 97311, 97315, 97319, 97323, 97327, - 97331, 97335, 97339, 97346, 97350, 97356, 97360, 97364, 97368, 97374, - 97381, 97388, 97395, 97406, 97414, 97418, 97424, 97433, 97440, 97446, - 97449, 97453, 97457, 97463, 97472, 97480, 97484, 97490, 97494, 97498, - 97502, 97508, 97515, 97521, 97525, 97531, 97535, 97539, 97548, 97560, - 97564, 97571, 97578, 97588, 97595, 97607, 97614, 97621, 97628, 97639, - 97649, 97662, 97672, 97679, 97683, 97687, 97691, 97695, 97704, 97713, - 97722, 97739, 97748, 97754, 97761, 97769, 97782, 97786, 97795, 97804, - 97813, 97822, 97833, 97842, 97851, 97860, 97869, 97878, 97887, 97897, - 97900, 97904, 97908, 97912, 97916, 97920, 97926, 97933, 97940, 97947, - 97953, 97959, 97966, 97972, 97979, 97987, 97991, 97998, 98005, 98012, - 98020, 98023, 98027, 98031, 98035, 98039, 98045, 98049, 98055, 98062, - 98069, 98075, 98082, 98089, 98096, 98103, 98110, 98117, 98124, 98131, - 98138, 98145, 98152, 98159, 98166, 98173, 98179, 98183, 98192, 98196, - 98200, 98204, 98208, 98214, 98221, 98228, 98235, 98242, 98249, 98255, - 98263, 98267, 98271, 98275, 98279, 98285, 98302, 98319, 98323, 98327, - 98331, 98335, 98339, 98343, 98349, 98356, 98360, 98366, 98373, 98380, - 98387, 98394, 98401, 98410, 98417, 98424, 98431, 98438, 98442, 98446, - 98452, 98464, 98468, 98472, 98481, 98485, 98489, 98493, 98499, 98503, - 98507, 98516, 98520, 98524, 98528, 98535, 98539, 98543, 98547, 98551, - 98555, 98559, 98563, 98567, 98573, 98580, 98587, 98593, 98597, 98614, - 98620, 98624, 98630, 98636, 98642, 98648, 98654, 98660, 98664, 98668, - 98672, 98678, 98682, 98688, 98692, 98696, 98703, 98710, 98727, 98731, - 98735, 98739, 98743, 98747, 98759, 98762, 98767, 98772, 98787, 98797, - 98809, 98813, 98817, 98821, 98827, 98834, 98841, 98851, 98863, 98869, - 98875, 98884, 98888, 98892, 98899, 98909, 98916, 98922, 98926, 98930, - 98937, 98943, 98947, 98953, 98957, 98965, 98971, 98975, 98983, 98991, - 98998, 99004, 99011, 99018, 99028, 99038, 99042, 99046, 99050, 99054, - 99060, 99067, 99073, 99080, 99087, 99094, 99103, 99110, 99117, 99123, - 99130, 99137, 99144, 99151, 99158, 99165, 99171, 99178, 99185, 99192, - 99201, 99208, 99215, 99219, 99225, 99229, 99235, 99242, 99249, 99256, - 99260, 99264, 99268, 99272, 99276, 99283, 99287, 99291, 99297, 99305, - 99309, 99313, 99317, 99321, 99328, 99332, 99336, 99344, 99348, 99352, - 99356, 99360, 99366, 99370, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 99374, 99380, 99386, 99393, 99400, 99407, 99414, 99421, 99428, - 99434, 99441, 99448, 99455, 99462, 99469, 99476, 99482, 99488, 99494, - 99500, 99506, 99512, 99518, 99524, 99530, 99537, 99544, 99551, 99558, - 99565, 99572, 99578, 99584, 99590, 99597, 99604, 99610, 99616, 99625, - 99632, 99639, 99646, 99653, 99660, 99667, 99673, 99679, 99685, 99694, - 99701, 99708, 99719, 99730, 99736, 99742, 99748, 99757, 99764, 99771, - 99781, 99791, 99802, 99813, 99825, 99838, 99849, 99860, 99872, 99885, - 99896, 99907, 99918, 99929, 99940, 99952, 99960, 99968, 99977, 99986, - 99995, 100001, 100007, 100013, 100020, 100030, 100037, 100047, 100052, - 100057, 100063, 100069, 100077, 100085, 100094, 100105, 100116, 100124, - 100132, 100141, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 100150, 100161, - 100168, 100176, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 104408, 104412, 104416, 104420, 104424, 104428, 104432, 104436, - 104440, 104444, 104448, 104452, 104456, 104460, 104464, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 104468, 104475, 104482, 104491, 104500, 104507, 104512, 104519, - 104526, 104535, 104546, 104557, 104562, 104569, 104574, 104579, 104584, - 104589, 104594, 104599, 104604, 104609, 104614, 104619, 104624, 104631, - 104638, 104643, 104648, 104653, 104658, 104665, 104672, 104680, 104685, - 104692, 104697, 104702, 104707, 104712, 104717, 104724, 104731, 104736, - 104741, 104746, 104751, 104756, 104761, 104766, 104771, 104776, 104781, - 104786, 104791, 104796, 104801, 104806, 104811, 104816, 104821, 104826, - 104833, 104838, 104843, 104852, 104859, 104864, 104869, 104874, 104879, - 104884, 104889, 104894, 104899, 104904, 104909, 104914, 104919, 104924, - 104929, 104934, 104939, 104944, 104949, 104954, 104959, 104964, 104970, - 104978, 104984, 104992, 105000, 105008, 105014, 105020, 105026, 105032, - 105038, 105046, 105056, 105064, 105072, 105078, 105084, 105092, 105100, - 105106, 105114, 105122, 105130, 105136, 105142, 105148, 105154, 105160, - 105166, 105174, 105182, 105188, 105194, 105200, 105206, 105212, 105220, - 105226, 105232, 105238, 105244, 105250, 105256, 105264, 105270, 105276, - 105282, 105288, 105296, 105304, 105310, 105316, 105322, 105327, 105333, - 105339, 105346, 105351, 105356, 105361, 105366, 105371, 105376, 105381, - 105386, 105391, 105400, 105407, 105412, 105417, 105422, 105429, 105434, - 105439, 105444, 105451, 105456, 105461, 105466, 105471, 105476, 105481, - 105486, 105491, 105496, 105501, 105506, 105513, 105518, 105525, 105530, - 105535, 105542, 105547, 105552, 105557, 105562, 105567, 105572, 105577, - 105582, 105587, 105592, 105597, 105602, 105607, 105612, 105617, 105622, - 105627, 105632, 105637, 105644, 105649, 105654, 105659, 105664, 105669, - 105674, 105679, 105684, 105689, 105694, 105699, 105704, 105709, 105716, - 105721, 105726, 105733, 105738, 105743, 105748, 105753, 105758, 105763, - 105768, 105773, 105778, 105783, 105790, 105795, 105800, 105805, 105810, - 105815, 105822, 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, - 105954, 105959, 105964, 105969, 105974, 105979, 105984, 105989, 105994, - 105999, 106004, 106009, 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, 106251, 106256, 106261, 106266, - 106271, 106276, 106281, 106286, 106291, 106296, 106301, 106306, 106313, - 106318, 106323, 106328, 106333, 106338, 106343, 106347, 106352, 106357, - 106362, 106367, 106372, 106377, 106382, 106387, 106392, 106397, 106402, - 106407, 106412, 106417, 106424, 106429, 106434, 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, 106600, 106605, 106610, 106615, 106620, 106625, 106630, - 106635, 106640, 106645, 106650, 106655, 106662, 106667, 106672, 106679, - 106686, 106691, 106696, 106701, 106706, 106711, 106716, 106721, 106726, - 106731, 106736, 106741, 106746, 106751, 106756, 106761, 106766, 106771, - 106776, 106781, 106786, 106791, 106796, 106801, 106806, 106811, 106818, - 106823, 106828, 106833, 106838, 106843, 106848, 106853, 106858, 106863, - 106868, 106873, 106878, 106883, 106888, 106893, 106898, 106903, 106908, - 106915, 106920, 106925, 106930, 106935, 106940, 106945, 106950, 106956, - 106961, 106966, 106971, 106976, 106981, 106986, 106991, 106996, 107003, - 107010, 107015, 107020, 107024, 107029, 107033, 107037, 107042, 107049, - 107054, 107059, 107068, 107073, 107078, 107083, 107088, 107095, 107102, - 107107, 107112, 107117, 107122, 107129, 107134, 107139, 107144, 107149, - 107154, 107159, 107164, 107169, 107174, 107179, 107184, 107189, 107196, - 107200, 107205, 107210, 107215, 107220, 107224, 107229, 107234, 107239, - 107244, 107249, 107254, 107259, 107264, 107269, 107275, 107281, 107287, - 107293, 107299, 107305, 107311, 107317, 107323, 107329, 107335, 107341, - 107346, 107352, 107358, 107364, 107370, 107376, 107382, 107388, 107394, - 107400, 107406, 107412, 107417, 107423, 107429, 107435, 107441, 107447, - 107453, 107459, 107465, 107471, 107477, 107483, 107489, 107495, 107501, - 107507, 107513, 107519, 107525, 107531, 107537, 107542, 107548, 107554, - 107560, 107566, 107572, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 107578, 107583, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 107589, 107594, - 107599, 107604, 107611, 107618, 107625, 107632, 107637, 107642, 107647, - 107652, 107659, 107664, 107671, 107678, 107683, 107688, 107693, 107700, - 107705, 107710, 107717, 107724, 107729, 107734, 107739, 107746, 107753, - 107760, 107765, 107770, 107777, 107784, 107791, 107798, 107803, 107808, - 107813, 107820, 107825, 107830, 107835, 107842, 107851, 107858, 107863, - 107868, 107873, 107878, 107883, 107888, 107897, 107904, 107909, 107916, - 107923, 107928, 107933, 107938, 107945, 107950, 107957, 107964, 107969, - 107974, 107979, 107986, 107993, 107998, 108003, 108010, 108017, 108024, - 108029, 108034, 108039, 108044, 108051, 108060, 108069, 108074, 108081, - 108090, 108095, 108100, 108105, 108110, 108117, 108124, 108131, 108138, - 108143, 108148, 108153, 108160, 108167, 108174, 108179, 108184, 108191, - 108196, 108203, 108208, 108215, 108220, 108227, 108234, 108239, 108244, - 108249, 108254, 108259, 108264, 108269, 108274, 108279, 108286, 108293, - 108300, 108307, 108314, 108323, 108328, 108333, 108340, 108347, 108352, - 108359, 108366, 108373, 108380, 108387, 108394, 108399, 108404, 108409, - 108414, 108419, 108428, 108437, 108446, 108455, 108464, 108473, 108482, - 108491, 108496, 108507, 108518, 108527, 108532, 108537, 108542, 108547, - 108556, 108563, 108570, 108577, 108584, 108591, 108598, 108607, 108616, - 108627, 108636, 108647, 108656, 108663, 108672, 108683, 108692, 108701, - 108710, 108719, 108726, 108733, 108740, 108749, 108758, 108769, 108778, - 108787, 108798, 108803, 108808, 108819, 108827, 108836, 108845, 108854, - 108865, 108874, 108883, 108894, 108905, 108916, 108927, 108938, 108949, - 108956, 108963, 108970, 108977, 108988, 108997, 109004, 109011, 109018, - 109029, 109040, 109051, 109062, 109073, 109084, 109095, 109106, 109113, - 109120, 109129, 109138, 109145, 109152, 109159, 109168, 109177, 109186, - 109193, 109202, 109211, 109220, 109227, 109234, 109239, 109245, 109252, - 109259, 109266, 109273, 109280, 109287, 109296, 109305, 109314, 109323, - 109330, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 109339, 109345, 109350, 109355, - 109362, 109368, 109374, 109380, 109386, 109392, 109398, 109404, 109408, - 109412, 109418, 109424, 109430, 109434, 109439, 109444, 109448, 109452, - 109455, 109461, 109467, 109473, 109479, 109485, 109491, 109497, 109503, - 109509, 109519, 109529, 109535, 109541, 109551, 109561, 109567, 0, 0, - 109573, 109581, 109586, 109591, 109597, 109603, 109609, 109615, 109621, - 109627, 109634, 109641, 109647, 109653, 109659, 109665, 109671, 109677, - 109683, 109689, 109694, 109700, 109706, 109712, 109718, 109724, 109733, - 109739, 109744, 109752, 109759, 109766, 109775, 109784, 109793, 109802, - 109811, 109820, 109829, 109838, 109848, 109858, 109866, 109874, 109883, - 109892, 109898, 109904, 109910, 109916, 109924, 109932, 109936, 109942, - 109947, 109953, 109959, 109965, 109971, 109977, 109986, 109991, 109998, - 110003, 110008, 110013, 110019, 110025, 110031, 110038, 110043, 110048, - 110053, 110058, 110063, 110069, 110075, 110081, 110087, 110093, 110099, - 110105, 110111, 110116, 110121, 110126, 110131, 110136, 110141, 110146, - 110151, 110157, 110163, 110168, 110173, 110178, 110183, 110188, 110194, - 110201, 110205, 110209, 110213, 110217, 110221, 110225, 110229, 110233, - 110241, 110251, 110255, 110259, 110265, 110271, 110277, 110283, 110289, - 110295, 110301, 110307, 110313, 110319, 110325, 110331, 110337, 110343, - 110347, 110351, 110358, 110364, 110370, 110376, 110381, 110388, 110393, - 110399, 110405, 110411, 110417, 110422, 110426, 110432, 110436, 110440, - 110444, 110450, 110456, 110460, 110466, 110472, 110478, 110484, 110490, - 110498, 110506, 110512, 110518, 110524, 110530, 110542, 110554, 110568, - 110580, 110592, 110606, 110620, 110634, 110638, 110646, 110654, 110659, - 110663, 110667, 110671, 110675, 110679, 110683, 110687, 110693, 110699, - 110705, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 111053, - 111059, 111065, 111071, 111077, 111083, 111089, 111095, 111101, 111107, - 111112, 111117, 111122, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 111126, 111131, - 111138, 111145, 111152, 111159, 111164, 111168, 111174, 111178, 111182, - 111188, 111192, 111196, 111200, 111206, 111213, 111217, 111221, 111225, - 111229, 111233, 111237, 111243, 111247, 111251, 111255, 111259, 111263, - 111267, 111271, 111275, 111279, 111283, 111287, 111291, 111296, 111300, - 111304, 111308, 111312, 111316, 111320, 111324, 111328, 111332, 111339, - 111343, 111351, 111355, 111359, 111363, 111367, 111371, 111375, 111379, - 111386, 111390, 111394, 111398, 111402, 111406, 111412, 111416, 111422, - 111426, 111430, 111434, 111438, 111442, 111446, 111450, 111454, 111458, - 111462, 111466, 111470, 111474, 111478, 111482, 111486, 111490, 111494, - 111498, 111506, 111510, 111514, 0, 0, 0, 0, 0, 0, 0, 0, 0, 111518, - 111526, 111534, 111542, 111550, 111558, 111566, 111574, 111582, 111590, - 111598, 111606, 111614, 111622, 111630, 111638, 111646, 111654, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 111662, 111666, 111671, 111676, 111681, - 111685, 111690, 111695, 111700, 111704, 111709, 111714, 111718, 111722, - 111726, 111730, 111735, 111740, 111744, 111748, 111753, 111757, 111762, - 111767, 111772, 111777, 111782, 111786, 111791, 111796, 111801, 111805, - 111810, 111815, 111820, 111824, 111829, 111834, 111838, 111842, 111846, - 111850, 111855, 111860, 111864, 111868, 111873, 111877, 111882, 111887, - 111892, 111897, 111902, 111906, 111911, 111916, 111921, 111925, 111930, - 111935, 111940, 111944, 111949, 111954, 111958, 111962, 111966, 111970, - 111975, 111980, 111984, 111988, 111993, 111997, 112002, 112007, 112012, - 112017, 112022, 112026, 112031, 112036, 112041, 112045, 112050, 0, - 112055, 112059, 112064, 112069, 112073, 112077, 112081, 112085, 112090, - 112095, 112099, 112103, 112108, 112112, 112117, 112122, 112127, 112132, - 112137, 112142, 112148, 112154, 112160, 112165, 112171, 112177, 112183, - 112188, 112194, 112200, 112205, 112210, 112215, 112220, 112226, 112232, - 112237, 112242, 112248, 112253, 112259, 112265, 112271, 112277, 112283, - 112288, 112294, 112300, 112306, 112311, 112317, 112323, 112329, 112334, - 112340, 112346, 112351, 112356, 112361, 112366, 112372, 112378, 112383, - 112388, 112394, 112399, 112405, 112411, 112417, 112423, 112429, 0, - 112433, 112438, 0, 0, 112443, 0, 0, 112448, 112453, 0, 0, 112458, 112462, - 112466, 112471, 0, 112476, 112480, 112485, 112489, 112494, 112499, - 112504, 112509, 112514, 112518, 112523, 112528, 0, 112533, 0, 112538, - 112543, 112547, 112552, 112557, 112561, 112565, 0, 112569, 112574, - 112579, 112583, 112587, 112592, 112596, 112601, 112606, 112611, 112616, - 112621, 112626, 112632, 112638, 112644, 112649, 112655, 112661, 112667, - 112672, 112678, 112684, 112689, 112694, 112699, 112704, 112710, 112716, - 112721, 112726, 112732, 112737, 112743, 112749, 112755, 112761, 112767, - 112772, 112778, 112784, 112790, 112795, 112801, 112807, 112813, 112818, - 112824, 112830, 112835, 112840, 112845, 112850, 112856, 112862, 112867, - 112872, 112878, 112883, 112889, 112895, 112901, 112907, 112913, 112917, - 0, 112922, 112927, 112931, 112936, 0, 0, 112941, 112946, 112951, 112955, - 112959, 112963, 112967, 112972, 0, 112977, 112981, 112986, 112990, - 112995, 113000, 113005, 0, 113010, 113014, 113019, 113024, 113029, - 113033, 113038, 113043, 113048, 113052, 113057, 113062, 113066, 113070, - 113074, 113078, 113083, 113088, 113092, 113096, 113101, 113105, 113110, - 113115, 113120, 113125, 113130, 113134, 0, 113139, 113144, 113148, - 113153, 0, 113158, 113162, 113167, 113172, 113176, 0, 113180, 0, 0, 0, - 113184, 113188, 113193, 113197, 113202, 113207, 113212, 0, 113217, - 113221, 113226, 113231, 113236, 113240, 113245, 113250, 113255, 113259, - 113264, 113269, 113273, 113277, 113281, 113285, 113290, 113295, 113299, - 113303, 113308, 113312, 113317, 113322, 113327, 113332, 113337, 113342, - 113348, 113354, 113360, 113365, 113371, 113377, 113383, 113388, 113394, - 113400, 113405, 113410, 113415, 113420, 113426, 113432, 113437, 113442, - 113448, 113453, 113459, 113465, 113471, 113477, 113483, 113488, 113494, - 113500, 113506, 113511, 113517, 113523, 113529, 113534, 113540, 113546, - 113551, 113556, 113561, 113566, 113572, 113578, 113583, 113588, 113594, - 113599, 113605, 113611, 113617, 113623, 113629, 113633, 113638, 113643, - 113648, 113652, 113657, 113662, 113667, 113671, 113676, 113681, 113685, - 113689, 113693, 113697, 113702, 113707, 113711, 113715, 113720, 113724, - 113729, 113734, 113739, 113744, 113749, 113753, 113758, 113763, 113768, - 113772, 113777, 113782, 113787, 113791, 113796, 113801, 113805, 113809, - 113813, 113817, 113822, 113827, 113831, 113835, 113840, 113844, 113849, - 113854, 113859, 113864, 113869, 113874, 113880, 113886, 113892, 113897, - 113903, 113909, 113915, 113920, 113926, 113932, 113937, 113942, 113947, - 113952, 113958, 113964, 113969, 113974, 113980, 113985, 113991, 113997, - 114003, 114009, 114015, 114020, 114026, 114032, 114038, 114043, 114049, - 114055, 114061, 114066, 114072, 114078, 114083, 114088, 114093, 114098, - 114104, 114110, 114115, 114120, 114126, 114131, 114137, 114143, 114149, - 114155, 114161, 114166, 114172, 114178, 114184, 114189, 114195, 114201, - 114207, 114212, 114218, 114224, 114229, 114234, 114239, 114244, 114250, - 114256, 114261, 114266, 114272, 114277, 114283, 114289, 114295, 114301, - 114307, 114312, 114318, 114324, 114330, 114335, 114341, 114347, 114353, - 114358, 114364, 114370, 114375, 114380, 114385, 114390, 114396, 114402, - 114407, 114412, 114418, 114423, 114429, 114435, 114441, 114447, 114453, - 114459, 114466, 114473, 114480, 114486, 114493, 114500, 114507, 114513, - 114520, 114527, 114533, 114539, 114545, 114551, 114558, 114565, 114571, - 114577, 114584, 114590, 114597, 114604, 114611, 114618, 114625, 114631, - 114638, 114645, 114652, 114658, 114665, 114672, 114679, 114685, 114692, - 114699, 114705, 114711, 114717, 114723, 114730, 114737, 114743, 114749, - 114756, 114762, 114769, 114776, 114783, 114790, 114797, 114802, 114808, - 114814, 114820, 114825, 114831, 114837, 114843, 114848, 114854, 114860, - 114865, 114870, 114875, 114880, 114886, 114892, 114897, 114902, 114908, - 114913, 114919, 114925, 114931, 114937, 114943, 114948, 114954, 114960, - 114966, 114971, 114977, 114983, 114989, 114994, 115000, 115006, 115011, - 115016, 115021, 115026, 115032, 115038, 115043, 115048, 115054, 115059, - 115065, 115071, 115077, 115083, 115089, 115095, 0, 0, 115102, 115107, - 115112, 115117, 115122, 115127, 115132, 115137, 115142, 115147, 115152, - 115157, 115162, 115167, 115172, 115177, 115182, 115187, 115193, 115198, - 115203, 115208, 115213, 115218, 115223, 115228, 115232, 115237, 115242, - 115247, 115252, 115257, 115262, 115267, 115272, 115277, 115282, 115287, - 115292, 115297, 115302, 115307, 115312, 115317, 115323, 115328, 115333, - 115338, 115343, 115348, 115353, 115358, 115364, 115369, 115374, 115379, - 115384, 115389, 115394, 115399, 115404, 115409, 115414, 115419, 115424, - 115429, 115434, 115439, 115444, 115449, 115454, 115459, 115464, 115469, - 115474, 115479, 115485, 115490, 115495, 115500, 115505, 115510, 115515, - 115520, 115524, 115529, 115534, 115539, 115544, 115549, 115554, 115559, - 115564, 115569, 115574, 115579, 115584, 115589, 115594, 115599, 115604, - 115609, 115615, 115620, 115625, 115630, 115635, 115640, 115645, 115650, - 115656, 115661, 115666, 115671, 115676, 115681, 115686, 115692, 115698, - 115704, 115710, 115716, 115722, 115728, 115734, 115740, 115746, 115752, - 115758, 115764, 115770, 115776, 115782, 115788, 115795, 115801, 115807, - 115813, 115819, 115825, 115831, 115837, 115842, 115848, 115854, 115860, - 115866, 115872, 115878, 115884, 115890, 115896, 115902, 115908, 115914, - 115920, 115926, 115932, 115938, 115944, 115951, 115957, 115963, 115969, - 115975, 115981, 115987, 115993, 116000, 116006, 116012, 116018, 116024, - 116030, 116036, 116042, 116048, 116054, 116060, 116066, 116072, 116078, - 116084, 116090, 116096, 116102, 116108, 116114, 116120, 116126, 116132, - 116138, 116145, 116151, 116157, 116163, 116169, 116175, 116181, 116187, - 116192, 116198, 116204, 116210, 116216, 116222, 116228, 116234, 116240, - 116246, 116252, 116258, 116264, 116270, 116276, 116282, 116288, 116294, - 116301, 116307, 116313, 116319, 116325, 116331, 116337, 116343, 116350, - 116356, 116362, 116368, 116374, 116380, 116386, 116393, 116400, 116407, - 116414, 116421, 116428, 116435, 116442, 116449, 116456, 116463, 116470, - 116477, 116484, 116491, 116498, 116505, 116513, 116520, 116527, 116534, - 116541, 116548, 116555, 116562, 116568, 116575, 116582, 116589, 116596, - 116603, 116610, 116617, 116624, 116631, 116638, 116645, 116652, 116659, - 116666, 116673, 116680, 116687, 116695, 116702, 116709, 116716, 116723, - 116730, 116737, 116744, 116752, 116759, 116766, 116773, 116780, 116787, - 116794, 116799, 0, 0, 116804, 116809, 116813, 116817, 116821, 116825, - 116829, 116833, 116837, 116841, 116845, 116850, 116854, 116858, 116862, - 116866, 116870, 116874, 116878, 116882, 116886, 116891, 116895, 116899, - 116903, 116907, 116911, 116915, 116919, 116923, 116927, 116933, 116938, - 116943, 116948, 116953, 116958, 116963, 116968, 116973, 116978, 116984, - 116989, 116994, 116999, 117004, 117009, 117014, 117019, 117024, 117029, - 117036, 117043, 117050, 117057, 117064, 117071, 117077, 117084, 117091, - 117098, 117106, 117114, 117122, 117130, 117138, 117146, 117153, 117160, - 117167, 117175, 117183, 117191, 117199, 117207, 117215, 117222, 117229, - 117236, 117244, 117252, 117260, 117268, 117276, 117284, 117289, 117294, - 117299, 117304, 117309, 117314, 117319, 117324, 117329, 0, 0, 0, 0, - 117334, 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, - 117479, 117483, 117487, 117491, 117495, 117499, 117503, 117507, 117511, - 117515, 117519, 117523, 117527, 117531, 117535, 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, 117676, 117680, 117684, 117688, 117692, - 117696, 117700, 117704, 117708, 117712, 117716, 117720, 117724, 117728, - 117732, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 117736, 117742, 117751, - 117759, 117767, 117776, 117785, 117794, 117803, 117812, 117821, 117830, - 117839, 117848, 117857, 0, 0, 117866, 117875, 117883, 117891, 117900, - 117909, 117918, 117927, 117936, 117945, 117954, 117963, 117972, 117981, - 0, 0, 117990, 117999, 118007, 118015, 118024, 118033, 118042, 118051, - 118060, 118069, 118078, 118087, 118096, 118105, 118114, 0, 118121, - 118130, 118138, 118146, 118155, 118164, 118173, 118182, 118191, 118200, - 118209, 118218, 118227, 118236, 118245, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 118252, - 118259, 118264, 118268, 118272, 118276, 118281, 118286, 118291, 118296, - 118301, 0, 0, 0, 0, 0, 118306, 118311, 118317, 118323, 118329, 118334, - 118340, 118346, 118352, 118357, 118363, 118369, 118374, 118379, 118384, - 118389, 118395, 118401, 118406, 118411, 118417, 118422, 118428, 118434, - 118440, 118446, 118452, 118462, 118469, 118475, 118478, 0, 118481, - 118486, 118492, 118498, 118504, 118509, 118515, 118521, 118527, 118532, - 118538, 118544, 118549, 118554, 118559, 118564, 118570, 118576, 118581, - 118586, 118592, 118597, 118603, 118609, 118615, 118621, 118627, 118630, - 118633, 118636, 118639, 118642, 118645, 118651, 118658, 118665, 118672, - 118678, 118685, 118692, 118699, 118705, 118712, 118719, 118725, 118731, - 118737, 118743, 118750, 118757, 118763, 118769, 118776, 118782, 118789, - 118796, 118803, 118810, 0, 0, 0, 0, 0, 0, 118817, 118823, 118830, 118837, - 118844, 118850, 118857, 118864, 118871, 118877, 118884, 118891, 118897, - 118903, 118909, 118915, 118922, 118929, 118935, 118941, 118948, 118954, - 118961, 118968, 118975, 118982, 118989, 118998, 119002, 119005, 119009, - 119013, 119017, 119020, 119023, 119026, 119029, 119032, 119035, 119038, - 119041, 119044, 119050, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 119053, 119060, 119068, 119076, 119084, - 119091, 119099, 119107, 119115, 119122, 119130, 119138, 119145, 119152, - 119159, 119166, 119174, 119182, 119189, 119196, 119204, 119211, 119219, - 119227, 119235, 119243, 119251, 119255, 119259, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 119263, 119269, 119275, 119281, 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, 119459, - 119465, 119471, 119477, 119483, 119489, 119495, 119501, 119507, 119513, - 0, 0, 0, 0, 0, 119519, 119530, 119541, 119552, 119563, 119574, 119585, - 119596, 119607, 0, 0, 0, 0, 0, 0, 0, 119618, 119622, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 119626, 119628, 119630, - 119634, 119639, 119644, 119646, 119652, 119657, 119659, 119665, 119669, - 119671, 119675, 119681, 119687, 119693, 119698, 119702, 119709, 119716, - 119723, 119728, 119735, 119742, 119749, 119753, 119759, 119768, 119777, - 119784, 119789, 119793, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 119797, 119799, 119801, 119805, 119809, 119813, 0, 119815, 119817, - 119821, 119823, 119825, 119827, 119829, 119834, 119839, 119841, 119847, - 119851, 119855, 119863, 119865, 119867, 119869, 119871, 119873, 119875, - 119877, 119879, 119881, 119883, 119887, 119891, 119893, 119895, 119897, - 119899, 119901, 119906, 119912, 119916, 119920, 119924, 119928, 119933, - 119937, 119939, 119941, 119945, 119951, 119953, 119955, 119957, 119961, - 119970, 119976, 119980, 119984, 119986, 119988, 119991, 119993, 119995, - 119997, 120001, 120003, 120007, 120012, 120014, 120019, 120025, 120032, - 120036, 120040, 120044, 120048, 120054, 0, 0, 0, 120058, 120060, 120064, - 120068, 120070, 120074, 120078, 120080, 120084, 120086, 120090, 120094, - 120098, 120102, 120106, 120110, 120114, 120118, 120124, 120128, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 120132, 120136, 120140, 120144, 120151, - 120153, 120157, 120159, 120161, 120165, 120169, 120173, 120175, 120179, - 120183, 120187, 120191, 120195, 120197, 120201, 120203, 120209, 120212, - 120217, 120219, 120221, 120224, 120226, 120228, 120231, 120238, 120245, - 120252, 120257, 120261, 120263, 120265, 0, 120267, 120269, 120273, - 120277, 120281, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 120283, 120287, 120292, 120296, 120302, 120308, 120310, 120312, - 120318, 120320, 120324, 120328, 120330, 120334, 120336, 120340, 120344, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 120348, 120350, 120352, - 120354, 120358, 120360, 120362, 120364, 120366, 120368, 120370, 120372, - 120374, 120376, 120378, 120380, 120382, 120384, 120386, 120388, 120390, - 120392, 120394, 120396, 120398, 120400, 120402, 120406, 120408, 120410, - 120412, 120416, 120418, 120422, 120424, 120426, 120430, 120434, 120440, - 120442, 120444, 120446, 120448, 120452, 120456, 120458, 120462, 120466, - 120470, 120474, 120478, 120482, 120486, 120490, 120494, 120498, 120502, - 120506, 120510, 120514, 120518, 120522, 120526, 0, 120530, 0, 120532, - 120534, 120536, 120538, 120540, 120548, 120556, 120564, 120572, 120577, - 120582, 120587, 120591, 120595, 120600, 120604, 120606, 120610, 120612, - 120614, 120616, 120618, 120620, 120622, 120624, 120628, 120630, 120632, - 120634, 120638, 120642, 120646, 120650, 120654, 120656, 120662, 120668, - 120670, 120672, 120674, 120676, 120678, 120687, 120694, 120701, 120705, - 120712, 120717, 120724, 120733, 120738, 120742, 120746, 120748, 120752, - 120754, 120758, 120762, 120764, 120768, 120772, 120776, 120778, 120780, - 120786, 120788, 120790, 120792, 120796, 120800, 120802, 120806, 120808, - 120810, 120813, 120817, 120819, 120823, 120825, 120827, 120832, 120834, - 120838, 120842, 120845, 120849, 120853, 120857, 120861, 120865, 120869, - 120873, 120878, 120882, 120886, 120895, 120900, 120903, 120905, 120908, - 120911, 120916, 120918, 120921, 120926, 120930, 120933, 120937, 120941, - 120944, 120949, 120953, 120957, 120961, 120965, 120971, 120977, 120983, - 120989, 120994, 121005, 121007, 121011, 121013, 121015, 121019, 121023, - 121025, 121029, 121034, 121039, 121045, 121047, 121051, 121055, 121062, - 121069, 121073, 121075, 121077, 121081, 121083, 121087, 121091, 121095, - 121097, 121099, 121106, 121110, 121113, 121117, 121121, 121125, 121127, - 121131, 121133, 121135, 121139, 121141, 121145, 121149, 121155, 121159, - 121163, 121167, 121169, 121172, 121176, 121183, 121192, 121201, 121209, - 121217, 121219, 121223, 121225, 121229, 121240, 121244, 121250, 121256, - 121261, 0, 121263, 121267, 121269, 121271, 0, 0, 0, 121273, 121278, - 121288, 121303, 121315, 121327, 121331, 121335, 121341, 121343, 121351, - 121359, 121361, 121365, 121371, 121377, 121384, 121391, 121393, 121395, - 121398, 121400, 121406, 121408, 121411, 121415, 121421, 121427, 121438, - 121444, 121451, 121459, 121463, 121471, 121479, 121485, 121491, 121498, - 121500, 121504, 121506, 121508, 121513, 121515, 121517, 121519, 121521, - 121525, 121536, 121542, 121546, 121550, 121554, 121560, 121566, 121572, - 121578, 121583, 121588, 121594, 121600, 121607, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 121614, 121621, 121628, 121635, 121643, - 121651, 121659, 121667, 121675, 121683, 121691, 121699, 121707, 121713, - 121719, 121725, 121731, 121737, 121743, 121749, 121755, 121761, 121767, - 121773, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 121779, 121783, 121787, 121792, 121797, 0, 121799, 121808, - 121816, 121824, 121837, 121850, 121863, 121870, 121877, 121881, 121890, - 121898, 121902, 121911, 121918, 121922, 0, 121926, 121930, 121937, 0, - 121941, 0, 121945, 0, 121952, 0, 121961, 121973, 121985, 0, 121989, - 121993, 121997, 122001, 122005, 122013, 0, 0, 122021, 122025, 122029, - 122033, 0, 122037, 0, 0, 122043, 122054, 122062, 122066, 0, 122070, - 122074, 122080, 122087, 122098, 122108, 122118, 122129, 122138, 122149, - 122155, 122161, 0, 0, 0, 0, 122167, 122176, 122183, 122189, 122193, - 122197, 122201, 122210, 122222, 122226, 122233, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 122240, 122242, 122244, - 122248, 122252, 122256, 122265, 122267, 122269, 122272, 122274, 122276, - 122280, 122282, 122286, 122288, 122292, 122294, 122296, 122300, 122304, - 122310, 122312, 122316, 122318, 122322, 122326, 122330, 122334, 122336, - 122338, 122342, 122346, 122350, 122354, 122356, 122358, 122360, 122365, - 122370, 122373, 122381, 122389, 122391, 122396, 122399, 122404, 122415, - 122422, 122427, 122432, 122434, 122438, 122440, 122444, 122446, 122450, - 122454, 122457, 122460, 122462, 122465, 122467, 122471, 122473, 122475, - 122477, 122481, 122483, 122487, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 122490, - 122495, 122500, 122505, 122510, 122515, 122520, 122527, 122534, 122541, - 122548, 122553, 122558, 122563, 122568, 122575, 122581, 122588, 122595, - 122602, 122607, 122612, 122617, 122622, 122627, 122634, 122641, 122646, - 122651, 122658, 122665, 122673, 122681, 122688, 122695, 122703, 122711, - 122719, 122726, 122736, 122747, 122752, 122759, 122766, 122773, 122781, - 122789, 122800, 122808, 122816, 122824, 122829, 122834, 122839, 122844, - 122849, 122854, 122859, 122864, 122869, 122874, 122879, 122884, 122891, - 122896, 122901, 122908, 122913, 122918, 122923, 122928, 122933, 122938, - 122943, 122948, 122953, 122958, 122963, 122968, 122975, 122983, 122988, - 122993, 123000, 123005, 123010, 123015, 123022, 123027, 123034, 123039, - 123046, 123051, 123060, 123069, 123074, 123079, 123084, 123089, 123094, - 123099, 123104, 123109, 123114, 123119, 123124, 123129, 123134, 123142, - 123150, 123155, 123160, 123165, 123170, 123175, 123181, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 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, 125311, 125315, 125319, 125323, 125327, 125331, 125335, - 125339, 125343, 125347, 125351, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 125355, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 125359, - 125362, 125366, 125370, 125373, 125377, 125381, 125384, 125387, 125391, - 125395, 125398, 125401, 125404, 125407, 125412, 125415, 125419, 125422, - 125425, 125428, 125431, 125434, 125437, 125440, 125443, 125446, 125449, - 125452, 125456, 125460, 125464, 125468, 125473, 125478, 125484, 125490, - 125496, 125501, 125507, 125513, 125519, 125524, 125530, 125536, 125541, - 125546, 125551, 125556, 125562, 125568, 125573, 125578, 125584, 125589, - 125595, 125601, 125607, 125613, 125619, 125623, 125628, 125632, 125637, - 125641, 125646, 125651, 125657, 125663, 125669, 125674, 125680, 125686, - 125692, 125697, 125703, 125709, 125714, 125719, 125724, 125729, 125735, - 125741, 125746, 125751, 125757, 125762, 125768, 125774, 125780, 125786, - 125792, 125797, 125801, 125806, 125808, 125812, 125815, 125818, 125821, - 125824, 125827, 125830, 125833, 125836, 125839, 125842, 125845, 125848, - 125851, 125854, 125857, 125860, 125863, 125866, 125869, 125872, 125875, - 125878, 125881, 125884, 125887, 125890, 125893, 125896, 125899, 125902, - 125905, 125908, 125911, 125914, 125917, 125920, 125923, 125926, 125929, - 125932, 125935, 125938, 125941, 125944, 125947, 125950, 125953, 125956, - 125959, 125962, 125965, 125968, 125971, 125974, 125977, 125980, 125983, - 125986, 125989, 125992, 125995, 125998, 126001, 126004, 126007, 126010, - 126013, 126016, 126019, 126022, 126025, 126028, 126031, 126034, 126037, - 126040, 126043, 126046, 126049, 126052, 126055, 126058, 126061, 126064, - 126067, 126070, 126073, 126076, 126079, 126082, 126085, 126088, 126091, - 126094, 126097, 126100, 126103, 126106, 126109, 126112, 126115, 126118, - 126121, 126124, 126127, 126130, 126133, 126136, 126139, 126142, 126145, - 126148, 126151, 126154, 126157, 126160, 126163, 126166, 126169, 126172, - 126175, 126178, 126181, 126184, 126187, 126190, 126193, 126196, 126199, - 126202, 126205, 126208, 126211, 126214, 126217, 126220, 126223, 126226, - 126229, 126232, 126235, 126238, 126241, 126244, 126247, 126250, 126253, - 126256, 126259, 126262, 126265, 126268, 126271, 126274, 126277, 126280, - 126283, 126286, 126289, 126292, 126295, 126298, 126301, 126304, 126307, - 126310, 126313, 126316, 126319, 126322, 126325, 126328, 126331, 126334, - 126337, 126340, 126343, 126346, 126349, 126352, 126355, 126358, 126361, - 126364, 126367, 126370, 126373, 126376, 126379, 126382, 126385, 126388, - 126391, 126394, 126397, 126400, 126403, 126406, 126409, 126412, 126415, - 126418, 126421, 126424, 126427, 126430, 126433, 126436, 126439, 126442, - 126445, 126448, 126451, 126454, 126457, 126460, 126463, 126466, 126469, - 126472, 126475, 126478, 126481, 126484, 126487, 126490, 126493, 126496, - 126499, 126502, 126505, 126508, 126511, 126514, 126517, 126520, 126523, - 126526, 126529, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 126532, - 126537, 126542, 126546, 126552, 126558, 126562, 126566, 126578, 126583, - 126594, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 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, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 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, - 126605, 126614, 126623, 126632, 126641, 126653, 126665, 126677, 126689, - 126699, 126709, 126719, 126729, 126739, 126749, 126759, 126768, 126777, - 126786, 126798, 126810, 126822, 126834, 126844, 126854, 126863, 126872, - 126881, 126890, 126899, 126908, 126917, 126926, 126935, 126944, 126953, - 126962, 126971, 126980, 126990, 127000, 127010, 127023, 127033, 127046, - 127053, 127063, 127070, 127077, 127084, 127091, 127098, 127105, 127114, - 127123, 127132, 127141, 127150, 127159, 127168, 127177, 127184, 127191, - 127198, 127207, 127216, 127223, 127230, 127239, 127248, 127252, 127256, - 127260, 127264, 127268, 127272, 127276, 127280, 127283, 127287, 127290, - 127294, 127297, 127300, 127304, 127308, 127312, 127316, 127320, 127324, - 127328, 127332, 127335, 127339, 127343, 127347, 127351, 127355, 127359, - 127363, 127367, 127371, 127375, 127379, 127383, 127387, 127391, 127395, - 127399, 127403, 127407, 127411, 127415, 127419, 127423, 127427, 127431, - 127435, 127439, 127443, 127447, 127451, 127455, 127459, 127463, 127467, - 127471, 127475, 127479, 127483, 127487, 127491, 127495, 127499, 127503, - 127507, 127511, 127515, 127519, 127523, 127527, 127531, 127535, 127539, - 127543, 127547, 127551, 127555, 127559, 127563, 127567, 127571, 127575, - 127579, 127583, 127587, 127591, 127595, 127599, 127603, 127607, 127611, - 127615, 127619, 127623, 127627, 127631, 127635, 127639, 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, 128416, 128423, 128430, 128437, 128444, 128451, 128458, - 128465, 128472, 128479, 128486, 128493, 128500, 128507, 128513, 128520, - 128527, 128533, 128540, 128547, 128554, 128561, 128568, 128575, 128582, - 128589, 128596, 128603, 128610, 128617, 128624, 128631, 128637, 128644, - 128651, 128660, 128669, 128678, 128687, 128692, 128697, 128703, 128709, - 128715, 128721, 128727, 128733, 128739, 128745, 128751, 128757, 128763, - 128769, 128774, 128780, 128790, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 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, 983518, 7748, 0, 0, 0, 127939, 41603, 9784, 0, + 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, 0, 127764, - 65859, 0, 7404, 0, 0, 0, 0, 65908, 9834, 3055, 9852, 983595, 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, 983423, 0, 11966, 64128, 128587, - 0, 0, 64132, 10867, 64130, 64129, 983579, 43374, 9779, 2764, 66002, - 10167, 9471, 0, 66021, 0, 0, 5457, 5440, 8857, 128771, 65282, 2843, 5355, - 127928, 983697, 0, 5194, 11657, 43984, 128292, 0, 983364, 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, 983681, 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, 983510, 128344, 0, 1176, 118959, - 127930, 8162, 128667, 983566, 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, 983344, 42871, 0, 19923, 74335, 0, 127192, 66239, 42264, 64403, - 4412, 7240, 92495, 0, 983365, 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, 983688, 127524, 0, 0, 0, 0, 195083, 0, 983578, 0, - 0, 0, 0, 0, 9341, 119596, 2379, 11325, 0, 64668, 67854, 8125, 120545, - 6743, 119175, 917940, 2369, 0, 983704, 983705, 119235, 74092, 73936, - 7008, 43660, 0, 0, 0, 2367, 127827, 983592, 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, 983391, 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, 983327, 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, 983571, - 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, 983316, 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, 78437, 0, 1925, 0, 92237, 74807, 0, 5048, 5047, 0, - 0, 0, 92313, 0, 74497, 92395, 8089, 6929, 639, 983307, 68179, 64442, 0, - 92348, 4599, 41402, 6674, 43397, 43294, 1476, 648, 0, 65819, 3233, 0, - 41782, 6951, 0, 983708, 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, - 983615, 0, 9053, 13015, 74523, 0, 704, 66215, 6195, 983563, 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, 983375, 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, - 983384, 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, 983436, 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, 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, 983484, 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, 983040, 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, 983538, 0, 381, 983404, 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, 983464, 120670, 2442, 10703, - 78789, 67632, 917924, 12771, 12736, 12753, 0, 73933, 67626, 42401, 0, 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, 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, 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, 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, 0, 0, 0, 66325, 3465, 2405, - 9240, 0, 12756, 65259, 0, 983516, 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, 983514, 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, 983597, - 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, 983508, 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, 983476, - 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, 983429, 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, 983323, 0, 69672, - 8213, 74017, 7771, 6161, 0, 6709, 0, 78885, 983443, 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, 983567, 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, 983357, 13031, 0, 63901, 0, 3657, 128572, 65202, + 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, @@ -16640,277 +17331,282 @@ 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, 983543, 0, 327, 0, 9042, 917777, - 917776, 65148, 12433, 917781, 127276, 917779, 12431, 8668, 12434, 983570, + 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, 0, - 42021, 0, 0, 1299, 12240, 42350, 65143, 0, 195016, 0, 78197, 11348, 0, - 78037, 9194, 0, 0, 19914, 12179, 983547, 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, 983630, 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, 983665, 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, 983440, 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, 983297, 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, 42218, 12710, 68674, 12721, 4101, 66185, 0, 5992, 7616, - 195044, 0, 12577, 0, 0, 853, 42693, 195014, 0, 983382, 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, 983603, - 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, + 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, 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, 983396, 0, 43119, 0, + 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, 983569, 120148, 66369, - 5861, 127758, 11999, 12400, 0, 983574, 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, + 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, 0, - 42392, 1305, 12408, 0, 44007, 0, 0, 41464, 12411, 12969, 120824, 41465, - 983309, 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, 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, 983339, 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, 983482, 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, 983311, - 64005, 4058, 119019, 0, 64660, 0, 119050, 0, 983434, 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, + 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, + 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, 983386, 0, 128793, 0, 10986, 64683, 983520, 0, 194709, 0, - 0, 9879, 0, 0, 4158, 128050, 68166, 0, 0, 0, 0, 69645, 332, 118808, 0, + 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, 983656, 12696, 128256, 0, 194796, 12929, 0, 712, 0, 4197, - 983045, 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, 983346, 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, - 983583, 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, 983601, 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, 983298, 7897, 0, 1203, - 74396, 1813, 64544, 41311, 12090, 0, 2877, 0, 0, 1675, 0, 0, 0, 0, 10070, - 10595, 0, 119077, 0, 983355, 0, 0, 0, 43244, 0, 0, 983651, 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, 983453, + 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, 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, 983549, - 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, 983332, 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, 983296, 7909, 66234, 11605, 63759, 983389, - 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, 983313, - 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, 983655, 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, 983513, 9372, 12444, 0, 0, 13016, 8210, 983690, 42029, 11079, - 12331, 43451, 42032, 8744, 726, 0, 983572, 4155, 0, 0, 42030, 5007, - 12522, 43088, 0, 4951, 127805, 127240, 0, 9922, 43309, 983576, 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, 983679, 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, + 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, + 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, 983380, - 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, - 983558, 0, 9325, 6818, 6283, 11738, 0, 983666, 0, 11741, 0, 0, 9216, - 8263, 11279, 194752, 983560, 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, 983515, 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, 983692, 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, 983352, 40980, 983696, 13202, 0, 12582, 78282, 0, 983427, - 42438, 55221, 6288, 78280, 127946, 5653, 42400, 10891, 7698, 5658, 74045, - 120165, 0, 0, 4913, 0, 983691, 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, 983498, 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, 983303, - 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, 983618, 1760, 2421, 4469, 2324, 828, 3611, 78400, 757, + 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, @@ -16919,678 +17615,699 @@ 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, + 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, - 119605, 194578, 7074, 92648, 194579, 194582, 11414, 128868, 2531, 13034, + 77950, 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, + 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, 0, 42535, 69812, 64529, - 41408, 42853, 3877, 120795, 42674, 8147, 43566, 119021, 983511, 10236, - 65918, 43782, 0, 0, 64506, 69652, 118921, 4747, 128058, 0, 43200, 5832, - 0, 0, 5141, 42600, 0, 43203, 0, 983534, 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, 983633, 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, 12032, 0, 9725, 0, - 78431, 5263, 12818, 78430, 41939, 10022, 65387, 78419, 42777, 10139, 980, - 43698, 65386, 0, 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, 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, 983406, 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, 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, 983409, - 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, 983676, 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, 983646, 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, - 983335, 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, 983536, 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, 983604, 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, 983554, 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, 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, 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, 983340, 43059, 42666, 5256, 1067, 255, 12131, 0, - 9493, 0, 41014, 11793, 0, 0, 74394, 43460, 10653, 42723, 983589, 119632, - 0, 6560, 7016, 74274, 983359, 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, 983351, 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, 983399, 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, 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, + 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, 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, 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, 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, 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, + 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, 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, 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, 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, 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, 983643, 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, 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, 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, 983645, - 6943, 917934, 5859, 0, 2858, 983647, 74294, 983649, 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, 983412, 0, 9604, 78700, 7441, - 63826, 78706, 118941, 64392, 194735, 983422, 2844, 983673, 41974, 0, - 12139, 0, 0, 0, 3358, 65295, 0, 3104, 194734, 0, 194765, 983048, 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, 983629, 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, 983402, 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, 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, 983701, 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, 983477, - 77986, 0, 6931, 69722, 64355, 7177, 120530, 0, 0, 0, 4262, 10285, 10722, - 42020, 0, 6806, 6992, 42019, 0, 41290, 983451, 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, + 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, 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, 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, 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, 983458, 73752, 0, 64872, 92340, - 1331, 0, 0, 0, 12708, 0, 5090, 5089, 0, 0, 119109, 0, 128681, 319, + 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, - 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, 983465, 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, - 983341, 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, 983540, 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, - 983505, 0, 64714, 0, 0, 12162, 12120, 43476, 983501, 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, 983336, 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, 983300, 4554, 0, 9023, 11685, 0, 9928, 78617, - 0, 11437, 43741, 92163, 120700, 63967, 0, 41206, 120724, 9049, 41185, + 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, 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, 983450, 5508, 0, 0, 0, 10801, 0, 92354, 0, 7173, 496, + 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, 0, 41611, 4642, 66574, 11556, 917982, 0, 78857, 42089, - 78855, 9008, 0, 0, 195096, 42079, 917981, 77924, 42513, 0, 42842, 73985, - 65285, 118974, 127003, 983437, 0, 0, 0, 11335, 64069, 42093, 3920, 0, 0, - 0, 0, 4580, 41967, 983467, 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, 983527, 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, 983469, 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, + 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, 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, 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, 983050, 128026, 0, 65708, + 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, - 983041, 41748, 4995, 955, 65907, 119208, 5350, 64339, 78306, 64549, + 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, 983363, 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, 983322, 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, 983358, 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, 983462, 0, 78800, 92653, - 64445, 42668, 6635, 0, 6164, 65170, 0, 0, 7676, 11664, 0, 983393, 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, 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, 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, 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, + 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, 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, 2284, 64481, + 78614, 66013, 41956, 43455, 126995, 0, 0, 0, 42273, 5819, 0, 917556, 0, + 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, 917993, 0, 4315, 12644, 127516, - 77937, 43639, 43343, 0, 917998, 11501, 41177, 128689, 0, 917792, 0, + 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, 128699, 4413, 92196, + 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, 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, 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, 78132, 5926, 78128, 78130, - 78126, 78127, 78124, 78125, 9038, 7887, 43456, 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, 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, - 983438, 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, 983624, 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, - 983367, 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, 983047, 92609, 0, 0, 3127, 2595, 65713, 42013, - 983593, 5607, 41089, 0, 0, 74256, 2665, 11304, 0, 74200, 4970, 8764, + 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, + 78132, 5926, 78128, 78130, 78126, 78127, 78124, 78125, 9038, 7887, 43456, + 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, 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, 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, 983470, 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, 983046, 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, 983354, 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, 983702, 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, + 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, 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, 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, + 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, 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, 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, 983460, - 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, 983632, 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, + 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, 983318, 5836, 12358, 0, 4355, 9048, + 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, 983480, 119182, 69244, 0, - 0, 11759, 194903, 6368, 74823, 0, 41423, 8078, 10504, 0, 41698, 42237, 0, - 7002, 983413, 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, 983496, 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, 983684, 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, 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, - 983411, 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, 983401, 7140, 10977, 127378, 4164, - 9081, 0, 120569, 42049, 42042, 8709, 128283, 983317, 120637, 42419, - 64799, 42047, 0, 0, 8470, 11807, 65897, 577, 0, 983495, 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, 983328, 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, 983678, 41148, 8683, 7594, 127519, 0, 119090, 10869, 43458, 41146, - 92407, 11441, 0, 3512, 119633, 983444, 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, 983403, 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, 983680, - 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, 983677, 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, 983383, 0, 65455, + 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, 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, 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, - 983653, 4770, 0, 917567, 8731, 65378, 127362, 120619, 9122, 128033, - 983325, 4774, 3019, 9997, 12834, 0, 9456, 10215, 120547, 0, 0, 0, 0, + 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, @@ -17599,1251 +18316,1289 @@ 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, 983662, 3945, 92589, 0, 0, 0, 0, - 78212, 127746, 1020, 73763, 0, 78731, 5648, 64748, 194910, 0, 10205, - 3545, 983329, 6984, 0, 74051, 983390, 43242, 120458, 2667, 0, 0, 0, 9911, - 0, 65020, 10097, 119166, 127145, 983397, 118836, 983483, 78427, 1140, + 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, 983503, 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, 983712, 2328, 92409, 1071, 0, 0, 74848, 0, 983324, 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, 983698, 5084, 0, 0, 118861, 0, 733, 917876, 78014, 78436, - 78435, 41677, 0, 9218, 1731, 0, 983481, 0, 195010, 0, 0, 0, 120001, - 127018, 92492, 5155, 0, 5358, 983479, 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, - 983456, 12149, 13088, 551, 0, 10156, 12119, 92572, 0, 2544, 65074, + 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, 0, 0, 9013, 4054, 0, 983314, 0, 0, 73960, 5585, 65881, 2549, - 74469, 0, 0, 5584, 8358, 0, 74411, 92219, 10919, 0, 7980, 0, 983519, 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, 983587, 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, 983622, 64870, 0, 3467, 983626, 0, 3331, 946, - 10231, 1495, 8131, 74330, 0, 9562, 69222, 65927, 0, 983457, 69696, 69769, - 64656, 983461, 0, 194837, 0, 5666, 65227, 5318, 63994, 0, 9091, 10798, 0, - 128166, 10186, 0, 7732, 983459, 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, 983360, 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, 983541, 0, 9135, 0, - 41564, 0, 55219, 128832, 983586, 0, 12148, 0, 78297, 0, 64256, 0, 11669, - 0, 5634, 4524, 0, 127270, 0, 118880, 2425, 65182, 128769, 43636, 5221, - 78410, 328, 0, 983544, 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, 983420, 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, 983557, 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, 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, 118790, 1182, 2542, 4826, - 0, 0, 128176, 529, 8580, 0, 0, 10586, 10790, 10839, 66023, 41593, 41207, - 0, 0, 41594, 225, 42828, 0, 0, 983670, 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, 983668, - 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, 983548, 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, 983561, - 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, 983417, 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, 69657, 78512, 0, - 43441, 41804, 78523, 0, 78525, 0, 128859, 41584, 10681, 0, 983430, 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, 983590, 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, 983594, 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, 983707, 0, 0, 0, 65673, 1019, - 78495, 4148, 0, 12289, 0, 4316, 0, 13119, 983636, 5412, 66243, 9935, 0, - 73864, 983042, 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, 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, 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, 983929, 11376, + 74379, 10721, 67664, 3438, 42097, 127267, 11084, 3194, 41870, 266, 78305, + 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, 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, 983321, 65099, 11531, 5834, 0, 0, 0, 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, 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, 983588, 983539, 63833, 6042, 66360, 8083, 0, 0, 63821, - 63820, 63819, 63818, 983639, 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, + 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, 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, 983433, 0, 195065, 0, 8413, 983551, 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, 983368, 4518, 10990, 65073, 5167, 4481, 3771, - 0, 2710, 0, 69243, 41724, 0, 43073, 41690, 12479, 983370, 0, 0, 983553, - 119659, 1628, 127149, 0, 983466, 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, 983580, 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, 983385, 1873, - 1087, 0, 0, 0, 78527, 66439, 43218, 983439, 194716, 7237, 12504, 74282, - 0, 983315, 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, 983542, 128882, 4761, 63828, - 4766, 64623, 1273, 43407, 0, 118876, 195045, 6912, 1313, 6322, 10483, - 983347, 41545, 0, 92449, 0, 0, 0, 0, 78624, 3484, 74337, 0, 0, 8503, - 5122, 41527, 0, 66320, 983546, 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, 983650, 92168, - 983507, 917858, 11354, 0, 0, 42795, 0, 119195, 11394, 194646, 13236, - 13272, 13194, 1334, 0, 4479, 1178, 65586, 120663, 66681, 119193, 4601, 0, - 0, 983500, 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, 983706, 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, + 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, 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, 983312, 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, 983463, 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, 983362, 2869, 0, 41015, 194692, 2785, 4366, 0, 10954, 41802, 0, + 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, 983562, 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, 983635, - 65162, 41234, 12089, 78281, 9771, 983640, 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, 983394, 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, 983591, 0, 42808, 128337, 9348, 64901, - 983596, 0, 0, 0, 0, 0, 917584, 43702, 983320, 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, 983395, 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, 983525, - 194720, 65056, 3620, 0, 68378, 4556, 0, 0, 194933, 74250, 0, 67657, - 10510, 4382, 66482, 0, 0, 127527, 9177, 8902, 0, 9839, 0, 12891, 983490, - 983371, 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, 983661, 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, 983475, 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, 983421, 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, 983654, 0, 5405, - 127875, 64866, 0, 119583, 128345, 78784, 74248, 11330, 194723, 64690, - 3254, 0, 0, 0, 42390, 43678, 194725, 983644, 65077, 0, 6388, 3355, 9508, - 9867, 5723, 11520, 5611, 0, 3377, 0, 0, 0, 0, 78228, 0, 983497, 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, 983043, 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, 983642, 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, 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, 983044, - 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, 983710, 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, 983524, 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, 983616, 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, 983301, 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, 983494, 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, 983559, 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, 983448, 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, 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, - 983512, 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, + 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, 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, 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, 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, 983407, 9959, 7927, 0, 4560, 0, 0, - 92277, 0, 64948, 4430, 74347, 42601, 4514, 66434, 983682, 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, + 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, 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, 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, 983550, 0, 0, 0, 5809, 1950, - 119356, 92432, 74572, 0, 42136, 0, 0, 0, 0, 3247, 119854, 65017, 983685, - 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, 983348, 0, 7201, 12561, - 0, 42371, 12558, 0, 917549, 10052, 40982, 0, 0, 1488, 0, 0, 0, 917559, 0, - 0, 1563, 128034, 9619, 983672, 0, 0, 127872, 983471, 5803, 7797, 6070, - 10006, 0, 2922, 6082, 0, 65009, 983674, 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, 983308, 43106, 5029, 65309, 1580, 3598, 68424, 41070, 77903, 0, - 3440, 78215, 1562, 128656, 127175, 119358, 1716, 983414, 10600, 917867, + 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, + 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, - 128269, 0, 0, 119328, 0, 65557, 0, 74541, 983331, 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, 983628, - 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, 983419, - 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, 983606, 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, 983486, 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, 983330, 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, 983659, 8315, 65444, 983528, 0, 74595, 6152, 0, 0, 6629, - 128251, 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, + 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, 127369, 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, + 2120, 43302, 1224, 0, 65576, 74192, 10701, 1764, 3101, 127815, 12858, 120159, 0, 11373, 6378, 127859, 120103, 8663, 9312, 41644, 4539, 2129, 0, - 9222, 983473, 0, 4259, 9092, 74567, 41961, 0, 12724, 66357, 42331, 64935, - 0, 0, 1293, 7947, 2132, 983502, 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, 983416, 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, 983638, 0, 78871, 120442, 983504, 1921, 10947, 19927, 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, 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, 983695, 118998, 7206, 0, 6647, 43986, 0, - 69766, 0, 64764, 4210, 983598, 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, 983711, 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, 983613, 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, 983693, 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, - 983492, 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, 983392, 0, 0, 1378, 9509, 0, 0, + 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, 128833, 10137, 6121, 10995, 78259, 74534, 8119, 64874, + 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, - 0, 65327, 65326, 65325, 10757, 1507, 42216, 65321, 65320, 65335, 65334, - 65333, 65332, 65331, 42059, 65329, 42689, 92427, 9128, 118885, 42073, - 6785, 64590, 983565, 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, 983522, 0, 1037, 0, 2025, 128263, 13098, 78442, 10637, 4568, + 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, 0, 983488, 120593, 13071, 0, + 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, 0, + 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, 0, 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, 983577, 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, + 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, + 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, 92571, 0, 0, 10414, - 13001, 8141, 0, 42537, 1557, 43594, 128642, 6330, 6805, 8631, 2545, - 120672, 127166, 0, 74190, 0, 0, 983521, 42762, 0, 42914, 1650, 262, 1637, - 0, 7901, 3238, 128173, 41861, 0, 0, 65158, 10860, 983575, 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, 983625, 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, 983663, - 92389, 74072, 55269, 0, 0, 983418, 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, 983683, 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, 983614, 868, - 873, 7642, 0, 869, 874, 7644, 983610, 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, 983530, 42776, - 66187, 12837, 8829, 7711, 92714, 0, 92321, 43318, 0, 8809, 119974, 0, 0, - 120604, 0, 983617, 0, 0, 0, 0, 7427, 9958, 4588, 43680, 0, 74484, 0, - 2433, 0, 119622, 3352, 74363, 983620, 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, 983671, 0, 3245, - 9068, 68194, 64725, 0, 0, 12991, 0, 2651, 128528, 983619, 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, 983627, 5208, 0, 128842, 10332, - 5218, 7976, 9156, 0, 3244, 5529, 69647, 73894, 128852, 5432, 64965, 5527, + 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, 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, 983611, 120285, 74225, - 119114, 8267, 0, 127265, 0, 7516, 0, 2625, 983709, 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, 983573, - 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, 983689, 120782, 4113, 0, 2372, 336, 0, 7509, 12152, 0, 682, - 66458, 41505, 0, 64743, 10593, 1703, 0, 983687, 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, 983454, 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, 983310, 0, 40987, 4667, - 0, 983664, 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, 983602, 7604, 0, 4009, 127816, 983445, - 120562, 0, 983455, 64860, 119138, 119069, 0, 127370, 4048, 983342, 0, - 120596, 1646, 77890, 64534, 73995, 120705, 0, 119890, 2579, 119905, 3177, - 11357, 9099, 4107, 3441, 119894, 2975, 74442, 9822, 983667, 55220, 10084, - 73943, 118840, 0, 917562, 0, 3399, 9851, 983452, 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, + 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, 0, 11730, 0, 9593, 5757, 2403, 64808, - 55275, 0, 11728, 43572, 0, 0, 7764, 983449, 11094, 120825, 0, 0, 4282, - 8298, 0, 0, 0, 0, 0, 64449, 0, 127509, 63854, 8456, 0, 74783, 65670, 0, + 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, 0, 983447, 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, 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, 983703, 0, 378, 2610, - 0, 65079, 983517, 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, 983338, 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, 983326, 6163, 983302, 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, 983694, 128229, 0, 41289, 0, 194602, 0, 8977, - 602, 120814, 0, 128778, 128661, 0, 0, 41279, 0, 0, 0, 11081, 43615, 0, 0, - 0, 983356, 12727, 0, 0, 78397, 9475, 7112, 65105, 0, 9633, 10886, 43592, - 7831, 983564, 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, 983472, 0, 1065, 0, 0, 43400, 2576, 66696, 0, 0, 43604, 0, 0, - 74082, 514, 74502, 0, 2921, 43215, 64493, 5772, 12968, 983350, 194944, - 74580, 43398, 2580, 983545, 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, 983468, 119042, 0, 127865, 13090, 66643, 0, 1270, + 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, 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, 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, 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, 983623, 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, 983343, 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, + 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, 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, 983555, 0, 0, 0, - 64293, 68098, 2635, 0, 0, 983581, 0, 983376, 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, 983526, 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, 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, 983405, 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, 983361, 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, 983410, 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, 983686, 0, 6589, 128588, 194679, 0, 0, - 983435, 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, 983408, 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, 983349, 9532, 66355, 0, 983049, 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, 983641, 78301, 0, 74211, 41897, 68477, 0, 917583, 983369, 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, 983509, 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, 983379, 1399, 983387, 65217, 0, 8852, 0, - 241, 128780, 4907, 0, 983374, 7932, 9727, 128873, 74255, 8748, 0, 0, - 983378, 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, 983660, - 9576, 128872, 3347, 4160, 5154, 55288, 3794, 66564, 8530, 127063, 7709, - 41112, 0, 66560, 42041, 4572, 12876, 66561, 983493, 6758, 983658, 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, 983531, - 120609, 0, 3370, 0, 11361, 5443, 78778, 8153, 73767, 0, 10741, 0, 0, 0, - 983652, 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, 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, 983669, 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, + 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, 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, 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, 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, 0, 0, 11739, 0, 41981, 0, 5938, 0, 0, 12448, 7576, - 10401, 10337, 73852, 0, 13057, 0, 126976, 0, 10009, 0, 41703, 983373, - 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, + 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, 0, 68625, 0, 7269, 0, 5964, - 12908, 983299, 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, 983634, 68638, 73993, 10525, 4649, 65209, 983612, 0, 4648, - 43080, 0, 0, 0, 6246, 64950, 7828, 4650, 6777, 6776, 6775, 4653, 7822, - 78005, 92384, 43187, 8669, 983306, 6821, 65093, 0, 78881, 2716, 0, 0, 0, - 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, 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, 983607, 194907, 44003, - 0, 0, 0, 120498, 127851, 195009, 983600, 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, + 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, 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, 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, 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, - 983605, 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, 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, 983345, 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, + 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, + 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, 0, + 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, 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, + 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, 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, 983608, - 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, 983713, 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, 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, + 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, 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, 983474, 40972, 5245, 0, 10114, + 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, 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, 983305, 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, 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, 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, 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, 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, - 983599, 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, 983609, 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, 983621, 3762, 10015, 127335, - 119232, 0, 41590, 0, 92378, 3780, 7485, 5779, 0, 42037, 0, 3906, 12349, + 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, 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, 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, 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, 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, 983487, 119237, 0, 128805, - 4470, 119613, 917557, 7780, 5369, 118958, 5249, 0, 5367, 8756, 127143, 0, - 5377, 120585, 68143, 1688, 78245, 0, 69685, 983491, 0, 0, 44020, 6808, - 41319, 1300, 10650, 41692, 64505, 4668, 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, 10830, 0, - 615, 64490, 7574, 92617, 77922, 0, 12909, 43016, 64559, 127028, 0, 0, 0, - 2020, 0, 4022, 128783, 0, 77923, 983446, 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, + 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, 983427, 69641, 10753, + 10830, 0, 615, 64490, 7574, 92617, 77922, 0, 12909, 43016, 64559, 127028, + 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, - 983631, 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, 983353, 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, 983304, 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, 983699, 12852, 3031, - 0, 64361, 0, 182, 194718, 92716, 92598, 119950, 0, 9058, 366, 0, 9892, - 5969, 11754, 10848, 4570, 65301, 44013, 4255, 983700, 10102, 41189, 4003, + 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, @@ -18851,206 +19606,212 @@ 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, 983485, 43293, 119944, 0, 119164, 120328, 92467, - 0, 1700, 119223, 0, 0, 128119, 4004, 0, 10968, 43296, 983377, 8506, 0, 0, - 126996, 1005, 937, 78216, 4734, 2870, 0, 78218, 0, 7463, 4729, 0, 235, - 1384, 4728, 0, 120420, 92490, 120331, 8109, 43105, 983535, 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, 983529, 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, 983648, 0, 65851, 42607, - 128190, 92403, 3168, 0, 42134, 0, 2370, 2846, 92605, 0, 0, 120132, 0, - 1836, 0, 0, 92558, 3740, 92547, 6290, 65374, 120451, 2390, 3944, 66628, - 120434, 0, 6135, 3118, 74265, 119093, 120446, 0, 0, 8127, 8975, 64739, - 7943, 983478, 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, 983532, 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, 983568, 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, 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, 983425, 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, 983533, 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, + 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, 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, 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, 983442, 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, 983637, 74359, 12626, - 9106, 0, 42642, 120230, 64750, 9390, 0, 41797, 0, 0, 265, 41795, 64666, - 0, 43530, 2752, 0, 0, 0, 59, 0, 983337, 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, 983333, 0, 4373, 78058, - 0, 9587, 1789, 6671, 128840, 3100, 0, 65360, 0, 92365, 983556, 64922, 0, - 8190, 12083, 0, 0, 6506, 64312, 74374, 2368, 0, 4419, 983582, 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, 983585, 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, 119868, 74408, 0, 73959, 5426, 4258, 0, 0, 5424, - 128127, 8283, 0, 5434, 983334, 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, 983398, 13096, - 128643, 0, 43408, 9516, 128538, 5268, 42230, 42220, 0, 4450, 120511, - 11547, 43417, 128542, 356, 3477, 227, 10488, 68203, 382, 11418, 0, - 983319, 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, 983523, 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, - 983441, 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, - 983537, 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, 983428, 9693, 41943, 0, 41931, - 41759, 12757, 4353, 0, 1059, 9790, 8995, 128286, 983431, 65937, 0, 41764, - 10646, 0, 118833, 92372, 0, 74830, 78569, 12743, 983424, 6480, 917761, - 41779, 42580, 66601, 12207, 119619, 6335, 66602, 11312, 64807, 0, 0, - 41767, 0, 983499, 43020, 128271, 3955, 74254, 0, 983489, 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, 983426, 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, 983400, 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, 983388, 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, 983552, 0, 195024, 10196, 7886, 0, 6585, 0, - 6680, 195042, 0, 195051, 6679, 74412, 92251, 194866, 74421, 11382, - 983366, 983372, 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, 983675, 6228, - 4307, 3482, 128527, 0, 0, 0, 506, 74573, 41194, 65735, 2055, 43255, - 41195, 0, 8169, 983415, 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, 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, - 983584, 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, 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, 983432, 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, 983506, 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, - 983657, 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, - 983381, 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, + 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, + 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, 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, 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 @@ -19058,19 +19819,457 @@ #define code_poly 32771 static const unsigned int aliases_start = 0xf0000; -static const unsigned int aliases_end = 0xf000b; +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 { @@ -19078,8 +20277,8 @@ Py_UCS2 seq[4]; } named_sequence; -static const unsigned int named_sequences_start = 0xf0100; -static const unsigned int named_sequences_end = 0xf02a2; +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}}, @@ -19441,6 +20640,9 @@ {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}}, diff --git a/Objects/unicodetype_db.h b/Objects/unicodetype_db.h --- a/Objects/unicodetype_db.h +++ b/Objects/unicodetype_db.h @@ -84,6 +84,7 @@ {-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}, @@ -278,6 +279,7 @@ {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}, @@ -1001,72 +1003,72 @@ 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, 111, 34, 34, 34, 34, 34, - 34, 34, 34, 112, 34, 34, 113, 114, 115, 116, 117, 118, 119, 120, 121, - 122, 123, 124, 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, 125, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, - 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, - 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, - 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, - 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 127, 128, 129, - 130, 131, 132, 133, 34, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, - 17, 144, 145, 146, 147, 148, 17, 17, 17, 17, 17, 17, 149, 17, 150, 17, - 151, 17, 152, 17, 153, 17, 17, 17, 154, 17, 17, 17, 155, 156, 17, 17, 17, - 17, 17, 17, 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, 157, 17, 158, - 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, 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, 34, 34, 34, 34, 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, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 161, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 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, 162, 163, 164, 165, 17, 166, 17, 167, 168, 169, 170, 171, 172, - 173, 174, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 175, 176, 177, - 178, 179, 17, 180, 181, 182, 183, 184, 185, 186, 187, 65, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 188, 189, 190, 34, - 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 86, 191, 34, 192, - 193, 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, 194, 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, 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, 196, 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, 197, 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, @@ -1074,431 +1076,431 @@ 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 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, 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, 199, 34, 200, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 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, 194, 34, 34, 200, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 201, 17, 202, 203, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 126, 126, 126, 126, 126, 126, - 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, - 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, - 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, - 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, - 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, - 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, - 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, - 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, - 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, - 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, - 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, - 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, - 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, - 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, - 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, - 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, - 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, - 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, - 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, - 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, - 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, - 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, - 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, - 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, - 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, - 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, - 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, - 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, - 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, - 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, - 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, - 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, - 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, - 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, - 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, - 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, - 126, 204, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, - 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, - 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, - 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, - 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, - 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, - 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, - 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, - 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, - 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, - 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, - 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, - 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, - 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, - 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, - 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, - 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, - 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, - 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, - 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, - 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, - 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, - 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, - 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, - 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, - 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, - 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, - 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, - 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, - 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, - 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, - 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, - 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, - 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, - 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, - 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, - 126, 126, 126, 126, 126, 126, 126, 126, 126, 204, + 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 short index2[] = { @@ -1534,62 +1536,62 @@ 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, 20, 20, 82, 83, 20, 84, 20, 20, 20, 83, 20, - 85, 86, 20, 20, 87, 20, 20, 20, 20, 20, 20, 20, 88, 20, 20, 89, 20, 20, - 89, 20, 20, 20, 20, 89, 90, 91, 91, 92, 20, 20, 20, 20, 20, 93, 20, 55, + 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, 94, 94, 94, 94, 94, 94, 94, 94, 94, - 95, 95, 95, 95, 95, 95, 95, 94, 94, 6, 6, 6, 6, 95, 95, 95, 95, 95, 95, - 95, 95, 95, 95, 95, 95, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 94, 94, - 94, 94, 94, 6, 6, 6, 6, 6, 6, 6, 95, 6, 95, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 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, 96, 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, 95, 6, 30, 31, 0, 0, - 97, 50, 50, 50, 5, 0, 0, 0, 0, 0, 6, 6, 98, 25, 99, 99, 99, 0, 100, 0, - 101, 101, 102, 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, 103, 104, 104, 104, - 105, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, - 106, 19, 19, 19, 19, 19, 19, 19, 19, 19, 107, 108, 108, 109, 110, 111, - 112, 112, 112, 113, 114, 115, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, - 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 116, 117, 118, 20, - 119, 120, 5, 30, 31, 121, 30, 31, 20, 64, 64, 64, 122, 122, 122, 122, - 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 17, 17, 17, + 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, 123, 123, 123, 123, 123, 123, 123, 123, 123, - 123, 123, 123, 123, 123, 123, 123, 30, 31, 30, 31, 30, 31, 30, 31, 30, + 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, 124, 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, 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, 126, - 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, - 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, - 126, 126, 126, 126, 126, 126, 126, 126, 126, 0, 0, 95, 5, 5, 5, 5, 5, 5, - 0, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, + 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, 128, 0, 5, 5, 0, 0, 0, - 0, 0, 0, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 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, 0, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 25, 25, 25, 25, 25, 25, 25, 25, + 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, 95, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 25, 25, 25, 25, + 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, @@ -1598,7 +1600,7 @@ 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 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, 95, 95, 25, 25, 5, 25, 25, 25, 25, 55, 55, 7, 8, 9, 10, 11, + 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, @@ -1612,272 +1614,272 @@ 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, 95, 95, 5, 5, 5, 5, 95, + 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, 95, 25, 25, 25, 25, 25, - 25, 25, 25, 25, 95, 25, 25, 25, 95, 25, 25, 25, 25, 25, 0, 0, 5, 5, 5, 5, + 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, 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, 95, 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, 0, 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, 129, 25, 25, 25, 25, 25, 25, 25, 0, 0, 0, 0, - 5, 55, 55, 55, 55, 55, 55, 95, 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, 129, 25, 25, 25, 25, 25, 25, 0, - 25, 25, 55, 0, 0, 55, 55, 55, 55, 55, 0, 95, 0, 25, 25, 25, 25, 25, 25, - 0, 0, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 0, 0, 55, 55, 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, 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, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 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, 130, 130, 130, 130, 130, 130, 130, 130, - 130, 130, 130, 130, 130, 130, 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, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 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, - 95, 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, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 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, 131, 132, - 133, 134, 135, 136, 137, 138, 139, 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, 140, 140, 140, 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, 21, 21, 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, 95, 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, 95, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 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, 131, 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, 95, 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, 0, 0, 0, 55, 55, 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, 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, - 95, 95, 95, 95, 95, 95, 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, 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, 0, 0, 0, 0, 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, 94, 94, 94, 94, 94, 94, - 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, - 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, - 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 20, 20, 20, 20, 20, 20, - 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 94, 141, - 20, 20, 20, 142, 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, 94, 94, 94, - 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, - 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 25, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 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, + 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, @@ -1885,50 +1887,51 @@ 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, 143, 144, 145, 146, 147, 148, 20, 20, - 149, 20, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, + 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, 150, 150, 150, 150, 150, 150, 150, 150, - 151, 151, 151, 151, 151, 151, 151, 151, 150, 150, 150, 150, 150, 150, 0, - 0, 151, 151, 151, 151, 151, 151, 0, 0, 150, 150, 150, 150, 150, 150, 150, - 150, 151, 151, 151, 151, 151, 151, 151, 151, 150, 150, 150, 150, 150, - 150, 150, 150, 151, 151, 151, 151, 151, 151, 151, 151, 150, 150, 150, - 150, 150, 150, 0, 0, 151, 151, 151, 151, 151, 151, 0, 0, 152, 150, 153, - 150, 154, 150, 155, 150, 0, 151, 0, 151, 0, 151, 0, 151, 150, 150, 150, - 150, 150, 150, 150, 150, 151, 151, 151, 151, 151, 151, 151, 151, 156, - 156, 157, 157, 157, 157, 158, 158, 159, 159, 160, 160, 161, 161, 0, 0, - 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, - 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, - 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, - 204, 205, 206, 207, 208, 209, 150, 150, 210, 211, 212, 0, 213, 214, 151, - 151, 215, 215, 216, 6, 217, 6, 6, 6, 218, 219, 220, 0, 221, 222, 223, - 223, 223, 223, 224, 6, 6, 6, 150, 150, 225, 226, 0, 0, 227, 228, 151, - 151, 229, 229, 0, 6, 6, 6, 150, 150, 230, 231, 232, 118, 233, 234, 151, - 151, 235, 235, 121, 6, 6, 6, 0, 0, 236, 237, 238, 0, 239, 240, 241, 241, - 242, 242, 243, 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, 244, 95, 0, 0, 245, 246, 247, 248, 249, 250, 5, 5, 5, - 5, 5, 95, 244, 26, 22, 23, 245, 246, 247, 248, 249, 250, 5, 5, 5, 5, 5, - 0, 94, 94, 94, 94, 94, 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, 112, 5, 5, 5, 5, 112, 5, 5, 20, 112, 112, 112, 20, - 20, 112, 112, 112, 20, 5, 112, 5, 5, 251, 112, 112, 112, 112, 112, 5, 5, - 5, 5, 5, 5, 112, 5, 252, 5, 112, 5, 253, 254, 112, 112, 251, 20, 112, - 112, 255, 112, 20, 55, 55, 55, 55, 20, 5, 5, 20, 20, 112, 112, 5, 5, 5, - 5, 5, 112, 20, 20, 20, 20, 5, 5, 5, 5, 256, 5, 27, 27, 27, 27, 27, 27, - 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 257, 257, 257, 257, 257, 257, - 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, 258, 258, 258, 258, - 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 140, 140, - 140, 30, 31, 140, 140, 140, 140, 27, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5, + 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, @@ -1943,313 +1946,318 @@ 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 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, 26, 22, 23, 245, 246, 247, 248, 249, 250, 27, 27, 27, 27, 27, 27, - 27, 27, 27, 27, 27, 26, 22, 23, 245, 246, 247, 248, 249, 250, 27, 27, 27, - 27, 27, 27, 27, 27, 27, 27, 27, 26, 22, 23, 245, 246, 247, 248, 249, 250, - 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, 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, 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, 244, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 26, - 22, 23, 245, 246, 247, 248, 249, 250, 27, 244, 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, 245, 246, 247, 248, - 249, 250, 27, 26, 22, 23, 245, 246, 247, 248, 249, 250, 27, 26, 22, 23, - 245, 246, 247, 248, 249, 250, 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, 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, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, - 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, - 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, - 126, 126, 126, 126, 126, 126, 126, 126, 126, 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, - 30, 31, 261, 262, 263, 264, 265, 30, 31, 30, 31, 30, 31, 266, 267, 268, - 269, 20, 30, 31, 20, 30, 31, 20, 20, 20, 20, 20, 20, 94, 270, 270, 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, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 27, 5, 5, 271, 271, 271, - 271, 271, 271, 271, 271, 271, 271, 271, 271, 271, 271, 271, 271, 271, - 271, 271, 271, 271, 271, 271, 271, 271, 271, 271, 271, 271, 271, 271, - 271, 271, 271, 271, 271, 271, 271, 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, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 95, 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, 272, 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, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 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, 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, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 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, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 0, 2, 5, 5, 5, - 5, 95, 55, 140, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 140, 140, 140, 140, 140, 140, 140, 140, 140, 25, 25, - 25, 25, 25, 25, 5, 95, 95, 95, 95, 95, 5, 5, 140, 140, 140, 95, 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, 95, 95, 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, 95, 95, 95, 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, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 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, 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, 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, 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, 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, 55, 55, - 55, 55, 55, 273, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 273, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 273, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 273, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 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, 0, 0, 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, 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, 5, 5, 5, 5, 5, 5, 5, 5, 273, 55, 55, 273, 55, 55, 55, 273, 55, 273, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 273, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 273, 55, 55, 55, 55, 55, 55, 55, 273, 55, 273, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 273, 273, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 273, 55, - 55, 55, 55, 55, 55, 55, 55, 273, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 273, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 273, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 273, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 273, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 273, 55, 273, 55, 273, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 273, 55, 273, 273, 273, 55, - 55, 55, 55, 55, 55, 273, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 273, 273, 273, - 273, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 273, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 273, 55, 55, 55, 55, - 55, 55, 55, 273, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 273, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 273, 273, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 273, 273, 273, 55, 273, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 273, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 273, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 273, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 273, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 273, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 273, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 273, 55, 55, 55, 55, 273, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 273, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 273, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 273, 55, 55, 55, 55, - 55, 273, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 273, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 273, 55, 55, 55, 55, 55, 55, 55, 55, + 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, 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 95, 55, 55, 55, 55, 55, 55, 55, + 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, @@ -2261,584 +2269,635 @@ 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, 95, 95, 95, 95, 95, 95, 5, 5, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 95, 5, 5, 5, 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, 0, 0, 0, 0, 0, 0, 0, 0, 25, - 25, 5, 95, 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, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 140, 140, 140, 140, - 140, 140, 140, 140, 140, 140, 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, 95, 95, 95, 95, 95, 95, 95, 95, 95, 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, 94, - 20, 20, 20, 20, 20, 20, 20, 20, 30, 31, 30, 31, 274, 30, 31, 30, 31, 30, - 31, 30, 31, 30, 31, 95, 6, 6, 30, 31, 275, 20, 0, 30, 31, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 31, 30, 31, 30, 31, 30, 31, 30, 31, 0, 0, + 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, 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, 95, 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, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 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, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 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, 95, - 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, 95, 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, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 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, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 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, 55, 55, 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 55, 55, 55, 55, 55, 55, 0, + 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 273, 55, 55, - 55, 55, 55, 55, 55, 273, 55, 55, 55, 55, 273, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 273, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 273, 55, 273, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 273, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 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, 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, 276, 277, 278, 279, 280, - 281, 282, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 283, 284, 285, 286, 287, 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, 288, 288, 288, 288, 288, 288, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 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, 288, 288, 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, 288, 55, 288, 55, 288, 0, - 288, 55, 288, 55, 288, 55, 288, 55, 288, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 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, 95, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 289, 289, 55, - 55, 55, 55, 55, 55, 55, 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, 140, 140, 140, 140, 140, 140, - 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, - 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, - 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, - 140, 140, 140, 140, 140, 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, 55, 55, 55, 55, 55, 55, 55, 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, 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, - 140, 55, 55, 55, 55, 55, 55, 55, 55, 140, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 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, - 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, 140, 140, 140, 140, 140, 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, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, - 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, - 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, - 290, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, - 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, - 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 291, 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, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 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, 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, 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, - 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, 245, 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, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 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, 26, 22, 23, 245, 246, 247, - 248, 249, 250, 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, 245, 246, 247, 248, 249, 250, 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, 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, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 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, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, - 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, - 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, - 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 251, 251, 140, - 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, - 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, - 140, 140, 140, 140, 140, 251, 251, 140, 140, 140, 140, 140, 140, 140, - 140, 140, 140, 140, 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, + 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, 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, 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, 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, 5, 5, 5, 5, + 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, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 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, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 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, 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, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 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, 25, 25, 25, 25, 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, 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, 5, 5, 5, 5, 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, 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, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 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, 5, 5, 5, + 5, 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, 5, 5, 5, 5, 5, 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, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 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, 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, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 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, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 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, 5, 5, - 5, 5, 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, 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, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, - 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, - 112, 112, 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, 112, 112, 112, 112, 112, 112, - 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, - 112, 112, 112, 112, 112, 112, 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, 112, 112, - 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, - 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 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, 112, 0, 112, 112, 0, 0, 112, 0, 0, 112, 112, 0, 0, 112, 112, 112, - 112, 0, 112, 112, 112, 112, 112, 112, 112, 112, 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, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, - 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 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, 112, 112, 0, 112, 112, 112, 112, 0, 0, 112, 112, 112, - 112, 112, 112, 112, 112, 0, 112, 112, 112, 112, 112, 112, 112, 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, 112, 112, 0, 112, 112, 112, 112, 0, 112, 112, - 112, 112, 112, 0, 112, 0, 0, 0, 112, 112, 112, 112, 112, 112, 112, 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, 112, 112, 112, 112, 112, 112, 112, 112, 112, - 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, - 112, 112, 112, 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, 112, 112, 112, 112, 112, - 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, - 112, 112, 112, 112, 112, 112, 112, 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, 112, - 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, - 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 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, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, - 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, - 112, 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, 112, 112, 112, 112, 112, 112, 112, - 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, - 112, 112, 112, 112, 112, 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, 112, 112, 112, - 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, - 112, 112, 112, 112, 112, 112, 112, 112, 112, 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, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, - 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 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, 112, 112, 112, - 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, - 112, 112, 112, 112, 112, 112, 112, 112, 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, 112, 112, 112, 112, 112, 112, 112, 112, 112, - 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, - 112, 112, 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, 112, - 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, - 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 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, 112, 112, 112, 112, 112, 112, 112, - 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, - 112, 112, 112, 112, 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, 112, 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, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 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, 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, 244, 244, 26, 22, 23, 245, 246, 247, - 248, 249, 250, 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, 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, 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, 5, 5, 5, 5, 5, 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, 5, - 5, 5, 5, 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, 5, 5, 5, 5, 5, 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, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 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, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 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, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 273, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 273, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 273, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 273, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 273, - 55, 55, 55, 55, 55, 55, 55, 55, 273, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 273, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 273, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 273, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 273, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 273, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 273, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 273, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 273, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 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, + 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, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 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, @@ -2851,13 +2910,13 @@ 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 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, + 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, 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 @@ -2917,6 +2976,10 @@ case 0x1018A: case 0x104A0: case 0x11066: + case 0x110F0: + case 0x11136: + case 0x111D0: + case 0x116C0: case 0x1D7CE: case 0x1D7D8: case 0x1D7E2: @@ -3004,6 +3067,10 @@ case 0x10E60: case 0x11052: case 0x11067: + case 0x110F1: + case 0x11137: + case 0x111D1: + case 0x116C1: case 0x12415: case 0x1241E: case 0x1242C: @@ -3080,6 +3147,7 @@ case 0x2793: case 0x3038: case 0x3229: + case 0x3248: case 0x3289: case 0x4EC0: case 0x5341: @@ -3300,6 +3368,10 @@ case 0x10E61: case 0x11053: case 0x11068: + case 0x110F2: + case 0x11138: + case 0x111D2: + case 0x116C2: case 0x12400: case 0x12416: case 0x1241F: @@ -3332,6 +3404,7 @@ case 0x249B: case 0x24F4: case 0x3039: + case 0x3249: case 0x5344: case 0x5EFF: case 0x10111: @@ -3443,6 +3516,10 @@ case 0x10E62: case 0x11054: case 0x11069: + case 0x110F3: + case 0x11139: + case 0x111D3: + case 0x116C3: case 0x12401: case 0x12408: case 0x12417: @@ -3488,6 +3565,7 @@ return (double) 3.0/8.0; case 0x1374: case 0x303A: + case 0x324A: case 0x325A: case 0x5345: case 0x10112: @@ -3587,6 +3665,10 @@ case 0x10E63: case 0x11055: case 0x1106A: + case 0x110F4: + case 0x1113A: + case 0x111D4: + case 0x116C4: case 0x12402: case 0x12409: case 0x1240F: @@ -3616,6 +3698,7 @@ case 0x2158: return (double) 4.0/5.0; case 0x1375: + case 0x324B: case 0x32B5: case 0x534C: case 0x10113: @@ -3717,6 +3800,10 @@ case 0x10E64: case 0x11056: case 0x1106B: + case 0x110F5: + case 0x1113B: + case 0x111D5: + case 0x116C5: case 0x12403: case 0x1240A: case 0x12410: @@ -3748,6 +3835,7 @@ case 0x216C: case 0x217C: case 0x2186: + case 0x324C: case 0x32BF: case 0x10114: case 0x10144: @@ -3851,6 +3939,10 @@ case 0x10E65: case 0x11057: case 0x1106C: + case 0x110F6: + case 0x1113C: + case 0x111D6: + case 0x116C6: case 0x12404: case 0x1240B: case 0x12411: @@ -3868,6 +3960,7 @@ case 0x20AEA: return (double) 6.0; case 0x1377: + case 0x324D: case 0x10115: case 0x10E6E: case 0x11060: @@ -3941,6 +4034,10 @@ case 0x10E66: case 0x11058: case 0x1106D: + case 0x110F7: + case 0x1113D: + case 0x111D7: + case 0x116C7: case 0x12405: case 0x1240C: case 0x12412: @@ -3963,6 +4060,7 @@ case 0x215E: return (double) 7.0/8.0; case 0x1378: + case 0x324E: case 0x10116: case 0x10E6F: case 0x11061: @@ -4034,6 +4132,10 @@ case 0x10E67: case 0x11059: case 0x1106E: + case 0x110F8: + case 0x1113E: + case 0x111D8: + case 0x116C8: case 0x12406: case 0x1240D: case 0x12413: @@ -4050,6 +4152,7 @@ case 0x1F109: return (double) 8.0; case 0x1379: + case 0x324F: case 0x10117: case 0x10E70: case 0x11062: @@ -4122,6 +4225,10 @@ case 0x10E68: case 0x1105A: case 0x1106F: + case 0x110F9: + case 0x1113F: + case 0x111D9: + case 0x116C9: case 0x12407: case 0x1240E: case 0x12414: diff --git a/Tools/unicode/makeunicodedata.py b/Tools/unicode/makeunicodedata.py --- a/Tools/unicode/makeunicodedata.py +++ b/Tools/unicode/makeunicodedata.py @@ -38,7 +38,7 @@ VERSION = "3.2" # The Unicode Database -UNIDATA_VERSION = "6.0.0" +UNIDATA_VERSION = "6.1.0" UNICODE_DATA = "UnicodeData%s.txt" COMPOSITION_EXCLUSIONS = "CompositionExclusions%s.txt" EASTASIAN_WIDTH = "EastAsianWidth%s.txt" @@ -58,7 +58,7 @@ # we use this ranges of PUA_15 to store name aliases and named sequences NAME_ALIASES_START = 0xF0000 -NAMED_SEQUENCES_START = 0xF0100 +NAMED_SEQUENCES_START = 0xF0200 old_versions = ["3.2.0"] @@ -95,7 +95,7 @@ # these ranges need to match unicodedata.c:is_unified_ideograph cjk_ranges = [ ('3400', '4DB5'), - ('4E00', '9FCB'), + ('4E00', '9FCC'), ('20000', '2A6D6'), ('2A700', '2B734'), ('2B740', '2B81D') @@ -958,7 +958,7 @@ s = s.strip() if not s or s.startswith('#'): continue - char, name = s.split(';') + char, name, abbrev = s.split(';') char = int(char, 16) self.aliases.append((name, char)) # also store the name in the PUA 1 @@ -971,6 +971,7 @@ # in order to take advantage of the compression and lookup # algorithms used for the other characters. + assert pua_index < NAMED_SEQUENCES_START pua_index = NAMED_SEQUENCES_START with open_data(NAMED_SEQUENCES, version) as file: for s in file: -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Feb 21 04:35:04 2012 From: python-checkins at python.org (benjamin.peterson) Date: Tue, 21 Feb 2012 04:35:04 +0100 Subject: [Python-checkins] =?utf8?q?cpython=3A_adjust_docs_for_unicode_6?= =?utf8?q?=2E1?= Message-ID: http://hg.python.org/cpython/rev/101dbccad0b0 changeset: 75109:101dbccad0b0 parent: 75107:cd21e6d30a1a user: Benjamin Peterson date: Mon Feb 20 22:34:50 2012 -0500 summary: adjust docs for unicode 6.1 files: Doc/library/unicodedata.rst | 8 ++++---- 1 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Doc/library/unicodedata.rst b/Doc/library/unicodedata.rst --- 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 -`_. +this database is compiled from the `UCD version 6.1.0 +`_. The module uses the same names and symbols as defined by Unicode Standard Annex #44, `"Unicode Character Database" @@ -166,6 +166,6 @@ .. rubric:: Footnotes -.. [#] http://www.unicode.org/Public/6.0.0/ucd/NameAliases.txt +.. [#] http://www.unicode.org/Public/6.1.0/ucd/NameAliases.txt -.. [#] http://www.unicode.org/Public/6.0.0/ucd/NamedSequences.txt +.. [#] http://www.unicode.org/Public/6.1.0/ucd/NamedSequences.txt -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Feb 21 04:35:29 2012 From: python-checkins at python.org (benjamin.peterson) Date: Tue, 21 Feb 2012 04:35:29 +0100 Subject: [Python-checkins] =?utf8?q?cpython=3A_update_unicode_link?= Message-ID: http://hg.python.org/cpython/rev/e51951b4fcc3 changeset: 75110:e51951b4fcc3 user: Benjamin Peterson date: Mon Feb 20 22:35:25 2012 -0500 summary: update unicode link files: Doc/reference/lexical_analysis.rst | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Doc/reference/lexical_analysis.rst b/Doc/reference/lexical_analysis.rst --- a/Doc/reference/lexical_analysis.rst +++ b/Doc/reference/lexical_analysis.rst @@ -718,4 +718,4 @@ .. rubric:: Footnotes -.. [#] http://www.unicode.org/Public/6.0.0/ucd/NameAliases.txt +.. [#] http://www.unicode.org/Public/6.1.0/ucd/NameAliases.txt -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Feb 21 05:06:30 2012 From: python-checkins at python.org (benjamin.peterson) Date: Tue, 21 Feb 2012 05:06:30 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=282=2E7=29=3A_don=27t_rely_on?= =?utf8?q?_dict_order?= Message-ID: http://hg.python.org/cpython/rev/47232e4b73bc changeset: 75111:47232e4b73bc branch: 2.7 parent: 75108:e3fb353b3fd4 user: Benjamin Peterson date: Mon Feb 20 23:06:22 2012 -0500 summary: don't rely on dict order files: Lib/json/__init__.py | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Lib/json/__init__.py b/Lib/json/__init__.py --- a/Lib/json/__init__.py +++ b/Lib/json/__init__.py @@ -31,7 +31,7 @@ Compact encoding:: >>> import json - >>> json.dumps([1,2,3,{'4': 5, '6': 7}], separators=(',',':')) + >>> json.dumps([1,2,3,{'4': 5, '6': 7}], sort_keys=True, separators=(',',':')) '[1,2,3,{"4":5,"6":7}]' Pretty printing:: -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Feb 21 05:13:30 2012 From: python-checkins at python.org (benjamin.peterson) Date: Tue, 21 Feb 2012 05:13:30 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=282=2E7=29=3A_use_set?= Message-ID: http://hg.python.org/cpython/rev/98732d20b6d1 changeset: 75112:98732d20b6d1 branch: 2.7 user: Benjamin Peterson date: Mon Feb 20 23:11:19 2012 -0500 summary: use set files: Lib/re.py | 5 +---- 1 files changed, 1 insertions(+), 4 deletions(-) diff --git a/Lib/re.py b/Lib/re.py --- a/Lib/re.py +++ b/Lib/re.py @@ -198,10 +198,7 @@ "Compile a template pattern, returning a pattern object" return _compile(pattern, flags|T) -_alphanum = {} -for c in 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890': - _alphanum[c] = 1 -del c +_alphanum = set('abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890') def escape(pattern): "Escape all non-alphanumeric characters in pattern." -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Feb 21 05:13:31 2012 From: python-checkins at python.org (benjamin.peterson) Date: Tue, 21 Feb 2012 05:13:31 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=282=2E7=29=3A_a_frozenset_is_?= =?utf8?q?better_here?= Message-ID: http://hg.python.org/cpython/rev/475d5a749756 changeset: 75113:475d5a749756 branch: 2.7 user: Benjamin Peterson date: Mon Feb 20 23:13:20 2012 -0500 summary: a frozenset is better here files: Lib/re.py | 3 ++- 1 files changed, 2 insertions(+), 1 deletions(-) diff --git a/Lib/re.py b/Lib/re.py --- a/Lib/re.py +++ b/Lib/re.py @@ -198,7 +198,8 @@ "Compile a template pattern, returning a pattern object" return _compile(pattern, flags|T) -_alphanum = set('abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890') +_alphanum = frozenset( + "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890") def escape(pattern): "Escape all non-alphanumeric characters in pattern." -- Repository URL: http://hg.python.org/cpython From solipsis at pitrou.net Tue Feb 21 05:34:19 2012 From: solipsis at pitrou.net (solipsis at pitrou.net) Date: Tue, 21 Feb 2012 05:34:19 +0100 Subject: [Python-checkins] Daily reference leaks (4a77887b1ac2): sum=0 Message-ID: results for 4a77887b1ac2 on branch "default" -------------------------------------------- Command line was: ['./python', '-m', 'test.regrtest', '-uall', '-R', '3:3:/home/antoine/cpython/refleaks/reflogU3L1ta', '-x'] From python-checkins at python.org Tue Feb 21 06:15:17 2012 From: python-checkins at python.org (benjamin.peterson) Date: Tue, 21 Feb 2012 06:15:17 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=282=2E7=29=3A_don=27t_rely_on?= =?utf8?q?_dict_order?= Message-ID: http://hg.python.org/cpython/rev/d42842083dcf changeset: 75114:d42842083dcf branch: 2.7 user: Benjamin Peterson date: Tue Feb 21 00:15:10 2012 -0500 summary: don't rely on dict order files: Lib/lib-tk/test/test_ttk/test_functions.py | 6 ++++-- 1 files changed, 4 insertions(+), 2 deletions(-) diff --git a/Lib/lib-tk/test/test_ttk/test_functions.py b/Lib/lib-tk/test/test_ttk/test_functions.py --- a/Lib/lib-tk/test/test_ttk/test_functions.py +++ b/Lib/lib-tk/test/test_ttk/test_functions.py @@ -143,8 +143,10 @@ self.assertEqual(ttk._format_elemcreate('image', False, 'test', ('a', 'b', 'c')), ("test {a b} c", ())) # state spec and options - self.assertEqual(ttk._format_elemcreate('image', False, 'test', - ('a', 'b'), a='x', b='y'), ("test a b", ("-a", "x", "-b", "y"))) + res = ttk._format_elemcreate('image', False, 'test', + ('a', 'b'), a='x', b='y') + self.assertEqual(res[0], "test a b") + self.assertEqual(set(res[1]), {"-a", "x", "-b", "y"}) # format returned values as a tcl script # state spec with multiple states and an option with a multivalue self.assertEqual(ttk._format_elemcreate('image', True, 'test', -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Feb 21 06:40:23 2012 From: python-checkins at python.org (benjamin.peterson) Date: Tue, 21 Feb 2012 06:40:23 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=282=2E7=29=3A_kill_interned_s?= =?utf8?q?trings_computed_before_random_initialization?= Message-ID: http://hg.python.org/cpython/rev/100d4c2f9028 changeset: 75115:100d4c2f9028 branch: 2.7 user: Benjamin Peterson date: Tue Feb 21 00:40:14 2012 -0500 summary: kill interned strings computed before random initialization files: Modules/main.c | 6 ++++++ 1 files changed, 6 insertions(+), 0 deletions(-) diff --git a/Modules/main.c b/Modules/main.c --- a/Modules/main.c +++ b/Modules/main.c @@ -397,6 +397,12 @@ case 'W': PySys_AddWarnOption(_PyOS_optarg); + /* Extremely obscure hack: if _PyOS_optarg was one character, + PyString_FromString in PySys_AddWarnOption will try to intern + it. This is bad because hash randomization has not been setup + yet, so the string will get the wrong hash. The following call + will cause all the cached characters to be released. */ + PyString_Fini(); break; case 'R': -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Feb 21 08:29:22 2012 From: python-checkins at python.org (ezio.melotti) Date: Tue, 21 Feb 2012 08:29:22 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=282=2E7=29=3A_HTMLParser_is_n?= =?utf8?q?ow_able_to_handle_slashes_in_the_start_tag=2E?= Message-ID: http://hg.python.org/cpython/rev/37c824c3efe8 changeset: 75116:37c824c3efe8 branch: 2.7 user: Ezio Melotti date: Tue Feb 21 09:22:16 2012 +0200 summary: HTMLParser is now able to handle slashes in the start tag. files: Lib/HTMLParser.py | 10 +++++----- Lib/test/test_htmlparser.py | 21 +++++++++++++++++++++ Misc/NEWS | 2 ++ 3 files changed, 28 insertions(+), 5 deletions(-) diff --git a/Lib/HTMLParser.py b/Lib/HTMLParser.py --- a/Lib/HTMLParser.py +++ b/Lib/HTMLParser.py @@ -28,19 +28,19 @@ tagfind_tolerant = re.compile('[a-zA-Z][^\t\n\r\f />\x00]*') attrfind = re.compile( - r'\s*((?<=[\'"\s])[^\s/>][^\s/=>]*)(\s*=+\s*' - r'(\'[^\']*\'|"[^"]*"|(?![\'"])[^>\s]*))?') + r'[\s/]*((?<=[\'"\s/])[^\s/>][^\s/=>]*)(\s*=+\s*' + r'(\'[^\']*\'|"[^"]*"|(?![\'"])[^>\s]*))?(?:\s|/(?!>))*') locatestarttagend = re.compile(r""" <[a-zA-Z][-.a-zA-Z0-9:_]* # tag name - (?:\s+ # whitespace before attribute name - (?:(?<=['"\s])[^\s/>][^\s/=>]* # attribute name + (?:[\s/]* # optional whitespace before attribute name + (?:(?<=['"\s/])[^\s/>][^\s/=>]* # attribute name (?:\s*=+\s* # value indicator (?:'[^']*' # LITA-enclosed value |"[^"]*" # LIT-enclosed value |(?!['"])[^>\s]* # bare value ) - )?\s* + )?(?:\s|/(?!>))* )* )? \s* # trailing whitespace diff --git a/Lib/test/test_htmlparser.py b/Lib/test/test_htmlparser.py --- a/Lib/test/test_htmlparser.py +++ b/Lib/test/test_htmlparser.py @@ -240,6 +240,27 @@ self._run_check("" % dtd, [('decl', 'DOCTYPE ' + dtd)]) + def test_slashes_in_starttag(self): + self._run_check('', [('startendtag', 'a', [('foo', 'var')])]) + html = ('') + expected = [( + 'startendtag', 'img', + [('width', '902'), ('height', '250px'), + ('src', '/sites/default/files/images/homepage/foo.jpg'), + ('*what', None), ('am', None), ('i', None), + ('doing', None), ('here*', None)] + )] + self._run_check(html, expected) + html = ('' + '') + expected = [ + ('startendtag', 'a', [('foo', None), ('=', None), ('bar', None)]), + ('starttag', 'a', [('foo', None), ('=', None), ('bar', None)]) + ] + self._run_check(html, expected) + def test_declaration_junk_chars(self): self._run_check("", [('decl', 'DOCTYPE foo $ ')]) diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -98,6 +98,8 @@ 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. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Feb 21 08:29:23 2012 From: python-checkins at python.org (ezio.melotti) Date: Tue, 21 Feb 2012 08:29:23 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=283=2E2=29=3A_HTMLParser_is_n?= =?utf8?q?ow_able_to_handle_slashes_in_the_start_tag=2E?= Message-ID: http://hg.python.org/cpython/rev/2d16048b10cd changeset: 75117:2d16048b10cd branch: 3.2 parent: 75096:ee89a9eec88e user: Ezio Melotti date: Tue Feb 21 09:25:00 2012 +0200 summary: HTMLParser is now able to handle slashes in the start tag. files: Lib/html/parser.py | 18 +++++++++++------- Lib/test/test_htmlparser.py | 21 +++++++++++++++++++++ Misc/NEWS | 2 ++ 3 files changed, 34 insertions(+), 7 deletions(-) diff --git a/Lib/html/parser.py b/Lib/html/parser.py --- a/Lib/html/parser.py +++ b/Lib/html/parser.py @@ -26,14 +26,18 @@ # see http://www.w3.org/TR/html5/tokenization.html#tag-open-state # and http://www.w3.org/TR/html5/tokenization.html#tag-name-state tagfind_tolerant = re.compile('[a-zA-Z][^\t\n\r\f />\x00]*') -# Note, the strict one of this pair isn't really strict, but we can't -# make it correctly strict without breaking backward compatibility. +# Note: +# 1) the strict attrfind isn't really strict, but we can't make it +# correctly strict without breaking backward compatibility; +# 2) if you change attrfind remember to update locatestarttagend too; +# 3) if you change attrfind and/or locatestarttagend the parser will +# explode, so don't do it. attrfind = re.compile( r'\s*([a-zA-Z_][-.:a-zA-Z_0-9]*)(\s*=\s*' r'(\'[^\']*\'|"[^"]*"|[^\s"\'=<>`]*))?') attrfind_tolerant = re.compile( - r'\s*((?<=[\'"\s])[^\s/>][^\s/=>]*)(\s*=+\s*' - r'(\'[^\']*\'|"[^"]*"|(?![\'"])[^>\s]*))?') + r'[\s/]*((?<=[\'"\s/])[^\s/>][^\s/=>]*)(\s*=+\s*' + r'(\'[^\']*\'|"[^"]*"|(?![\'"])[^>\s]*))?(?:\s|/(?!>))*') locatestarttagend = re.compile(r""" <[a-zA-Z][-.a-zA-Z0-9:_]* # tag name (?:\s+ # whitespace before attribute name @@ -50,15 +54,15 @@ """, re.VERBOSE) locatestarttagend_tolerant = re.compile(r""" <[a-zA-Z][-.a-zA-Z0-9:_]* # tag name - (?:\s* # optional whitespace before attribute name - (?:(?<=['"\s])[^\s/>][^\s/=>]* # attribute name + (?:[\s/]* # optional whitespace before attribute name + (?:(?<=['"\s/])[^\s/>][^\s/=>]* # attribute name (?:\s*=+\s* # value indicator (?:'[^']*' # LITA-enclosed value |"[^"]*" # LIT-enclosed value |(?!['"])[^>\s]* # bare value ) (?:\s*,)* # possibly followed by a comma - )?\s* + )?(?:\s|/(?!>))* )* )? \s* # trailing whitespace diff --git a/Lib/test/test_htmlparser.py b/Lib/test/test_htmlparser.py --- a/Lib/test/test_htmlparser.py +++ b/Lib/test/test_htmlparser.py @@ -389,6 +389,27 @@ self._run_check("', [('startendtag', 'a', [('foo', 'var')])]) + html = ('') + expected = [( + 'startendtag', 'img', + [('width', '902'), ('height', '250px'), + ('src', '/sites/default/files/images/homepage/foo.jpg'), + ('*what', None), ('am', None), ('i', None), + ('doing', None), ('here*', None)] + )] + self._run_check(html, expected) + html = ('' + '') + expected = [ + ('startendtag', 'a', [('foo', None), ('=', None), ('bar', None)]), + ('starttag', 'a', [('foo', None), ('=', None), ('bar', None)]) + ] + self._run_check(html, expected) + def test_declaration_junk_chars(self): self._run_check("", [('decl', 'DOCTYPE foo $ ')]) diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -121,6 +121,8 @@ 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. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Feb 21 08:29:24 2012 From: python-checkins at python.org (ezio.melotti) Date: Tue, 21 Feb 2012 08:29:24 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_3=2E2_-=3E_default=29?= =?utf8?q?=3A_Merge_the_HTMLParser_fix_with_3=2E2=2E?= Message-ID: http://hg.python.org/cpython/rev/3a701916ba8a changeset: 75118:3a701916ba8a parent: 75110:e51951b4fcc3 parent: 75117:2d16048b10cd user: Ezio Melotti date: Tue Feb 21 09:29:10 2012 +0200 summary: Merge the HTMLParser fix with 3.2. files: Lib/html/parser.py | 18 +++++++++++------- Lib/test/test_htmlparser.py | 21 +++++++++++++++++++++ Misc/NEWS | 2 ++ 3 files changed, 34 insertions(+), 7 deletions(-) diff --git a/Lib/html/parser.py b/Lib/html/parser.py --- a/Lib/html/parser.py +++ b/Lib/html/parser.py @@ -26,14 +26,18 @@ # see http://www.w3.org/TR/html5/tokenization.html#tag-open-state # and http://www.w3.org/TR/html5/tokenization.html#tag-name-state tagfind_tolerant = re.compile('[a-zA-Z][^\t\n\r\f />\x00]*') -# Note, the strict one of this pair isn't really strict, but we can't -# make it correctly strict without breaking backward compatibility. +# Note: +# 1) the strict attrfind isn't really strict, but we can't make it +# correctly strict without breaking backward compatibility; +# 2) if you change attrfind remember to update locatestarttagend too; +# 3) if you change attrfind and/or locatestarttagend the parser will +# explode, so don't do it. attrfind = re.compile( r'\s*([a-zA-Z_][-.:a-zA-Z_0-9]*)(\s*=\s*' r'(\'[^\']*\'|"[^"]*"|[^\s"\'=<>`]*))?') attrfind_tolerant = re.compile( - r'\s*((?<=[\'"\s])[^\s/>][^\s/=>]*)(\s*=+\s*' - r'(\'[^\']*\'|"[^"]*"|(?![\'"])[^>\s]*))?') + r'[\s/]*((?<=[\'"\s/])[^\s/>][^\s/=>]*)(\s*=+\s*' + r'(\'[^\']*\'|"[^"]*"|(?![\'"])[^>\s]*))?(?:\s|/(?!>))*') locatestarttagend = re.compile(r""" <[a-zA-Z][-.a-zA-Z0-9:_]* # tag name (?:\s+ # whitespace before attribute name @@ -50,15 +54,15 @@ """, re.VERBOSE) locatestarttagend_tolerant = re.compile(r""" <[a-zA-Z][-.a-zA-Z0-9:_]* # tag name - (?:\s* # optional whitespace before attribute name - (?:(?<=['"\s])[^\s/>][^\s/=>]* # attribute name + (?:[\s/]* # optional whitespace before attribute name + (?:(?<=['"\s/])[^\s/>][^\s/=>]* # attribute name (?:\s*=+\s* # value indicator (?:'[^']*' # LITA-enclosed value |"[^"]*" # LIT-enclosed value |(?!['"])[^>\s]* # bare value ) (?:\s*,)* # possibly followed by a comma - )?\s* + )?(?:\s|/(?!>))* )* )? \s* # trailing whitespace diff --git a/Lib/test/test_htmlparser.py b/Lib/test/test_htmlparser.py --- a/Lib/test/test_htmlparser.py +++ b/Lib/test/test_htmlparser.py @@ -389,6 +389,27 @@ self._run_check("', [('startendtag', 'a', [('foo', 'var')])]) + html = ('') + expected = [( + 'startendtag', 'img', + [('width', '902'), ('height', '250px'), + ('src', '/sites/default/files/images/homepage/foo.jpg'), + ('*what', None), ('am', None), ('i', None), + ('doing', None), ('here*', None)] + )] + self._run_check(html, expected) + html = ('' + '') + expected = [ + ('startendtag', 'a', [('foo', None), ('=', None), ('bar', None)]), + ('starttag', 'a', [('foo', None), ('=', None), ('bar', None)]) + ] + self._run_check(html, expected) + def test_declaration_junk_chars(self): self._run_check("", [('decl', 'DOCTYPE foo $ ')]) diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -479,6 +479,8 @@ Library ------- +- HTMLParser is now able to handle slashes in the start tag. + - Issue #13641: Decoding functions in the base64 module now accept ASCII-only unicode strings. Patch by Catalin Iacob. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Feb 21 13:11:45 2012 From: python-checkins at python.org (petri.lehtinen) Date: Tue, 21 Feb 2012 13:11:45 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=283=2E2=29=3A_sqlite3=3A_Fix_?= =?utf8?q?64-bit_integer_handling_in_user_functions_on_32-bit_architecture?= =?utf8?q?s?= Message-ID: http://hg.python.org/cpython/rev/e67715b87131 changeset: 75119:e67715b87131 branch: 3.2 parent: 75117:2d16048b10cd user: Petri Lehtinen date: Sun Feb 19 21:38:00 2012 +0200 summary: sqlite3: Fix 64-bit integer handling in user functions on 32-bit architectures Closes #8033. files: Lib/sqlite3/test/userfunctions.py | 18 ++++++++++++++++++ Misc/ACKS | 1 + Misc/NEWS | 3 +++ Modules/_sqlite/connection.c | 8 ++------ 4 files changed, 24 insertions(+), 6 deletions(-) diff --git a/Lib/sqlite3/test/userfunctions.py b/Lib/sqlite3/test/userfunctions.py --- a/Lib/sqlite3/test/userfunctions.py +++ b/Lib/sqlite3/test/userfunctions.py @@ -37,6 +37,8 @@ return None def func_returnblob(): return b"blob" +def func_returnlonglong(): + return 1<<31 def func_raiseexception(): 5/0 @@ -50,6 +52,8 @@ return type(v) is type(None) def func_isblob(v): return isinstance(v, (bytes, memoryview)) +def func_islonglong(v): + return isinstance(v, int) and v >= 1<<31 class AggrNoStep: def __init__(self): @@ -127,6 +131,7 @@ self.con.create_function("returnfloat", 0, func_returnfloat) self.con.create_function("returnnull", 0, func_returnnull) self.con.create_function("returnblob", 0, func_returnblob) + self.con.create_function("returnlonglong", 0, func_returnlonglong) self.con.create_function("raiseexception", 0, func_raiseexception) self.con.create_function("isstring", 1, func_isstring) @@ -134,6 +139,7 @@ self.con.create_function("isfloat", 1, func_isfloat) self.con.create_function("isnone", 1, func_isnone) self.con.create_function("isblob", 1, func_isblob) + self.con.create_function("islonglong", 1, func_islonglong) def tearDown(self): self.con.close() @@ -200,6 +206,12 @@ self.assertEqual(type(val), bytes) self.assertEqual(val, b"blob") + def CheckFuncReturnLongLong(self): + cur = self.con.cursor() + cur.execute("select returnlonglong()") + val = cur.fetchone()[0] + self.assertEqual(val, 1<<31) + def CheckFuncException(self): cur = self.con.cursor() try: @@ -239,6 +251,12 @@ val = cur.fetchone()[0] self.assertEqual(val, 1) + def CheckParamLongLong(self): + cur = self.con.cursor() + cur.execute("select islonglong(?)", (1<<42,)) + val = cur.fetchone()[0] + self.assertEqual(val, 1) + class AggregateTests(unittest.TestCase): def setUp(self): self.con = sqlite.connect(":memory:") diff --git a/Misc/ACKS b/Misc/ACKS --- a/Misc/ACKS +++ b/Misc/ACKS @@ -222,6 +222,7 @@ Erik Demaine John Dennis Roger Dev +Philippe Devalkeneer Raghuram Devarakonda Caleb Deveraux Catherine Devlin diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -121,6 +121,9 @@ Library ------- +- Issue #8033: sqlite3: Fix 64-bit integer handling in user functions + on 32-bit architectures. Initial patch by Philippe Devalkeneer. + - HTMLParser is now able to handle slashes in the start tag. - Issue #14001: CVE-2012-0845: xmlrpc: Fix an endless loop in diff --git a/Modules/_sqlite/connection.c b/Modules/_sqlite/connection.c --- a/Modules/_sqlite/connection.c +++ b/Modules/_sqlite/connection.c @@ -484,7 +484,6 @@ void _pysqlite_set_result(sqlite3_context* context, PyObject* py_val) { - long longval; const char* buffer; Py_ssize_t buflen; @@ -493,8 +492,7 @@ } else if (py_val == Py_None) { sqlite3_result_null(context); } else if (PyLong_Check(py_val)) { - longval = PyLong_AsLong(py_val); - sqlite3_result_int64(context, (PY_LONG_LONG)longval); + sqlite3_result_int64(context, PyLong_AsLongLong(py_val)); } else if (PyFloat_Check(py_val)) { sqlite3_result_double(context, PyFloat_AsDouble(py_val)); } else if (PyUnicode_Check(py_val)) { @@ -519,7 +517,6 @@ sqlite3_value* cur_value; PyObject* cur_py_value; const char* val_str; - PY_LONG_LONG val_int; Py_ssize_t buflen; args = PyTuple_New(argc); @@ -531,8 +528,7 @@ cur_value = argv[i]; switch (sqlite3_value_type(argv[i])) { case SQLITE_INTEGER: - val_int = sqlite3_value_int64(cur_value); - cur_py_value = PyLong_FromLong((long)val_int); + cur_py_value = PyLong_FromLongLong(sqlite3_value_int64(cur_value)); break; case SQLITE_FLOAT: cur_py_value = PyFloat_FromDouble(sqlite3_value_double(cur_value)); -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Feb 21 13:11:45 2012 From: python-checkins at python.org (petri.lehtinen) Date: Tue, 21 Feb 2012 13:11:45 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_3=2E2_-=3E_default=29?= =?utf8?q?=3A_Merge_branch_=273=2E2=27?= Message-ID: http://hg.python.org/cpython/rev/cf12fe9ce2b0 changeset: 75120:cf12fe9ce2b0 parent: 75118:3a701916ba8a parent: 75119:e67715b87131 user: Petri Lehtinen date: Tue Feb 21 13:59:34 2012 +0200 summary: Merge branch '3.2' Closes #8033. files: Lib/sqlite3/test/userfunctions.py | 18 ++++++++++++++++++ Misc/ACKS | 1 + Misc/NEWS | 3 +++ Modules/_sqlite/connection.c | 8 ++------ 4 files changed, 24 insertions(+), 6 deletions(-) diff --git a/Lib/sqlite3/test/userfunctions.py b/Lib/sqlite3/test/userfunctions.py --- a/Lib/sqlite3/test/userfunctions.py +++ b/Lib/sqlite3/test/userfunctions.py @@ -37,6 +37,8 @@ return None def func_returnblob(): return b"blob" +def func_returnlonglong(): + return 1<<31 def func_raiseexception(): 5/0 @@ -50,6 +52,8 @@ return type(v) is type(None) def func_isblob(v): return isinstance(v, (bytes, memoryview)) +def func_islonglong(v): + return isinstance(v, int) and v >= 1<<31 class AggrNoStep: def __init__(self): @@ -127,6 +131,7 @@ self.con.create_function("returnfloat", 0, func_returnfloat) self.con.create_function("returnnull", 0, func_returnnull) self.con.create_function("returnblob", 0, func_returnblob) + self.con.create_function("returnlonglong", 0, func_returnlonglong) self.con.create_function("raiseexception", 0, func_raiseexception) self.con.create_function("isstring", 1, func_isstring) @@ -134,6 +139,7 @@ self.con.create_function("isfloat", 1, func_isfloat) self.con.create_function("isnone", 1, func_isnone) self.con.create_function("isblob", 1, func_isblob) + self.con.create_function("islonglong", 1, func_islonglong) def tearDown(self): self.con.close() @@ -200,6 +206,12 @@ self.assertEqual(type(val), bytes) self.assertEqual(val, b"blob") + def CheckFuncReturnLongLong(self): + cur = self.con.cursor() + cur.execute("select returnlonglong()") + val = cur.fetchone()[0] + self.assertEqual(val, 1<<31) + def CheckFuncException(self): cur = self.con.cursor() try: @@ -239,6 +251,12 @@ val = cur.fetchone()[0] self.assertEqual(val, 1) + def CheckParamLongLong(self): + cur = self.con.cursor() + cur.execute("select islonglong(?)", (1<<42,)) + val = cur.fetchone()[0] + self.assertEqual(val, 1) + class AggregateTests(unittest.TestCase): def setUp(self): self.con = sqlite.connect(":memory:") diff --git a/Misc/ACKS b/Misc/ACKS --- a/Misc/ACKS +++ b/Misc/ACKS @@ -242,6 +242,7 @@ Erik Demaine John Dennis Roger Dev +Philippe Devalkeneer Raghuram Devarakonda Caleb Deveraux Catherine Devlin diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -479,6 +479,9 @@ Library ------- +- Issue #8033: sqlite3: Fix 64-bit integer handling in user functions + on 32-bit architectures. Initial patch by Philippe Devalkeneer. + - HTMLParser is now able to handle slashes in the start tag. - Issue #13641: Decoding functions in the base64 module now accept ASCII-only diff --git a/Modules/_sqlite/connection.c b/Modules/_sqlite/connection.c --- a/Modules/_sqlite/connection.c +++ b/Modules/_sqlite/connection.c @@ -484,7 +484,6 @@ void _pysqlite_set_result(sqlite3_context* context, PyObject* py_val) { - long longval; const char* buffer; Py_ssize_t buflen; @@ -493,8 +492,7 @@ } else if (py_val == Py_None) { sqlite3_result_null(context); } else if (PyLong_Check(py_val)) { - longval = PyLong_AsLong(py_val); - sqlite3_result_int64(context, (PY_LONG_LONG)longval); + sqlite3_result_int64(context, PyLong_AsLongLong(py_val)); } else if (PyFloat_Check(py_val)) { sqlite3_result_double(context, PyFloat_AsDouble(py_val)); } else if (PyUnicode_Check(py_val)) { @@ -519,7 +517,6 @@ sqlite3_value* cur_value; PyObject* cur_py_value; const char* val_str; - PY_LONG_LONG val_int; Py_ssize_t buflen; args = PyTuple_New(argc); @@ -531,8 +528,7 @@ cur_value = argv[i]; switch (sqlite3_value_type(argv[i])) { case SQLITE_INTEGER: - val_int = sqlite3_value_int64(cur_value); - cur_py_value = PyLong_FromLong((long)val_int); + cur_py_value = PyLong_FromLongLong(sqlite3_value_int64(cur_value)); break; case SQLITE_FLOAT: cur_py_value = PyFloat_FromDouble(sqlite3_value_double(cur_value)); -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Feb 21 13:11:46 2012 From: python-checkins at python.org (petri.lehtinen) Date: Tue, 21 Feb 2012 13:11:46 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=282=2E7=29=3A_sqlite3=3A_Fix_?= =?utf8?q?64-bit_integer_handling_in_user_functions_on_32-bit_architecture?= =?utf8?q?s?= Message-ID: http://hg.python.org/cpython/rev/789a3ea97083 changeset: 75121:789a3ea97083 branch: 2.7 parent: 75116:37c824c3efe8 user: Petri Lehtinen date: Tue Feb 21 13:58:40 2012 +0200 summary: sqlite3: Fix 64-bit integer handling in user functions on 32-bit architectures Closes #8033. files: Lib/sqlite3/test/userfunctions.py | 18 ++++++++++++++++++ Misc/ACKS | 1 + Misc/NEWS | 3 +++ Modules/_sqlite/connection.c | 13 ++++++++----- 4 files changed, 30 insertions(+), 5 deletions(-) diff --git a/Lib/sqlite3/test/userfunctions.py b/Lib/sqlite3/test/userfunctions.py --- a/Lib/sqlite3/test/userfunctions.py +++ b/Lib/sqlite3/test/userfunctions.py @@ -37,6 +37,8 @@ return None def func_returnblob(): return buffer("blob") +def func_returnlonglong(): + return 1<<31 def func_raiseexception(): 5 // 0 @@ -50,6 +52,8 @@ return type(v) is type(None) def func_isblob(v): return type(v) is buffer +def func_islonglong(v): + return isinstance(v, (int, long)) and v >= 1<<31 class AggrNoStep: def __init__(self): @@ -126,6 +130,7 @@ self.con.create_function("returnfloat", 0, func_returnfloat) self.con.create_function("returnnull", 0, func_returnnull) self.con.create_function("returnblob", 0, func_returnblob) + self.con.create_function("returnlonglong", 0, func_returnlonglong) self.con.create_function("raiseexception", 0, func_raiseexception) self.con.create_function("isstring", 1, func_isstring) @@ -133,6 +138,7 @@ self.con.create_function("isfloat", 1, func_isfloat) self.con.create_function("isnone", 1, func_isnone) self.con.create_function("isblob", 1, func_isblob) + self.con.create_function("islonglong", 1, func_islonglong) def tearDown(self): self.con.close() @@ -199,6 +205,12 @@ self.assertEqual(type(val), buffer) self.assertEqual(val, buffer("blob")) + def CheckFuncReturnLongLong(self): + cur = self.con.cursor() + cur.execute("select returnlonglong()") + val = cur.fetchone()[0] + self.assertEqual(val, 1<<31) + def CheckFuncException(self): cur = self.con.cursor() try: @@ -238,6 +250,12 @@ val = cur.fetchone()[0] self.assertEqual(val, 1) + def CheckParamLongLong(self): + cur = self.con.cursor() + cur.execute("select islonglong(?)", (1<<42,)) + val = cur.fetchone()[0] + self.assertEqual(val, 1) + class AggregateTests(unittest.TestCase): def setUp(self): self.con = sqlite.connect(":memory:") diff --git a/Misc/ACKS b/Misc/ACKS --- a/Misc/ACKS +++ b/Misc/ACKS @@ -198,6 +198,7 @@ Erik Demaine John Dennis Roger Dev +Philippe Devalkeneer Raghuram Devarakonda Catherine Devlin Scott Dial diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -98,6 +98,9 @@ Library ------- +- Issue #8033: sqlite3: Fix 64-bit integer handling in user functions + on 32-bit architectures. Initial patch by Philippe Devalkeneer. + - HTMLParser is now able to handle slashes in the start tag. - Issue #14001: CVE-2012-0845: xmlrpc: Fix an endless loop in diff --git a/Modules/_sqlite/connection.c b/Modules/_sqlite/connection.c --- a/Modules/_sqlite/connection.c +++ b/Modules/_sqlite/connection.c @@ -540,7 +540,6 @@ void _pysqlite_set_result(sqlite3_context* context, PyObject* py_val) { - long longval; const char* buffer; Py_ssize_t buflen; PyObject* stringval; @@ -550,8 +549,9 @@ } else if (py_val == Py_None) { sqlite3_result_null(context); } else if (PyInt_Check(py_val)) { - longval = PyInt_AsLong(py_val); - sqlite3_result_int64(context, (PY_LONG_LONG)longval); + sqlite3_result_int64(context, (sqlite3_int64)PyInt_AsLong(py_val)); + } else if (PyLong_Check(py_val)) { + sqlite3_result_int64(context, PyLong_AsLongLong(py_val)); } else if (PyFloat_Check(py_val)) { sqlite3_result_double(context, PyFloat_AsDouble(py_val)); } else if (PyBuffer_Check(py_val)) { @@ -580,7 +580,7 @@ sqlite3_value* cur_value; PyObject* cur_py_value; const char* val_str; - PY_LONG_LONG val_int; + sqlite3_int64 val_int; Py_ssize_t buflen; void* raw_buffer; @@ -594,7 +594,10 @@ switch (sqlite3_value_type(argv[i])) { case SQLITE_INTEGER: val_int = sqlite3_value_int64(cur_value); - cur_py_value = PyInt_FromLong((long)val_int); + if(val_int < LONG_MIN || val_int > LONG_MAX) + cur_py_value = PyLong_FromLongLong(val_int); + else + cur_py_value = PyInt_FromLong((long)val_int); break; case SQLITE_FLOAT: cur_py_value = PyFloat_FromDouble(sqlite3_value_double(cur_value)); -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Feb 21 14:08:35 2012 From: python-checkins at python.org (benjamin.peterson) Date: Tue, 21 Feb 2012 14:08:35 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=282=2E7=29=3A_remove_extra_ze?= =?utf8?q?ro?= Message-ID: http://hg.python.org/cpython/rev/32c8af00eef2 changeset: 75122:32c8af00eef2 branch: 2.7 user: Benjamin Peterson date: Tue Feb 21 08:08:29 2012 -0500 summary: remove extra zero files: Lib/re.py | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Lib/re.py b/Lib/re.py --- a/Lib/re.py +++ b/Lib/re.py @@ -199,7 +199,7 @@ return _compile(pattern, flags|T) _alphanum = frozenset( - "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890") + "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789") def escape(pattern): "Escape all non-alphanumeric characters in pattern." -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Feb 21 15:07:47 2012 From: python-checkins at python.org (benjamin.peterson) Date: Tue, 21 Feb 2012 15:07:47 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=282=2E7=29=3A_carefully_don?= =?utf8?q?=27t_depend_on_any_dict_order?= Message-ID: http://hg.python.org/cpython/rev/51c417a7e8f8 changeset: 75123:51c417a7e8f8 branch: 2.7 user: Benjamin Peterson date: Tue Feb 21 09:07:40 2012 -0500 summary: carefully don't depend on any dict order files: Lib/test/test_gdb.py | 20 ++++++++++++++++---- 1 files changed, 16 insertions(+), 4 deletions(-) diff --git a/Lib/test/test_gdb.py b/Lib/test/test_gdb.py --- a/Lib/test/test_gdb.py +++ b/Lib/test/test_gdb.py @@ -265,8 +265,14 @@ def test_sets(self): 'Verify the pretty-printing of sets' self.assertGdbRepr(set()) - self.assertGdbRepr(set(['a', 'b'])) - self.assertGdbRepr(set([4, 5, 6])) + rep = self.get_gdb_repr("print set(['a', 'b'])")[0] + self.assertTrue(rep.startswith("set([")) + self.assertTrue(rep.endswith("])")) + self.assertEqual(eval(rep), {'a', 'b'}) + rep = self.get_gdb_repr("print set([4, 5])")[0] + self.assertTrue(rep.startswith("set([")) + self.assertTrue(rep.endswith("])")) + self.assertEqual(eval(rep), {4, 5}) # Ensure that we handled sets containing the "dummy" key value, # which happens on deletion: @@ -278,8 +284,14 @@ def test_frozensets(self): 'Verify the pretty-printing of frozensets' self.assertGdbRepr(frozenset()) - self.assertGdbRepr("frozenset(['a', 'b'])") - self.assertGdbRepr("frozenset([4, 5, 6])") + rep = self.get_gdb_repr("print frozenset(['a', 'b'])")[0] + self.assertTrue(rep.startswith("frozenset([")) + self.assertTrue(rep.endswith("])")) + self.assertEqual(eval(rep), {'a', 'b'}) + rep = self.get_gdb_repr("print frozenset([4, 5])")[0] + self.assertTrue(rep.startswith("frozenset([")) + self.assertTrue(rep.endswith("])")) + self.assertEqual(eval(rep), {4, 5}) def test_exceptions(self): # Test a RuntimeError -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Feb 21 16:03:21 2012 From: python-checkins at python.org (nick.coghlan) Date: Tue, 21 Feb 2012 16:03:21 +0100 Subject: [Python-checkins] =?utf8?q?peps=3A_PEP_3150=3A_Withdraw_this_for_?= =?utf8?q?the_last_time=2E_It=27s_a_bad_idea?= Message-ID: http://hg.python.org/peps/rev/bdc181755fb3 changeset: 4067:bdc181755fb3 user: Nick Coghlan date: Wed Feb 22 01:00:58 2012 +1000 summary: PEP 3150: Withdraw this for the last time. It's a bad idea files: pep-3150.txt | 50 ++++++++++----------------------------- 1 files changed, 13 insertions(+), 37 deletions(-) diff --git a/pep-3150.txt b/pep-3150.txt --- a/pep-3150.txt +++ b/pep-3150.txt @@ -3,7 +3,7 @@ Version: $Revision$ Last-Modified: $Date$ Author: Nick Coghlan -Status: Deferred +Status: Withdrawal Type: Standards Track Content-Type: text/x-rst Created: 2010-07-09 @@ -47,45 +47,21 @@ but has not yet itself been subject to the test of implementation. -PEP Deferral -============ +PEP Withdrawal +============== -Despite the lifting of the language moratorium (PEP 3003) for Python 3.3, -this PEP currently remains in a Deferred state. This idea, if implemented, -will potentially have a deep and pervasive effect on the way people write -Python code. +I've had a complicated history with this PEP. For a long time I left it in +the Deferred state because I wasn't convinced the additional complexity was +worth the payoff. Then, briefly, I became more enamoured of the idea and +only left it at Deferred because I didn't really have time to pursue it. -When this PEP was first put forward, even I, as the PEP author, was not -convinced it was a good idea. Instead, I was simply writing it as a way to -avoid endlessly rehashing similar topics on python-ideas. When someone -broached the subject, they could be pointed at this PEP and told "Come back -when you've read and understood the arguments presented there". Subsequent -discussions (most notably, those surrounding PEP 403's attempt at a more -restricted version of the idea) have convinced me that the idea is valuable -and will help address a number of situations where developers feel that -Python "gets in the way" instead of "matching the way they think". For me, -it is this aspect of "let people express what they're thinking, rather than -forcing them to think differently due to Python's limitations" that finally -allowed the idea to clear the "status quo wins a stalemate" bar ([5]_). +I'm now withdrawing it, as, the longer I reflect on the topic, the more I +feel this approach is simply far too intrusive and complicated to ever be +a good idea for Python as a language. -However, while I now think the idea is worthwhile, I don't think there is -sufficient time left in the 3.3 release cycle for the idea to mature. A -reference implementation is needed, and people need time to experiment with -that implementation and offer feedback on whether or not it helps with -programming paradigms that are currently somewhat clumsy in Python (like -callback programming). Even if a PEP co-author volunteered immediately to -work on the implementation and incorporate feedback into the PEP text, I feel -targetting 3.3 would be unnecessarily rushing things. So, I've marked this -PEP as a candidate for 3.4 rather than 3.3. - -Once that process is complete, Guido van Rossum (or his delegate) will need -to be sufficiently convinced of the idea's merit and accept the PEP. Such -acceptance will require not only a fully functional reference implementation -for CPython (as already mentioned), but also indications from the other three -major Python implementations (PyPy, Jython, IronPython) that they consider -it feasible to implement the proposed semantics once they reach the point of -targetting 3.4 compatibility. Input from related projects with a vested -interest in Python's syntax (e.g. Cython) will also be valuable. +I've also finally found a couple of syntax proposals for PEP 403 that +read quite nicely and address the same set of use cases as this PEP +while remaining significantly simpler. Proposal -- Repository URL: http://hg.python.org/peps From python-checkins at python.org Tue Feb 21 16:03:22 2012 From: python-checkins at python.org (nick.coghlan) Date: Tue, 21 Feb 2012 16:03:22 +0100 Subject: [Python-checkins] =?utf8?q?peps=3A_PEP_403=3A_Move_this_back_to_D?= =?utf8?q?eferred_status=2E_I_found_a_couple_of_syntax?= Message-ID: http://hg.python.org/peps/rev/728eb73e382d changeset: 4068:728eb73e382d user: Nick Coghlan date: Wed Feb 22 01:02:52 2012 +1000 summary: PEP 403: Move this back to Deferred status. I found a couple of syntax possibilities that aren't ugly as sin like the previous version files: pep-0403.txt | 221 ++++++++++++++++++++++---------------- 1 files changed, 130 insertions(+), 91 deletions(-) diff --git a/pep-0403.txt b/pep-0403.txt --- a/pep-0403.txt +++ b/pep-0403.txt @@ -1,9 +1,9 @@ PEP: 403 -Title: Prefix syntax for post function definition operations +Title: Forward references to anonymous functions and classes Version: $Revision$ Last-Modified: $Date$ Author: Nick Coghlan -Status: Withdrawn +Status: Deferred Type: Standards Track Content-Type: text/x-rst Created: 2011-10-13 @@ -15,33 +15,19 @@ Abstract ======== -This PEP proposes the addition of ``postdef`` as a new function prefix -syntax (analogous to decorators) that permits the execution of a single simple -statement (potentially including substatements separated by semi-colons) after +This PEP proposes the addition of a new ``in`` statement that allows the use +of the Ellipsis literal (``...``) to make a forward reference to a trailing +anonymous function definition. -In addition, the new syntax would allow the 'def' keyword to be used to refer -to the function being defined without needing to repeat the name. - -When the 'postdef' prefix syntax is used, the associated statement would be -executed *in addition to* the normal local name binding implicit in function -definitions. Any name collision are expected to be minor, analagous to those -encountered with ``for`` loop iteration variables. +This new statement is designed to be used whenever a "one-shot" function is +needed, and the meaning of the function is conveyed clearly by the context +and assigning a name can actually reduce clarity rather than increasing it. This PEP is based heavily on many of the ideas in PEP 3150 (Statement Local Namespaces) so some elements of the rationale will be familiar to readers of that PEP. That PEP has now been withdrawn in favour of this one. -PEP Withdrawal -============== - -The python-ideas thread discussing this PEP [1]_ persuaded me that it was -essentially am unnecessarily cryptic, wholly inferior version of PEP 3150's -statement local namespaces. The discussion also resolved some of my concerns -with PEP 3150, so I am withdrawing this more limited version of the idea in -favour of resurrecting the original concept. - - Basic Examples ============== @@ -51,8 +37,8 @@ As a trivial example, weakref callbacks could be defined as follows:: - postdef x = weakref.ref(target, def) - def report_destruction(obj): + in x = weakref.ref(target, ...) + def ...(obj): print("{} is being destroyed".format(obj)) This contrasts with the current repetitive "out of order" syntax for this @@ -69,8 +55,8 @@ Similarly, a sorted operation on a particularly poorly defined type could now be defined as:: - postdef sorted_list = sorted(original, key=def) - def force_sort(item): + in sorted_list = sorted(original, key=...) + def ...(item): try: return item.calc_sort_order() except NotSortableError: @@ -88,32 +74,40 @@ And early binding semantics in a list comprehension could be attained via:: - postdef funcs = [def(i) for i in range(10)] - def make_incrementor(i): - postdef return def - def incrementor(x): - return x + i + in funcs = [...(i) for i in range(10)] + def ...(i): + return lambda x: x + i Proposal ======== -This PEP proposes the addition of an optional block prefix clause to the -syntax for function and class definitions. +This PEP proposes the addition of a new ``in`` statement that is a variant +of the existing class and function definition syntax. -This block prefix would be introduced by a leading ``postdef`` and would be -allowed to contain any simple statement (including those that don't -make any sense in that context - while such code would be legal, +The new ``in`` clause replaces the decorator lines, and allows forward +references to the trailing function or class definition with the ``...`` +literal syntax. + +The trailing function or class definition is always anonymous - the provide +a visual link with the forward reference, the ``...`` literal is always +given as the "name" of the class or function. + +The ``in`` clause is allowed to contain any simple statement (including those +that don't make any sense in that context - while such code would be legal, there wouldn't be any point in writing it). This permissive structure is easier to define and easier to explain, but a more restrictive approach that only permits operations that "make sense" would also be possible (see PEP 3150 for a list of possible candidates) -The function definition keyword ``def`` would be repurposed inside the block prefix -to refer to the function being defined. +The Ellipsis literal ``...`` would be repurposed inside the ``in`` clause +to refer to the anonymous function or class being defined. The Ellipsis +builtin itself can still be accessed by name from an ``in`` clause if +necessary. -When a block prefix is provided, the standard local name binding implicit -in the function definition still takes place. +As functions or classes defined for an ``in`` statement are always +anonymous, local name binding takes place only if the ``in`` clause +includes an assignment. Background @@ -166,8 +160,8 @@ This PEP also achieves most of the other effects described in PEP 3150 without introducing a new brainbending kind of scope. All of the complex -scoping rules in PEP 3150 are replaced in this PEP with the simple ``def`` -reference to the associated function definition. +scoping rules in PEP 3150 are replaced in this PEP with a simple forward +reference to the associated function or class definition. Keyword Choice @@ -178,51 +172,49 @@ It also needs to be clearly highlighted to readers, since it declares that the following piece of code is going to be executed out of order. -The 'postdef' keyword was chosen as a literal explanation of exactly what -the new clause does: execute the specified statement *after* the associated -function definition, even though it is physically written *before* the -definition in the source code. +The ``in`` keyword was chosen as an existing keyword that can be used to +denote the concept of a forward reference. +For functions, the construct is intended to be read as "in define "..." as this function". -Requirement to Name Functions -============================= +The mapping to English prose isn't as clean for the class definition case, +but the concept remains the same. + + +Better Debugging Support for Anonymous Functions and Classes +============================================================ One of the objections to widespread use of lambda expressions is that they -have an atrocious effect on traceback intelligibility and other aspects of -introspection. Accordingly, this PEP requires that even throwaway functions -be given some kind of name. +have a negative effect on traceback intelligibility and other aspects of +introspection. -To help encourage the use of meaningful names without users having to repeat -themselves, the PEP suggests the provision of the ``def`` shorthand reference -to the current function from the ``postdef`` clause. +However, the introduction of qualified names in PEP 3155 means that +anonymous functions in different scopes will now have different +representations. For example:: + >>> def f(): + ... return lambda: y + ... + >>> f() + . at 0x7f6f46faeae0> + +Anonymous function within the *same* scope will still share representations +(aside from the object ID), but this is still a major improvement over the +historical situation where everything *except* the object ID was identical. + +The anonymous functions and classes created by the new statement will use +the metaname ````. Syntax Change ============= -Current:: - - atom: ('(' [yield_expr|testlist_comp] ')' | - '[' [testlist_comp] ']' | - '{' [dictorsetmaker] '}' | - NAME | NUMBER | STRING+ | '...' | 'None' | 'True' | 'False') - -Changed:: - - atom: ('(' [yield_expr|testlist_comp] ')' | - '[' [testlist_comp] ']' | - '{' [dictorsetmaker] '}' | - NAME | NUMBER | STRING+ | '...' | 'None' | 'True' | 'False' | 'def') - New:: - blockprefix: 'postdef' simple_stmt - block: blockprefix funcdef - -The above is the general idea, but I suspect that the change to the 'atom' -definition may cause an ambiguity problem in the parser when it comes to -detecting function definitions. So the actual implementation may need to be -more complex than that. + in_stmt: in_prefix (in_classdef|in_funcdef) + in_prefix: 'in' simple_stmt + in_funcdef: 'def' '...' parameters ['->' test] ':' suite + in_classdef: 'class' '...' ['(' [arglist] ')'] ':' suite Grammar: http://hg.python.org/cpython/file/default/Grammar/Grammar @@ -230,14 +222,17 @@ Possible Implementation Strategy ================================ -This proposal has one titanic advantage over PEP 3150: implementation -should be relatively straightforward. +This proposal has at least one titanic advantage over PEP 3150: +implementation should be relatively straightforward. -The post definition statement can be incorporated into the AST for the -function node and simply visited out of sequence. +The AST for the ``in`` statement will include both the function or class +definition and the statement that references it, so it should just be a +matter of emitting the two operations out of order and using a hidden +variable to link up any references. -The one potentially tricky part is working out how to allow the dual -use of 'def' without rewriting half the grammar definition. +The one potentially tricky part is changing the meaning of the Ellipsis +literal notation while within the scope of the ``in`` clause, but that +shouldn't be too hard to address within the compiler. More Examples @@ -253,8 +248,8 @@ del _createenviron # Becomes: - postdef environ = def() - def _createenviron(): + in environ = ...() + def ...(): ... # 27 line function Loop early binding:: @@ -263,17 +258,56 @@ funcs = [(lambda x, i=i: x + i) for i in range(10)] # Becomes: - postdef funcs = [def(i) for i in range(10)] - def make_incrementor(i): + in funcs = [...(i) for i in range(10)] + def ...(i): return lambda x: x + i # Or even: - postdef funcs = [def(i) for i in range(10)] - def make_incrementor(i): - postdef return def - def incrementor(x): + in funcs = [...(i) for i in range(10)] + def ...(i): + in return ... + def ...(x): return x + i +Statement local namespace: + + # OK, this definitely looks weird and needs further thought... + in c = math.sqrt(....a*....a + ....b*....b) + class ...: + a = calculate_a() + b = calculate_b() + + +Alternative Idea +================ + +As the statement local namespace example shows, using ```...`` for the +forward reference doesn't play nicely with attribute references on the +anonymous object. The doubly nested example also shows that overuse can +lead to readability disappearing in a mass of dots. + +An alternative approach would be to use a similar hidden variable +implementation strategy to implement a *single* statement local variable +for use as the forward reference. Getting the scoping right could be +challenging, but it should still be feasible. + +Then the two problematic examples could be written as:: + + in funcs = [f(i) for i in range(10)] + def f(i): + in return incr + def incr(x): + return x + i + + in c = math.sqrt(x.a*x.a + x.b*x.b) + class x: + a = calculate_a() + b = calculate_b() + +With the name not actually being bound in the local scope, it isn't +necessary to worry about name collisions, but meaningful names can still be +used to improve readability. + Reference Implementation ======================== @@ -288,8 +322,13 @@ idea what I was talking about in criticising Ruby's blocks, kicking off a rather enlightening process of investigation. -Even though this PEP has been withdrawn, the process of writing and arguing -in its favour has been quite influential on the future direction of PEP 3150. + +Rejected Concepts +================= + +A previous incarnation of this PEP (see [1]) proposed a much uglier syntax +that (quite rightly) was not well received. The current proposal is +significantly easier both to read and write. References -- Repository URL: http://hg.python.org/peps From python-checkins at python.org Tue Feb 21 16:09:08 2012 From: python-checkins at python.org (nick.coghlan) Date: Tue, 21 Feb 2012 16:09:08 +0100 Subject: [Python-checkins] =?utf8?q?peps=3A_Fix_syntax_error?= Message-ID: http://hg.python.org/peps/rev/0f296cb35209 changeset: 4069:0f296cb35209 user: Nick Coghlan date: Wed Feb 22 01:08:43 2012 +1000 summary: Fix syntax error files: pep-0403.txt | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/pep-0403.txt b/pep-0403.txt --- a/pep-0403.txt +++ b/pep-0403.txt @@ -269,7 +269,7 @@ def ...(x): return x + i -Statement local namespace: +Statement local namespace:: # OK, this definitely looks weird and needs further thought... in c = math.sqrt(....a*....a + ....b*....b) -- Repository URL: http://hg.python.org/peps From python-checkins at python.org Tue Feb 21 16:14:10 2012 From: python-checkins at python.org (nick.coghlan) Date: Tue, 21 Feb 2012 16:14:10 +0100 Subject: [Python-checkins] =?utf8?q?peps=3A_Use_the_right_PEP_status?= Message-ID: http://hg.python.org/peps/rev/d5093f8cf643 changeset: 4070:d5093f8cf643 user: Nick Coghlan date: Wed Feb 22 01:13:16 2012 +1000 summary: Use the right PEP status files: pep-3150.txt | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/pep-3150.txt b/pep-3150.txt --- a/pep-3150.txt +++ b/pep-3150.txt @@ -3,7 +3,7 @@ Version: $Revision$ Last-Modified: $Date$ Author: Nick Coghlan -Status: Withdrawal +Status: Withdrawn Type: Standards Track Content-Type: text/x-rst Created: 2010-07-09 -- Repository URL: http://hg.python.org/peps From python-checkins at python.org Tue Feb 21 16:23:49 2012 From: python-checkins at python.org (barry.warsaw) Date: Tue, 21 Feb 2012 16:23:49 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=282=2E6=29=3A_Let=27s_sort_th?= =?utf8?q?e_keys_so_that_this_test_passes_even_with_random_hashes=2E?= Message-ID: http://hg.python.org/cpython/rev/04738f35e0ec changeset: 75124:04738f35e0ec branch: 2.6 parent: 75101:19e6e55f09f3 user: Barry Warsaw date: Tue Feb 21 10:22:34 2012 -0500 summary: Let's sort the keys so that this test passes even with random hashes. files: Lib/json/__init__.py | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Lib/json/__init__.py b/Lib/json/__init__.py --- a/Lib/json/__init__.py +++ b/Lib/json/__init__.py @@ -29,7 +29,7 @@ Compact encoding:: >>> import json - >>> json.dumps([1,2,3,{'4': 5, '6': 7}], separators=(',',':')) + >>> json.dumps([1,2,3,{'4': 5, '6': 7}], sort_keys=True, separators=(',',':')) '[1,2,3,{"4":5,"6":7}]' Pretty printing (using repr() because of extraneous whitespace in the output):: -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Feb 21 16:23:49 2012 From: python-checkins at python.org (barry.warsaw) Date: Tue, 21 Feb 2012 16:23:49 +0100 Subject: [Python-checkins] =?utf8?b?Y3B5dGhvbiAobWVyZ2UgMi42IC0+IDIuNyk6?= =?utf8?q?_null_merge_from_2=2E6?= Message-ID: http://hg.python.org/cpython/rev/bd557b03811b changeset: 75125:bd557b03811b branch: 2.7 parent: 75123:51c417a7e8f8 parent: 75124:04738f35e0ec user: Barry Warsaw date: Tue Feb 21 10:23:27 2012 -0500 summary: null merge from 2.6 files: -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Feb 21 16:28:36 2012 From: python-checkins at python.org (nick.coghlan) Date: Tue, 21 Feb 2012 16:28:36 +0100 Subject: [Python-checkins] =?utf8?q?peps=3A_Better_name_for_PEP_403_that_a?= =?utf8?q?lso_covers_the_alternative_idea_discussed_near?= Message-ID: http://hg.python.org/peps/rev/5f30e6b4e15a changeset: 4071:5f30e6b4e15a user: Nick Coghlan date: Wed Feb 22 01:28:07 2012 +1000 summary: Better name for PEP 403 that also covers the alternative idea discussed near the end files: pep-0403.txt | 10 ++++++---- 1 files changed, 6 insertions(+), 4 deletions(-) diff --git a/pep-0403.txt b/pep-0403.txt --- a/pep-0403.txt +++ b/pep-0403.txt @@ -1,5 +1,5 @@ PEP: 403 -Title: Forward references to anonymous functions and classes +Title: Statement local functions and classes Version: $Revision$ Last-Modified: $Date$ Author: Nick Coghlan @@ -15,9 +15,11 @@ Abstract ======== -This PEP proposes the addition of a new ``in`` statement that allows the use -of the Ellipsis literal (``...``) to make a forward reference to a trailing -anonymous function definition. +This PEP proposes the addition of a new ``in`` statement that accepts a +statement local function or class definition. + +The statement allows the use of the Ellipsis literal (``...``) to make a +forward reference to a trailing anonymous function definition. This new statement is designed to be used whenever a "one-shot" function is needed, and the meaning of the function is conveyed clearly by the context -- Repository URL: http://hg.python.org/peps From python-checkins at python.org Tue Feb 21 17:07:38 2012 From: python-checkins at python.org (martin.v.loewis) Date: Tue, 21 Feb 2012 17:07:38 +0100 Subject: [Python-checkins] =?utf8?b?Y3B5dGhvbiAoMi43KTogSXNzdWUgIzEwNTgw?= =?utf8?q?=3A_Minor_grammar_change_in_Windows_installer=2E?= Message-ID: http://hg.python.org/cpython/rev/d9e895d07396 changeset: 75126:d9e895d07396 branch: 2.7 user: Martin v. L?wis date: Tue Feb 21 17:07:32 2012 +0100 summary: Issue #10580: Minor grammar change in Windows installer. files: Misc/NEWS | 2 ++ Tools/msi/msi.py | 2 +- 2 files changed, 3 insertions(+), 1 deletions(-) diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -517,6 +517,8 @@ Build ----- +- Issue #10580: Minor grammar change in Windows installer. + - Issue #12627: Implement PEP 394 for Python 2.7 ("python2"). - Issue #8746: Correct faulty configure checks so that os.chflags() and diff --git a/Tools/msi/msi.py b/Tools/msi/msi.py --- a/Tools/msi/msi.py +++ b/Tools/msi/msi.py @@ -495,7 +495,7 @@ exit_dialog = PyDialog(db, "ExitDialog", x, y, w, h, modal, title, "Finish", "Finish", "Finish") - exit_dialog.title("Completing the [ProductName] Installer") + exit_dialog.title("Complete the [ProductName] Installer") exit_dialog.back("< Back", "Finish", active = 0) exit_dialog.cancel("Cancel", "Back", active = 0) exit_dialog.text("Acknowledgements", 135, 95, 220, 120, 0x30003, -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Feb 21 17:12:20 2012 From: python-checkins at python.org (benjamin.peterson) Date: Tue, 21 Feb 2012 17:12:20 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=283=2E1=29=3A_ensure_no_one_t?= =?utf8?q?ries_to_hash_things_before_the_random_seed_is_found?= Message-ID: http://hg.python.org/cpython/rev/160a56eac332 changeset: 75127:160a56eac332 branch: 3.1 parent: 75091:0e68e31b75a0 user: Benjamin Peterson date: Tue Feb 21 11:08:50 2012 -0500 summary: ensure no one tries to hash things before the random seed is found files: Include/object.h | 4 ++++ Modules/datetimemodule.c | 1 + Objects/bytesobject.c | 1 + Objects/unicodeobject.c | 1 + Python/random.c | 12 ++++++++---- 5 files changed, 15 insertions(+), 4 deletions(-) diff --git a/Include/object.h b/Include/object.h --- a/Include/object.h +++ b/Include/object.h @@ -479,6 +479,10 @@ } _Py_HashSecret_t; PyAPI_DATA(_Py_HashSecret_t) _Py_HashSecret; +#ifdef Py_DEBUG +PyAPI_DATA(int) _Py_HashSecret_Initialized; +#endif + /* Helper for passing objects to printf and the like */ #define PyObject_REPR(obj) _PyUnicode_AsString(PyObject_Repr(obj)) diff --git a/Modules/datetimemodule.c b/Modules/datetimemodule.c --- a/Modules/datetimemodule.c +++ b/Modules/datetimemodule.c @@ -2565,6 +2565,7 @@ register unsigned char *p; register long x; + assert(_Py_HashSecret_Initialized); p = (unsigned char *) data; x = _Py_HashSecret.prefix; x ^= *p << 7; diff --git a/Objects/bytesobject.c b/Objects/bytesobject.c --- a/Objects/bytesobject.c +++ b/Objects/bytesobject.c @@ -896,6 +896,7 @@ register unsigned char *p; register long x; + assert(_Py_HashSecret_Initialized); if (a->ob_shash != -1) return a->ob_shash; len = Py_SIZE(a); diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -7341,6 +7341,7 @@ Py_UNICODE *p; long x; + assert(_Py_HashSecret_Initialized); if (self->hash != -1) return self->hash; len = Py_SIZE(self); diff --git a/Python/random.c b/Python/random.c --- a/Python/random.c +++ b/Python/random.c @@ -5,7 +5,11 @@ #include #endif -static int random_initialized = 0; +#ifdef Py_DEBUG +int _Py_HashSecret_Initialized = 0; +#else +static int _Py_HashSecret_Initialized = 0; +#endif #ifdef MS_WINDOWS typedef BOOL (WINAPI *CRYPTACQUIRECONTEXTA)(HCRYPTPROV *phProv,\ @@ -246,11 +250,11 @@ { char *env; void *secret = &_Py_HashSecret; - Py_ssize_t secret_size = sizeof(_Py_HashSecret); + Py_ssize_t secret_size = sizeof(_Py_HashSecret_t); - if (random_initialized) + if (_Py_HashSecret_Initialized) return; - random_initialized = 1; + _Py_HashSecret_Initialized = 1; /* By default, hash randomization is disabled, and only -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Feb 21 17:12:21 2012 From: python-checkins at python.org (benjamin.peterson) Date: Tue, 21 Feb 2012 17:12:21 +0100 Subject: [Python-checkins] =?utf8?b?Y3B5dGhvbiAobWVyZ2UgMy4xIC0+IDMuMik6?= =?utf8?q?_merge_3=2E2?= Message-ID: http://hg.python.org/cpython/rev/eb07691f2c29 changeset: 75128:eb07691f2c29 branch: 3.2 parent: 75119:e67715b87131 parent: 75127:160a56eac332 user: Benjamin Peterson date: Tue Feb 21 11:09:13 2012 -0500 summary: merge 3.2 files: Include/object.h | 4 ++++ Modules/_datetimemodule.c | 1 + Objects/bytesobject.c | 1 + Objects/unicodeobject.c | 1 + Python/random.c | 12 ++++++++---- 5 files changed, 15 insertions(+), 4 deletions(-) diff --git a/Include/object.h b/Include/object.h --- a/Include/object.h +++ b/Include/object.h @@ -523,6 +523,10 @@ } _Py_HashSecret_t; PyAPI_DATA(_Py_HashSecret_t) _Py_HashSecret; +#ifdef Py_DEBUG +PyAPI_DATA(int) _Py_HashSecret_Initialized; +#endif + /* Helper for passing objects to printf and the like */ #define PyObject_REPR(obj) _PyUnicode_AsString(PyObject_Repr(obj)) diff --git a/Modules/_datetimemodule.c b/Modules/_datetimemodule.c --- a/Modules/_datetimemodule.c +++ b/Modules/_datetimemodule.c @@ -2784,6 +2784,7 @@ register unsigned char *p; register Py_hash_t x; + assert(_Py_HashSecret_Initialized); p = (unsigned char *) data; x = _Py_HashSecret.prefix; x ^= *p << 7; diff --git a/Objects/bytesobject.c b/Objects/bytesobject.c --- a/Objects/bytesobject.c +++ b/Objects/bytesobject.c @@ -875,6 +875,7 @@ register unsigned char *p; register Py_hash_t x; + assert(_Py_HashSecret_Initialized); if (a->ob_shash != -1) return a->ob_shash; len = Py_SIZE(a); diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -7673,6 +7673,7 @@ Py_UNICODE *p; Py_hash_t x; + assert(_Py_HashSecret_Initialized); if (self->hash != -1) return self->hash; len = Py_SIZE(self); diff --git a/Python/random.c b/Python/random.c --- a/Python/random.c +++ b/Python/random.c @@ -5,7 +5,11 @@ #include #endif -static int random_initialized = 0; +#ifdef Py_DEBUG +int _Py_HashSecret_Initialized = 0; +#else +static int _Py_HashSecret_Initialized = 0; +#endif #ifdef MS_WINDOWS typedef BOOL (WINAPI *CRYPTACQUIRECONTEXTA)(HCRYPTPROV *phProv,\ @@ -246,11 +250,11 @@ { char *env; void *secret = &_Py_HashSecret; - Py_ssize_t secret_size = sizeof(_Py_HashSecret); + Py_ssize_t secret_size = sizeof(_Py_HashSecret_t); - if (random_initialized) + if (_Py_HashSecret_Initialized) return; - random_initialized = 1; + _Py_HashSecret_Initialized = 1; /* By default, hash randomization is disabled, and only -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Feb 21 17:12:22 2012 From: python-checkins at python.org (benjamin.peterson) Date: Tue, 21 Feb 2012 17:12:22 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_3=2E2_-=3E_default=29?= =?utf8?q?=3A_merge_3=2E2?= Message-ID: http://hg.python.org/cpython/rev/e0d451e24c43 changeset: 75129:e0d451e24c43 parent: 75120:cf12fe9ce2b0 parent: 75128:eb07691f2c29 user: Benjamin Peterson date: Tue Feb 21 11:12:14 2012 -0500 summary: merge 3.2 files: Include/object.h | 4 ++++ Objects/object.c | 1 + Objects/unicodeobject.c | 1 + Python/random.c | 12 ++++++++---- 4 files changed, 14 insertions(+), 4 deletions(-) diff --git a/Include/object.h b/Include/object.h --- a/Include/object.h +++ b/Include/object.h @@ -560,6 +560,10 @@ } _Py_HashSecret_t; PyAPI_DATA(_Py_HashSecret_t) _Py_HashSecret; +#ifdef Py_DEBUG +PyAPI_DATA(int) _Py_HashSecret_Initialized; +#endif + /* Helper for passing objects to printf and the like */ #define PyObject_REPR(obj) _PyUnicode_AsString(PyObject_Repr(obj)) diff --git a/Objects/object.c b/Objects/object.c --- a/Objects/object.c +++ b/Objects/object.c @@ -763,6 +763,7 @@ We make the hash of the empty string be 0, rather than using (prefix ^ suffix), since this slightly obfuscates the hash secret */ + assert(_Py_HashSecret_Initialized); if (len == 0) { return 0; } diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -11214,6 +11214,7 @@ Py_ssize_t len; Py_uhash_t x; + assert(_Py_HashSecret_Initialized); if (_PyUnicode_HASH(self) != -1) return _PyUnicode_HASH(self); if (PyUnicode_READY(self) == -1) diff --git a/Python/random.c b/Python/random.c --- a/Python/random.c +++ b/Python/random.c @@ -5,7 +5,11 @@ #include #endif -static int random_initialized = 0; +#ifdef Py_DEBUG +int _Py_HashSecret_Initialized = 0; +#else +static int _Py_HashSecret_Initialized = 0; +#endif #ifdef MS_WINDOWS typedef BOOL (WINAPI *CRYPTACQUIRECONTEXTA)(HCRYPTPROV *phProv,\ @@ -246,11 +250,11 @@ { char *env; void *secret = &_Py_HashSecret; - Py_ssize_t secret_size = sizeof(_Py_HashSecret); + Py_ssize_t secret_size = sizeof(_Py_HashSecret_t); - if (random_initialized) + if (_Py_HashSecret_Initialized) return; - random_initialized = 1; + _Py_HashSecret_Initialized = 1; /* By default, hash randomization is disabled, and only -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Feb 21 17:19:43 2012 From: python-checkins at python.org (barry.warsaw) Date: Tue, 21 Feb 2012 17:19:43 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=282=2E6=29=3A_Backport_fix_fr?= =?utf8?q?om_default_branch_for_=2E/python_-R_-Wd_where_hash=28=27d=27=29_?= =?utf8?q?would_not?= Message-ID: http://hg.python.org/cpython/rev/4c69ec7e9bca changeset: 75130:4c69ec7e9bca branch: 2.6 parent: 75124:04738f35e0ec user: Barry Warsaw date: Tue Feb 21 11:16:06 2012 -0500 summary: Backport fix from default branch for ./python -R -Wd where hash('d') would not have gotten randomized. files: Modules/main.c | 6 ++++++ 1 files changed, 6 insertions(+), 0 deletions(-) diff --git a/Modules/main.c b/Modules/main.c --- a/Modules/main.c +++ b/Modules/main.c @@ -396,6 +396,12 @@ case 'W': PySys_AddWarnOption(_PyOS_optarg); + /* Extremely obscure hack: if _PyOS_optarg was one character, + PyString_FromString in PySys_AddWarnOption will try to intern + it. This is bad because hash randomization has not been setup + yet, so the string will get the wrong hash. The following call + will cause all the cached characters to be released. */ + PyString_Fini(); break; case 'R': -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Feb 21 17:19:44 2012 From: python-checkins at python.org (barry.warsaw) Date: Tue, 21 Feb 2012 17:19:44 +0100 Subject: [Python-checkins] =?utf8?b?Y3B5dGhvbiAobWVyZ2UgMi42IC0+IDIuNyk6?= =?utf8?q?_merge_2=2E6?= Message-ID: http://hg.python.org/cpython/rev/99b606d0cc34 changeset: 75131:99b606d0cc34 branch: 2.7 parent: 75125:bd557b03811b parent: 75130:4c69ec7e9bca user: Barry Warsaw date: Tue Feb 21 11:16:52 2012 -0500 summary: merge 2.6 files: -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Feb 21 17:19:45 2012 From: python-checkins at python.org (barry.warsaw) Date: Tue, 21 Feb 2012 17:19:45 +0100 Subject: [Python-checkins] =?utf8?b?Y3B5dGhvbiAobWVyZ2UgMi43IC0+IDIuNyk6?= =?utf8?q?_merge_2=2E7?= Message-ID: http://hg.python.org/cpython/rev/91d6f312e0c3 changeset: 75132:91d6f312e0c3 branch: 2.7 parent: 75126:d9e895d07396 parent: 75131:99b606d0cc34 user: Barry Warsaw date: Tue Feb 21 11:19:00 2012 -0500 summary: merge 2.7 files: -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Feb 21 17:24:28 2012 From: python-checkins at python.org (benjamin.peterson) Date: Tue, 21 Feb 2012 17:24:28 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=282=2E6=29=3A_ensure_no_one_t?= =?utf8?q?ries_to_hash_things_before_the_random_seed_is_found?= Message-ID: http://hg.python.org/cpython/rev/357e268e7c5f changeset: 75133:357e268e7c5f branch: 2.6 parent: 75124:04738f35e0ec user: Benjamin Peterson date: Tue Feb 21 11:08:50 2012 -0500 summary: ensure no one tries to hash things before the random seed is found files: Include/object.h | 4 ++++ Objects/stringobject.c | 1 + Objects/unicodeobject.c | 1 + Python/random.c | 12 ++++++++---- 4 files changed, 14 insertions(+), 4 deletions(-) diff --git a/Include/object.h b/Include/object.h --- a/Include/object.h +++ b/Include/object.h @@ -512,6 +512,10 @@ } _Py_HashSecret_t; PyAPI_DATA(_Py_HashSecret_t) _Py_HashSecret; +#ifdef Py_DEBUG +PyAPI_DATA(int) _Py_HashSecret_Initialized; +#endif + /* Helper for passing objects to printf and the like */ #define PyObject_REPR(obj) PyString_AS_STRING(PyObject_Repr(obj)) diff --git a/Objects/stringobject.c b/Objects/stringobject.c --- a/Objects/stringobject.c +++ b/Objects/stringobject.c @@ -1209,6 +1209,7 @@ register unsigned char *p; register long x; + assert(_Py_HashSecret_Initialized); if (a->ob_shash != -1) return a->ob_shash; len = Py_SIZE(a); diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -6692,6 +6692,7 @@ register Py_UNICODE *p; register long x; + assert(_Py_HashSecret_Initialized); if (self->hash != -1) return self->hash; len = PyUnicode_GET_SIZE(self); diff --git a/Python/random.c b/Python/random.c --- a/Python/random.c +++ b/Python/random.c @@ -5,7 +5,11 @@ #include #endif -static int random_initialized = 0; +#ifdef Py_DEBUG +int _Py_HashSecret_Initialized = 0; +#else +static int _Py_HashSecret_Initialized = 0; +#endif #ifdef MS_WINDOWS typedef BOOL (WINAPI *CRYPTACQUIRECONTEXTA)(HCRYPTPROV *phProv,\ @@ -246,11 +250,11 @@ { char *env; void *secret = &_Py_HashSecret; - Py_ssize_t secret_size = sizeof(_Py_HashSecret); + Py_ssize_t secret_size = sizeof(_Py_HashSecret_t); - if (random_initialized) + if (_Py_HashSecret_Initialized) return; - random_initialized = 1; + _Py_HashSecret_Initialized = 1; /* By default, hash randomization is disabled, and only -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Feb 21 17:24:28 2012 From: python-checkins at python.org (benjamin.peterson) Date: Tue, 21 Feb 2012 17:24:28 +0100 Subject: [Python-checkins] =?utf8?b?Y3B5dGhvbiAobWVyZ2UgMi42IC0+IDIuNik6?= =?utf8?q?_merge_heads?= Message-ID: http://hg.python.org/cpython/rev/54a78290a75d changeset: 75134:54a78290a75d branch: 2.6 parent: 75133:357e268e7c5f parent: 75130:4c69ec7e9bca user: Benjamin Peterson date: Tue Feb 21 11:23:21 2012 -0500 summary: merge heads files: Modules/main.c | 6 ++++++ 1 files changed, 6 insertions(+), 0 deletions(-) diff --git a/Modules/main.c b/Modules/main.c --- a/Modules/main.c +++ b/Modules/main.c @@ -396,6 +396,12 @@ case 'W': PySys_AddWarnOption(_PyOS_optarg); + /* Extremely obscure hack: if _PyOS_optarg was one character, + PyString_FromString in PySys_AddWarnOption will try to intern + it. This is bad because hash randomization has not been setup + yet, so the string will get the wrong hash. The following call + will cause all the cached characters to be released. */ + PyString_Fini(); break; case 'R': -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Feb 21 17:24:40 2012 From: python-checkins at python.org (benjamin.peterson) Date: Tue, 21 Feb 2012 17:24:40 +0100 Subject: [Python-checkins] =?utf8?b?Y3B5dGhvbiAobWVyZ2UgMi42IC0+IDIuNyk6?= =?utf8?q?_merge_2=2E6?= Message-ID: http://hg.python.org/cpython/rev/40b684215b4f changeset: 75135:40b684215b4f branch: 2.7 parent: 75132:91d6f312e0c3 parent: 75134:54a78290a75d user: Benjamin Peterson date: Tue Feb 21 11:24:21 2012 -0500 summary: merge 2.6 files: Include/object.h | 4 ++++ Objects/stringobject.c | 1 + Objects/unicodeobject.c | 1 + Python/random.c | 12 ++++++++---- 4 files changed, 14 insertions(+), 4 deletions(-) diff --git a/Include/object.h b/Include/object.h --- a/Include/object.h +++ b/Include/object.h @@ -523,6 +523,10 @@ } _Py_HashSecret_t; PyAPI_DATA(_Py_HashSecret_t) _Py_HashSecret; +#ifdef Py_DEBUG +PyAPI_DATA(int) _Py_HashSecret_Initialized; +#endif + /* Helper for passing objects to printf and the like */ #define PyObject_REPR(obj) PyString_AS_STRING(PyObject_Repr(obj)) diff --git a/Objects/stringobject.c b/Objects/stringobject.c --- a/Objects/stringobject.c +++ b/Objects/stringobject.c @@ -1262,6 +1262,7 @@ register unsigned char *p; register long x; + assert(_Py_HashSecret_Initialized); if (a->ob_shash != -1) return a->ob_shash; len = Py_SIZE(a); diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -6538,6 +6538,7 @@ register Py_UNICODE *p; register long x; + assert(_Py_HashSecret_Initialized); if (self->hash != -1) return self->hash; len = PyUnicode_GET_SIZE(self); diff --git a/Python/random.c b/Python/random.c --- a/Python/random.c +++ b/Python/random.c @@ -5,7 +5,11 @@ #include #endif -static int random_initialized = 0; +#ifdef Py_DEBUG +int _Py_HashSecret_Initialized = 0; +#else +static int _Py_HashSecret_Initialized = 0; +#endif #ifdef MS_WINDOWS typedef BOOL (WINAPI *CRYPTACQUIRECONTEXTA)(HCRYPTPROV *phProv,\ @@ -246,11 +250,11 @@ { char *env; void *secret = &_Py_HashSecret; - Py_ssize_t secret_size = sizeof(_Py_HashSecret); + Py_ssize_t secret_size = sizeof(_Py_HashSecret_t); - if (random_initialized) + if (_Py_HashSecret_Initialized) return; - random_initialized = 1; + _Py_HashSecret_Initialized = 1; /* By default, hash randomization is disabled, and only -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Feb 21 17:26:24 2012 From: python-checkins at python.org (martin.v.loewis) Date: Tue, 21 Feb 2012 17:26:24 +0100 Subject: [Python-checkins] =?utf8?b?Y3B5dGhvbiAoMy4yKTogSXNzdWUgIzEwNTgw?= =?utf8?q?=3A_Minor_grammar_change_in_Windows_installer=2E?= Message-ID: http://hg.python.org/cpython/rev/b349c932765a changeset: 75136:b349c932765a branch: 3.2 parent: 75128:eb07691f2c29 user: Martin v. L?wis date: Tue Feb 21 17:23:55 2012 +0100 summary: Issue #10580: Minor grammar change in Windows installer. files: Misc/NEWS | 2 ++ Tools/msi/msi.py | 2 +- 2 files changed, 3 insertions(+), 1 deletions(-) diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -474,6 +474,8 @@ Build ----- +- Issue #10580: Minor grammar change in Windows installer. + - Issue #13326: Clean __pycache__ directories correctly on OpenBSD. Tools/Demos diff --git a/Tools/msi/msi.py b/Tools/msi/msi.py --- a/Tools/msi/msi.py +++ b/Tools/msi/msi.py @@ -497,7 +497,7 @@ exit_dialog = PyDialog(db, "ExitDialog", x, y, w, h, modal, title, "Finish", "Finish", "Finish") - exit_dialog.title("Completing the [ProductName] Installer") + exit_dialog.title("Complete the [ProductName] Installer") exit_dialog.back("< Back", "Finish", active = 0) exit_dialog.cancel("Cancel", "Back", active = 0) exit_dialog.text("Acknowledgements", 135, 95, 220, 120, 0x30003, -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Feb 21 17:26:25 2012 From: python-checkins at python.org (martin.v.loewis) Date: Tue, 21 Feb 2012 17:26:25 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_3=2E2_-=3E_default=29?= =?utf8?q?=3A_merge_3=2E2?= Message-ID: http://hg.python.org/cpython/rev/2cceb4d3079a changeset: 75137:2cceb4d3079a parent: 75129:e0d451e24c43 parent: 75136:b349c932765a user: Martin v. L?wis date: Tue Feb 21 17:26:10 2012 +0100 summary: merge 3.2 files: Misc/NEWS | 2 ++ Tools/msi/msi.py | 2 +- 2 files changed, 3 insertions(+), 1 deletions(-) diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -1942,6 +1942,8 @@ Build ----- +- Issue #10580: Minor grammar change in Windows installer. + - Issue #13326: Clean __pycache__ directories correctly on OpenBSD. - PEP 393: the configure option --with-wide-unicode is removed. diff --git a/Tools/msi/msi.py b/Tools/msi/msi.py --- a/Tools/msi/msi.py +++ b/Tools/msi/msi.py @@ -498,7 +498,7 @@ exit_dialog = PyDialog(db, "ExitDialog", x, y, w, h, modal, title, "Finish", "Finish", "Finish") - exit_dialog.title("Completing the [ProductName] Installer") + exit_dialog.title("Complete the [ProductName] Installer") exit_dialog.back("< Back", "Finish", active = 0) exit_dialog.cancel("Cancel", "Back", active = 0) exit_dialog.text("Acknowledgements", 135, 95, 220, 120, 0x30003, -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Feb 21 18:08:20 2012 From: python-checkins at python.org (martin.v.loewis) Date: Tue, 21 Feb 2012 18:08:20 +0100 Subject: [Python-checkins] =?utf8?b?Y3B5dGhvbiAoMy4yKTogSXNzdWUgIzY4MDc6?= =?utf8?q?_Run_msisupport=2Emak_earlier=2E?= Message-ID: http://hg.python.org/cpython/rev/bc66484b0d73 changeset: 75138:bc66484b0d73 branch: 3.2 parent: 75136:b349c932765a user: Martin v. L?wis date: Tue Feb 21 18:06:22 2012 +0100 summary: Issue #6807: Run msisupport.mak earlier. files: Misc/NEWS | 2 ++ Tools/msi/msi.py | 4 ++-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -474,6 +474,8 @@ Build ----- +- Issue #6807: Run msisupport.mak earlier. + - Issue #10580: Minor grammar change in Windows installer. - Issue #13326: Clean __pycache__ directories correctly on OpenBSD. diff --git a/Tools/msi/msi.py b/Tools/msi/msi.py --- a/Tools/msi/msi.py +++ b/Tools/msi/msi.py @@ -179,6 +179,8 @@ have_mingw = build_mingw_lib(lib_file, def_file, dll_file, mingw_lib) # Determine the target architecture +if os.system("nmake /nologo /c /f msisupport.mak") != 0: + raise RuntimeError("'nmake /f msisupport.mak' failed") dll_path = os.path.join(srcdir, PCBUILD, dll_file) msilib.set_arch_from_file(dll_path) if msilib.pe_type(dll_path) != msilib.pe_type("msisupport.dll"): @@ -376,8 +378,6 @@ # UpdateEditIDLE sets the REGISTRY.tcl component into # the installed/uninstalled state according to both the # Extensions and TclTk features. - if os.system("nmake /nologo /c /f msisupport.mak") != 0: - raise RuntimeError("'nmake /f msisupport.mak' failed") add_data(db, "Binary", [("Script", msilib.Binary("msisupport.dll"))]) # See "Custom Action Type 1" if msilib.Win64: -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Feb 21 18:08:21 2012 From: python-checkins at python.org (martin.v.loewis) Date: Tue, 21 Feb 2012 18:08:21 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_3=2E2_-=3E_default=29?= =?utf8?q?=3A_merge_2=2E6?= Message-ID: http://hg.python.org/cpython/rev/9f706d1a713e changeset: 75139:9f706d1a713e parent: 75137:2cceb4d3079a parent: 75138:bc66484b0d73 user: Martin v. L?wis date: Tue Feb 21 18:07:58 2012 +0100 summary: merge 2.6 files: Misc/NEWS | 2 ++ Tools/msi/msi.py | 4 ++-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -1942,6 +1942,8 @@ Build ----- +- Issue #6807: Run msisupport.mak earlier. + - Issue #10580: Minor grammar change in Windows installer. - Issue #13326: Clean __pycache__ directories correctly on OpenBSD. diff --git a/Tools/msi/msi.py b/Tools/msi/msi.py --- a/Tools/msi/msi.py +++ b/Tools/msi/msi.py @@ -180,6 +180,8 @@ have_mingw = build_mingw_lib(lib_file, def_file, dll_file, mingw_lib) # Determine the target architecture +if os.system("nmake /nologo /c /f msisupport.mak") != 0: + raise RuntimeError("'nmake /f msisupport.mak' failed") dll_path = os.path.join(srcdir, PCBUILD, dll_file) msilib.set_arch_from_file(dll_path) if msilib.pe_type(dll_path) != msilib.pe_type("msisupport.dll"): @@ -377,8 +379,6 @@ # UpdateEditIDLE sets the REGISTRY.tcl component into # the installed/uninstalled state according to both the # Extensions and TclTk features. - if os.system("nmake /nologo /c /f msisupport.mak") != 0: - raise RuntimeError("'nmake /f msisupport.mak' failed") add_data(db, "Binary", [("Script", msilib.Binary("msisupport.dll"))]) # See "Custom Action Type 1" if msilib.Win64: -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Feb 21 18:12:08 2012 From: python-checkins at python.org (martin.v.loewis) Date: Tue, 21 Feb 2012 18:12:08 +0100 Subject: [Python-checkins] =?utf8?b?Y3B5dGhvbiAoMi43KTogSXNzdWUgIzY4MDc6?= =?utf8?q?_Run_msisupport=2Emak_earlier=2E?= Message-ID: http://hg.python.org/cpython/rev/e78acdb54841 changeset: 75140:e78acdb54841 branch: 2.7 parent: 75135:40b684215b4f user: Martin v. L?wis date: Tue Feb 21 18:12:02 2012 +0100 summary: Issue #6807: Run msisupport.mak earlier. files: Misc/NEWS | 2 ++ Tools/msi/msi.py | 4 ++-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -517,6 +517,8 @@ Build ----- +- Issue #6807: Run msisupport.mak earlier. + - Issue #10580: Minor grammar change in Windows installer. - Issue #12627: Implement PEP 394 for Python 2.7 ("python2"). diff --git a/Tools/msi/msi.py b/Tools/msi/msi.py --- a/Tools/msi/msi.py +++ b/Tools/msi/msi.py @@ -177,6 +177,8 @@ have_mingw = build_mingw_lib(lib_file, def_file, dll_file, mingw_lib) # Determine the target architecture +if os.system("nmake /nologo /c /f msisupport.mak") != 0: + raise RuntimeError("'nmake /f msisupport.mak' failed") dll_path = os.path.join(srcdir, PCBUILD, dll_file) msilib.set_arch_from_file(dll_path) if msilib.pe_type(dll_path) != msilib.pe_type("msisupport.dll"): @@ -374,8 +376,6 @@ # UpdateEditIDLE sets the REGISTRY.tcl component into # the installed/uninstalled state according to both the # Extensions and TclTk features. - if os.system("nmake /nologo /c /f msisupport.mak") != 0: - raise "'nmake /f msisupport.mak' failed" add_data(db, "Binary", [("Script", msilib.Binary("msisupport.dll"))]) # See "Custom Action Type 1" if msilib.Win64: -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Feb 21 18:49:48 2012 From: python-checkins at python.org (martin.v.loewis) Date: Tue, 21 Feb 2012 18:49:48 +0100 Subject: [Python-checkins] =?utf8?q?cpython=3A_Issue_=2312406=3A_prevent_c?= =?utf8?q?ase_where_shortened_name_could_conflict_with_short_name=2E?= Message-ID: http://hg.python.org/cpython/rev/2fed68cf102a changeset: 75141:2fed68cf102a parent: 75139:9f706d1a713e user: Martin v. L?wis date: Tue Feb 21 18:49:10 2012 +0100 summary: Issue #12406: prevent case where shortened name could conflict with short name. files: Tools/msi/msilib.py | 18 ++++++++++-------- 1 files changed, 10 insertions(+), 8 deletions(-) diff --git a/Tools/msi/msilib.py b/Tools/msi/msilib.py --- a/Tools/msi/msilib.py +++ b/Tools/msi/msilib.py @@ -408,7 +408,7 @@ self.physical = physical self.logical = logical self.component = None - self.short_names = sets.Set() + self.short_names = {} self.ids = sets.Set() self.keyfiles = {} self.componentflags = componentflags @@ -456,23 +456,25 @@ [(feature.id, component)]) def make_short(self, file): + long = file file = re.sub(r'[\?|><:/*"+,;=\[\]]', '_', file) # restrictions on short names - parts = file.split(".") + parts = file.split(".", 1) if len(parts)>1: - suffix = parts[-1].upper() + suffix = parts[1].upper() else: - suffix = None + suffix = '' prefix = parts[0].upper() - if len(prefix) <= 8 and (not suffix or len(suffix)<=3): + if len(prefix) <= 8 and '.' not in suffix and len(suffix) <= 3: if suffix: file = prefix+"."+suffix else: file = prefix - assert file not in self.short_names + assert file not in self.short_names, (file, self.short_names[file]) else: prefix = prefix[:6] if suffix: - suffix = suffix[:3] + # last three characters of last suffix + suffix = suffix.rsplit('.')[-1][:3] pos = 1 while 1: if suffix: @@ -484,7 +486,7 @@ assert pos < 10000 if pos in (10, 100, 1000): prefix = prefix[:-1] - self.short_names.add(file) + self.short_names[file] = long return file def add_file(self, file, src=None, version=None, language=None): -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Feb 21 19:11:57 2012 From: python-checkins at python.org (antoine.pitrou) Date: Tue, 21 Feb 2012 19:11:57 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=283=2E2=29=3A_Fix_test_failur?= =?utf8?q?e_in_test=5Fcmd=5Fline_by_initializing_the_hash_secret_at_the?= Message-ID: http://hg.python.org/cpython/rev/0e8bd4785ea0 changeset: 75142:0e8bd4785ea0 branch: 3.2 parent: 75138:bc66484b0d73 user: Antoine Pitrou date: Tue Feb 21 19:03:47 2012 +0100 summary: Fix test failure in test_cmd_line by initializing the hash secret at the earliest point. files: Include/pygetopt.h | 2 ++ Include/pythonrun.h | 1 + Modules/main.c | 30 ++++++++++++++++++++++++++++-- Python/getopt.c | 11 ++++++++++- Python/pythonrun.c | 1 - 5 files changed, 41 insertions(+), 4 deletions(-) diff --git a/Include/pygetopt.h b/Include/pygetopt.h --- a/Include/pygetopt.h +++ b/Include/pygetopt.h @@ -9,6 +9,8 @@ PyAPI_DATA(int) _PyOS_opterr; PyAPI_DATA(int) _PyOS_optind; PyAPI_DATA(wchar_t *) _PyOS_optarg; + +PyAPI_FUNC(void) _PyOS_ResetGetOpt(void); #endif PyAPI_FUNC(int) _PyOS_GetOpt(int argc, wchar_t **argv, wchar_t *optstring); diff --git a/Include/pythonrun.h b/Include/pythonrun.h --- a/Include/pythonrun.h +++ b/Include/pythonrun.h @@ -196,6 +196,7 @@ PyAPI_FUNC(int) _PyFrame_Init(void); PyAPI_FUNC(void) _PyFloat_Init(void); PyAPI_FUNC(int) PyByteArray_Init(void); +PyAPI_FUNC(void) _PyRandom_Init(void); #endif /* Various internal finalizers */ diff --git a/Modules/main.c b/Modules/main.c --- a/Modules/main.c +++ b/Modules/main.c @@ -337,7 +337,33 @@ orig_argc = argc; /* For Py_GetArgcArgv() */ orig_argv = argv; + /* Hash randomization needed early for all string operations + (including -W and -X options). */ + while ((c = _PyOS_GetOpt(argc, argv, PROGRAM_OPTS)) != EOF) { + if (c == 'm' || c == 'c') { + /* -c / -m is the last option: following arguments are + not interpreter options. */ + break; + } + switch (c) { + case '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; + + _PyRandom_Init(); + PySys_ResetWarnOptions(); + _PyOS_ResetGetOpt(); while ((c = _PyOS_GetOpt(argc, argv, PROGRAM_OPTS)) != EOF) { if (c == 'c') { @@ -398,7 +424,7 @@ break; case 'E': - Py_IgnoreEnvironmentFlag++; + /* Already handled above */ break; case 't': @@ -440,7 +466,7 @@ break; case 'R': - Py_HashRandomizationFlag++; + /* Already handled above */ break; /* This space reserved for other options */ diff --git a/Python/getopt.c b/Python/getopt.c --- a/Python/getopt.c +++ b/Python/getopt.c @@ -41,9 +41,18 @@ int _PyOS_optind = 1; /* index into argv array */ wchar_t *_PyOS_optarg = NULL; /* optional argument */ +static wchar_t *opt_ptr = L""; + +void _PyOS_ResetGetOpt(void) +{ + _PyOS_opterr = 1; + _PyOS_optind = 1; + _PyOS_optarg = NULL; + opt_ptr = L""; +} + int _PyOS_GetOpt(int argc, wchar_t **argv, wchar_t *optstring) { - static wchar_t *opt_ptr = L""; wchar_t *ptr; wchar_t option; diff --git a/Python/pythonrun.c b/Python/pythonrun.c --- a/Python/pythonrun.c +++ b/Python/pythonrun.c @@ -70,7 +70,6 @@ extern void _PyUnicode_Fini(void); extern int _PyLong_Init(void); extern void PyLong_Fini(void); -extern void _PyRandom_Init(void); #ifdef WITH_THREAD extern void _PyGILState_Init(PyInterpreterState *, PyThreadState *); -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Feb 21 19:11:58 2012 From: python-checkins at python.org (antoine.pitrou) Date: Tue, 21 Feb 2012 19:11:58 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_3=2E2_-=3E_default=29?= =?utf8?q?=3A_Fix_test_failure_in_test=5Fcmd=5Fline_by_initializing_the_ha?= =?utf8?q?sh_secret_at_the?= Message-ID: http://hg.python.org/cpython/rev/88aede44ded1 changeset: 75143:88aede44ded1 parent: 75141:2fed68cf102a parent: 75142:0e8bd4785ea0 user: Antoine Pitrou date: Tue Feb 21 19:08:26 2012 +0100 summary: Fix test failure in test_cmd_line by initializing the hash secret at the earliest point. files: Include/pygetopt.h | 2 ++ Include/pythonrun.h | 1 + Modules/main.c | 30 ++++++++++++++++++++++++++++-- Python/getopt.c | 11 ++++++++++- Python/pythonrun.c | 1 - 5 files changed, 41 insertions(+), 4 deletions(-) diff --git a/Include/pygetopt.h b/Include/pygetopt.h --- a/Include/pygetopt.h +++ b/Include/pygetopt.h @@ -9,6 +9,8 @@ PyAPI_DATA(int) _PyOS_opterr; PyAPI_DATA(int) _PyOS_optind; PyAPI_DATA(wchar_t *) _PyOS_optarg; + +PyAPI_FUNC(void) _PyOS_ResetGetOpt(void); #endif PyAPI_FUNC(int) _PyOS_GetOpt(int argc, wchar_t **argv, wchar_t *optstring); diff --git a/Include/pythonrun.h b/Include/pythonrun.h --- a/Include/pythonrun.h +++ b/Include/pythonrun.h @@ -193,6 +193,7 @@ PyAPI_FUNC(int) _PyFrame_Init(void); PyAPI_FUNC(void) _PyFloat_Init(void); PyAPI_FUNC(int) PyByteArray_Init(void); +PyAPI_FUNC(void) _PyRandom_Init(void); #endif /* Various internal finalizers */ diff --git a/Modules/main.c b/Modules/main.c --- a/Modules/main.c +++ b/Modules/main.c @@ -339,7 +339,33 @@ orig_argc = argc; /* For Py_GetArgcArgv() */ orig_argv = argv; + /* Hash randomization needed early for all string operations + (including -W and -X options). */ + while ((c = _PyOS_GetOpt(argc, argv, PROGRAM_OPTS)) != EOF) { + if (c == 'm' || c == 'c') { + /* -c / -m is the last option: following arguments are + not interpreter options. */ + break; + } + switch (c) { + case '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; + + _PyRandom_Init(); + PySys_ResetWarnOptions(); + _PyOS_ResetGetOpt(); while ((c = _PyOS_GetOpt(argc, argv, PROGRAM_OPTS)) != EOF) { if (c == 'c') { @@ -400,7 +426,7 @@ break; case 'E': - Py_IgnoreEnvironmentFlag++; + /* Already handled above */ break; case 't': @@ -442,7 +468,7 @@ break; case 'R': - Py_HashRandomizationFlag++; + /* Already handled above */ break; /* This space reserved for other options */ diff --git a/Python/getopt.c b/Python/getopt.c --- a/Python/getopt.c +++ b/Python/getopt.c @@ -41,9 +41,18 @@ int _PyOS_optind = 1; /* index into argv array */ wchar_t *_PyOS_optarg = NULL; /* optional argument */ +static wchar_t *opt_ptr = L""; + +void _PyOS_ResetGetOpt(void) +{ + _PyOS_opterr = 1; + _PyOS_optind = 1; + _PyOS_optarg = NULL; + opt_ptr = L""; +} + int _PyOS_GetOpt(int argc, wchar_t **argv, wchar_t *optstring) { - static wchar_t *opt_ptr = L""; wchar_t *ptr; wchar_t option; diff --git a/Python/pythonrun.c b/Python/pythonrun.c --- a/Python/pythonrun.c +++ b/Python/pythonrun.c @@ -73,7 +73,6 @@ extern void PyLong_Fini(void); extern int _PyFaulthandler_Init(void); extern void _PyFaulthandler_Fini(void); -extern void _PyRandom_Init(void); #ifdef WITH_THREAD extern void _PyGILState_Init(PyInterpreterState *, PyThreadState *); -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Feb 21 19:17:52 2012 From: python-checkins at python.org (antoine.pitrou) Date: Tue, 21 Feb 2012 19:17:52 +0100 Subject: [Python-checkins] =?utf8?q?cpython=3A_Add_a_test_that_memoryviews?= =?utf8?q?_have_hash_randomization_enabled=2E?= Message-ID: http://hg.python.org/cpython/rev/711fd3aa739c changeset: 75144:711fd3aa739c user: Antoine Pitrou date: Tue Feb 21 19:14:26 2012 +0100 summary: Add a test that memoryviews have hash randomization enabled. files: Lib/test/test_hash.py | 6 ++++++ 1 files changed, 6 insertions(+), 0 deletions(-) diff --git a/Lib/test/test_hash.py b/Lib/test/test_hash.py --- a/Lib/test/test_hash.py +++ b/Lib/test/test_hash.py @@ -186,6 +186,12 @@ 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_ -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Feb 21 19:21:36 2012 From: python-checkins at python.org (antoine.pitrou) Date: Tue, 21 Feb 2012 19:21:36 +0100 Subject: [Python-checkins] =?utf8?q?cpython=3A_Actually_run_the_new_tests?= =?utf8?q?=2E?= Message-ID: http://hg.python.org/cpython/rev/c7673a1ee08d changeset: 75145:c7673a1ee08d user: Antoine Pitrou date: Tue Feb 21 19:18:10 2012 +0100 summary: Actually run the new tests. files: Lib/test/test_hash.py | 1 + 1 files changed, 1 insertions(+), 0 deletions(-) diff --git a/Lib/test/test_hash.py b/Lib/test/test_hash.py --- a/Lib/test/test_hash.py +++ b/Lib/test/test_hash.py @@ -212,6 +212,7 @@ HashBuiltinsTestCase, StrHashRandomizationTests, BytesHashRandomizationTests, + MemoryviewHashRandomizationTests, DatetimeDateTests, DatetimeDatetimeTests, DatetimeTimeTests) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Feb 21 19:55:03 2012 From: python-checkins at python.org (martin.v.loewis) Date: Tue, 21 Feb 2012 19:55:03 +0100 Subject: [Python-checkins] =?utf8?q?cpython=3A_Issue_=2312406=3A_Update_li?= =?utf8?q?st_of_files=2E?= Message-ID: http://hg.python.org/cpython/rev/75990a013d4d changeset: 75146:75990a013d4d user: Martin v. L?wis date: Tue Feb 21 19:54:26 2012 +0100 summary: Issue #12406: Update list of files. files: Tools/msi/msi.py | 50 ++++++++++++++++++++++++++++++----- 1 files changed, 43 insertions(+), 7 deletions(-) diff --git a/Tools/msi/msi.py b/Tools/msi/msi.py --- a/Tools/msi/msi.py +++ b/Tools/msi/msi.py @@ -85,11 +85,11 @@ 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 +100,8 @@ '_ctypes_test.pyd', '_sqlite3.pyd', '_hashlib.pyd', - '_multiprocessing.pyd' + '_multiprocessing.pyd', + '_lzma.pyd' ] # Well-known component UUIDs @@ -912,6 +913,21 @@ print "Warning: Unpackaged files in %s" % self.absolute print self.unpackaged_files + +def inside_test(dir): + if dir.physical in ('test', 'tests'): + return True + if dir.basedir: + return inside_test(dir.basedir) + return False + +def in_packaging_tests(dir): + if dir.physical == 'tests' and dir.basedir.physical == 'packaging': + return True + if dir.basedir: + return in_packaging_tests(dir.basedir) + return False + # See "File Table", "Component Table", "Directory Table", # "FeatureComponents Table" def add_files(db): @@ -987,11 +1003,7 @@ if not have_tcl: continue tcltk.set_current() - elif dir in ['test', 'tests', 'data', 'output']: - # test: Lib, Lib/email, Lib/ctypes, Lib/sqlite3 - # tests: Lib/distutils - # data: Lib/email/test - # output: Lib/test + elif dir in ('test', 'tests') or inside_test(parent): testsuite.set_current() elif not have_ctypes and dir == "ctypes": continue @@ -1028,6 +1040,7 @@ lib.glob("cfgparser.*") lib.add_file("zip_cp437_header.zip") lib.add_file("zipdir.zip") + lib.add_file("mime.types") if dir=='capath': lib.glob("*.0") if dir=='tests' and parent.physical=='distutils': @@ -1060,6 +1073,25 @@ lib.add_file("turtle.cfg") if dir=="pydoc_data": lib.add_file("_pydoc.css") + if dir.endswith('.dist-info'): + lib.add_file('INSTALLER') + lib.add_file('REQUESTED') + lib.add_file('RECORD') + lib.add_file('METADATA') + lib.glob('RESOURCES') + if dir.endswith('.egg-info') or dir == 'EGG-INFO': + lib.add_file('PKG-INFO') + if in_packaging_tests(parent): + lib.glob('*.html') + lib.glob('*.tar.gz') + if dir=='fake_dists': + # cannot use glob since there are also egg-info directories here + lib.add_file('cheese-2.0.2.egg-info') + lib.add_file('nut-funkyversion.egg-info') + lib.add_file('strawberry-0.6.egg') + lib.add_file('truffles-5.0.egg-info') + lib.add_file('babar.cfg') + lib.add_file('babar.png') if dir=="data" and parent.physical=="test_email": # This should contain all non-.svn files listed in subversion for f in os.listdir(lib.absolute): @@ -1068,6 +1100,10 @@ lib.add_file(f) else: print("WARNING: New file %s in test/test_email/data" % f) + if dir=='tests' and parent.physical == 'packaging': + lib.add_file('SETUPTOOLS-PKG-INFO2') + lib.add_file('SETUPTOOLS-PKG-INFO') + lib.add_file('PKG-INFO') for f in os.listdir(lib.absolute): if os.path.isdir(os.path.join(lib.absolute, f)): pydirs.append((lib, f)) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Feb 21 20:46:14 2012 From: python-checkins at python.org (antoine.pitrou) Date: Tue, 21 Feb 2012 20:46:14 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=282=2E7=29=3A_Fix_crash_at_st?= =?utf8?q?artup_with_-W_options=2E?= Message-ID: http://hg.python.org/cpython/rev/0abffbe7cf22 changeset: 75147:0abffbe7cf22 branch: 2.7 parent: 75140:e78acdb54841 user: Antoine Pitrou date: Tue Feb 21 20:42:48 2012 +0100 summary: Fix crash at startup with -W options. files: Include/pygetopt.h | 1 + Include/pythonrun.h | 1 + Modules/main.c | 30 ++++++++++++++++++++++++++++-- Python/getopt.c | 10 +++++++++- Python/pythonrun.c | 1 - 5 files changed, 39 insertions(+), 4 deletions(-) diff --git a/Include/pygetopt.h b/Include/pygetopt.h --- a/Include/pygetopt.h +++ b/Include/pygetopt.h @@ -9,6 +9,7 @@ PyAPI_DATA(int) _PyOS_optind; PyAPI_DATA(char *) _PyOS_optarg; +PyAPI_FUNC(void) _PyOS_ResetGetOpt(void); PyAPI_FUNC(int) _PyOS_GetOpt(int argc, char **argv, char *optstring); #ifdef __cplusplus diff --git a/Include/pythonrun.h b/Include/pythonrun.h --- a/Include/pythonrun.h +++ b/Include/pythonrun.h @@ -128,6 +128,7 @@ PyAPI_FUNC(int) _PyLong_Init(void); PyAPI_FUNC(void) _PyFloat_Init(void); PyAPI_FUNC(int) PyByteArray_Init(void); +PyAPI_FUNC(void) _PyRandom_Init(void); /* Various internal finalizers */ PyAPI_FUNC(void) _PyExc_Fini(void); diff --git a/Modules/main.c b/Modules/main.c --- a/Modules/main.c +++ b/Modules/main.c @@ -262,7 +262,33 @@ Py_RISCOSWimpFlag = 0; #endif + /* Hash randomization needed early for all string operations + (including -W and -X options). */ + while ((c = _PyOS_GetOpt(argc, argv, PROGRAM_OPTS)) != EOF) { + if (c == 'm' || c == 'c') { + /* -c / -m is the last option: following arguments are + not interpreter options. */ + break; + } + switch (c) { + case '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; + + _PyRandom_Init(); + PySys_ResetWarnOptions(); + _PyOS_ResetGetOpt(); while ((c = _PyOS_GetOpt(argc, argv, PROGRAM_OPTS)) != EOF) { if (c == 'c') { @@ -356,7 +382,7 @@ break; case 'E': - Py_IgnoreEnvironmentFlag++; + /* Already handled above */ break; case 't': @@ -406,7 +432,7 @@ break; case 'R': - Py_HashRandomizationFlag++; + /* Already handled above */ break; /* This space reserved for other options */ diff --git a/Python/getopt.c b/Python/getopt.c --- a/Python/getopt.c +++ b/Python/getopt.c @@ -37,10 +37,18 @@ int _PyOS_opterr = 1; /* generate error messages */ int _PyOS_optind = 1; /* index into argv array */ char *_PyOS_optarg = NULL; /* optional argument */ +static char *opt_ptr = ""; + +void _PyOS_ResetGetOpt(void) +{ + _PyOS_opterr = 1; + _PyOS_optind = 1; + _PyOS_optarg = NULL; + opt_ptr = ""; +} int _PyOS_GetOpt(int argc, char **argv, char *optstring) { - static char *opt_ptr = ""; char *ptr; int option; diff --git a/Python/pythonrun.c b/Python/pythonrun.c --- a/Python/pythonrun.c +++ b/Python/pythonrun.c @@ -67,7 +67,6 @@ static void call_ll_exitfuncs(void); extern void _PyUnicode_Init(void); extern void _PyUnicode_Fini(void); -extern void _PyRandom_Init(void); #ifdef WITH_THREAD extern void _PyGILState_Init(PyInterpreterState *, PyThreadState *); -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Feb 21 20:56:22 2012 From: python-checkins at python.org (antoine.pitrou) Date: Tue, 21 Feb 2012 20:56:22 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=282=2E6=29=3A_Fix_crash_at_st?= =?utf8?q?artup_with_-W_options=2E?= Message-ID: http://hg.python.org/cpython/rev/76d72e92fdea changeset: 75148:76d72e92fdea branch: 2.6 parent: 75134:54a78290a75d user: Antoine Pitrou date: Tue Feb 21 20:42:48 2012 +0100 summary: Fix crash at startup with -W options. files: Include/pygetopt.h | 1 + Include/pythonrun.h | 1 + Modules/main.c | 30 ++++++++++++++++++++++++++++-- Python/getopt.c | 10 +++++++++- Python/pythonrun.c | 1 - 5 files changed, 39 insertions(+), 4 deletions(-) diff --git a/Include/pygetopt.h b/Include/pygetopt.h --- a/Include/pygetopt.h +++ b/Include/pygetopt.h @@ -9,6 +9,7 @@ PyAPI_DATA(int) _PyOS_optind; PyAPI_DATA(char *) _PyOS_optarg; +PyAPI_FUNC(void) _PyOS_ResetGetOpt(void); PyAPI_FUNC(int) _PyOS_GetOpt(int argc, char **argv, char *optstring); #ifdef __cplusplus diff --git a/Include/pythonrun.h b/Include/pythonrun.h --- a/Include/pythonrun.h +++ b/Include/pythonrun.h @@ -125,6 +125,7 @@ PyAPI_FUNC(int) _PyInt_Init(void); PyAPI_FUNC(void) _PyFloat_Init(void); PyAPI_FUNC(int) PyByteArray_Init(void); +PyAPI_FUNC(void) _PyRandom_Init(void); /* Various internal finalizers */ PyAPI_FUNC(void) _PyExc_Fini(void); diff --git a/Modules/main.c b/Modules/main.c --- a/Modules/main.c +++ b/Modules/main.c @@ -261,7 +261,33 @@ Py_RISCOSWimpFlag = 0; #endif + /* Hash randomization needed early for all string operations + (including -W and -X options). */ + while ((c = _PyOS_GetOpt(argc, argv, PROGRAM_OPTS)) != EOF) { + if (c == 'm' || c == 'c') { + /* -c / -m is the last option: following arguments are + not interpreter options. */ + break; + } + switch (c) { + case '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; + + _PyRandom_Init(); + PySys_ResetWarnOptions(); + _PyOS_ResetGetOpt(); while ((c = _PyOS_GetOpt(argc, argv, PROGRAM_OPTS)) != EOF) { if (c == 'c') { @@ -355,7 +381,7 @@ break; case 'E': - Py_IgnoreEnvironmentFlag++; + /* Already handled above */ break; case 't': @@ -405,7 +431,7 @@ break; case 'R': - Py_HashRandomizationFlag++; + /* Already handled above */ break; /* This space reserved for other options */ diff --git a/Python/getopt.c b/Python/getopt.c --- a/Python/getopt.c +++ b/Python/getopt.c @@ -37,10 +37,18 @@ int _PyOS_opterr = 1; /* generate error messages */ int _PyOS_optind = 1; /* index into argv array */ char *_PyOS_optarg = NULL; /* optional argument */ +static char *opt_ptr = ""; + +void _PyOS_ResetGetOpt(void) +{ + _PyOS_opterr = 1; + _PyOS_optind = 1; + _PyOS_optarg = NULL; + opt_ptr = ""; +} int _PyOS_GetOpt(int argc, char **argv, char *optstring) { - static char *opt_ptr = ""; char *ptr; int option; diff --git a/Python/pythonrun.c b/Python/pythonrun.c --- a/Python/pythonrun.c +++ b/Python/pythonrun.c @@ -67,7 +67,6 @@ static void call_ll_exitfuncs(void); extern void _PyUnicode_Init(void); extern void _PyUnicode_Fini(void); -extern void _PyRandom_Init(void); #ifdef WITH_THREAD extern void _PyGILState_Init(PyInterpreterState *, PyThreadState *); -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Feb 21 20:56:22 2012 From: python-checkins at python.org (antoine.pitrou) Date: Tue, 21 Feb 2012 20:56:22 +0100 Subject: [Python-checkins] =?utf8?b?Y3B5dGhvbiAobWVyZ2UgMi42IC0+IDIuNyk6?= =?utf8?q?_Null_merge?= Message-ID: http://hg.python.org/cpython/rev/f9fdf519bca5 changeset: 75149:f9fdf519bca5 branch: 2.7 parent: 75147:0abffbe7cf22 parent: 75148:76d72e92fdea user: Antoine Pitrou date: Tue Feb 21 20:52:54 2012 +0100 summary: Null merge files: -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Feb 21 21:09:15 2012 From: python-checkins at python.org (benjamin.peterson) Date: Tue, 21 Feb 2012 21:09:15 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=282=2E6=29=3A_don=27t_need_th?= =?utf8?q?is_hack_anymore?= Message-ID: http://hg.python.org/cpython/rev/6075df248b90 changeset: 75150:6075df248b90 branch: 2.6 parent: 75148:76d72e92fdea user: Benjamin Peterson date: Tue Feb 21 15:08:51 2012 -0500 summary: don't need this hack anymore files: Modules/main.c | 6 ------ 1 files changed, 0 insertions(+), 6 deletions(-) diff --git a/Modules/main.c b/Modules/main.c --- a/Modules/main.c +++ b/Modules/main.c @@ -422,12 +422,6 @@ case 'W': PySys_AddWarnOption(_PyOS_optarg); - /* Extremely obscure hack: if _PyOS_optarg was one character, - PyString_FromString in PySys_AddWarnOption will try to intern - it. This is bad because hash randomization has not been setup - yet, so the string will get the wrong hash. The following call - will cause all the cached characters to be released. */ - PyString_Fini(); break; case 'R': -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Feb 21 21:09:18 2012 From: python-checkins at python.org (benjamin.peterson) Date: Tue, 21 Feb 2012 21:09:18 +0100 Subject: [Python-checkins] =?utf8?b?Y3B5dGhvbiAobWVyZ2UgMi42IC0+IDIuNyk6?= =?utf8?q?_merge_2=2E6?= Message-ID: http://hg.python.org/cpython/rev/b1a02c17b327 changeset: 75151:b1a02c17b327 branch: 2.7 parent: 75149:f9fdf519bca5 parent: 75150:6075df248b90 user: Benjamin Peterson date: Tue Feb 21 15:09:08 2012 -0500 summary: merge 2.6 files: Modules/main.c | 6 ------ 1 files changed, 0 insertions(+), 6 deletions(-) diff --git a/Modules/main.c b/Modules/main.c --- a/Modules/main.c +++ b/Modules/main.c @@ -423,12 +423,6 @@ case 'W': PySys_AddWarnOption(_PyOS_optarg); - /* Extremely obscure hack: if _PyOS_optarg was one character, - PyString_FromString in PySys_AddWarnOption will try to intern - it. This is bad because hash randomization has not been setup - yet, so the string will get the wrong hash. The following call - will cause all the cached characters to be released. */ - PyString_Fini(); break; case 'R': -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Feb 21 22:08:11 2012 From: python-checkins at python.org (benjamin.peterson) Date: Tue, 21 Feb 2012 22:08:11 +0100 Subject: [Python-checkins] =?utf8?q?cpython=3A_enable_hash_randomization_b?= =?utf8?q?y_default?= Message-ID: http://hg.python.org/cpython/rev/198e31774f0f changeset: 75152:198e31774f0f parent: 75146:75990a013d4d user: Benjamin Peterson date: Tue Feb 21 16:08:05 2012 -0500 summary: enable hash randomization by default files: Doc/reference/datamodel.rst | 24 +++++++++++++++++++++++- Doc/using/cmdline.rst | 10 ++++------ Lib/test/test_cmd_line.py | 4 ++-- Lib/test/test_hash.py | 4 ++-- Misc/NEWS | 7 +++---- Misc/python.man | 23 +++-------------------- Modules/main.c | 25 +++++++------------------ Python/random.c | 11 ----------- Tools/scripts/run_tests.py | 1 - 9 files changed, 44 insertions(+), 65 deletions(-) diff --git a/Doc/reference/datamodel.rst b/Doc/reference/datamodel.rst --- a/Doc/reference/datamodel.rst +++ b/Doc/reference/datamodel.rst @@ -1277,7 +1277,29 @@ inheritance of :meth:`__hash__` will be blocked, just as if :attr:`__hash__` had been explicitly set to :const:`None`. - See also the :option:`-R` command-line option. + + .. note:: + + 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 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. + + See also :envvar:`PYTHONHASHSEED`. + + .. versionchanged:: 3.3 + Hash randomization is enabled by default. .. method:: object.__bool__(self) diff --git a/Doc/using/cmdline.rst b/Doc/using/cmdline.rst --- a/Doc/using/cmdline.rst +++ b/Doc/using/cmdline.rst @@ -24,7 +24,7 @@ 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:: @@ -486,9 +486,8 @@ .. 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 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 @@ -499,8 +498,7 @@ 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 diff --git a/Lib/test/test_cmd_line.py b/Lib/test/test_cmd_line.py --- a/Lib/test/test_cmd_line.py +++ b/Lib/test/test_cmd_line.py @@ -330,14 +330,14 @@ 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_hash.py b/Lib/test/test_hash.py --- a/Lib/test/test_hash.py +++ b/Lib/test/test_hash.py @@ -159,8 +159,8 @@ 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) diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -18,10 +18,9 @@ - Issue #14051: Allow arbitrary attributes to be set of classmethod and staticmethod. -- 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 #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 #13020: Fix a reference leak when allocating a structsequence object fails. Patch by Suman Saha. diff --git a/Misc/python.man b/Misc/python.man --- a/Misc/python.man +++ b/Misc/python.man @@ -37,9 +37,6 @@ .B \-OO ] [ -.B \-R -] -[ .B \-s ] [ @@ -151,18 +148,6 @@ 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 insertion, O(n^2) complexity. See -http://www.ocert.org/advisories/ocert-2011-003.html -for details. -.TP .B \-s Don't add user site directory to sys.path. .TP @@ -418,9 +403,8 @@ 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 @@ -429,8 +413,7 @@ 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/Modules/main.c b/Modules/main.c --- a/Modules/main.c +++ b/Modules/main.c @@ -73,9 +73,6 @@ -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\ "; @@ -107,10 +104,10 @@ "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 :option:`-R` option: a random value is used to seed the\n\ - hashes of 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 @@ -347,21 +344,13 @@ 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(); @@ -468,7 +457,7 @@ break; case 'R': - /* Already handled above */ + /* Ignored */ break; /* This space reserved for other options */ diff --git a/Python/random.c b/Python/random.c --- a/Python/random.c +++ b/Python/random.c @@ -257,17 +257,6 @@ _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/Tools/scripts/run_tests.py b/Tools/scripts/run_tests.py --- a/Tools/scripts/run_tests.py +++ b/Tools/scripts/run_tests.py @@ -25,7 +25,6 @@ '-W', 'default', # Warnings set to 'default' '-bb', # Warnings about bytes/bytearray '-E', # Ignore environment variables - '-R', # Randomize hashing ] # Allow user-specified interpreter options to override our defaults. args.extend(test.support.args_from_interpreter_flags()) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Feb 21 22:09:11 2012 From: python-checkins at python.org (antoine.pitrou) Date: Tue, 21 Feb 2012 22:09:11 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=282=2E7=29=3A_Fix_flaky_os=2E?= =?utf8?q?urandom_test=2E?= Message-ID: http://hg.python.org/cpython/rev/9b7c6dd19e25 changeset: 75153:9b7c6dd19e25 branch: 2.7 parent: 75151:b1a02c17b327 user: Antoine Pitrou date: Tue Feb 21 22:02:04 2012 +0100 summary: Fix flaky os.urandom test. files: Lib/test/test_os.py | 7 ++++--- 1 files changed, 4 insertions(+), 3 deletions(-) diff --git a/Lib/test/test_os.py b/Lib/test/test_os.py --- a/Lib/test/test_os.py +++ b/Lib/test/test_os.py @@ -545,12 +545,13 @@ 'import os, sys', 'data = os.urandom(%s)' % count, 'sys.stdout.write(data)', - 'sys.stdout.flush()')) + 'sys.stdout.flush()', + 'print >> sys.stderr, (len(data), data)')) cmd_line = [sys.executable, '-c', code] p = subprocess.Popen(cmd_line, stdin=subprocess.PIPE, - stdout=subprocess.PIPE, stderr=subprocess.STDOUT) + stdout=subprocess.PIPE, stderr=subprocess.PIPE) out, err = p.communicate() - out = test_support.strip_python_stderr(out) + self.assertEqual(p.wait(), 0, (p.wait(), err)) self.assertEqual(len(out), count) return out -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Feb 21 22:10:21 2012 From: python-checkins at python.org (victor.stinner) Date: Tue, 21 Feb 2012 22:10:21 +0100 Subject: [Python-checkins] =?utf8?q?cpython=3A_site=3A_don=27t_import_trac?= =?utf8?q?eback_at_startup_to_speed_up_Python_startup?= Message-ID: http://hg.python.org/cpython/rev/524a032c8e0f changeset: 75154:524a032c8e0f parent: 75152:198e31774f0f user: Victor Stinner date: Tue Feb 21 22:10:16 2012 +0100 summary: site: don't import traceback at startup to speed up Python startup files: Lib/site.py | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Lib/site.py b/Lib/site.py --- a/Lib/site.py +++ b/Lib/site.py @@ -55,7 +55,6 @@ import sys import os import builtins -import traceback # Prefixes for site-packages; add additional prefixes like /usr/local here PREFIXES = [sys.prefix, sys.exec_prefix] @@ -157,6 +156,7 @@ 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) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Feb 21 22:37:30 2012 From: python-checkins at python.org (georg.brandl) Date: Tue, 21 Feb 2012 22:37:30 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=283=2E1=29=3A_Remove_reST_mar?= =?utf8?q?kup_from_--help_output=2E__Also=3A_O=28n**2=29_is_dict_construct?= =?utf8?q?ion=2C_not?= Message-ID: http://hg.python.org/cpython/rev/358aee0a9ad5 changeset: 75155:358aee0a9ad5 branch: 3.1 parent: 75127:160a56eac332 user: Georg Brandl date: Tue Feb 21 22:36:27 2012 +0100 summary: Remove reST markup from --help output. Also: O(n**2) is dict construction, not single insertion. files: Doc/using/cmdline.rst | 2 +- Misc/python.man | 2 +- Modules/main.c | 6 +++--- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Doc/using/cmdline.rst b/Doc/using/cmdline.rst --- a/Doc/using/cmdline.rst +++ b/Doc/using/cmdline.rst @@ -224,7 +224,7 @@ 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 + construction, O(n^2) complexity. See http://www.ocert.org/advisories/ocert-2011-003.html for details. Changing hash values affects the order in which keys are retrieved from a diff --git a/Misc/python.man b/Misc/python.man --- a/Misc/python.man +++ b/Misc/python.man @@ -156,7 +156,7 @@ .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 insertion, O(n^2) complexity. See +of a dict construction, O(n^2) complexity. See http://www.ocert.org/advisories/ocert-2011-003.html for details. .TP diff --git a/Modules/main.c b/Modules/main.c --- a/Modules/main.c +++ b/Modules/main.c @@ -103,9 +103,9 @@ PYTHONIOENCODING: Encoding[:errors] used for stdin/stdout/stderr.\n\ "; static char *usage_6 = "\ -PYTHONHASHSEED: if this variable is set to ``random``, the effect is the same \n\ - as specifying the :option:`-R` option: a random value is used to seed the\n\ - hashes of str, bytes and datetime objects. It can also be set to an integer\n\ +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\ "; -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Feb 21 22:37:30 2012 From: python-checkins at python.org (georg.brandl) Date: Tue, 21 Feb 2012 22:37:30 +0100 Subject: [Python-checkins] =?utf8?b?Y3B5dGhvbiAobWVyZ2UgMy4xIC0+IDMuMik6?= =?utf8?q?_merge_with_3=2E2?= Message-ID: http://hg.python.org/cpython/rev/e832ffd0388f changeset: 75156:e832ffd0388f branch: 3.2 parent: 75142:0e8bd4785ea0 parent: 75155:358aee0a9ad5 user: Georg Brandl date: Tue Feb 21 22:36:37 2012 +0100 summary: merge with 3.2 files: Doc/using/cmdline.rst | 2 +- Misc/python.man | 2 +- Modules/main.c | 6 +++--- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Doc/using/cmdline.rst b/Doc/using/cmdline.rst --- a/Doc/using/cmdline.rst +++ b/Doc/using/cmdline.rst @@ -236,7 +236,7 @@ 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 + construction, O(n^2) complexity. See http://www.ocert.org/advisories/ocert-2011-003.html for details. Changing hash values affects the order in which keys are retrieved from a diff --git a/Misc/python.man b/Misc/python.man --- a/Misc/python.man +++ b/Misc/python.man @@ -163,7 +163,7 @@ .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 insertion, O(n^2) complexity. See +of a dict construction, O(n^2) complexity. See http://www.ocert.org/advisories/ocert-2011-003.html for details. .TP diff --git a/Modules/main.c b/Modules/main.c --- a/Modules/main.c +++ b/Modules/main.c @@ -105,9 +105,9 @@ "PYTHONIOENCODING: Encoding[:errors] used for stdin/stdout/stderr.\n\ "; static char *usage_6 = "\ -PYTHONHASHSEED: if this variable is set to ``random``, the effect is the same \n\ - as specifying the :option:`-R` option: a random value is used to seed the\n\ - hashes of str, bytes and datetime objects. It can also be set to an integer\n\ +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\ "; -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Feb 21 22:37:31 2012 From: python-checkins at python.org (georg.brandl) Date: Tue, 21 Feb 2012 22:37:31 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_3=2E2_-=3E_default=29?= =?utf8?q?=3A_merge_with_3=2E2?= Message-ID: http://hg.python.org/cpython/rev/69259657d5c2 changeset: 75157:69259657d5c2 parent: 75154:524a032c8e0f parent: 75156:e832ffd0388f user: Georg Brandl date: Tue Feb 21 22:37:36 2012 +0100 summary: merge with 3.2 files: Doc/using/cmdline.rst | 2 +- Modules/main.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Doc/using/cmdline.rst b/Doc/using/cmdline.rst --- a/Doc/using/cmdline.rst +++ b/Doc/using/cmdline.rst @@ -236,7 +236,7 @@ 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 + construction, O(n^2) complexity. See http://www.ocert.org/advisories/ocert-2011-003.html for details. Changing hash values affects the order in which keys are retrieved from a diff --git a/Modules/main.c b/Modules/main.c --- a/Modules/main.c +++ b/Modules/main.c @@ -104,7 +104,7 @@ "PYTHONFAULTHANDLER: dump the Python traceback on fatal errors.\n\ "; static char *usage_6 = "\ -PYTHONHASHSEED: if this variable is set to ``random``, a random value is used\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\ -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Feb 21 22:38:48 2012 From: python-checkins at python.org (georg.brandl) Date: Tue, 21 Feb 2012 22:38:48 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=282=2E6=29=3A_Remove_reST_mar?= =?utf8?q?kup_from_--help_output=2E__Also=3A_O=28n**2=29_is_dict_construct?= =?utf8?q?ion=2C_not?= Message-ID: http://hg.python.org/cpython/rev/65d1fe86618f changeset: 75158:65d1fe86618f branch: 2.6 parent: 75150:6075df248b90 user: Georg Brandl date: Tue Feb 21 22:36:27 2012 +0100 summary: Remove reST markup from --help output. Also: O(n**2) is dict construction, not single insertion. files: Doc/using/cmdline.rst | 2 +- Misc/python.man | 2 +- Modules/main.c | 6 +++--- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Doc/using/cmdline.rst b/Doc/using/cmdline.rst --- a/Doc/using/cmdline.rst +++ b/Doc/using/cmdline.rst @@ -248,7 +248,7 @@ 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 + construction, O(n^2) complexity. See http://www.ocert.org/advisories/ocert-2011-003.html for details. Changing hash values affects the order in which keys are retrieved from a diff --git a/Misc/python.man b/Misc/python.man --- a/Misc/python.man +++ b/Misc/python.man @@ -162,7 +162,7 @@ .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 insertion, O(n^2) complexity. See +of a dict construction, O(n^2) complexity. See http://www.ocert.org/advisories/ocert-2011-003.html for details. .TP diff --git a/Modules/main.c b/Modules/main.c --- a/Modules/main.c +++ b/Modules/main.c @@ -105,9 +105,9 @@ PYTHONIOENCODING: Encoding[:errors] used for stdin/stdout/stderr.\n\ "; static char *usage_6 = "\ -PYTHONHASHSEED: if this variable is set to ``random``, the effect is the same \n\ - as specifying the :option:`-R` option: a random value is used to seed the\n\ - hashes of str, bytes and datetime objects. It can also be set to an integer\n\ +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\ "; -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Feb 21 22:38:48 2012 From: python-checkins at python.org (georg.brandl) Date: Tue, 21 Feb 2012 22:38:48 +0100 Subject: [Python-checkins] =?utf8?b?Y3B5dGhvbiAobWVyZ2UgMi42IC0+IDIuNyk6?= =?utf8?q?_merge_with_2=2E6?= Message-ID: http://hg.python.org/cpython/rev/f3e2a9d25ffa changeset: 75159:f3e2a9d25ffa branch: 2.7 parent: 75153:9b7c6dd19e25 parent: 75158:65d1fe86618f user: Georg Brandl date: Tue Feb 21 22:38:31 2012 +0100 summary: merge with 2.6 files: Doc/using/cmdline.rst | 2 +- Misc/python.man | 2 +- Modules/main.c | 6 +++--- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Doc/using/cmdline.rst b/Doc/using/cmdline.rst --- a/Doc/using/cmdline.rst +++ b/Doc/using/cmdline.rst @@ -262,7 +262,7 @@ 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 + construction, O(n^2) complexity. See http://www.ocert.org/advisories/ocert-2011-003.html for details. Changing hash values affects the order in which keys are retrieved from a diff --git a/Misc/python.man b/Misc/python.man --- a/Misc/python.man +++ b/Misc/python.man @@ -162,7 +162,7 @@ .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 insertion, O(n^2) complexity. See +of a dict construction, O(n^2) complexity. See http://www.ocert.org/advisories/ocert-2011-003.html for details. .TP diff --git a/Modules/main.c b/Modules/main.c --- a/Modules/main.c +++ b/Modules/main.c @@ -106,9 +106,9 @@ PYTHONIOENCODING: Encoding[:errors] used for stdin/stdout/stderr.\n\ "; static char *usage_6 = "\ -PYTHONHASHSEED: if this variable is set to ``random``, the effect is the same \n\ - as specifying the :option:`-R` option: a random value is used to seed the\n\ - hashes of str, bytes and datetime objects. It can also be set to an integer\n\ +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\ "; -- Repository URL: http://hg.python.org/cpython From ncoghlan at gmail.com Tue Feb 21 23:49:02 2012 From: ncoghlan at gmail.com (Nick Coghlan) Date: Wed, 22 Feb 2012 08:49:02 +1000 Subject: [Python-checkins] cpython (2.6): ensure no one tries to hash things before the random seed is found In-Reply-To: References: Message-ID: On Wed, Feb 22, 2012 at 2:24 AM, benjamin.peterson wrote: > http://hg.python.org/cpython/rev/357e268e7c5f > changeset: ? 75133:357e268e7c5f > branch: ? ? ?2.6 > parent: ? ? ?75124:04738f35e0ec > user: ? ? ? ?Benjamin Peterson > date: ? ? ? ?Tue Feb 21 11:08:50 2012 -0500 > summary: > ?ensure no one tries to hash things before the random seed is found Won't this trigger in the -Wd case that led to the PyStr_Fini workaround? Cheers, Nick. -- Nick Coghlan?? |?? ncoghlan at gmail.com?? |?? Brisbane, Australia From ncoghlan at gmail.com Tue Feb 21 23:51:46 2012 From: ncoghlan at gmail.com (Nick Coghlan) Date: Wed, 22 Feb 2012 08:51:46 +1000 Subject: [Python-checkins] cpython (2.6): ensure no one tries to hash things before the random seed is found In-Reply-To: References: Message-ID: On Wed, Feb 22, 2012 at 8:49 AM, Nick Coghlan wrote: > Won't this trigger in the -Wd case that led to the PyStr_Fini workaround? Never mind, just saw the later series of checkins that fixed it. Cheers, Nick. -- Nick Coghlan?? |?? ncoghlan at gmail.com?? |?? Brisbane, Australia From ncoghlan at gmail.com Tue Feb 21 23:53:39 2012 From: ncoghlan at gmail.com (Nick Coghlan) Date: Wed, 22 Feb 2012 08:53:39 +1000 Subject: [Python-checkins] cpython: enable hash randomization by default In-Reply-To: References: Message-ID: On Wed, Feb 22, 2012 at 7:08 AM, benjamin.peterson wrote: > + ? ? ?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. That last sentence needs to change for 3.3 Cheers, Nick. -- Nick Coghlan?? |?? ncoghlan at gmail.com?? |?? Brisbane, Australia From python-checkins at python.org Wed Feb 22 00:03:30 2012 From: python-checkins at python.org (benjamin.peterson) Date: Wed, 22 Feb 2012 00:03:30 +0100 Subject: [Python-checkins] =?utf8?q?cpython=3A_remove_unapplicable_stateme?= =?utf8?q?nt?= Message-ID: http://hg.python.org/cpython/rev/aafa41fb7061 changeset: 75160:aafa41fb7061 parent: 75157:69259657d5c2 user: Benjamin Peterson date: Tue Feb 21 18:03:26 2012 -0500 summary: remove unapplicable statement files: Doc/reference/datamodel.rst | 6 ++---- 1 files changed, 2 insertions(+), 4 deletions(-) diff --git a/Doc/reference/datamodel.rst b/Doc/reference/datamodel.rst --- a/Doc/reference/datamodel.rst +++ b/Doc/reference/datamodel.rst @@ -1291,10 +1291,8 @@ http://www.ocert.org/advisories/ocert-2011-003.html for details. 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. + dict. Note Python has never made guarantees about this ordering (and it + typically varies between 32-bit and 64-bit builds). See also :envvar:`PYTHONHASHSEED`. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Feb 22 00:32:14 2012 From: python-checkins at python.org (antoine.pitrou) Date: Wed, 22 Feb 2012 00:32:14 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=282=2E7=29=3A_Avoid_py3k_warn?= =?utf8?q?ings_related_to_sort=28=29_of_unrelated_types=2E?= Message-ID: http://hg.python.org/cpython/rev/48a91063890c changeset: 75161:48a91063890c branch: 2.7 parent: 75159:f3e2a9d25ffa user: Antoine Pitrou date: Wed Feb 22 00:28:46 2012 +0100 summary: Avoid py3k warnings related to sort() of unrelated types. files: Lib/test/mapping_tests.py | 10 +++++++--- 1 files changed, 7 insertions(+), 3 deletions(-) diff --git a/Lib/test/mapping_tests.py b/Lib/test/mapping_tests.py --- a/Lib/test/mapping_tests.py +++ b/Lib/test/mapping_tests.py @@ -209,8 +209,12 @@ d.update(SimpleUserDict()) i1 = d.items() i2 = self.reference.items() - i1.sort() - i2.sort() + + def safe_sort_key(kv): + k, v = kv + return id(type(k)), id(type(v)), k, v + i1.sort(key=safe_sort_key) + i2.sort(key=safe_sort_key) self.assertEqual(i1, i2) class Exc(Exception): pass @@ -343,7 +347,7 @@ self.assertTrue(not d.has_key('a')) d = self._full_mapping({'a': 1, 'b': 2}) k = d.keys() - k.sort() + k.sort(key=lambda k: (id(type(k)), k)) self.assertEqual(k, ['a', 'b']) self.assertRaises(TypeError, d.has_key) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Feb 22 01:15:02 2012 From: python-checkins at python.org (antoine.pitrou) Date: Wed, 22 Feb 2012 01:15:02 +0100 Subject: [Python-checkins] =?utf8?q?cpython=3A_Try_to_debug_sporadic_test_?= =?utf8?q?failures?= Message-ID: http://hg.python.org/cpython/rev/f5119adb0bd4 changeset: 75162:f5119adb0bd4 parent: 75160:aafa41fb7061 user: Antoine Pitrou date: Wed Feb 22 01:11:31 2012 +0100 summary: Try to debug sporadic test failures files: Lib/test/test_imp.py | 7 +++++-- 1 files changed, 5 insertions(+), 2 deletions(-) diff --git a/Lib/test/test_imp.py b/Lib/test/test_imp.py --- a/Lib/test/test_imp.py +++ b/Lib/test/test_imp.py @@ -325,12 +325,15 @@ self.addCleanup(cleanup) # Touch the __init__.py file. support.create_empty_file('pep3147/__init__.py') + expected___file__ = os.sep.join(('.', 'pep3147', '__init__.py')) m = __import__('pep3147') + self.assertEqual(m.__file__, expected___file__, (m.__file__, m.__path__)) # Ensure we load the pyc file. support.forget('pep3147') m = __import__('pep3147') - self.assertEqual(m.__file__, - os.sep.join(('.', 'pep3147', '__init__.py'))) + support.forget('pep3147') + sys.stdout.flush() + self.assertEqual(m.__file__, expected___file__, (m.__file__, m.__path__)) class NullImporterTests(unittest.TestCase): -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Feb 22 02:33:36 2012 From: python-checkins at python.org (antoine.pitrou) Date: Wed, 22 Feb 2012 02:33:36 +0100 Subject: [Python-checkins] =?utf8?q?cpython=3A_unload=28=29_should_be_suff?= =?utf8?q?icient?= Message-ID: http://hg.python.org/cpython/rev/c21d5eebc3ed changeset: 75163:c21d5eebc3ed user: Antoine Pitrou date: Wed Feb 22 02:30:09 2012 +0100 summary: unload() should be sufficient files: Lib/test/test_imp.py | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Lib/test/test_imp.py b/Lib/test/test_imp.py --- a/Lib/test/test_imp.py +++ b/Lib/test/test_imp.py @@ -329,9 +329,9 @@ m = __import__('pep3147') self.assertEqual(m.__file__, expected___file__, (m.__file__, m.__path__)) # Ensure we load the pyc file. - support.forget('pep3147') + support.unload('pep3147') m = __import__('pep3147') - support.forget('pep3147') + support.unload('pep3147') sys.stdout.flush() self.assertEqual(m.__file__, expected___file__, (m.__file__, m.__path__)) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Feb 22 02:50:25 2012 From: python-checkins at python.org (antoine.pitrou) Date: Wed, 22 Feb 2012 02:50:25 +0100 Subject: [Python-checkins] =?utf8?q?cpython=3A_Additional_debug_info_in_ca?= =?utf8?q?se_of_failure?= Message-ID: http://hg.python.org/cpython/rev/e4ef1a398e33 changeset: 75164:e4ef1a398e33 user: Antoine Pitrou date: Wed Feb 22 02:46:58 2012 +0100 summary: Additional debug info in case of failure files: Lib/test/test_imp.py | 3 +-- 1 files changed, 1 insertions(+), 2 deletions(-) diff --git a/Lib/test/test_imp.py b/Lib/test/test_imp.py --- a/Lib/test/test_imp.py +++ b/Lib/test/test_imp.py @@ -332,8 +332,7 @@ support.unload('pep3147') m = __import__('pep3147') support.unload('pep3147') - sys.stdout.flush() - self.assertEqual(m.__file__, expected___file__, (m.__file__, m.__path__)) + self.assertEqual(m.__file__, expected___file__, (m.__file__, m.__path__, sys.path)) class NullImporterTests(unittest.TestCase): -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Feb 22 03:37:24 2012 From: python-checkins at python.org (antoine.pitrou) Date: Wed, 22 Feb 2012 03:37:24 +0100 Subject: [Python-checkins] =?utf8?q?cpython=3A_Fix_=28presumably=29_test?= =?utf8?q?=5Fhash_under_big-endian_systems_=28PPC=29=2E?= Message-ID: http://hg.python.org/cpython/rev/780008020c40 changeset: 75165:780008020c40 user: Antoine Pitrou date: Wed Feb 22 03:33:56 2012 +0100 summary: Fix (presumably) test_hash under big-endian systems (PPC). files: Lib/test/test_hash.py | 10 ++++++++-- 1 files changed, 8 insertions(+), 2 deletions(-) diff --git a/Lib/test/test_hash.py b/Lib/test/test_hash.py --- a/Lib/test/test_hash.py +++ b/Lib/test/test_hash.py @@ -169,9 +169,15 @@ # test a fixed seed for the randomized hash # Note that all types share the same values: if IS_64BIT: - h = -4410911502303878509 + if sys.byteorder == 'little': + h = -4410911502303878509 + else: + h = -3570150969479994130 else: - h = -206076799 + if sys.byteorder == 'little': + h = -206076799 + else: + h = -1024014457 self.assertEqual(self.get_hash(self.repr_, seed=42), h) class StrHashRandomizationTests(StringlikeHashRandomizationTests): -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Feb 22 05:02:25 2012 From: python-checkins at python.org (ross.lagerwall) Date: Wed, 22 Feb 2012 05:02:25 +0100 Subject: [Python-checkins] =?utf8?q?cpython=3A_Fix_sporadic_test=5Fsubproc?= =?utf8?q?ess_regression_introduced_by_834650d63130=2E?= Message-ID: http://hg.python.org/cpython/rev/e5a94b56d6bc changeset: 75166:e5a94b56d6bc user: Ross Lagerwall date: Wed Feb 22 06:02:07 2012 +0200 summary: Fix sporadic test_subprocess regression introduced by 834650d63130. files: Lib/test/test_subprocess.py | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Lib/test/test_subprocess.py b/Lib/test/test_subprocess.py --- a/Lib/test/test_subprocess.py +++ b/Lib/test/test_subprocess.py @@ -688,8 +688,8 @@ def test_poll(self): p = subprocess.Popen([sys.executable, "-c", - "import os", - "os.read(1)"], stdin=subprocess.PIPE) + "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') -- Repository URL: http://hg.python.org/cpython From solipsis at pitrou.net Wed Feb 22 05:32:02 2012 From: solipsis at pitrou.net (solipsis at pitrou.net) Date: Wed, 22 Feb 2012 05:32:02 +0100 Subject: [Python-checkins] Daily reference leaks (e4ef1a398e33): sum=0 Message-ID: results for e4ef1a398e33 on branch "default" -------------------------------------------- Command line was: ['./python', '-m', 'test.regrtest', '-uall', '-R', '3:3:/home/antoine/cpython/refleaks/reflogWo2zJL', '-x'] From python-checkins at python.org Wed Feb 22 10:53:46 2012 From: python-checkins at python.org (nadeem.vawda) Date: Wed, 22 Feb 2012 10:53:46 +0100 Subject: [Python-checkins] =?utf8?b?Y3B5dGhvbiAoMi43KTogSXNzdWUgIzE0MDUz?= =?utf8?q?=3A_Fix_=22make_patchcheck=22_to_work_with_MQ=2E?= Message-ID: http://hg.python.org/cpython/rev/179bc7557484 changeset: 75167:179bc7557484 branch: 2.7 parent: 75161:48a91063890c user: Nadeem Vawda date: Wed Feb 22 11:40:09 2012 +0200 summary: Issue #14053: Fix "make patchcheck" to work with MQ. Patch by Francisco Mart?n Brugu? files: Misc/ACKS | 1 + Misc/NEWS | 3 +++ Tools/scripts/patchcheck.py | 16 ++++++++++++++++ 3 files changed, 20 insertions(+), 0 deletions(-) diff --git a/Misc/ACKS b/Misc/ACKS --- a/Misc/ACKS +++ b/Misc/ACKS @@ -108,6 +108,7 @@ Gary S. Brown Oleg Broytmann Dave Brueck +Francisco Mart?n Brugu? Stan Bubrouski Erik de Bueger Dick Bulterman diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -531,6 +531,9 @@ 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 diff --git a/Tools/scripts/patchcheck.py b/Tools/scripts/patchcheck.py --- a/Tools/scripts/patchcheck.py +++ b/Tools/scripts/patchcheck.py @@ -36,6 +36,20 @@ return decorated_fxn +def mq_patches_applied(): + """Check if there are any applied MQ patches.""" + cmd = 'hg qapplied' + st = subprocess.Popen(cmd.split(), + stdout=subprocess.PIPE, + stderr=subprocess.PIPE) + try: + bstdout, _ = st.communicate() + return st.returncode == 0 and bstdout + finally: + st.stdout.close() + st.stderr.close() + + @status("Getting the list of files that have been added/changed", info=lambda x: n_files_str(len(x))) def changed_files(): @@ -43,6 +57,8 @@ if os.path.isdir(os.path.join(SRCDIR, '.hg')): vcs = 'hg' cmd = 'hg status --added --modified --no-status' + if mq_patches_applied(): + cmd += ' --rev qparent' elif os.path.isdir('.svn'): vcs = 'svn' cmd = 'svn status --quiet --non-interactive --ignore-externals' -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Feb 22 10:53:47 2012 From: python-checkins at python.org (nadeem.vawda) Date: Wed, 22 Feb 2012 10:53:47 +0100 Subject: [Python-checkins] =?utf8?b?Y3B5dGhvbiAoMy4yKTogSXNzdWUgIzE0MDUz?= =?utf8?q?=3A_Fix_=22make_patchcheck=22_to_work_with_MQ=2E?= Message-ID: http://hg.python.org/cpython/rev/fc5de19c66e2 changeset: 75168:fc5de19c66e2 branch: 3.2 parent: 75156:e832ffd0388f user: Nadeem Vawda date: Wed Feb 22 11:46:41 2012 +0200 summary: Issue #14053: Fix "make patchcheck" to work with MQ. Patch by Francisco Mart?n Brugu? files: Misc/NEWS | 3 +++ Tools/scripts/patchcheck.py | 12 ++++++++++++ 2 files changed, 15 insertions(+), 0 deletions(-) diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -483,6 +483,9 @@ 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 diff --git a/Tools/scripts/patchcheck.py b/Tools/scripts/patchcheck.py --- a/Tools/scripts/patchcheck.py +++ b/Tools/scripts/patchcheck.py @@ -36,6 +36,16 @@ return decorated_fxn +def mq_patches_applied(): + """Check if there are any applied MQ patches.""" + cmd = 'hg qapplied' + with subprocess.Popen(cmd.split(), + stdout=subprocess.PIPE, + stderr=subprocess.PIPE) as st: + bstdout, _ = st.communicate() + return st.returncode == 0 and bstdout + + @status("Getting the list of files that have been added/changed", info=lambda x: n_files_str(len(x))) def changed_files(): @@ -43,6 +53,8 @@ if os.path.isdir(os.path.join(SRCDIR, '.hg')): vcs = 'hg' cmd = 'hg status --added --modified --no-status' + if mq_patches_applied(): + cmd += ' --rev qparent' elif os.path.isdir('.svn'): vcs = 'svn' cmd = 'svn status --quiet --non-interactive --ignore-externals' -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Feb 22 10:53:47 2012 From: python-checkins at python.org (nadeem.vawda) Date: Wed, 22 Feb 2012 10:53:47 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_3=2E2_-=3E_default=29?= =?utf8?q?=3A_Merge=3A_=2314053=3A_Fix_=22make_patchcheck=22_to_work_with_?= =?utf8?b?TVEu?= Message-ID: http://hg.python.org/cpython/rev/1bdca2bcba6d changeset: 75169:1bdca2bcba6d parent: 75166:e5a94b56d6bc parent: 75168:fc5de19c66e2 user: Nadeem Vawda date: Wed Feb 22 11:53:09 2012 +0200 summary: Merge: #14053: Fix "make patchcheck" to work with MQ. Patch by Francisco Mart?n Brugu? files: Misc/NEWS | 3 +++ Tools/scripts/patchcheck.py | 12 ++++++++++++ 2 files changed, 15 insertions(+), 0 deletions(-) diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -1990,6 +1990,9 @@ 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 diff --git a/Tools/scripts/patchcheck.py b/Tools/scripts/patchcheck.py --- a/Tools/scripts/patchcheck.py +++ b/Tools/scripts/patchcheck.py @@ -36,6 +36,16 @@ return decorated_fxn +def mq_patches_applied(): + """Check if there are any applied MQ patches.""" + cmd = 'hg qapplied' + with subprocess.Popen(cmd.split(), + stdout=subprocess.PIPE, + stderr=subprocess.PIPE) as st: + bstdout, _ = st.communicate() + return st.returncode == 0 and bstdout + + @status("Getting the list of files that have been added/changed", info=lambda x: n_files_str(len(x))) def changed_files(): @@ -44,6 +54,8 @@ sys.exit('need a checkout to get modified files') cmd = 'hg status --added --modified --no-status' + if mq_patches_applied(): + cmd += ' --rev qparent' with subprocess.Popen(cmd.split(), stdout=subprocess.PIPE) as st: return [x.decode().rstrip() for x in st.stdout] -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Feb 22 13:58:42 2012 From: python-checkins at python.org (victor.stinner) Date: Wed, 22 Feb 2012 13:58:42 +0100 Subject: [Python-checkins] =?utf8?q?cpython=3A_PyUnicode=5FNew=28=29_and_u?= =?utf8?q?nicode=5Fputchar=28=29_check_for_MAX=5FUNICODE_maximum_=28U+10FF?= =?utf8?b?RkYp?= Message-ID: http://hg.python.org/cpython/rev/8722f1b7dd95 changeset: 75170:8722f1b7dd95 user: Victor Stinner date: Wed Feb 22 13:36:20 2012 +0100 summary: PyUnicode_New() and unicode_putchar() check for MAX_UNICODE maximum (U+10FFFF) files: Objects/unicodeobject.c | 2 ++ 1 files changed, 2 insertions(+), 0 deletions(-) diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -998,6 +998,7 @@ is_sharing = 1; } else { + assert(maxchar <= MAX_UNICODE); kind_state = PyUnicode_4BYTE_KIND; char_size = 4; if (sizeof(wchar_t) == 4) @@ -1627,6 +1628,7 @@ unicode_putchar(PyObject **p_unicode, Py_ssize_t *pos, Py_UCS4 ch) { + assert(ch <= MAX_UNICODE); if (unicode_widen(p_unicode, ch) < 0) return -1; PyUnicode_WRITE(PyUnicode_KIND(*p_unicode), -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Feb 22 13:58:43 2012 From: python-checkins at python.org (victor.stinner) Date: Wed, 22 Feb 2012 13:58:43 +0100 Subject: [Python-checkins] =?utf8?q?cpython=3A_Micro-optimize_unicode=5Fex?= =?utf8?q?pandtabs=28=29=3A_use_FILL=28=29_macro_to_write_N_spaces?= Message-ID: http://hg.python.org/cpython/rev/67d7f807adb4 changeset: 75171:67d7f807adb4 user: Victor Stinner date: Wed Feb 22 13:37:04 2012 +0100 summary: Micro-optimize unicode_expandtabs(): use FILL() macro to write N spaces files: Objects/unicodeobject.c | 7 ++----- 1 files changed, 2 insertions(+), 5 deletions(-) diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -9975,7 +9975,6 @@ assert(_PyUnicode_CheckConsistency(u, 1)); return u; } -#undef FILL PyObject * PyUnicode_Splitlines(PyObject *string, int keepends) @@ -11141,10 +11140,8 @@ if (tabsize > 0) { incr = tabsize - (line_pos % tabsize); line_pos += incr; - while (incr--) { - PyUnicode_WRITE(kind, dest_data, j, ' '); - j++; - } + FILL(kind, dest_data, ' ', j, incr); + j += incr; } } else { -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Feb 22 13:58:44 2012 From: python-checkins at python.org (victor.stinner) Date: Wed, 22 Feb 2012 13:58:44 +0100 Subject: [Python-checkins] =?utf8?q?cpython=3A_Micro-optimize_computation_?= =?utf8?q?of_maxchar_in_PyUnicode=5FTransformDecimalToASCII=28=29?= Message-ID: http://hg.python.org/cpython/rev/82acb284fc5e changeset: 75172:82acb284fc5e user: Victor Stinner date: Wed Feb 22 13:37:39 2012 +0100 summary: Micro-optimize computation of maxchar in PyUnicode_TransformDecimalToASCII() files: Objects/unicodeobject.c | 6 +++--- 1 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -8929,15 +8929,15 @@ enum PyUnicode_Kind kind; void *data; - maxchar = 0; + 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 = Py_MAX(maxchar, ch); + maxchar = Py_MAX(maxchar, ch); + } } /* Copy to a new string */ -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Feb 22 13:58:45 2012 From: python-checkins at python.org (victor.stinner) Date: Wed, 22 Feb 2012 13:58:45 +0100 Subject: [Python-checkins] =?utf8?q?cpython=3A_Optimize_str=25arg_for_numb?= =?utf8?b?ZXIgZm9ybWF0czogJWksICVkLCAldSwgJXgsICVw?= Message-ID: http://hg.python.org/cpython/rev/fd8452c91710 changeset: 75173:fd8452c91710 user: Victor Stinner date: Wed Feb 22 13:55:02 2012 +0100 summary: Optimize str%arg for number formats: %i, %d, %u, %x, %p Write a specialized function to write an ASCII/latin1 C char* string into a Python Unicode string. files: Objects/unicodeobject.c | 56 ++++++++++++++++++++++++++-- 1 files changed, 52 insertions(+), 4 deletions(-) diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -1637,6 +1637,51 @@ return 0; } +/* Copy a ASCII or latin1 char* string into a Python Unicode string. + Return the length of the input string. + + WARNING: Don't copy the terminating null character and don't check the + maximum character (may write a latin1 character in an ASCII string). */ +static Py_ssize_t +unicode_write_cstr(PyObject *unicode, Py_ssize_t index, const char *str) +{ + enum PyUnicode_Kind kind = PyUnicode_KIND(unicode); + void *data = PyUnicode_DATA(unicode); + + switch (kind) { + case PyUnicode_1BYTE_KIND: { + Py_ssize_t len = strlen(str); + assert(index + len <= PyUnicode_GET_LENGTH(unicode)); + memcpy(data + index, str, len); + return len; + } + case PyUnicode_2BYTE_KIND: { + Py_UCS2 *start = (Py_UCS2 *)data + index; + Py_UCS2 *ucs2 = start; + assert(index <= PyUnicode_GET_LENGTH(unicode)); + + for (; *str; ++ucs2, ++str) + *ucs2 = (Py_UCS2)*str; + + assert((ucs2 - start) <= PyUnicode_GET_LENGTH(unicode)); + return ucs2 - start; + } + 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; ++ucs4, ++str) + *ucs4 = (Py_UCS4)*str; + + assert((ucs4 - start) <= PyUnicode_GET_LENGTH(unicode)); + return ucs4 - start; + } + } +} + + static PyObject* get_latin1_char(unsigned char ch) { @@ -2590,19 +2635,23 @@ case 'u': case 'x': case 'p': + { + Py_ssize_t written; /* 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. */ - for (; *numberresult; ++i, ++numberresult) - PyUnicode_WRITE(kind, data, i, *numberresult); + written = unicode_write_cstr(string, i, numberresult); /* skip over the separating '\0' */ + i += written; + numberresult += written; assert(*numberresult == '\0'); numberresult++; assert(numberresult <= numberresults + numbersize); break; + } case 's': { /* unused, since we already have the result */ @@ -2669,8 +2718,7 @@ PyUnicode_WRITE(kind, data, i++, '%'); break; default: - for (; *p; ++p, ++i) - PyUnicode_WRITE(kind, data, i, *p); + i += unicode_write_cstr(string, i, p); assert(i == PyUnicode_GET_LENGTH(string)); goto end; } -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Feb 22 16:22:24 2012 From: python-checkins at python.org (nick.coghlan) Date: Wed, 22 Feb 2012 16:22:24 +0100 Subject: [Python-checkins] =?utf8?q?peps=3A_Switch_back_to_named_functions?= =?utf8?q?=2C_since_the_Ellipsis_version_degenerated_badly?= Message-ID: http://hg.python.org/peps/rev/b2670d6daec7 changeset: 4072:b2670d6daec7 user: Nick Coghlan date: Thu Feb 23 01:22:14 2012 +1000 summary: Switch back to named functions, since the Ellipsis version degenerated badly for more complex cases. Will revisit this in the 3.4 timeframe files: pep-0403.txt | 209 +++++++++++++++++++------------------- 1 files changed, 106 insertions(+), 103 deletions(-) diff --git a/pep-0403.txt b/pep-0403.txt --- a/pep-0403.txt +++ b/pep-0403.txt @@ -7,7 +7,7 @@ Type: Standards Track Content-Type: text/x-rst Created: 2011-10-13 -Python-Version: 3.x +Python-Version: 3.4 Post-History: 2011-10-13 Resolution: TBD @@ -18,12 +18,14 @@ This PEP proposes the addition of a new ``in`` statement that accepts a statement local function or class definition. -The statement allows the use of the Ellipsis literal (``...``) to make a -forward reference to a trailing anonymous function definition. +The statement accepts a single simple statement that can make a forward +reference to a trailing function or class definition. -This new statement is designed to be used whenever a "one-shot" function is -needed, and the meaning of the function is conveyed clearly by the context -and assigning a name can actually reduce clarity rather than increasing it. +This new statement is designed to be used whenever a "one-shot" function or +class is needed, and placing the function or class definition before the +statement that uses it actually makes the code harder to read. It also +avoids any name shadowing concerns by making sure the new name is visible +only to the statement in the ``in`` clause. This PEP is based heavily on many of the ideas in PEP 3150 (Statement Local Namespaces) so some elements of the rationale will be familiar to readers of @@ -37,14 +39,14 @@ rationale for this specific proposed solution, here are a few simple examples of the kind of code it is designed to simplify. -As a trivial example, weakref callbacks could be defined as follows:: +As a trivial example, a weakref callback could be defined as follows:: - in x = weakref.ref(target, ...) - def ...(obj): + in x = weakref.ref(target, report_destruction) + def report_destruction(obj): print("{} is being destroyed".format(obj)) -This contrasts with the current repetitive "out of order" syntax for this -operation:: +This contrasts with the current (conceptually) "out of order" syntax for +this operation:: def report_destruction(obj): print("{} is being destroyed".format(obj)) @@ -54,11 +56,19 @@ That structure is OK when you're using the callable multiple times, but it's irritating to be forced into it for one-off operations. +If the repetition of the name seems especially annoying, then a throwaway +name like ``f`` can be used instead:: + + in x = weakref.ref(target, f) + def f(obj): + print("{} is being destroyed".format(obj)) + + Similarly, a sorted operation on a particularly poorly defined type could now be defined as:: - in sorted_list = sorted(original, key=...) - def ...(item): + in sorted_list = sorted(original, key=f) + def f(item): try: return item.calc_sort_order() except NotSortableError: @@ -76,8 +86,8 @@ And early binding semantics in a list comprehension could be attained via:: - in funcs = [...(i) for i in range(10)] - def ...(i): + in funcs = [adder(i) for i in range(10)] + def adder(i): return lambda x: x + i @@ -88,28 +98,29 @@ of the existing class and function definition syntax. The new ``in`` clause replaces the decorator lines, and allows forward -references to the trailing function or class definition with the ``...`` -literal syntax. +references to the trailing function or class definition. -The trailing function or class definition is always anonymous - the provide -a visual link with the forward reference, the ``...`` literal is always -given as the "name" of the class or function. +The trailing function or class definition is always named - the name of +the trailing definition is then used to make the forward reference from the +preceding statement. The ``in`` clause is allowed to contain any simple statement (including those -that don't make any sense in that context - while such code would be legal, -there wouldn't be any point in writing it). This permissive structure is -easier to define and easier to explain, but a more restrictive approach that -only permits operations that "make sense" would also be possible (see PEP -3150 for a list of possible candidates) +that don't make any sense in that context, such as ``pass`` - while such code +would be legal, there wouldn't be any point in writing it). This permissive +structure is easier to define and easier to explain, but a more restrictive +approach that only permits operations that "make sense" would also be +possible (see PEP 3150 for a list of possible candidates). -The Ellipsis literal ``...`` would be repurposed inside the ``in`` clause -to refer to the anonymous function or class being defined. The Ellipsis -builtin itself can still be accessed by name from an ``in`` clause if -necessary. +The ``in`` statement will not create a new scope - all name binding +operations aside from the trailing function or class definition will affect +the containing scope. -As functions or classes defined for an ``in`` statement are always -anonymous, local name binding takes place only if the ``in`` clause -includes an assignment. +The name used in the trailing function or class definition is only visible +from the associated ``in`` clause, and behaves as if it was an ordinary +variable defined in that scope. If any nested scopes are created in either +the ``in`` clause or the trailing function or class definition, those scopes +will see the trailing function or class definition rather than any other +bindings for that name in the containing scope. Background @@ -121,10 +132,11 @@ so much: Python's demand that the function be named and introduced before the operation that needs it breaks the developer's flow of thought. They get to a point where they go "I need a one-shot operation that does -", and instead of being able to just *say* that, they instead have to back -up, name a function to do , then call that function from the operation -they actually wanted to do in the first place. Lambda expressions can help -sometimes, but they're no substitute for being able to use a full suite. +", and instead of being able to just *say* that directly, they instead +have to back up, name a function to do , then call that function from +the operation they actually wanted to do in the first place. Lambda +expressions can help sometimes, but they're no substitute for being able to +use a full suite. Ruby's block syntax also heavily inspired the style of the solution in this PEP, by making it clear that even when limited to *one* anonymous function per @@ -140,13 +152,19 @@ However, adopting Ruby's block syntax directly won't work for Python, since the effectiveness of Ruby's blocks relies heavily on various conventions in -the way functions are *defined* (specifically, Ruby's ``yield`` syntax to -call blocks directly and the ``&arg`` mechanism to accept a block as a +the way functions are *defined* (specifically, using Ruby's ``yield`` syntax +to call blocks directly and the ``&arg`` mechanism to accept a block as a function's final argument). Since Python has relied on named functions for so long, the signatures of APIs that accept callbacks are far more diverse, thus requiring a solution -that allows anonymous functions to be slotted in at the appropriate location. +that allows one-shot functions to be slotted in at the appropriate location. + +The approach taken in this PEP is to retain the requirement to name the +function explicitly, but allow the relative order of the definition and the +statement that references it to be changed to match the developer's flow of +thought. The rationale is essentially the same as that used when introducing +decorators, but covering a broader set of applications. Relation to PEP 3150 @@ -162,8 +180,9 @@ This PEP also achieves most of the other effects described in PEP 3150 without introducing a new brainbending kind of scope. All of the complex -scoping rules in PEP 3150 are replaced in this PEP with a simple forward -reference to the associated function or class definition. +scoping rules in PEP 3150 are replaced in this PEP with allowing a forward +reference to the associated function or class definition without creating an +actual name binding in the current scope. Keyword Choice @@ -172,28 +191,31 @@ The proposal definitely requires *some* kind of prefix to avoid parsing ambiguity and backwards compatibility problems with existing constructs. It also needs to be clearly highlighted to readers, since it declares that -the following piece of code is going to be executed out of order. +the following piece of code is going to be executed only after the trailing +function or class definition has been executed. The ``in`` keyword was chosen as an existing keyword that can be used to denote the concept of a forward reference. For functions, the construct is intended to be read as "in define "..." as this function". +that references NAME> define NAME as a function that does ". -The mapping to English prose isn't as clean for the class definition case, +The mapping to English prose isn't as obvious for the class definition case, but the concept remains the same. -Better Debugging Support for Anonymous Functions and Classes -============================================================ +Better Debugging Support for Functions and Classes with Short Names +=================================================================== One of the objections to widespread use of lambda expressions is that they have a negative effect on traceback intelligibility and other aspects of -introspection. +introspection. Similarly objections are raised regarding constructs that +promote short, cryptic function names (including this one, which requires +that the name of the trailing definition be supplied at least twice) -However, the introduction of qualified names in PEP 3155 means that -anonymous functions in different scopes will now have different -representations. For example:: +However, the introduction of qualified names in PEP 3155 means that even +anonymous classes and functions will now have different representations if +they occur in different scopes. For example:: >>> def f(): ... return lambda: y @@ -201,22 +223,17 @@ >>> f() . at 0x7f6f46faeae0> -Anonymous function within the *same* scope will still share representations -(aside from the object ID), but this is still a major improvement over the -historical situation where everything *except* the object ID was identical. - -The anonymous functions and classes created by the new statement will use -the metaname ````. +Anonymous functions (or functions that share a name) within the *same* scope +will still share representations (aside from the object ID), but this is +still a major improvement over the historical situation where everything +*except* the object ID was identical. Syntax Change ============= New:: - in_stmt: in_prefix (in_classdef|in_funcdef) - in_prefix: 'in' simple_stmt - in_funcdef: 'def' '...' parameters ['->' test] ':' suite - in_classdef: 'class' '...' ['(' [arglist] ')'] ':' suite + in_stmt: 'in' simple_stmt (classdef|funcdef) Grammar: http://hg.python.org/cpython/file/default/Grammar/Grammar @@ -232,9 +249,10 @@ matter of emitting the two operations out of order and using a hidden variable to link up any references. -The one potentially tricky part is changing the meaning of the Ellipsis -literal notation while within the scope of the ``in`` clause, but that -shouldn't be too hard to address within the compiler. +The one potentially tricky part is changing the meaning of the references to +the statement local function or namespace while within the scope of the +``in`` statement, but that shouldn't be too hard to address by maintaining +some additional state within the compiler. More Examples @@ -250,8 +268,8 @@ del _createenviron # Becomes: - in environ = ...() - def ...(): + in environ = _createenviron() + def _createenviron(): ... # 27 line function Loop early binding:: @@ -260,56 +278,25 @@ funcs = [(lambda x, i=i: x + i) for i in range(10)] # Becomes: - in funcs = [...(i) for i in range(10)] - def ...(i): + in funcs = [adder(i) for i in range(10)] + def adder(i): return lambda x: x + i # Or even: - in funcs = [...(i) for i in range(10)] - def ...(i): - in return ... - def ...(x): - return x + i - -Statement local namespace:: - - # OK, this definitely looks weird and needs further thought... - in c = math.sqrt(....a*....a + ....b*....b) - class ...: - a = calculate_a() - b = calculate_b() - - -Alternative Idea -================ - -As the statement local namespace example shows, using ```...`` for the -forward reference doesn't play nicely with attribute references on the -anonymous object. The doubly nested example also shows that overuse can -lead to readability disappearing in a mass of dots. - -An alternative approach would be to use a similar hidden variable -implementation strategy to implement a *single* statement local variable -for use as the forward reference. Getting the scoping right could be -challenging, but it should still be feasible. - -Then the two problematic examples could be written as:: - - in funcs = [f(i) for i in range(10)] - def f(i): + in funcs = [adder(i) for i in range(10)] + def adder(i): in return incr def incr(x): return x + i +A trailing class can be used as a statement local namespace:: + + # Evaluate subexpressions only once in c = math.sqrt(x.a*x.a + x.b*x.b) class x: a = calculate_a() b = calculate_b() -With the name not actually being bound in the local scope, it isn't -necessary to worry about name collisions, but meaningful names can still be -used to improve readability. - Reference Implementation ======================== @@ -332,6 +319,22 @@ that (quite rightly) was not well received. The current proposal is significantly easier both to read and write. +A more recent variant always used ``...`` for forward references, along +with genuinely anonymous function and class definitions. However, this +degenerated quickly into a mass of unintelligible dots in more complex +cases:: + + in funcs = [...(i) for i in range(10)] + def ...(i): + in return ... + def ...(x): + return x + i + + in c = math.sqrt(....a*....a + ....b*....b) + class ...: + a = calculate_a() + b = calculate_b() + References ========== -- Repository URL: http://hg.python.org/peps From python-checkins at python.org Wed Feb 22 16:45:21 2012 From: python-checkins at python.org (antoine.pitrou) Date: Wed, 22 Feb 2012 16:45:21 +0100 Subject: [Python-checkins] =?utf8?q?cpython=3A_Fix_compile_failure_under_W?= =?utf8?q?indows?= Message-ID: http://hg.python.org/cpython/rev/ac4256a1fbe6 changeset: 75174:ac4256a1fbe6 user: Antoine Pitrou date: Wed Feb 22 16:41:50 2012 +0100 summary: Fix compile failure under Windows files: Objects/unicodeobject.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -1652,7 +1652,7 @@ case PyUnicode_1BYTE_KIND: { Py_ssize_t len = strlen(str); assert(index + len <= PyUnicode_GET_LENGTH(unicode)); - memcpy(data + index, str, len); + memcpy((char *) data + index, str, len); return len; } case PyUnicode_2BYTE_KIND: { -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Feb 22 18:12:03 2012 From: python-checkins at python.org (antoine.pitrou) Date: Wed, 22 Feb 2012 18:12:03 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=283=2E2=29=3A_In_find=5Fmodul?= =?utf8?q?e=28=29=2C_do_not_silence_fileno=28=29_and_dup=28=29_errors=2E?= Message-ID: http://hg.python.org/cpython/rev/963a0fba98e0 changeset: 75175:963a0fba98e0 branch: 3.2 parent: 75168:fc5de19c66e2 user: Antoine Pitrou date: Wed Feb 22 18:03:04 2012 +0100 summary: In find_module(), do not silence fileno() and dup() errors. files: Python/import.c | 2 ++ 1 files changed, 2 insertions(+), 0 deletions(-) diff --git a/Python/import.c b/Python/import.c --- a/Python/import.c +++ b/Python/import.c @@ -3186,6 +3186,8 @@ fd = dup(fd); fclose(fp); fp = NULL; + if (fd == -1) + return PyErr_SetFromErrno(PyExc_OSError); } if (fd != -1) { if (strchr(fdp->mode, 'b') == NULL) { -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Feb 22 18:12:05 2012 From: python-checkins at python.org (antoine.pitrou) Date: Wed, 22 Feb 2012 18:12:05 +0100 Subject: [Python-checkins] =?utf8?b?Y3B5dGhvbiAoMy4yKTogSXNzdWUgIzE0MDg0?= =?utf8?q?=3A_Fix_a_file_descriptor_leak_when_importing_a_module_with_a_ba?= =?utf8?q?d?= Message-ID: http://hg.python.org/cpython/rev/cbfd2bf80db0 changeset: 75176:cbfd2bf80db0 branch: 3.2 user: Antoine Pitrou date: Wed Feb 22 18:05:43 2012 +0100 summary: Issue #14084: Fix a file descriptor leak when importing a module with a bad encoding. files: Misc/NEWS | 3 +++ Python/import.c | 4 +++- 2 files changed, 6 insertions(+), 1 deletions(-) diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -10,6 +10,9 @@ Core and Builtins ----------------- +- Issue #14084: Fix a file descriptor leak when importing a module with a + bad encoding. + - 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 diff --git a/Python/import.c b/Python/import.c --- a/Python/import.c +++ b/Python/import.c @@ -3195,8 +3195,10 @@ memory. */ found_encoding = PyTokenizer_FindEncoding(fd); lseek(fd, 0, 0); /* Reset position */ - if (found_encoding == NULL && PyErr_Occurred()) + if (found_encoding == NULL && PyErr_Occurred()) { + close(fd); return NULL; + } encoding = (found_encoding != NULL) ? found_encoding : (char*)PyUnicode_GetDefaultEncoding(); } -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Feb 22 18:12:06 2012 From: python-checkins at python.org (antoine.pitrou) Date: Wed, 22 Feb 2012 18:12:06 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_3=2E2_-=3E_default=29?= =?utf8?q?=3A_Issue_=2314084=3A_Fix_a_file_descriptor_leak_when_importing_?= =?utf8?q?a_module_with_a_bad?= Message-ID: http://hg.python.org/cpython/rev/fcd0a67e708e changeset: 75177:fcd0a67e708e parent: 75174:ac4256a1fbe6 parent: 75176:cbfd2bf80db0 user: Antoine Pitrou date: Wed Feb 22 18:08:30 2012 +0100 summary: Issue #14084: Fix a file descriptor leak when importing a module with a bad encoding. files: Misc/NEWS | 3 +++ Python/import.c | 7 +++---- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -10,6 +10,9 @@ Core and Builtins ----------------- +- Issue #14084: Fix a file descriptor leak when importing a module with a + bad encoding. + - Upgrade Unicode data to Unicode 6.1. - Issue #14040: Remove rarely used file name suffixes for C extensions diff --git a/Python/import.c b/Python/import.c --- a/Python/import.c +++ b/Python/import.c @@ -3628,11 +3628,9 @@ if (fd != -1) fd = dup(fd); fclose(fp); - if (fd == -1) { - PyErr_SetFromErrno(PyExc_OSError); - return NULL; - } fp = NULL; + if (fd == -1) + return PyErr_SetFromErrno(PyExc_OSError); } if (fd != -1) { if (strchr(fdp->mode, 'b') == NULL) { @@ -3642,6 +3640,7 @@ lseek(fd, 0, 0); /* Reset position */ if (found_encoding == NULL && PyErr_Occurred()) { Py_XDECREF(pathobj); + close(fd); return NULL; } encoding = (found_encoding != NULL) ? found_encoding : -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Feb 22 19:27:09 2012 From: python-checkins at python.org (antoine.pitrou) Date: Wed, 22 Feb 2012 19:27:09 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=283=2E2=29=3A_Fix_=28presumab?= =?utf8?q?ly=29_test=5Fhash_under_big-endian_systems_=28PPC=29=2E?= Message-ID: http://hg.python.org/cpython/rev/eb46c8f44aae changeset: 75178:eb46c8f44aae branch: 3.2 parent: 75176:cbfd2bf80db0 user: Antoine Pitrou date: Wed Feb 22 03:33:56 2012 +0100 summary: Fix (presumably) test_hash under big-endian systems (PPC). files: Lib/test/test_hash.py | 10 ++++++++-- 1 files changed, 8 insertions(+), 2 deletions(-) diff --git a/Lib/test/test_hash.py b/Lib/test/test_hash.py --- a/Lib/test/test_hash.py +++ b/Lib/test/test_hash.py @@ -170,9 +170,15 @@ # test a fixed seed for the randomized hash # Note that all types share the same values: if IS_64BIT: - h = -4410911502303878509 + if sys.byteorder == 'little': + h = -4410911502303878509 + else: + h = -3570150969479994130 else: - h = -206076799 + if sys.byteorder == 'little': + h = -206076799 + else: + h = -1024014457 self.assertEqual(self.get_hash(self.repr_, seed=42), h) class StrHashRandomizationTests(StringlikeHashRandomizationTests): -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Feb 22 19:27:10 2012 From: python-checkins at python.org (antoine.pitrou) Date: Wed, 22 Feb 2012 19:27:10 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_3=2E2_-=3E_default=29?= =?utf8?q?=3A_Null_merge?= Message-ID: http://hg.python.org/cpython/rev/90d302951add changeset: 75179:90d302951add parent: 75177:fcd0a67e708e parent: 75178:eb46c8f44aae user: Antoine Pitrou date: Wed Feb 22 19:23:13 2012 +0100 summary: Null merge files: -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Feb 22 19:27:11 2012 From: python-checkins at python.org (antoine.pitrou) Date: Wed, 22 Feb 2012 19:27:11 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=282=2E7=29=3A_Fix_=28presumab?= =?utf8?q?ly=29_test=5Fhash_under_big-endian_systems_=28PPC=29=2E?= Message-ID: http://hg.python.org/cpython/rev/251e54259f21 changeset: 75180:251e54259f21 branch: 2.7 parent: 75167:179bc7557484 user: Antoine Pitrou date: Wed Feb 22 03:33:56 2012 +0100 summary: Fix (presumably) test_hash under big-endian systems (PPC). files: Lib/test/test_hash.py | 10 ++++++++-- 1 files changed, 8 insertions(+), 2 deletions(-) diff --git a/Lib/test/test_hash.py b/Lib/test/test_hash.py --- a/Lib/test/test_hash.py +++ b/Lib/test/test_hash.py @@ -188,9 +188,15 @@ # test a fixed seed for the randomized hash # Note that all types share the same values: if IS_64BIT: - h = -4410911502303878509 + if sys.byteorder == 'little': + h = -4410911502303878509 + else: + h = -3570150969479994130 else: - h = -206076799 + if sys.byteorder == 'little': + h = -206076799 + else: + h = -1024014457 self.assertEqual(self.get_hash(self.repr_, seed=42), h) class StrHashRandomizationTests(StringlikeHashRandomizationTests): -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Feb 22 19:40:18 2012 From: python-checkins at python.org (barry.warsaw) Date: Wed, 22 Feb 2012 19:40:18 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=282=2E6=29=3A_Backport_from_2?= =?utf8?q?=2E7_branch=2E?= Message-ID: http://hg.python.org/cpython/rev/c7baaf0cde8d changeset: 75181:c7baaf0cde8d branch: 2.6 parent: 75158:65d1fe86618f user: Barry Warsaw date: Wed Feb 22 13:34:18 2012 -0500 summary: Backport from 2.7 branch. changeset: 75165:780008020c40 user: Antoine Pitrou date: Wed Feb 22 03:33:56 2012 +0100 summary: Fix (presumably) test_hash under big-endian systems (PPC). files: Lib/test/test_hash.py | 10 ++++++++-- 1 files changed, 8 insertions(+), 2 deletions(-) diff --git a/Lib/test/test_hash.py b/Lib/test/test_hash.py --- a/Lib/test/test_hash.py +++ b/Lib/test/test_hash.py @@ -187,9 +187,15 @@ # test a fixed seed for the randomized hash # Note that all types share the same values: if IS_64BIT: - h = -4410911502303878509 + if sys.byteorder == 'little': + h = -4410911502303878509 + else: + h = -3570150969479994130 else: - h = -206076799 + if sys.byteorder == 'little': + h = -206076799 + else: + h = -1024014457 self.assertEqual(self.get_hash(self.repr_, seed=42), h) class StrHashRandomizationTests(StringlikeHashRandomizationTests): -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Feb 22 19:40:19 2012 From: python-checkins at python.org (barry.warsaw) Date: Wed, 22 Feb 2012 19:40:19 +0100 Subject: [Python-checkins] =?utf8?b?Y3B5dGhvbiAobWVyZ2UgMi42IC0+IDIuNyk6?= =?utf8?q?_null_merge_from_2=2E6?= Message-ID: http://hg.python.org/cpython/rev/7549dd74e08c changeset: 75182:7549dd74e08c branch: 2.7 parent: 75180:251e54259f21 parent: 75181:c7baaf0cde8d user: Barry Warsaw date: Wed Feb 22 13:39:59 2012 -0500 summary: null merge from 2.6 files: -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Feb 22 20:28:20 2012 From: python-checkins at python.org (barry.warsaw) Date: Wed, 22 Feb 2012 20:28:20 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=282=2E6=29=3A_Backport_from_2?= =?utf8?b?Ljc6?= Message-ID: http://hg.python.org/cpython/rev/bff3fd529e33 changeset: 75183:bff3fd529e33 branch: 2.6 parent: 75181:c7baaf0cde8d user: Barry Warsaw date: Wed Feb 22 13:50:04 2012 -0500 summary: Backport from 2.7: changeset: 75153:9b7c6dd19e25 branch: 2.7 parent: 75151:b1a02c17b327 user: Antoine Pitrou date: Tue Feb 21 22:02:04 2012 +0100 files: Lib/test/test_os.py files: Lib/test/test_os.py | 7 ++++--- 1 files changed, 4 insertions(+), 3 deletions(-) diff --git a/Lib/test/test_os.py b/Lib/test/test_os.py --- a/Lib/test/test_os.py +++ b/Lib/test/test_os.py @@ -528,12 +528,13 @@ 'import os, sys', 'data = os.urandom(%s)' % count, 'sys.stdout.write(data)', - 'sys.stdout.flush()')) + 'sys.stdout.flush()', + 'print >> sys.stderr, (len(data), data)')) cmd_line = [sys.executable, '-c', code] p = subprocess.Popen(cmd_line, stdin=subprocess.PIPE, - stdout=subprocess.PIPE, stderr=subprocess.STDOUT) + stdout=subprocess.PIPE, stderr=subprocess.PIPE) out, err = p.communicate() - out = test_support.strip_python_stderr(out) + self.assertEqual(p.wait(), 0, (p.wait(), err)) self.assertEqual(len(out), count) return out -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Feb 22 20:28:21 2012 From: python-checkins at python.org (barry.warsaw) Date: Wed, 22 Feb 2012 20:28:21 +0100 Subject: [Python-checkins] =?utf8?b?Y3B5dGhvbiAobWVyZ2UgMi42IC0+IDIuNyk6?= =?utf8?q?_null_merge_from_2=2E6?= Message-ID: http://hg.python.org/cpython/rev/9a1d902714ae changeset: 75184:9a1d902714ae branch: 2.7 parent: 75182:7549dd74e08c parent: 75183:bff3fd529e33 user: Barry Warsaw date: Wed Feb 22 14:27:53 2012 -0500 summary: null merge from 2.6 files: -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Feb 22 21:03:46 2012 From: python-checkins at python.org (charles-francois.natali) Date: Wed, 22 Feb 2012 21:03:46 +0100 Subject: [Python-checkins] =?utf8?q?cpython=3A_Issue_=2314077=3A_importlib?= =?utf8?q?=3A_Fix_regression_introduced_by_de6703671386=2E?= Message-ID: http://hg.python.org/cpython/rev/27d31f0c4ad5 changeset: 75185:27d31f0c4ad5 parent: 75179:90d302951add user: Charles-Fran?ois Natali date: Wed Feb 22 21:03:09 2012 +0100 summary: Issue #14077: importlib: Fix regression introduced by de6703671386. files: Lib/importlib/_bootstrap.py | 9 ++++++--- 1 files changed, 6 insertions(+), 3 deletions(-) diff --git a/Lib/importlib/_bootstrap.py b/Lib/importlib/_bootstrap.py --- a/Lib/importlib/_bootstrap.py +++ b/Lib/importlib/_bootstrap.py @@ -128,7 +128,9 @@ def _write_atomic(path, data): - """Function to write data to a path atomically.""" + """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, 0o666) @@ -595,8 +597,9 @@ return try: _write_atomic(path, data) - except PermissionError: - # Don't worry if you can't write bytecode. + except (PermissionError, FileExistsError): + # Don't worry if you can't write bytecode or someone is writing + # it at the same time. pass -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Feb 22 21:21:57 2012 From: python-checkins at python.org (victor.stinner) Date: Wed, 22 Feb 2012 21:21:57 +0100 Subject: [Python-checkins] =?utf8?q?cpython=3A_Fix_doc_of_an_internal_func?= =?utf8?q?tion=3A_unicode=5Fwrite=5Fcstr=28=29?= Message-ID: http://hg.python.org/cpython/rev/31784350f849 changeset: 75186:31784350f849 user: Victor Stinner date: Wed Feb 22 21:22:20 2012 +0100 summary: Fix doc of an internal function: unicode_write_cstr() files: Objects/unicodeobject.c | 5 +++-- 1 files changed, 3 insertions(+), 2 deletions(-) diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -1640,8 +1640,9 @@ /* Copy a ASCII or latin1 char* string into a Python Unicode string. Return the length of the input string. - WARNING: Don't copy the terminating null character and don't check the - maximum character (may write a latin1 character in an ASCII 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 Py_ssize_t unicode_write_cstr(PyObject *unicode, Py_ssize_t index, const char *str) { -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Feb 22 22:19:59 2012 From: python-checkins at python.org (antoine.pitrou) Date: Wed, 22 Feb 2012 22:19:59 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=282=2E7=29=3A_Fix_sporadic_te?= =?utf8?q?st=5Fos_failure_under_Windows?= Message-ID: http://hg.python.org/cpython/rev/48705250232c changeset: 75187:48705250232c branch: 2.7 parent: 75184:9a1d902714ae user: Antoine Pitrou date: Wed Feb 22 22:16:25 2012 +0100 summary: Fix sporadic test_os failure under Windows files: Lib/test/test_os.py | 7 +++++-- 1 files changed, 5 insertions(+), 2 deletions(-) diff --git a/Lib/test/test_os.py b/Lib/test/test_os.py --- a/Lib/test/test_os.py +++ b/Lib/test/test_os.py @@ -541,10 +541,12 @@ self.assertNotEqual(data1, data2) def get_urandom_subprocess(self, count): + # We need to use repr() and eval() to avoid line ending conversions + # under Windows. code = '\n'.join(( 'import os, sys', 'data = os.urandom(%s)' % count, - 'sys.stdout.write(data)', + 'sys.stdout.write(repr(data))', 'sys.stdout.flush()', 'print >> sys.stderr, (len(data), data)')) cmd_line = [sys.executable, '-c', code] @@ -552,7 +554,8 @@ stdout=subprocess.PIPE, stderr=subprocess.PIPE) out, err = p.communicate() self.assertEqual(p.wait(), 0, (p.wait(), err)) - self.assertEqual(len(out), count) + out = eval(out) + self.assertEqual(len(out), count, err) return out def test_urandom_subprocess(self): -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Feb 22 23:28:06 2012 From: python-checkins at python.org (barry.warsaw) Date: Wed, 22 Feb 2012 23:28:06 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=282=2E6=29=3A_Back_port_from_?= =?utf8?q?2=2E7=3A?= Message-ID: http://hg.python.org/cpython/rev/0f095a0f124c changeset: 75188:0f095a0f124c branch: 2.6 parent: 75183:bff3fd529e33 user: Barry Warsaw date: Wed Feb 22 17:26:50 2012 -0500 summary: Back port from 2.7: http://hg.python.org/cpython/rev/48705250232c changeset: 75187:48705250232c branch: 2.7 parent: 75184:9a1d902714ae user: Antoine Pitrou date: Wed Feb 22 22:16:25 2012 +0100 files: Lib/test/test_os.py | 7 +++++-- 1 files changed, 5 insertions(+), 2 deletions(-) diff --git a/Lib/test/test_os.py b/Lib/test/test_os.py --- a/Lib/test/test_os.py +++ b/Lib/test/test_os.py @@ -524,10 +524,12 @@ self.assertNotEqual(data1, data2) def get_urandom_subprocess(self, count): + # We need to use repr() and eval() to avoid line ending conversions + # under Windows. code = '\n'.join(( 'import os, sys', 'data = os.urandom(%s)' % count, - 'sys.stdout.write(data)', + 'sys.stdout.write(repr(data))', 'sys.stdout.flush()', 'print >> sys.stderr, (len(data), data)')) cmd_line = [sys.executable, '-c', code] @@ -535,7 +537,8 @@ stdout=subprocess.PIPE, stderr=subprocess.PIPE) out, err = p.communicate() self.assertEqual(p.wait(), 0, (p.wait(), err)) - self.assertEqual(len(out), count) + out = eval(out) + self.assertEqual(len(out), count, err) return out def test_urandom_subprocess(self): -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Feb 22 23:28:07 2012 From: python-checkins at python.org (barry.warsaw) Date: Wed, 22 Feb 2012 23:28:07 +0100 Subject: [Python-checkins] =?utf8?b?Y3B5dGhvbiAobWVyZ2UgMi42IC0+IDIuNyk6?= =?utf8?q?_null_merge_from_2=2E6?= Message-ID: http://hg.python.org/cpython/rev/dec65cb98128 changeset: 75189:dec65cb98128 branch: 2.7 parent: 75187:48705250232c parent: 75188:0f095a0f124c user: Barry Warsaw date: Wed Feb 22 17:27:47 2012 -0500 summary: null merge from 2.6 files: -- Repository URL: http://hg.python.org/cpython From solipsis at pitrou.net Thu Feb 23 05:33:23 2012 From: solipsis at pitrou.net (solipsis at pitrou.net) Date: Thu, 23 Feb 2012 05:33:23 +0100 Subject: [Python-checkins] Daily reference leaks (e4ef1a398e33): sum=0 Message-ID: results for e4ef1a398e33 on branch "default" -------------------------------------------- Command line was: ['./python', '-m', 'test.regrtest', '-uall', '-R', '3:3:/home/antoine/cpython/refleaks/reflogNZDIrr', '-x'] From python-checkins at python.org Thu Feb 23 12:36:22 2012 From: python-checkins at python.org (nadeem.vawda) Date: Thu, 23 Feb 2012 12:36:22 +0100 Subject: [Python-checkins] =?utf8?q?cpython=3A_Issue_=2313873=3A_Fix_crash?= =?utf8?q?_in_test=5Fzlib_on_bigmem_buildbot=2E?= Message-ID: http://hg.python.org/cpython/rev/f3f3bb45205b changeset: 75190:f3f3bb45205b parent: 75186:31784350f849 user: Nadeem Vawda date: Thu Feb 23 13:36:25 2012 +0200 summary: Issue #13873: Fix crash in test_zlib on bigmem buildbot. files: Lib/test/test_zlib.py | 28 +++++----------------------- 1 files changed, 5 insertions(+), 23 deletions(-) diff --git a/Lib/test/test_zlib.py b/Lib/test/test_zlib.py --- a/Lib/test/test_zlib.py +++ b/Lib/test/test_zlib.py @@ -7,11 +7,6 @@ zlib = support.import_module('zlib') -try: - import mmap -except ImportError: - mmap = None - class VersionTestCase(unittest.TestCase): @@ -77,24 +72,11 @@ # Issue #10276 - check that inputs >=4GB are handled correctly. class ChecksumBigBufferTestCase(unittest.TestCase): - def setUp(self): - with open(support.TESTFN, "wb+") as f: - f.seek(_4G) - f.write(b"asdf") - f.flush() - self.mapping = mmap.mmap(f.fileno(), 0, access=mmap.ACCESS_READ) - - def tearDown(self): - self.mapping.close() - support.unlink(support.TESTFN) - - @unittest.skipUnless(mmap, "mmap() is not available.") - @unittest.skipUnless(sys.maxsize > _4G, "Can't run on a 32-bit system.") - @unittest.skipUnless(support.is_resource_enabled("largefile"), - "May use lots of disk space.") - def test_big_buffer(self): - self.assertEqual(zlib.crc32(self.mapping), 3058686908) - self.assertEqual(zlib.adler32(self.mapping), 82837919) + @bigmemtest(size=_4G + 4, memuse=1) + def test_big_buffer(self,size): + data = b"nyan" * (_1G + 1) + self.assertEqual(zlib.crc32(data), 1044521549) + self.assertEqual(zlib.adler32(data), 2256789997) class ExceptionTestCase(unittest.TestCase): -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Feb 23 13:23:28 2012 From: python-checkins at python.org (nadeem.vawda) Date: Thu, 23 Feb 2012 13:23:28 +0100 Subject: [Python-checkins] =?utf8?q?cpython=3A_Fix_previous_fix_=28for_tes?= =?utf8?q?t=5Fzlib=29_to_work_on_32-bit_systems=2E?= Message-ID: http://hg.python.org/cpython/rev/a5f53c08c9cf changeset: 75191:a5f53c08c9cf user: Nadeem Vawda date: Thu Feb 23 14:16:15 2012 +0200 summary: Fix previous fix (for test_zlib) to work on 32-bit systems. files: Lib/test/test_zlib.py | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Lib/test/test_zlib.py b/Lib/test/test_zlib.py --- a/Lib/test/test_zlib.py +++ b/Lib/test/test_zlib.py @@ -72,8 +72,8 @@ # Issue #10276 - check that inputs >=4GB are handled correctly. class ChecksumBigBufferTestCase(unittest.TestCase): - @bigmemtest(size=_4G + 4, memuse=1) - def test_big_buffer(self,size): + @bigmemtest(size=_4G + 4, memuse=1, dry_run=False) + def test_big_buffer(self, size): data = b"nyan" * (_1G + 1) self.assertEqual(zlib.crc32(data), 1044521549) self.assertEqual(zlib.adler32(data), 2256789997) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Feb 23 13:23:29 2012 From: python-checkins at python.org (nadeem.vawda) Date: Thu, 23 Feb 2012 13:23:29 +0100 Subject: [Python-checkins] =?utf8?q?cpython=3A_Simplify_zlib_bigmem_tests?= =?utf8?q?=2E?= Message-ID: http://hg.python.org/cpython/rev/8c9638f0587a changeset: 75192:8c9638f0587a user: Nadeem Vawda date: Thu Feb 23 14:23:17 2012 +0200 summary: Simplify zlib bigmem tests. files: Lib/test/test_zlib.py | 8 ++------ 1 files changed, 2 insertions(+), 6 deletions(-) diff --git a/Lib/test/test_zlib.py b/Lib/test/test_zlib.py --- a/Lib/test/test_zlib.py +++ b/Lib/test/test_zlib.py @@ -179,10 +179,8 @@ 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) @@ -536,10 +534,8 @@ 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() -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Feb 23 16:18:19 2012 From: python-checkins at python.org (brett.cannon) Date: Thu, 23 Feb 2012 16:18:19 +0100 Subject: [Python-checkins] =?utf8?q?cpython=3A_Refactor_importlib_to_make_?= =?utf8?q?it_easier_to_re-implement_in_C=2E?= Message-ID: http://hg.python.org/cpython/rev/f95faebf5dea changeset: 75193:f95faebf5dea parent: 75186:31784350f849 user: Brett Cannon date: Wed Feb 22 18:33:05 2012 -0500 summary: Refactor importlib to make it easier to re-implement in C. files: Lib/importlib/_bootstrap.py | 76 ++++++++++-------------- 1 files changed, 31 insertions(+), 45 deletions(-) diff --git a/Lib/importlib/_bootstrap.py b/Lib/importlib/_bootstrap.py --- a/Lib/importlib/_bootstrap.py +++ b/Lib/importlib/_bootstrap.py @@ -918,20 +918,12 @@ return None -def _set___package__(module): - """Set __package__ on a module.""" - # 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 - - def _sanity_check(name, package, level): """Verify arguments are "sane".""" + if not hasattr(name, 'rpartition'): + raise TypeError("module name must be str, not {}".format(type(name))) + if level < 0: + raise ValueError('level must be >= 0') if package: if not hasattr(package, 'rindex'): raise ValueError("__package__ not set to a string") @@ -943,13 +935,12 @@ raise ValueError("Empty module name") -def _find_search_path(name, import_): - """Find the search path for a module. +_IMPLICIT_META_PATH = [BuiltinImporter, FrozenImporter, _DefaultPathFinder] - import_ is expected to be a callable which takes the name of a module to - import. It is required to decouple the function from importlib. +_ERR_MSG = 'No module named {!r}' - """ +def _find_and_load(name, import_): + """Find and load the module.""" path = None parent = name.rpartition('.')[0] if parent: @@ -962,14 +953,29 @@ except AttributeError: msg = (_ERR_MSG + '; {} is not a package').format(name, parent) raise ImportError(msg) - return parent, path + loader = _find_module(name, path) + if loader is None: + raise ImportError(_ERR_MSG.format(name)) + elif name not in sys.modules: + # The parent import may have already imported this module. + loader.load_module(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. + parent_module = sys.modules[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: + try: + module.__package__ = module.__name__ + if not hasattr(module, '__path__'): + module.__package__ = module.__package__.rpartition('.')[0] + except AttributeError: + pass + return module - -_IMPLICIT_META_PATH = [BuiltinImporter, FrozenImporter, _DefaultPathFinder] - -_ERR_MSG = 'No module named {!r}' - 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. @@ -991,24 +997,8 @@ raise ImportError(message) return module except KeyError: - pass - parent, path = _find_search_path(name, _gcd_import) - loader = _find_module(name, path) - if loader is None: - raise ImportError(_ERR_MSG.format(name)) - elif name not in sys.modules: - # The parent import may have already imported this module. - loader.load_module(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. - parent_module = sys.modules[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: - _set___package__(module) - return module + pass # Don't want to chain the exception + return _find_and_load(name, _gcd_import) def _return_module(module, name, fromlist, level, import_): @@ -1071,12 +1061,8 @@ 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) - elif level < 0: - raise ValueError('level must be >= 0') else: package = _calc___package__(globals) module = _gcd_import(name, package, level) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Feb 23 16:18:20 2012 From: python-checkins at python.org (brett.cannon) Date: Thu, 23 Feb 2012 16:18:20 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_default_-=3E_default?= =?utf8?q?=29=3A_Merge?= Message-ID: http://hg.python.org/cpython/rev/6f578f73d14a changeset: 75194:6f578f73d14a parent: 75193:f95faebf5dea parent: 75192:8c9638f0587a user: Brett Cannon date: Thu Feb 23 10:17:56 2012 -0500 summary: Merge files: Lib/test/test_zlib.py | 36 ++++++------------------------ 1 files changed, 7 insertions(+), 29 deletions(-) diff --git a/Lib/test/test_zlib.py b/Lib/test/test_zlib.py --- a/Lib/test/test_zlib.py +++ b/Lib/test/test_zlib.py @@ -7,11 +7,6 @@ zlib = support.import_module('zlib') -try: - import mmap -except ImportError: - mmap = None - class VersionTestCase(unittest.TestCase): @@ -77,24 +72,11 @@ # Issue #10276 - check that inputs >=4GB are handled correctly. class ChecksumBigBufferTestCase(unittest.TestCase): - def setUp(self): - with open(support.TESTFN, "wb+") as f: - f.seek(_4G) - f.write(b"asdf") - f.flush() - self.mapping = mmap.mmap(f.fileno(), 0, access=mmap.ACCESS_READ) - - def tearDown(self): - self.mapping.close() - support.unlink(support.TESTFN) - - @unittest.skipUnless(mmap, "mmap() is not available.") - @unittest.skipUnless(sys.maxsize > _4G, "Can't run on a 32-bit system.") - @unittest.skipUnless(support.is_resource_enabled("largefile"), - "May use lots of disk space.") - def test_big_buffer(self): - self.assertEqual(zlib.crc32(self.mapping), 3058686908) - self.assertEqual(zlib.adler32(self.mapping), 82837919) + @bigmemtest(size=_4G + 4, memuse=1, dry_run=False) + def test_big_buffer(self, size): + data = b"nyan" * (_1G + 1) + self.assertEqual(zlib.crc32(data), 1044521549) + self.assertEqual(zlib.adler32(data), 2256789997) class ExceptionTestCase(unittest.TestCase): @@ -197,10 +179,8 @@ 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) @@ -554,10 +534,8 @@ 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() -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Feb 23 16:48:50 2012 From: python-checkins at python.org (benjamin.peterson) Date: Thu, 23 Feb 2012 16:48:50 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=283=2E1=29=3A_version_now_3?= =?utf8?q?=2E1=2E5rc1?= Message-ID: http://hg.python.org/cpython/rev/ee26aca3219c changeset: 75195:ee26aca3219c branch: 3.1 tag: v3.1.5rc1 parent: 75155:358aee0a9ad5 user: Benjamin Peterson date: Thu Feb 23 10:45:48 2012 -0500 summary: version now 3.1.5rc1 files: Include/patchlevel.h | 8 ++++---- Lib/distutils/__init__.py | 2 +- Lib/idlelib/idlever.py | 2 +- Misc/NEWS | 2 +- Misc/RPM/python-3.1.spec | 2 +- README | 2 +- 6 files changed, 9 insertions(+), 9 deletions(-) diff --git a/Include/patchlevel.h b/Include/patchlevel.h --- a/Include/patchlevel.h +++ b/Include/patchlevel.h @@ -18,12 +18,12 @@ /*--start constants--*/ #define PY_MAJOR_VERSION 3 #define PY_MINOR_VERSION 1 -#define PY_MICRO_VERSION 4 -#define PY_RELEASE_LEVEL PY_RELEASE_LEVEL_FINAL -#define PY_RELEASE_SERIAL 0 +#define PY_MICRO_VERSION 5 +#define PY_RELEASE_LEVEL PY_RELEASE_LEVEL_GAMMA +#define PY_RELEASE_SERIAL 1 /* Version as a string */ -#define PY_VERSION "3.1.4+" +#define PY_VERSION "3.1.5rc1" /*--end constants--*/ /* Subversion Revision number of this file (not of the repository). Empty diff --git a/Lib/distutils/__init__.py b/Lib/distutils/__init__.py --- a/Lib/distutils/__init__.py +++ b/Lib/distutils/__init__.py @@ -15,5 +15,5 @@ # Updated automatically by the Python release process. # #--start constants-- -__version__ = "3.1.4" +__version__ = "3.1.5rc1" #--end constants-- diff --git a/Lib/idlelib/idlever.py b/Lib/idlelib/idlever.py --- a/Lib/idlelib/idlever.py +++ b/Lib/idlelib/idlever.py @@ -1,1 +1,1 @@ -IDLE_VERSION = "3.1.4" +IDLE_VERSION = "3.1.5rc1" diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -5,7 +5,7 @@ What's New in Python 3.1.5? =========================== -*Release date: XXXX-XX-XX* +*Release date: 2012-02-23* Core and Builtins ----------------- diff --git a/Misc/RPM/python-3.1.spec b/Misc/RPM/python-3.1.spec --- a/Misc/RPM/python-3.1.spec +++ b/Misc/RPM/python-3.1.spec @@ -34,7 +34,7 @@ %define name python #--start constants-- -%define version 3.1.4 +%define version 3.1.5rc1 %define libvers 3.1 #--end constants-- %define release 1pydotorg diff --git a/README b/README --- a/README +++ b/README @@ -1,4 +1,4 @@ -This is Python version 3.1.4 +This is Python version 3.1.5 ============================ Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Feb 23 16:48:52 2012 From: python-checkins at python.org (benjamin.peterson) Date: Thu, 23 Feb 2012 16:48:52 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=283=2E1=29=3A_Added_tag_v3=2E?= =?utf8?q?1=2E5rc1_for_changeset_ee26aca3219c?= Message-ID: http://hg.python.org/cpython/rev/a71de4f4412d changeset: 75196:a71de4f4412d branch: 3.1 user: Benjamin Peterson date: Thu Feb 23 10:46:00 2012 -0500 summary: Added tag v3.1.5rc1 for changeset ee26aca3219c files: .hgtags | 1 + 1 files changed, 1 insertions(+), 0 deletions(-) diff --git a/.hgtags b/.hgtags --- a/.hgtags +++ b/.hgtags @@ -77,3 +77,4 @@ a4f75773c0060cee38b0bb651a7aba6f56b0e996 v3.1.3 32fcb9e94985cb19ce37ba9543f091c0dbe9d7dd v3.1.4rc1 c918ec9f3a76d6afedfbb5d455004de880443a3d v3.1.4 +ee26aca3219cf4bb0b93352e83edcc9cb28c7802 v3.1.5rc1 -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Feb 23 16:48:53 2012 From: python-checkins at python.org (benjamin.peterson) Date: Thu, 23 Feb 2012 16:48:53 +0100 Subject: [Python-checkins] =?utf8?b?Y3B5dGhvbiAobWVyZ2UgMy4xIC0+IDMuMik6?= =?utf8?q?_merge_3=2E1_=28with_3=2E1=2E5rc1_release_tag=29?= Message-ID: http://hg.python.org/cpython/rev/2fe39437e243 changeset: 75197:2fe39437e243 branch: 3.2 parent: 75178:eb46c8f44aae parent: 75196:a71de4f4412d user: Benjamin Peterson date: Thu Feb 23 10:48:03 2012 -0500 summary: merge 3.1 (with 3.1.5rc1 release tag) files: .hgtags | 1 + 1 files changed, 1 insertions(+), 0 deletions(-) diff --git a/.hgtags b/.hgtags --- a/.hgtags +++ b/.hgtags @@ -77,6 +77,7 @@ a4f75773c0060cee38b0bb651a7aba6f56b0e996 v3.1.3 32fcb9e94985cb19ce37ba9543f091c0dbe9d7dd v3.1.4rc1 c918ec9f3a76d6afedfbb5d455004de880443a3d v3.1.4 +ee26aca3219cf4bb0b93352e83edcc9cb28c7802 v3.1.5rc1 b37b7834757492d009b99cf0ca4d42d2153d7fac v3.2a1 56d4373cecb73c8b45126ba7b045b3c7b3f94b0b v3.2a2 da012d9a2c23d144e399d2e01a55b8a83ad94573 v3.2a3 -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Feb 23 16:48:53 2012 From: python-checkins at python.org (benjamin.peterson) Date: Thu, 23 Feb 2012 16:48:53 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_3=2E2_-=3E_default=29?= =?utf8?q?=3A_merge_3=2E2?= Message-ID: http://hg.python.org/cpython/rev/f3dd47aaff86 changeset: 75198:f3dd47aaff86 parent: 75194:6f578f73d14a parent: 75197:2fe39437e243 user: Benjamin Peterson date: Thu Feb 23 10:48:22 2012 -0500 summary: merge 3.2 files: .hgtags | 1 + 1 files changed, 1 insertions(+), 0 deletions(-) diff --git a/.hgtags b/.hgtags --- a/.hgtags +++ b/.hgtags @@ -77,6 +77,7 @@ a4f75773c0060cee38b0bb651a7aba6f56b0e996 v3.1.3 32fcb9e94985cb19ce37ba9543f091c0dbe9d7dd v3.1.4rc1 c918ec9f3a76d6afedfbb5d455004de880443a3d v3.1.4 +ee26aca3219cf4bb0b93352e83edcc9cb28c7802 v3.1.5rc1 b37b7834757492d009b99cf0ca4d42d2153d7fac v3.2a1 56d4373cecb73c8b45126ba7b045b3c7b3f94b0b v3.2a2 da012d9a2c23d144e399d2e01a55b8a83ad94573 v3.2a3 -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Feb 23 16:54:43 2012 From: python-checkins at python.org (benjamin.peterson) Date: Thu, 23 Feb 2012 16:54:43 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=283=2E1=29=3A_update_copyrigh?= =?utf8?q?t_year?= Message-ID: http://hg.python.org/cpython/rev/df3b2b5db900 changeset: 75199:df3b2b5db900 branch: 3.1 parent: 75196:a71de4f4412d user: Benjamin Peterson date: Thu Feb 23 10:53:44 2012 -0500 summary: update copyright year files: README | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/README b/README --- a/README +++ b/README @@ -1,7 +1,7 @@ This is Python version 3.1.5 ============================ -Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 +Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 Python Software Foundation. All rights reserved. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Feb 23 16:54:43 2012 From: python-checkins at python.org (benjamin.peterson) Date: Thu, 23 Feb 2012 16:54:43 +0100 Subject: [Python-checkins] =?utf8?b?Y3B5dGhvbiAobWVyZ2UgMy4xIC0+IDMuMik6?= =?utf8?q?_merge_3=2E1?= Message-ID: http://hg.python.org/cpython/rev/85d08a1ba74e changeset: 75200:85d08a1ba74e branch: 3.2 parent: 75197:2fe39437e243 parent: 75199:df3b2b5db900 user: Benjamin Peterson date: Thu Feb 23 10:54:28 2012 -0500 summary: merge 3.1 files: -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Feb 23 16:54:44 2012 From: python-checkins at python.org (benjamin.peterson) Date: Thu, 23 Feb 2012 16:54:44 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_3=2E2_-=3E_default=29?= =?utf8?q?=3A_merge_3=2E2?= Message-ID: http://hg.python.org/cpython/rev/3828d93fd330 changeset: 75201:3828d93fd330 parent: 75198:f3dd47aaff86 parent: 75200:85d08a1ba74e user: Benjamin Peterson date: Thu Feb 23 10:54:36 2012 -0500 summary: merge 3.2 files: -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Feb 23 16:55:38 2012 From: python-checkins at python.org (benjamin.peterson) Date: Thu, 23 Feb 2012 16:55:38 +0100 Subject: [Python-checkins] =?utf8?b?Y3B5dGhvbiAoMi43KTogYnVtcCB0byAyLjcu?= =?utf8?q?3rc1?= Message-ID: http://hg.python.org/cpython/rev/b2c6aff96e12 changeset: 75202:b2c6aff96e12 branch: 2.7 tag: v2.7.3rc1 parent: 75189:dec65cb98128 user: Benjamin Peterson date: Thu Feb 23 10:52:17 2012 -0500 summary: bump to 2.7.3rc1 files: Include/patchlevel.h | 8 ++++---- Lib/distutils/__init__.py | 2 +- Lib/idlelib/idlever.py | 2 +- Misc/NEWS | 8 ++++---- Misc/RPM/python-2.7.spec | 2 +- README | 2 +- 6 files changed, 12 insertions(+), 12 deletions(-) diff --git a/Include/patchlevel.h b/Include/patchlevel.h --- a/Include/patchlevel.h +++ b/Include/patchlevel.h @@ -22,12 +22,12 @@ /*--start constants--*/ #define PY_MAJOR_VERSION 2 #define PY_MINOR_VERSION 7 -#define PY_MICRO_VERSION 2 -#define PY_RELEASE_LEVEL PY_RELEASE_LEVEL_FINAL -#define PY_RELEASE_SERIAL 0 +#define PY_MICRO_VERSION 3 +#define PY_RELEASE_LEVEL PY_RELEASE_LEVEL_GAMMA +#define PY_RELEASE_SERIAL 1 /* Version as a string */ -#define PY_VERSION "2.7.2+" +#define PY_VERSION "2.7.3rc1" /*--end constants--*/ /* Subversion Revision number of this file (not of the repository). Empty diff --git a/Lib/distutils/__init__.py b/Lib/distutils/__init__.py --- a/Lib/distutils/__init__.py +++ b/Lib/distutils/__init__.py @@ -15,5 +15,5 @@ # Updated automatically by the Python release process. # #--start constants-- -__version__ = "2.7.2" +__version__ = "2.7.3rc1" #--end constants-- diff --git a/Lib/idlelib/idlever.py b/Lib/idlelib/idlever.py --- a/Lib/idlelib/idlever.py +++ b/Lib/idlelib/idlever.py @@ -1,1 +1,1 @@ -IDLE_VERSION = "2.7.2" +IDLE_VERSION = "2.7.3rc1" diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -1,10 +1,10 @@ Python News +++++++++++ -What's New in Python 2.7.3? -=========================== - -*Release date: XXXX-XX-XX* +What's New in Python 2.7.3 release candidate 1? +=============================================== + +*Release date: 2012-02-23* Core and Builtins ----------------- diff --git a/Misc/RPM/python-2.7.spec b/Misc/RPM/python-2.7.spec --- a/Misc/RPM/python-2.7.spec +++ b/Misc/RPM/python-2.7.spec @@ -39,7 +39,7 @@ %define name python #--start constants-- -%define version 2.7.2 +%define version 2.7.3rc1 %define libvers 2.7 #--end constants-- %define release 1pydotorg diff --git a/README b/README --- a/README +++ b/README @@ -1,4 +1,4 @@ -This is Python version 2.7.2 +This is Python version 2.7.3 ============================ Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Feb 23 16:55:39 2012 From: python-checkins at python.org (benjamin.peterson) Date: Thu, 23 Feb 2012 16:55:39 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=282=2E7=29=3A_Added_tag_v2=2E?= =?utf8?q?7=2E3rc1_for_changeset_b2c6aff96e12?= Message-ID: http://hg.python.org/cpython/rev/be5470d76a82 changeset: 75203:be5470d76a82 branch: 2.7 user: Benjamin Peterson date: Thu Feb 23 10:52:23 2012 -0500 summary: Added tag v2.7.3rc1 for changeset b2c6aff96e12 files: .hgtags | 1 + 1 files changed, 1 insertions(+), 0 deletions(-) diff --git a/.hgtags b/.hgtags --- a/.hgtags +++ b/.hgtags @@ -150,3 +150,4 @@ 5395f96588d4f0199d329cb79eb109648dc4ef5e v2.7.1 f48756685406e8d0fa9d23d841fceb07e36a5656 v2.7.2rc1 8527427914a29d895bcb30be76a465143993a793 v2.7.2 +b2c6aff96e1251a4f03cf866e7e75fb8232869f2 v2.7.3rc1 -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Feb 23 17:04:19 2012 From: python-checkins at python.org (barry.warsaw) Date: Thu, 23 Feb 2012 17:04:19 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=282=2E6=29=3A_Bump_to_version?= =?utf8?q?_2=2E6=2E8rc1=2E?= Message-ID: http://hg.python.org/cpython/rev/4fe560d84b04 changeset: 75204:4fe560d84b04 branch: 2.6 parent: 75188:0f095a0f124c user: Barry Warsaw date: Thu Feb 23 10:55:57 2012 -0500 summary: Bump to version 2.6.8rc1. files: Include/patchlevel.h | 8 ++++---- Lib/distutils/__init__.py | 2 +- Lib/idlelib/idlever.py | 2 +- Lib/pydoc_topics.py | 6 +++--- Misc/NEWS | 2 +- Misc/RPM/python-2.6.spec | 4 ++-- README | 7 ++++--- 7 files changed, 16 insertions(+), 15 deletions(-) diff --git a/Include/patchlevel.h b/Include/patchlevel.h --- a/Include/patchlevel.h +++ b/Include/patchlevel.h @@ -22,12 +22,12 @@ /*--start constants--*/ #define PY_MAJOR_VERSION 2 #define PY_MINOR_VERSION 6 -#define PY_MICRO_VERSION 7 -#define PY_RELEASE_LEVEL PY_RELEASE_LEVEL_FINAL -#define PY_RELEASE_SERIAL 0 +#define PY_MICRO_VERSION 8 +#define PY_RELEASE_LEVEL PY_RELEASE_LEVEL_GAMMA +#define PY_RELEASE_SERIAL 1 /* Version as a string */ -#define PY_VERSION "2.6.7+" +#define PY_VERSION "2.6.8rc1" /*--end constants--*/ /* Subversion Revision number of this file (not of the repository) */ diff --git a/Lib/distutils/__init__.py b/Lib/distutils/__init__.py --- a/Lib/distutils/__init__.py +++ b/Lib/distutils/__init__.py @@ -22,5 +22,5 @@ # #--start constants-- -__version__ = "2.6.7" +__version__ = "2.6.8rc1" #--end constants-- diff --git a/Lib/idlelib/idlever.py b/Lib/idlelib/idlever.py --- a/Lib/idlelib/idlever.py +++ b/Lib/idlelib/idlever.py @@ -1,1 +1,1 @@ -IDLE_VERSION = "2.6.7" +IDLE_VERSION = "2.6.8rc1" diff --git a/Lib/pydoc_topics.py b/Lib/pydoc_topics.py --- a/Lib/pydoc_topics.py +++ b/Lib/pydoc_topics.py @@ -1,4 +1,4 @@ -# Autogenerated by Sphinx on Fri Jun 3 17:50:16 2011 +# Autogenerated by Sphinx on Thu Feb 23 10:54:32 2012 topics = {'assert': u'\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': u'\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\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 is recursively defined as\nfollows.\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. (This rule is relaxed as of\n Python 1.5; in earlier versions, the object had to be a tuple.\n Since strings are sequences, an assignment like ``a, b = "xy"`` is\n now legal as long as the string has the right length.)\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`` statement in the\n current code block: the name is bound to the object in the current\n local namespace.\n\n * Otherwise: the name is bound to the object in the current global\n namespace.\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 a plain integer. If it is negative, the\n sequence\'s length is added to it. The resulting value must be a\n nonnegative integer less than the sequence\'s length, and the\n sequence is asked to assign the assigned object to its item with\n that index. If the index is out of range, ``IndexError`` is raised\n (assignment to a subscripted sequence cannot add new items to a\n 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* 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 (small) integers. If either\n bound is negative, the sequence\'s length is added to it. The\n resulting bounds are clipped to lie between zero and the sequence\'s\n length, inclusive. Finally, the sequence object is asked to replace\n the slice with the items of the assigned sequence. The length of\n the 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\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': u'\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', @@ -24,7 +24,7 @@ 'context-managers': u'\nWith Statement Context Managers\n*******************************\n\nNew in version 2.5.\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': u'\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': u'\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," the arguments\nare coerced using the coercion rules listed at *Coercion rules*. If\nboth arguments are standard numeric types, the following coercions are\napplied:\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, if either argument is a long integer, the other is\n converted to long integer;\n\n* otherwise, both must be plain integers and no conversion is\n necessary.\n\nSome additional rules apply for certain operators (e.g., a string left\nargument to the \'%\' operator). Extensions can define their own\ncoercions.\n', - 'customization': u'\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_traceback`` 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.exc_traceback`` or ``sys.last_traceback``. Circular\n references which are garbage are detected when the option cycle\n detector is enabled (it\'s on by default), but can only be cleaned\n up if there are no Python-level ``__del__()`` methods involved.\n Refer to the documentation for the ``gc`` module for more\n information about how ``__del__()`` methods are handled by the\n cycle detector, particularly the description of the ``garbage``\n 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 and by string\n conversions (reverse quotes) to compute the "official" string\n representation of an object. If at all possible, this should look\n like a valid Python expression that could be used to recreate an\n object with the same value (given an appropriate environment). If\n this is not possible, a string of the form ``<...some useful\n description...>`` should be returned. The return value must be a\n string object. If a class defines ``__repr__()`` but not\n ``__str__()``, then ``__repr__()`` is also used when an "informal"\n string representation of instances of that class is 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 statement 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.__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 New in version 2.1.\n\n These are the so-called "rich comparison" methods, and are called\n for comparison operators in preference to ``__cmp__()`` below. The\n correspondence between operator symbols and method names is as\n follows: ``xy`` call ``x.__ne__(y)``, ``x>y`` calls ``x.__gt__(y)``, and\n ``x>=y`` calls ``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 the Total Ordering recipe in the ASPN cookbook.\n\nobject.__cmp__(self, other)\n\n Called by comparison operations if rich comparison (see above) is\n not defined. Should return a negative integer if ``self < other``,\n zero if ``self == other``, a positive integer if ``self > other``.\n If no ``__cmp__()``, ``__eq__()`` or ``__ne__()`` operation is\n defined, class instances are compared by object identity\n ("address"). See also the description of ``__hash__()`` for some\n important notes on creating *hashable* objects which support custom\n comparison operations and are usable as dictionary keys. (Note: the\n restriction that exceptions are not propagated by ``__cmp__()`` has\n been removed since Python 1.5.)\n\nobject.__rcmp__(self, other)\n\n Changed in version 2.1: No longer supported.\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 a ``__cmp__()`` or ``__eq__()`` method\n it should not define a ``__hash__()`` operation either; if it\n defines ``__cmp__()`` or ``__eq__()`` but not ``__hash__()``, its\n instances will not be usable in hashed collections. If a class\n defines mutable objects and implements a ``__cmp__()`` or\n ``__eq__()`` method, it should not implement ``__hash__()``, since\n hashable collection implementations require that a object\'s hash\n value is immutable (if the object\'s hash value changes, it will be\n in the wrong hash bucket).\n\n User-defined classes have ``__cmp__()`` 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 ``__cmp__()`` or ``__eq__()`` such that\n the hash value returned is no longer appropriate (e.g. by switching\n to a value-based concept of equality instead of the default\n identity based equality) can explicitly flag themselves as being\n unhashable by setting ``__hash__ = None`` in the class definition.\n Doing so means that not only will instances of the class raise an\n appropriate ``TypeError`` when a program attempts to retrieve their\n hash value, but they will also be correctly identified as\n unhashable when checking ``isinstance(obj, collections.Hashable)``\n (unlike classes which define their own ``__hash__()`` to explicitly\n raise ``TypeError``).\n\n Changed in version 2.5: ``__hash__()`` may now also return a long\n integer object; the 32-bit integer is then derived from the hash of\n that object.\n\n Changed in version 2.6: ``__hash__`` may now be set to ``None`` to\n explicitly flag instances of a class as unhashable.\n\nobject.__nonzero__(self)\n\n Called to implement truth value testing and the built-in operation\n ``bool()``; should return ``False`` or ``True``, or their integer\n equivalents ``0`` or ``1``. When this method is not defined,\n ``__len__()`` is called, if it is defined, and the object is\n considered true if its result is nonzero. If a class defines\n neither ``__len__()`` nor ``__nonzero__()``, all its instances are\n considered true.\n\nobject.__unicode__(self)\n\n Called to implement ``unicode()`` built-in; should return a Unicode\n object. When this method is not defined, string conversion is\n attempted, and the result of string conversion is converted to\n Unicode using the system default encoding.\n', + 'customization': u'\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_traceback`` 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.exc_traceback`` or ``sys.last_traceback``. Circular\n references which are garbage are detected when the option cycle\n detector is enabled (it\'s on by default), but can only be cleaned\n up if there are no Python-level ``__del__()`` methods involved.\n Refer to the documentation for the ``gc`` module for more\n information about how ``__del__()`` methods are handled by the\n cycle detector, particularly the description of the ``garbage``\n 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\n See also the *-R* command-line option.\n\nobject.__repr__(self)\n\n Called by the ``repr()`` built-in function and by string\n conversions (reverse quotes) to compute the "official" string\n representation of an object. If at all possible, this should look\n like a valid Python expression that could be used to recreate an\n object with the same value (given an appropriate environment). If\n this is not possible, a string of the form ``<...some useful\n description...>`` should be returned. The return value must be a\n string object. If a class defines ``__repr__()`` but not\n ``__str__()``, then ``__repr__()`` is also used when an "informal"\n string representation of instances of that class is 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 statement 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.__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 New in version 2.1.\n\n These are the so-called "rich comparison" methods, and are called\n for comparison operators in preference to ``__cmp__()`` below. The\n correspondence between operator symbols and method names is as\n follows: ``xy`` call ``x.__ne__(y)``, ``x>y`` calls ``x.__gt__(y)``, and\n ``x>=y`` calls ``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 the Total Ordering recipe in the ASPN cookbook.\n\nobject.__cmp__(self, other)\n\n Called by comparison operations if rich comparison (see above) is\n not defined. Should return a negative integer if ``self < other``,\n zero if ``self == other``, a positive integer if ``self > other``.\n If no ``__cmp__()``, ``__eq__()`` or ``__ne__()`` operation is\n defined, class instances are compared by object identity\n ("address"). See also the description of ``__hash__()`` for some\n important notes on creating *hashable* objects which support custom\n comparison operations and are usable as dictionary keys. (Note: the\n restriction that exceptions are not propagated by ``__cmp__()`` has\n been removed since Python 1.5.)\n\nobject.__rcmp__(self, other)\n\n Changed in version 2.1: No longer supported.\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 a ``__cmp__()`` or ``__eq__()`` method\n it should not define a ``__hash__()`` operation either; if it\n defines ``__cmp__()`` or ``__eq__()`` but not ``__hash__()``, its\n instances will not be usable in hashed collections. If a class\n defines mutable objects and implements a ``__cmp__()`` or\n ``__eq__()`` method, it should not implement ``__hash__()``, since\n hashable collection implementations require that a object\'s hash\n value is immutable (if the object\'s hash value changes, it will be\n in the wrong hash bucket).\n\n User-defined classes have ``__cmp__()`` 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 ``__cmp__()`` or ``__eq__()`` such that\n the hash value returned is no longer appropriate (e.g. by switching\n to a value-based concept of equality instead of the default\n identity based equality) can explicitly flag themselves as being\n unhashable by setting ``__hash__ = None`` in the class definition.\n Doing so means that not only will instances of the class raise an\n appropriate ``TypeError`` when a program attempts to retrieve their\n hash value, but they will also be correctly identified as\n unhashable when checking ``isinstance(obj, collections.Hashable)``\n (unlike classes which define their own ``__hash__()`` to explicitly\n raise ``TypeError``).\n\n Changed in version 2.5: ``__hash__()`` may now also return a long\n integer object; the 32-bit integer is then derived from the hash of\n that object.\n\n Changed in version 2.6: ``__hash__`` may now be set to ``None`` to\n explicitly flag instances of a class as unhashable.\n\nobject.__nonzero__(self)\n\n Called to implement truth value testing and the built-in operation\n ``bool()``; should return ``False`` or ``True``, or their integer\n equivalents ``0`` or ``1``. When this method is not defined,\n ``__len__()`` is called, if it is defined, and the object is\n considered true if its result is nonzero. If a class defines\n neither ``__len__()`` nor ``__nonzero__()``, all its instances are\n considered true.\n\nobject.__unicode__(self)\n\n Called to implement ``unicode()`` built-in; should return a Unicode\n object. When this method is not defined, string conversion is\n attempted, and the result of string conversion is converted to\n Unicode using the system default encoding.\n', 'debugger': u'\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 > (0)?()\n (Pdb) continue\n > (1)?()\n (Pdb) continue\n NameError: \'spam\'\n > (1)?()\n (Pdb)\n\n``pdb.py`` can also be invoked as a script to debug other scripts.\nFor example:\n\n python -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 2.4: Restarting post-mortem behavior added.\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 ``c`` 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 "", 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[, locals]])\n\n Execute the *statement* (given as a string) under debugger control.\n The debugger prompt appears before any code is executed; you can\n set breakpoints and type ``continue``, or you can step through the\n statement using ``step`` or ``next`` (all these commands are\n explained below). The optional *globals* and *locals* arguments\n specify the environment in which the code is executed; by default\n the dictionary of the module ``__main__`` is used. (See the\n explanation of the ``exec`` statement or the ``eval()`` built-in\n function.)\n\npdb.runeval(expression[, globals[, locals]])\n\n Evaluate the *expression* (given as a string) under debugger\n control. When ``runeval()`` returns, it returns the value of the\n expression. Otherwise this function is similar to ``run()``.\n\npdb.runcall(function[, argument, ...])\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])\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', 'del': u'\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 that 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\nIt is illegal to delete a name from the local namespace if it occurs\nas a free variable in a nested block.\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', 'dict': u'\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] "}"\n key_datum_list ::= key_datum ("," key_datum)* [","]\n key_datum ::= expression ":" expression\n\nA dictionary display yields a new dictionary object.\n\nThe key/datum pairs are evaluated from left to right to define the\nentries of the dictionary: each key object is used as a key into the\ndictionary to store the corresponding datum.\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', @@ -63,7 +63,7 @@ 'shifting': u'\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 plain or long integers as arguments. The\narguments are converted to a common type. 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,\nn)``. Negative shift counts raise a ``ValueError`` exception.\n', 'slicings': u'\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 ::= simple_slicing | extended_slicing\n simple_slicing ::= primary "[" short_slice "]"\n extended_slicing ::= primary "[" slice_list "]"\n slice_list ::= slice_item ("," slice_item)* [","]\n slice_item ::= expression | proper_slice | ellipsis\n proper_slice ::= short_slice | long_slice\n short_slice ::= [lower_bound] ":" [upper_bound]\n long_slice ::= short_slice ":" [stride]\n lower_bound ::= expression\n upper_bound ::= expression\n stride ::= expression\n ellipsis ::= "..."\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 nor ellipses). Similarly, when the slice\nlist has exactly one short slice and no trailing comma, the\ninterpretation as a simple slicing takes priority over that as an\nextended slicing.\n\nThe semantics for a simple slicing are as follows. The primary must\nevaluate to a sequence object. The lower and upper bound expressions,\nif present, must evaluate to plain integers; defaults are zero and the\n``sys.maxint``, respectively. If either bound is negative, the\nsequence\'s length is added to it. The slicing now selects all items\nwith index *k* such that ``i <= k < j`` where *i* and *j* are the\nspecified lower and upper bounds. This may be an empty sequence. It\nis not an error if *i* or *j* lie outside the range of valid indexes\n(such items don\'t exist so they aren\'t selected).\n\nThe semantics for an extended slicing are as follows. The primary\nmust evaluate to a mapping object, and it is indexed with a key that\nis constructed 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 an ellipsis slice\nitem is the built-in ``Ellipsis`` object. The conversion of a proper\nslice is a slice object (see section *The standard type hierarchy*)\nwhose ``start``, ``stop`` and ``step`` attributes are the values of\nthe expressions given as lower bound, upper bound and stride,\nrespectively, substituting ``None`` for missing expressions.\n', 'specialattrs': u"\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\nobject.__methods__\n\n Deprecated since version 2.2: Use the built-in function ``dir()``\n to get a list of an object's attributes. This attribute is no\n longer available.\n\nobject.__members__\n\n Deprecated since version 2.2: Use the built-in function ``dir()``\n to get a list of an object's attributes. This attribute is no\n longer available.\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\nThe following attributes are only supported by *new-style class*es.\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 new-style class keeps a list of weak references to its\n immediate subclasses. This method returns a list of all those\n references still alive. Example:\n\n >>> int.__subclasses__()\n []\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] To format only a tuple you should therefore provide a singleton\n tuple whose only element is the tuple to be formatted.\n\n[5] These numbers are fairly arbitrary. They are intended to avoid\n printing endless strings of meaningless digits without hampering\n correct use and without having to know the exact precision of\n floating point values on a particular machine.\n\n[6] The advantage of leaving the newline on is that returning an empty\n string is then an unambiguous EOF indication. It is also possible\n (in cases where it might matter, for example, if you want to make\n an exact copy of a file while scanning its lines) to tell whether\n the last line of a file ended in a newline or not (yes this\n happens!).\n", - 'specialnames': u'\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 ``x.__getitem__(i)`` for\nold-style classes and ``type(x).__getitem__(x, i)`` for new-style\nclasses. Except where mentioned, attempts to execute an operation\nraise an 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_traceback`` 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.exc_traceback`` or ``sys.last_traceback``. Circular\n references which are garbage are detected when the option cycle\n detector is enabled (it\'s on by default), but can only be cleaned\n up if there are no Python-level ``__del__()`` methods involved.\n Refer to the documentation for the ``gc`` module for more\n information about how ``__del__()`` methods are handled by the\n cycle detector, particularly the description of the ``garbage``\n 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 and by string\n conversions (reverse quotes) to compute the "official" string\n representation of an object. If at all possible, this should look\n like a valid Python expression that could be used to recreate an\n object with the same value (given an appropriate environment). If\n this is not possible, a string of the form ``<...some useful\n description...>`` should be returned. The return value must be a\n string object. If a class defines ``__repr__()`` but not\n ``__str__()``, then ``__repr__()`` is also used when an "informal"\n string representation of instances of that class is 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 statement 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.__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 New in version 2.1.\n\n These are the so-called "rich comparison" methods, and are called\n for comparison operators in preference to ``__cmp__()`` below. The\n correspondence between operator symbols and method names is as\n follows: ``xy`` call ``x.__ne__(y)``, ``x>y`` calls ``x.__gt__(y)``, and\n ``x>=y`` calls ``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 the Total Ordering recipe in the ASPN cookbook.\n\nobject.__cmp__(self, other)\n\n Called by comparison operations if rich comparison (see above) is\n not defined. Should return a negative integer if ``self < other``,\n zero if ``self == other``, a positive integer if ``self > other``.\n If no ``__cmp__()``, ``__eq__()`` or ``__ne__()`` operation is\n defined, class instances are compared by object identity\n ("address"). See also the description of ``__hash__()`` for some\n important notes on creating *hashable* objects which support custom\n comparison operations and are usable as dictionary keys. (Note: the\n restriction that exceptions are not propagated by ``__cmp__()`` has\n been removed since Python 1.5.)\n\nobject.__rcmp__(self, other)\n\n Changed in version 2.1: No longer supported.\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 a ``__cmp__()`` or ``__eq__()`` method\n it should not define a ``__hash__()`` operation either; if it\n defines ``__cmp__()`` or ``__eq__()`` but not ``__hash__()``, its\n instances will not be usable in hashed collections. If a class\n defines mutable objects and implements a ``__cmp__()`` or\n ``__eq__()`` method, it should not implement ``__hash__()``, since\n hashable collection implementations require that a object\'s hash\n value is immutable (if the object\'s hash value changes, it will be\n in the wrong hash bucket).\n\n User-defined classes have ``__cmp__()`` 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 ``__cmp__()`` or ``__eq__()`` such that\n the hash value returned is no longer appropriate (e.g. by switching\n to a value-based concept of equality instead of the default\n identity based equality) can explicitly flag themselves as being\n unhashable by setting ``__hash__ = None`` in the class definition.\n Doing so means that not only will instances of the class raise an\n appropriate ``TypeError`` when a program attempts to retrieve their\n hash value, but they will also be correctly identified as\n unhashable when checking ``isinstance(obj, collections.Hashable)``\n (unlike classes which define their own ``__hash__()`` to explicitly\n raise ``TypeError``).\n\n Changed in version 2.5: ``__hash__()`` may now also return a long\n integer object; the 32-bit integer is then derived from the hash of\n that object.\n\n Changed in version 2.6: ``__hash__`` may now be set to ``None`` to\n explicitly flag instances of a class as unhashable.\n\nobject.__nonzero__(self)\n\n Called to implement truth value testing and the built-in operation\n ``bool()``; should return ``False`` or ``True``, or their integer\n equivalents ``0`` or ``1``. When this method is not defined,\n ``__len__()`` is called, if it is defined, and the object is\n considered true if its result is nonzero. If a class defines\n neither ``__len__()`` nor ``__nonzero__()``, all its instances are\n considered true.\n\nobject.__unicode__(self)\n\n Called to implement ``unicode()`` built-in; should return a Unicode\n object. When this method is not defined, string conversion is\n attempted, and the result of string conversion is converted to\n Unicode using the system default encoding.\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 in new-style classes.\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 not simply execute ``self.name = value`` --- this would\n cause a recursive call to itself. Instead, it should insert the\n value in the dictionary of instance attributes, e.g.,\n ``self.__dict__[name] = value``. For new-style classes, rather\n than accessing the instance dictionary, it should call the base\n 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\n\nMore attribute access for new-style classes\n-------------------------------------------\n\nThe following methods only apply to new-style classes.\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 for new-style\n classes*.\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 the\nclass dictionary of another new-style class, known as the *owner*\nclass. In the examples below, "the attribute" refers to the attribute\nwhose name is the key of the property in the owner class\'\n``__dict__``. Descriptors can only be implemented as new-style\nclasses themselves.\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. Note that descriptors are only invoked for new\nstyle objects or classes (ones that subclass ``object()`` or\n``type()``).\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 a new-style object instance, ``a.x`` is transformed\n into the call: ``type(a).__dict__[\'x\'].__get__(a, type(a))``.\n\nClass Binding\n If binding to a new-style class, ``A.x`` is transformed into the\n call: ``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, A)``.\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 both old and new-style classes have a\ndictionary for attribute storage. This wastes space for objects\nhaving very few instance variables. The space consumption can become\nacute when creating large numbers of instances.\n\nThe default can be overridden by defining *__slots__* in a new-style\nclass definition. The *__slots__* declaration takes a sequence of\ninstance variables and reserves just enough space in each instance to\nhold a value for each variable. Space is saved because *__dict__* is\nnot created for each instance.\n\n__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 new-style class, *__slots__* reserves space for the declared\n variables and prevents the automatic creation of *__dict__* and\n *__weakref__* for each instance.\n\n New in version 2.2.\n\nNotes on using *__slots__*\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 Changed in version 2.3: Previously, adding ``\'__dict__\'`` to the\n *__slots__* declaration would not enable the assignment of new\n attributes not specifically listed in the sequence of instance\n variable names.\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 Changed in version 2.3: Previously, adding ``\'__weakref__\'`` to the\n *__slots__* declaration would not enable support for weak\n references.\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 ``long``, ``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 Changed in version 2.6: Previously, *__class__* assignment raised an\n error if either new or old class had *__slots__*.\n\n\nCustomizing class creation\n==========================\n\nBy default, new-style classes are constructed using ``type()``. A\nclass definition is read into a separate namespace and the value of\nclass name is bound to the result of ``type(name, bases, dict)``.\n\nWhen the class definition is read, if *__metaclass__* is defined then\nthe callable assigned to it will be called instead of ``type()``. 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\n__metaclass__\n\n This variable can be any callable accepting arguments for ``name``,\n ``bases``, and ``dict``. Upon class creation, the callable is used\n instead of the built-in ``type()``.\n\n New in version 2.2.\n\nThe appropriate metaclass is determined by the following precedence\nrules:\n\n* If ``dict[\'__metaclass__\']`` exists, it is used.\n\n* Otherwise, if there is at least one base class, its metaclass is\n used (this looks for a *__class__* attribute first and if not found,\n uses its type).\n\n* Otherwise, if a global variable named __metaclass__ exists, it is\n used.\n\n* Otherwise, the old-style, classic metaclass (types.ClassType) is\n 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\n\nCustomizing instance and subclass checks\n========================================\n\nNew in version 2.6.\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), and including to 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 that 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. (For backwards compatibility, the method\n``__getslice__()`` (see below) can also be defined to handle simple,\nbut not extended slices.) It is also recommended that mappings provide\nthe methods ``keys()``, ``values()``, ``items()``, ``has_key()``,\n``get()``, ``clear()``, ``setdefault()``, ``iterkeys()``,\n``itervalues()``, ``iteritems()``, ``pop()``, ``popitem()``,\n``copy()``, and ``update()`` behaving similar to those for Python\'s\nstandard dictionary objects. The ``UserDict`` module provides a\n``DictMixin`` class to help create those methods from a base set of\n``__getitem__()``, ``__setitem__()``, ``__delitem__()``, and\n``keys()``. Mutable sequences should provide methods ``append()``,\n``count()``, ``index()``, ``extend()``, ``insert()``, ``pop()``,\n``remove()``, ``reverse()`` and ``sort()``, like Python standard list\nobjects. Finally, sequence types should implement addition (meaning\nconcatenation) and multiplication (meaning repetition) by defining the\nmethods ``__add__()``, ``__radd__()``, ``__iadd__()``, ``__mul__()``,\n``__rmul__()`` and ``__imul__()`` described below; they should not\ndefine ``__coerce__()`` or other numerical operators. It is\nrecommended that both mappings and sequences implement the\n``__contains__()`` method to allow efficient use of the ``in``\noperator; for mappings, ``in`` should be equivalent of ``has_key()``;\nfor sequences, 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``iterkeys()``; 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 ``__nonzero__()`` method and whose\n ``__len__()`` method returns zero is considered to be false in a\n Boolean context.\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 ``iterkeys()``.\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\n New in version 2.6.\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\nAdditional methods for emulation of sequence types\n==================================================\n\nThe following optional methods can be defined to further emulate\nsequence objects. Immutable sequences methods should at most only\ndefine ``__getslice__()``; mutable sequences might define all three\nmethods.\n\nobject.__getslice__(self, i, j)\n\n Deprecated since version 2.0: Support slice objects as parameters\n to the ``__getitem__()`` method. (However, built-in types in\n CPython currently still implement ``__getslice__()``. Therefore,\n you have to override it in derived classes when implementing\n slicing.)\n\n Called to implement evaluation of ``self[i:j]``. The returned\n object should be of the same type as *self*. Note that missing *i*\n or *j* in the slice expression are replaced by zero or\n ``sys.maxint``, respectively. If negative indexes are used in the\n slice, the length of the sequence is added to that index. If the\n instance does not implement the ``__len__()`` method, an\n ``AttributeError`` is raised. No guarantee is made that indexes\n adjusted this way are not still negative. Indexes which are\n greater than the length of the sequence are not modified. If no\n ``__getslice__()`` is found, a slice object is created instead, and\n passed to ``__getitem__()`` instead.\n\nobject.__setslice__(self, i, j, sequence)\n\n Called to implement assignment to ``self[i:j]``. Same notes for *i*\n and *j* as for ``__getslice__()``.\n\n This method is deprecated. If no ``__setslice__()`` is found, or\n for extended slicing of the form ``self[i:j:k]``, a slice object is\n created, and passed to ``__setitem__()``, instead of\n ``__setslice__()`` being called.\n\nobject.__delslice__(self, i, j)\n\n Called to implement deletion of ``self[i:j]``. Same notes for *i*\n and *j* as for ``__getslice__()``. This method is deprecated. If no\n ``__delslice__()`` is found, or for extended slicing of the form\n ``self[i:j:k]``, a slice object is created, and passed to\n ``__delitem__()``, instead of ``__delslice__()`` being called.\n\nNotice that these methods are only invoked when a single slice with a\nsingle colon is used, and the slice method is available. For slice\noperations involving extended slice notation, or in absence of the\nslice methods, ``__getitem__()``, ``__setitem__()`` or\n``__delitem__()`` is called with a slice object as argument.\n\nThe following example demonstrate how to make your program or module\ncompatible with earlier versions of Python (assuming that methods\n``__getitem__()``, ``__setitem__()`` and ``__delitem__()`` support\nslice objects as arguments):\n\n class MyClass:\n ...\n def __getitem__(self, index):\n ...\n def __setitem__(self, index, value):\n ...\n def __delitem__(self, index):\n ...\n\n if sys.version_info < (2, 0):\n # They won\'t be defined if version is at least 2.0 final\n\n def __getslice__(self, i, j):\n return self[max(0, i):max(0, j):]\n def __setslice__(self, i, j, seq):\n self[max(0, i):max(0, j):] = seq\n def __delslice__(self, i, j):\n del self[max(0, i):max(0, j):]\n ...\n\nNote the calls to ``max()``; these are necessary because of the\nhandling of negative indices before the ``__*slice__()`` methods are\ncalled. When negative indexes are used, the ``__*item__()`` methods\nreceive them as provided, but the ``__*slice__()`` methods get a\n"cooked" form of the index values. For each negative index value, the\nlength of the sequence is added to the index before calling the method\n(which may still result in a negative index); this is the customary\nhandling of negative indexes by the built-in sequence types, and the\n``__*item__()`` methods are expected to do this as well. However,\nsince they should already be doing that, negative indexes cannot be\npassed in; they must be constrained to the bounds of the sequence\nbefore being passed to the ``__*item__()`` methods. Calling ``max(0,\ni)`` conveniently returns the proper value.\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.__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 (``+``, ``-``, ``*``, ``//``, ``%``, ``divmod()``,\n ``pow()``, ``**``, ``<<``, ``>>``, ``&``, ``^``, ``|``). For\n instance, to evaluate the expression ``x + y``, where *x* is an\n 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__()`` (described below). Note\n that ``__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.__div__(self, other)\nobject.__truediv__(self, other)\n\n The division operator (``/``) is implemented by these methods. The\n ``__truediv__()`` method is used when ``__future__.division`` is in\n effect, otherwise ``__div__()`` is used. If only one of these two\n methods is defined, the object will not support division in the\n alternate context; ``TypeError`` will be raised instead.\n\nobject.__radd__(self, other)\nobject.__rsub__(self, other)\nobject.__rmul__(self, other)\nobject.__rdiv__(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 (``+``, ``-``, ``*``, ``/``, ``%``, ``divmod()``,\n ``pow()``, ``**``, ``<<``, ``>>``, ``&``, ``^``, ``|``) with\n reflected (swapped) operands. These functions are only called if\n the left operand does not support the corresponding operation and\n the operands are of different types. [2] For instance, to evaluate\n the expression ``x - y``, where *y* is an instance of a class that\n has an ``__rsub__()`` method, ``y.__rsub__(x)`` is called if\n ``x.__sub__(y)`` returns *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.__idiv__(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.__long__(self)\nobject.__float__(self)\n\n Called to implement the built-in functions ``complex()``,\n ``int()``, ``long()``, and ``float()``. Should return a value of\n the appropriate type.\n\nobject.__oct__(self)\nobject.__hex__(self)\n\n Called to implement the built-in functions ``oct()`` and ``hex()``.\n Should return a string value.\n\nobject.__index__(self)\n\n Called to implement ``operator.index()``. Also called whenever\n Python needs an integer object (such as in slicing). Must return\n an integer (int or long).\n\n New in version 2.5.\n\nobject.__coerce__(self, other)\n\n Called to implement "mixed-mode" numeric arithmetic. Should either\n return a 2-tuple containing *self* and *other* converted to a\n common numeric type, or ``None`` if conversion is impossible. When\n the common type would be the type of ``other``, it is sufficient to\n return ``None``, since the interpreter will also ask the other\n object to attempt a coercion (but sometimes, if the implementation\n of the other type cannot be changed, it is useful to do the\n conversion to the other type here). A return value of\n ``NotImplemented`` is equivalent to returning ``None``.\n\n\nCoercion rules\n==============\n\nThis section used to document the rules for coercion. As the language\nhas evolved, the coercion rules have become hard to document\nprecisely; documenting what one version of one particular\nimplementation does is undesirable. Instead, here are some informal\nguidelines regarding coercion. In Python 3.0, coercion will not be\nsupported.\n\n* If the left operand of a % operator is a string or Unicode object,\n no coercion takes place and the string formatting operation is\n invoked instead.\n\n* It is no longer recommended to define a coercion operation. Mixed-\n mode operations on types that don\'t define coercion pass the\n original arguments to the operation.\n\n* New-style classes (those derived from ``object``) never invoke the\n ``__coerce__()`` method in response to a binary operator; the only\n time ``__coerce__()`` is invoked is when the built-in function\n ``coerce()`` is called.\n\n* For most intents and purposes, an operator that returns\n ``NotImplemented`` is treated the same as one that is not\n implemented at all.\n\n* Below, ``__op__()`` and ``__rop__()`` are used to signify the\n generic method names corresponding to an operator; ``__iop__()`` is\n used for the corresponding in-place operator. For example, for the\n operator \'``+``\', ``__add__()`` and ``__radd__()`` are used for the\n left and right variant of the binary operator, and ``__iadd__()``\n for the in-place variant.\n\n* For objects *x* and *y*, first ``x.__op__(y)`` is tried. If this is\n not implemented or returns ``NotImplemented``, ``y.__rop__(x)`` is\n tried. If this is also not implemented or returns\n ``NotImplemented``, a ``TypeError`` exception is raised. But see\n the following exception:\n\n* Exception to the previous item: if the left operand is an instance\n of a built-in type or a new-style class, and the right operand is an\n instance of a proper subclass of that type or class and overrides\n the base\'s ``__rop__()`` method, the right operand\'s ``__rop__()``\n method is tried *before* the left operand\'s ``__op__()`` method.\n\n This is done so that a subclass can completely override binary\n operators. Otherwise, the left operand\'s ``__op__()`` method would\n always accept the right operand: when an instance of a given class\n is expected, an instance of a subclass of that class is always\n acceptable.\n\n* When either operand type defines a coercion, this coercion is called\n before that type\'s ``__op__()`` or ``__rop__()`` method is called,\n but no sooner. If the coercion returns an object of a different\n type for the operand whose coercion is invoked, part of the process\n is redone using the new object.\n\n* When an in-place operator (like \'``+=``\') is used, if the left\n operand implements ``__iop__()``, it is invoked without any\n coercion. When the operation falls back to ``__op__()`` and/or\n ``__rop__()``, the normal coercion rules apply.\n\n* In ``x + y``, if *x* is a sequence that implements sequence\n concatenation, sequence concatenation is invoked.\n\n* In ``x * y``, if one operator is a sequence that implements sequence\n repetition, and the other is an integer (``int`` or ``long``),\n sequence repetition is invoked.\n\n* Rich comparisons (implemented by methods ``__eq__()`` and so on)\n never use coercion. Three-way comparison (implemented by\n ``__cmp__()``) does use coercion under the same conditions as other\n binary operations use it.\n\n* In the current implementation, the built-in numeric types ``int``,\n ``long`` and ``float`` do not use coercion; the type ``complex``\n however does use coercion for binary operators and rich comparisons,\n despite the above rules. The difference can become apparent when\n subclassing these types. Over time, the type ``complex`` may be\n fixed to avoid coercion. All these types implement a\n ``__coerce__()`` method, for use by the built-in ``coerce()``\n function.\n\n\nWith Statement Context Managers\n===============================\n\nNew in version 2.5.\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 for old-style classes\n===========================================\n\nFor old-style classes, special methods are always looked up in exactly\nthe same way as any other method or attribute. This is the case\nregardless of whether the method is being looked up explicitly as in\n``x.__getitem__(i)`` or implicitly as in ``x[i]``.\n\nThis behaviour means that special methods may exhibit different\nbehaviour for different instances of a single old-style class if the\nappropriate special attributes are set differently:\n\n >>> class C:\n ... pass\n ...\n >>> c1 = C()\n >>> c2 = C()\n >>> c1.__len__ = lambda: 5\n >>> c2.__len__ = lambda: 9\n >>> len(c1)\n 5\n >>> len(c2)\n 9\n\n\nSpecial method lookup for new-style classes\n===========================================\n\nFor new-style classes, implicit invocations of special methods are\nonly guaranteed to work correctly if defined on an object\'s type, not\nin the object\'s instance dictionary. That behaviour is the reason why\nthe following code raises an exception (unlike the equivalent example\nwith old-style classes):\n\n >>> class C(object):\n ... pass\n ...\n >>> c = C()\n >>> c.__len__ = lambda: 5\n >>> len(c)\n Traceback (most recent call last):\n File "", line 1, in \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 "", line 1, in \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):\n ... __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', + 'specialnames': u'\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 ``x.__getitem__(i)`` for\nold-style classes and ``type(x).__getitem__(x, i)`` for new-style\nclasses. Except where mentioned, attempts to execute an operation\nraise an 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_traceback`` 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.exc_traceback`` or ``sys.last_traceback``. Circular\n references which are garbage are detected when the option cycle\n detector is enabled (it\'s on by default), but can only be cleaned\n up if there are no Python-level ``__del__()`` methods involved.\n Refer to the documentation for the ``gc`` module for more\n information about how ``__del__()`` methods are handled by the\n cycle detector, particularly the description of the ``garbage``\n 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\n See also the *-R* command-line option.\n\nobject.__repr__(self)\n\n Called by the ``repr()`` built-in function and by string\n conversions (reverse quotes) to compute the "official" string\n representation of an object. If at all possible, this should look\n like a valid Python expression that could be used to recreate an\n object with the same value (given an appropriate environment). If\n this is not possible, a string of the form ``<...some useful\n description...>`` should be returned. The return value must be a\n string object. If a class defines ``__repr__()`` but not\n ``__str__()``, then ``__repr__()`` is also used when an "informal"\n string representation of instances of that class is 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 statement 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.__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 New in version 2.1.\n\n These are the so-called "rich comparison" methods, and are called\n for comparison operators in preference to ``__cmp__()`` below. The\n correspondence between operator symbols and method names is as\n follows: ``xy`` call ``x.__ne__(y)``, ``x>y`` calls ``x.__gt__(y)``, and\n ``x>=y`` calls ``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 the Total Ordering recipe in the ASPN cookbook.\n\nobject.__cmp__(self, other)\n\n Called by comparison operations if rich comparison (see above) is\n not defined. Should return a negative integer if ``self < other``,\n zero if ``self == other``, a positive integer if ``self > other``.\n If no ``__cmp__()``, ``__eq__()`` or ``__ne__()`` operation is\n defined, class instances are compared by object identity\n ("address"). See also the description of ``__hash__()`` for some\n important notes on creating *hashable* objects which support custom\n comparison operations and are usable as dictionary keys. (Note: the\n restriction that exceptions are not propagated by ``__cmp__()`` has\n been removed since Python 1.5.)\n\nobject.__rcmp__(self, other)\n\n Changed in version 2.1: No longer supported.\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 a ``__cmp__()`` or ``__eq__()`` method\n it should not define a ``__hash__()`` operation either; if it\n defines ``__cmp__()`` or ``__eq__()`` but not ``__hash__()``, its\n instances will not be usable in hashed collections. If a class\n defines mutable objects and implements a ``__cmp__()`` or\n ``__eq__()`` method, it should not implement ``__hash__()``, since\n hashable collection implementations require that a object\'s hash\n value is immutable (if the object\'s hash value changes, it will be\n in the wrong hash bucket).\n\n User-defined classes have ``__cmp__()`` 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 ``__cmp__()`` or ``__eq__()`` such that\n the hash value returned is no longer appropriate (e.g. by switching\n to a value-based concept of equality instead of the default\n identity based equality) can explicitly flag themselves as being\n unhashable by setting ``__hash__ = None`` in the class definition.\n Doing so means that not only will instances of the class raise an\n appropriate ``TypeError`` when a program attempts to retrieve their\n hash value, but they will also be correctly identified as\n unhashable when checking ``isinstance(obj, collections.Hashable)``\n (unlike classes which define their own ``__hash__()`` to explicitly\n raise ``TypeError``).\n\n Changed in version 2.5: ``__hash__()`` may now also return a long\n integer object; the 32-bit integer is then derived from the hash of\n that object.\n\n Changed in version 2.6: ``__hash__`` may now be set to ``None`` to\n explicitly flag instances of a class as unhashable.\n\nobject.__nonzero__(self)\n\n Called to implement truth value testing and the built-in operation\n ``bool()``; should return ``False`` or ``True``, or their integer\n equivalents ``0`` or ``1``. When this method is not defined,\n ``__len__()`` is called, if it is defined, and the object is\n considered true if its result is nonzero. If a class defines\n neither ``__len__()`` nor ``__nonzero__()``, all its instances are\n considered true.\n\nobject.__unicode__(self)\n\n Called to implement ``unicode()`` built-in; should return a Unicode\n object. When this method is not defined, string conversion is\n attempted, and the result of string conversion is converted to\n Unicode using the system default encoding.\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 in new-style classes.\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 not simply execute ``self.name = value`` --- this would\n cause a recursive call to itself. Instead, it should insert the\n value in the dictionary of instance attributes, e.g.,\n ``self.__dict__[name] = value``. For new-style classes, rather\n than accessing the instance dictionary, it should call the base\n 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\n\nMore attribute access for new-style classes\n-------------------------------------------\n\nThe following methods only apply to new-style classes.\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 for new-style\n classes*.\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 the\nclass dictionary of another new-style class, known as the *owner*\nclass. In the examples below, "the attribute" refers to the attribute\nwhose name is the key of the property in the owner class\'\n``__dict__``. Descriptors can only be implemented as new-style\nclasses themselves.\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. Note that descriptors are only invoked for new\nstyle objects or classes (ones that subclass ``object()`` or\n``type()``).\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 a new-style object instance, ``a.x`` is transformed\n into the call: ``type(a).__dict__[\'x\'].__get__(a, type(a))``.\n\nClass Binding\n If binding to a new-style class, ``A.x`` is transformed into the\n call: ``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, A)``.\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 both old and new-style classes have a\ndictionary for attribute storage. This wastes space for objects\nhaving very few instance variables. The space consumption can become\nacute when creating large numbers of instances.\n\nThe default can be overridden by defining *__slots__* in a new-style\nclass definition. The *__slots__* declaration takes a sequence of\ninstance variables and reserves just enough space in each instance to\nhold a value for each variable. Space is saved because *__dict__* is\nnot created for each instance.\n\n__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 new-style class, *__slots__* reserves space for the declared\n variables and prevents the automatic creation of *__dict__* and\n *__weakref__* for each instance.\n\n New in version 2.2.\n\nNotes on using *__slots__*\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 Changed in version 2.3: Previously, adding ``\'__dict__\'`` to the\n *__slots__* declaration would not enable the assignment of new\n attributes not specifically listed in the sequence of instance\n variable names.\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 Changed in version 2.3: Previously, adding ``\'__weakref__\'`` to the\n *__slots__* declaration would not enable support for weak\n references.\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 ``long``, ``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 Changed in version 2.6: Previously, *__class__* assignment raised an\n error if either new or old class had *__slots__*.\n\n\nCustomizing class creation\n==========================\n\nBy default, new-style classes are constructed using ``type()``. A\nclass definition is read into a separate namespace and the value of\nclass name is bound to the result of ``type(name, bases, dict)``.\n\nWhen the class definition is read, if *__metaclass__* is defined then\nthe callable assigned to it will be called instead of ``type()``. 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\n__metaclass__\n\n This variable can be any callable accepting arguments for ``name``,\n ``bases``, and ``dict``. Upon class creation, the callable is used\n instead of the built-in ``type()``.\n\n New in version 2.2.\n\nThe appropriate metaclass is determined by the following precedence\nrules:\n\n* If ``dict[\'__metaclass__\']`` exists, it is used.\n\n* Otherwise, if there is at least one base class, its metaclass is\n used (this looks for a *__class__* attribute first and if not found,\n uses its type).\n\n* Otherwise, if a global variable named __metaclass__ exists, it is\n used.\n\n* Otherwise, the old-style, classic metaclass (types.ClassType) is\n 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\n\nCustomizing instance and subclass checks\n========================================\n\nNew in version 2.6.\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), and including to 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 that 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. (For backwards compatibility, the method\n``__getslice__()`` (see below) can also be defined to handle simple,\nbut not extended slices.) It is also recommended that mappings provide\nthe methods ``keys()``, ``values()``, ``items()``, ``has_key()``,\n``get()``, ``clear()``, ``setdefault()``, ``iterkeys()``,\n``itervalues()``, ``iteritems()``, ``pop()``, ``popitem()``,\n``copy()``, and ``update()`` behaving similar to those for Python\'s\nstandard dictionary objects. The ``UserDict`` module provides a\n``DictMixin`` class to help create those methods from a base set of\n``__getitem__()``, ``__setitem__()``, ``__delitem__()``, and\n``keys()``. Mutable sequences should provide methods ``append()``,\n``count()``, ``index()``, ``extend()``, ``insert()``, ``pop()``,\n``remove()``, ``reverse()`` and ``sort()``, like Python standard list\nobjects. Finally, sequence types should implement addition (meaning\nconcatenation) and multiplication (meaning repetition) by defining the\nmethods ``__add__()``, ``__radd__()``, ``__iadd__()``, ``__mul__()``,\n``__rmul__()`` and ``__imul__()`` described below; they should not\ndefine ``__coerce__()`` or other numerical operators. It is\nrecommended that both mappings and sequences implement the\n``__contains__()`` method to allow efficient use of the ``in``\noperator; for mappings, ``in`` should be equivalent of ``has_key()``;\nfor sequences, 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``iterkeys()``; 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 ``__nonzero__()`` method and whose\n ``__len__()`` method returns zero is considered to be false in a\n Boolean context.\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 ``iterkeys()``.\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\n New in version 2.6.\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\nAdditional methods for emulation of sequence types\n==================================================\n\nThe following optional methods can be defined to further emulate\nsequence objects. Immutable sequences methods should at most only\ndefine ``__getslice__()``; mutable sequences might define all three\nmethods.\n\nobject.__getslice__(self, i, j)\n\n Deprecated since version 2.0: Support slice objects as parameters\n to the ``__getitem__()`` method. (However, built-in types in\n CPython currently still implement ``__getslice__()``. Therefore,\n you have to override it in derived classes when implementing\n slicing.)\n\n Called to implement evaluation of ``self[i:j]``. The returned\n object should be of the same type as *self*. Note that missing *i*\n or *j* in the slice expression are replaced by zero or\n ``sys.maxint``, respectively. If negative indexes are used in the\n slice, the length of the sequence is added to that index. If the\n instance does not implement the ``__len__()`` method, an\n ``AttributeError`` is raised. No guarantee is made that indexes\n adjusted this way are not still negative. Indexes which are\n greater than the length of the sequence are not modified. If no\n ``__getslice__()`` is found, a slice object is created instead, and\n passed to ``__getitem__()`` instead.\n\nobject.__setslice__(self, i, j, sequence)\n\n Called to implement assignment to ``self[i:j]``. Same notes for *i*\n and *j* as for ``__getslice__()``.\n\n This method is deprecated. If no ``__setslice__()`` is found, or\n for extended slicing of the form ``self[i:j:k]``, a slice object is\n created, and passed to ``__setitem__()``, instead of\n ``__setslice__()`` being called.\n\nobject.__delslice__(self, i, j)\n\n Called to implement deletion of ``self[i:j]``. Same notes for *i*\n and *j* as for ``__getslice__()``. This method is deprecated. If no\n ``__delslice__()`` is found, or for extended slicing of the form\n ``self[i:j:k]``, a slice object is created, and passed to\n ``__delitem__()``, instead of ``__delslice__()`` being called.\n\nNotice that these methods are only invoked when a single slice with a\nsingle colon is used, and the slice method is available. For slice\noperations involving extended slice notation, or in absence of the\nslice methods, ``__getitem__()``, ``__setitem__()`` or\n``__delitem__()`` is called with a slice object as argument.\n\nThe following example demonstrate how to make your program or module\ncompatible with earlier versions of Python (assuming that methods\n``__getitem__()``, ``__setitem__()`` and ``__delitem__()`` support\nslice objects as arguments):\n\n class MyClass:\n ...\n def __getitem__(self, index):\n ...\n def __setitem__(self, index, value):\n ...\n def __delitem__(self, index):\n ...\n\n if sys.version_info < (2, 0):\n # They won\'t be defined if version is at least 2.0 final\n\n def __getslice__(self, i, j):\n return self[max(0, i):max(0, j):]\n def __setslice__(self, i, j, seq):\n self[max(0, i):max(0, j):] = seq\n def __delslice__(self, i, j):\n del self[max(0, i):max(0, j):]\n ...\n\nNote the calls to ``max()``; these are necessary because of the\nhandling of negative indices before the ``__*slice__()`` methods are\ncalled. When negative indexes are used, the ``__*item__()`` methods\nreceive them as provided, but the ``__*slice__()`` methods get a\n"cooked" form of the index values. For each negative index value, the\nlength of the sequence is added to the index before calling the method\n(which may still result in a negative index); this is the customary\nhandling of negative indexes by the built-in sequence types, and the\n``__*item__()`` methods are expected to do this as well. However,\nsince they should already be doing that, negative indexes cannot be\npassed in; they must be constrained to the bounds of the sequence\nbefore being passed to the ``__*item__()`` methods. Calling ``max(0,\ni)`` conveniently returns the proper value.\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.__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 (``+``, ``-``, ``*``, ``//``, ``%``, ``divmod()``,\n ``pow()``, ``**``, ``<<``, ``>>``, ``&``, ``^``, ``|``). For\n instance, to evaluate the expression ``x + y``, where *x* is an\n 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__()`` (described below). Note\n that ``__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.__div__(self, other)\nobject.__truediv__(self, other)\n\n The division operator (``/``) is implemented by these methods. The\n ``__truediv__()`` method is used when ``__future__.division`` is in\n effect, otherwise ``__div__()`` is used. If only one of these two\n methods is defined, the object will not support division in the\n alternate context; ``TypeError`` will be raised instead.\n\nobject.__radd__(self, other)\nobject.__rsub__(self, other)\nobject.__rmul__(self, other)\nobject.__rdiv__(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 (``+``, ``-``, ``*``, ``/``, ``%``, ``divmod()``,\n ``pow()``, ``**``, ``<<``, ``>>``, ``&``, ``^``, ``|``) with\n reflected (swapped) operands. These functions are only called if\n the left operand does not support the corresponding operation and\n the operands are of different types. [2] For instance, to evaluate\n the expression ``x - y``, where *y* is an instance of a class that\n has an ``__rsub__()`` method, ``y.__rsub__(x)`` is called if\n ``x.__sub__(y)`` returns *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.__idiv__(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.__long__(self)\nobject.__float__(self)\n\n Called to implement the built-in functions ``complex()``,\n ``int()``, ``long()``, and ``float()``. Should return a value of\n the appropriate type.\n\nobject.__oct__(self)\nobject.__hex__(self)\n\n Called to implement the built-in functions ``oct()`` and ``hex()``.\n Should return a string value.\n\nobject.__index__(self)\n\n Called to implement ``operator.index()``. Also called whenever\n Python needs an integer object (such as in slicing). Must return\n an integer (int or long).\n\n New in version 2.5.\n\nobject.__coerce__(self, other)\n\n Called to implement "mixed-mode" numeric arithmetic. Should either\n return a 2-tuple containing *self* and *other* converted to a\n common numeric type, or ``None`` if conversion is impossible. When\n the common type would be the type of ``other``, it is sufficient to\n return ``None``, since the interpreter will also ask the other\n object to attempt a coercion (but sometimes, if the implementation\n of the other type cannot be changed, it is useful to do the\n conversion to the other type here). A return value of\n ``NotImplemented`` is equivalent to returning ``None``.\n\n\nCoercion rules\n==============\n\nThis section used to document the rules for coercion. As the language\nhas evolved, the coercion rules have become hard to document\nprecisely; documenting what one version of one particular\nimplementation does is undesirable. Instead, here are some informal\nguidelines regarding coercion. In Python 3.0, coercion will not be\nsupported.\n\n* If the left operand of a % operator is a string or Unicode object,\n no coercion takes place and the string formatting operation is\n invoked instead.\n\n* It is no longer recommended to define a coercion operation. Mixed-\n mode operations on types that don\'t define coercion pass the\n original arguments to the operation.\n\n* New-style classes (those derived from ``object``) never invoke the\n ``__coerce__()`` method in response to a binary operator; the only\n time ``__coerce__()`` is invoked is when the built-in function\n ``coerce()`` is called.\n\n* For most intents and purposes, an operator that returns\n ``NotImplemented`` is treated the same as one that is not\n implemented at all.\n\n* Below, ``__op__()`` and ``__rop__()`` are used to signify the\n generic method names corresponding to an operator; ``__iop__()`` is\n used for the corresponding in-place operator. For example, for the\n operator \'``+``\', ``__add__()`` and ``__radd__()`` are used for the\n left and right variant of the binary operator, and ``__iadd__()``\n for the in-place variant.\n\n* For objects *x* and *y*, first ``x.__op__(y)`` is tried. If this is\n not implemented or returns ``NotImplemented``, ``y.__rop__(x)`` is\n tried. If this is also not implemented or returns\n ``NotImplemented``, a ``TypeError`` exception is raised. But see\n the following exception:\n\n* Exception to the previous item: if the left operand is an instance\n of a built-in type or a new-style class, and the right operand is an\n instance of a proper subclass of that type or class and overrides\n the base\'s ``__rop__()`` method, the right operand\'s ``__rop__()``\n method is tried *before* the left operand\'s ``__op__()`` method.\n\n This is done so that a subclass can completely override binary\n operators. Otherwise, the left operand\'s ``__op__()`` method would\n always accept the right operand: when an instance of a given class\n is expected, an instance of a subclass of that class is always\n acceptable.\n\n* When either operand type defines a coercion, this coercion is called\n before that type\'s ``__op__()`` or ``__rop__()`` method is called,\n but no sooner. If the coercion returns an object of a different\n type for the operand whose coercion is invoked, part of the process\n is redone using the new object.\n\n* When an in-place operator (like \'``+=``\') is used, if the left\n operand implements ``__iop__()``, it is invoked without any\n coercion. When the operation falls back to ``__op__()`` and/or\n ``__rop__()``, the normal coercion rules apply.\n\n* In ``x + y``, if *x* is a sequence that implements sequence\n concatenation, sequence concatenation is invoked.\n\n* In ``x * y``, if one operator is a sequence that implements sequence\n repetition, and the other is an integer (``int`` or ``long``),\n sequence repetition is invoked.\n\n* Rich comparisons (implemented by methods ``__eq__()`` and so on)\n never use coercion. Three-way comparison (implemented by\n ``__cmp__()``) does use coercion under the same conditions as other\n binary operations use it.\n\n* In the current implementation, the built-in numeric types ``int``,\n ``long`` and ``float`` do not use coercion; the type ``complex``\n however does use coercion for binary operators and rich comparisons,\n despite the above rules. The difference can become apparent when\n subclassing these types. Over time, the type ``complex`` may be\n fixed to avoid coercion. All these types implement a\n ``__coerce__()`` method, for use by the built-in ``coerce()``\n function.\n\n\nWith Statement Context Managers\n===============================\n\nNew in version 2.5.\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 for old-style classes\n===========================================\n\nFor old-style classes, special methods are always looked up in exactly\nthe same way as any other method or attribute. This is the case\nregardless of whether the method is being looked up explicitly as in\n``x.__getitem__(i)`` or implicitly as in ``x[i]``.\n\nThis behaviour means that special methods may exhibit different\nbehaviour for different instances of a single old-style class if the\nappropriate special attributes are set differently:\n\n >>> class C:\n ... pass\n ...\n >>> c1 = C()\n >>> c2 = C()\n >>> c1.__len__ = lambda: 5\n >>> c2.__len__ = lambda: 9\n >>> len(c1)\n 5\n >>> len(c2)\n 9\n\n\nSpecial method lookup for new-style classes\n===========================================\n\nFor new-style classes, implicit invocations of special methods are\nonly guaranteed to work correctly if defined on an object\'s type, not\nin the object\'s instance dictionary. That behaviour is the reason why\nthe following code raises an exception (unlike the equivalent example\nwith old-style classes):\n\n >>> class C(object):\n ... pass\n ...\n >>> c = C()\n >>> c.__len__ = lambda: 5\n >>> len(c)\n Traceback (most recent call last):\n File "", line 1, in \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 "", line 1, in \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):\n ... __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-conversions': u'\nString conversions\n******************\n\nA string conversion is an expression list enclosed in reverse (a.k.a.\nbackward) quotes:\n\n string_conversion ::= "\'" expression_list "\'"\n\nA string conversion evaluates the contained expression list and\nconverts the resulting object into a string according to rules\nspecific to its type.\n\nIf the object is a string, a number, ``None``, or a tuple, list or\ndictionary containing only objects whose type is one of these, the\nresulting string is a valid Python expression which can be passed to\nthe built-in function ``eval()`` to yield an expression with the same\nvalue (or an approximation, if floating point numbers are involved).\n\n(In particular, converting a string adds quotes around it and converts\n"funny" characters to escape sequences that are safe to print.)\n\nRecursive objects (for example, lists or dictionaries that contain a\nreference to themselves, directly or indirectly) use ``...`` to\nindicate a recursive reference, and the result cannot be passed to\n``eval()`` to get an equal value (``SyntaxError`` will be raised\ninstead).\n\nThe built-in function ``repr()`` performs exactly the same conversion\nin its argument as enclosing it in parentheses and reverse quotes\ndoes. The built-in function ``str()`` performs a similar but more\nuser-friendly conversion.\n', 'string-methods': u'\nString Methods\n**************\n\nBelow are listed the string methods which both 8-bit strings and\nUnicode objects support. Note that none of these methods take keyword\narguments.\n\nIn addition, Python\'s strings support the sequence type methods\ndescribed in the *Sequence Types --- str, unicode, list, tuple,\nbuffer, xrange* section. To output formatted strings use template\nstrings or the ``%`` operator described in the *String Formatting\nOperations* 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\n For 8-bit strings, this method is locale-dependent.\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\n Changed in version 2.4: Support for the *fillchar* argument.\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.decode([encoding[, errors]])\n\n Decodes the string using the codec registered for *encoding*.\n *encoding* defaults to the default string encoding. *errors* may\n be given to set a different error handling scheme. The default is\n ``\'strict\'``, meaning that encoding errors raise ``UnicodeError``.\n Other possible values are ``\'ignore\'``, ``\'replace\'`` and any other\n name registered via ``codecs.register_error()``, see section *Codec\n Base Classes*.\n\n New in version 2.2.\n\n Changed in version 2.3: Support for other error handling schemes\n added.\n\nstr.encode([encoding[, errors]])\n\n Return an encoded version of the string. Default encoding is the\n current default string encoding. *errors* may be given to set a\n different error handling scheme. The default for *errors* is\n ``\'strict\'``, meaning that encoding errors raise a\n ``UnicodeError``. Other possible values are ``\'ignore\'``,\n ``\'replace\'``, ``\'xmlcharrefreplace\'``, ``\'backslashreplace\'`` and\n any other name registered via ``codecs.register_error()``, see\n section *Codec Base Classes*. For a list of possible encodings, see\n section *Standard Encodings*.\n\n New in version 2.0.\n\n Changed in version 2.3: Support for ``\'xmlcharrefreplace\'`` and\n ``\'backslashreplace\'`` and other error handling schemes 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\n Changed in version 2.5: Accept tuples as *suffix*.\n\nstr.expandtabs([tabsize])\n\n Return a copy of the string where all tab characters are replaced\n by one 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\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\n This method of string formatting is the new standard in Python 3.0,\n and should be preferred to the ``%`` formatting described in\n *String Formatting Operations* in new code.\n\n New in version 2.6.\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.\n\n For 8-bit strings, this method is locale-dependent.\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.\n\n For 8-bit strings, this method is locale-dependent.\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.\n\n For 8-bit strings, this method is locale-dependent.\n\nstr.islower()\n\n Return true if all cased characters in the string are lowercase and\n there is at least one cased character, false otherwise.\n\n For 8-bit strings, this method is locale-dependent.\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.\n\n For 8-bit strings, this method is locale-dependent.\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\n For 8-bit strings, this method is locale-dependent.\n\nstr.isupper()\n\n Return true if all cased characters in the string are uppercase and\n there is at least one cased character, false otherwise.\n\n For 8-bit strings, this method is locale-dependent.\n\nstr.join(iterable)\n\n Return a string which is the concatenation of the strings in the\n *iterable* *iterable*. The separator between elements is the\n 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\n ``len(s)``.\n\n Changed in version 2.4: Support for the *fillchar* argument.\n\nstr.lower()\n\n Return a copy of the string converted to lowercase.\n\n For 8-bit strings, this method is locale-dependent.\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\n Changed in version 2.2.2: Support for the *chars* argument.\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\n New in version 2.5.\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\n ``len(s)``.\n\n Changed in version 2.4: Support for the *fillchar* argument.\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\n New in version 2.5.\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\n New in version 2.4.\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\n Changed in version 2.2.2: Support for the *chars* argument.\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\n Changed in version 2.5: Accept tuples as *prefix*.\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\n Changed in version 2.2.2: Support for the *chars* argument.\n\nstr.swapcase()\n\n Return a copy of the string with uppercase characters converted to\n lowercase and vice versa.\n\n For 8-bit strings, this method is locale-dependent.\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\n For 8-bit strings, this method is locale-dependent.\n\nstr.translate(table[, deletechars])\n\n Return a copy of the string where all characters occurring in the\n optional argument *deletechars* are removed, and the remaining\n characters have been mapped through the given translation table,\n which must be a string of length 256.\n\n You can use the ``maketrans()`` helper function in the ``string``\n module to create a translation table. For string objects, set the\n *table* argument to ``None`` for translations that only delete\n characters:\n\n >>> \'read this short text\'.translate(None, \'aeiou\')\n \'rd ths shrt txt\'\n\n New in version 2.6: Support for a ``None`` *table* argument.\n\n For Unicode objects, the ``translate()`` method does not accept the\n optional *deletechars* argument. Instead, it returns a copy of the\n *s* where all characters have been mapped through the given\n translation table which must be a mapping of Unicode ordinals to\n Unicode ordinals, Unicode strings or ``None``. Unmapped characters\n are left untouched. Characters mapped to ``None`` are deleted.\n Note, a more flexible approach is to create a custom character\n mapping codec using the ``codecs`` module (see ``encodings.cp1251``\n for an example).\n\nstr.upper()\n\n Return a copy of the string converted to uppercase.\n\n For 8-bit strings, this method is locale-dependent.\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 ``len(s)``.\n\n New in version 2.2.2.\n\nThe following methods are present only on unicode objects:\n\nunicode.isnumeric()\n\n Return ``True`` if there are only numeric characters in S,\n ``False`` otherwise. Numeric characters include digit characters,\n and all characters that have the Unicode numeric value property,\n e.g. U+2155, VULGAR FRACTION ONE FIFTH.\n\nunicode.isdecimal()\n\n Return ``True`` if there are only decimal characters in S,\n ``False`` otherwise. Decimal characters include digit characters,\n and all characters that that can be used to form decimal-radix\n numbers, e.g. U+0660, ARABIC-INDIC DIGIT ZERO.\n', 'strings': u'\nString literals\n***************\n\nString literals are described by the following lexical definitions:\n\n stringliteral ::= [stringprefix](shortstring | longstring)\n stringprefix ::= "r" | "u" | "ur" | "R" | "U" | "UR" | "Ur" | "uR"\n shortstring ::= "\'" shortstringitem* "\'" | \'"\' shortstringitem* \'"\'\n longstring ::= "\'\'\'" longstringitem* "\'\'\'"\n | \'"""\' longstringitem* \'"""\'\n shortstringitem ::= shortstringchar | escapeseq\n longstringitem ::= longstringchar | escapeseq\n shortstringchar ::= \n longstringchar ::= \n escapeseq ::= "\\" \n\nOne syntactic restriction not indicated by these productions is that\nwhitespace is not allowed between the **stringprefix** and the rest of\nthe string literal. The source character set is defined by the\nencoding declaration; it is ASCII if no encoding declaration is given\nin the source file; see section *Encoding declarations*.\n\nIn plain English: String literals can be enclosed in matching single\nquotes (``\'``) or double quotes (``"``). They can also be enclosed in\nmatching groups of three single or double quotes (these are generally\nreferred to as *triple-quoted strings*). The backslash (``\\``)\ncharacter is used to escape characters that otherwise have a special\nmeaning, such as newline, backslash itself, or the quote character.\nString literals may optionally be prefixed with a letter ``\'r\'`` or\n``\'R\'``; such strings are called *raw strings* and use different rules\nfor interpreting backslash escape sequences. A prefix of ``\'u\'`` or\n``\'U\'`` makes the string a Unicode string. Unicode strings use the\nUnicode character set as defined by the Unicode Consortium and ISO\n10646. Some additional escape sequences, described below, are\navailable in Unicode strings. The two prefix characters may be\ncombined; in this case, ``\'u\'`` must appear before ``\'r\'``.\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`` | 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| ``\\N{name}`` | Character named *name* in the | |\n| | Unicode database (Unicode only) | |\n+-------------------+-----------------------------------+---------+\n| ``\\r`` | ASCII Carriage Return (CR) | |\n+-------------------+-----------------------------------+---------+\n| ``\\t`` | ASCII Horizontal Tab (TAB) | |\n+-------------------+-----------------------------------+---------+\n| ``\\uxxxx`` | Character with 16-bit hex value | (1) |\n| | *xxxx* (Unicode only) | |\n+-------------------+-----------------------------------+---------+\n| ``\\Uxxxxxxxx`` | Character with 32-bit hex value | (2) |\n| | *xxxxxxxx* (Unicode only) | |\n+-------------------+-----------------------------------+---------+\n| ``\\v`` | ASCII Vertical Tab (VT) | |\n+-------------------+-----------------------------------+---------+\n| ``\\ooo`` | Character with octal value *ooo* | (3,5) |\n+-------------------+-----------------------------------+---------+\n| ``\\xhh`` | Character with hex value *hh* | (4,5) |\n+-------------------+-----------------------------------+---------+\n\nNotes:\n\n1. Individual code units which form parts of a surrogate pair can be\n encoded using this escape sequence.\n\n2. 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). Individual code units which form parts of a surrogate\n pair can be encoded using this escape sequence.\n\n3. As in Standard C, up to three octal digits are accepted.\n\n4. Unlike in Standard C, exactly two hex digits are required.\n\n5. In a string literal, hexadecimal and octal escapes denote the byte\n with the given value; it is not necessary that the byte encodes a\n character in the source character set. In a Unicode literal, these\n escapes denote a Unicode character with the given value.\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 marked as "(Unicode only)"\nin the table above fall into the category of unrecognized escapes for\nnon-Unicode string literals.\n\nWhen an ``\'r\'`` or ``\'R\'`` prefix is present, a character following a\nbackslash is included in the string without change, and *all\nbackslashes are left in the string*. For example, the string literal\n``r"\\n"`` consists of two characters: a backslash and a lowercase\n``\'n\'``. String quotes can be escaped with a backslash, but the\nbackslash remains in the string; for example, ``r"\\""`` is a valid\nstring literal consisting of two characters: a backslash and a double\nquote; ``r"\\"`` is not a valid string literal (even a raw string\ncannot end in an odd number of backslashes). Specifically, *a raw\nstring cannot end in a single backslash* (since the backslash would\nescape 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\nWhen an ``\'r\'`` or ``\'R\'`` prefix is used in conjunction with a\n``\'u\'`` or ``\'U\'`` prefix, then the ``\\uXXXX`` and ``\\UXXXXXXXX``\nescape sequences are processed while *all other backslashes are left\nin the string*. For example, the string literal ``ur"\\u0062\\n"``\nconsists of three Unicode characters: \'LATIN SMALL LETTER B\', \'REVERSE\nSOLIDUS\', and \'LATIN SMALL LETTER N\'. Backslashes can be escaped with\na preceding backslash; however, both remain in the string. As a\nresult, ``\\uXXXX`` escape sequences are only recognized when there are\nan odd number of backslashes.\n', diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -5,7 +5,7 @@ What's New in Python 2.6.8 rc 1? ================================ -*Release date: XXXX-XX-XX* +*Release date: 2012-02-23* Core and Builtins ----------------- diff --git a/Misc/RPM/python-2.6.spec b/Misc/RPM/python-2.6.spec --- a/Misc/RPM/python-2.6.spec +++ b/Misc/RPM/python-2.6.spec @@ -39,8 +39,8 @@ %define name python #--start constants-- -%define version 2.6.7 -%define libver 2.6 +%define version 2.6.8rc1 +%define libvers 2.6 #--end constants-- %define release 1pydotorg %define __prefix /usr diff --git a/README b/README --- a/README +++ b/README @@ -1,7 +1,8 @@ -This is Python version 2.6.7 -============================ +This is Python version 2.6.8 rc 1 +================================= -Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 +Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, + 2011, 2012 Python Software Foundation. All rights reserved. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Feb 23 17:04:20 2012 From: python-checkins at python.org (barry.warsaw) Date: Thu, 23 Feb 2012 17:04:20 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=282=2E6=29=3A_Bump_some_more_?= =?utf8?q?copyright_years_=28as_per_PEP_101=29=2C_since_this_is_the_first?= Message-ID: http://hg.python.org/cpython/rev/caab08cd2b3e changeset: 75205:caab08cd2b3e branch: 2.6 user: Barry Warsaw date: Thu Feb 23 10:59:38 2012 -0500 summary: Bump some more copyright years (as per PEP 101), since this is the first release of 2.6 for 2012. files: Doc/README.txt | 2 +- Doc/copyright.rst | 2 +- Doc/license.rst | 2 ++ LICENSE | 1 + PC/python_nt.rc | 2 +- Python/getcopyright.c | 2 +- 6 files changed, 7 insertions(+), 4 deletions(-) diff --git a/Doc/README.txt b/Doc/README.txt --- a/Doc/README.txt +++ b/Doc/README.txt @@ -127,7 +127,7 @@ as long as you don't change or remove the copyright notice: ---------------------------------------------------------------------- -Copyright (c) 2000-2011 Python Software Foundation. +Copyright (c) 2000-2012 Python Software Foundation. All rights reserved. Copyright (c) 2000 BeOpen.com. diff --git a/Doc/copyright.rst b/Doc/copyright.rst --- a/Doc/copyright.rst +++ b/Doc/copyright.rst @@ -4,7 +4,7 @@ Python and this documentation is: -Copyright ?? 2001-2011 Python Software Foundation. All rights reserved. +Copyright ?? 2001-2012 Python Software Foundation. All rights reserved. Copyright ?? 2000 BeOpen.com. All rights reserved. diff --git a/Doc/license.rst b/Doc/license.rst --- a/Doc/license.rst +++ b/Doc/license.rst @@ -108,6 +108,8 @@ +----------------+--------------+-----------+------------+-----------------+ | 2.6.7 | 2.6.6 | 2011 | PSF | yes | +----------------+--------------+-----------+------------+-----------------+ +| 2.6.8 | 2.6.7 | 2012 | PSF | yes | ++----------------+--------------+-----------+------------+-----------------+ .. note:: diff --git a/LICENSE b/LICENSE --- a/LICENSE +++ b/LICENSE @@ -65,6 +65,7 @@ 2.6.5 2.6.4 2010 PSF yes 2.6.6 2.6.5 2010 PSF yes 2.6.7 2.6.6 2011 PSF yes + 2.6.8 2.6.7 2012 PSF yes Footnotes: diff --git a/PC/python_nt.rc b/PC/python_nt.rc --- a/PC/python_nt.rc +++ b/PC/python_nt.rc @@ -61,7 +61,7 @@ VALUE "FileDescription", "Python Core\0" VALUE "FileVersion", PYTHON_VERSION VALUE "InternalName", "Python DLL\0" - VALUE "LegalCopyright", "Copyright ? 2001-2011 Python Software Foundation. Copyright ? 2000 BeOpen.com. Copyright ? 1995-2001 CNRI. Copyright ? 1991-1995 SMC.\0" + VALUE "LegalCopyright", "Copyright ? 2001-2012 Python Software Foundation. Copyright ? 2000 BeOpen.com. Copyright ? 1995-2001 CNRI. Copyright ? 1991-1995 SMC.\0" VALUE "OriginalFilename", PYTHON_DLL_NAME "\0" VALUE "ProductName", "Python\0" VALUE "ProductVersion", PYTHON_VERSION diff --git a/Python/getcopyright.c b/Python/getcopyright.c --- a/Python/getcopyright.c +++ b/Python/getcopyright.c @@ -4,7 +4,7 @@ static char cprt[] = "\ -Copyright (c) 2001-2011 Python Software Foundation.\n\ +Copyright (c) 2001-2012 Python Software Foundation.\n\ All Rights Reserved.\n\ \n\ Copyright (c) 2000 BeOpen.com.\n\ -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Feb 23 17:04:20 2012 From: python-checkins at python.org (barry.warsaw) Date: Thu, 23 Feb 2012 17:04:20 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=282=2E6=29=3A_Added_tag_v2=2E?= =?utf8?q?6=2E8rc1_for_changeset_caab08cd2b3e?= Message-ID: http://hg.python.org/cpython/rev/5356b6c7fd66 changeset: 75206:5356b6c7fd66 branch: 2.6 user: Barry Warsaw date: Thu Feb 23 10:59:50 2012 -0500 summary: Added tag v2.6.8rc1 for changeset caab08cd2b3e files: .hgtags | 1 + 1 files changed, 1 insertions(+), 0 deletions(-) diff --git a/.hgtags b/.hgtags --- a/.hgtags +++ b/.hgtags @@ -137,3 +137,4 @@ c1dc9e7986a2a8e1070ec7bee748520febef382e v2.6.6rc1 e189dc8fd66154ef46d9cd22584d56669b544ca3 v2.6.6rc2 9f8771e0905277f8b3c2799113a062fda4164995 v2.6.6 +caab08cd2b3eb5a6f78479b2513b65d36c754f41 v2.6.8rc1 -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Feb 23 17:04:21 2012 From: python-checkins at python.org (barry.warsaw) Date: Thu, 23 Feb 2012 17:04:21 +0100 Subject: [Python-checkins] =?utf8?b?Y3B5dGhvbiAobWVyZ2UgMi42IC0+IDIuNyk6?= =?utf8?q?_null_merge_from_2=2E6?= Message-ID: http://hg.python.org/cpython/rev/51615c55781f changeset: 75207:51615c55781f branch: 2.7 parent: 75203:be5470d76a82 parent: 75206:5356b6c7fd66 user: Barry Warsaw date: Thu Feb 23 11:03:31 2012 -0500 summary: null merge from 2.6 files: -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Feb 23 17:12:35 2012 From: python-checkins at python.org (barry.warsaw) Date: Thu, 23 Feb 2012 17:12:35 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=282=2E6=29=3A_Added_tag_v2=2E?= =?utf8?q?6=2E8rc1_for_changeset_5356b6c7fd66?= Message-ID: http://hg.python.org/cpython/rev/47e10d72358b changeset: 75208:47e10d72358b branch: 2.6 parent: 75206:5356b6c7fd66 user: Barry Warsaw date: Thu Feb 23 11:10:31 2012 -0500 summary: Added tag v2.6.8rc1 for changeset 5356b6c7fd66 files: .hgtags | 1 + 1 files changed, 1 insertions(+), 0 deletions(-) diff --git a/.hgtags b/.hgtags --- a/.hgtags +++ b/.hgtags @@ -138,3 +138,4 @@ e189dc8fd66154ef46d9cd22584d56669b544ca3 v2.6.6rc2 9f8771e0905277f8b3c2799113a062fda4164995 v2.6.6 caab08cd2b3eb5a6f78479b2513b65d36c754f41 v2.6.8rc1 +5356b6c7fd66664679f9bd71f7cd085239934e43 v2.6.8rc1 -- Repository URL: http://hg.python.org/cpython From jimjjewett at gmail.com Thu Feb 23 17:37:34 2012 From: jimjjewett at gmail.com (Jim Jewett) Date: Thu, 23 Feb 2012 11:37:34 -0500 Subject: [Python-checkins] peps: Switch back to named functions, since the Ellipsis version degenerated badly In-Reply-To: References: Message-ID: On Wed, Feb 22, 2012 at 10:22 AM, nick.coghlan wrote: > + ? ?in x = weakref.ref(target, report_destruction) > + ? ?def report_destruction(obj): > ? ? ? ? print("{} is being destroyed".format(obj)) > +If the repetition of the name seems especially annoying, then a throwaway > +name like ``f`` can be used instead:: > + ? ?in x = weakref.ref(target, f) > + ? ?def f(obj): > + ? ? ? ?print("{} is being destroyed".format(obj)) I still feel that the helper function (or class) is subordinate, and should be indented. Thinking of "in ..." as a decorator helps, but makes it seem that the helper function is the important part (which it sometimes is...) I understand that adding a colon and indent has its own problems, but ... I'm not certain this is better, and I am certain that the desire for indentation is strong enough to at least justify discussion in the PEP. -jJ From python-checkins at python.org Thu Feb 23 21:04:46 2012 From: python-checkins at python.org (vinay.sajip) Date: Thu, 23 Feb 2012 21:04:46 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=282=2E7=29=3A_logging=3A_Adde?= =?utf8?q?d_locking_in_flush=28=29_and_close=28=29_handler_methods=2E_Than?= =?utf8?q?ks_to_Fayaz?= Message-ID: http://hg.python.org/cpython/rev/1316d2af2331 changeset: 75209:1316d2af2331 branch: 2.7 parent: 75207:51615c55781f user: Vinay Sajip date: Thu Feb 23 19:37:18 2012 +0000 summary: logging: Added locking in flush() and close() handler methods. Thanks to Fayaz Yusuf Khan for the suggestion. files: Lib/logging/__init__.py | 20 ++++++++++-------- Lib/logging/handlers.py | 31 ++++++++++++++++------------ 2 files changed, 29 insertions(+), 22 deletions(-) diff --git a/Lib/logging/__init__.py b/Lib/logging/__init__.py --- a/Lib/logging/__init__.py +++ b/Lib/logging/__init__.py @@ -1,4 +1,4 @@ -# Copyright 2001-2010 by Vinay Sajip. All Rights Reserved. +# Copyright 2001-2012 by Vinay Sajip. All Rights Reserved. # # Permission to use, copy, modify, and distribute this software and its # documentation for any purpose and without fee is hereby granted, @@ -828,8 +828,9 @@ """ Flushes the stream. """ - if self.stream and hasattr(self.stream, "flush"): - self.stream.flush() + with self.lock: + if self.stream and hasattr(self.stream, "flush"): + self.stream.flush() def emit(self, record): """ @@ -900,12 +901,13 @@ """ Closes the stream. """ - if self.stream: - self.flush() - if hasattr(self.stream, "close"): - self.stream.close() - StreamHandler.close(self) - self.stream = None + with self.lock: + if self.stream: + self.flush() + if hasattr(self.stream, "close"): + self.stream.close() + StreamHandler.close(self) + self.stream = None def _open(self): """ diff --git a/Lib/logging/handlers.py b/Lib/logging/handlers.py --- a/Lib/logging/handlers.py +++ b/Lib/logging/handlers.py @@ -1,4 +1,4 @@ -# Copyright 2001-2010 by Vinay Sajip. All Rights Reserved. +# Copyright 2001-2012 by Vinay Sajip. All Rights Reserved. # # Permission to use, copy, modify, and distribute this software and its # documentation for any purpose and without fee is hereby granted, @@ -563,9 +563,10 @@ """ Closes the socket. """ - if self.sock: - self.sock.close() - self.sock = None + with self.lock: + if self.sock: + self.sock.close() + self.sock = None logging.Handler.close(self) class DatagramHandler(SocketHandler): @@ -767,8 +768,9 @@ """ Closes the socket. """ - if self.unixsocket: - self.socket.close() + with self.lock: + if self.unixsocket: + self.socket.close() logging.Handler.close(self) def mapPriority(self, levelName): @@ -1096,7 +1098,8 @@ This version just zaps the buffer to empty. """ - self.buffer = [] + with self.lock: + self.buffer = [] def close(self): """ @@ -1144,15 +1147,17 @@ records to the target, if there is one. Override if you want different behaviour. """ - if self.target: - for record in self.buffer: - self.target.handle(record) - self.buffer = [] + with self.lock: + if self.target: + for record in self.buffer: + self.target.handle(record) + self.buffer = [] def close(self): """ Flush, set the target to None and lose the buffer. """ self.flush() - self.target = None - BufferingHandler.close(self) + with self.lock: + self.target = None + BufferingHandler.close(self) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Feb 23 21:04:47 2012 From: python-checkins at python.org (vinay.sajip) Date: Thu, 23 Feb 2012 21:04:47 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=282=2E7=29=3A_Updated_comment?= =?utf8?q?s=2E?= Message-ID: http://hg.python.org/cpython/rev/b5cb819404aa changeset: 75210:b5cb819404aa branch: 2.7 user: Vinay Sajip date: Thu Feb 23 19:40:33 2012 +0000 summary: Updated comments. files: Lib/logging/__init__.py | 4 ++-- Lib/logging/handlers.py | 5 ++--- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/Lib/logging/__init__.py b/Lib/logging/__init__.py --- a/Lib/logging/__init__.py +++ b/Lib/logging/__init__.py @@ -16,9 +16,9 @@ """ Logging package for Python. Based on PEP 282 and comments thereto in -comp.lang.python, and influenced by Apache's log4j system. +comp.lang.python. -Copyright (C) 2001-2010 Vinay Sajip. All Rights Reserved. +Copyright (C) 2001-2012 Vinay Sajip. All Rights Reserved. To use, simply 'import logging' and log away! """ diff --git a/Lib/logging/handlers.py b/Lib/logging/handlers.py --- a/Lib/logging/handlers.py +++ b/Lib/logging/handlers.py @@ -16,10 +16,9 @@ """ Additional handlers for the logging package for Python. The core package is -based on PEP 282 and comments thereto in comp.lang.python, and influenced by -Apache's log4j system. +based on PEP 282 and comments thereto in comp.lang.python. -Copyright (C) 2001-2010 Vinay Sajip. All Rights Reserved. +Copyright (C) 2001-2012 Vinay Sajip. All Rights Reserved. To use, simply 'import logging.handlers' and log away! """ -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Feb 23 21:04:48 2012 From: python-checkins at python.org (vinay.sajip) Date: Thu, 23 Feb 2012 21:04:48 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=283=2E2=29=3A_logging=3A_Adde?= =?utf8?q?d_locking_in_flush=28=29_and_close=28=29_handler_methods=2E_Than?= =?utf8?q?ks_to_Fayaz?= Message-ID: http://hg.python.org/cpython/rev/b2adcd90e656 changeset: 75211:b2adcd90e656 branch: 3.2 parent: 75200:85d08a1ba74e user: Vinay Sajip date: Thu Feb 23 19:45:52 2012 +0000 summary: logging: Added locking in flush() and close() handler methods. Thanks to Fayaz Yusuf Khan for the suggestion. files: Lib/logging/__init__.py | 24 +++++++++------- Lib/logging/handlers.py | 40 +++++++++++++++------------- 2 files changed, 35 insertions(+), 29 deletions(-) diff --git a/Lib/logging/__init__.py b/Lib/logging/__init__.py --- a/Lib/logging/__init__.py +++ b/Lib/logging/__init__.py @@ -1,4 +1,4 @@ -# Copyright 2001-2010 by Vinay Sajip. All Rights Reserved. +# Copyright 2001-2012 by Vinay Sajip. All Rights Reserved. # # Permission to use, copy, modify, and distribute this software and its # documentation for any purpose and without fee is hereby granted, @@ -16,9 +16,9 @@ """ Logging package for Python. Based on PEP 282 and comments thereto in -comp.lang.python, and influenced by Apache's log4j system. +comp.lang.python. -Copyright (C) 2001-2011 Vinay Sajip. All Rights Reserved. +Copyright (C) 2001-2012 Vinay Sajip. All Rights Reserved. To use, simply 'import logging' and log away! """ @@ -917,8 +917,9 @@ """ Flushes the stream. """ - if self.stream and hasattr(self.stream, "flush"): - self.stream.flush() + with self.lock: + if self.stream and hasattr(self.stream, "flush"): + self.stream.flush() def emit(self, record): """ @@ -969,12 +970,13 @@ """ Closes the stream. """ - if self.stream: - self.flush() - if hasattr(self.stream, "close"): - self.stream.close() - StreamHandler.close(self) - self.stream = None + with self.lock: + if self.stream: + self.flush() + if hasattr(self.stream, "close"): + self.stream.close() + StreamHandler.close(self) + self.stream = None def _open(self): """ diff --git a/Lib/logging/handlers.py b/Lib/logging/handlers.py --- a/Lib/logging/handlers.py +++ b/Lib/logging/handlers.py @@ -1,4 +1,4 @@ -# Copyright 2001-2010 by Vinay Sajip. All Rights Reserved. +# Copyright 2001-2012 by Vinay Sajip. All Rights Reserved. # # Permission to use, copy, modify, and distribute this software and its # documentation for any purpose and without fee is hereby granted, @@ -16,10 +16,9 @@ """ Additional handlers for the logging package for Python. The core package is -based on PEP 282 and comments thereto in comp.lang.python, and influenced by -Apache's log4j system. +based on PEP 282 and comments thereto in comp.lang.python. -Copyright (C) 2001-2010 Vinay Sajip. All Rights Reserved. +Copyright (C) 2001-2012 Vinay Sajip. All Rights Reserved. To use, simply 'import logging.handlers' and log away! """ @@ -554,10 +553,11 @@ """ Closes the socket. """ - if self.sock: - self.sock.close() - self.sock = None - logging.Handler.close(self) + with self.lock: + if self.sock: + self.sock.close() + self.sock = None + logging.Handler.close(self) class DatagramHandler(SocketHandler): """ @@ -752,9 +752,10 @@ """ Closes the socket. """ - if self.unixsocket: - self.socket.close() - logging.Handler.close(self) + with self.lock: + if self.unixsocket: + self.socket.close() + logging.Handler.close(self) def mapPriority(self, levelName): """ @@ -1095,7 +1096,8 @@ This version just zaps the buffer to empty. """ - self.buffer = [] + with self.lock: + self.buffer = [] def close(self): """ @@ -1145,18 +1147,20 @@ The record buffer is also cleared by this operation. """ - if self.target: - for record in self.buffer: - self.target.handle(record) - self.buffer = [] + with self.lock: + if self.target: + for record in self.buffer: + self.target.handle(record) + self.buffer = [] def close(self): """ Flush, set the target to None and lose the buffer. """ self.flush() - self.target = None - BufferingHandler.close(self) + with self.lock: + self.target = None + BufferingHandler.close(self) class QueueHandler(logging.Handler): -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Feb 23 21:04:48 2012 From: python-checkins at python.org (vinay.sajip) Date: Thu, 23 Feb 2012 21:04:48 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_3=2E2_-=3E_default=29?= =?utf8?q?=3A_Merged_logging_flush/close_changes_from_3=2E2=2E?= Message-ID: http://hg.python.org/cpython/rev/cb9a2dff6240 changeset: 75212:cb9a2dff6240 parent: 75201:3828d93fd330 parent: 75211:b2adcd90e656 user: Vinay Sajip date: Thu Feb 23 20:03:49 2012 +0000 summary: Merged logging flush/close changes from 3.2. files: Lib/logging/__init__.py | 22 +++++++++------- Lib/logging/handlers.py | 38 ++++++++++++++++------------ 2 files changed, 33 insertions(+), 27 deletions(-) diff --git a/Lib/logging/__init__.py b/Lib/logging/__init__.py --- a/Lib/logging/__init__.py +++ b/Lib/logging/__init__.py @@ -16,9 +16,9 @@ """ Logging package for Python. Based on PEP 282 and comments thereto in -comp.lang.python, and influenced by Apache's log4j system. +comp.lang.python. -Copyright (C) 2001-2011 Vinay Sajip. All Rights Reserved. +Copyright (C) 2001-2012 Vinay Sajip. All Rights Reserved. To use, simply 'import logging' and log away! """ @@ -914,8 +914,9 @@ """ Flushes the stream. """ - if self.stream and hasattr(self.stream, "flush"): - self.stream.flush() + with self.lock: + if self.stream and hasattr(self.stream, "flush"): + self.stream.flush() def emit(self, record): """ @@ -964,12 +965,13 @@ """ Closes the stream. """ - if self.stream: - self.flush() - if hasattr(self.stream, "close"): - self.stream.close() - StreamHandler.close(self) - self.stream = None + with self.lock: + if self.stream: + self.flush() + if hasattr(self.stream, "close"): + self.stream.close() + StreamHandler.close(self) + self.stream = None def _open(self): """ diff --git a/Lib/logging/handlers.py b/Lib/logging/handlers.py --- a/Lib/logging/handlers.py +++ b/Lib/logging/handlers.py @@ -1,4 +1,4 @@ -# Copyright 2001-2010 by Vinay Sajip. All Rights Reserved. +# Copyright 2001-2012 by Vinay Sajip. All Rights Reserved. # # Permission to use, copy, modify, and distribute this software and its # documentation for any purpose and without fee is hereby granted, @@ -16,10 +16,9 @@ """ Additional handlers for the logging package for Python. The core package is -based on PEP 282 and comments thereto in comp.lang.python, and influenced by -Apache's log4j system. +based on PEP 282 and comments thereto in comp.lang.python. -Copyright (C) 2001-2010 Vinay Sajip. All Rights Reserved. +Copyright (C) 2001-2012 Vinay Sajip. All Rights Reserved. To use, simply 'import logging.handlers' and log away! """ @@ -594,10 +593,11 @@ """ Closes the socket. """ - if self.sock: - self.sock.close() - self.sock = None - logging.Handler.close(self) + with self.lock: + if self.sock: + self.sock.close() + self.sock = None + logging.Handler.close(self) class DatagramHandler(SocketHandler): """ @@ -792,8 +792,9 @@ """ Closes the socket. """ - self.socket.close() - logging.Handler.close(self) + with self.lock: + self.socket.close() + logging.Handler.close(self) def mapPriority(self, levelName): """ @@ -1137,7 +1138,8 @@ This version just zaps the buffer to empty. """ - self.buffer = [] + with self.lock: + self.buffer = [] def close(self): """ @@ -1187,18 +1189,20 @@ The record buffer is also cleared by this operation. """ - if self.target: - for record in self.buffer: - self.target.handle(record) - self.buffer = [] + with self.lock: + if self.target: + for record in self.buffer: + self.target.handle(record) + self.buffer = [] def close(self): """ Flush, set the target to None and lose the buffer. """ self.flush() - self.target = None - BufferingHandler.close(self) + with self.lock: + self.target = None + BufferingHandler.close(self) class QueueHandler(logging.Handler): -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Feb 23 21:13:35 2012 From: python-checkins at python.org (georg.brandl) Date: Thu, 23 Feb 2012 21:13:35 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=283=2E2=29=3A_Fix_markup_erro?= =?utf8?b?cnMu?= Message-ID: http://hg.python.org/cpython/rev/3be7cf182e1a changeset: 75213:3be7cf182e1a branch: 3.2 parent: 75200:85d08a1ba74e user: Georg Brandl date: Thu Feb 23 21:12:39 2012 +0100 summary: Fix markup errors. files: Doc/library/subprocess.rst | 2 +- Doc/library/sys.rst | 6 ++++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/Doc/library/subprocess.rst b/Doc/library/subprocess.rst --- a/Doc/library/subprocess.rst +++ b/Doc/library/subprocess.rst @@ -207,7 +207,7 @@ When *stdout* or *stderr* are pipes and *universal_newlines* is :const:`True` then the output data is assumed to be encoded as UTF-8 and will automatically be decoded to text. All line endings will be converted - to ``'\n'`` as described for the universal newlines `'U'`` mode argument + to ``'\n'`` as described for the universal newlines ``'U'`` mode argument to :func:`open`. If *shell* is :const:`True`, the specified command will be executed through diff --git a/Doc/library/sys.rst b/Doc/library/sys.rst --- a/Doc/library/sys.rst +++ b/Doc/library/sys.rst @@ -195,7 +195,7 @@ be set at build time with the ``--exec-prefix`` argument to the :program:`configure` script. Specifically, all configuration files (e.g. the :file:`pyconfig.h` header file) are installed in the directory - :file:`{exec_prefix}/lib/python{X.Y}/config', and shared library modules are + :file:`{exec_prefix}/lib/python{X.Y}/config`, and shared library modules are installed in :file:`{exec_prefix}/lib/python{X.Y}/lib-dynload`, where *X.Y* is the version number of Python, for example ``3.2``. @@ -750,12 +750,14 @@ ====================== =========================== .. seealso:: + :attr:`os.name` has a coarser granularity. :func:`os.uname` gives system-dependent version information. The :mod:`platform` module provides detailed checks for the system's identity. + .. data:: prefix A string giving the site-specific directory prefix where the platform @@ -764,7 +766,7 @@ argument to the :program:`configure` script. The main collection of Python 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 + stored in :file:`{prefix}/include/python{X.Y}`, where *X.Y* is the version number of Python, for example ``3.2``. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Feb 23 21:13:36 2012 From: python-checkins at python.org (georg.brandl) Date: Thu, 23 Feb 2012 21:13:36 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=283=2E2=29=3A_Update_pydoc_to?= =?utf8?q?pics=2E?= Message-ID: http://hg.python.org/cpython/rev/1fc4e9f1fcf2 changeset: 75214:1fc4e9f1fcf2 branch: 3.2 user: Georg Brandl date: Thu Feb 23 21:12:41 2012 +0100 summary: Update pydoc topics. files: Lib/pydoc_data/topics.py | 28 ++++++++++++++-------------- 1 files changed, 14 insertions(+), 14 deletions(-) diff --git a/Lib/pydoc_data/topics.py b/Lib/pydoc_data/topics.py --- a/Lib/pydoc_data/topics.py +++ b/Lib/pydoc_data/topics.py @@ -1,8 +1,8 @@ -# Autogenerated by Sphinx on Sat Sep 3 10:35:42 2011 +# Autogenerated by Sphinx on Thu Feb 23 18:37:54 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\nWith the exception of bytes literals, these all correspond to\nimmutable data types, and hence the object's identity is less\nimportant than its value. Multiple evaluations of literals with the\nsame value (either the same occurrence in the program text or a\ndifferent occurrence) may obtain the same object or a different object\nwith the same value.\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-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', @@ -16,15 +16,15 @@ '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', 'callable-types': '\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', '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 "", 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 ::= "(" [argument_list [","] | comprehension] ")"\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', + '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 lost. The exception information is not available to the\nprogram during execution 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 ["(" [argument_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 that 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 ::= "(" [argument_list [","] | comprehension] ")"\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, 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', '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.__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: ``xy`` 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 .__hash__``. Otherwise the inheritance of\n ``__hash__()`` will be blocked, just as if ``__hash__`` had been\n explicitly set to ``None``.\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', + '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: ``xy`` 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 .__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 > (0)?()\n (Pdb) continue\n > (1)?()\n (Pdb) continue\n NameError: \'spam\'\n > (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 "", 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 that 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', + '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', '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,8 +33,8 @@ '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 ::= +\n conversion ::= "r" | "s" | "a"\n format_spec ::= \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\neither a number or a keyword. If it\'s a number, it refers to a\npositional argument, and if it\'s a keyword, it refers to a named\nkeyword argument. If the numerical arg_names in a format string are\n0, 1, 2, ... in sequence, they can all be omitted (not just some) and\nthe numbers 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 ::= \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 ["(" [argument_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 that 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 ::= +\n conversion ::= "r" | "s" | "a"\n format_spec ::= \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 ::= \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', '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 ::= \n id_continue ::= \n xid_start ::= \n xid_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', @@ -53,24 +53,24 @@ '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 ``TypeError`` exception is raised indicating that\nthis is an error (if running under IDLE, a ``queue.Empty`` exception\nis raised instead).\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 "", line 2, in \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 "", line 4, in \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 "", line 2, in \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 "", line 4, in \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', + '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 "", line 2, in \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 "", line 4, in \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 "", line 2, in \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 "", line 4, in \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', '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\nThe following attributes are only supported by *new-style class*es.\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 new-style class keeps a list of weak references to its\n immediate subclasses. This method returns a list of all those\n references still alive. Example:\n\n >>> int.__subclasses__()\n []\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] 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.__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: ``xy`` 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 .__hash__``. Otherwise the inheritance of\n ``__hash__()`` will be blocked, just as if ``__hash__`` had been\n explicitly set to ``None``.\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 "", line 1, in \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 "", line 1, in \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 one 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 that can be used\n to form decimal-radix numbers, e.g. U+0660, ARABIC-INDIC DIGIT\n 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 in the string are lowercase and\n there is at least one cased character, false otherwise. Cased\n characters are those with general category property being one of\n "Lu", "Ll", or "Lt" and lowercase characters are those with general\n category property "Ll".\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 in the string are uppercase and\n there is at least one cased character, false otherwise. Cased\n characters are those with general category property being one of\n "Lu", "Ll", or "Lt" and uppercase characters are those with general\n category property "Lu".\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 *seq*, including ``bytes`` objects. The\n 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\n ``len(s)``.\n\nstr.lower()\n\n Return a copy of the string 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\n ``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 converted to uppercase.\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 ``len(s)``.\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 []\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: ``xy`` 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 .__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 "", line 1, in \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 "", line 1, in \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 ::= \n longstringchar ::= \n stringescapeseq ::= "\\" \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 ::= \n longbyteschar ::= \n bytesescapeseq ::= "\\" \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', '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 lost. The exception information is not available to the\nprogram during execution 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', + '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', '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', '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: ````. If loaded from a file, they are written as\n````.\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. **CPython implementation detail:** If *s* and *t* are both strings,\n some Python implementations such as CPython can usually perform an\n in-place optimization for assignments of the form ``s = s + t`` or\n ``s += t``. When applicable, this optimization makes quadratic\n run-time much less likely. This optimization is both version and\n implementation dependent. For performance sensitive code, it is\n preferable to use the ``str.join()`` method which assures\n consistent linear concatenation performance across versions and\n implementations.\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 one 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 that can be used\n to form decimal-radix numbers, e.g. U+0660, ARABIC-INDIC DIGIT\n 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 in the string are lowercase and\n there is at least one cased character, false otherwise. Cased\n characters are those with general category property being one of\n "Lu", "Ll", or "Lt" and lowercase characters are those with general\n category property "Ll".\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 in the string are uppercase and\n there is at least one cased character, false otherwise. Cased\n characters are those with general category property being one of\n "Lu", "Ll", or "Lt" and uppercase characters are those with general\n category property "Lu".\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 *seq*, including ``bytes`` objects. The\n 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\n ``len(s)``.\n\nstr.lower()\n\n Return a copy of the string 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\n ``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 converted to uppercase.\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 ``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. [4] 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': '\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', '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', -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Feb 23 21:13:37 2012 From: python-checkins at python.org (georg.brandl) Date: Thu, 23 Feb 2012 21:13:37 +0100 Subject: [Python-checkins] =?utf8?b?Y3B5dGhvbiAobWVyZ2UgMy4yIC0+IDMuMik6?= =?utf8?q?_merge_heads?= Message-ID: http://hg.python.org/cpython/rev/c06bcfbbf123 changeset: 75215:c06bcfbbf123 branch: 3.2 parent: 75211:b2adcd90e656 parent: 75214:1fc4e9f1fcf2 user: Georg Brandl date: Thu Feb 23 21:16:49 2012 +0100 summary: merge heads files: Doc/library/subprocess.rst | 2 +- Doc/library/sys.rst | 6 +++- Lib/pydoc_data/topics.py | 28 +++++++++++++------------- 3 files changed, 19 insertions(+), 17 deletions(-) diff --git a/Doc/library/subprocess.rst b/Doc/library/subprocess.rst --- a/Doc/library/subprocess.rst +++ b/Doc/library/subprocess.rst @@ -207,7 +207,7 @@ When *stdout* or *stderr* are pipes and *universal_newlines* is :const:`True` then the output data is assumed to be encoded as UTF-8 and will automatically be decoded to text. All line endings will be converted - to ``'\n'`` as described for the universal newlines `'U'`` mode argument + to ``'\n'`` as described for the universal newlines ``'U'`` mode argument to :func:`open`. If *shell* is :const:`True`, the specified command will be executed through diff --git a/Doc/library/sys.rst b/Doc/library/sys.rst --- a/Doc/library/sys.rst +++ b/Doc/library/sys.rst @@ -195,7 +195,7 @@ be set at build time with the ``--exec-prefix`` argument to the :program:`configure` script. Specifically, all configuration files (e.g. the :file:`pyconfig.h` header file) are installed in the directory - :file:`{exec_prefix}/lib/python{X.Y}/config', and shared library modules are + :file:`{exec_prefix}/lib/python{X.Y}/config`, and shared library modules are installed in :file:`{exec_prefix}/lib/python{X.Y}/lib-dynload`, where *X.Y* is the version number of Python, for example ``3.2``. @@ -750,12 +750,14 @@ ====================== =========================== .. seealso:: + :attr:`os.name` has a coarser granularity. :func:`os.uname` gives system-dependent version information. The :mod:`platform` module provides detailed checks for the system's identity. + .. data:: prefix A string giving the site-specific directory prefix where the platform @@ -764,7 +766,7 @@ argument to the :program:`configure` script. The main collection of Python 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 + stored in :file:`{prefix}/include/python{X.Y}`, where *X.Y* is the version number of Python, for example ``3.2``. diff --git a/Lib/pydoc_data/topics.py b/Lib/pydoc_data/topics.py --- a/Lib/pydoc_data/topics.py +++ b/Lib/pydoc_data/topics.py @@ -1,8 +1,8 @@ -# Autogenerated by Sphinx on Sat Sep 3 10:35:42 2011 +# Autogenerated by Sphinx on Thu Feb 23 18:37:54 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\nWith the exception of bytes literals, these all correspond to\nimmutable data types, and hence the object's identity is less\nimportant than its value. Multiple evaluations of literals with the\nsame value (either the same occurrence in the program text or a\ndifferent occurrence) may obtain the same object or a different object\nwith the same value.\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-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', @@ -16,15 +16,15 @@ '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', 'callable-types': '\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', '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 "", 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 ::= "(" [argument_list [","] | comprehension] ")"\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', + '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 lost. The exception information is not available to the\nprogram during execution 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 ["(" [argument_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 that 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 ::= "(" [argument_list [","] | comprehension] ")"\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, 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', '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.__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: ``xy`` 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 .__hash__``. Otherwise the inheritance of\n ``__hash__()`` will be blocked, just as if ``__hash__`` had been\n explicitly set to ``None``.\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', + '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: ``xy`` 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 .__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 > (0)?()\n (Pdb) continue\n > (1)?()\n (Pdb) continue\n NameError: \'spam\'\n > (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 "", 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 that 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', + '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', '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,8 +33,8 @@ '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 ::= +\n conversion ::= "r" | "s" | "a"\n format_spec ::= \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\neither a number or a keyword. If it\'s a number, it refers to a\npositional argument, and if it\'s a keyword, it refers to a named\nkeyword argument. If the numerical arg_names in a format string are\n0, 1, 2, ... in sequence, they can all be omitted (not just some) and\nthe numbers 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 ::= \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 ["(" [argument_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 that 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 ::= +\n conversion ::= "r" | "s" | "a"\n format_spec ::= \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 ::= \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', '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 ::= \n id_continue ::= \n xid_start ::= \n xid_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', @@ -53,24 +53,24 @@ '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 ``TypeError`` exception is raised indicating that\nthis is an error (if running under IDLE, a ``queue.Empty`` exception\nis raised instead).\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 "", line 2, in \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 "", line 4, in \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 "", line 2, in \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 "", line 4, in \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', + '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 "", line 2, in \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 "", line 4, in \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 "", line 2, in \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 "", line 4, in \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', '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\nThe following attributes are only supported by *new-style class*es.\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 new-style class keeps a list of weak references to its\n immediate subclasses. This method returns a list of all those\n references still alive. Example:\n\n >>> int.__subclasses__()\n []\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] 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.__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: ``xy`` 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 .__hash__``. Otherwise the inheritance of\n ``__hash__()`` will be blocked, just as if ``__hash__`` had been\n explicitly set to ``None``.\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 "", line 1, in \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 "", line 1, in \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 one 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 that can be used\n to form decimal-radix numbers, e.g. U+0660, ARABIC-INDIC DIGIT\n 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 in the string are lowercase and\n there is at least one cased character, false otherwise. Cased\n characters are those with general category property being one of\n "Lu", "Ll", or "Lt" and lowercase characters are those with general\n category property "Ll".\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 in the string are uppercase and\n there is at least one cased character, false otherwise. Cased\n characters are those with general category property being one of\n "Lu", "Ll", or "Lt" and uppercase characters are those with general\n category property "Lu".\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 *seq*, including ``bytes`` objects. The\n 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\n ``len(s)``.\n\nstr.lower()\n\n Return a copy of the string 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\n ``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 converted to uppercase.\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 ``len(s)``.\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 []\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: ``xy`` 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 .__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 "", line 1, in \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 "", line 1, in \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 ::= \n longstringchar ::= \n stringescapeseq ::= "\\" \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 ::= \n longbyteschar ::= \n bytesescapeseq ::= "\\" \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', '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 lost. The exception information is not available to the\nprogram during execution 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', + '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', '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', '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: ````. If loaded from a file, they are written as\n````.\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. **CPython implementation detail:** If *s* and *t* are both strings,\n some Python implementations such as CPython can usually perform an\n in-place optimization for assignments of the form ``s = s + t`` or\n ``s += t``. When applicable, this optimization makes quadratic\n run-time much less likely. This optimization is both version and\n implementation dependent. For performance sensitive code, it is\n preferable to use the ``str.join()`` method which assures\n consistent linear concatenation performance across versions and\n implementations.\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 one 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 that can be used\n to form decimal-radix numbers, e.g. U+0660, ARABIC-INDIC DIGIT\n 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 in the string are lowercase and\n there is at least one cased character, false otherwise. Cased\n characters are those with general category property being one of\n "Lu", "Ll", or "Lt" and lowercase characters are those with general\n category property "Ll".\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 in the string are uppercase and\n there is at least one cased character, false otherwise. Cased\n characters are those with general category property being one of\n "Lu", "Ll", or "Lt" and uppercase characters are those with general\n category property "Lu".\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 *seq*, including ``bytes`` objects. The\n 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\n ``len(s)``.\n\nstr.lower()\n\n Return a copy of the string 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\n ``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 converted to uppercase.\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 ``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. [4] 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': '\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', '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', -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Feb 23 21:13:38 2012 From: python-checkins at python.org (georg.brandl) Date: Thu, 23 Feb 2012 21:13:38 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_3=2E2_-=3E_default=29?= =?utf8?q?=3A_merge_with_3=2E2?= Message-ID: http://hg.python.org/cpython/rev/54a3f30c58c0 changeset: 75216:54a3f30c58c0 parent: 75212:cb9a2dff6240 parent: 75215:c06bcfbbf123 user: Georg Brandl date: Thu Feb 23 21:17:27 2012 +0100 summary: merge with 3.2 files: Doc/library/subprocess.rst | 2 +- Doc/library/sys.rst | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/Doc/library/subprocess.rst b/Doc/library/subprocess.rst --- a/Doc/library/subprocess.rst +++ b/Doc/library/subprocess.rst @@ -240,7 +240,7 @@ When *stdout* or *stderr* are pipes and *universal_newlines* is :const:`True` then the output data is assumed to be encoded as UTF-8 and will automatically be decoded to text. All line endings will be converted - to ``'\n'`` as described for the universal newlines `'U'`` mode argument + to ``'\n'`` as described for the universal newlines ``'U'`` mode argument to :func:`open`. If *shell* is :const:`True`, the specified command will be executed through diff --git a/Doc/library/sys.rst b/Doc/library/sys.rst --- a/Doc/library/sys.rst +++ b/Doc/library/sys.rst @@ -195,7 +195,7 @@ be set at build time with the ``--exec-prefix`` argument to the :program:`configure` script. Specifically, all configuration files (e.g. the :file:`pyconfig.h` header file) are installed in the directory - :file:`{exec_prefix}/lib/python{X.Y}/config', and shared library modules are + :file:`{exec_prefix}/lib/python{X.Y}/config`, and shared library modules are installed in :file:`{exec_prefix}/lib/python{X.Y}/lib-dynload`, where *X.Y* is the version number of Python, for example ``3.2``. @@ -756,6 +756,7 @@ always use the ``startswith`` idiom presented above. .. seealso:: + :attr:`os.name` has a coarser granularity. :func:`os.uname` gives system-dependent version information. @@ -771,7 +772,7 @@ argument to the :program:`configure` script. The main collection of Python 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 + stored in :file:`{prefix}/include/python{X.Y}`, where *X.Y* is the version number of Python, for example ``3.2``. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Feb 23 21:20:16 2012 From: python-checkins at python.org (benjamin.peterson) Date: Thu, 23 Feb 2012 21:20:16 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=282=2E7=29=3A_update_pydoc-to?= =?utf8?q?pics?= Message-ID: http://hg.python.org/cpython/rev/2cb325d661eb changeset: 75217:2cb325d661eb branch: 2.7 parent: 75203:be5470d76a82 user: Benjamin Peterson date: Thu Feb 23 15:18:13 2012 -0500 summary: update pydoc-topics files: Lib/pydoc_data/topics.py | 160 ++++++++++++-------------- 1 files changed, 77 insertions(+), 83 deletions(-) diff --git a/Lib/pydoc_data/topics.py b/Lib/pydoc_data/topics.py --- a/Lib/pydoc_data/topics.py +++ b/Lib/pydoc_data/topics.py @@ -1,83 +1,77 @@ -# Autogenerated by Sphinx on Sat Jun 11 09:49:30 2011 -topics = {'assert': u'\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': u'\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\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 is recursively defined as\nfollows.\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\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`` statement in the\n current code block: the name is bound to the object in the current\n local namespace.\n\n * Otherwise: the name is bound to the object in the current global\n namespace.\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 a plain integer. If it is negative, the\n sequence\'s length is added to it. The resulting value must be a\n nonnegative integer less than the sequence\'s length, and the\n sequence is asked to assign the assigned object to its item with\n that index. If the index is out of range, ``IndexError`` is raised\n (assignment to a subscripted sequence cannot add new items to a\n 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* 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 (small) integers. If either\n bound is negative, the sequence\'s length is added to it. The\n resulting bounds are clipped to lie between zero and the sequence\'s\n length, inclusive. Finally, the sequence object is asked to replace\n the slice with the items of the assigned sequence. The length of\n the 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\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': u'\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': u"\nLiterals\n********\n\nPython supports string literals and various numeric literals:\n\n literal ::= stringliteral | integer | longinteger\n | floatnumber | imagnumber\n\nEvaluation of a literal yields an object of the given type (string,\ninteger, long integer, floating point number, complex number) with the\ngiven value. The value may be approximated in the case of floating\npoint and imaginary (complex) literals. See section *Literals* for\ndetails.\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': u'\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 in new-style classes.\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 not simply execute ``self.name = value`` --- this would\n cause a recursive call to itself. Instead, it should insert the\n value in the dictionary of instance attributes, e.g.,\n ``self.__dict__[name] = value``. For new-style classes, rather\n than accessing the instance dictionary, it should call the base\n 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\n\nMore attribute access for new-style classes\n===========================================\n\nThe following methods only apply to new-style classes.\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 for new-style\n classes*.\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. Note that descriptors are only invoked for new\nstyle objects or classes (ones that subclass ``object()`` or\n``type()``).\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 a new-style object instance, ``a.x`` is transformed\n into the call: ``type(a).__dict__[\'x\'].__get__(a, type(a))``.\n\nClass Binding\n If binding to a new-style class, ``A.x`` is transformed into the\n call: ``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 both old and new-style classes have a\ndictionary for attribute storage. This wastes space for objects\nhaving very few instance variables. The space consumption can become\nacute when creating large numbers of instances.\n\nThe default can be overridden by defining *__slots__* in a new-style\nclass definition. The *__slots__* declaration takes a sequence of\ninstance variables and reserves just enough space in each instance to\nhold a value for each variable. Space is saved because *__dict__* is\nnot created for each instance.\n\n__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 new-style class, *__slots__* reserves space for the declared\n variables and prevents the automatic creation of *__dict__* and\n *__weakref__* for each instance.\n\n New in version 2.2.\n\nNotes on using *__slots__*\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 Changed in version 2.3: Previously, adding ``\'__dict__\'`` to the\n *__slots__* declaration would not enable the assignment of new\n attributes not specifically listed in the sequence of instance\n variable names.\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 Changed in version 2.3: Previously, adding ``\'__weakref__\'`` to the\n *__slots__* declaration would not enable support for weak\n references.\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 ``long``, ``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 Changed in version 2.6: Previously, *__class__* assignment raised an\n error if either new or old class had *__slots__*.\n', - 'attribute-references': u'\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, e.g., a module, list, or an instance. This\nobject is then asked to produce the attribute whose name is the\nidentifier. If this attribute is not available, the exception\n``AttributeError`` is raised. Otherwise, the type and value of the\nobject produced is determined by the object. Multiple evaluations of\nthe same attribute reference may yield different objects.\n', - 'augassign': u'\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': u'\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 (plain or long) and the other must be a sequence.\nIn the former case, the numbers are converted to a common type and\nthen multiplied together. In the latter case, sequence repetition is\nperformed; a negative 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. Plain or long integer division yields an\ninteger of the same type; the result is that of mathematical division\nwith the \'floor\' function applied to the result. Division by zero\nraises 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 [2].\n\nThe integer division and modulo operators are connected by the\nfollowing identity: ``x == (x/y)*y + (x%y)``. Integer division and\nmodulo are also connected with the built-in function ``divmod()``:\n``divmod(x, y) == (x/y, x%y)``. These identities don\'t hold for\nfloating point numbers; there similar identities hold approximately\nwhere ``x/y`` is replaced by ``floor(x/y)`` or ``floor(x/y) - 1`` [3].\n\nIn addition to performing the modulo operation on numbers, the ``%``\noperator is also overloaded by string and unicode objects to perform\nstring formatting (also known as interpolation). The syntax for string\nformatting is described in the Python Library Reference, section\n*String Formatting Operations*.\n\nDeprecated since version 2.3: The floor division operator, the modulo\noperator, and the ``divmod()`` function are no longer defined for\ncomplex numbers. Instead, convert to a floating point number using\nthe ``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': u'\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 plain or long integers. The arguments are converted to a common\ntype.\n\nThe ``^`` operator yields the bitwise XOR (exclusive OR) of its\narguments, which must be plain or long integers. The arguments are\nconverted to a common type.\n\nThe ``|`` operator yields the bitwise (inclusive) OR of its arguments,\nwhich must be plain or long integers. The arguments are converted to\na common type.\n', - 'bltin-code-objects': u'\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 ``func_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`` statement or the built-in ``eval()``\nfunction.\n\nSee *The standard type hierarchy* for more information.\n', - 'bltin-ellipsis-object': u'\nThe Ellipsis Object\n*******************\n\nThis object is used by extended slice notation (see *Slicings*). It\nsupports no special operations. There is exactly one ellipsis object,\nnamed ``Ellipsis`` (a built-in name).\n\nIt is written as ``Ellipsis``.\n', - 'bltin-file-objects': u'\nFile Objects\n************\n\nFile objects are implemented using C\'s ``stdio`` package and can be\ncreated with the built-in ``open()`` function. File objects are also\nreturned by some other built-in functions and methods, such as\n``os.popen()`` and ``os.fdopen()`` and the ``makefile()`` method of\nsocket objects. Temporary files can be created using the ``tempfile``\nmodule, and high-level file operations such as copying, moving, and\ndeleting files and directories can be achieved with the ``shutil``\nmodule.\n\nWhen a file operation fails for an I/O-related reason, the exception\n``IOError`` is raised. This includes situations where the operation\nis not defined for some reason, like ``seek()`` on a tty device or\nwriting a file opened for reading.\n\nFiles have the following methods:\n\nfile.close()\n\n Close the file. A closed file cannot be read or written any more.\n Any operation which requires that the file be open will raise a\n ``ValueError`` after the file has been closed. Calling ``close()``\n more than once is allowed.\n\n As of Python 2.5, you can avoid having to call this method\n explicitly if you use the ``with`` statement. For example, the\n following code will automatically close *f* when the ``with`` block\n is exited:\n\n from __future__ import with_statement # This isn\'t required in Python 2.6\n\n with open("hello.txt") as f:\n for line in f:\n print line\n\n In older versions of Python, you would have needed to do this to\n get the same effect:\n\n f = open("hello.txt")\n try:\n for line in f:\n print line\n finally:\n f.close()\n\n Note: Not all "file-like" types in Python support use as a context\n manager for the ``with`` statement. If your code is intended to\n work with any file-like object, you can use the function\n ``contextlib.closing()`` instead of using the object directly.\n\nfile.flush()\n\n Flush the internal buffer, like ``stdio``\'s ``fflush()``. This may\n be a no-op on some file-like objects.\n\n Note: ``flush()`` does not necessarily write the file\'s data to disk.\n Use ``flush()`` followed by ``os.fsync()`` to ensure this\n behavior.\n\nfile.fileno()\n\n Return the integer "file descriptor" that is used by the underlying\n implementation to request I/O operations from the operating system.\n This can be useful for other, lower level interfaces that use file\n descriptors, such as the ``fcntl`` module or ``os.read()`` and\n friends.\n\n Note: File-like objects which do not have a real file descriptor should\n *not* provide this method!\n\nfile.isatty()\n\n Return ``True`` if the file is connected to a tty(-like) device,\n else ``False``.\n\n Note: If a file-like object is not associated with a real file, this\n method should *not* be implemented.\n\nfile.next()\n\n A file object is its own iterator, for example ``iter(f)`` returns\n *f* (unless *f* is closed). When a file is used as an iterator,\n typically in a ``for`` loop (for example, ``for line in f: print\n line``), the ``next()`` method is called repeatedly. This method\n returns the next input line, or raises ``StopIteration`` when EOF\n is hit when the file is open for reading (behavior is undefined\n when the file is open for writing). In order to make a ``for``\n loop the most efficient way of looping over the lines of a file (a\n very common operation), the ``next()`` method uses a hidden read-\n ahead buffer. As a consequence of using a read-ahead buffer,\n combining ``next()`` with other file methods (like ``readline()``)\n does not work right. However, using ``seek()`` to reposition the\n file to an absolute position will flush the read-ahead buffer.\n\n New in version 2.3.\n\nfile.read([size])\n\n Read at most *size* bytes from the file (less if the read hits EOF\n before obtaining *size* bytes). If the *size* argument is negative\n or omitted, read all data until EOF is reached. The bytes are\n returned as a string object. An empty string is returned when EOF\n is encountered immediately. (For certain files, like ttys, it\n makes sense to continue reading after an EOF is hit.) Note that\n this method may call the underlying C function ``fread()`` more\n than once in an effort to acquire as close to *size* bytes as\n possible. Also note that when in non-blocking mode, less data than\n was requested may be returned, even if no *size* parameter was\n given.\n\n Note: This function is simply a wrapper for the underlying ``fread()``\n C function, and will behave the same in corner cases, such as\n whether the EOF value is cached.\n\nfile.readline([size])\n\n Read one entire line from the file. A trailing newline character\n is kept in the string (but may be absent when a file ends with an\n incomplete line). [5] If the *size* argument is present and non-\n negative, it is a maximum byte count (including the trailing\n newline) and an incomplete line may be returned. When *size* is not\n 0, an empty string is returned *only* when EOF is encountered\n immediately.\n\n Note: Unlike ``stdio``\'s ``fgets()``, the returned string contains null\n characters (``\'\\0\'``) if they occurred in the input.\n\nfile.readlines([sizehint])\n\n Read until EOF using ``readline()`` and return a list containing\n the lines thus read. If the optional *sizehint* argument is\n present, instead of reading up to EOF, whole lines totalling\n approximately *sizehint* bytes (possibly after rounding up to an\n internal buffer size) are read. Objects implementing a file-like\n interface may choose to ignore *sizehint* if it cannot be\n implemented, or cannot be implemented efficiently.\n\nfile.xreadlines()\n\n This method returns the same thing as ``iter(f)``.\n\n New in version 2.1.\n\n Deprecated since version 2.3: Use ``for line in file`` instead.\n\nfile.seek(offset[, whence])\n\n Set the file\'s current position, like ``stdio``\'s ``fseek()``. The\n *whence* argument is optional and defaults to ``os.SEEK_SET`` or\n ``0`` (absolute file positioning); other values are ``os.SEEK_CUR``\n or ``1`` (seek relative to the current position) and\n ``os.SEEK_END`` or ``2`` (seek relative to the file\'s end). There\n is no return value.\n\n For example, ``f.seek(2, os.SEEK_CUR)`` advances the position by\n two and ``f.seek(-3, os.SEEK_END)`` sets the position to the third\n to last.\n\n Note that if the file is opened for appending (mode ``\'a\'`` or\n ``\'a+\'``), any ``seek()`` operations will be undone at the next\n write. If the file is only opened for writing in append mode (mode\n ``\'a\'``), this method is essentially a no-op, but it remains useful\n for files opened in append mode with reading enabled (mode\n ``\'a+\'``). If the file is opened in text mode (without ``\'b\'``),\n only offsets returned by ``tell()`` are legal. Use of other\n offsets causes undefined behavior.\n\n Note that not all file objects are seekable.\n\n Changed in version 2.6: Passing float values as offset has been\n deprecated.\n\nfile.tell()\n\n Return the file\'s current position, like ``stdio``\'s ``ftell()``.\n\n Note: On Windows, ``tell()`` can return illegal values (after an\n ``fgets()``) when reading files with Unix-style line-endings. Use\n binary mode (``\'rb\'``) to circumvent this problem.\n\nfile.truncate([size])\n\n Truncate the file\'s size. If the optional *size* argument is\n present, the file is truncated to (at most) that size. The size\n defaults to the current position. The current file position is not\n changed. Note that if a specified size exceeds the file\'s current\n size, the result is platform-dependent: possibilities include that\n the file may remain unchanged, increase to the specified size as if\n zero-filled, or increase to the specified size with undefined new\n content. Availability: Windows, many Unix variants.\n\nfile.write(str)\n\n Write a string to the file. There is no return value. Due to\n buffering, the string may not actually show up in the file until\n the ``flush()`` or ``close()`` method is called.\n\nfile.writelines(sequence)\n\n Write a sequence of strings to the file. The sequence can be any\n iterable object producing strings, typically a list of strings.\n There is no return value. (The name is intended to match\n ``readlines()``; ``writelines()`` does not add line separators.)\n\nFiles support the iterator protocol. Each iteration returns the same\nresult as ``file.readline()``, and iteration ends when the\n``readline()`` method returns an empty string.\n\nFile objects also offer a number of other interesting attributes.\nThese are not required for file-like objects, but should be\nimplemented if they make sense for the particular object.\n\nfile.closed\n\n bool indicating the current state of the file object. This is a\n read-only attribute; the ``close()`` method changes the value. It\n may not be available on all file-like objects.\n\nfile.encoding\n\n The encoding that this file uses. When Unicode strings are written\n to a file, they will be converted to byte strings using this\n encoding. In addition, when the file is connected to a terminal,\n the attribute gives the encoding that the terminal is likely to use\n (that information might be incorrect if the user has misconfigured\n the terminal). The attribute is read-only and may not be present\n on all file-like objects. It may also be ``None``, in which case\n the file uses the system default encoding for converting Unicode\n strings.\n\n New in version 2.3.\n\nfile.errors\n\n The Unicode error handler used along with the encoding.\n\n New in version 2.6.\n\nfile.mode\n\n The I/O mode for the file. If the file was created using the\n ``open()`` built-in function, this will be the value of the *mode*\n parameter. This is a read-only attribute and may not be present on\n all file-like objects.\n\nfile.name\n\n If the file object was created using ``open()``, the name of the\n file. Otherwise, some string that indicates the source of the file\n object, of the form ``<...>``. This is a read-only attribute and\n may not be present on all file-like objects.\n\nfile.newlines\n\n If Python was built with universal newlines enabled (the default)\n this read-only attribute exists, and for files opened in universal\n newline read mode it keeps track of the types of newlines\n encountered while reading the file. The values it can take are\n ``\'\\r\'``, ``\'\\n\'``, ``\'\\r\\n\'``, ``None`` (unknown, no newlines read\n yet) or a tuple containing all the newline types seen, to indicate\n that multiple newline conventions were encountered. For files not\n opened in universal newline read mode the value of this attribute\n will be ``None``.\n\nfile.softspace\n\n Boolean that indicates whether a space character needs to be\n printed before another value when using the ``print`` statement.\n Classes that are trying to simulate a file object should also have\n a writable ``softspace`` attribute, which should be initialized to\n zero. This will be automatic for most classes implemented in\n Python (care may be needed for objects that override attribute\n access); types implemented in C will have to provide a writable\n ``softspace`` attribute.\n\n Note: This attribute is not used to control the ``print`` statement,\n but to allow the implementation of ``print`` to keep track of its\n internal state.\n', - 'bltin-null-object': u"\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-type-objects': u"\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: ````.\n", - 'booleans': u'\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. (See the ``__nonzero__()`` special method for a way to\nchange this.)\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': u'\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', - 'callable-types': u'\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', - 'calls': u'\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 [","]\n | expression genexpr_for] ")"\n argument_list ::= positional_arguments ["," keyword_arguments]\n ["," "*" expression] ["," keyword_arguments]\n ["," "**" expression]\n | keyword_arguments ["," "*" expression]\n ["," "**" expression]\n | "*" expression ["," "*" expression] ["," "**" 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 certain class instances\nthemselves are callable; extensions may define additional callable\nobject types). All argument expressions are evaluated before the call\nis attempted. Please refer to section *Function definitions* for the\nsyntax 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 a sequence. Elements from this\nsequence 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 "", 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. Formal parameters using the syntax ``(sublist)`` cannot be\nused as keyword argument names; the outermost sublist corresponds to a\nsingle unnamed argument slot, and the argument value is assigned to\nthe sublist using the usual tuple assignment rules after all other\nparameter processing is done.\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': u'\nClass definitions\n*****************\n\nA class definition defines a class object (see section *The standard\ntype hierarchy*):\n\n classdef ::= "class" classname [inheritance] ":" suite\n inheritance ::= "(" [expression_list] ")"\n classname ::= identifier\n\nA class definition is an executable statement. It first evaluates the\ninheritance list, if present. Each item in the inheritance list\nshould evaluate to a class object or class type which allows\nsubclassing. The class\'s suite is then executed in a new execution\nframe (see section *Naming and binding*), using a newly created local\nnamespace and the original global namespace. (Usually, the suite\ncontains only function definitions.) When the class\'s suite finishes\nexecution, its execution frame is discarded but its local namespace is\nsaved. [4] A class object is then created using the inheritance list\nfor the base classes and the saved local namespace for the attribute\ndictionary. The class name is bound to this class object in the\noriginal local namespace.\n\n**Programmer\'s note:** Variables defined in the class definition are\nclass variables; they are shared by all instances. To create instance\nvariables, they can be set in a method with ``self.name = value``.\nBoth class and instance variables are accessible through the notation\n"``self.name``", and an instance variable hides a class variable with\nthe same name when accessed in this way. Class variables can be used\nas defaults for instance variables, but using mutable values there can\nlead to unexpected results. For *new-style class*es, descriptors can\nbe used to create instance variables with different implementation\ndetails.\n\nClass definitions, like function definitions, may be wrapped by one or\nmore *decorator* expressions. The evaluation rules for the decorator\nexpressions are the same as for functions. The result must be a class\nobject, which is then bound to the class name.\n\n-[ Footnotes ]-\n\n[1] The exception is propagated to the invocation stack only if there\n is no ``finally`` clause that negates the exception.\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', - 'coercion-rules': u"\nCoercion rules\n**************\n\nThis section used to document the rules for coercion. As the language\nhas evolved, the coercion rules have become hard to document\nprecisely; documenting what one version of one particular\nimplementation does is undesirable. Instead, here are some informal\nguidelines regarding coercion. In Python 3.0, coercion will not be\nsupported.\n\n* If the left operand of a % operator is a string or Unicode object,\n no coercion takes place and the string formatting operation is\n invoked instead.\n\n* It is no longer recommended to define a coercion operation. Mixed-\n mode operations on types that don't define coercion pass the\n original arguments to the operation.\n\n* New-style classes (those derived from ``object``) never invoke the\n ``__coerce__()`` method in response to a binary operator; the only\n time ``__coerce__()`` is invoked is when the built-in function\n ``coerce()`` is called.\n\n* For most intents and purposes, an operator that returns\n ``NotImplemented`` is treated the same as one that is not\n implemented at all.\n\n* Below, ``__op__()`` and ``__rop__()`` are used to signify the\n generic method names corresponding to an operator; ``__iop__()`` is\n used for the corresponding in-place operator. For example, for the\n operator '``+``', ``__add__()`` and ``__radd__()`` are used for the\n left and right variant of the binary operator, and ``__iadd__()``\n for the in-place variant.\n\n* For objects *x* and *y*, first ``x.__op__(y)`` is tried. If this is\n not implemented or returns ``NotImplemented``, ``y.__rop__(x)`` is\n tried. If this is also not implemented or returns\n ``NotImplemented``, a ``TypeError`` exception is raised. But see\n the following exception:\n\n* Exception to the previous item: if the left operand is an instance\n of a built-in type or a new-style class, and the right operand is an\n instance of a proper subclass of that type or class and overrides\n the base's ``__rop__()`` method, the right operand's ``__rop__()``\n method is tried *before* the left operand's ``__op__()`` method.\n\n This is done so that a subclass can completely override binary\n operators. Otherwise, the left operand's ``__op__()`` method would\n always accept the right operand: when an instance of a given class\n is expected, an instance of a subclass of that class is always\n acceptable.\n\n* When either operand type defines a coercion, this coercion is called\n before that type's ``__op__()`` or ``__rop__()`` method is called,\n but no sooner. If the coercion returns an object of a different\n type for the operand whose coercion is invoked, part of the process\n is redone using the new object.\n\n* When an in-place operator (like '``+=``') is used, if the left\n operand implements ``__iop__()``, it is invoked without any\n coercion. When the operation falls back to ``__op__()`` and/or\n ``__rop__()``, the normal coercion rules apply.\n\n* In ``x + y``, if *x* is a sequence that implements sequence\n concatenation, sequence concatenation is invoked.\n\n* In ``x * y``, if one operator is a sequence that implements sequence\n repetition, and the other is an integer (``int`` or ``long``),\n sequence repetition is invoked.\n\n* Rich comparisons (implemented by methods ``__eq__()`` and so on)\n never use coercion. Three-way comparison (implemented by\n ``__cmp__()``) does use coercion under the same conditions as other\n binary operations use it.\n\n* In the current implementation, the built-in numeric types ``int``,\n ``long``, ``float``, and ``complex`` do not use coercion. All these\n types implement a ``__coerce__()`` method, for use by the built-in\n ``coerce()`` function.\n\n Changed in version 2.7.\n", - 'comparisons': u'\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 forms ``<>`` and ``!=`` are equivalent; for consistency with C,\n``!=`` is preferred; where ``!=`` is mentioned below ``<>`` is also\naccepted. The ``<>`` spelling is considered obsolescent.\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,\nobjects of different types *always* compare unequal, and are ordered\nconsistently but arbitrarily. You can control comparison behavior of\nobjects of non-built-in types by defining a ``__cmp__`` method or rich\ncomparison methods like ``__gt__``, described in section *Special\nmethod names*.\n\n(This unusual definition of comparison was used to simplify the\ndefinition of operations like sorting and the ``in`` and ``not in``\noperators. In the future, the comparison rules for objects of\ndifferent types are likely to change.)\n\nComparison of objects of the same type depends on the type:\n\n* Numbers are compared arithmetically.\n\n* Strings are compared lexicographically using the numeric equivalents\n (the result of the built-in function ``ord()``) of their characters.\n Unicode and 8-bit strings are fully interoperable in this behavior.\n [4]\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, ``cmp([1,2,x], [1,2,y])`` returns\n the same as ``cmp(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 their sorted\n (key, value) lists compare equal. [5] Outcomes other than equality\n are resolved consistently, but are not otherwise defined. [6]\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\nThe operators ``in`` and ``not in`` test for collection membership.\n``x in s`` evaluates to true if *x* is a member of the collection *s*,\nand false otherwise. ``x not in s`` returns the negation of ``x in\ns``. The collection membership test has traditionally been bound to\nsequences; an object is a member of a collection if the collection is\na sequence and contains an element equal to that object. However, it\nmake sense for many other object types to support membership tests\nwithout being a sequence. In particular, dictionaries (for keys) and\nsets support membership testing.\n\nFor the list and tuple types, ``x in y`` is true if and only if there\nexists an index *i* such that ``x == y[i]`` is true.\n\nFor the Unicode and string types, ``x in y`` is true if and only if\n*x* is a substring of *y*. An equivalent test is ``y.find(x) != -1``.\nNote, *x* and *y* need not be the same type; consequently, ``u\'ab\' in\n\'abc\'`` will return ``True``. Empty strings are always considered to\nbe a substring of any other string, so ``"" in "abc"`` will return\n``True``.\n\nChanged in version 2.3: Previously, *x* was required to be a string of\nlength ``1``.\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. [7]\n', - 'compound': u'\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. Function and class\ndefinitions are also syntactically compound 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`` statements 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 | decorated\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, and then the suite is executed. When the items are\nexhausted (which is immediately when the sequence is empty), the suite\nin the ``else`` clause, if present, is executed, and the loop\nterminates.\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\nThe target list is not deleted when the loop is finished, but if the\nsequence is empty, it will not have been assigned to at all by the\nloop. Hint: the built-in function ``range()`` returns a sequence of\nintegers suitable to emulate the effect of Pascal\'s ``for i := a to b\ndo``; e.g., ``range(3)`` returns the list ``[0, 1, 2]``.\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 internal\n counter is used to keep track of which item is used next, and this\n is incremented on each iteration. When this counter has reached the\n length of the sequence the loop terminates. This means that if the\n suite deletes the current (or a previous) item from the sequence,\n the next item will be skipped (since it gets the index of the\n 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\nChanged in version 2.5: In previous versions of Python,\n``try``...``except``...``finally`` did not work. ``try``...``except``\nhad to be nested in ``try``...``finally``.\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, a tuple containing an item compatible with the\nexception, or, in the (deprecated) case of string exceptions, is the\nraised string itself (note that the object identities must match, i.e.\nit must be the same string object, not just a string with the same\nvalue).\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 in that except clause, if present, and the except\nclause\'s suite is executed. All except clauses must have an\nexecutable block. When the end of this block is reached, execution\ncontinues normally after the entire try statement. (This means that\nif two nested handlers exist for the same exception, and the exception\noccurs in the try clause of the inner handler, the outer handler will\nnot handle the exception.)\n\nBefore an except clause\'s suite is executed, details about the\nexception are assigned to three variables in the ``sys`` module:\n``sys.exc_type`` receives the object identifying the exception;\n``sys.exc_value`` receives the exception\'s parameter;\n``sys.exc_traceback`` receives a traceback object (see section *The\nstandard type hierarchy*) identifying the point in the program where\nthe exception occurred. These details are also available through the\n``sys.exc_info()`` function, which returns a tuple ``(exc_type,\nexc_value, exc_traceback)``. Use of the corresponding variables is\ndeprecated in favor of this function, since their use is unsafe in a\nthreaded program. As of Python 1.5, the variables are restored to\ntheir previous values (before the call) when returning from a function\nthat 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 lost. The exception information is not available to the\nprogram during execution 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\nNew in version 2.5.\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\nNote: In Python 2.5, the ``with`` statement is only allowed when the\n ``with_statement`` feature has been enabled. It is always enabled\n in Python 2.6.\n\nChanged in version 2.7: 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 decorated ::= decorators (classdef | funcdef)\n decorators ::= decorator+\n decorator ::= "@" dotted_name ["(" [argument_list [","]] ")"] NEWLINE\n funcdef ::= "def" funcname "(" [parameter_list] ")" ":" suite\n dotted_name ::= identifier ("." identifier)*\n parameter_list ::= (defparameter ",")*\n ( "*" identifier [, "**" identifier]\n | "**" identifier\n | defparameter [","] )\n defparameter ::= parameter ["=" expression]\n sublist ::= parameter ("," parameter)* [","]\n parameter ::= identifier | "(" sublist ")"\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 top-level 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 must also have a default value --- this is a syntactic\nrestriction 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 that 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.\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.\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 ::= "class" classname [inheritance] ":" suite\n inheritance ::= "(" [expression_list] ")"\n classname ::= identifier\n\nA class definition is an executable statement. It first evaluates the\ninheritance list, if present. Each item in the inheritance list\nshould evaluate to a class object or class type which allows\nsubclassing. The class\'s suite is then executed in a new execution\nframe (see section *Naming and binding*), using a newly created local\nnamespace and the original global namespace. (Usually, the suite\ncontains only function definitions.) When the class\'s suite finishes\nexecution, its execution frame is discarded but its local namespace is\nsaved. [4] A class object is then created using the inheritance list\nfor the base classes and the saved local namespace for the attribute\ndictionary. The class name is bound to this class object in the\noriginal local namespace.\n\n**Programmer\'s note:** Variables defined in the class definition are\nclass variables; they are shared by all instances. To create instance\nvariables, they can be set in a method with ``self.name = value``.\nBoth class and instance variables are accessible through the notation\n"``self.name``", and an instance variable hides a class variable with\nthe same name when accessed in this way. Class variables can be used\nas defaults for instance variables, but using mutable values there can\nlead to unexpected results. For *new-style class*es, descriptors can\nbe used to create instance variables with different implementation\ndetails.\n\nClass definitions, like function definitions, may be wrapped by one or\nmore *decorator* expressions. The evaluation rules for the decorator\nexpressions are the same as for functions. The result must be a class\nobject, which is then bound to the class name.\n\n-[ Footnotes ]-\n\n[1] The exception is propagated to the invocation stack only if there\n is no ``finally`` clause that negates the exception.\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': u'\nWith Statement Context Managers\n*******************************\n\nNew in version 2.5.\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': u'\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': u'\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," the arguments\nare coerced using the coercion rules listed at *Coercion rules*. If\nboth arguments are standard numeric types, the following coercions are\napplied:\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, if either argument is a long integer, the other is\n converted to long integer;\n\n* otherwise, both must be plain integers and no conversion is\n necessary.\n\nSome additional rules apply for certain operators (e.g., a string left\nargument to the \'%\' operator). Extensions can define their own\ncoercions.\n', - 'customization': u'\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_traceback`` 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.exc_traceback`` or ``sys.last_traceback``. Circular\n references which are garbage are detected when the option cycle\n detector is enabled (it\'s on by default), but can only be cleaned\n up if there are no Python-level ``__del__()`` methods involved.\n Refer to the documentation for the ``gc`` module for more\n information about how ``__del__()`` methods are handled by the\n cycle detector, particularly the description of the ``garbage``\n 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 and by string\n conversions (reverse quotes) to compute the "official" string\n representation of an object. If at all possible, this should look\n like a valid Python expression that could be used to recreate an\n object with the same value (given an appropriate environment). If\n this is not possible, a string of the form ``<...some useful\n description...>`` should be returned. The return value must be a\n string object. If a class defines ``__repr__()`` but not\n ``__str__()``, then ``__repr__()`` is also used when an "informal"\n string representation of instances of that class is 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 statement 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.__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 New in version 2.1.\n\n These are the so-called "rich comparison" methods, and are called\n for comparison operators in preference to ``__cmp__()`` below. The\n correspondence between operator symbols and method names is as\n follows: ``xy`` call ``x.__ne__(y)``, ``x>y`` calls ``x.__gt__(y)``, and\n ``x>=y`` calls ``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.__cmp__(self, other)\n\n Called by comparison operations if rich comparison (see above) is\n not defined. Should return a negative integer if ``self < other``,\n zero if ``self == other``, a positive integer if ``self > other``.\n If no ``__cmp__()``, ``__eq__()`` or ``__ne__()`` operation is\n defined, class instances are compared by object identity\n ("address"). See also the description of ``__hash__()`` for some\n important notes on creating *hashable* objects which support custom\n comparison operations and are usable as dictionary keys. (Note: the\n restriction that exceptions are not propagated by ``__cmp__()`` has\n been removed since Python 1.5.)\n\nobject.__rcmp__(self, other)\n\n Changed in version 2.1: No longer supported.\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 a ``__cmp__()`` or ``__eq__()`` method\n it should not define a ``__hash__()`` operation either; if it\n defines ``__cmp__()`` or ``__eq__()`` but not ``__hash__()``, its\n instances will not be usable in hashed collections. If a class\n defines mutable objects and implements a ``__cmp__()`` or\n ``__eq__()`` method, it should not implement ``__hash__()``, since\n hashable collection implementations require that a object\'s hash\n value is immutable (if the object\'s hash value changes, it will be\n in the wrong hash bucket).\n\n User-defined classes have ``__cmp__()`` 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 ``__cmp__()`` or ``__eq__()`` such that\n the hash value returned is no longer appropriate (e.g. by switching\n to a value-based concept of equality instead of the default\n identity based equality) can explicitly flag themselves as being\n unhashable by setting ``__hash__ = None`` in the class definition.\n Doing so means that not only will instances of the class raise an\n appropriate ``TypeError`` when a program attempts to retrieve their\n hash value, but they will also be correctly identified as\n unhashable when checking ``isinstance(obj, collections.Hashable)``\n (unlike classes which define their own ``__hash__()`` to explicitly\n raise ``TypeError``).\n\n Changed in version 2.5: ``__hash__()`` may now also return a long\n integer object; the 32-bit integer is then derived from the hash of\n that object.\n\n Changed in version 2.6: ``__hash__`` may now be set to ``None`` to\n explicitly flag instances of a class as unhashable.\n\nobject.__nonzero__(self)\n\n Called to implement truth value testing and the built-in operation\n ``bool()``; should return ``False`` or ``True``, or their integer\n equivalents ``0`` or ``1``. When this method is not defined,\n ``__len__()`` is called, if it is defined, and the object is\n considered true if its result is nonzero. If a class defines\n neither ``__len__()`` nor ``__nonzero__()``, all its instances are\n considered true.\n\nobject.__unicode__(self)\n\n Called to implement ``unicode()`` built-in; should return a Unicode\n object. When this method is not defined, string conversion is\n attempted, and the result of string conversion is converted to\n Unicode using the system default encoding.\n', - 'debugger': u'\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 > (0)?()\n (Pdb) continue\n > (1)?()\n (Pdb) continue\n NameError: \'spam\'\n > (1)?()\n (Pdb)\n\n``pdb.py`` can also be invoked as a script to debug other scripts.\nFor example:\n\n python -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 2.4: Restarting post-mortem behavior added.\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 ``c`` 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 "", 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[, locals]])\n\n Execute the *statement* (given as a string) under debugger control.\n The debugger prompt appears before any code is executed; you can\n set breakpoints and type ``continue``, or you can step through the\n statement using ``step`` or ``next`` (all these commands are\n explained below). The optional *globals* and *locals* arguments\n specify the environment in which the code is executed; by default\n the dictionary of the module ``__main__`` is used. (See the\n explanation of the ``exec`` statement or the ``eval()`` built-in\n function.)\n\npdb.runeval(expression[, globals[, locals]])\n\n Evaluate the *expression* (given as a string) under debugger\n control. When ``runeval()`` returns, it returns the value of the\n expression. Otherwise this function is similar to ``run()``.\n\npdb.runcall(function[, argument, ...])\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])\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)\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 Example call to enable tracing with *skip*:\n\n import pdb; pdb.Pdb(skip=[\'django.*\']).set_trace()\n\n New in version 2.7: The *skip* argument.\n\n run(statement[, globals[, locals]])\n runeval(expression[, globals[, locals]])\n runcall(function[, argument, ...])\n set_trace()\n\n See the documentation for the functions explained above.\n', - 'del': u'\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 that 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\nIt is illegal to delete a name from the local namespace if it occurs\nas a free variable in a nested block.\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', - 'dict': u'\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': u'\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\nIf ``exec`` is used in a function and the function contains or is a\nnested block with free variables, the compiler will raise a\n``SyntaxError`` unless the exec explicitly specifies the local\nnamespace for the ``exec``. (In other words, ``exec obj`` would be\nillegal, but ``exec obj in ns`` would be legal.)\n\nThe ``eval()``, ``execfile()``, and ``input()`` functions and the\n``exec`` statement do not have access to the full environment for\nresolving names. Names may be resolved in the local and global\nnamespaces of the caller. Free variables are not resolved in the\nnearest enclosing namespace, but in the global namespace. [1] The\n``exec`` statement and the ``eval()`` and ``execfile()`` functions\nhave optional arguments to override the global and local namespace.\nIf only one namespace is specified, it is used for both.\n', - 'else': u'\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', - 'exceptions': u'\nExceptions\n**********\n\nExceptions are a means of breaking out of the normal flow of control\nof a code block in order to handle errors or other exceptional\nconditions. An exception is *raised* at the point where the error is\ndetected; it may be *handled* by the surrounding code block or by any\ncode block that directly or indirectly invoked the code block where\nthe error occurred.\n\nThe Python interpreter raises an exception when it detects a run-time\nerror (such as division by zero). A Python program can also\nexplicitly raise an exception with the ``raise`` statement. Exception\nhandlers are specified with the ``try`` ... ``except`` statement. The\n``finally`` clause of such a statement can be used to specify cleanup\ncode which does not handle the exception, but is executed whether an\nexception occurred or not in the preceding code.\n\nPython uses the "termination" model of error handling: an exception\nhandler can find out what happened and continue execution at an outer\nlevel, but it cannot repair the cause of the error and retry the\nfailing operation (except by re-entering the offending piece of code\nfrom the top).\n\nWhen an exception is not handled at all, the interpreter terminates\nexecution of the program, or returns to its interactive main loop. In\neither case, it prints a stack backtrace, except when the exception is\n``SystemExit``.\n\nExceptions are identified by class instances. The ``except`` clause\nis selected depending on the class of the instance: it must reference\nthe class of the instance or a base class thereof. The instance can\nbe received by the handler and can carry additional information about\nthe exceptional condition.\n\nExceptions can also be identified by strings, in which case the\n``except`` clause is selected by object identity. An arbitrary value\ncan be raised along with the identifying string which can be passed to\nthe handler.\n\nNote: Messages to exceptions are not part of the Python API. Their\n contents may change from one version of Python to the next without\n warning and should not be relied on by code which will run under\n multiple versions of the interpreter.\n\nSee also the description of the ``try`` statement in section *The try\nstatement* and ``raise`` statement in section *The raise statement*.\n\n-[ Footnotes ]-\n\n[1] This limitation occurs because the code that is executed by these\n operations is not available at the time the module is compiled.\n', - 'exec': u'\nThe ``exec`` statement\n**********************\n\n exec_stmt ::= "exec" or_expr ["in" expression ["," expression]]\n\nThis statement supports dynamic execution of Python code. The first\nexpression should evaluate to either a string, an open file object, or\na code object. If it is a string, the string is parsed as a suite of\nPython statements which is then executed (unless a syntax error\noccurs). [1] If it is an open file, the file is parsed until EOF and\nexecuted. If it is a code object, it is simply executed. In all\ncases, the code that\'s executed is expected to be valid as file input\n(see section *File input*). Be aware that the ``return`` and\n``yield`` statements may not be used outside of function definitions\neven within the context of code passed to the ``exec`` statement.\n\nIn all cases, if the optional parts are omitted, the code is executed\nin the current scope. If only the first expression after ``in`` is\nspecified, it should be a dictionary, which will be used for both the\nglobal and the local variables. If two expressions are given, they\nare used for the global and local variables, respectively. If\nprovided, *locals* can be any mapping object.\n\nChanged in version 2.4: Formerly, *locals* was required to be a\ndictionary.\n\nAs a side effect, an implementation may insert additional keys into\nthe dictionaries given besides those corresponding to variable names\nset by the executed code. For example, the current implementation may\nadd a reference to the dictionary of the built-in module\n``__builtin__`` under the key ``__builtins__`` (!).\n\n**Programmer\'s hints:** dynamic evaluation of expressions is supported\nby the built-in function ``eval()``. The built-in functions\n``globals()`` and ``locals()`` return the current global and local\ndictionary, respectively, which may be useful to pass around for use\nby ``exec``.\n\n-[ Footnotes ]-\n\n[1] Note that the parser only accepts the Unix-style end of line\n convention. If you are reading the code from a file, make sure to\n use universal newline mode to convert Windows or Mac-style\n newlines.\n', - 'execmodel': u'\nExecution model\n***************\n\n\nNaming and binding\n==================\n\n*Names* refer to objects. Names are introduced by name binding\noperations. Each occurrence of a name in the program text refers to\nthe *binding* of that name established in the innermost function block\ncontaining the use.\n\nA *block* is a piece of Python program text that is executed as a\nunit. The following are blocks: a module, a function body, and a class\ndefinition. Each command typed interactively is a block. A script\nfile (a file given as standard input to the interpreter or specified\non the interpreter command line the first argument) is a code block.\nA script command (a command specified on the interpreter command line\nwith the \'**-c**\' option) is a code block. The file read by the\nbuilt-in function ``execfile()`` is a code block. The string argument\npassed to the built-in function ``eval()`` and to the ``exec``\nstatement is a code block. The expression read and evaluated by the\nbuilt-in function ``input()`` is a code block.\n\nA code block is executed in an *execution frame*. A frame contains\nsome administrative information (used for debugging) and determines\nwhere and how execution continues after the code block\'s execution has\ncompleted.\n\nA *scope* defines the visibility of a name within a block. If a local\nvariable is defined in a block, its scope includes that block. If the\ndefinition occurs in a function block, the scope extends to any blocks\ncontained within the defining one, unless a contained block introduces\na different binding for the name. The scope of names defined in a\nclass block is limited to the class block; it does not extend to the\ncode blocks of methods -- this includes generator expressions since\nthey are implemented using a function scope. This means that the\nfollowing will fail:\n\n class A:\n a = 42\n b = list(a + i for i in range(10))\n\nWhen a name is used in a code block, it is resolved using the nearest\nenclosing scope. The set of all such scopes visible to a code block\nis called the block\'s *environment*.\n\nIf a name is bound in a block, it is a local variable of that block.\nIf a name is bound at the module level, it is a global variable. (The\nvariables of the module code block are local and global.) If a\nvariable is used in a code block but not defined there, it is a *free\nvariable*.\n\nWhen a name is not found at all, a ``NameError`` exception is raised.\nIf the name refers to a local variable that has not been bound, a\n``UnboundLocalError`` exception is raised. ``UnboundLocalError`` is a\nsubclass of ``NameError``.\n\nThe following constructs bind names: formal parameters to functions,\n``import`` statements, class and function definitions (these bind the\nclass or function name in the defining block), and targets that are\nidentifiers if occurring in an assignment, ``for`` loop header, in the\nsecond position of an ``except`` clause header or after ``as`` in a\n``with`` statement. The ``import`` statement of the form ``from ...\nimport *`` binds all names defined in the imported module, except\nthose beginning with an underscore. This form may only be used at the\nmodule level.\n\nA target occurring in a ``del`` statement is also considered bound for\nthis purpose (though the actual semantics are to unbind the name). It\nis illegal to unbind a name that is referenced by an enclosing scope;\nthe compiler will report a ``SyntaxError``.\n\nEach assignment or import statement occurs within a block defined by a\nclass or function definition or at the module level (the top-level\ncode block).\n\nIf a name binding operation occurs anywhere within a code block, all\nuses of the name within the block are treated as references to the\ncurrent block. This can lead to errors when a name is used within a\nblock before it is bound. This rule is subtle. Python lacks\ndeclarations and allows name binding operations to occur anywhere\nwithin a code block. The local variables of a code block can be\ndetermined by scanning the entire text of the block for name binding\noperations.\n\nIf the global statement occurs within a block, all uses of the name\nspecified in the statement refer to the binding of that name in the\ntop-level namespace. Names are resolved in the top-level namespace by\nsearching the global namespace, i.e. the namespace of the module\ncontaining the code block, and the builtins namespace, the namespace\nof the module ``__builtin__``. The global namespace is searched\nfirst. If the name is not found there, the builtins namespace is\nsearched. The global statement must precede all uses of the name.\n\nThe builtins namespace associated with the execution of a code block\nis actually found by looking up the name ``__builtins__`` in its\nglobal namespace; this should be a dictionary or a module (in the\nlatter case the module\'s dictionary is used). By default, when in the\n``__main__`` module, ``__builtins__`` is the built-in module\n``__builtin__`` (note: no \'s\'); when in any other module,\n``__builtins__`` is an alias for the dictionary of the ``__builtin__``\nmodule itself. ``__builtins__`` can be set to a user-created\ndictionary to create a weak form of restricted execution.\n\n**CPython implementation detail:** Users should not touch\n``__builtins__``; it is strictly an implementation detail. Users\nwanting to override values in the builtins namespace should ``import``\nthe ``__builtin__`` (no \'s\') module and modify its attributes\nappropriately.\n\nThe namespace for a module is automatically created the first time a\nmodule is imported. The main module for a script is always called\n``__main__``.\n\nThe ``global`` statement has the same scope as a name binding\noperation in the same block. If the nearest enclosing scope for a\nfree variable contains a global statement, the free variable is\ntreated as a global.\n\nA class definition is an executable statement that may use and define\nnames. These references follow the normal rules for name resolution.\nThe namespace of the class definition becomes the attribute dictionary\nof the class. Names defined at the class scope are not visible in\nmethods.\n\n\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\nIf ``exec`` is used in a function and the function contains or is a\nnested block with free variables, the compiler will raise a\n``SyntaxError`` unless the exec explicitly specifies the local\nnamespace for the ``exec``. (In other words, ``exec obj`` would be\nillegal, but ``exec obj in ns`` would be legal.)\n\nThe ``eval()``, ``execfile()``, and ``input()`` functions and the\n``exec`` statement do not have access to the full environment for\nresolving names. Names may be resolved in the local and global\nnamespaces of the caller. Free variables are not resolved in the\nnearest enclosing namespace, but in the global namespace. [1] The\n``exec`` statement and the ``eval()`` and ``execfile()`` functions\nhave optional arguments to override the global and local namespace.\nIf only one namespace is specified, it is used for both.\n\n\nExceptions\n==========\n\nExceptions are a means of breaking out of the normal flow of control\nof a code block in order to handle errors or other exceptional\nconditions. An exception is *raised* at the point where the error is\ndetected; it may be *handled* by the surrounding code block or by any\ncode block that directly or indirectly invoked the code block where\nthe error occurred.\n\nThe Python interpreter raises an exception when it detects a run-time\nerror (such as division by zero). A Python program can also\nexplicitly raise an exception with the ``raise`` statement. Exception\nhandlers are specified with the ``try`` ... ``except`` statement. The\n``finally`` clause of such a statement can be used to specify cleanup\ncode which does not handle the exception, but is executed whether an\nexception occurred or not in the preceding code.\n\nPython uses the "termination" model of error handling: an exception\nhandler can find out what happened and continue execution at an outer\nlevel, but it cannot repair the cause of the error and retry the\nfailing operation (except by re-entering the offending piece of code\nfrom the top).\n\nWhen an exception is not handled at all, the interpreter terminates\nexecution of the program, or returns to its interactive main loop. In\neither case, it prints a stack backtrace, except when the exception is\n``SystemExit``.\n\nExceptions are identified by class instances. The ``except`` clause\nis selected depending on the class of the instance: it must reference\nthe class of the instance or a base class thereof. The instance can\nbe received by the handler and can carry additional information about\nthe exceptional condition.\n\nExceptions can also be identified by strings, in which case the\n``except`` clause is selected by object identity. An arbitrary value\ncan be raised along with the identifying string which can be passed to\nthe handler.\n\nNote: Messages to exceptions are not part of the Python API. Their\n contents may change from one version of Python to the next without\n warning and should not be relied on by code which will run under\n multiple versions of the interpreter.\n\nSee also the description of the ``try`` statement in section *The try\nstatement* and ``raise`` statement in section *The raise statement*.\n\n-[ Footnotes ]-\n\n[1] This limitation occurs because the code that is executed by these\n operations is not available at the time the module is compiled.\n', - 'exprlists': u'\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': u'\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 of floating point numbers can\nlook like octal integers, but are interpreted using radix 10. For\nexample, ``077e010`` is legal, and denotes the same number as\n``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': u'\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, and then the suite is executed. When the items are\nexhausted (which is immediately when the sequence is empty), the suite\nin the ``else`` clause, if present, is executed, and the loop\nterminates.\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\nThe target list is not deleted when the loop is finished, but if the\nsequence is empty, it will not have been assigned to at all by the\nloop. Hint: the built-in function ``range()`` returns a sequence of\nintegers suitable to emulate the effect of Pascal\'s ``for i := a to b\ndo``; e.g., ``range(3)`` returns the list ``[0, 1, 2]``.\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 internal\n counter is used to keep track of which item is used next, and this\n is incremented on each iteration. When this counter has reached the\n length of the sequence the loop terminates. This means that if the\n suite deletes the current (or a previous) item from the sequence,\n the next item will be skipped (since it gets the index of the\n 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': u'\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 ::= +\n conversion ::= "r" | "s"\n format_spec ::= \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\neither a number or a keyword. If it\'s a number, it refers to a\npositional argument, and if it\'s a keyword, it refers to a named\nkeyword argument. If the numerical arg_names in a format string are\n0, 1, 2, ... in sequence, they can all be omitted (not just some) and\nthe numbers 0, 1, 2, ... will be automatically inserted in that order.\nThe *arg_name* can be followed by any number of index or attribute\nexpressions. An expression of the form ``\'.name\'`` selects the named\nattribute using ``getattr()``, while an expression of the form\n``\'[index]\'`` does an index lookup using ``__getitem__()``.\n\nChanged in version 2.7: 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\nTwo conversion flags are currently supported: ``\'!s\'`` which calls\n``str()`` on the value, and ``\'!r\'`` which calls ``repr()``.\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\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 ::= \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 is only valid for integers, and only for binary,\noctal, or hexadecimal output. If present, it specifies that the\noutput will be prefixed by ``\'0b\'``, ``\'0o\'``, or ``\'0x\'``,\nrespectively.\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 2.7: 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\'``. |\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 | The same as ``\'g\'``. |\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\') # 2.7+ 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(object):\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.5\n >>> total = 22\n >>> \'Correct answers: {:.2%}.\'.format(points/total)\n \'Correct answers: 88.64%\'\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),\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': u'\nFunction definitions\n********************\n\nA function definition defines a user-defined function object (see\nsection *The standard type hierarchy*):\n\n decorated ::= decorators (classdef | funcdef)\n decorators ::= decorator+\n decorator ::= "@" dotted_name ["(" [argument_list [","]] ")"] NEWLINE\n funcdef ::= "def" funcname "(" [parameter_list] ")" ":" suite\n dotted_name ::= identifier ("." identifier)*\n parameter_list ::= (defparameter ",")*\n ( "*" identifier [, "**" identifier]\n | "**" identifier\n | defparameter [","] )\n defparameter ::= parameter ["=" expression]\n sublist ::= parameter ("," parameter)* [","]\n parameter ::= identifier | "(" sublist ")"\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 top-level 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 must also have a default value --- this is a syntactic\nrestriction 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 that 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.\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.\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', - 'global': u'\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 an\n``exec`` statement does not affect the code block *containing* the\n``exec`` statement, and code contained in an ``exec`` statement is\nunaffected by ``global`` statements in the code containing the\n``exec`` statement. The same applies to the ``eval()``,\n``execfile()`` and ``compile()`` functions.\n', - 'id-classes': u'\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 ``__builtin__`` module.\n When not in interactive mode, ``_`` has no special meaning and is\n not 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': u'\nIdentifiers and keywords\n************************\n\nIdentifiers (also referred to as *names*) are described by the\nfollowing lexical definitions:\n\n identifier ::= (letter|"_") (letter | digit | "_")*\n letter ::= lowercase | uppercase\n lowercase ::= "a"..."z"\n uppercase ::= "A"..."Z"\n digit ::= "0"..."9"\n\nIdentifiers are unlimited in length. Case is significant.\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 and del from not while\n as elif global or with\n assert else if pass yield\n break except import print\n class exec in raise\n continue finally is return\n def for lambda try\n\nChanged in version 2.4: ``None`` became a constant and is now\nrecognized by the compiler as a name for the built-in object ``None``.\nAlthough it is not a keyword, you cannot assign a different object to\nit.\n\nChanged in version 2.5: Both ``as`` and ``with`` are only recognized\nwhen the ``with_statement`` future feature has been enabled. It will\nalways be enabled in Python 2.6. See section *The with statement* for\ndetails. Note that using ``as`` and ``with`` as identifiers will\nalways issue a warning, even when the ``with_statement`` future\ndirective is not in effect.\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 ``__builtin__`` module.\n When not in interactive mode, ``_`` has no special meaning and is\n not 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': u'\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': u'\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': u'\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.\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.\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. If the\nwild card form of import --- ``import *`` --- is used in a function\nand the function contains or is a nested block with free variables,\nthe compiler will 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 2.6 are ``unicode_literals``,\n``print_function``, ``absolute_import``, ``division``, ``generators``,\n``nested_scopes`` and ``with_statement``. ``generators``,\n``with_statement``, ``nested_scopes`` are redundant in Python version\n2.6 and above because they are always enabled.\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 an ``exec`` statement or calls to the built-in\nfunctions ``compile()`` and ``execfile()`` that occur in a module\n``M`` containing a future statement will, by default, use the new\nsyntax or semantics associated with the future statement. This can,\nstarting with Python 2.2 be controlled by optional arguments to\n``compile()`` --- see the documentation of that function for 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': u'\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 forms ``<>`` and ``!=`` are equivalent; for consistency with C,\n``!=`` is preferred; where ``!=`` is mentioned below ``<>`` is also\naccepted. The ``<>`` spelling is considered obsolescent.\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,\nobjects of different types *always* compare unequal, and are ordered\nconsistently but arbitrarily. You can control comparison behavior of\nobjects of non-built-in types by defining a ``__cmp__`` method or rich\ncomparison methods like ``__gt__``, described in section *Special\nmethod names*.\n\n(This unusual definition of comparison was used to simplify the\ndefinition of operations like sorting and the ``in`` and ``not in``\noperators. In the future, the comparison rules for objects of\ndifferent types are likely to change.)\n\nComparison of objects of the same type depends on the type:\n\n* Numbers are compared arithmetically.\n\n* Strings are compared lexicographically using the numeric equivalents\n (the result of the built-in function ``ord()``) of their characters.\n Unicode and 8-bit strings are fully interoperable in this behavior.\n [4]\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, ``cmp([1,2,x], [1,2,y])`` returns\n the same as ``cmp(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 their sorted\n (key, value) lists compare equal. [5] Outcomes other than equality\n are resolved consistently, but are not otherwise defined. [6]\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\nThe operators ``in`` and ``not in`` test for collection membership.\n``x in s`` evaluates to true if *x* is a member of the collection *s*,\nand false otherwise. ``x not in s`` returns the negation of ``x in\ns``. The collection membership test has traditionally been bound to\nsequences; an object is a member of a collection if the collection is\na sequence and contains an element equal to that object. However, it\nmake sense for many other object types to support membership tests\nwithout being a sequence. In particular, dictionaries (for keys) and\nsets support membership testing.\n\nFor the list and tuple types, ``x in y`` is true if and only if there\nexists an index *i* such that ``x == y[i]`` is true.\n\nFor the Unicode and string types, ``x in y`` is true if and only if\n*x* is a substring of *y*. An equivalent test is ``y.find(x) != -1``.\nNote, *x* and *y* need not be the same type; consequently, ``u\'ab\' in\n\'abc\'`` will return ``True``. Empty strings are always considered to\nbe a substring of any other string, so ``"" in "abc"`` will return\n``True``.\n\nChanged in version 2.3: Previously, *x* was required to be a string of\nlength ``1``.\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. [7]\n', - 'integers': u'\nInteger and long integer literals\n*********************************\n\nInteger and long integer literals are described by the following\nlexical definitions:\n\n longinteger ::= integer ("l" | "L")\n integer ::= decimalinteger | octinteger | hexinteger | bininteger\n decimalinteger ::= nonzerodigit digit* | "0"\n octinteger ::= "0" ("o" | "O") octdigit+ | "0" octdigit+\n hexinteger ::= "0" ("x" | "X") hexdigit+\n bininteger ::= "0" ("b" | "B") bindigit+\n nonzerodigit ::= "1"..."9"\n octdigit ::= "0"..."7"\n bindigit ::= "0" | "1"\n hexdigit ::= digit | "a"..."f" | "A"..."F"\n\nAlthough both lower case ``\'l\'`` and upper case ``\'L\'`` are allowed as\nsuffix for long integers, it is strongly recommended to always use\n``\'L\'``, since the letter ``\'l\'`` looks too much like the digit\n``\'1\'``.\n\nPlain integer literals that are above the largest representable plain\ninteger (e.g., 2147483647 when using 32-bit arithmetic) are accepted\nas if they were long integers instead. [1] There is no limit for long\ninteger literals apart from what can be stored in available memory.\n\nSome examples of plain integer literals (first row) and long integer\nliterals (second and third rows):\n\n 7 2147483647 0177\n 3L 79228162514264337593543950336L 0377L 0x100000000L\n 79228162514264337593543950336 0xdeadbeef\n', - 'lambda': u'\nLambdas\n*******\n\n lambda_form ::= "lambda" [parameter_list]: expression\n old_lambda_form ::= "lambda" [parameter_list]: old_expression\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 name(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.\n', - 'lists': u'\nList displays\n*************\n\nA list display is a possibly empty series of expressions enclosed in\nsquare brackets:\n\n list_display ::= "[" [expression_list | list_comprehension] "]"\n list_comprehension ::= expression list_for\n list_for ::= "for" target_list "in" old_expression_list [list_iter]\n old_expression_list ::= old_expression [("," old_expression)+ [","]]\n old_expression ::= or_test | old_lambda_form\n list_iter ::= list_for | list_if\n list_if ::= "if" old_expression [list_iter]\n\nA list display yields a new list object. Its contents are specified\nby providing either a list of expressions or a list comprehension.\nWhen a comma-separated list of expressions is supplied, its elements\nare evaluated from left to right and placed into the list object in\nthat order. When a list comprehension is supplied, it consists of a\nsingle expression followed by at least one ``for`` clause and zero or\nmore ``for`` or ``if`` clauses. In this case, the elements of the new\nlist are those that would be produced by considering each of the\n``for`` or ``if`` clauses a block, nesting from left to right, and\nevaluating the expression to produce a list element each time the\ninnermost block is reached [1].\n', - 'naming': u"\nNaming and binding\n******************\n\n*Names* refer to objects. Names are introduced by name binding\noperations. Each occurrence of a name in the program text refers to\nthe *binding* of that name established in the innermost function block\ncontaining the use.\n\nA *block* is a piece of Python program text that is executed as a\nunit. The following are blocks: a module, a function body, and a class\ndefinition. Each command typed interactively is a block. A script\nfile (a file given as standard input to the interpreter or specified\non the interpreter command line the first argument) is a code block.\nA script command (a command specified on the interpreter command line\nwith the '**-c**' option) is a code block. The file read by the\nbuilt-in function ``execfile()`` is a code block. The string argument\npassed to the built-in function ``eval()`` and to the ``exec``\nstatement is a code block. The expression read and evaluated by the\nbuilt-in function ``input()`` is a code block.\n\nA code block is executed in an *execution frame*. A frame contains\nsome administrative information (used for debugging) and determines\nwhere and how execution continues after the code block's execution has\ncompleted.\n\nA *scope* defines the visibility of a name within a block. If a local\nvariable is defined in a block, its scope includes that block. If the\ndefinition occurs in a function block, the scope extends to any blocks\ncontained within the defining one, unless a contained block introduces\na different binding for the name. The scope of names defined in a\nclass block is limited to the class block; it does not extend to the\ncode blocks of methods -- this includes generator expressions since\nthey are implemented using a function scope. This means that the\nfollowing will fail:\n\n class A:\n a = 42\n b = list(a + i for i in range(10))\n\nWhen a name is used in a code block, it is resolved using the nearest\nenclosing scope. The set of all such scopes visible to a code block\nis called the block's *environment*.\n\nIf a name is bound in a block, it is a local variable of that block.\nIf a name is bound at the module level, it is a global variable. (The\nvariables of the module code block are local and global.) If a\nvariable is used in a code block but not defined there, it is a *free\nvariable*.\n\nWhen a name is not found at all, a ``NameError`` exception is raised.\nIf the name refers to a local variable that has not been bound, a\n``UnboundLocalError`` exception is raised. ``UnboundLocalError`` is a\nsubclass of ``NameError``.\n\nThe following constructs bind names: formal parameters to functions,\n``import`` statements, class and function definitions (these bind the\nclass or function name in the defining block), and targets that are\nidentifiers if occurring in an assignment, ``for`` loop header, in the\nsecond position of an ``except`` clause header or after ``as`` in a\n``with`` statement. The ``import`` statement of the form ``from ...\nimport *`` binds all names defined in the imported module, except\nthose beginning with an underscore. This form may only be used at the\nmodule level.\n\nA target occurring in a ``del`` statement is also considered bound for\nthis purpose (though the actual semantics are to unbind the name). It\nis illegal to unbind a name that is referenced by an enclosing scope;\nthe compiler will report a ``SyntaxError``.\n\nEach assignment or import statement occurs within a block defined by a\nclass or function definition or at the module level (the top-level\ncode block).\n\nIf a name binding operation occurs anywhere within a code block, all\nuses of the name within the block are treated as references to the\ncurrent block. This can lead to errors when a name is used within a\nblock before it is bound. This rule is subtle. Python lacks\ndeclarations and allows name binding operations to occur anywhere\nwithin a code block. The local variables of a code block can be\ndetermined by scanning the entire text of the block for name binding\noperations.\n\nIf the global statement occurs within a block, all uses of the name\nspecified in the statement refer to the binding of that name in the\ntop-level namespace. Names are resolved in the top-level namespace by\nsearching the global namespace, i.e. the namespace of the module\ncontaining the code block, and the builtins namespace, the namespace\nof the module ``__builtin__``. The global namespace is searched\nfirst. If the name is not found there, the builtins namespace is\nsearched. The global statement must precede all uses of the name.\n\nThe builtins namespace associated with the execution of a code block\nis actually found by looking up the name ``__builtins__`` in its\nglobal namespace; this should be a dictionary or a module (in the\nlatter case the module's dictionary is used). By default, when in the\n``__main__`` module, ``__builtins__`` is the built-in module\n``__builtin__`` (note: no 's'); when in any other module,\n``__builtins__`` is an alias for the dictionary of the ``__builtin__``\nmodule itself. ``__builtins__`` can be set to a user-created\ndictionary to create a weak form of restricted execution.\n\n**CPython implementation detail:** Users should not touch\n``__builtins__``; it is strictly an implementation detail. Users\nwanting to override values in the builtins namespace should ``import``\nthe ``__builtin__`` (no 's') module and modify its attributes\nappropriately.\n\nThe namespace for a module is automatically created the first time a\nmodule is imported. The main module for a script is always called\n``__main__``.\n\nThe ``global`` statement has the same scope as a name binding\noperation in the same block. If the nearest enclosing scope for a\nfree variable contains a global statement, the free variable is\ntreated as a global.\n\nA class definition is an executable statement that may use and define\nnames. These references follow the normal rules for name resolution.\nThe namespace of the class definition becomes the attribute dictionary\nof the class. Names defined at the class scope are not visible in\nmethods.\n\n\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\nIf ``exec`` is used in a function and the function contains or is a\nnested block with free variables, the compiler will raise a\n``SyntaxError`` unless the exec explicitly specifies the local\nnamespace for the ``exec``. (In other words, ``exec obj`` would be\nillegal, but ``exec obj in ns`` would be legal.)\n\nThe ``eval()``, ``execfile()``, and ``input()`` functions and the\n``exec`` statement do not have access to the full environment for\nresolving names. Names may be resolved in the local and global\nnamespaces of the caller. Free variables are not resolved in the\nnearest enclosing namespace, but in the global namespace. [1] The\n``exec`` statement and the ``eval()`` and ``execfile()`` functions\nhave optional arguments to override the global and local namespace.\nIf only one namespace is specified, it is used for both.\n", - 'numbers': u"\nNumeric literals\n****************\n\nThere are four types of numeric literals: plain integers, long\nintegers, floating point numbers, and imaginary numbers. There are no\ncomplex literals (complex numbers can be formed by adding a real\nnumber and an imaginary 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': u'\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.__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 (``+``, ``-``, ``*``, ``//``, ``%``, ``divmod()``,\n ``pow()``, ``**``, ``<<``, ``>>``, ``&``, ``^``, ``|``). For\n instance, to evaluate the expression ``x + y``, where *x* is an\n 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__()`` (described below). Note\n that ``__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.__div__(self, other)\nobject.__truediv__(self, other)\n\n The division operator (``/``) is implemented by these methods. The\n ``__truediv__()`` method is used when ``__future__.division`` is in\n effect, otherwise ``__div__()`` is used. If only one of these two\n methods is defined, the object will not support division in the\n alternate context; ``TypeError`` will be raised instead.\n\nobject.__radd__(self, other)\nobject.__rsub__(self, other)\nobject.__rmul__(self, other)\nobject.__rdiv__(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 (``+``, ``-``, ``*``, ``/``, ``%``, ``divmod()``,\n ``pow()``, ``**``, ``<<``, ``>>``, ``&``, ``^``, ``|``) with\n reflected (swapped) operands. These functions are only called if\n the left operand does not support the corresponding operation and\n the operands are of different types. [2] For instance, to evaluate\n the expression ``x - y``, where *y* is an instance of a class that\n has an ``__rsub__()`` method, ``y.__rsub__(x)`` is called if\n ``x.__sub__(y)`` returns *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.__idiv__(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.__long__(self)\nobject.__float__(self)\n\n Called to implement the built-in functions ``complex()``,\n ``int()``, ``long()``, and ``float()``. Should return a value of\n the appropriate type.\n\nobject.__oct__(self)\nobject.__hex__(self)\n\n Called to implement the built-in functions ``oct()`` and ``hex()``.\n Should return a string value.\n\nobject.__index__(self)\n\n Called to implement ``operator.index()``. Also called whenever\n Python needs an integer object (such as in slicing). Must return\n an integer (int or long).\n\n New in version 2.5.\n\nobject.__coerce__(self, other)\n\n Called to implement "mixed-mode" numeric arithmetic. Should either\n return a 2-tuple containing *self* and *other* converted to a\n common numeric type, or ``None`` if conversion is impossible. When\n the common type would be the type of ``other``, it is sufficient to\n return ``None``, since the interpreter will also ask the other\n object to attempt a coercion (but sometimes, if the implementation\n of the other type cannot be changed, it is useful to do the\n conversion to the other type here). A return value of\n ``NotImplemented`` is equivalent to returning ``None``.\n', - 'objects': u'\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 provides a convenient way to do\nthis.\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': u'\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+-------------------------------------------------+---------------------------------------+\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| | [8] |\n+-------------------------------------------------+---------------------------------------+\n| ``+x``, ``-x``, ``~x`` | Positive, negative, bitwise NOT |\n+-------------------------------------------------+---------------------------------------+\n| ``**`` | Exponentiation [9] |\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, string |\n| | conversion |\n+-------------------------------------------------+---------------------------------------+\n\n-[ Footnotes ]-\n\n[1] In Python 2.3 and later releases, a list comprehension "leaks" the\n control variables of each ``for`` it contains into the containing\n scope. However, this behavior is deprecated, and relying on it\n will not work in Python 3.0\n\n[2] 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[3] If x is very close to an exact integer multiple of y, it\'s\n possible for ``floor(x/y)`` to be one larger than ``(x-x%y)/y``\n due to rounding. In such cases, Python returns the latter result,\n in order to preserve that ``divmod(x,y)[0] * y + x % y`` be very\n close to ``x``.\n\n[4] While comparisons between unicode strings make sense at the byte\n level, they may be counter-intuitive to users. For example, the\n strings ``u"\\u00C7"`` and ``u"\\u0043\\u0327"`` compare differently,\n even 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[5] The implementation computes this efficiently, without constructing\n lists or sorting.\n\n[6] Earlier versions of Python used lexicographic comparison of the\n sorted (key, value) lists, but this was very expensive for the\n common case of comparing for equality. An even earlier version of\n Python compared dictionaries by identity only, but this caused\n surprises because people expected to be able to test a dictionary\n for emptiness by comparing it to ``{}``.\n\n[7] 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[8] The ``%`` operator is also used for string formatting; the same\n precedence applies.\n\n[9] 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': u'\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': u'\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. The result type is that of the\narguments after coercion.\n\nWith mixed operand types, the coercion rules for binary arithmetic\noperators apply. For int and long int operands, the result has the\nsame type as the operands (after coercion) unless the second argument\nis negative; in that case, all arguments are converted to float and a\nfloat result is delivered. For example, ``10**2`` returns ``100``, but\n``10**-2`` returns ``0.01``. (This last feature was added in Python\n2.2. In Python 2.1 and before, if both arguments were of integer types\nand the second argument was negative, an exception was raised).\n\nRaising ``0.0`` to a negative power results in a\n``ZeroDivisionError``. Raising a negative number to a fractional power\nresults in a ``ValueError``.\n', - 'print': u'\nThe ``print`` statement\n***********************\n\n print_stmt ::= "print" ([expression ("," expression)* [","]]\n | ">>" expression [("," expression)+ [","]])\n\n``print`` evaluates each expression in turn and writes the resulting\nobject to standard output (see below). If an object is not a string,\nit is first converted to a string using the rules for string\nconversions. The (resulting or original) string is then written. A\nspace is written before each object is (converted and) written, unless\nthe output system believes it is positioned at the beginning of a\nline. This is the case (1) when no characters have yet been written\nto standard output, (2) when the last character written to standard\noutput is a whitespace character except ``\' \'``, or (3) when the last\nwrite operation on standard output was not a ``print`` statement. (In\nsome cases it may be functional to write an empty string to standard\noutput for this reason.)\n\nNote: Objects which act like file objects but which are not the built-in\n file objects often do not properly emulate this aspect of the file\n object\'s behavior, so it is best not to rely on this.\n\nA ``\'\\n\'`` character is written at the end, unless the ``print``\nstatement ends with a comma. This is the only action if the statement\ncontains just the keyword ``print``.\n\nStandard output is defined as the file object named ``stdout`` in the\nbuilt-in module ``sys``. If no such object exists, or if it does not\nhave a ``write()`` method, a ``RuntimeError`` exception is raised.\n\n``print`` also has an extended form, defined by the second portion of\nthe syntax described above. This form is sometimes referred to as\n"``print`` chevron." In this form, the first expression after the\n``>>`` must evaluate to a "file-like" object, specifically an object\nthat has a ``write()`` method as described above. With this extended\nform, the subsequent expressions are printed to this file object. If\nthe first expression evaluates to ``None``, then ``sys.stdout`` is\nused as the file for output.\n', - 'raise': u'\nThe ``raise`` statement\n***********************\n\n raise_stmt ::= "raise" [expression ["," expression ["," 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 ``TypeError`` exception is raised indicating that\nthis is an error (if running under IDLE, a ``Queue.Empty`` exception\nis raised instead).\n\nOtherwise, ``raise`` evaluates the expressions to get three objects,\nusing ``None`` as the value of omitted expressions. The first two\nobjects are used to determine the *type* and *value* of the exception.\n\nIf the first object is an instance, the type of the exception is the\nclass of the instance, the instance itself is the value, and the\nsecond object must be ``None``.\n\nIf the first object is a class, it becomes the type of the exception.\nThe second object is used to determine the exception value: If it is\nan instance of the class, the instance becomes the exception value. If\nthe second object is a tuple, it is used as the argument list for the\nclass constructor; if it is ``None``, an empty argument list is used,\nand any other object is treated as a single argument to the\nconstructor. The instance so created by calling the constructor is\nused as the exception value.\n\nIf a third object is present and not ``None``, it must be a traceback\nobject (see section *The standard type hierarchy*), and it is\nsubstituted instead of the current location as the place where the\nexception occurred. If the third object is present and not a\ntraceback object or ``None``, a ``TypeError`` exception is raised.\nThe three-expression form of ``raise`` is useful to re-raise an\nexception transparently in an except clause, but ``raise`` with no\nexpressions should be preferred if the exception to be re-raised was\nthe most recently active exception in the current scope.\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': u'\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', - 'sequence-methods': u'\nAdditional methods for emulation of sequence types\n**************************************************\n\nThe following optional methods can be defined to further emulate\nsequence objects. Immutable sequences methods should at most only\ndefine ``__getslice__()``; mutable sequences might define all three\nmethods.\n\nobject.__getslice__(self, i, j)\n\n Deprecated since version 2.0: Support slice objects as parameters\n to the ``__getitem__()`` method. (However, built-in types in\n CPython currently still implement ``__getslice__()``. Therefore,\n you have to override it in derived classes when implementing\n slicing.)\n\n Called to implement evaluation of ``self[i:j]``. The returned\n object should be of the same type as *self*. Note that missing *i*\n or *j* in the slice expression are replaced by zero or\n ``sys.maxint``, respectively. If negative indexes are used in the\n slice, the length of the sequence is added to that index. If the\n instance does not implement the ``__len__()`` method, an\n ``AttributeError`` is raised. No guarantee is made that indexes\n adjusted this way are not still negative. Indexes which are\n greater than the length of the sequence are not modified. If no\n ``__getslice__()`` is found, a slice object is created instead, and\n passed to ``__getitem__()`` instead.\n\nobject.__setslice__(self, i, j, sequence)\n\n Called to implement assignment to ``self[i:j]``. Same notes for *i*\n and *j* as for ``__getslice__()``.\n\n This method is deprecated. If no ``__setslice__()`` is found, or\n for extended slicing of the form ``self[i:j:k]``, a slice object is\n created, and passed to ``__setitem__()``, instead of\n ``__setslice__()`` being called.\n\nobject.__delslice__(self, i, j)\n\n Called to implement deletion of ``self[i:j]``. Same notes for *i*\n and *j* as for ``__getslice__()``. This method is deprecated. If no\n ``__delslice__()`` is found, or for extended slicing of the form\n ``self[i:j:k]``, a slice object is created, and passed to\n ``__delitem__()``, instead of ``__delslice__()`` being called.\n\nNotice that these methods are only invoked when a single slice with a\nsingle colon is used, and the slice method is available. For slice\noperations involving extended slice notation, or in absence of the\nslice methods, ``__getitem__()``, ``__setitem__()`` or\n``__delitem__()`` is called with a slice object as argument.\n\nThe following example demonstrate how to make your program or module\ncompatible with earlier versions of Python (assuming that methods\n``__getitem__()``, ``__setitem__()`` and ``__delitem__()`` support\nslice objects as arguments):\n\n class MyClass:\n ...\n def __getitem__(self, index):\n ...\n def __setitem__(self, index, value):\n ...\n def __delitem__(self, index):\n ...\n\n if sys.version_info < (2, 0):\n # They won\'t be defined if version is at least 2.0 final\n\n def __getslice__(self, i, j):\n return self[max(0, i):max(0, j):]\n def __setslice__(self, i, j, seq):\n self[max(0, i):max(0, j):] = seq\n def __delslice__(self, i, j):\n del self[max(0, i):max(0, j):]\n ...\n\nNote the calls to ``max()``; these are necessary because of the\nhandling of negative indices before the ``__*slice__()`` methods are\ncalled. When negative indexes are used, the ``__*item__()`` methods\nreceive them as provided, but the ``__*slice__()`` methods get a\n"cooked" form of the index values. For each negative index value, the\nlength of the sequence is added to the index before calling the method\n(which may still result in a negative index); this is the customary\nhandling of negative indexes by the built-in sequence types, and the\n``__*item__()`` methods are expected to do this as well. However,\nsince they should already be doing that, negative indexes cannot be\npassed in; they must be constrained to the bounds of the sequence\nbefore being passed to the ``__*item__()`` methods. Calling ``max(0,\ni)`` conveniently returns the proper value.\n', - 'sequence-types': u"\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. (For backwards compatibility, the method\n``__getslice__()`` (see below) can also be defined to handle simple,\nbut not extended slices.) It is also recommended that mappings provide\nthe methods ``keys()``, ``values()``, ``items()``, ``has_key()``,\n``get()``, ``clear()``, ``setdefault()``, ``iterkeys()``,\n``itervalues()``, ``iteritems()``, ``pop()``, ``popitem()``,\n``copy()``, and ``update()`` behaving similar to those for Python's\nstandard dictionary objects. The ``UserDict`` module provides a\n``DictMixin`` class to help create those methods from a base set of\n``__getitem__()``, ``__setitem__()``, ``__delitem__()``, and\n``keys()``. Mutable sequences should provide methods ``append()``,\n``count()``, ``index()``, ``extend()``, ``insert()``, ``pop()``,\n``remove()``, ``reverse()`` and ``sort()``, like Python standard list\nobjects. Finally, sequence types should implement addition (meaning\nconcatenation) and multiplication (meaning repetition) by defining the\nmethods ``__add__()``, ``__radd__()``, ``__iadd__()``, ``__mul__()``,\n``__rmul__()`` and ``__imul__()`` described below; they should not\ndefine ``__coerce__()`` or other numerical operators. It is\nrecommended that both mappings and sequences implement the\n``__contains__()`` method to allow efficient use of the ``in``\noperator; for mappings, ``in`` should be equivalent of ``has_key()``;\nfor sequences, 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``iterkeys()``; 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 ``__nonzero__()`` method and whose\n ``__len__()`` method returns zero is considered to be false in a\n Boolean context.\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 ``iterkeys()``.\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\n New in version 2.6.\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': u'\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 plain or long integers as arguments. The\narguments are converted to a common type. 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,\nn)``. Negative shift counts raise a ``ValueError`` exception.\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': u'\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 ::= simple_slicing | extended_slicing\n simple_slicing ::= primary "[" short_slice "]"\n extended_slicing ::= primary "[" slice_list "]"\n slice_list ::= slice_item ("," slice_item)* [","]\n slice_item ::= expression | proper_slice | ellipsis\n proper_slice ::= short_slice | long_slice\n short_slice ::= [lower_bound] ":" [upper_bound]\n long_slice ::= short_slice ":" [stride]\n lower_bound ::= expression\n upper_bound ::= expression\n stride ::= expression\n ellipsis ::= "..."\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 nor ellipses). Similarly, when the slice\nlist has exactly one short slice and no trailing comma, the\ninterpretation as a simple slicing takes priority over that as an\nextended slicing.\n\nThe semantics for a simple slicing are as follows. The primary must\nevaluate to a sequence object. The lower and upper bound expressions,\nif present, must evaluate to plain integers; defaults are zero and the\n``sys.maxint``, respectively. If either bound is negative, the\nsequence\'s length is added to it. The slicing now selects all items\nwith index *k* such that ``i <= k < j`` where *i* and *j* are the\nspecified lower and upper bounds. This may be an empty sequence. It\nis not an error if *i* or *j* lie outside the range of valid indexes\n(such items don\'t exist so they aren\'t selected).\n\nThe semantics for an extended slicing are as follows. The primary\nmust evaluate to a mapping object, and it is indexed with a key that\nis constructed 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 an ellipsis slice\nitem is the built-in ``Ellipsis`` object. The conversion of a proper\nslice is a slice object (see section *The standard type hierarchy*)\nwhose ``start``, ``stop`` and ``step`` attributes are the values of\nthe expressions given as lower bound, upper bound and stride,\nrespectively, substituting ``None`` for missing expressions.\n', - 'specialattrs': u"\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\nobject.__methods__\n\n Deprecated since version 2.2: Use the built-in function ``dir()``\n to get a list of an object's attributes. This attribute is no\n longer available.\n\nobject.__members__\n\n Deprecated since version 2.2: Use the built-in function ``dir()``\n to get a list of an object's attributes. This attribute is no\n longer available.\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\nThe following attributes are only supported by *new-style class*es.\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 new-style class keeps a list of weak references to its\n immediate subclasses. This method returns a list of all those\n references still alive. Example:\n\n >>> int.__subclasses__()\n []\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] To format only a tuple you should therefore provide a singleton\n tuple whose only element is the tuple to be formatted.\n\n[5] The advantage of leaving the newline on is that returning an empty\n string is then an unambiguous EOF indication. It is also possible\n (in cases where it might matter, for example, if you want to make\n an exact copy of a file while scanning its lines) to tell whether\n the last line of a file ended in a newline or not (yes this\n happens!).\n", - 'specialnames': u'\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 ``x.__getitem__(i)`` for\nold-style classes and ``type(x).__getitem__(x, i)`` for new-style\nclasses. Except where mentioned, attempts to execute an operation\nraise an 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_traceback`` 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.exc_traceback`` or ``sys.last_traceback``. Circular\n references which are garbage are detected when the option cycle\n detector is enabled (it\'s on by default), but can only be cleaned\n up if there are no Python-level ``__del__()`` methods involved.\n Refer to the documentation for the ``gc`` module for more\n information about how ``__del__()`` methods are handled by the\n cycle detector, particularly the description of the ``garbage``\n 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 and by string\n conversions (reverse quotes) to compute the "official" string\n representation of an object. If at all possible, this should look\n like a valid Python expression that could be used to recreate an\n object with the same value (given an appropriate environment). If\n this is not possible, a string of the form ``<...some useful\n description...>`` should be returned. The return value must be a\n string object. If a class defines ``__repr__()`` but not\n ``__str__()``, then ``__repr__()`` is also used when an "informal"\n string representation of instances of that class is 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 statement 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.__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 New in version 2.1.\n\n These are the so-called "rich comparison" methods, and are called\n for comparison operators in preference to ``__cmp__()`` below. The\n correspondence between operator symbols and method names is as\n follows: ``xy`` call ``x.__ne__(y)``, ``x>y`` calls ``x.__gt__(y)``, and\n ``x>=y`` calls ``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.__cmp__(self, other)\n\n Called by comparison operations if rich comparison (see above) is\n not defined. Should return a negative integer if ``self < other``,\n zero if ``self == other``, a positive integer if ``self > other``.\n If no ``__cmp__()``, ``__eq__()`` or ``__ne__()`` operation is\n defined, class instances are compared by object identity\n ("address"). See also the description of ``__hash__()`` for some\n important notes on creating *hashable* objects which support custom\n comparison operations and are usable as dictionary keys. (Note: the\n restriction that exceptions are not propagated by ``__cmp__()`` has\n been removed since Python 1.5.)\n\nobject.__rcmp__(self, other)\n\n Changed in version 2.1: No longer supported.\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 a ``__cmp__()`` or ``__eq__()`` method\n it should not define a ``__hash__()`` operation either; if it\n defines ``__cmp__()`` or ``__eq__()`` but not ``__hash__()``, its\n instances will not be usable in hashed collections. If a class\n defines mutable objects and implements a ``__cmp__()`` or\n ``__eq__()`` method, it should not implement ``__hash__()``, since\n hashable collection implementations require that a object\'s hash\n value is immutable (if the object\'s hash value changes, it will be\n in the wrong hash bucket).\n\n User-defined classes have ``__cmp__()`` 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 ``__cmp__()`` or ``__eq__()`` such that\n the hash value returned is no longer appropriate (e.g. by switching\n to a value-based concept of equality instead of the default\n identity based equality) can explicitly flag themselves as being\n unhashable by setting ``__hash__ = None`` in the class definition.\n Doing so means that not only will instances of the class raise an\n appropriate ``TypeError`` when a program attempts to retrieve their\n hash value, but they will also be correctly identified as\n unhashable when checking ``isinstance(obj, collections.Hashable)``\n (unlike classes which define their own ``__hash__()`` to explicitly\n raise ``TypeError``).\n\n Changed in version 2.5: ``__hash__()`` may now also return a long\n integer object; the 32-bit integer is then derived from the hash of\n that object.\n\n Changed in version 2.6: ``__hash__`` may now be set to ``None`` to\n explicitly flag instances of a class as unhashable.\n\nobject.__nonzero__(self)\n\n Called to implement truth value testing and the built-in operation\n ``bool()``; should return ``False`` or ``True``, or their integer\n equivalents ``0`` or ``1``. When this method is not defined,\n ``__len__()`` is called, if it is defined, and the object is\n considered true if its result is nonzero. If a class defines\n neither ``__len__()`` nor ``__nonzero__()``, all its instances are\n considered true.\n\nobject.__unicode__(self)\n\n Called to implement ``unicode()`` built-in; should return a Unicode\n object. When this method is not defined, string conversion is\n attempted, and the result of string conversion is converted to\n Unicode using the system default encoding.\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 in new-style classes.\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 not simply execute ``self.name = value`` --- this would\n cause a recursive call to itself. Instead, it should insert the\n value in the dictionary of instance attributes, e.g.,\n ``self.__dict__[name] = value``. For new-style classes, rather\n than accessing the instance dictionary, it should call the base\n 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\n\nMore attribute access for new-style classes\n-------------------------------------------\n\nThe following methods only apply to new-style classes.\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 for new-style\n classes*.\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. Note that descriptors are only invoked for new\nstyle objects or classes (ones that subclass ``object()`` or\n``type()``).\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 a new-style object instance, ``a.x`` is transformed\n into the call: ``type(a).__dict__[\'x\'].__get__(a, type(a))``.\n\nClass Binding\n If binding to a new-style class, ``A.x`` is transformed into the\n call: ``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 both old and new-style classes have a\ndictionary for attribute storage. This wastes space for objects\nhaving very few instance variables. The space consumption can become\nacute when creating large numbers of instances.\n\nThe default can be overridden by defining *__slots__* in a new-style\nclass definition. The *__slots__* declaration takes a sequence of\ninstance variables and reserves just enough space in each instance to\nhold a value for each variable. Space is saved because *__dict__* is\nnot created for each instance.\n\n__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 new-style class, *__slots__* reserves space for the declared\n variables and prevents the automatic creation of *__dict__* and\n *__weakref__* for each instance.\n\n New in version 2.2.\n\nNotes on using *__slots__*\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 Changed in version 2.3: Previously, adding ``\'__dict__\'`` to the\n *__slots__* declaration would not enable the assignment of new\n attributes not specifically listed in the sequence of instance\n variable names.\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 Changed in version 2.3: Previously, adding ``\'__weakref__\'`` to the\n *__slots__* declaration would not enable support for weak\n references.\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 ``long``, ``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 Changed in version 2.6: Previously, *__class__* assignment raised an\n error if either new or old class had *__slots__*.\n\n\nCustomizing class creation\n==========================\n\nBy default, new-style classes are constructed using ``type()``. A\nclass definition is read into a separate namespace and the value of\nclass name is bound to the result of ``type(name, bases, dict)``.\n\nWhen the class definition is read, if *__metaclass__* is defined then\nthe callable assigned to it will be called instead of ``type()``. 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\n__metaclass__\n\n This variable can be any callable accepting arguments for ``name``,\n ``bases``, and ``dict``. Upon class creation, the callable is used\n instead of the built-in ``type()``.\n\n New in version 2.2.\n\nThe appropriate metaclass is determined by the following precedence\nrules:\n\n* If ``dict[\'__metaclass__\']`` exists, it is used.\n\n* Otherwise, if there is at least one base class, its metaclass is\n used (this looks for a *__class__* attribute first and if not found,\n uses its type).\n\n* Otherwise, if a global variable named __metaclass__ exists, it is\n used.\n\n* Otherwise, the old-style, classic metaclass (types.ClassType) is\n 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\n\nCustomizing instance and subclass checks\n========================================\n\nNew in version 2.6.\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. (For backwards compatibility, the method\n``__getslice__()`` (see below) can also be defined to handle simple,\nbut not extended slices.) It is also recommended that mappings provide\nthe methods ``keys()``, ``values()``, ``items()``, ``has_key()``,\n``get()``, ``clear()``, ``setdefault()``, ``iterkeys()``,\n``itervalues()``, ``iteritems()``, ``pop()``, ``popitem()``,\n``copy()``, and ``update()`` behaving similar to those for Python\'s\nstandard dictionary objects. The ``UserDict`` module provides a\n``DictMixin`` class to help create those methods from a base set of\n``__getitem__()``, ``__setitem__()``, ``__delitem__()``, and\n``keys()``. Mutable sequences should provide methods ``append()``,\n``count()``, ``index()``, ``extend()``, ``insert()``, ``pop()``,\n``remove()``, ``reverse()`` and ``sort()``, like Python standard list\nobjects. Finally, sequence types should implement addition (meaning\nconcatenation) and multiplication (meaning repetition) by defining the\nmethods ``__add__()``, ``__radd__()``, ``__iadd__()``, ``__mul__()``,\n``__rmul__()`` and ``__imul__()`` described below; they should not\ndefine ``__coerce__()`` or other numerical operators. It is\nrecommended that both mappings and sequences implement the\n``__contains__()`` method to allow efficient use of the ``in``\noperator; for mappings, ``in`` should be equivalent of ``has_key()``;\nfor sequences, 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``iterkeys()``; 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 ``__nonzero__()`` method and whose\n ``__len__()`` method returns zero is considered to be false in a\n Boolean context.\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 ``iterkeys()``.\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\n New in version 2.6.\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\nAdditional methods for emulation of sequence types\n==================================================\n\nThe following optional methods can be defined to further emulate\nsequence objects. Immutable sequences methods should at most only\ndefine ``__getslice__()``; mutable sequences might define all three\nmethods.\n\nobject.__getslice__(self, i, j)\n\n Deprecated since version 2.0: Support slice objects as parameters\n to the ``__getitem__()`` method. (However, built-in types in\n CPython currently still implement ``__getslice__()``. Therefore,\n you have to override it in derived classes when implementing\n slicing.)\n\n Called to implement evaluation of ``self[i:j]``. The returned\n object should be of the same type as *self*. Note that missing *i*\n or *j* in the slice expression are replaced by zero or\n ``sys.maxint``, respectively. If negative indexes are used in the\n slice, the length of the sequence is added to that index. If the\n instance does not implement the ``__len__()`` method, an\n ``AttributeError`` is raised. No guarantee is made that indexes\n adjusted this way are not still negative. Indexes which are\n greater than the length of the sequence are not modified. If no\n ``__getslice__()`` is found, a slice object is created instead, and\n passed to ``__getitem__()`` instead.\n\nobject.__setslice__(self, i, j, sequence)\n\n Called to implement assignment to ``self[i:j]``. Same notes for *i*\n and *j* as for ``__getslice__()``.\n\n This method is deprecated. If no ``__setslice__()`` is found, or\n for extended slicing of the form ``self[i:j:k]``, a slice object is\n created, and passed to ``__setitem__()``, instead of\n ``__setslice__()`` being called.\n\nobject.__delslice__(self, i, j)\n\n Called to implement deletion of ``self[i:j]``. Same notes for *i*\n and *j* as for ``__getslice__()``. This method is deprecated. If no\n ``__delslice__()`` is found, or for extended slicing of the form\n ``self[i:j:k]``, a slice object is created, and passed to\n ``__delitem__()``, instead of ``__delslice__()`` being called.\n\nNotice that these methods are only invoked when a single slice with a\nsingle colon is used, and the slice method is available. For slice\noperations involving extended slice notation, or in absence of the\nslice methods, ``__getitem__()``, ``__setitem__()`` or\n``__delitem__()`` is called with a slice object as argument.\n\nThe following example demonstrate how to make your program or module\ncompatible with earlier versions of Python (assuming that methods\n``__getitem__()``, ``__setitem__()`` and ``__delitem__()`` support\nslice objects as arguments):\n\n class MyClass:\n ...\n def __getitem__(self, index):\n ...\n def __setitem__(self, index, value):\n ...\n def __delitem__(self, index):\n ...\n\n if sys.version_info < (2, 0):\n # They won\'t be defined if version is at least 2.0 final\n\n def __getslice__(self, i, j):\n return self[max(0, i):max(0, j):]\n def __setslice__(self, i, j, seq):\n self[max(0, i):max(0, j):] = seq\n def __delslice__(self, i, j):\n del self[max(0, i):max(0, j):]\n ...\n\nNote the calls to ``max()``; these are necessary because of the\nhandling of negative indices before the ``__*slice__()`` methods are\ncalled. When negative indexes are used, the ``__*item__()`` methods\nreceive them as provided, but the ``__*slice__()`` methods get a\n"cooked" form of the index values. For each negative index value, the\nlength of the sequence is added to the index before calling the method\n(which may still result in a negative index); this is the customary\nhandling of negative indexes by the built-in sequence types, and the\n``__*item__()`` methods are expected to do this as well. However,\nsince they should already be doing that, negative indexes cannot be\npassed in; they must be constrained to the bounds of the sequence\nbefore being passed to the ``__*item__()`` methods. Calling ``max(0,\ni)`` conveniently returns the proper value.\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.__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 (``+``, ``-``, ``*``, ``//``, ``%``, ``divmod()``,\n ``pow()``, ``**``, ``<<``, ``>>``, ``&``, ``^``, ``|``). For\n instance, to evaluate the expression ``x + y``, where *x* is an\n 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__()`` (described below). Note\n that ``__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.__div__(self, other)\nobject.__truediv__(self, other)\n\n The division operator (``/``) is implemented by these methods. The\n ``__truediv__()`` method is used when ``__future__.division`` is in\n effect, otherwise ``__div__()`` is used. If only one of these two\n methods is defined, the object will not support division in the\n alternate context; ``TypeError`` will be raised instead.\n\nobject.__radd__(self, other)\nobject.__rsub__(self, other)\nobject.__rmul__(self, other)\nobject.__rdiv__(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 (``+``, ``-``, ``*``, ``/``, ``%``, ``divmod()``,\n ``pow()``, ``**``, ``<<``, ``>>``, ``&``, ``^``, ``|``) with\n reflected (swapped) operands. These functions are only called if\n the left operand does not support the corresponding operation and\n the operands are of different types. [2] For instance, to evaluate\n the expression ``x - y``, where *y* is an instance of a class that\n has an ``__rsub__()`` method, ``y.__rsub__(x)`` is called if\n ``x.__sub__(y)`` returns *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.__idiv__(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.__long__(self)\nobject.__float__(self)\n\n Called to implement the built-in functions ``complex()``,\n ``int()``, ``long()``, and ``float()``. Should return a value of\n the appropriate type.\n\nobject.__oct__(self)\nobject.__hex__(self)\n\n Called to implement the built-in functions ``oct()`` and ``hex()``.\n Should return a string value.\n\nobject.__index__(self)\n\n Called to implement ``operator.index()``. Also called whenever\n Python needs an integer object (such as in slicing). Must return\n an integer (int or long).\n\n New in version 2.5.\n\nobject.__coerce__(self, other)\n\n Called to implement "mixed-mode" numeric arithmetic. Should either\n return a 2-tuple containing *self* and *other* converted to a\n common numeric type, or ``None`` if conversion is impossible. When\n the common type would be the type of ``other``, it is sufficient to\n return ``None``, since the interpreter will also ask the other\n object to attempt a coercion (but sometimes, if the implementation\n of the other type cannot be changed, it is useful to do the\n conversion to the other type here). A return value of\n ``NotImplemented`` is equivalent to returning ``None``.\n\n\nCoercion rules\n==============\n\nThis section used to document the rules for coercion. As the language\nhas evolved, the coercion rules have become hard to document\nprecisely; documenting what one version of one particular\nimplementation does is undesirable. Instead, here are some informal\nguidelines regarding coercion. In Python 3.0, coercion will not be\nsupported.\n\n* If the left operand of a % operator is a string or Unicode object,\n no coercion takes place and the string formatting operation is\n invoked instead.\n\n* It is no longer recommended to define a coercion operation. Mixed-\n mode operations on types that don\'t define coercion pass the\n original arguments to the operation.\n\n* New-style classes (those derived from ``object``) never invoke the\n ``__coerce__()`` method in response to a binary operator; the only\n time ``__coerce__()`` is invoked is when the built-in function\n ``coerce()`` is called.\n\n* For most intents and purposes, an operator that returns\n ``NotImplemented`` is treated the same as one that is not\n implemented at all.\n\n* Below, ``__op__()`` and ``__rop__()`` are used to signify the\n generic method names corresponding to an operator; ``__iop__()`` is\n used for the corresponding in-place operator. For example, for the\n operator \'``+``\', ``__add__()`` and ``__radd__()`` are used for the\n left and right variant of the binary operator, and ``__iadd__()``\n for the in-place variant.\n\n* For objects *x* and *y*, first ``x.__op__(y)`` is tried. If this is\n not implemented or returns ``NotImplemented``, ``y.__rop__(x)`` is\n tried. If this is also not implemented or returns\n ``NotImplemented``, a ``TypeError`` exception is raised. But see\n the following exception:\n\n* Exception to the previous item: if the left operand is an instance\n of a built-in type or a new-style class, and the right operand is an\n instance of a proper subclass of that type or class and overrides\n the base\'s ``__rop__()`` method, the right operand\'s ``__rop__()``\n method is tried *before* the left operand\'s ``__op__()`` method.\n\n This is done so that a subclass can completely override binary\n operators. Otherwise, the left operand\'s ``__op__()`` method would\n always accept the right operand: when an instance of a given class\n is expected, an instance of a subclass of that class is always\n acceptable.\n\n* When either operand type defines a coercion, this coercion is called\n before that type\'s ``__op__()`` or ``__rop__()`` method is called,\n but no sooner. If the coercion returns an object of a different\n type for the operand whose coercion is invoked, part of the process\n is redone using the new object.\n\n* When an in-place operator (like \'``+=``\') is used, if the left\n operand implements ``__iop__()``, it is invoked without any\n coercion. When the operation falls back to ``__op__()`` and/or\n ``__rop__()``, the normal coercion rules apply.\n\n* In ``x + y``, if *x* is a sequence that implements sequence\n concatenation, sequence concatenation is invoked.\n\n* In ``x * y``, if one operator is a sequence that implements sequence\n repetition, and the other is an integer (``int`` or ``long``),\n sequence repetition is invoked.\n\n* Rich comparisons (implemented by methods ``__eq__()`` and so on)\n never use coercion. Three-way comparison (implemented by\n ``__cmp__()``) does use coercion under the same conditions as other\n binary operations use it.\n\n* In the current implementation, the built-in numeric types ``int``,\n ``long``, ``float``, and ``complex`` do not use coercion. All these\n types implement a ``__coerce__()`` method, for use by the built-in\n ``coerce()`` function.\n\n Changed in version 2.7.\n\n\nWith Statement Context Managers\n===============================\n\nNew in version 2.5.\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 for old-style classes\n===========================================\n\nFor old-style classes, special methods are always looked up in exactly\nthe same way as any other method or attribute. This is the case\nregardless of whether the method is being looked up explicitly as in\n``x.__getitem__(i)`` or implicitly as in ``x[i]``.\n\nThis behaviour means that special methods may exhibit different\nbehaviour for different instances of a single old-style class if the\nappropriate special attributes are set differently:\n\n >>> class C:\n ... pass\n ...\n >>> c1 = C()\n >>> c2 = C()\n >>> c1.__len__ = lambda: 5\n >>> c2.__len__ = lambda: 9\n >>> len(c1)\n 5\n >>> len(c2)\n 9\n\n\nSpecial method lookup for new-style classes\n===========================================\n\nFor new-style classes, implicit invocations of special methods are\nonly guaranteed to work correctly if defined on an object\'s type, not\nin the object\'s instance dictionary. That behaviour is the reason why\nthe following code raises an exception (unlike the equivalent example\nwith old-style classes):\n\n >>> class C(object):\n ... pass\n ...\n >>> c = C()\n >>> c.__len__ = lambda: 5\n >>> len(c)\n Traceback (most recent call last):\n File "", line 1, in \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 "", line 1, in \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):\n ... __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-conversions': u'\nString conversions\n******************\n\nA string conversion is an expression list enclosed in reverse (a.k.a.\nbackward) quotes:\n\n string_conversion ::= "\'" expression_list "\'"\n\nA string conversion evaluates the contained expression list and\nconverts the resulting object into a string according to rules\nspecific to its type.\n\nIf the object is a string, a number, ``None``, or a tuple, list or\ndictionary containing only objects whose type is one of these, the\nresulting string is a valid Python expression which can be passed to\nthe built-in function ``eval()`` to yield an expression with the same\nvalue (or an approximation, if floating point numbers are involved).\n\n(In particular, converting a string adds quotes around it and converts\n"funny" characters to escape sequences that are safe to print.)\n\nRecursive objects (for example, lists or dictionaries that contain a\nreference to themselves, directly or indirectly) use ``...`` to\nindicate a recursive reference, and the result cannot be passed to\n``eval()`` to get an equal value (``SyntaxError`` will be raised\ninstead).\n\nThe built-in function ``repr()`` performs exactly the same conversion\nin its argument as enclosing it in parentheses and reverse quotes\ndoes. The built-in function ``str()`` performs a similar but more\nuser-friendly conversion.\n', - 'string-methods': u'\nString Methods\n**************\n\nBelow are listed the string methods which both 8-bit strings and\nUnicode objects support. Some of them are also available on\n``bytearray`` objects.\n\nIn addition, Python\'s strings support the sequence type methods\ndescribed in the *Sequence Types --- str, unicode, list, tuple,\nbytearray, buffer, xrange* section. To output formatted strings use\ntemplate strings or the ``%`` operator described in the *String\nFormatting Operations* section. Also, see the ``re`` module for string\nfunctions based 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\n For 8-bit strings, this method is locale-dependent.\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\n Changed in version 2.4: Support for the *fillchar* argument.\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.decode([encoding[, errors]])\n\n Decodes the string using the codec registered for *encoding*.\n *encoding* defaults to the default string encoding. *errors* may\n be given to set a different error handling scheme. The default is\n ``\'strict\'``, meaning that encoding errors raise ``UnicodeError``.\n Other possible values are ``\'ignore\'``, ``\'replace\'`` and any other\n name registered via ``codecs.register_error()``, see section *Codec\n Base Classes*.\n\n New in version 2.2.\n\n Changed in version 2.3: Support for other error handling schemes\n added.\n\n Changed in version 2.7: Support for keyword arguments added.\n\nstr.encode([encoding[, errors]])\n\n Return an encoded version of the string. Default encoding is the\n current default string encoding. *errors* may be given to set a\n different error handling scheme. The default for *errors* is\n ``\'strict\'``, meaning that encoding errors raise a\n ``UnicodeError``. Other possible values are ``\'ignore\'``,\n ``\'replace\'``, ``\'xmlcharrefreplace\'``, ``\'backslashreplace\'`` and\n any other name registered via ``codecs.register_error()``, see\n section *Codec Base Classes*. For a list of possible encodings, see\n section *Standard Encodings*.\n\n New in version 2.0.\n\n Changed in version 2.3: Support for ``\'xmlcharrefreplace\'`` and\n ``\'backslashreplace\'`` and other error handling schemes added.\n\n Changed in version 2.7: 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\n Changed in version 2.5: Accept tuples as *suffix*.\n\nstr.expandtabs([tabsize])\n\n Return a copy of the string where all tab characters are replaced\n by one 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\n This method of string formatting is the new standard in Python 3.0,\n and should be preferred to the ``%`` formatting described in\n *String Formatting Operations* in new code.\n\n New in version 2.6.\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.\n\n For 8-bit strings, this method is locale-dependent.\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.\n\n For 8-bit strings, this method is locale-dependent.\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.\n\n For 8-bit strings, this method is locale-dependent.\n\nstr.islower()\n\n Return true if all cased characters in the string are lowercase and\n there is at least one cased character, false otherwise.\n\n For 8-bit strings, this method is locale-dependent.\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.\n\n For 8-bit strings, this method is locale-dependent.\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\n For 8-bit strings, this method is locale-dependent.\n\nstr.isupper()\n\n Return true if all cased characters in the string are uppercase and\n there is at least one cased character, false otherwise.\n\n For 8-bit strings, this method is locale-dependent.\n\nstr.join(iterable)\n\n Return a string which is the concatenation of the strings in the\n *iterable* *iterable*. The separator between elements is the\n 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\n ``len(s)``.\n\n Changed in version 2.4: Support for the *fillchar* argument.\n\nstr.lower()\n\n Return a copy of the string converted to lowercase.\n\n For 8-bit strings, this method is locale-dependent.\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\n Changed in version 2.2.2: Support for the *chars* argument.\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\n New in version 2.5.\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\n ``len(s)``.\n\n Changed in version 2.4: Support for the *fillchar* argument.\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\n New in version 2.5.\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\n New in version 2.4.\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\n Changed in version 2.2.2: Support for the *chars* argument.\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\n Changed in version 2.5: Accept tuples as *prefix*.\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\n Changed in version 2.2.2: Support for the *chars* argument.\n\nstr.swapcase()\n\n Return a copy of the string with uppercase characters converted to\n lowercase and vice versa.\n\n For 8-bit strings, this method is locale-dependent.\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\n For 8-bit strings, this method is locale-dependent.\n\nstr.translate(table[, deletechars])\n\n Return a copy of the string where all characters occurring in the\n optional argument *deletechars* are removed, and the remaining\n characters have been mapped through the given translation table,\n which must be a string of length 256.\n\n You can use the ``maketrans()`` helper function in the ``string``\n module to create a translation table. For string objects, set the\n *table* argument to ``None`` for translations that only delete\n characters:\n\n >>> \'read this short text\'.translate(None, \'aeiou\')\n \'rd ths shrt txt\'\n\n New in version 2.6: Support for a ``None`` *table* argument.\n\n For Unicode objects, the ``translate()`` method does not accept the\n optional *deletechars* argument. Instead, it returns a copy of the\n *s* where all characters have been mapped through the given\n translation table which must be a mapping of Unicode ordinals to\n Unicode ordinals, Unicode strings or ``None``. Unmapped characters\n are left untouched. Characters mapped to ``None`` are deleted.\n Note, a more flexible approach is to create a custom character\n mapping codec using the ``codecs`` module (see ``encodings.cp1251``\n for an example).\n\nstr.upper()\n\n Return a copy of the string converted to uppercase.\n\n For 8-bit strings, this method is locale-dependent.\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 ``len(s)``.\n\n New in version 2.2.2.\n\nThe following methods are present only on unicode objects:\n\nunicode.isnumeric()\n\n Return ``True`` if there are only numeric characters in S,\n ``False`` otherwise. Numeric characters include digit characters,\n and all characters that have the Unicode numeric value property,\n e.g. U+2155, VULGAR FRACTION ONE FIFTH.\n\nunicode.isdecimal()\n\n Return ``True`` if there are only decimal characters in S,\n ``False`` otherwise. Decimal characters include digit characters,\n and all characters that that can be used to form decimal-radix\n numbers, e.g. U+0660, ARABIC-INDIC DIGIT ZERO.\n', - 'strings': u'\nString literals\n***************\n\nString literals are described by the following lexical definitions:\n\n stringliteral ::= [stringprefix](shortstring | longstring)\n stringprefix ::= "r" | "u" | "ur" | "R" | "U" | "UR" | "Ur" | "uR"\n | "b" | "B" | "br" | "Br" | "bR" | "BR"\n shortstring ::= "\'" shortstringitem* "\'" | \'"\' shortstringitem* \'"\'\n longstring ::= "\'\'\'" longstringitem* "\'\'\'"\n | \'"""\' longstringitem* \'"""\'\n shortstringitem ::= shortstringchar | escapeseq\n longstringitem ::= longstringchar | escapeseq\n shortstringchar ::= \n longstringchar ::= \n escapeseq ::= "\\" \n\nOne syntactic restriction not indicated by these productions is that\nwhitespace is not allowed between the **stringprefix** and the rest of\nthe string literal. The source character set is defined by the\nencoding declaration; it is ASCII if no encoding declaration is given\nin the source file; see section *Encoding declarations*.\n\nIn plain English: String literals can be enclosed in matching single\nquotes (``\'``) or double quotes (``"``). They can also be enclosed in\nmatching groups of three single or double quotes (these are generally\nreferred to as *triple-quoted strings*). The backslash (``\\``)\ncharacter is used to escape characters that otherwise have a special\nmeaning, such as newline, backslash itself, or the quote character.\nString literals may optionally be prefixed with a letter ``\'r\'`` or\n``\'R\'``; such strings are called *raw strings* and use different rules\nfor interpreting backslash escape sequences. A prefix of ``\'u\'`` or\n``\'U\'`` makes the string a Unicode string. Unicode strings use the\nUnicode character set as defined by the Unicode Consortium and ISO\n10646. Some additional escape sequences, described below, are\navailable in Unicode strings. A prefix of ``\'b\'`` or ``\'B\'`` is\nignored in Python 2; it indicates that the literal should become a\nbytes literal in Python 3 (e.g. when code is automatically converted\nwith 2to3). A ``\'u\'`` or ``\'b\'`` prefix may be followed by an ``\'r\'``\nprefix.\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`` | 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| ``\\N{name}`` | Character named *name* in the | |\n| | Unicode database (Unicode only) | |\n+-------------------+-----------------------------------+---------+\n| ``\\r`` | ASCII Carriage Return (CR) | |\n+-------------------+-----------------------------------+---------+\n| ``\\t`` | ASCII Horizontal Tab (TAB) | |\n+-------------------+-----------------------------------+---------+\n| ``\\uxxxx`` | Character with 16-bit hex value | (1) |\n| | *xxxx* (Unicode only) | |\n+-------------------+-----------------------------------+---------+\n| ``\\Uxxxxxxxx`` | Character with 32-bit hex value | (2) |\n| | *xxxxxxxx* (Unicode only) | |\n+-------------------+-----------------------------------+---------+\n| ``\\v`` | ASCII Vertical Tab (VT) | |\n+-------------------+-----------------------------------+---------+\n| ``\\ooo`` | Character with octal value *ooo* | (3,5) |\n+-------------------+-----------------------------------+---------+\n| ``\\xhh`` | Character with hex value *hh* | (4,5) |\n+-------------------+-----------------------------------+---------+\n\nNotes:\n\n1. Individual code units which form parts of a surrogate pair can be\n encoded using this escape sequence.\n\n2. 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). Individual code units which form parts of a surrogate\n pair can be encoded using this escape sequence.\n\n3. As in Standard C, up to three octal digits are accepted.\n\n4. Unlike in Standard C, exactly two hex digits are required.\n\n5. In a string literal, hexadecimal and octal escapes denote the byte\n with the given value; it is not necessary that the byte encodes a\n character in the source character set. In a Unicode literal, these\n escapes denote a Unicode character with the given value.\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 marked as "(Unicode only)"\nin the table above fall into the category of unrecognized escapes for\nnon-Unicode string literals.\n\nWhen an ``\'r\'`` or ``\'R\'`` prefix is present, a character following a\nbackslash is included in the string without change, and *all\nbackslashes are left in the string*. For example, the string literal\n``r"\\n"`` consists of two characters: a backslash and a lowercase\n``\'n\'``. String quotes can be escaped with a backslash, but the\nbackslash remains in the string; for example, ``r"\\""`` is a valid\nstring literal consisting of two characters: a backslash and a double\nquote; ``r"\\"`` is not a valid string literal (even a raw string\ncannot end in an odd number of backslashes). Specifically, *a raw\nstring cannot end in a single backslash* (since the backslash would\nescape 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\nWhen an ``\'r\'`` or ``\'R\'`` prefix is used in conjunction with a\n``\'u\'`` or ``\'U\'`` prefix, then the ``\\uXXXX`` and ``\\UXXXXXXXX``\nescape sequences are processed while *all other backslashes are left\nin the string*. For example, the string literal ``ur"\\u0062\\n"``\nconsists of three Unicode characters: \'LATIN SMALL LETTER B\', \'REVERSE\nSOLIDUS\', and \'LATIN SMALL LETTER N\'. Backslashes can be escaped with\na preceding backslash; however, both remain in the string. As a\nresult, ``\\uXXXX`` escape sequences are only recognized when there are\nan odd number of backslashes.\n', - 'subscriptions': u'\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 of a sequence or mapping type.\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 a\nplain integer. If this value is negative, the length of the sequence\nis added to it (so that, e.g., ``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).\n\nA string\'s items are characters. A character is not a separate data\ntype but a string of exactly one character.\n', - 'truth': u"\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``, ``0L``, ``0.0``,\n ``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 ``__nonzero__()`` or ``__len__()`` method, when that method returns\n the 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': u'\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\nChanged in version 2.5: In previous versions of Python,\n``try``...``except``...``finally`` did not work. ``try``...``except``\nhad to be nested in ``try``...``finally``.\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, a tuple containing an item compatible with the\nexception, or, in the (deprecated) case of string exceptions, is the\nraised string itself (note that the object identities must match, i.e.\nit must be the same string object, not just a string with the same\nvalue).\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 in that except clause, if present, and the except\nclause\'s suite is executed. All except clauses must have an\nexecutable block. When the end of this block is reached, execution\ncontinues normally after the entire try statement. (This means that\nif two nested handlers exist for the same exception, and the exception\noccurs in the try clause of the inner handler, the outer handler will\nnot handle the exception.)\n\nBefore an except clause\'s suite is executed, details about the\nexception are assigned to three variables in the ``sys`` module:\n``sys.exc_type`` receives the object identifying the exception;\n``sys.exc_value`` receives the exception\'s parameter;\n``sys.exc_traceback`` receives a traceback object (see section *The\nstandard type hierarchy*) identifying the point in the program where\nthe exception occurred. These details are also available through the\n``sys.exc_info()`` function, which returns a tuple ``(exc_type,\nexc_value, exc_traceback)``. Use of the corresponding variables is\ndeprecated in favor of this function, since their use is unsafe in a\nthreaded program. As of Python 1.5, the variables are restored to\ntheir previous values (before the call) when returning from a function\nthat 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 lost. The exception information is not available to the\nprogram during execution 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': u'\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.).\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 built-in name\n ``Ellipsis``. It is used to indicate the presence of the ``...``\n syntax in a slice. 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 three types of integers:\n\n Plain integers\n These represent numbers in the range -2147483648 through\n 2147483647. (The range may be larger on machines with a\n larger natural word size, but not smaller.) When the result\n of an operation would fall outside this range, the result is\n normally returned as a long integer (in some cases, the\n exception ``OverflowError`` is raised instead). For the\n purpose of shift and mask operations, integers are assumed to\n have a binary, 2\'s complement notation using 32 or more bits,\n and hiding no bits from the user (i.e., all 4294967296\n different bit patterns correspond to different values).\n\n Long integers\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\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 plain\n integers, 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 and the least surprises when\n switching between the plain and long integer domains. Any\n operation, if it yields a result in the plain integer domain,\n will yield the same result in the long integer domain or when\n using mixed operands. The switch between domains is transparent\n to the programmer.\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``\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 are characters. There is no separate\n character type; a character is represented by a string of one\n item. Characters represent (at least) 8-bit bytes. The\n built-in functions ``chr()`` and ``ord()`` convert between\n characters and nonnegative integers representing the byte\n values. Bytes with the values 0-127 usually represent the\n corresponding ASCII values, but the interpretation of values\n is up to the program. The string data type is also used to\n represent arrays of bytes, e.g., to hold data read from a\n file.\n\n (On systems whose native character set is not ASCII, strings\n may use EBCDIC in their internal representation, provided the\n functions ``chr()`` and ``ord()`` implement a mapping between\n ASCII and EBCDIC, and string comparison preserves the ASCII\n order. Or perhaps someone can propose a better rule?)\n\n Unicode\n The items of a Unicode object are Unicode code units. A\n Unicode code unit is represented by a Unicode 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 ``unichr()`` 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 Unicode method ``encode()`` and the\n built-in function ``unicode()``.\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 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.\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``, ``gdbm``, and ``bsddb`` provide\n additional examples of mapping types.\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 | ``func_doc`` | The function\'s documentation | Writable |\n | | string, or ``None`` if | |\n | | unavailable | |\n +-------------------------+---------------------------------+-------------+\n | ``__doc__`` | Another way of spelling | Writable |\n | | ``func_doc`` | |\n +-------------------------+---------------------------------+-------------+\n | ``func_name`` | The function\'s name | Writable |\n +-------------------------+---------------------------------+-------------+\n | ``__name__`` | Another way of spelling | Writable |\n | | ``func_name`` | |\n +-------------------------+---------------------------------+-------------+\n | ``__module__`` | The name of the module the | Writable |\n | | function was defined in, or | |\n | | ``None`` if unavailable. | |\n +-------------------------+---------------------------------+-------------+\n | ``func_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 | ``func_code`` | The code object representing | Writable |\n | | the compiled function body. | |\n +-------------------------+---------------------------------+-------------+\n | ``func_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 | ``func_dict`` | The namespace supporting | Writable |\n | | arbitrary function attributes. | |\n +-------------------------+---------------------------------+-------------+\n | ``func_closure`` | ``None`` or a tuple of cells | Read-only |\n | | that contain bindings for the | |\n | | function\'s free variables. | |\n +-------------------------+---------------------------------+-------------+\n\n Most of the attributes labelled "Writable" check the type of the\n assigned value.\n\n Changed in version 2.4: ``func_name`` is now writable.\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 User-defined methods\n A user-defined method object combines a class, a class instance\n (or ``None``) and any callable object (normally a user-defined\n function).\n\n Special read-only attributes: ``im_self`` is the class instance\n object, ``im_func`` is the function object; ``im_class`` is the\n class of ``im_self`` for bound methods or the class that asked\n for the method for unbound methods; ``__doc__`` is the method\'s\n documentation (same as ``im_func.__doc__``); ``__name__`` is the\n method name (same as ``im_func.__name__``); ``__module__`` is\n the name of the module the method was defined in, or ``None`` if\n unavailable.\n\n Changed in version 2.2: ``im_self`` used to refer to the class\n that defined the method.\n\n Changed in version 2.6: For 3.0 forward-compatibility,\n ``im_func`` is also available as ``__func__``, and ``im_self``\n as ``__self__``.\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, an unbound\n user-defined method object, or a class method object. When the\n attribute is a user-defined method object, a new method object\n is only created if the class from which it is being retrieved is\n the same as, or a derived class of, the class stored in the\n original method object; otherwise, the original method object is\n used as it is.\n\n When a user-defined method object is created by retrieving a\n user-defined function object from a class, its ``im_self``\n attribute is ``None`` and the method object is said to be\n unbound. When one is created by retrieving a user-defined\n function object from a class via one of its instances, its\n ``im_self`` attribute is the instance, and the method object is\n said to be bound. In either case, the new method\'s ``im_class``\n attribute is the class from which the retrieval takes place, and\n its ``im_func`` 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 ``im_func``\n attribute of the new instance is not the original method object\n but its ``im_func`` attribute.\n\n When a user-defined method object is created by retrieving a\n class method object from a class or instance, its ``im_self``\n attribute is the class itself (the same as the ``im_class``\n attribute), and its ``im_func`` attribute is the function object\n underlying the class method.\n\n When an unbound user-defined method object is called, the\n underlying function (``im_func``) is called, with the\n restriction that the first argument must be an instance of the\n proper class (``im_class``) or of a derived class thereof.\n\n When a bound user-defined method object is called, the\n underlying function (``im_func``) is called, inserting the class\n instance (``im_self``) in front of the argument list. For\n instance, when ``C`` is a class which contains a definition for\n a function ``f()``, and ``x`` is an instance of ``C``, calling\n ``x.f(1)`` is equivalent to calling ``C.f(x, 1)``.\n\n When a user-defined method object is derived from a class method\n object, the "class instance" stored in ``im_self`` will actually\n be the class itself, so that calling either ``x.f(1)`` or\n ``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 (unbound or\n bound) method object happens each time the attribute is\n retrieved from the class or instance. In some cases, a fruitful\n optimization is to assign the attribute to a local variable and\n call that local variable. Also notice that this transformation\n only happens for user-defined functions; other callable objects\n (and all non-callable objects) are retrieved without\n transformation. It is also important to note that user-defined\n functions which are attributes of a class instance are not\n converted to bound methods; this *only* happens when the\n function is an attribute 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 Class Types\n Class types, or "new-style classes," are callable. These\n objects normally act as factories for new instances of\n themselves, but variations are possible for class types that\n override ``__new__()``. The arguments of the call are passed to\n ``__new__()`` and, in the typical case, to ``__init__()`` to\n initialize the new instance.\n\n Classic Classes\n Class objects are described below. When a class object is\n called, a new class instance (also described below) is created\n and returned. This implies a call to the class\'s ``__init__()``\n method if it has one. Any arguments are passed on to the\n ``__init__()`` method. If there is no ``__init__()`` method,\n the class must be called without arguments.\n\n Class instances\n Class instances are described below. Class instances are\n callable only when the class has a ``__call__()`` method;\n ``x(arguments)`` is a shorthand for ``x.__call__(arguments)``.\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 func_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\nClasses\n Both class types (new-style classes) and class objects (old-\n style/classic classes) are typically created by class definitions\n (see section *Class definitions*). A class has a namespace\n implemented by a dictionary object. Class attribute references are\n translated to lookups in this dictionary, e.g., ``C.x`` is\n translated to ``C.__dict__["x"]`` (although for new-style classes\n in particular there are a number of hooks which allow for other\n means of locating attributes). When the attribute name is not found\n there, the attribute search continues in the base classes. For\n old-style classes, the search is depth-first, left-to-right in the\n order of occurrence in the base class list. New-style classes use\n the more complex C3 method resolution order which behaves correctly\n even in the presence of \'diamond\' inheritance structures where\n there are multiple inheritance paths leading back to a common\n ancestor. Additional details on the C3 MRO used by new-style\n classes can be found in the documentation accompanying the 2.3\n release at http://www.python.org/download/releases/2.3/mro/.\n\n When a class attribute reference (for class ``C``, say) would yield\n a user-defined function object or an unbound user-defined method\n object whose associated class is either ``C`` or one of its base\n classes, it is transformed into an unbound user-defined method\n object whose ``im_class`` attribute is ``C``. When it would yield a\n class method object, it is transformed into a bound user-defined\n method object whose ``im_class`` and ``im_self`` attributes are\n both ``C``. When it would yield a static method object, it is\n transformed into the object wrapped by the static method object.\n See section *Implementing Descriptors* for another way in which\n attributes retrieved from a class may differ from those actually\n contained in its ``__dict__`` (note that only new-style classes\n support descriptors).\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 or an unbound user-defined method object whose\n associated class is the class (call it ``C``) of the instance for\n which the attribute reference was initiated or one of its bases, it\n is transformed into a bound user-defined method object whose\n ``im_class`` attribute is ``C`` and whose ``im_self`` attribute is\n the instance. Static method and class method objects are also\n transformed, as if they had been retrieved from class ``C``; see\n above under "Classes". See section *Implementing Descriptors* for\n another way in which attributes of a class retrieved via its\n instances may differ from the objects actually stored in the\n class\'s ``__dict__``. If no class attribute is found, and the\n object\'s class has a ``__getattr__()`` method, that is called to\n satisfy the 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\nFiles\n A file object represents an open file. File objects are created by\n the ``open()`` built-in function, and also by ``os.popen()``,\n ``os.fdopen()``, and the ``makefile()`` method of socket objects\n (and perhaps by other functions or methods provided by extension\n modules). The objects ``sys.stdin``, ``sys.stdout`` and\n ``sys.stderr`` are initialized to file objects corresponding to the\n interpreter\'s standard input, output and error streams. See *File\n Objects* for complete documentation of file objects.\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_restricted`` is a flag indicating whether the function is\n executing in restricted execution mode; ``f_lasti`` gives the\n precise instruction (this is an index into the bytecode string\n 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_exc_type``, ``f_exc_value``,\n ``f_exc_traceback`` represent the last exception raised in the\n parent frame provided another exception was ever raised in the\n current frame (in all other cases they are None); ``f_lineno``\n is the current line number of the frame --- writing to this from\n within a trace function jumps to the given line (only for the\n bottom-most frame). A debugger can implement a Jump command\n (aka Set Next Statement) 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 ``sys.exc_traceback``,\n and also as the third item of the tuple returned by\n ``sys.exc_info()``. The latter is the preferred interface,\n since it works correctly when the program is using multiple\n threads. When the program contains no suitable handler, the\n stack trace is written (nicely formatted) to the standard error\n stream; if the interpreter is interactive, it is also made\n available to the user as ``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 when *extended slice\n syntax* is used. This is a slice using two colons, or multiple\n slices or ellipses separated by commas, e.g., ``a[i:j:step]``,\n ``a[i:j, k:l]``, or ``a[..., i:j]``. They are also created by\n the built-in ``slice()`` 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 extended slice that the slice\n object would describe if applied to a sequence of *length*\n items. It returns a tuple of three integers; respectively\n these are the *start* and *stop* indices and the *step* or\n stride length of the slice. Missing or out-of-bounds indices\n are handled in a manner consistent with regular slices.\n\n New in version 2.3.\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': u'\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': u'\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 is\n 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 New in version 2.2.\n\n Changed in version 2.3: Support for building a dictionary from\n keyword arguments added.\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 New in version 2.5: If a subclass of dict defines a method\n ``__missing__()``, if the key *key* is not present, the\n ``d[key]`` operation calls that method with the key *key* as\n argument. The ``d[key]`` operation then returns or raises\n whatever is returned or raised by the ``__missing__(key)`` call\n if the key is not present. No other operations or methods invoke\n ``__missing__()``. If ``__missing__()`` is not defined,\n ``KeyError`` is raised. ``__missing__()`` must be a method; it\n cannot be an instance variable. For an example, see\n ``collections.defaultdict``.\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 New in version 2.2.\n\n key not in d\n\n Equivalent to ``not key in d``.\n\n New in version 2.2.\n\n iter(d)\n\n Return an iterator over the keys of the dictionary. This is a\n shortcut for ``iterkeys()``.\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 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 New in version 2.3.\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 has_key(key)\n\n Test for the presence of *key* in the dictionary. ``has_key()``\n is deprecated in favor of ``key in d``.\n\n items()\n\n Return a copy of the dictionary\'s list of ``(key, value)``\n pairs.\n\n **CPython implementation detail:** Keys and values are listed in\n an arbitrary order which is non-random, varies across Python\n implementations, and depends on the dictionary\'s history of\n insertions and deletions.\n\n If ``items()``, ``keys()``, ``values()``, ``iteritems()``,\n ``iterkeys()``, and ``itervalues()`` are called with no\n intervening modifications to the dictionary, the lists will\n directly correspond. This allows the creation of ``(value,\n key)`` pairs using ``zip()``: ``pairs = zip(d.values(),\n d.keys())``. The same relationship holds for the ``iterkeys()``\n and ``itervalues()`` methods: ``pairs = zip(d.itervalues(),\n d.iterkeys())`` provides the same value for ``pairs``. Another\n way to create the same list is ``pairs = [(v, k) for (k, v) in\n d.iteritems()]``.\n\n iteritems()\n\n Return an iterator over the dictionary\'s ``(key, value)`` pairs.\n See the note for ``dict.items()``.\n\n Using ``iteritems()`` while adding or deleting entries in the\n dictionary may raise a ``RuntimeError`` or fail to iterate over\n all entries.\n\n New in version 2.2.\n\n iterkeys()\n\n Return an iterator over the dictionary\'s keys. See the note for\n ``dict.items()``.\n\n Using ``iterkeys()`` while adding or deleting entries in the\n dictionary may raise a ``RuntimeError`` or fail to iterate over\n all entries.\n\n New in version 2.2.\n\n itervalues()\n\n Return an iterator over the dictionary\'s values. See the note\n for ``dict.items()``.\n\n Using ``itervalues()`` while adding or deleting entries in the\n dictionary may raise a ``RuntimeError`` or fail to iterate over\n all entries.\n\n New in version 2.2.\n\n keys()\n\n Return a copy of the dictionary\'s list of keys. See the note\n for ``dict.items()``.\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 New in version 2.3.\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 Changed in version 2.4: Allowed the argument to be an iterable\n of key/value pairs and allowed keyword arguments.\n\n values()\n\n Return a copy of the dictionary\'s list of values. See the note\n for ``dict.items()``.\n\n viewitems()\n\n Return a new view of the dictionary\'s items (``(key, value)``\n pairs). See below for documentation of view objects.\n\n New in version 2.7.\n\n viewkeys()\n\n Return a new view of the dictionary\'s keys. See below for\n documentation of view objects.\n\n New in version 2.7.\n\n viewvalues()\n\n Return a new view of the dictionary\'s values. See below for\n documentation of view objects.\n\n New in version 2.7.\n\n\nDictionary view objects\n=======================\n\nThe objects returned by ``dict.viewkeys()``, ``dict.viewvalues()`` and\n``dict.viewitems()`` are *view objects*. They provide a dynamic view\non the 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 and\nhashable, then the items view is also set-like. (Values views are not\ntreated as set-like since the entries are generally not unique.) Then\nthese set operations are available ("other" refers either to another\nview or a set):\n\ndictview & other\n\n Return the intersection of the dictview and the other object as a\n new set.\n\ndictview | other\n\n Return the union of the dictview and the other object as a new set.\n\ndictview - other\n\n Return the difference between the dictview and the other object\n (all elements in *dictview* that aren\'t in *other*) as a new set.\n\ndictview ^ other\n\n Return the symmetric difference (all elements either in *dictview*\n or *other*, but not in both) of the dictview and the other object\n as a new set.\n\nAn example of dictionary view usage:\n\n >>> dishes = {\'eggs\': 2, \'sausage\': 1, \'bacon\': 1, \'spam\': 500}\n >>> keys = dishes.viewkeys()\n >>> values = dishes.viewvalues()\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', - 'typesmethods': u"\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\nThe implementation adds two special read-only attributes to class\ninstance methods: ``m.im_self`` is the object on which the method\noperates, and ``m.im_func`` is the function implementing the method.\nCalling ``m(arg-1, arg-2, ..., arg-n)`` is completely equivalent to\ncalling ``m.im_func(m.im_self, arg-1, arg-2, ..., arg-n)``.\n\nClass instance methods are either *bound* or *unbound*, referring to\nwhether the method was accessed through an instance or a class,\nrespectively. When a method is unbound, its ``im_self`` attribute\nwill be ``None`` and if called, an explicit ``self`` object must be\npassed as the first argument. In this case, ``self`` must be an\ninstance of the unbound method's class (or a subclass of that class),\notherwise a ``TypeError`` is raised.\n\nLike function objects, methods objects support getting arbitrary\nattributes. However, since method attributes are actually stored on\nthe underlying function object (``meth.im_func``), setting method\nattributes on either bound or unbound methods is disallowed.\nAttempting to set a method attribute results in a ``TypeError`` being\nraised. In order to set a method attribute, you need to explicitly\nset it on the underlying function object:\n\n class C:\n def method(self):\n pass\n\n c = C()\n c.method.im_func.whoami = 'my name is c'\n\nSee *The standard type hierarchy* for more information.\n", - 'typesmodules': u"\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 member 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: ````. If loaded from a file, they are written as\n````.\n", - 'typesseq': u'\nSequence Types --- ``str``, ``unicode``, ``list``, ``tuple``, ``bytearray``, ``buffer``, ``xrange``\n***************************************************************************************************\n\nThere are seven sequence types: strings, Unicode strings, lists,\ntuples, bytearrays, buffers, and xrange objects.\n\nFor other containers see the built in ``dict`` and ``set`` classes,\nand the ``collections`` module.\n\nString literals are written in single or double quotes: ``\'xyzzy\'``,\n``"frobozz"``. See *String literals* for more about string literals.\nUnicode strings are much like strings, but are specified in the syntax\nusing a preceding ``\'u\'`` character: ``u\'abc\'``, ``u"def"``. In\naddition to the functionality described here, there are also string-\nspecific methods described in the *String Methods* section. Lists are\nconstructed with square brackets, separating items with commas: ``[a,\nb, c]``. Tuples are constructed by the comma operator (not within\nsquare brackets), with or without enclosing parentheses, but an empty\ntuple must have the enclosing parentheses, such as ``a, b, c`` or\n``()``. A single item tuple must have a trailing comma, such as\n``(d,)``.\n\nBytearray objects are created with the built-in function\n``bytearray()``.\n\nBuffer objects are not directly supported by Python syntax, but can be\ncreated by calling the built-in function ``buffer()``. They don\'t\nsupport concatenation or repetition.\n\nObjects of type xrange are similar to buffers in that there is no\nspecific syntax to create them, but they are created using the\n``xrange()`` function. They don\'t support slicing, concatenation or\nrepetition, and using ``in``, ``not in``, ``min()`` or ``max()`` on\nthem 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* and *j* 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 compare\nequal and the two sequences must be of the same type and have the same\nlength. (For full details see *Comparisons* in the language\nreference.)\n\nNotes:\n\n1. When *s* is a string or Unicode string object the ``in`` and ``not\n in`` operations act like a substring test. In Python versions\n before 2.3, *x* had to be a string of length 1. In Python 2.3 and\n beyond, *x* may be a string of any length.\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. **CPython implementation detail:** If *s* and *t* are both strings,\n some Python implementations such as CPython can usually perform an\n in-place optimization for assignments of the form ``s = s + t`` or\n ``s += t``. When applicable, this optimization makes quadratic\n run-time much less likely. This optimization is both version and\n implementation dependent. For performance sensitive code, it is\n preferable to use the ``str.join()`` method which assures\n consistent linear concatenation performance across versions and\n implementations.\n\n Changed in version 2.4: Formerly, string concatenation never\n occurred in-place.\n\n\nString Methods\n==============\n\nBelow are listed the string methods which both 8-bit strings and\nUnicode objects support. Some of them are also available on\n``bytearray`` objects.\n\nIn addition, Python\'s strings support the sequence type methods\ndescribed in the *Sequence Types --- str, unicode, list, tuple,\nbytearray, buffer, xrange* section. To output formatted strings use\ntemplate strings or the ``%`` operator described in the *String\nFormatting Operations* section. Also, see the ``re`` module for string\nfunctions based 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\n For 8-bit strings, this method is locale-dependent.\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\n Changed in version 2.4: Support for the *fillchar* argument.\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.decode([encoding[, errors]])\n\n Decodes the string using the codec registered for *encoding*.\n *encoding* defaults to the default string encoding. *errors* may\n be given to set a different error handling scheme. The default is\n ``\'strict\'``, meaning that encoding errors raise ``UnicodeError``.\n Other possible values are ``\'ignore\'``, ``\'replace\'`` and any other\n name registered via ``codecs.register_error()``, see section *Codec\n Base Classes*.\n\n New in version 2.2.\n\n Changed in version 2.3: Support for other error handling schemes\n added.\n\n Changed in version 2.7: Support for keyword arguments added.\n\nstr.encode([encoding[, errors]])\n\n Return an encoded version of the string. Default encoding is the\n current default string encoding. *errors* may be given to set a\n different error handling scheme. The default for *errors* is\n ``\'strict\'``, meaning that encoding errors raise a\n ``UnicodeError``. Other possible values are ``\'ignore\'``,\n ``\'replace\'``, ``\'xmlcharrefreplace\'``, ``\'backslashreplace\'`` and\n any other name registered via ``codecs.register_error()``, see\n section *Codec Base Classes*. For a list of possible encodings, see\n section *Standard Encodings*.\n\n New in version 2.0.\n\n Changed in version 2.3: Support for ``\'xmlcharrefreplace\'`` and\n ``\'backslashreplace\'`` and other error handling schemes added.\n\n Changed in version 2.7: 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\n Changed in version 2.5: Accept tuples as *suffix*.\n\nstr.expandtabs([tabsize])\n\n Return a copy of the string where all tab characters are replaced\n by one 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\n This method of string formatting is the new standard in Python 3.0,\n and should be preferred to the ``%`` formatting described in\n *String Formatting Operations* in new code.\n\n New in version 2.6.\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.\n\n For 8-bit strings, this method is locale-dependent.\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.\n\n For 8-bit strings, this method is locale-dependent.\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.\n\n For 8-bit strings, this method is locale-dependent.\n\nstr.islower()\n\n Return true if all cased characters in the string are lowercase and\n there is at least one cased character, false otherwise.\n\n For 8-bit strings, this method is locale-dependent.\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.\n\n For 8-bit strings, this method is locale-dependent.\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\n For 8-bit strings, this method is locale-dependent.\n\nstr.isupper()\n\n Return true if all cased characters in the string are uppercase and\n there is at least one cased character, false otherwise.\n\n For 8-bit strings, this method is locale-dependent.\n\nstr.join(iterable)\n\n Return a string which is the concatenation of the strings in the\n *iterable* *iterable*. The separator between elements is the\n 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\n ``len(s)``.\n\n Changed in version 2.4: Support for the *fillchar* argument.\n\nstr.lower()\n\n Return a copy of the string converted to lowercase.\n\n For 8-bit strings, this method is locale-dependent.\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\n Changed in version 2.2.2: Support for the *chars* argument.\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\n New in version 2.5.\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\n ``len(s)``.\n\n Changed in version 2.4: Support for the *fillchar* argument.\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\n New in version 2.5.\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\n New in version 2.4.\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\n Changed in version 2.2.2: Support for the *chars* argument.\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\n Changed in version 2.5: Accept tuples as *prefix*.\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\n Changed in version 2.2.2: Support for the *chars* argument.\n\nstr.swapcase()\n\n Return a copy of the string with uppercase characters converted to\n lowercase and vice versa.\n\n For 8-bit strings, this method is locale-dependent.\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\n For 8-bit strings, this method is locale-dependent.\n\nstr.translate(table[, deletechars])\n\n Return a copy of the string where all characters occurring in the\n optional argument *deletechars* are removed, and the remaining\n characters have been mapped through the given translation table,\n which must be a string of length 256.\n\n You can use the ``maketrans()`` helper function in the ``string``\n module to create a translation table. For string objects, set the\n *table* argument to ``None`` for translations that only delete\n characters:\n\n >>> \'read this short text\'.translate(None, \'aeiou\')\n \'rd ths shrt txt\'\n\n New in version 2.6: Support for a ``None`` *table* argument.\n\n For Unicode objects, the ``translate()`` method does not accept the\n optional *deletechars* argument. Instead, it returns a copy of the\n *s* where all characters have been mapped through the given\n translation table which must be a mapping of Unicode ordinals to\n Unicode ordinals, Unicode strings or ``None``. Unmapped characters\n are left untouched. Characters mapped to ``None`` are deleted.\n Note, a more flexible approach is to create a custom character\n mapping codec using the ``codecs`` module (see ``encodings.cp1251``\n for an example).\n\nstr.upper()\n\n Return a copy of the string converted to uppercase.\n\n For 8-bit strings, this method is locale-dependent.\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 ``len(s)``.\n\n New in version 2.2.2.\n\nThe following methods are present only on unicode objects:\n\nunicode.isnumeric()\n\n Return ``True`` if there are only numeric characters in S,\n ``False`` otherwise. Numeric characters include digit characters,\n and all characters that have the Unicode numeric value property,\n e.g. U+2155, VULGAR FRACTION ONE FIFTH.\n\nunicode.isdecimal()\n\n Return ``True`` if there are only decimal characters in S,\n ``False`` otherwise. Decimal characters include digit characters,\n and all characters that that can be used to form decimal-radix\n numbers, e.g. U+0660, ARABIC-INDIC DIGIT ZERO.\n\n\nString Formatting Operations\n============================\n\nString and Unicode objects have one unique built-in operation: the\n``%`` operator (modulo). This is also known as the string\n*formatting* or *interpolation* operator. Given ``format % values``\n(where *format* is a string or Unicode object), ``%`` conversion\nspecifications in *format* are replaced with zero or more elements of\n*values*. The effect is similar to the using ``sprintf()`` in the C\nlanguage. If *format* is a Unicode object, or if any of the objects\nbeing converted using the ``%s`` conversion are Unicode objects, the\nresult will also be a Unicode object.\n\nIf *format* requires a single argument, *values* may be a single non-\ntuple object. [4] 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 width\n is read from the next element of the tuple in *values*, and the\n 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()``). | (6) |\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. The ``%r`` conversion was added in Python 2.0.\n\n The precision determines the maximal number of characters used.\n\n6. If the object or format provided is a ``unicode`` string, the\n resulting string will also be ``unicode``.\n\n The precision determines the maximal number of characters used.\n\n7. 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 2.7: ``%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\nXRange Type\n===========\n\nThe ``xrange`` type is an immutable sequence which is commonly used\nfor looping. The advantage of the ``xrange`` type is that an\n``xrange`` object will always take the same amount of memory, no\nmatter the size of the range it represents. There are no consistent\nperformance advantages.\n\nXRange objects have very little behavior: they only support indexing,\niteration, and the ``len()`` function.\n\n\nMutable Sequence Types\n======================\n\nList and ``bytearray`` objects support additional operations that\nallow in-place modification of the object. Other mutable sequence\ntypes (when added to the language) should also support these\noperations. Strings and tuples are immutable sequence types: such\nobjects cannot be modified once created. The following operations are\ndefined on mutable sequence types (where *x* is an arbitrary object):\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)] = | (2) |\n| | [x]`` | |\n+--------------------------------+----------------------------------+-----------------------+\n| ``s.extend(x)`` | same as ``s[len(s):len(s)] = x`` | (3) |\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 | (4) |\n| | ``s[k] == x`` and ``i <= k < j`` | |\n+--------------------------------+----------------------------------+-----------------------+\n| ``s.insert(i, x)`` | same as ``s[i:i] = [x]`` | (5) |\n+--------------------------------+----------------------------------+-----------------------+\n| ``s.pop([i])`` | same as ``x = s[i]; del s[i]; | (6) |\n| | return x`` | |\n+--------------------------------+----------------------------------+-----------------------+\n| ``s.remove(x)`` | same as ``del s[s.index(x)]`` | (4) |\n+--------------------------------+----------------------------------+-----------------------+\n| ``s.reverse()`` | reverses the items of *s* in | (7) |\n| | place | |\n+--------------------------------+----------------------------------+-----------------------+\n| ``s.sort([cmp[, key[, | sort the items of *s* in place | (7)(8)(9)(10) |\n| reverse]]])`` | | |\n+--------------------------------+----------------------------------+-----------------------+\n\nNotes:\n\n1. *t* must have the same length as the slice it is replacing.\n\n2. The C implementation of Python has historically accepted multiple\n parameters and implicitly joined them into a tuple; this no longer\n works in Python 2.0. Use of this misfeature has been deprecated\n since Python 1.4.\n\n3. *x* can be any iterable object.\n\n4. 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 list length is added, as for slice indices. If it is\n still negative, it is truncated to zero, as for slice indices.\n\n Changed in version 2.3: Previously, ``index()`` didn\'t have\n arguments for specifying start and stop positions.\n\n5. When a negative index is passed as the first parameter to the\n ``insert()`` method, the list length is added, as for slice\n indices. If it is still negative, it is truncated to zero, as for\n slice indices.\n\n Changed in version 2.3: Previously, all negative indices were\n truncated to zero.\n\n6. The ``pop()`` method is only supported by the list and array types.\n The optional argument *i* defaults to ``-1``, so that by default\n the last item is removed and returned.\n\n7. The ``sort()`` and ``reverse()`` methods modify the list in place\n for economy of space when sorting or reversing a large list. To\n remind you that they operate by side effect, they don\'t return the\n sorted or reversed list.\n\n8. The ``sort()`` method takes optional arguments for controlling the\n comparisons.\n\n *cmp* specifies a custom comparison function of two arguments (list\n items) which should return a negative, zero or positive number\n depending on whether the first argument is considered smaller than,\n equal to, or larger than the second argument: ``cmp=lambda x,y:\n cmp(x.lower(), y.lower())``. The default value is ``None``.\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``.\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 In general, the *key* and *reverse* conversion processes are much\n faster than specifying an equivalent *cmp* function. This is\n because *cmp* is called multiple times for each list element while\n *key* and *reverse* touch each element only once. Use\n ``functools.cmp_to_key()`` to convert an old-style *cmp* function\n to a *key* function.\n\n Changed in version 2.3: Support for ``None`` as an equivalent to\n omitting *cmp* was added.\n\n Changed in version 2.4: Support for *key* and *reverse* was added.\n\n9. Starting with Python 2.3, the ``sort()`` method is guaranteed to be\n stable. A sort is stable if it guarantees not to change the\n relative order of elements that compare equal --- this is helpful\n for sorting in multiple passes (for example, sort by department,\n then by salary grade).\n\n10. **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 2.3 and newer makes the\n list appear empty for the duration, and raises ``ValueError`` if\n it can detect that the list has been mutated during a sort.\n', - 'typesseq-mutable': u"\nMutable Sequence Types\n**********************\n\nList and ``bytearray`` objects support additional operations that\nallow in-place modification of the object. Other mutable sequence\ntypes (when added to the language) should also support these\noperations. Strings and tuples are immutable sequence types: such\nobjects cannot be modified once created. The following operations are\ndefined on mutable sequence types (where *x* is an arbitrary object):\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)] = | (2) |\n| | [x]`` | |\n+--------------------------------+----------------------------------+-----------------------+\n| ``s.extend(x)`` | same as ``s[len(s):len(s)] = x`` | (3) |\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 | (4) |\n| | ``s[k] == x`` and ``i <= k < j`` | |\n+--------------------------------+----------------------------------+-----------------------+\n| ``s.insert(i, x)`` | same as ``s[i:i] = [x]`` | (5) |\n+--------------------------------+----------------------------------+-----------------------+\n| ``s.pop([i])`` | same as ``x = s[i]; del s[i]; | (6) |\n| | return x`` | |\n+--------------------------------+----------------------------------+-----------------------+\n| ``s.remove(x)`` | same as ``del s[s.index(x)]`` | (4) |\n+--------------------------------+----------------------------------+-----------------------+\n| ``s.reverse()`` | reverses the items of *s* in | (7) |\n| | place | |\n+--------------------------------+----------------------------------+-----------------------+\n| ``s.sort([cmp[, key[, | sort the items of *s* in place | (7)(8)(9)(10) |\n| reverse]]])`` | | |\n+--------------------------------+----------------------------------+-----------------------+\n\nNotes:\n\n1. *t* must have the same length as the slice it is replacing.\n\n2. The C implementation of Python has historically accepted multiple\n parameters and implicitly joined them into a tuple; this no longer\n works in Python 2.0. Use of this misfeature has been deprecated\n since Python 1.4.\n\n3. *x* can be any iterable object.\n\n4. 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 list length is added, as for slice indices. If it is\n still negative, it is truncated to zero, as for slice indices.\n\n Changed in version 2.3: Previously, ``index()`` didn't have\n arguments for specifying start and stop positions.\n\n5. When a negative index is passed as the first parameter to the\n ``insert()`` method, the list length is added, as for slice\n indices. If it is still negative, it is truncated to zero, as for\n slice indices.\n\n Changed in version 2.3: Previously, all negative indices were\n truncated to zero.\n\n6. The ``pop()`` method is only supported by the list and array types.\n The optional argument *i* defaults to ``-1``, so that by default\n the last item is removed and returned.\n\n7. The ``sort()`` and ``reverse()`` methods modify the list in place\n for economy of space when sorting or reversing a large list. To\n remind you that they operate by side effect, they don't return the\n sorted or reversed list.\n\n8. The ``sort()`` method takes optional arguments for controlling the\n comparisons.\n\n *cmp* specifies a custom comparison function of two arguments (list\n items) which should return a negative, zero or positive number\n depending on whether the first argument is considered smaller than,\n equal to, or larger than the second argument: ``cmp=lambda x,y:\n cmp(x.lower(), y.lower())``. The default value is ``None``.\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``.\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 In general, the *key* and *reverse* conversion processes are much\n faster than specifying an equivalent *cmp* function. This is\n because *cmp* is called multiple times for each list element while\n *key* and *reverse* touch each element only once. Use\n ``functools.cmp_to_key()`` to convert an old-style *cmp* function\n to a *key* function.\n\n Changed in version 2.3: Support for ``None`` as an equivalent to\n omitting *cmp* was added.\n\n Changed in version 2.4: Support for *key* and *reverse* was added.\n\n9. Starting with Python 2.3, the ``sort()`` method is guaranteed to be\n stable. A sort is stable if it guarantees not to change the\n relative order of elements that compare equal --- this is helpful\n for sorting in multiple passes (for example, sort by department,\n then by salary grade).\n\n10. **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 2.3 and newer makes the\n list appear empty for the duration, and raises ``ValueError`` if\n it can detect that the list has been mutated during a sort.\n", - 'unary': u'\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\nplain or long integer argument. The bitwise inversion of ``x`` is\ndefined as ``-(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': u'\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': u'\nThe ``with`` statement\n**********************\n\nNew in version 2.5.\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\nNote: In Python 2.5, the ``with`` statement is only allowed when the\n ``with_statement`` feature has been enabled. It is always enabled\n in Python 2.6.\n\nChanged in version 2.7: 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': u'\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 generator\'s ``next()``\nmethod 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\nAs of Python version 2.5, the ``yield`` statement is now allowed in\nthe ``try`` clause of a ``try`` ... ``finally`` construct. If the\ngenerator is not resumed before it is finalized (by reaching a zero\nreference count or by being garbage collected), the generator-\niterator\'s ``close()`` method will be called, allowing any pending\n``finally`` clauses to execute.\n\nNote: In Python 2.2, the ``yield`` statement was only allowed when the\n ``generators`` feature has been enabled. This ``__future__`` import\n statement was used to enable the feature:\n\n from __future__ import generators\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'} +# Autogenerated by Sphinx on Thu Feb 23 15:17:35 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\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 is recursively defined as\nfollows.\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\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`` statement in the\n current code block: the name is bound to the object in the current\n local namespace.\n\n * Otherwise: the name is bound to the object in the current global\n namespace.\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 a plain integer. If it is negative, the\n sequence\'s length is added to it. The resulting value must be a\n nonnegative integer less than the sequence\'s length, and the\n sequence is asked to assign the assigned object to its item with\n that index. If the index is out of range, ``IndexError`` is raised\n (assignment to a subscripted sequence cannot add new items to a\n 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* 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 (small) integers. If either\n bound is negative, the sequence\'s length is added to it. The\n resulting bounds are clipped to lie between zero and the sequence\'s\n length, inclusive. Finally, the sequence object is asked to replace\n the slice with the items of the assigned sequence. The length of\n the 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\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 literals and various numeric literals:\n\n literal ::= stringliteral | integer | longinteger\n | floatnumber | imagnumber\n\nEvaluation of a literal yields an object of the given type (string,\ninteger, long integer, floating point number, complex number) with the\ngiven value. The value may be approximated in the case of floating\npoint and imaginary (complex) literals. See section *Literals* for\ndetails.\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 in new-style classes.\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 not simply execute ``self.name = value`` --- this would\n cause a recursive call to itself. Instead, it should insert the\n value in the dictionary of instance attributes, e.g.,\n ``self.__dict__[name] = value``. For new-style classes, rather\n than accessing the instance dictionary, it should call the base\n 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\n\nMore attribute access for new-style classes\n===========================================\n\nThe following methods only apply to new-style classes.\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 for new-style\n classes*.\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. Note that descriptors are only invoked for new\nstyle objects or classes (ones that subclass ``object()`` or\n``type()``).\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 a new-style object instance, ``a.x`` is transformed\n into the call: ``type(a).__dict__[\'x\'].__get__(a, type(a))``.\n\nClass Binding\n If binding to a new-style class, ``A.x`` is transformed into the\n call: ``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 both old and new-style classes have a\ndictionary for attribute storage. This wastes space for objects\nhaving very few instance variables. The space consumption can become\nacute when creating large numbers of instances.\n\nThe default can be overridden by defining *__slots__* in a new-style\nclass definition. The *__slots__* declaration takes a sequence of\ninstance variables and reserves just enough space in each instance to\nhold a value for each variable. Space is saved because *__dict__* is\nnot created for each instance.\n\n__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 new-style class, *__slots__* reserves space for the declared\n variables and prevents the automatic creation of *__dict__* and\n *__weakref__* for each instance.\n\n New in version 2.2.\n\nNotes on using *__slots__*\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 Changed in version 2.3: Previously, adding ``\'__dict__\'`` to the\n *__slots__* declaration would not enable the assignment of new\n attributes not specifically listed in the sequence of instance\n variable names.\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 Changed in version 2.3: Previously, adding ``\'__weakref__\'`` to the\n *__slots__* declaration would not enable support for weak\n references.\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 ``long``, ``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 Changed in version 2.6: Previously, *__class__* assignment raised an\n error if either new or old class had *__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, e.g., a module, list, or an instance. This\nobject is then asked to produce the attribute whose name is the\nidentifier. If this attribute is not available, the exception\n``AttributeError`` is raised. Otherwise, the type and value of the\nobject produced is determined by the object. Multiple evaluations of\nthe same attribute reference 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 (plain or long) and the other must be a sequence.\nIn the former case, the numbers are converted to a common type and\nthen multiplied together. In the latter case, sequence repetition is\nperformed; a negative 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. Plain or long integer division yields an\ninteger of the same type; the result is that of mathematical division\nwith the \'floor\' function applied to the result. Division by zero\nraises 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 [2].\n\nThe integer division and modulo operators are connected by the\nfollowing identity: ``x == (x/y)*y + (x%y)``. Integer division and\nmodulo are also connected with the built-in function ``divmod()``:\n``divmod(x, y) == (x/y, x%y)``. These identities don\'t hold for\nfloating point numbers; there similar identities hold approximately\nwhere ``x/y`` is replaced by ``floor(x/y)`` or ``floor(x/y) - 1`` [3].\n\nIn addition to performing the modulo operation on numbers, the ``%``\noperator is also overloaded by string and unicode objects to perform\nstring formatting (also known as interpolation). The syntax for string\nformatting is described in the Python Library Reference, section\n*String Formatting Operations*.\n\nDeprecated since version 2.3: The floor division operator, the modulo\noperator, and the ``divmod()`` function are no longer defined for\ncomplex numbers. Instead, convert to a floating point number using\nthe ``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 plain or long integers. The arguments are converted to a common\ntype.\n\nThe ``^`` operator yields the bitwise XOR (exclusive OR) of its\narguments, which must be plain or long integers. The arguments are\nconverted to a common type.\n\nThe ``|`` operator yields the bitwise (inclusive) OR of its arguments,\nwhich must be plain or long integers. The arguments are converted to\na common type.\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 ``func_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`` statement or the built-in ``eval()``\nfunction.\n\nSee *The standard type hierarchy* for more information.\n', + 'bltin-ellipsis-object': '\nThe Ellipsis Object\n*******************\n\nThis object is used by extended slice notation (see *Slicings*). It\nsupports no special operations. There is exactly one ellipsis object,\nnamed ``Ellipsis`` (a built-in name).\n\nIt is written as ``Ellipsis``. When in a subscript, it can also be\nwritten as ``...``, for example ``seq[...]``.\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-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: ````.\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. (See the ``__nonzero__()`` special method for a way to\nchange this.)\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', + 'callable-types': '\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', + '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 [","]\n | expression genexpr_for] ")"\n argument_list ::= positional_arguments ["," keyword_arguments]\n ["," "*" expression] ["," keyword_arguments]\n ["," "**" expression]\n | keyword_arguments ["," "*" expression]\n ["," "**" expression]\n | "*" expression ["," "*" expression] ["," "**" 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 certain class instances\nthemselves are callable; extensions may define additional callable\nobject types). All argument expressions are evaluated before the call\nis attempted. Please refer to section *Function definitions* for the\nsyntax 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 "", 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. Formal parameters using the syntax ``(sublist)`` cannot be\nused as keyword argument names; the outermost sublist corresponds to a\nsingle unnamed argument slot, and the argument value is assigned to\nthe sublist using the usual tuple assignment rules after all other\nparameter processing is done.\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 ::= "class" classname [inheritance] ":" suite\n inheritance ::= "(" [expression_list] ")"\n classname ::= identifier\n\nA class definition is an executable statement. It first evaluates the\ninheritance list, if present. Each item in the inheritance list\nshould evaluate to a class object or class type which allows\nsubclassing. The class\'s suite is then executed in a new execution\nframe (see section *Naming and binding*), using a newly created local\nnamespace and the original global namespace. (Usually, the suite\ncontains only function definitions.) When the class\'s suite finishes\nexecution, its execution frame is discarded but its local namespace is\nsaved. [4] A class object is then created using the inheritance list\nfor the base classes and the saved local namespace for the attribute\ndictionary. The class name is bound to this class object in the\noriginal local namespace.\n\n**Programmer\'s note:** Variables defined in the class definition are\nclass variables; they are shared by all instances. To create instance\nvariables, they can be set in a method with ``self.name = value``.\nBoth class and instance variables are accessible through the notation\n"``self.name``", and an instance variable hides a class variable with\nthe same name when accessed in this way. Class variables can be used\nas defaults for instance variables, but using mutable values there can\nlead to unexpected results. For *new-style class*es, descriptors can\nbe used to create instance variables with different implementation\ndetails.\n\nClass definitions, like function definitions, may be wrapped by one or\nmore *decorator* expressions. The evaluation rules for the decorator\nexpressions are the same as for functions. The result must be a class\nobject, which is then bound to the class name.\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 forms ``<>`` and ``!=`` are equivalent; for consistency with C,\n``!=`` is preferred; where ``!=`` is mentioned below ``<>`` is also\naccepted. The ``<>`` spelling is considered obsolescent.\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,\nobjects of different types *always* compare unequal, and are ordered\nconsistently but arbitrarily. You can control comparison behavior of\nobjects of non-built-in types by defining a ``__cmp__`` method or rich\ncomparison methods like ``__gt__``, described in section *Special\nmethod names*.\n\n(This unusual definition of comparison was used to simplify the\ndefinition of operations like sorting and the ``in`` and ``not in``\noperators. In the future, the comparison rules for objects of\ndifferent types are likely to change.)\n\nComparison of objects of the same type depends on the type:\n\n* Numbers are compared arithmetically.\n\n* Strings are compared lexicographically using the numeric equivalents\n (the result of the built-in function ``ord()``) of their characters.\n Unicode and 8-bit strings are fully interoperable in this behavior.\n [4]\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, ``cmp([1,2,x], [1,2,y])`` returns\n the same as ``cmp(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 their sorted\n (key, value) lists compare equal. [5] Outcomes other than equality\n are resolved consistently, but are not otherwise defined. [6]\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\nThe operators ``in`` and ``not in`` test for collection membership.\n``x in s`` evaluates to true if *x* is a member of the collection *s*,\nand false otherwise. ``x not in s`` returns the negation of ``x in\ns``. The collection membership test has traditionally been bound to\nsequences; an object is a member of a collection if the collection is\na sequence and contains an element equal to that object. However, it\nmake sense for many other object types to support membership tests\nwithout being a sequence. In particular, dictionaries (for keys) and\nsets support membership testing.\n\nFor the list and tuple types, ``x in y`` is true if and only if there\nexists an index *i* such that ``x == y[i]`` is true.\n\nFor the Unicode and string types, ``x in y`` is true if and only if\n*x* is a substring of *y*. An equivalent test is ``y.find(x) != -1``.\nNote, *x* and *y* need not be the same type; consequently, ``u\'ab\' in\n\'abc\'`` will return ``True``. Empty strings are always considered to\nbe a substring of any other string, so ``"" in "abc"`` will return\n``True``.\n\nChanged in version 2.3: Previously, *x* was required to be a string of\nlength ``1``.\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. [7]\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. Function and class\ndefinitions are also syntactically compound 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`` statements 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 | decorated\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, and then the suite is executed. When the items are\nexhausted (which is immediately when the sequence is empty), the suite\nin the ``else`` clause, if present, is executed, and the loop\nterminates.\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\nThe target list is not deleted when the loop is finished, but if the\nsequence is empty, it will not have been assigned to at all by the\nloop. Hint: the built-in function ``range()`` returns a sequence of\nintegers suitable to emulate the effect of Pascal\'s ``for i := a to b\ndo``; e.g., ``range(3)`` returns the list ``[0, 1, 2]``.\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 internal\n counter is used to keep track of which item is used next, and this\n is incremented on each iteration. When this counter has reached the\n length of the sequence the loop terminates. This means that if the\n suite deletes the current (or a previous) item from the sequence,\n the next item will be skipped (since it gets the index of the\n 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\nChanged in version 2.5: In previous versions of Python,\n``try``...``except``...``finally`` did not work. ``try``...``except``\nhad to be nested in ``try``...``finally``.\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, a tuple containing an item compatible with the\nexception, or, in the (deprecated) case of string exceptions, is the\nraised string itself (note that the object identities must match, i.e.\nit must be the same string object, not just a string with the same\nvalue).\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 in that except clause, if present, and the except\nclause\'s suite is executed. All except clauses must have an\nexecutable block. When the end of this block is reached, execution\ncontinues normally after the entire try statement. (This means that\nif two nested handlers exist for the same exception, and the exception\noccurs in the try clause of the inner handler, the outer handler will\nnot handle the exception.)\n\nBefore an except clause\'s suite is executed, details about the\nexception are assigned to three variables in the ``sys`` module:\n``sys.exc_type`` receives the object identifying the exception;\n``sys.exc_value`` receives the exception\'s parameter;\n``sys.exc_traceback`` receives a traceback object (see section *The\nstandard type hierarchy*) identifying the point in the program where\nthe exception occurred. These details are also available through the\n``sys.exc_info()`` function, which returns a tuple ``(exc_type,\nexc_value, exc_traceback)``. Use of the corresponding variables is\ndeprecated in favor of this function, since their use is unsafe in a\nthreaded program. As of Python 1.5, the variables are restored to\ntheir previous values (before the call) when returning from a function\nthat 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 lost. The exception information is not available to the\nprogram during execution 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\nNew in version 2.5.\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\nNote: In Python 2.5, the ``with`` statement is only allowed when the\n ``with_statement`` feature has been enabled. It is always enabled\n in Python 2.6.\n\nChanged in version 2.7: 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 decorated ::= decorators (classdef | funcdef)\n decorators ::= decorator+\n decorator ::= "@" dotted_name ["(" [argument_list [","]] ")"] NEWLINE\n funcdef ::= "def" funcname "(" [parameter_list] ")" ":" suite\n dotted_name ::= identifier ("." identifier)*\n parameter_list ::= (defparameter ",")*\n ( "*" identifier [, "**" identifier]\n | "**" identifier\n | defparameter [","] )\n defparameter ::= parameter ["=" expression]\n sublist ::= parameter ("," parameter)* [","]\n parameter ::= identifier | "(" sublist ")"\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 top-level 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 must also have a default value --- this is a syntactic\nrestriction 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.\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.\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 ::= "class" classname [inheritance] ":" suite\n inheritance ::= "(" [expression_list] ")"\n classname ::= identifier\n\nA class definition is an executable statement. It first evaluates the\ninheritance list, if present. Each item in the inheritance list\nshould evaluate to a class object or class type which allows\nsubclassing. The class\'s suite is then executed in a new execution\nframe (see section *Naming and binding*), using a newly created local\nnamespace and the original global namespace. (Usually, the suite\ncontains only function definitions.) When the class\'s suite finishes\nexecution, its execution frame is discarded but its local namespace is\nsaved. [4] A class object is then created using the inheritance list\nfor the base classes and the saved local namespace for the attribute\ndictionary. The class name is bound to this class object in the\noriginal local namespace.\n\n**Programmer\'s note:** Variables defined in the class definition are\nclass variables; they are shared by all instances. To create instance\nvariables, they can be set in a method with ``self.name = value``.\nBoth class and instance variables are accessible through the notation\n"``self.name``", and an instance variable hides a class variable with\nthe same name when accessed in this way. Class variables can be used\nas defaults for instance variables, but using mutable values there can\nlead to unexpected results. For *new-style class*es, descriptors can\nbe used to create instance variables with different implementation\ndetails.\n\nClass definitions, like function definitions, may be wrapped by one or\nmore *decorator* expressions. The evaluation rules for the decorator\nexpressions are the same as for functions. The result must be a class\nobject, which is then bound to the class name.\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\nNew in version 2.5.\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," the arguments\nare coerced using the coercion rules listed at *Coercion rules*. If\nboth arguments are standard numeric types, the following coercions are\napplied:\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, if either argument is a long integer, the other is\n converted to long integer;\n\n* otherwise, both must be plain integers and no conversion is\n necessary.\n\nSome additional rules apply for certain operators (e.g., a string left\nargument to the \'%\' operator). Extensions can define their own\ncoercions.\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_traceback`` 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.exc_traceback`` or ``sys.last_traceback``. Circular\n references which are garbage are detected when the option cycle\n detector is enabled (it\'s on by default), but can only be cleaned\n up if there are no Python-level ``__del__()`` methods involved.\n Refer to the documentation for the ``gc`` module for more\n information about how ``__del__()`` methods are handled by the\n cycle detector, particularly the description of the ``garbage``\n 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\n See also the *-R* command-line option.\n\nobject.__repr__(self)\n\n Called by the ``repr()`` built-in function and by string\n conversions (reverse quotes) to compute the "official" string\n representation of an object. If at all possible, this should look\n like a valid Python expression that could be used to recreate an\n object with the same value (given an appropriate environment). If\n this is not possible, a string of the form ``<...some useful\n description...>`` should be returned. The return value must be a\n string object. If a class defines ``__repr__()`` but not\n ``__str__()``, then ``__repr__()`` is also used when an "informal"\n string representation of instances of that class is 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 statement 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.__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 New in version 2.1.\n\n These are the so-called "rich comparison" methods, and are called\n for comparison operators in preference to ``__cmp__()`` below. The\n correspondence between operator symbols and method names is as\n follows: ``xy`` call ``x.__ne__(y)``, ``x>y`` calls ``x.__gt__(y)``, and\n ``x>=y`` calls ``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.__cmp__(self, other)\n\n Called by comparison operations if rich comparison (see above) is\n not defined. Should return a negative integer if ``self < other``,\n zero if ``self == other``, a positive integer if ``self > other``.\n If no ``__cmp__()``, ``__eq__()`` or ``__ne__()`` operation is\n defined, class instances are compared by object identity\n ("address"). See also the description of ``__hash__()`` for some\n important notes on creating *hashable* objects which support custom\n comparison operations and are usable as dictionary keys. (Note: the\n restriction that exceptions are not propagated by ``__cmp__()`` has\n been removed since Python 1.5.)\n\nobject.__rcmp__(self, other)\n\n Changed in version 2.1: No longer supported.\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 a ``__cmp__()`` or ``__eq__()`` method\n it should not define a ``__hash__()`` operation either; if it\n defines ``__cmp__()`` or ``__eq__()`` but not ``__hash__()``, its\n instances will not be usable in hashed collections. If a class\n defines mutable objects and implements a ``__cmp__()`` or\n ``__eq__()`` method, it should not implement ``__hash__()``, since\n hashable collection implementations require that a object\'s hash\n value is immutable (if the object\'s hash value changes, it will be\n in the wrong hash bucket).\n\n User-defined classes have ``__cmp__()`` 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 ``__cmp__()`` or ``__eq__()`` such that\n the hash value returned is no longer appropriate (e.g. by switching\n to a value-based concept of equality instead of the default\n identity based equality) can explicitly flag themselves as being\n unhashable by setting ``__hash__ = None`` in the class definition.\n Doing so means that not only will instances of the class raise an\n appropriate ``TypeError`` when a program attempts to retrieve their\n hash value, but they will also be correctly identified as\n unhashable when checking ``isinstance(obj, collections.Hashable)``\n (unlike classes which define their own ``__hash__()`` to explicitly\n raise ``TypeError``).\n\n Changed in version 2.5: ``__hash__()`` may now also return a long\n integer object; the 32-bit integer is then derived from the hash of\n that object.\n\n Changed in version 2.6: ``__hash__`` may now be set to ``None`` to\n explicitly flag instances of a class as unhashable.\n\nobject.__nonzero__(self)\n\n Called to implement truth value testing and the built-in operation\n ``bool()``; should return ``False`` or ``True``, or their integer\n equivalents ``0`` or ``1``. When this method is not defined,\n ``__len__()`` is called, if it is defined, and the object is\n considered true if its result is nonzero. If a class defines\n neither ``__len__()`` nor ``__nonzero__()``, all its instances are\n considered true.\n\nobject.__unicode__(self)\n\n Called to implement ``unicode()`` built-in; should return a Unicode\n object. When this method is not defined, string conversion is\n attempted, and the result of string conversion is converted to\n Unicode using the system default encoding.\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 > (0)?()\n (Pdb) continue\n > (1)?()\n (Pdb) continue\n NameError: \'spam\'\n > (1)?()\n (Pdb)\n\n``pdb.py`` can also be invoked as a script to debug other scripts.\nFor example:\n\n python -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 2.4: Restarting post-mortem behavior added.\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 ``c`` 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 "", 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[, locals]])\n\n Execute the *statement* (given as a string) under debugger control.\n The debugger prompt appears before any code is executed; you can\n set breakpoints and type ``continue``, or you can step through the\n statement using ``step`` or ``next`` (all these commands are\n explained below). The optional *globals* and *locals* arguments\n specify the environment in which the code is executed; by default\n the dictionary of the module ``__main__`` is used. (See the\n explanation of the ``exec`` statement or the ``eval()`` built-in\n function.)\n\npdb.runeval(expression[, globals[, locals]])\n\n Evaluate the *expression* (given as a string) under debugger\n control. When ``runeval()`` returns, it returns the value of the\n expression. Otherwise this function is similar to ``run()``.\n\npdb.runcall(function[, argument, ...])\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])\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)\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 Example call to enable tracing with *skip*:\n\n import pdb; pdb.Pdb(skip=[\'django.*\']).set_trace()\n\n New in version 2.7: The *skip* argument.\n\n run(statement[, globals[, locals]])\n runeval(expression[, globals[, locals]])\n runcall(function[, argument, ...])\n set_trace()\n\n See the documentation for the functions explained above.\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\nIt is illegal to delete a name from the local namespace if it occurs\nas a free variable in a nested block.\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', + '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\nIf ``exec`` is used in a function and the function contains or is a\nnested block with free variables, the compiler will raise a\n``SyntaxError`` unless the exec explicitly specifies the local\nnamespace for the ``exec``. (In other words, ``exec obj`` would be\nillegal, but ``exec obj in ns`` would be legal.)\n\nThe ``eval()``, ``execfile()``, and ``input()`` functions and the\n``exec`` statement do not have access to the full environment for\nresolving names. Names may be resolved in the local and global\nnamespaces of the caller. Free variables are not resolved in the\nnearest enclosing namespace, but in the global namespace. [1] The\n``exec`` statement and the ``eval()`` and ``execfile()`` functions\nhave optional arguments to override the global and local namespace.\nIf only one namespace is specified, 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', + 'exceptions': '\nExceptions\n**********\n\nExceptions are a means of breaking out of the normal flow of control\nof a code block in order to handle errors or other exceptional\nconditions. An exception is *raised* at the point where the error is\ndetected; it may be *handled* by the surrounding code block or by any\ncode block that directly or indirectly invoked the code block where\nthe error occurred.\n\nThe Python interpreter raises an exception when it detects a run-time\nerror (such as division by zero). A Python program can also\nexplicitly raise an exception with the ``raise`` statement. Exception\nhandlers are specified with the ``try`` ... ``except`` statement. The\n``finally`` clause of such a statement can be used to specify cleanup\ncode which does not handle the exception, but is executed whether an\nexception occurred or not in the preceding code.\n\nPython uses the "termination" model of error handling: an exception\nhandler can find out what happened and continue execution at an outer\nlevel, but it cannot repair the cause of the error and retry the\nfailing operation (except by re-entering the offending piece of code\nfrom the top).\n\nWhen an exception is not handled at all, the interpreter terminates\nexecution of the program, or returns to its interactive main loop. In\neither case, it prints a stack backtrace, except when the exception is\n``SystemExit``.\n\nExceptions are identified by class instances. The ``except`` clause\nis selected depending on the class of the instance: it must reference\nthe class of the instance or a base class thereof. The instance can\nbe received by the handler and can carry additional information about\nthe exceptional condition.\n\nExceptions can also be identified by strings, in which case the\n``except`` clause is selected by object identity. An arbitrary value\ncan be raised along with the identifying string which can be passed to\nthe handler.\n\nNote: Messages to exceptions are not part of the Python API. Their\n contents may change from one version of Python to the next without\n warning and should not be relied on by code which will run under\n multiple versions of the interpreter.\n\nSee also the description of the ``try`` statement in section *The try\nstatement* and ``raise`` statement in section *The raise statement*.\n\n-[ Footnotes ]-\n\n[1] This limitation occurs because the code that is executed by these\n operations is not available at the time the module is compiled.\n', + 'execmodel': '\nExecution model\n***************\n\n\nNaming and binding\n==================\n\n*Names* refer to objects. Names are introduced by name binding\noperations. Each occurrence of a name in the program text refers to\nthe *binding* of that name established in the innermost function block\ncontaining the use.\n\nA *block* is a piece of Python program text that is executed as a\nunit. The following are blocks: a module, a function body, and a class\ndefinition. Each command typed interactively is a block. A script\nfile (a file given as standard input to the interpreter or specified\non the interpreter command line the first argument) is a code block.\nA script command (a command specified on the interpreter command line\nwith the \'**-c**\' option) is a code block. The file read by the\nbuilt-in function ``execfile()`` is a code block. The string argument\npassed to the built-in function ``eval()`` and to the ``exec``\nstatement is a code block. The expression read and evaluated by the\nbuilt-in function ``input()`` is a code block.\n\nA code block is executed in an *execution frame*. A frame contains\nsome administrative information (used for debugging) and determines\nwhere and how execution continues after the code block\'s execution has\ncompleted.\n\nA *scope* defines the visibility of a name within a block. If a local\nvariable is defined in a block, its scope includes that block. If the\ndefinition occurs in a function block, the scope extends to any blocks\ncontained within the defining one, unless a contained block introduces\na different binding for the name. The scope of names defined in a\nclass block is limited to the class block; it does not extend to the\ncode blocks of methods -- this includes generator expressions since\nthey are implemented using a function scope. This means that the\nfollowing will fail:\n\n class A:\n a = 42\n b = list(a + i for i in range(10))\n\nWhen a name is used in a code block, it is resolved using the nearest\nenclosing scope. The set of all such scopes visible to a code block\nis called the block\'s *environment*.\n\nIf a name is bound in a block, it is a local variable of that block.\nIf a name is bound at the module level, it is a global variable. (The\nvariables of the module code block are local and global.) If a\nvariable is used in a code block but not defined there, it is a *free\nvariable*.\n\nWhen a name is not found at all, a ``NameError`` exception is raised.\nIf the name refers to a local variable that has not been bound, a\n``UnboundLocalError`` exception is raised. ``UnboundLocalError`` is a\nsubclass of ``NameError``.\n\nThe following constructs bind names: formal parameters to functions,\n``import`` statements, class and function definitions (these bind the\nclass or function name in the defining block), and targets that are\nidentifiers if occurring in an assignment, ``for`` loop header, in the\nsecond position of an ``except`` clause header or after ``as`` in a\n``with`` statement. The ``import`` statement of the form ``from ...\nimport *`` binds all names defined in the imported module, except\nthose beginning with an underscore. This form may only be used at the\nmodule level.\n\nA target occurring in a ``del`` statement is also considered bound for\nthis purpose (though the actual semantics are to unbind the name). It\nis illegal to unbind a name that is referenced by an enclosing scope;\nthe compiler will report a ``SyntaxError``.\n\nEach assignment or import statement occurs within a block defined by a\nclass or function definition or at the module level (the top-level\ncode block).\n\nIf a name binding operation occurs anywhere within a code block, all\nuses of the name within the block are treated as references to the\ncurrent block. This can lead to errors when a name is used within a\nblock before it is bound. This rule is subtle. Python lacks\ndeclarations and allows name binding operations to occur anywhere\nwithin a code block. The local variables of a code block can be\ndetermined by scanning the entire text of the block for name binding\noperations.\n\nIf the global statement occurs within a block, all uses of the name\nspecified in the statement refer to the binding of that name in the\ntop-level namespace. Names are resolved in the top-level namespace by\nsearching the global namespace, i.e. the namespace of the module\ncontaining the code block, and the builtins namespace, the namespace\nof the module ``__builtin__``. The global namespace is searched\nfirst. If the name is not found there, the builtins namespace is\nsearched. The global statement must precede all uses of the name.\n\nThe builtins namespace associated with the execution of a code block\nis actually found by looking up the name ``__builtins__`` in its\nglobal namespace; this should be a dictionary or a module (in the\nlatter case the module\'s dictionary is used). By default, when in the\n``__main__`` module, ``__builtins__`` is the built-in module\n``__builtin__`` (note: no \'s\'); when in any other module,\n``__builtins__`` is an alias for the dictionary of the ``__builtin__``\nmodule itself. ``__builtins__`` can be set to a user-created\ndictionary to create a weak form of restricted execution.\n\n**CPython implementation detail:** Users should not touch\n``__builtins__``; it is strictly an implementation detail. Users\nwanting to override values in the builtins namespace should ``import``\nthe ``__builtin__`` (no \'s\') module and modify its attributes\nappropriately.\n\nThe namespace for a module is automatically created the first time a\nmodule is imported. The main module for a script is always called\n``__main__``.\n\nThe ``global`` statement has the same scope as a name binding\noperation in the same block. If the nearest enclosing scope for a\nfree variable contains a global statement, the free variable is\ntreated as a global.\n\nA class definition is an executable statement that may use and define\nnames. These references follow the normal rules for name resolution.\nThe namespace of the class definition becomes the attribute dictionary\nof the class. Names defined at the class scope are not visible in\nmethods.\n\n\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\nIf ``exec`` is used in a function and the function contains or is a\nnested block with free variables, the compiler will raise a\n``SyntaxError`` unless the exec explicitly specifies the local\nnamespace for the ``exec``. (In other words, ``exec obj`` would be\nillegal, but ``exec obj in ns`` would be legal.)\n\nThe ``eval()``, ``execfile()``, and ``input()`` functions and the\n``exec`` statement do not have access to the full environment for\nresolving names. Names may be resolved in the local and global\nnamespaces of the caller. Free variables are not resolved in the\nnearest enclosing namespace, but in the global namespace. [1] The\n``exec`` statement and the ``eval()`` and ``execfile()`` functions\nhave optional arguments to override the global and local namespace.\nIf only one namespace is specified, it is used for both.\n\n\nExceptions\n==========\n\nExceptions are a means of breaking out of the normal flow of control\nof a code block in order to handle errors or other exceptional\nconditions. An exception is *raised* at the point where the error is\ndetected; it may be *handled* by the surrounding code block or by any\ncode block that directly or indirectly invoked the code block where\nthe error occurred.\n\nThe Python interpreter raises an exception when it detects a run-time\nerror (such as division by zero). A Python program can also\nexplicitly raise an exception with the ``raise`` statement. Exception\nhandlers are specified with the ``try`` ... ``except`` statement. The\n``finally`` clause of such a statement can be used to specify cleanup\ncode which does not handle the exception, but is executed whether an\nexception occurred or not in the preceding code.\n\nPython uses the "termination" model of error handling: an exception\nhandler can find out what happened and continue execution at an outer\nlevel, but it cannot repair the cause of the error and retry the\nfailing operation (except by re-entering the offending piece of code\nfrom the top).\n\nWhen an exception is not handled at all, the interpreter terminates\nexecution of the program, or returns to its interactive main loop. In\neither case, it prints a stack backtrace, except when the exception is\n``SystemExit``.\n\nExceptions are identified by class instances. The ``except`` clause\nis selected depending on the class of the instance: it must reference\nthe class of the instance or a base class thereof. The instance can\nbe received by the handler and can carry additional information about\nthe exceptional condition.\n\nExceptions can also be identified by strings, in which case the\n``except`` clause is selected by object identity. An arbitrary value\ncan be raised along with the identifying string which can be passed to\nthe handler.\n\nNote: Messages to exceptions are not part of the Python API. Their\n contents may change from one version of Python to the next without\n warning and should not be relied on by code which will run under\n multiple versions of the interpreter.\n\nSee also the description of the ``try`` statement in section *The try\nstatement* and ``raise`` statement in section *The raise statement*.\n\n-[ Footnotes ]-\n\n[1] This limitation occurs because the code that is executed by these\n operations is not available at the time the module is compiled.\n', + '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 of floating point numbers can\nlook like octal integers, but are interpreted using radix 10. For\nexample, ``077e010`` is legal, and denotes the same number as\n``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, and then the suite is executed. When the items are\nexhausted (which is immediately when the sequence is empty), the suite\nin the ``else`` clause, if present, is executed, and the loop\nterminates.\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\nThe target list is not deleted when the loop is finished, but if the\nsequence is empty, it will not have been assigned to at all by the\nloop. Hint: the built-in function ``range()`` returns a sequence of\nintegers suitable to emulate the effect of Pascal\'s ``for i := a to b\ndo``; e.g., ``range(3)`` returns the list ``[0, 1, 2]``.\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 internal\n counter is used to keep track of which item is used next, and this\n is incremented on each iteration. When this counter has reached the\n length of the sequence the loop terminates. This means that if the\n suite deletes the current (or a previous) item from the sequence,\n the next item will be skipped (since it gets the index of the\n 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 ::= +\n conversion ::= "r" | "s"\n format_spec ::= \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 2.7: 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\nTwo conversion flags are currently supported: ``\'!s\'`` which calls\n``str()`` on the value, and ``\'!r\'`` which calls ``repr()``.\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\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 ::= \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 is only valid for integers, and only for binary,\noctal, or hexadecimal output. If present, it specifies that the\noutput will be prefixed by ``\'0b\'``, ``\'0o\'``, or ``\'0x\'``,\nrespectively.\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 2.7: 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\'``. |\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 | The same as ``\'g\'``. |\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\') # 2.7+ 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(object):\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.5\n >>> total = 22\n >>> \'Correct answers: {:.2%}\'.format(points/total)\n \'Correct answers: 88.64%\'\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),\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 decorated ::= decorators (classdef | funcdef)\n decorators ::= decorator+\n decorator ::= "@" dotted_name ["(" [argument_list [","]] ")"] NEWLINE\n funcdef ::= "def" funcname "(" [parameter_list] ")" ":" suite\n dotted_name ::= identifier ("." identifier)*\n parameter_list ::= (defparameter ",")*\n ( "*" identifier [, "**" identifier]\n | "**" identifier\n | defparameter [","] )\n defparameter ::= parameter ["=" expression]\n sublist ::= parameter ("," parameter)* [","]\n parameter ::= identifier | "(" sublist ")"\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 top-level 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 must also have a default value --- this is a syntactic\nrestriction 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.\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.\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', + '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 an\n``exec`` statement does not affect the code block *containing* the\n``exec`` statement, and code contained in an ``exec`` statement is\nunaffected by ``global`` statements in the code containing the\n``exec`` statement. The same applies to the ``eval()``,\n``execfile()`` 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 ``__builtin__`` module.\n When not in interactive mode, ``_`` has no special meaning and is\n not 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\n identifier ::= (letter|"_") (letter | digit | "_")*\n letter ::= lowercase | uppercase\n lowercase ::= "a"..."z"\n uppercase ::= "A"..."Z"\n digit ::= "0"..."9"\n\nIdentifiers are unlimited in length. Case is significant.\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 and del from not while\n as elif global or with\n assert else if pass yield\n break except import print\n class exec in raise\n continue finally is return\n def for lambda try\n\nChanged in version 2.4: ``None`` became a constant and is now\nrecognized by the compiler as a name for the built-in object ``None``.\nAlthough it is not a keyword, you cannot assign a different object to\nit.\n\nChanged in version 2.5: Using ``as`` and ``with`` as identifiers\ntriggers a warning. To use them as keywords, enable the\n``with_statement`` future feature .\n\nChanged in version 2.6: ``as`` and ``with`` are full keywords.\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 ``__builtin__`` module.\n When not in interactive mode, ``_`` has no special meaning and is\n not 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.\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.\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. If the\nwild card form of import --- ``import *`` --- is used in a function\nand the function contains or is a nested block with free variables,\nthe compiler will 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 2.6 are ``unicode_literals``,\n``print_function``, ``absolute_import``, ``division``, ``generators``,\n``nested_scopes`` and ``with_statement``. ``generators``,\n``with_statement``, ``nested_scopes`` are redundant in Python version\n2.6 and above because they are always enabled.\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 an ``exec`` statement or calls to the built-in\nfunctions ``compile()`` and ``execfile()`` that occur in a module\n``M`` containing a future statement will, by default, use the new\nsyntax or semantics associated with the future statement. This can,\nstarting with Python 2.2 be controlled by optional arguments to\n``compile()`` --- see the documentation of that function for 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 forms ``<>`` and ``!=`` are equivalent; for consistency with C,\n``!=`` is preferred; where ``!=`` is mentioned below ``<>`` is also\naccepted. The ``<>`` spelling is considered obsolescent.\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,\nobjects of different types *always* compare unequal, and are ordered\nconsistently but arbitrarily. You can control comparison behavior of\nobjects of non-built-in types by defining a ``__cmp__`` method or rich\ncomparison methods like ``__gt__``, described in section *Special\nmethod names*.\n\n(This unusual definition of comparison was used to simplify the\ndefinition of operations like sorting and the ``in`` and ``not in``\noperators. In the future, the comparison rules for objects of\ndifferent types are likely to change.)\n\nComparison of objects of the same type depends on the type:\n\n* Numbers are compared arithmetically.\n\n* Strings are compared lexicographically using the numeric equivalents\n (the result of the built-in function ``ord()``) of their characters.\n Unicode and 8-bit strings are fully interoperable in this behavior.\n [4]\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, ``cmp([1,2,x], [1,2,y])`` returns\n the same as ``cmp(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 their sorted\n (key, value) lists compare equal. [5] Outcomes other than equality\n are resolved consistently, but are not otherwise defined. [6]\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\nThe operators ``in`` and ``not in`` test for collection membership.\n``x in s`` evaluates to true if *x* is a member of the collection *s*,\nand false otherwise. ``x not in s`` returns the negation of ``x in\ns``. The collection membership test has traditionally been bound to\nsequences; an object is a member of a collection if the collection is\na sequence and contains an element equal to that object. However, it\nmake sense for many other object types to support membership tests\nwithout being a sequence. In particular, dictionaries (for keys) and\nsets support membership testing.\n\nFor the list and tuple types, ``x in y`` is true if and only if there\nexists an index *i* such that ``x == y[i]`` is true.\n\nFor the Unicode and string types, ``x in y`` is true if and only if\n*x* is a substring of *y*. An equivalent test is ``y.find(x) != -1``.\nNote, *x* and *y* need not be the same type; consequently, ``u\'ab\' in\n\'abc\'`` will return ``True``. Empty strings are always considered to\nbe a substring of any other string, so ``"" in "abc"`` will return\n``True``.\n\nChanged in version 2.3: Previously, *x* was required to be a string of\nlength ``1``.\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. [7]\n', + 'integers': '\nInteger and long integer literals\n*********************************\n\nInteger and long integer literals are described by the following\nlexical definitions:\n\n longinteger ::= integer ("l" | "L")\n integer ::= decimalinteger | octinteger | hexinteger | bininteger\n decimalinteger ::= nonzerodigit digit* | "0"\n octinteger ::= "0" ("o" | "O") octdigit+ | "0" octdigit+\n hexinteger ::= "0" ("x" | "X") hexdigit+\n bininteger ::= "0" ("b" | "B") bindigit+\n nonzerodigit ::= "1"..."9"\n octdigit ::= "0"..."7"\n bindigit ::= "0" | "1"\n hexdigit ::= digit | "a"..."f" | "A"..."F"\n\nAlthough both lower case ``\'l\'`` and upper case ``\'L\'`` are allowed as\nsuffix for long integers, it is strongly recommended to always use\n``\'L\'``, since the letter ``\'l\'`` looks too much like the digit\n``\'1\'``.\n\nPlain integer literals that are above the largest representable plain\ninteger (e.g., 2147483647 when using 32-bit arithmetic) are accepted\nas if they were long integers instead. [1] There is no limit for long\ninteger literals apart from what can be stored in available memory.\n\nSome examples of plain integer literals (first row) and long integer\nliterals (second and third rows):\n\n 7 2147483647 0177\n 3L 79228162514264337593543950336L 0377L 0x100000000L\n 79228162514264337593543950336 0xdeadbeef\n', + 'lambda': '\nLambdas\n*******\n\n lambda_form ::= "lambda" [parameter_list]: expression\n old_lambda_form ::= "lambda" [parameter_list]: old_expression\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 name(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.\n', + 'lists': '\nList displays\n*************\n\nA list display is a possibly empty series of expressions enclosed in\nsquare brackets:\n\n list_display ::= "[" [expression_list | list_comprehension] "]"\n list_comprehension ::= expression list_for\n list_for ::= "for" target_list "in" old_expression_list [list_iter]\n old_expression_list ::= old_expression [("," old_expression)+ [","]]\n old_expression ::= or_test | old_lambda_form\n list_iter ::= list_for | list_if\n list_if ::= "if" old_expression [list_iter]\n\nA list display yields a new list object. Its contents are specified\nby providing either a list of expressions or a list comprehension.\nWhen a comma-separated list of expressions is supplied, its elements\nare evaluated from left to right and placed into the list object in\nthat order. When a list comprehension is supplied, it consists of a\nsingle expression followed by at least one ``for`` clause and zero or\nmore ``for`` or ``if`` clauses. In this case, the elements of the new\nlist are those that would be produced by considering each of the\n``for`` or ``if`` clauses a block, nesting from left to right, and\nevaluating the expression to produce a list element each time the\ninnermost block is reached [1].\n', + 'naming': "\nNaming and binding\n******************\n\n*Names* refer to objects. Names are introduced by name binding\noperations. Each occurrence of a name in the program text refers to\nthe *binding* of that name established in the innermost function block\ncontaining the use.\n\nA *block* is a piece of Python program text that is executed as a\nunit. The following are blocks: a module, a function body, and a class\ndefinition. Each command typed interactively is a block. A script\nfile (a file given as standard input to the interpreter or specified\non the interpreter command line the first argument) is a code block.\nA script command (a command specified on the interpreter command line\nwith the '**-c**' option) is a code block. The file read by the\nbuilt-in function ``execfile()`` is a code block. The string argument\npassed to the built-in function ``eval()`` and to the ``exec``\nstatement is a code block. The expression read and evaluated by the\nbuilt-in function ``input()`` is a code block.\n\nA code block is executed in an *execution frame*. A frame contains\nsome administrative information (used for debugging) and determines\nwhere and how execution continues after the code block's execution has\ncompleted.\n\nA *scope* defines the visibility of a name within a block. If a local\nvariable is defined in a block, its scope includes that block. If the\ndefinition occurs in a function block, the scope extends to any blocks\ncontained within the defining one, unless a contained block introduces\na different binding for the name. The scope of names defined in a\nclass block is limited to the class block; it does not extend to the\ncode blocks of methods -- this includes generator expressions since\nthey are implemented using a function scope. This means that the\nfollowing will fail:\n\n class A:\n a = 42\n b = list(a + i for i in range(10))\n\nWhen a name is used in a code block, it is resolved using the nearest\nenclosing scope. The set of all such scopes visible to a code block\nis called the block's *environment*.\n\nIf a name is bound in a block, it is a local variable of that block.\nIf a name is bound at the module level, it is a global variable. (The\nvariables of the module code block are local and global.) If a\nvariable is used in a code block but not defined there, it is a *free\nvariable*.\n\nWhen a name is not found at all, a ``NameError`` exception is raised.\nIf the name refers to a local variable that has not been bound, a\n``UnboundLocalError`` exception is raised. ``UnboundLocalError`` is a\nsubclass of ``NameError``.\n\nThe following constructs bind names: formal parameters to functions,\n``import`` statements, class and function definitions (these bind the\nclass or function name in the defining block), and targets that are\nidentifiers if occurring in an assignment, ``for`` loop header, in the\nsecond position of an ``except`` clause header or after ``as`` in a\n``with`` statement. The ``import`` statement of the form ``from ...\nimport *`` binds all names defined in the imported module, except\nthose beginning with an underscore. This form may only be used at the\nmodule level.\n\nA target occurring in a ``del`` statement is also considered bound for\nthis purpose (though the actual semantics are to unbind the name). It\nis illegal to unbind a name that is referenced by an enclosing scope;\nthe compiler will report a ``SyntaxError``.\n\nEach assignment or import statement occurs within a block defined by a\nclass or function definition or at the module level (the top-level\ncode block).\n\nIf a name binding operation occurs anywhere within a code block, all\nuses of the name within the block are treated as references to the\ncurrent block. This can lead to errors when a name is used within a\nblock before it is bound. This rule is subtle. Python lacks\ndeclarations and allows name binding operations to occur anywhere\nwithin a code block. The local variables of a code block can be\ndetermined by scanning the entire text of the block for name binding\noperations.\n\nIf the global statement occurs within a block, all uses of the name\nspecified in the statement refer to the binding of that name in the\ntop-level namespace. Names are resolved in the top-level namespace by\nsearching the global namespace, i.e. the namespace of the module\ncontaining the code block, and the builtins namespace, the namespace\nof the module ``__builtin__``. The global namespace is searched\nfirst. If the name is not found there, the builtins namespace is\nsearched. The global statement must precede all uses of the name.\n\nThe builtins namespace associated with the execution of a code block\nis actually found by looking up the name ``__builtins__`` in its\nglobal namespace; this should be a dictionary or a module (in the\nlatter case the module's dictionary is used). By default, when in the\n``__main__`` module, ``__builtins__`` is the built-in module\n``__builtin__`` (note: no 's'); when in any other module,\n``__builtins__`` is an alias for the dictionary of the ``__builtin__``\nmodule itself. ``__builtins__`` can be set to a user-created\ndictionary to create a weak form of restricted execution.\n\n**CPython implementation detail:** Users should not touch\n``__builtins__``; it is strictly an implementation detail. Users\nwanting to override values in the builtins namespace should ``import``\nthe ``__builtin__`` (no 's') module and modify its attributes\nappropriately.\n\nThe namespace for a module is automatically created the first time a\nmodule is imported. The main module for a script is always called\n``__main__``.\n\nThe ``global`` statement has the same scope as a name binding\noperation in the same block. If the nearest enclosing scope for a\nfree variable contains a global statement, the free variable is\ntreated as a global.\n\nA class definition is an executable statement that may use and define\nnames. These references follow the normal rules for name resolution.\nThe namespace of the class definition becomes the attribute dictionary\nof the class. Names defined at the class scope are not visible in\nmethods.\n\n\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\nIf ``exec`` is used in a function and the function contains or is a\nnested block with free variables, the compiler will raise a\n``SyntaxError`` unless the exec explicitly specifies the local\nnamespace for the ``exec``. (In other words, ``exec obj`` would be\nillegal, but ``exec obj in ns`` would be legal.)\n\nThe ``eval()``, ``execfile()``, and ``input()`` functions and the\n``exec`` statement do not have access to the full environment for\nresolving names. Names may be resolved in the local and global\nnamespaces of the caller. Free variables are not resolved in the\nnearest enclosing namespace, but in the global namespace. [1] The\n``exec`` statement and the ``eval()`` and ``execfile()`` functions\nhave optional arguments to override the global and local namespace.\nIf only one namespace is specified, it is used for both.\n", + 'numbers': "\nNumeric literals\n****************\n\nThere are four types of numeric literals: plain integers, long\nintegers, floating point numbers, and imaginary numbers. There are no\ncomplex literals (complex numbers can be formed by adding a real\nnumber and an imaginary 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.__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 (``+``, ``-``, ``*``, ``//``, ``%``, ``divmod()``,\n ``pow()``, ``**``, ``<<``, ``>>``, ``&``, ``^``, ``|``). For\n instance, to evaluate the expression ``x + y``, where *x* is an\n 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__()`` (described below). Note\n that ``__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.__div__(self, other)\nobject.__truediv__(self, other)\n\n The division operator (``/``) is implemented by these methods. The\n ``__truediv__()`` method is used when ``__future__.division`` is in\n effect, otherwise ``__div__()`` is used. If only one of these two\n methods is defined, the object will not support division in the\n alternate context; ``TypeError`` will be raised instead.\n\nobject.__radd__(self, other)\nobject.__rsub__(self, other)\nobject.__rmul__(self, other)\nobject.__rdiv__(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 (``+``, ``-``, ``*``, ``/``, ``%``, ``divmod()``,\n ``pow()``, ``**``, ``<<``, ``>>``, ``&``, ``^``, ``|``) with\n reflected (swapped) operands. These functions are only called if\n the left operand does not support the corresponding operation and\n the operands are of different types. [2] For instance, to evaluate\n the expression ``x - y``, where *y* is an instance of a class that\n has an ``__rsub__()`` method, ``y.__rsub__(x)`` is called if\n ``x.__sub__(y)`` returns *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.__idiv__(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.__long__(self)\nobject.__float__(self)\n\n Called to implement the built-in functions ``complex()``,\n ``int()``, ``long()``, and ``float()``. Should return a value of\n the appropriate type.\n\nobject.__oct__(self)\nobject.__hex__(self)\n\n Called to implement the built-in functions ``oct()`` and ``hex()``.\n Should return a string value.\n\nobject.__index__(self)\n\n Called to implement ``operator.index()``. Also called whenever\n Python needs an integer object (such as in slicing). Must return\n an integer (int or long).\n\n New in version 2.5.\n\nobject.__coerce__(self, other)\n\n Called to implement "mixed-mode" numeric arithmetic. Should either\n return a 2-tuple containing *self* and *other* converted to a\n common numeric type, or ``None`` if conversion is impossible. When\n the common type would be the type of ``other``, it is sufficient to\n return ``None``, since the interpreter will also ask the other\n object to attempt a coercion (but sometimes, if the implementation\n of the other type cannot be changed, it is useful to do the\n conversion to the other type here). A return value of\n ``NotImplemented`` is equivalent to returning ``None``.\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 provides a convenient way to do\nthis.\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+-------------------------------------------------+---------------------------------------+\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| | [8] |\n+-------------------------------------------------+---------------------------------------+\n| ``+x``, ``-x``, ``~x`` | Positive, negative, bitwise NOT |\n+-------------------------------------------------+---------------------------------------+\n| ``**`` | Exponentiation [9] |\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, string |\n| | conversion |\n+-------------------------------------------------+---------------------------------------+\n\n-[ Footnotes ]-\n\n[1] In Python 2.3 and later releases, a list comprehension "leaks" the\n control variables of each ``for`` it contains into the containing\n scope. However, this behavior is deprecated, and relying on it\n will not work in Python 3.0\n\n[2] 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[3] If x is very close to an exact integer multiple of y, it\'s\n possible for ``floor(x/y)`` to be one larger than ``(x-x%y)/y``\n due to rounding. In such cases, Python returns the latter result,\n in order to preserve that ``divmod(x,y)[0] * y + x % y`` be very\n close to ``x``.\n\n[4] While comparisons between unicode strings make sense at the byte\n level, they may be counter-intuitive to users. For example, the\n strings ``u"\\u00C7"`` and ``u"\\u0043\\u0327"`` compare differently,\n even 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[5] The implementation computes this efficiently, without constructing\n lists or sorting.\n\n[6] Earlier versions of Python used lexicographic comparison of the\n sorted (key, value) lists, but this was very expensive for the\n common case of comparing for equality. An even earlier version of\n Python compared dictionaries by identity only, but this caused\n surprises because people expected to be able to test a dictionary\n for emptiness by comparing it to ``{}``.\n\n[7] 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[8] The ``%`` operator is also used for string formatting; the same\n precedence applies.\n\n[9] 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. The result type is that of the\narguments after coercion.\n\nWith mixed operand types, the coercion rules for binary arithmetic\noperators apply. For int and long int operands, the result has the\nsame type as the operands (after coercion) unless the second argument\nis negative; in that case, all arguments are converted to float and a\nfloat result is delivered. For example, ``10**2`` returns ``100``, but\n``10**-2`` returns ``0.01``. (This last feature was added in Python\n2.2. In Python 2.1 and before, if both arguments were of integer types\nand the second argument was negative, an exception was raised).\n\nRaising ``0.0`` to a negative power results in a\n``ZeroDivisionError``. Raising a negative number to a fractional power\nresults in a ``ValueError``.\n', + 'raise': '\nThe ``raise`` statement\n***********************\n\n raise_stmt ::= "raise" [expression ["," expression ["," 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 ``TypeError`` exception is raised indicating that\nthis is an error (if running under IDLE, a ``Queue.Empty`` exception\nis raised instead).\n\nOtherwise, ``raise`` evaluates the expressions to get three objects,\nusing ``None`` as the value of omitted expressions. The first two\nobjects are used to determine the *type* and *value* of the exception.\n\nIf the first object is an instance, the type of the exception is the\nclass of the instance, the instance itself is the value, and the\nsecond object must be ``None``.\n\nIf the first object is a class, it becomes the type of the exception.\nThe second object is used to determine the exception value: If it is\nan instance of the class, the instance becomes the exception value. If\nthe second object is a tuple, it is used as the argument list for the\nclass constructor; if it is ``None``, an empty argument list is used,\nand any other object is treated as a single argument to the\nconstructor. The instance so created by calling the constructor is\nused as the exception value.\n\nIf a third object is present and not ``None``, it must be a traceback\nobject (see section *The standard type hierarchy*), and it is\nsubstituted instead of the current location as the place where the\nexception occurred. If the third object is present and not a\ntraceback object or ``None``, a ``TypeError`` exception is raised.\nThe three-expression form of ``raise`` is useful to re-raise an\nexception transparently in an except clause, but ``raise`` with no\nexpressions should be preferred if the exception to be re-raised was\nthe most recently active exception in the current scope.\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', + '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. (For backwards compatibility, the method\n``__getslice__()`` (see below) can also be defined to handle simple,\nbut not extended slices.) It is also recommended that mappings provide\nthe methods ``keys()``, ``values()``, ``items()``, ``has_key()``,\n``get()``, ``clear()``, ``setdefault()``, ``iterkeys()``,\n``itervalues()``, ``iteritems()``, ``pop()``, ``popitem()``,\n``copy()``, and ``update()`` behaving similar to those for Python's\nstandard dictionary objects. The ``UserDict`` module provides a\n``DictMixin`` class to help create those methods from a base set of\n``__getitem__()``, ``__setitem__()``, ``__delitem__()``, and\n``keys()``. Mutable sequences should provide methods ``append()``,\n``count()``, ``index()``, ``extend()``, ``insert()``, ``pop()``,\n``remove()``, ``reverse()`` and ``sort()``, like Python standard list\nobjects. Finally, sequence types should implement addition (meaning\nconcatenation) and multiplication (meaning repetition) by defining the\nmethods ``__add__()``, ``__radd__()``, ``__iadd__()``, ``__mul__()``,\n``__rmul__()`` and ``__imul__()`` described below; they should not\ndefine ``__coerce__()`` or other numerical operators. It is\nrecommended that both mappings and sequences implement the\n``__contains__()`` method to allow efficient use of the ``in``\noperator; for mappings, ``in`` should be equivalent of ``has_key()``;\nfor sequences, 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``iterkeys()``; 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 ``__nonzero__()`` method and whose\n ``__len__()`` method returns zero is considered to be false in a\n Boolean context.\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 ``iterkeys()``.\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\n New in version 2.6.\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 plain or long integers as arguments. The\narguments are converted to a common type. 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,\nn)``. Negative shift counts raise a ``ValueError`` exception.\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 ::= simple_slicing | extended_slicing\n simple_slicing ::= primary "[" short_slice "]"\n extended_slicing ::= primary "[" slice_list "]"\n slice_list ::= slice_item ("," slice_item)* [","]\n slice_item ::= expression | proper_slice | ellipsis\n proper_slice ::= short_slice | long_slice\n short_slice ::= [lower_bound] ":" [upper_bound]\n long_slice ::= short_slice ":" [stride]\n lower_bound ::= expression\n upper_bound ::= expression\n stride ::= expression\n ellipsis ::= "..."\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 nor ellipses). Similarly, when the slice\nlist has exactly one short slice and no trailing comma, the\ninterpretation as a simple slicing takes priority over that as an\nextended slicing.\n\nThe semantics for a simple slicing are as follows. The primary must\nevaluate to a sequence object. The lower and upper bound expressions,\nif present, must evaluate to plain integers; defaults are zero and the\n``sys.maxint``, respectively. If either bound is negative, the\nsequence\'s length is added to it. The slicing now selects all items\nwith index *k* such that ``i <= k < j`` where *i* and *j* are the\nspecified lower and upper bounds. This may be an empty sequence. It\nis not an error if *i* or *j* lie outside the range of valid indexes\n(such items don\'t exist so they aren\'t selected).\n\nThe semantics for an extended slicing are as follows. The primary\nmust evaluate to a mapping object, and it is indexed with a key that\nis constructed 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 an ellipsis slice\nitem is the built-in ``Ellipsis`` object. The conversion of a proper\nslice is a slice object (see section *The standard type hierarchy*)\nwhose ``start``, ``stop`` and ``step`` attributes are the values of\nthe expressions 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\nobject.__methods__\n\n Deprecated since version 2.2: Use the built-in function ``dir()``\n to get a list of an object\'s attributes. This attribute is no\n longer available.\n\nobject.__members__\n\n Deprecated since version 2.2: Use the built-in function ``dir()``\n to get a list of an object\'s attributes. This attribute is no\n longer available.\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\nThe following attributes are only supported by *new-style class*es.\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 new-style class keeps a list of weak references to its\n immediate subclasses. This method returns a list of all those\n references still alive. Example:\n\n >>> int.__subclasses__()\n []\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\n[6] The advantage of leaving the newline on is that returning an empty\n string is then an unambiguous EOF indication. It is also possible\n (in cases where it might matter, for example, if you want to make\n an exact copy of a file while scanning its lines) to tell whether\n the last line of a file ended in a newline or not (yes this\n happens!).\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 ``x.__getitem__(i)`` for\nold-style classes and ``type(x).__getitem__(x, i)`` for new-style\nclasses. Except where mentioned, attempts to execute an operation\nraise an 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_traceback`` 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.exc_traceback`` or ``sys.last_traceback``. Circular\n references which are garbage are detected when the option cycle\n detector is enabled (it\'s on by default), but can only be cleaned\n up if there are no Python-level ``__del__()`` methods involved.\n Refer to the documentation for the ``gc`` module for more\n information about how ``__del__()`` methods are handled by the\n cycle detector, particularly the description of the ``garbage``\n 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\n See also the *-R* command-line option.\n\nobject.__repr__(self)\n\n Called by the ``repr()`` built-in function and by string\n conversions (reverse quotes) to compute the "official" string\n representation of an object. If at all possible, this should look\n like a valid Python expression that could be used to recreate an\n object with the same value (given an appropriate environment). If\n this is not possible, a string of the form ``<...some useful\n description...>`` should be returned. The return value must be a\n string object. If a class defines ``__repr__()`` but not\n ``__str__()``, then ``__repr__()`` is also used when an "informal"\n string representation of instances of that class is 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 statement 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.__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 New in version 2.1.\n\n These are the so-called "rich comparison" methods, and are called\n for comparison operators in preference to ``__cmp__()`` below. The\n correspondence between operator symbols and method names is as\n follows: ``xy`` call ``x.__ne__(y)``, ``x>y`` calls ``x.__gt__(y)``, and\n ``x>=y`` calls ``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.__cmp__(self, other)\n\n Called by comparison operations if rich comparison (see above) is\n not defined. Should return a negative integer if ``self < other``,\n zero if ``self == other``, a positive integer if ``self > other``.\n If no ``__cmp__()``, ``__eq__()`` or ``__ne__()`` operation is\n defined, class instances are compared by object identity\n ("address"). See also the description of ``__hash__()`` for some\n important notes on creating *hashable* objects which support custom\n comparison operations and are usable as dictionary keys. (Note: the\n restriction that exceptions are not propagated by ``__cmp__()`` has\n been removed since Python 1.5.)\n\nobject.__rcmp__(self, other)\n\n Changed in version 2.1: No longer supported.\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 a ``__cmp__()`` or ``__eq__()`` method\n it should not define a ``__hash__()`` operation either; if it\n defines ``__cmp__()`` or ``__eq__()`` but not ``__hash__()``, its\n instances will not be usable in hashed collections. If a class\n defines mutable objects and implements a ``__cmp__()`` or\n ``__eq__()`` method, it should not implement ``__hash__()``, since\n hashable collection implementations require that a object\'s hash\n value is immutable (if the object\'s hash value changes, it will be\n in the wrong hash bucket).\n\n User-defined classes have ``__cmp__()`` 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 ``__cmp__()`` or ``__eq__()`` such that\n the hash value returned is no longer appropriate (e.g. by switching\n to a value-based concept of equality instead of the default\n identity based equality) can explicitly flag themselves as being\n unhashable by setting ``__hash__ = None`` in the class definition.\n Doing so means that not only will instances of the class raise an\n appropriate ``TypeError`` when a program attempts to retrieve their\n hash value, but they will also be correctly identified as\n unhashable when checking ``isinstance(obj, collections.Hashable)``\n (unlike classes which define their own ``__hash__()`` to explicitly\n raise ``TypeError``).\n\n Changed in version 2.5: ``__hash__()`` may now also return a long\n integer object; the 32-bit integer is then derived from the hash of\n that object.\n\n Changed in version 2.6: ``__hash__`` may now be set to ``None`` to\n explicitly flag instances of a class as unhashable.\n\nobject.__nonzero__(self)\n\n Called to implement truth value testing and the built-in operation\n ``bool()``; should return ``False`` or ``True``, or their integer\n equivalents ``0`` or ``1``. When this method is not defined,\n ``__len__()`` is called, if it is defined, and the object is\n considered true if its result is nonzero. If a class defines\n neither ``__len__()`` nor ``__nonzero__()``, all its instances are\n considered true.\n\nobject.__unicode__(self)\n\n Called to implement ``unicode()`` built-in; should return a Unicode\n object. When this method is not defined, string conversion is\n attempted, and the result of string conversion is converted to\n Unicode using the system default encoding.\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 in new-style classes.\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 not simply execute ``self.name = value`` --- this would\n cause a recursive call to itself. Instead, it should insert the\n value in the dictionary of instance attributes, e.g.,\n ``self.__dict__[name] = value``. For new-style classes, rather\n than accessing the instance dictionary, it should call the base\n 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\n\nMore attribute access for new-style classes\n-------------------------------------------\n\nThe following methods only apply to new-style classes.\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 for new-style\n classes*.\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. Note that descriptors are only invoked for new\nstyle objects or classes (ones that subclass ``object()`` or\n``type()``).\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 a new-style object instance, ``a.x`` is transformed\n into the call: ``type(a).__dict__[\'x\'].__get__(a, type(a))``.\n\nClass Binding\n If binding to a new-style class, ``A.x`` is transformed into the\n call: ``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 both old and new-style classes have a\ndictionary for attribute storage. This wastes space for objects\nhaving very few instance variables. The space consumption can become\nacute when creating large numbers of instances.\n\nThe default can be overridden by defining *__slots__* in a new-style\nclass definition. The *__slots__* declaration takes a sequence of\ninstance variables and reserves just enough space in each instance to\nhold a value for each variable. Space is saved because *__dict__* is\nnot created for each instance.\n\n__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 new-style class, *__slots__* reserves space for the declared\n variables and prevents the automatic creation of *__dict__* and\n *__weakref__* for each instance.\n\n New in version 2.2.\n\nNotes on using *__slots__*\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 Changed in version 2.3: Previously, adding ``\'__dict__\'`` to the\n *__slots__* declaration would not enable the assignment of new\n attributes not specifically listed in the sequence of instance\n variable names.\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 Changed in version 2.3: Previously, adding ``\'__weakref__\'`` to the\n *__slots__* declaration would not enable support for weak\n references.\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 ``long``, ``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 Changed in version 2.6: Previously, *__class__* assignment raised an\n error if either new or old class had *__slots__*.\n\n\nCustomizing class creation\n==========================\n\nBy default, new-style classes are constructed using ``type()``. A\nclass definition is read into a separate namespace and the value of\nclass name is bound to the result of ``type(name, bases, dict)``.\n\nWhen the class definition is read, if *__metaclass__* is defined then\nthe callable assigned to it will be called instead of ``type()``. 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\n__metaclass__\n\n This variable can be any callable accepting arguments for ``name``,\n ``bases``, and ``dict``. Upon class creation, the callable is used\n instead of the built-in ``type()``.\n\n New in version 2.2.\n\nThe appropriate metaclass is determined by the following precedence\nrules:\n\n* If ``dict[\'__metaclass__\']`` exists, it is used.\n\n* Otherwise, if there is at least one base class, its metaclass is\n used (this looks for a *__class__* attribute first and if not found,\n uses its type).\n\n* Otherwise, if a global variable named __metaclass__ exists, it is\n used.\n\n* Otherwise, the old-style, classic metaclass (types.ClassType) is\n 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\n\nCustomizing instance and subclass checks\n========================================\n\nNew in version 2.6.\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. (For backwards compatibility, the method\n``__getslice__()`` (see below) can also be defined to handle simple,\nbut not extended slices.) It is also recommended that mappings provide\nthe methods ``keys()``, ``values()``, ``items()``, ``has_key()``,\n``get()``, ``clear()``, ``setdefault()``, ``iterkeys()``,\n``itervalues()``, ``iteritems()``, ``pop()``, ``popitem()``,\n``copy()``, and ``update()`` behaving similar to those for Python\'s\nstandard dictionary objects. The ``UserDict`` module provides a\n``DictMixin`` class to help create those methods from a base set of\n``__getitem__()``, ``__setitem__()``, ``__delitem__()``, and\n``keys()``. Mutable sequences should provide methods ``append()``,\n``count()``, ``index()``, ``extend()``, ``insert()``, ``pop()``,\n``remove()``, ``reverse()`` and ``sort()``, like Python standard list\nobjects. Finally, sequence types should implement addition (meaning\nconcatenation) and multiplication (meaning repetition) by defining the\nmethods ``__add__()``, ``__radd__()``, ``__iadd__()``, ``__mul__()``,\n``__rmul__()`` and ``__imul__()`` described below; they should not\ndefine ``__coerce__()`` or other numerical operators. It is\nrecommended that both mappings and sequences implement the\n``__contains__()`` method to allow efficient use of the ``in``\noperator; for mappings, ``in`` should be equivalent of ``has_key()``;\nfor sequences, 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``iterkeys()``; 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 ``__nonzero__()`` method and whose\n ``__len__()`` method returns zero is considered to be false in a\n Boolean context.\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 ``iterkeys()``.\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\n New in version 2.6.\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\nAdditional methods for emulation of sequence types\n==================================================\n\nThe following optional methods can be defined to further emulate\nsequence objects. Immutable sequences methods should at most only\ndefine ``__getslice__()``; mutable sequences might define all three\nmethods.\n\nobject.__getslice__(self, i, j)\n\n Deprecated since version 2.0: Support slice objects as parameters\n to the ``__getitem__()`` method. (However, built-in types in\n CPython currently still implement ``__getslice__()``. Therefore,\n you have to override it in derived classes when implementing\n slicing.)\n\n Called to implement evaluation of ``self[i:j]``. The returned\n object should be of the same type as *self*. Note that missing *i*\n or *j* in the slice expression are replaced by zero or\n ``sys.maxint``, respectively. If negative indexes are used in the\n slice, the length of the sequence is added to that index. If the\n instance does not implement the ``__len__()`` method, an\n ``AttributeError`` is raised. No guarantee is made that indexes\n adjusted this way are not still negative. Indexes which are\n greater than the length of the sequence are not modified. If no\n ``__getslice__()`` is found, a slice object is created instead, and\n passed to ``__getitem__()`` instead.\n\nobject.__setslice__(self, i, j, sequence)\n\n Called to implement assignment to ``self[i:j]``. Same notes for *i*\n and *j* as for ``__getslice__()``.\n\n This method is deprecated. If no ``__setslice__()`` is found, or\n for extended slicing of the form ``self[i:j:k]``, a slice object is\n created, and passed to ``__setitem__()``, instead of\n ``__setslice__()`` being called.\n\nobject.__delslice__(self, i, j)\n\n Called to implement deletion of ``self[i:j]``. Same notes for *i*\n and *j* as for ``__getslice__()``. This method is deprecated. If no\n ``__delslice__()`` is found, or for extended slicing of the form\n ``self[i:j:k]``, a slice object is created, and passed to\n ``__delitem__()``, instead of ``__delslice__()`` being called.\n\nNotice that these methods are only invoked when a single slice with a\nsingle colon is used, and the slice method is available. For slice\noperations involving extended slice notation, or in absence of the\nslice methods, ``__getitem__()``, ``__setitem__()`` or\n``__delitem__()`` is called with a slice object as argument.\n\nThe following example demonstrate how to make your program or module\ncompatible with earlier versions of Python (assuming that methods\n``__getitem__()``, ``__setitem__()`` and ``__delitem__()`` support\nslice objects as arguments):\n\n class MyClass:\n ...\n def __getitem__(self, index):\n ...\n def __setitem__(self, index, value):\n ...\n def __delitem__(self, index):\n ...\n\n if sys.version_info < (2, 0):\n # They won\'t be defined if version is at least 2.0 final\n\n def __getslice__(self, i, j):\n return self[max(0, i):max(0, j):]\n def __setslice__(self, i, j, seq):\n self[max(0, i):max(0, j):] = seq\n def __delslice__(self, i, j):\n del self[max(0, i):max(0, j):]\n ...\n\nNote the calls to ``max()``; these are necessary because of the\nhandling of negative indices before the ``__*slice__()`` methods are\ncalled. When negative indexes are used, the ``__*item__()`` methods\nreceive them as provided, but the ``__*slice__()`` methods get a\n"cooked" form of the index values. For each negative index value, the\nlength of the sequence is added to the index before calling the method\n(which may still result in a negative index); this is the customary\nhandling of negative indexes by the built-in sequence types, and the\n``__*item__()`` methods are expected to do this as well. However,\nsince they should already be doing that, negative indexes cannot be\npassed in; they must be constrained to the bounds of the sequence\nbefore being passed to the ``__*item__()`` methods. Calling ``max(0,\ni)`` conveniently returns the proper value.\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.__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 (``+``, ``-``, ``*``, ``//``, ``%``, ``divmod()``,\n ``pow()``, ``**``, ``<<``, ``>>``, ``&``, ``^``, ``|``). For\n instance, to evaluate the expression ``x + y``, where *x* is an\n 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__()`` (described below). Note\n that ``__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.__div__(self, other)\nobject.__truediv__(self, other)\n\n The division operator (``/``) is implemented by these methods. The\n ``__truediv__()`` method is used when ``__future__.division`` is in\n effect, otherwise ``__div__()`` is used. If only one of these two\n methods is defined, the object will not support division in the\n alternate context; ``TypeError`` will be raised instead.\n\nobject.__radd__(self, other)\nobject.__rsub__(self, other)\nobject.__rmul__(self, other)\nobject.__rdiv__(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 (``+``, ``-``, ``*``, ``/``, ``%``, ``divmod()``,\n ``pow()``, ``**``, ``<<``, ``>>``, ``&``, ``^``, ``|``) with\n reflected (swapped) operands. These functions are only called if\n the left operand does not support the corresponding operation and\n the operands are of different types. [2] For instance, to evaluate\n the expression ``x - y``, where *y* is an instance of a class that\n has an ``__rsub__()`` method, ``y.__rsub__(x)`` is called if\n ``x.__sub__(y)`` returns *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.__idiv__(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.__long__(self)\nobject.__float__(self)\n\n Called to implement the built-in functions ``complex()``,\n ``int()``, ``long()``, and ``float()``. Should return a value of\n the appropriate type.\n\nobject.__oct__(self)\nobject.__hex__(self)\n\n Called to implement the built-in functions ``oct()`` and ``hex()``.\n Should return a string value.\n\nobject.__index__(self)\n\n Called to implement ``operator.index()``. Also called whenever\n Python needs an integer object (such as in slicing). Must return\n an integer (int or long).\n\n New in version 2.5.\n\nobject.__coerce__(self, other)\n\n Called to implement "mixed-mode" numeric arithmetic. Should either\n return a 2-tuple containing *self* and *other* converted to a\n common numeric type, or ``None`` if conversion is impossible. When\n the common type would be the type of ``other``, it is sufficient to\n return ``None``, since the interpreter will also ask the other\n object to attempt a coercion (but sometimes, if the implementation\n of the other type cannot be changed, it is useful to do the\n conversion to the other type here). A return value of\n ``NotImplemented`` is equivalent to returning ``None``.\n\n\nCoercion rules\n==============\n\nThis section used to document the rules for coercion. As the language\nhas evolved, the coercion rules have become hard to document\nprecisely; documenting what one version of one particular\nimplementation does is undesirable. Instead, here are some informal\nguidelines regarding coercion. In Python 3.0, coercion will not be\nsupported.\n\n* If the left operand of a % operator is a string or Unicode object,\n no coercion takes place and the string formatting operation is\n invoked instead.\n\n* It is no longer recommended to define a coercion operation. Mixed-\n mode operations on types that don\'t define coercion pass the\n original arguments to the operation.\n\n* New-style classes (those derived from ``object``) never invoke the\n ``__coerce__()`` method in response to a binary operator; the only\n time ``__coerce__()`` is invoked is when the built-in function\n ``coerce()`` is called.\n\n* For most intents and purposes, an operator that returns\n ``NotImplemented`` is treated the same as one that is not\n implemented at all.\n\n* Below, ``__op__()`` and ``__rop__()`` are used to signify the\n generic method names corresponding to an operator; ``__iop__()`` is\n used for the corresponding in-place operator. For example, for the\n operator \'``+``\', ``__add__()`` and ``__radd__()`` are used for the\n left and right variant of the binary operator, and ``__iadd__()``\n for the in-place variant.\n\n* For objects *x* and *y*, first ``x.__op__(y)`` is tried. If this is\n not implemented or returns ``NotImplemented``, ``y.__rop__(x)`` is\n tried. If this is also not implemented or returns\n ``NotImplemented``, a ``TypeError`` exception is raised. But see\n the following exception:\n\n* Exception to the previous item: if the left operand is an instance\n of a built-in type or a new-style class, and the right operand is an\n instance of a proper subclass of that type or class and overrides\n the base\'s ``__rop__()`` method, the right operand\'s ``__rop__()``\n method is tried *before* the left operand\'s ``__op__()`` method.\n\n This is done so that a subclass can completely override binary\n operators. Otherwise, the left operand\'s ``__op__()`` method would\n always accept the right operand: when an instance of a given class\n is expected, an instance of a subclass of that class is always\n acceptable.\n\n* When either operand type defines a coercion, this coercion is called\n before that type\'s ``__op__()`` or ``__rop__()`` method is called,\n but no sooner. If the coercion returns an object of a different\n type for the operand whose coercion is invoked, part of the process\n is redone using the new object.\n\n* When an in-place operator (like \'``+=``\') is used, if the left\n operand implements ``__iop__()``, it is invoked without any\n coercion. When the operation falls back to ``__op__()`` and/or\n ``__rop__()``, the normal coercion rules apply.\n\n* In ``x + y``, if *x* is a sequence that implements sequence\n concatenation, sequence concatenation is invoked.\n\n* In ``x * y``, if one operand is a sequence that implements sequence\n repetition, and the other is an integer (``int`` or ``long``),\n sequence repetition is invoked.\n\n* Rich comparisons (implemented by methods ``__eq__()`` and so on)\n never use coercion. Three-way comparison (implemented by\n ``__cmp__()``) does use coercion under the same conditions as other\n binary operations use it.\n\n* In the current implementation, the built-in numeric types ``int``,\n ``long``, ``float``, and ``complex`` do not use coercion. All these\n types implement a ``__coerce__()`` method, for use by the built-in\n ``coerce()`` function.\n\n Changed in version 2.7.\n\n\nWith Statement Context Managers\n===============================\n\nNew in version 2.5.\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 for old-style classes\n===========================================\n\nFor old-style classes, special methods are always looked up in exactly\nthe same way as any other method or attribute. This is the case\nregardless of whether the method is being looked up explicitly as in\n``x.__getitem__(i)`` or implicitly as in ``x[i]``.\n\nThis behaviour means that special methods may exhibit different\nbehaviour for different instances of a single old-style class if the\nappropriate special attributes are set differently:\n\n >>> class C:\n ... pass\n ...\n >>> c1 = C()\n >>> c2 = C()\n >>> c1.__len__ = lambda: 5\n >>> c2.__len__ = lambda: 9\n >>> len(c1)\n 5\n >>> len(c2)\n 9\n\n\nSpecial method lookup for new-style classes\n===========================================\n\nFor new-style classes, implicit invocations of special methods are\nonly guaranteed to work correctly if defined on an object\'s type, not\nin the object\'s instance dictionary. That behaviour is the reason why\nthe following code raises an exception (unlike the equivalent example\nwith old-style classes):\n\n >>> class C(object):\n ... pass\n ...\n >>> c = C()\n >>> c.__len__ = lambda: 5\n >>> len(c)\n Traceback (most recent call last):\n File "", line 1, in \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 "", line 1, in \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):\n ... __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\nBelow are listed the string methods which both 8-bit strings and\nUnicode objects support. Some of them are also available on\n``bytearray`` objects.\n\nIn addition, Python\'s strings support the sequence type methods\ndescribed in the *Sequence Types --- str, unicode, list, tuple,\nbytearray, buffer, xrange* section. To output formatted strings use\ntemplate strings or the ``%`` operator described in the *String\nFormatting Operations* section. Also, see the ``re`` module for string\nfunctions based 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\n For 8-bit strings, this method is locale-dependent.\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\n Changed in version 2.4: Support for the *fillchar* argument.\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.decode([encoding[, errors]])\n\n Decodes the string using the codec registered for *encoding*.\n *encoding* defaults to the default string encoding. *errors* may\n be given to set a different error handling scheme. The default is\n ``\'strict\'``, meaning that encoding errors raise ``UnicodeError``.\n Other possible values are ``\'ignore\'``, ``\'replace\'`` and any other\n name registered via ``codecs.register_error()``, see section *Codec\n Base Classes*.\n\n New in version 2.2.\n\n Changed in version 2.3: Support for other error handling schemes\n added.\n\n Changed in version 2.7: Support for keyword arguments added.\n\nstr.encode([encoding[, errors]])\n\n Return an encoded version of the string. Default encoding is the\n current default string encoding. *errors* may be given to set a\n different error handling scheme. The default for *errors* is\n ``\'strict\'``, meaning that encoding errors raise a\n ``UnicodeError``. Other possible values are ``\'ignore\'``,\n ``\'replace\'``, ``\'xmlcharrefreplace\'``, ``\'backslashreplace\'`` and\n any other name registered via ``codecs.register_error()``, see\n section *Codec Base Classes*. For a list of possible encodings, see\n section *Standard Encodings*.\n\n New in version 2.0.\n\n Changed in version 2.3: Support for ``\'xmlcharrefreplace\'`` and\n ``\'backslashreplace\'`` and other error handling schemes added.\n\n Changed in version 2.7: 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\n Changed in version 2.5: Accept tuples as *suffix*.\n\nstr.expandtabs([tabsize])\n\n Return a copy of the string where all tab characters are replaced\n by one 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\n This method of string formatting is the new standard in Python 3.0,\n and should be preferred to the ``%`` formatting described in\n *String Formatting Operations* in new code.\n\n New in version 2.6.\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.\n\n For 8-bit strings, this method is locale-dependent.\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.\n\n For 8-bit strings, this method is locale-dependent.\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.\n\n For 8-bit strings, this method is locale-dependent.\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\n For 8-bit strings, this method is locale-dependent.\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.\n\n For 8-bit strings, this method is locale-dependent.\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\n For 8-bit strings, this method is locale-dependent.\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\n For 8-bit strings, this method is locale-dependent.\n\nstr.join(iterable)\n\n Return a string which is the concatenation of the strings in the\n *iterable* *iterable*. The separator between elements is the\n 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\n Changed in version 2.4: Support for the *fillchar* argument.\n\nstr.lower()\n\n Return a copy of the string with all the cased characters [4]\n converted to lowercase.\n\n For 8-bit strings, this method is locale-dependent.\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\n Changed in version 2.2.2: Support for the *chars* argument.\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\n New in version 2.5.\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\n Changed in version 2.4: Support for the *fillchar* argument.\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\n New in version 2.5.\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\n New in version 2.4.\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\n Changed in version 2.2.2: Support for the *chars* argument.\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\n Changed in version 2.5: Accept tuples as *prefix*.\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\n Changed in version 2.2.2: Support for the *chars* argument.\n\nstr.swapcase()\n\n Return a copy of the string with uppercase characters converted to\n lowercase and vice versa.\n\n For 8-bit strings, this method is locale-dependent.\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\n For 8-bit strings, this method is locale-dependent.\n\nstr.translate(table[, deletechars])\n\n Return a copy of the string where all characters occurring in the\n optional argument *deletechars* are removed, and the remaining\n characters have been mapped through the given translation table,\n which must be a string of length 256.\n\n You can use the ``maketrans()`` helper function in the ``string``\n module to create a translation table. For string objects, set the\n *table* argument to ``None`` for translations that only delete\n characters:\n\n >>> \'read this short text\'.translate(None, \'aeiou\')\n \'rd ths shrt txt\'\n\n New in version 2.6: Support for a ``None`` *table* argument.\n\n For Unicode objects, the ``translate()`` method does not accept the\n optional *deletechars* argument. Instead, it returns a copy of the\n *s* where all characters have been mapped through the given\n translation table which must be a mapping of Unicode ordinals to\n Unicode ordinals, Unicode strings or ``None``. Unmapped characters\n are left untouched. Characters mapped to ``None`` are deleted.\n Note, a more flexible approach is to create a custom character\n mapping codec using the ``codecs`` module (see ``encodings.cp1251``\n 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 For 8-bit strings, this method is locale-dependent.\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 New in version 2.2.2.\n\nThe following methods are present only on unicode objects:\n\nunicode.isnumeric()\n\n Return ``True`` if there are only numeric characters in S,\n ``False`` otherwise. Numeric characters include digit characters,\n and all characters that have the Unicode numeric value property,\n e.g. U+2155, VULGAR FRACTION ONE FIFTH.\n\nunicode.isdecimal()\n\n Return ``True`` if there are only decimal characters in S,\n ``False`` otherwise. Decimal characters include digit characters,\n and all characters that can be used to form decimal-radix numbers,\n e.g. U+0660, ARABIC-INDIC DIGIT ZERO.\n', + 'strings': '\nString literals\n***************\n\nString literals are described by the following lexical definitions:\n\n stringliteral ::= [stringprefix](shortstring | longstring)\n stringprefix ::= "r" | "u" | "ur" | "R" | "U" | "UR" | "Ur" | "uR"\n | "b" | "B" | "br" | "Br" | "bR" | "BR"\n shortstring ::= "\'" shortstringitem* "\'" | \'"\' shortstringitem* \'"\'\n longstring ::= "\'\'\'" longstringitem* "\'\'\'"\n | \'"""\' longstringitem* \'"""\'\n shortstringitem ::= shortstringchar | escapeseq\n longstringitem ::= longstringchar | escapeseq\n shortstringchar ::= \n longstringchar ::= \n escapeseq ::= "\\" \n\nOne syntactic restriction not indicated by these productions is that\nwhitespace is not allowed between the ``stringprefix`` and the rest of\nthe string literal. The source character set is defined by the\nencoding declaration; it is ASCII if no encoding declaration is given\nin the source file; see section *Encoding declarations*.\n\nIn plain English: String literals can be enclosed in matching single\nquotes (``\'``) or double quotes (``"``). They can also be enclosed in\nmatching groups of three single or double quotes (these are generally\nreferred to as *triple-quoted strings*). The backslash (``\\``)\ncharacter is used to escape characters that otherwise have a special\nmeaning, such as newline, backslash itself, or the quote character.\nString literals may optionally be prefixed with a letter ``\'r\'`` or\n``\'R\'``; such strings are called *raw strings* and use different rules\nfor interpreting backslash escape sequences. A prefix of ``\'u\'`` or\n``\'U\'`` makes the string a Unicode string. Unicode strings use the\nUnicode character set as defined by the Unicode Consortium and ISO\n10646. Some additional escape sequences, described below, are\navailable in Unicode strings. A prefix of ``\'b\'`` or ``\'B\'`` is\nignored in Python 2; it indicates that the literal should become a\nbytes literal in Python 3 (e.g. when code is automatically converted\nwith 2to3). A ``\'u\'`` or ``\'b\'`` prefix may be followed by an ``\'r\'``\nprefix.\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`` | 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| ``\\N{name}`` | Character named *name* in the | |\n| | Unicode database (Unicode only) | |\n+-------------------+-----------------------------------+---------+\n| ``\\r`` | ASCII Carriage Return (CR) | |\n+-------------------+-----------------------------------+---------+\n| ``\\t`` | ASCII Horizontal Tab (TAB) | |\n+-------------------+-----------------------------------+---------+\n| ``\\uxxxx`` | Character with 16-bit hex value | (1) |\n| | *xxxx* (Unicode only) | |\n+-------------------+-----------------------------------+---------+\n| ``\\Uxxxxxxxx`` | Character with 32-bit hex value | (2) |\n| | *xxxxxxxx* (Unicode only) | |\n+-------------------+-----------------------------------+---------+\n| ``\\v`` | ASCII Vertical Tab (VT) | |\n+-------------------+-----------------------------------+---------+\n| ``\\ooo`` | Character with octal value *ooo* | (3,5) |\n+-------------------+-----------------------------------+---------+\n| ``\\xhh`` | Character with hex value *hh* | (4,5) |\n+-------------------+-----------------------------------+---------+\n\nNotes:\n\n1. Individual code units which form parts of a surrogate pair can be\n encoded using this escape sequence.\n\n2. 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). Individual code units which form parts of a surrogate\n pair can be encoded using this escape sequence.\n\n3. As in Standard C, up to three octal digits are accepted.\n\n4. Unlike in Standard C, exactly two hex digits are required.\n\n5. In a string literal, hexadecimal and octal escapes denote the byte\n with the given value; it is not necessary that the byte encodes a\n character in the source character set. In a Unicode literal, these\n escapes denote a Unicode character with the given value.\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 marked as "(Unicode only)"\nin the table above fall into the category of unrecognized escapes for\nnon-Unicode string literals.\n\nWhen an ``\'r\'`` or ``\'R\'`` prefix is present, a character following a\nbackslash is included in the string without change, and *all\nbackslashes are left in the string*. For example, the string literal\n``r"\\n"`` consists of two characters: a backslash and a lowercase\n``\'n\'``. String quotes can be escaped with a backslash, but the\nbackslash remains in the string; for example, ``r"\\""`` is a valid\nstring literal consisting of two characters: a backslash and a double\nquote; ``r"\\"`` is not a valid string literal (even a raw string\ncannot end in an odd number of backslashes). Specifically, *a raw\nstring cannot end in a single backslash* (since the backslash would\nescape 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\nWhen an ``\'r\'`` or ``\'R\'`` prefix is used in conjunction with a\n``\'u\'`` or ``\'U\'`` prefix, then the ``\\uXXXX`` and ``\\UXXXXXXXX``\nescape sequences are processed while *all other backslashes are left\nin the string*. For example, the string literal ``ur"\\u0062\\n"``\nconsists of three Unicode characters: \'LATIN SMALL LETTER B\', \'REVERSE\nSOLIDUS\', and \'LATIN SMALL LETTER N\'. Backslashes can be escaped with\na preceding backslash; however, both remain in the string. As a\nresult, ``\\uXXXX`` escape sequences are only recognized when there are\nan odd number of backslashes.\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 of a sequence or mapping type.\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 a\nplain integer. If this value is negative, the length of the sequence\nis added to it (so that, e.g., ``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).\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``, ``0L``, ``0.0``,\n ``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 ``__nonzero__()`` or ``__len__()`` method, when that method returns\n the 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\nChanged in version 2.5: In previous versions of Python,\n``try``...``except``...``finally`` did not work. ``try``...``except``\nhad to be nested in ``try``...``finally``.\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, a tuple containing an item compatible with the\nexception, or, in the (deprecated) case of string exceptions, is the\nraised string itself (note that the object identities must match, i.e.\nit must be the same string object, not just a string with the same\nvalue).\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 in that except clause, if present, and the except\nclause\'s suite is executed. All except clauses must have an\nexecutable block. When the end of this block is reached, execution\ncontinues normally after the entire try statement. (This means that\nif two nested handlers exist for the same exception, and the exception\noccurs in the try clause of the inner handler, the outer handler will\nnot handle the exception.)\n\nBefore an except clause\'s suite is executed, details about the\nexception are assigned to three variables in the ``sys`` module:\n``sys.exc_type`` receives the object identifying the exception;\n``sys.exc_value`` receives the exception\'s parameter;\n``sys.exc_traceback`` receives a traceback object (see section *The\nstandard type hierarchy*) identifying the point in the program where\nthe exception occurred. These details are also available through the\n``sys.exc_info()`` function, which returns a tuple ``(exc_type,\nexc_value, exc_traceback)``. Use of the corresponding variables is\ndeprecated in favor of this function, since their use is unsafe in a\nthreaded program. As of Python 1.5, the variables are restored to\ntheir previous values (before the call) when returning from a function\nthat 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 lost. The exception information is not available to the\nprogram during execution 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.).\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 built-in name\n ``Ellipsis``. It is used to indicate the presence of the ``...``\n syntax in a slice. 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 three types of integers:\n\n Plain integers\n These represent numbers in the range -2147483648 through\n 2147483647. (The range may be larger on machines with a\n larger natural word size, but not smaller.) When the result\n of an operation would fall outside this range, the result is\n normally returned as a long integer (in some cases, the\n exception ``OverflowError`` is raised instead). For the\n purpose of shift and mask operations, integers are assumed to\n have a binary, 2\'s complement notation using 32 or more bits,\n and hiding no bits from the user (i.e., all 4294967296\n different bit patterns correspond to different values).\n\n Long integers\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\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 plain\n integers, 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 and the least surprises when\n switching between the plain and long integer domains. Any\n operation, if it yields a result in the plain integer domain,\n will yield the same result in the long integer domain or when\n using mixed operands. The switch between domains is transparent\n to the programmer.\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``\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 are characters. There is no separate\n character type; a character is represented by a string of one\n item. Characters represent (at least) 8-bit bytes. The\n built-in functions ``chr()`` and ``ord()`` convert between\n characters and nonnegative integers representing the byte\n values. Bytes with the values 0-127 usually represent the\n corresponding ASCII values, but the interpretation of values\n is up to the program. The string data type is also used to\n represent arrays of bytes, e.g., to hold data read from a\n file.\n\n (On systems whose native character set is not ASCII, strings\n may use EBCDIC in their internal representation, provided the\n functions ``chr()`` and ``ord()`` implement a mapping between\n ASCII and EBCDIC, and string comparison preserves the ASCII\n order. Or perhaps someone can propose a better rule?)\n\n Unicode\n The items of a Unicode object are Unicode code units. A\n Unicode code unit is represented by a Unicode 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 ``unichr()`` 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 Unicode method ``encode()`` and the\n built-in function ``unicode()``.\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 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.\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``, ``gdbm``, and ``bsddb`` provide\n additional examples of mapping types.\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 | ``func_doc`` | The function\'s documentation | Writable |\n | | string, or ``None`` if | |\n | | unavailable | |\n +-------------------------+---------------------------------+-------------+\n | ``__doc__`` | Another way of spelling | Writable |\n | | ``func_doc`` | |\n +-------------------------+---------------------------------+-------------+\n | ``func_name`` | The function\'s name | Writable |\n +-------------------------+---------------------------------+-------------+\n | ``__name__`` | Another way of spelling | Writable |\n | | ``func_name`` | |\n +-------------------------+---------------------------------+-------------+\n | ``__module__`` | The name of the module the | Writable |\n | | function was defined in, or | |\n | | ``None`` if unavailable. | |\n +-------------------------+---------------------------------+-------------+\n | ``func_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 | ``func_code`` | The code object representing | Writable |\n | | the compiled function body. | |\n +-------------------------+---------------------------------+-------------+\n | ``func_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 | ``func_dict`` | The namespace supporting | Writable |\n | | arbitrary function attributes. | |\n +-------------------------+---------------------------------+-------------+\n | ``func_closure`` | ``None`` or a tuple of cells | Read-only |\n | | that contain bindings for the | |\n | | function\'s free variables. | |\n +-------------------------+---------------------------------+-------------+\n\n Most of the attributes labelled "Writable" check the type of the\n assigned value.\n\n Changed in version 2.4: ``func_name`` is now writable.\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 User-defined methods\n A user-defined method object combines a class, a class instance\n (or ``None``) and any callable object (normally a user-defined\n function).\n\n Special read-only attributes: ``im_self`` is the class instance\n object, ``im_func`` is the function object; ``im_class`` is the\n class of ``im_self`` for bound methods or the class that asked\n for the method for unbound methods; ``__doc__`` is the method\'s\n documentation (same as ``im_func.__doc__``); ``__name__`` is the\n method name (same as ``im_func.__name__``); ``__module__`` is\n the name of the module the method was defined in, or ``None`` if\n unavailable.\n\n Changed in version 2.2: ``im_self`` used to refer to the class\n that defined the method.\n\n Changed in version 2.6: For 3.0 forward-compatibility,\n ``im_func`` is also available as ``__func__``, and ``im_self``\n as ``__self__``.\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, an unbound\n user-defined method object, or a class method object. When the\n attribute is a user-defined method object, a new method object\n is only created if the class from which it is being retrieved is\n the same as, or a derived class of, the class stored in the\n original method object; otherwise, the original method object is\n used as it is.\n\n When a user-defined method object is created by retrieving a\n user-defined function object from a class, its ``im_self``\n attribute is ``None`` and the method object is said to be\n unbound. When one is created by retrieving a user-defined\n function object from a class via one of its instances, its\n ``im_self`` attribute is the instance, and the method object is\n said to be bound. In either case, the new method\'s ``im_class``\n attribute is the class from which the retrieval takes place, and\n its ``im_func`` 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 ``im_func``\n attribute of the new instance is not the original method object\n but its ``im_func`` attribute.\n\n When a user-defined method object is created by retrieving a\n class method object from a class or instance, its ``im_self``\n attribute is the class itself (the same as the ``im_class``\n attribute), and its ``im_func`` attribute is the function object\n underlying the class method.\n\n When an unbound user-defined method object is called, the\n underlying function (``im_func``) is called, with the\n restriction that the first argument must be an instance of the\n proper class (``im_class``) or of a derived class thereof.\n\n When a bound user-defined method object is called, the\n underlying function (``im_func``) is called, inserting the class\n instance (``im_self``) in front of the argument list. For\n instance, when ``C`` is a class which contains a definition for\n a function ``f()``, and ``x`` is an instance of ``C``, calling\n ``x.f(1)`` is equivalent to calling ``C.f(x, 1)``.\n\n When a user-defined method object is derived from a class method\n object, the "class instance" stored in ``im_self`` will actually\n be the class itself, so that calling either ``x.f(1)`` or\n ``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 (unbound or\n bound) method object happens each time the attribute is\n retrieved from the class or instance. In some cases, a fruitful\n optimization is to assign the attribute to a local variable and\n call that local variable. Also notice that this transformation\n only happens for user-defined functions; other callable objects\n (and all non-callable objects) are retrieved without\n transformation. It is also important to note that user-defined\n functions which are attributes of a class instance are not\n converted to bound methods; this *only* happens when the\n function is an attribute 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 Class Types\n Class types, or "new-style classes," are callable. These\n objects normally act as factories for new instances of\n themselves, but variations are possible for class types that\n override ``__new__()``. The arguments of the call are passed to\n ``__new__()`` and, in the typical case, to ``__init__()`` to\n initialize the new instance.\n\n Classic Classes\n Class objects are described below. When a class object is\n called, a new class instance (also described below) is created\n and returned. This implies a call to the class\'s ``__init__()``\n method if it has one. Any arguments are passed on to the\n ``__init__()`` method. If there is no ``__init__()`` method,\n the class must be called without arguments.\n\n Class instances\n Class instances are described below. Class instances are\n callable only when the class has a ``__call__()`` method;\n ``x(arguments)`` is a shorthand for ``x.__call__(arguments)``.\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 func_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\nClasses\n Both class types (new-style classes) and class objects (old-\n style/classic classes) are typically created by class definitions\n (see section *Class definitions*). A class has a namespace\n implemented by a dictionary object. Class attribute references are\n translated to lookups in this dictionary, e.g., ``C.x`` is\n translated to ``C.__dict__["x"]`` (although for new-style classes\n in particular there are a number of hooks which allow for other\n means of locating attributes). When the attribute name is not found\n there, the attribute search continues in the base classes. For\n old-style classes, the search is depth-first, left-to-right in the\n order of occurrence in the base class list. New-style classes use\n the more complex C3 method resolution order which behaves correctly\n even in the presence of \'diamond\' inheritance structures where\n there are multiple inheritance paths leading back to a common\n ancestor. Additional details on the C3 MRO used by new-style\n classes can be found in the documentation accompanying the 2.3\n release at http://www.python.org/download/releases/2.3/mro/.\n\n When a class attribute reference (for class ``C``, say) would yield\n a user-defined function object or an unbound user-defined method\n object whose associated class is either ``C`` or one of its base\n classes, it is transformed into an unbound user-defined method\n object whose ``im_class`` attribute is ``C``. When it would yield a\n class method object, it is transformed into a bound user-defined\n method object whose ``im_class`` and ``im_self`` attributes are\n both ``C``. When it would yield a static method object, it is\n transformed into the object wrapped by the static method object.\n See section *Implementing Descriptors* for another way in which\n attributes retrieved from a class may differ from those actually\n contained in its ``__dict__`` (note that only new-style classes\n support descriptors).\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 or an unbound user-defined method object whose\n associated class is the class (call it ``C``) of the instance for\n which the attribute reference was initiated or one of its bases, it\n is transformed into a bound user-defined method object whose\n ``im_class`` attribute is ``C`` and whose ``im_self`` attribute is\n the instance. Static method and class method objects are also\n transformed, as if they had been retrieved from class ``C``; see\n above under "Classes". See section *Implementing Descriptors* for\n another way in which attributes of a class retrieved via its\n instances may differ from the objects actually stored in the\n class\'s ``__dict__``. If no class attribute is found, and the\n object\'s class has a ``__getattr__()`` method, that is called to\n satisfy the 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\nFiles\n A file object represents an open file. File objects are created by\n the ``open()`` built-in function, and also by ``os.popen()``,\n ``os.fdopen()``, and the ``makefile()`` method of socket objects\n (and perhaps by other functions or methods provided by extension\n modules). The objects ``sys.stdin``, ``sys.stdout`` and\n ``sys.stderr`` are initialized to file objects corresponding to the\n interpreter\'s standard input, output and error streams. See *File\n Objects* for complete documentation of file objects.\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_restricted`` is a flag indicating whether the function is\n executing in restricted execution mode; ``f_lasti`` gives the\n precise instruction (this is an index into the bytecode string\n 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_exc_type``, ``f_exc_value``,\n ``f_exc_traceback`` represent the last exception raised in the\n parent frame provided another exception was ever raised in the\n current frame (in all other cases they are None); ``f_lineno``\n is the current line number of the frame --- writing to this from\n within a trace function jumps to the given line (only for the\n bottom-most frame). A debugger can implement a Jump command\n (aka Set Next Statement) 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 ``sys.exc_traceback``,\n and also as the third item of the tuple returned by\n ``sys.exc_info()``. The latter is the preferred interface,\n since it works correctly when the program is using multiple\n threads. When the program contains no suitable handler, the\n stack trace is written (nicely formatted) to the standard error\n stream; if the interpreter is interactive, it is also made\n available to the user as ``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 when *extended slice\n syntax* is used. This is a slice using two colons, or multiple\n slices or ellipses separated by commas, e.g., ``a[i:j:step]``,\n ``a[i:j, k:l]``, or ``a[..., i:j]``. They are also created by\n the built-in ``slice()`` 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 extended slice that the slice\n object would describe if applied to a sequence of *length*\n items. It returns a tuple of three integers; respectively\n these are the *start* and *stop* indices and the *step* or\n stride length of the slice. Missing or out-of-bounds indices\n are handled in a manner consistent with regular slices.\n\n New in version 2.3.\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 is\n 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 New in version 2.2.\n\n Changed in version 2.3: Support for building a dictionary from\n keyword arguments added.\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 New in version 2.5: If a subclass of dict defines a method\n ``__missing__()``, if the key *key* is not present, the\n ``d[key]`` operation calls that method with the key *key* as\n argument. The ``d[key]`` operation then returns or raises\n whatever is returned or raised by the ``__missing__(key)`` call\n if the key is not present. No other operations or methods invoke\n ``__missing__()``. If ``__missing__()`` is not defined,\n ``KeyError`` is raised. ``__missing__()`` must be a method; it\n cannot be an instance variable. For an example, see\n ``collections.defaultdict``.\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 New in version 2.2.\n\n key not in d\n\n Equivalent to ``not key in d``.\n\n New in version 2.2.\n\n iter(d)\n\n Return an iterator over the keys of the dictionary. This is a\n shortcut for ``iterkeys()``.\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 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 New in version 2.3.\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 has_key(key)\n\n Test for the presence of *key* in the dictionary. ``has_key()``\n is deprecated in favor of ``key in d``.\n\n items()\n\n Return a copy of the dictionary\'s list of ``(key, value)``\n pairs.\n\n **CPython implementation detail:** Keys and values are listed in\n an arbitrary order which is non-random, varies across Python\n implementations, and depends on the dictionary\'s history of\n insertions and deletions.\n\n If ``items()``, ``keys()``, ``values()``, ``iteritems()``,\n ``iterkeys()``, and ``itervalues()`` are called with no\n intervening modifications to the dictionary, the lists will\n directly correspond. This allows the creation of ``(value,\n key)`` pairs using ``zip()``: ``pairs = zip(d.values(),\n d.keys())``. The same relationship holds for the ``iterkeys()``\n and ``itervalues()`` methods: ``pairs = zip(d.itervalues(),\n d.iterkeys())`` provides the same value for ``pairs``. Another\n way to create the same list is ``pairs = [(v, k) for (k, v) in\n d.iteritems()]``.\n\n iteritems()\n\n Return an iterator over the dictionary\'s ``(key, value)`` pairs.\n See the note for ``dict.items()``.\n\n Using ``iteritems()`` while adding or deleting entries in the\n dictionary may raise a ``RuntimeError`` or fail to iterate over\n all entries.\n\n New in version 2.2.\n\n iterkeys()\n\n Return an iterator over the dictionary\'s keys. See the note for\n ``dict.items()``.\n\n Using ``iterkeys()`` while adding or deleting entries in the\n dictionary may raise a ``RuntimeError`` or fail to iterate over\n all entries.\n\n New in version 2.2.\n\n itervalues()\n\n Return an iterator over the dictionary\'s values. See the note\n for ``dict.items()``.\n\n Using ``itervalues()`` while adding or deleting entries in the\n dictionary may raise a ``RuntimeError`` or fail to iterate over\n all entries.\n\n New in version 2.2.\n\n keys()\n\n Return a copy of the dictionary\'s list of keys. See the note\n for ``dict.items()``.\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 New in version 2.3.\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 Changed in version 2.4: Allowed the argument to be an iterable\n of key/value pairs and allowed keyword arguments.\n\n values()\n\n Return a copy of the dictionary\'s list of values. See the note\n for ``dict.items()``.\n\n viewitems()\n\n Return a new view of the dictionary\'s items (``(key, value)``\n pairs). See below for documentation of view objects.\n\n New in version 2.7.\n\n viewkeys()\n\n Return a new view of the dictionary\'s keys. See below for\n documentation of view objects.\n\n New in version 2.7.\n\n viewvalues()\n\n Return a new view of the dictionary\'s values. See below for\n documentation of view objects.\n\n New in version 2.7.\n\n\nDictionary view objects\n=======================\n\nThe objects returned by ``dict.viewkeys()``, ``dict.viewvalues()`` and\n``dict.viewitems()`` are *view objects*. They provide a dynamic view\non the 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 and\nhashable, then the items view is also set-like. (Values views are not\ntreated as set-like since the entries are generally not unique.) Then\nthese set operations are available ("other" refers either to another\nview or a set):\n\ndictview & other\n\n Return the intersection of the dictview and the other object as a\n new set.\n\ndictview | other\n\n Return the union of the dictview and the other object as a new set.\n\ndictview - other\n\n Return the difference between the dictview and the other object\n (all elements in *dictview* that aren\'t in *other*) as a new set.\n\ndictview ^ other\n\n Return the symmetric difference (all elements either in *dictview*\n or *other*, but not in both) of the dictview and the other object\n as a new set.\n\nAn example of dictionary view usage:\n\n >>> dishes = {\'eggs\': 2, \'sausage\': 1, \'bacon\': 1, \'spam\': 500}\n >>> keys = dishes.viewkeys()\n >>> values = dishes.viewvalues()\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', + '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\nThe implementation adds two special read-only attributes to class\ninstance methods: ``m.im_self`` is the object on which the method\noperates, and ``m.im_func`` is the function implementing the method.\nCalling ``m(arg-1, arg-2, ..., arg-n)`` is completely equivalent to\ncalling ``m.im_func(m.im_self, arg-1, arg-2, ..., arg-n)``.\n\nClass instance methods are either *bound* or *unbound*, referring to\nwhether the method was accessed through an instance or a class,\nrespectively. When a method is unbound, its ``im_self`` attribute\nwill be ``None`` and if called, an explicit ``self`` object must be\npassed as the first argument. In this case, ``self`` must be an\ninstance of the unbound method's class (or a subclass of that class),\notherwise a ``TypeError`` is raised.\n\nLike function objects, methods objects support getting arbitrary\nattributes. However, since method attributes are actually stored on\nthe underlying function object (``meth.im_func``), setting method\nattributes on either bound or unbound methods is disallowed.\nAttempting to set a method attribute results in a ``TypeError`` being\nraised. In order to set a method attribute, you need to explicitly\nset it on the underlying function object:\n\n class C:\n def method(self):\n pass\n\n c = C()\n c.method.im_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: ````. If loaded from a file, they are written as\n````.\n", + 'typesseq': '\nSequence Types --- ``str``, ``unicode``, ``list``, ``tuple``, ``bytearray``, ``buffer``, ``xrange``\n***************************************************************************************************\n\nThere are seven sequence types: strings, Unicode strings, lists,\ntuples, bytearrays, buffers, and xrange objects.\n\nFor other containers see the built in ``dict`` and ``set`` classes,\nand the ``collections`` module.\n\nString literals are written in single or double quotes: ``\'xyzzy\'``,\n``"frobozz"``. See *String literals* for more about string literals.\nUnicode strings are much like strings, but are specified in the syntax\nusing a preceding ``\'u\'`` character: ``u\'abc\'``, ``u"def"``. In\naddition to the functionality described here, there are also string-\nspecific methods described in the *String Methods* section. Lists are\nconstructed with square brackets, separating items with commas: ``[a,\nb, c]``. Tuples are constructed by the comma operator (not within\nsquare brackets), with or without enclosing parentheses, but an empty\ntuple must have the enclosing parentheses, such as ``a, b, c`` or\n``()``. A single item tuple must have a trailing comma, such as\n``(d,)``.\n\nBytearray objects are created with the built-in function\n``bytearray()``.\n\nBuffer objects are not directly supported by Python syntax, but can be\ncreated by calling the built-in function ``buffer()``. They don\'t\nsupport concatenation or repetition.\n\nObjects of type xrange are similar to buffers in that there is no\nspecific syntax to create them, but they are created using the\n``xrange()`` function. They don\'t support slicing, concatenation or\nrepetition, and using ``in``, ``not in``, ``min()`` or ``max()`` on\nthem 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* and *j* 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 compare\nequal and the two sequences must be of the same type and have the same\nlength. (For full details see *Comparisons* in the language\nreference.)\n\nNotes:\n\n1. When *s* is a string or Unicode string object the ``in`` and ``not\n in`` operations act like a substring test. In Python versions\n before 2.3, *x* had to be a string of length 1. In Python 2.3 and\n beyond, *x* may be a string of any length.\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. **CPython implementation detail:** If *s* and *t* are both strings,\n some Python implementations such as CPython can usually perform an\n in-place optimization for assignments of the form ``s = s + t`` or\n ``s += t``. When applicable, this optimization makes quadratic\n run-time much less likely. This optimization is both version and\n implementation dependent. For performance sensitive code, it is\n preferable to use the ``str.join()`` method which assures\n consistent linear concatenation performance across versions and\n implementations.\n\n Changed in version 2.4: Formerly, string concatenation never\n occurred in-place.\n\n\nString Methods\n==============\n\nBelow are listed the string methods which both 8-bit strings and\nUnicode objects support. Some of them are also available on\n``bytearray`` objects.\n\nIn addition, Python\'s strings support the sequence type methods\ndescribed in the *Sequence Types --- str, unicode, list, tuple,\nbytearray, buffer, xrange* section. To output formatted strings use\ntemplate strings or the ``%`` operator described in the *String\nFormatting Operations* section. Also, see the ``re`` module for string\nfunctions based 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\n For 8-bit strings, this method is locale-dependent.\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\n Changed in version 2.4: Support for the *fillchar* argument.\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.decode([encoding[, errors]])\n\n Decodes the string using the codec registered for *encoding*.\n *encoding* defaults to the default string encoding. *errors* may\n be given to set a different error handling scheme. The default is\n ``\'strict\'``, meaning that encoding errors raise ``UnicodeError``.\n Other possible values are ``\'ignore\'``, ``\'replace\'`` and any other\n name registered via ``codecs.register_error()``, see section *Codec\n Base Classes*.\n\n New in version 2.2.\n\n Changed in version 2.3: Support for other error handling schemes\n added.\n\n Changed in version 2.7: Support for keyword arguments added.\n\nstr.encode([encoding[, errors]])\n\n Return an encoded version of the string. Default encoding is the\n current default string encoding. *errors* may be given to set a\n different error handling scheme. The default for *errors* is\n ``\'strict\'``, meaning that encoding errors raise a\n ``UnicodeError``. Other possible values are ``\'ignore\'``,\n ``\'replace\'``, ``\'xmlcharrefreplace\'``, ``\'backslashreplace\'`` and\n any other name registered via ``codecs.register_error()``, see\n section *Codec Base Classes*. For a list of possible encodings, see\n section *Standard Encodings*.\n\n New in version 2.0.\n\n Changed in version 2.3: Support for ``\'xmlcharrefreplace\'`` and\n ``\'backslashreplace\'`` and other error handling schemes added.\n\n Changed in version 2.7: 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\n Changed in version 2.5: Accept tuples as *suffix*.\n\nstr.expandtabs([tabsize])\n\n Return a copy of the string where all tab characters are replaced\n by one 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\n This method of string formatting is the new standard in Python 3.0,\n and should be preferred to the ``%`` formatting described in\n *String Formatting Operations* in new code.\n\n New in version 2.6.\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.\n\n For 8-bit strings, this method is locale-dependent.\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.\n\n For 8-bit strings, this method is locale-dependent.\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.\n\n For 8-bit strings, this method is locale-dependent.\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\n For 8-bit strings, this method is locale-dependent.\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.\n\n For 8-bit strings, this method is locale-dependent.\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\n For 8-bit strings, this method is locale-dependent.\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\n For 8-bit strings, this method is locale-dependent.\n\nstr.join(iterable)\n\n Return a string which is the concatenation of the strings in the\n *iterable* *iterable*. The separator between elements is the\n 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\n Changed in version 2.4: Support for the *fillchar* argument.\n\nstr.lower()\n\n Return a copy of the string with all the cased characters [4]\n converted to lowercase.\n\n For 8-bit strings, this method is locale-dependent.\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\n Changed in version 2.2.2: Support for the *chars* argument.\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\n New in version 2.5.\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\n Changed in version 2.4: Support for the *fillchar* argument.\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\n New in version 2.5.\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\n New in version 2.4.\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\n Changed in version 2.2.2: Support for the *chars* argument.\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\n Changed in version 2.5: Accept tuples as *prefix*.\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\n Changed in version 2.2.2: Support for the *chars* argument.\n\nstr.swapcase()\n\n Return a copy of the string with uppercase characters converted to\n lowercase and vice versa.\n\n For 8-bit strings, this method is locale-dependent.\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\n For 8-bit strings, this method is locale-dependent.\n\nstr.translate(table[, deletechars])\n\n Return a copy of the string where all characters occurring in the\n optional argument *deletechars* are removed, and the remaining\n characters have been mapped through the given translation table,\n which must be a string of length 256.\n\n You can use the ``maketrans()`` helper function in the ``string``\n module to create a translation table. For string objects, set the\n *table* argument to ``None`` for translations that only delete\n characters:\n\n >>> \'read this short text\'.translate(None, \'aeiou\')\n \'rd ths shrt txt\'\n\n New in version 2.6: Support for a ``None`` *table* argument.\n\n For Unicode objects, the ``translate()`` method does not accept the\n optional *deletechars* argument. Instead, it returns a copy of the\n *s* where all characters have been mapped through the given\n translation table which must be a mapping of Unicode ordinals to\n Unicode ordinals, Unicode strings or ``None``. Unmapped characters\n are left untouched. Characters mapped to ``None`` are deleted.\n Note, a more flexible approach is to create a custom character\n mapping codec using the ``codecs`` module (see ``encodings.cp1251``\n 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 For 8-bit strings, this method is locale-dependent.\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 New in version 2.2.2.\n\nThe following methods are present only on unicode objects:\n\nunicode.isnumeric()\n\n Return ``True`` if there are only numeric characters in S,\n ``False`` otherwise. Numeric characters include digit characters,\n and all characters that have the Unicode numeric value property,\n e.g. U+2155, VULGAR FRACTION ONE FIFTH.\n\nunicode.isdecimal()\n\n Return ``True`` if there are only decimal characters in S,\n ``False`` otherwise. Decimal characters include digit characters,\n and all characters that can be used to form decimal-radix numbers,\n e.g. U+0660, ARABIC-INDIC DIGIT ZERO.\n\n\nString Formatting Operations\n============================\n\nString and Unicode objects have one unique built-in operation: the\n``%`` operator (modulo). This is also known as the string\n*formatting* or *interpolation* operator. Given ``format % values``\n(where *format* is a string or Unicode object), ``%`` conversion\nspecifications in *format* are replaced with zero or more elements of\n*values*. The effect is similar to the using ``sprintf()`` in the C\nlanguage. If *format* is a Unicode object, or if any of the objects\nbeing converted using the ``%s`` conversion are Unicode objects, the\nresult will also be a Unicode object.\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 width\n is read from the next element of the tuple in *values*, and the\n 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()``). | (6) |\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. The ``%r`` conversion was added in Python 2.0.\n\n The precision determines the maximal number of characters used.\n\n6. If the object or format provided is a ``unicode`` string, the\n resulting string will also be ``unicode``.\n\n The precision determines the maximal number of characters used.\n\n7. 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 2.7: ``%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\nXRange Type\n===========\n\nThe ``xrange`` type is an immutable sequence which is commonly used\nfor looping. The advantage of the ``xrange`` type is that an\n``xrange`` object will always take the same amount of memory, no\nmatter the size of the range it represents. There are no consistent\nperformance advantages.\n\nXRange objects have very little behavior: they only support indexing,\niteration, and the ``len()`` function.\n\n\nMutable Sequence Types\n======================\n\nList and ``bytearray`` objects support additional operations that\nallow in-place modification of the object. Other mutable sequence\ntypes (when added to the language) should also support these\noperations. Strings and tuples are immutable sequence types: such\nobjects cannot be modified once created. The following operations are\ndefined on mutable sequence types (where *x* is an arbitrary object):\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)] = | (2) |\n| | [x]`` | |\n+--------------------------------+----------------------------------+-----------------------+\n| ``s.extend(x)`` | same as ``s[len(s):len(s)] = x`` | (3) |\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 | (4) |\n| | ``s[k] == x`` and ``i <= k < j`` | |\n+--------------------------------+----------------------------------+-----------------------+\n| ``s.insert(i, x)`` | same as ``s[i:i] = [x]`` | (5) |\n+--------------------------------+----------------------------------+-----------------------+\n| ``s.pop([i])`` | same as ``x = s[i]; del s[i]; | (6) |\n| | return x`` | |\n+--------------------------------+----------------------------------+-----------------------+\n| ``s.remove(x)`` | same as ``del s[s.index(x)]`` | (4) |\n+--------------------------------+----------------------------------+-----------------------+\n| ``s.reverse()`` | reverses the items of *s* in | (7) |\n| | place | |\n+--------------------------------+----------------------------------+-----------------------+\n| ``s.sort([cmp[, key[, | sort the items of *s* in place | (7)(8)(9)(10) |\n| reverse]]])`` | | |\n+--------------------------------+----------------------------------+-----------------------+\n\nNotes:\n\n1. *t* must have the same length as the slice it is replacing.\n\n2. The C implementation of Python has historically accepted multiple\n parameters and implicitly joined them into a tuple; this no longer\n works in Python 2.0. Use of this misfeature has been deprecated\n since Python 1.4.\n\n3. *x* can be any iterable object.\n\n4. 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 list length is added, as for slice indices. If it is\n still negative, it is truncated to zero, as for slice indices.\n\n Changed in version 2.3: Previously, ``index()`` didn\'t have\n arguments for specifying start and stop positions.\n\n5. When a negative index is passed as the first parameter to the\n ``insert()`` method, the list length is added, as for slice\n indices. If it is still negative, it is truncated to zero, as for\n slice indices.\n\n Changed in version 2.3: Previously, all negative indices were\n truncated to zero.\n\n6. The ``pop()`` method is only supported by the list and array types.\n The optional argument *i* defaults to ``-1``, so that by default\n the last item is removed and returned.\n\n7. The ``sort()`` and ``reverse()`` methods modify the list in place\n for economy of space when sorting or reversing a large list. To\n remind you that they operate by side effect, they don\'t return the\n sorted or reversed list.\n\n8. The ``sort()`` method takes optional arguments for controlling the\n comparisons.\n\n *cmp* specifies a custom comparison function of two arguments (list\n items) which should return a negative, zero or positive number\n depending on whether the first argument is considered smaller than,\n equal to, or larger than the second argument: ``cmp=lambda x,y:\n cmp(x.lower(), y.lower())``. The default value is ``None``.\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``.\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 In general, the *key* and *reverse* conversion processes are much\n faster than specifying an equivalent *cmp* function. This is\n because *cmp* is called multiple times for each list element while\n *key* and *reverse* touch each element only once. Use\n ``functools.cmp_to_key()`` to convert an old-style *cmp* function\n to a *key* function.\n\n Changed in version 2.3: Support for ``None`` as an equivalent to\n omitting *cmp* was added.\n\n Changed in version 2.4: Support for *key* and *reverse* was added.\n\n9. Starting with Python 2.3, the ``sort()`` method is guaranteed to be\n stable. A sort is stable if it guarantees not to change the\n relative order of elements that compare equal --- this is helpful\n for sorting in multiple passes (for example, sort by department,\n then by salary grade).\n\n10. **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 2.3 and newer makes the\n list appear empty for the duration, and raises ``ValueError`` if\n it can detect that the list has been mutated during a sort.\n', + 'typesseq-mutable': "\nMutable Sequence Types\n**********************\n\nList and ``bytearray`` objects support additional operations that\nallow in-place modification of the object. Other mutable sequence\ntypes (when added to the language) should also support these\noperations. Strings and tuples are immutable sequence types: such\nobjects cannot be modified once created. The following operations are\ndefined on mutable sequence types (where *x* is an arbitrary object):\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)] = | (2) |\n| | [x]`` | |\n+--------------------------------+----------------------------------+-----------------------+\n| ``s.extend(x)`` | same as ``s[len(s):len(s)] = x`` | (3) |\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 | (4) |\n| | ``s[k] == x`` and ``i <= k < j`` | |\n+--------------------------------+----------------------------------+-----------------------+\n| ``s.insert(i, x)`` | same as ``s[i:i] = [x]`` | (5) |\n+--------------------------------+----------------------------------+-----------------------+\n| ``s.pop([i])`` | same as ``x = s[i]; del s[i]; | (6) |\n| | return x`` | |\n+--------------------------------+----------------------------------+-----------------------+\n| ``s.remove(x)`` | same as ``del s[s.index(x)]`` | (4) |\n+--------------------------------+----------------------------------+-----------------------+\n| ``s.reverse()`` | reverses the items of *s* in | (7) |\n| | place | |\n+--------------------------------+----------------------------------+-----------------------+\n| ``s.sort([cmp[, key[, | sort the items of *s* in place | (7)(8)(9)(10) |\n| reverse]]])`` | | |\n+--------------------------------+----------------------------------+-----------------------+\n\nNotes:\n\n1. *t* must have the same length as the slice it is replacing.\n\n2. The C implementation of Python has historically accepted multiple\n parameters and implicitly joined them into a tuple; this no longer\n works in Python 2.0. Use of this misfeature has been deprecated\n since Python 1.4.\n\n3. *x* can be any iterable object.\n\n4. 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 list length is added, as for slice indices. If it is\n still negative, it is truncated to zero, as for slice indices.\n\n Changed in version 2.3: Previously, ``index()`` didn't have\n arguments for specifying start and stop positions.\n\n5. When a negative index is passed as the first parameter to the\n ``insert()`` method, the list length is added, as for slice\n indices. If it is still negative, it is truncated to zero, as for\n slice indices.\n\n Changed in version 2.3: Previously, all negative indices were\n truncated to zero.\n\n6. The ``pop()`` method is only supported by the list and array types.\n The optional argument *i* defaults to ``-1``, so that by default\n the last item is removed and returned.\n\n7. The ``sort()`` and ``reverse()`` methods modify the list in place\n for economy of space when sorting or reversing a large list. To\n remind you that they operate by side effect, they don't return the\n sorted or reversed list.\n\n8. The ``sort()`` method takes optional arguments for controlling the\n comparisons.\n\n *cmp* specifies a custom comparison function of two arguments (list\n items) which should return a negative, zero or positive number\n depending on whether the first argument is considered smaller than,\n equal to, or larger than the second argument: ``cmp=lambda x,y:\n cmp(x.lower(), y.lower())``. The default value is ``None``.\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``.\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 In general, the *key* and *reverse* conversion processes are much\n faster than specifying an equivalent *cmp* function. This is\n because *cmp* is called multiple times for each list element while\n *key* and *reverse* touch each element only once. Use\n ``functools.cmp_to_key()`` to convert an old-style *cmp* function\n to a *key* function.\n\n Changed in version 2.3: Support for ``None`` as an equivalent to\n omitting *cmp* was added.\n\n Changed in version 2.4: Support for *key* and *reverse* was added.\n\n9. Starting with Python 2.3, the ``sort()`` method is guaranteed to be\n stable. A sort is stable if it guarantees not to change the\n relative order of elements that compare equal --- this is helpful\n for sorting in multiple passes (for example, sort by department,\n then by salary grade).\n\n10. **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 2.3 and newer makes the\n list appear empty for the duration, and raises ``ValueError`` if\n it can detect that the list has been mutated during a sort.\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\nplain or long integer argument. The bitwise inversion of ``x`` is\ndefined as ``-(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\nNew in version 2.5.\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\nNote: In Python 2.5, the ``with`` statement is only allowed when the\n ``with_statement`` feature has been enabled. It is always enabled\n in Python 2.6.\n\nChanged in version 2.7: 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.\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 generator\'s ``next()``\nmethod 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\nAs of Python version 2.5, the ``yield`` statement is now allowed in\nthe ``try`` clause of a ``try`` ... ``finally`` construct. If the\ngenerator is not resumed before it is finalized (by reaching a zero\nreference count or by being garbage collected), the generator-\niterator\'s ``close()`` method will be called, allowing any pending\n``finally`` clauses to execute.\n\nNote: In Python 2.2, the ``yield`` statement was only allowed when the\n ``generators`` feature has been enabled. This ``__future__`` import\n statement was used to enable the feature:\n\n from __future__ import generators\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'} -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Feb 23 21:20:18 2012 From: python-checkins at python.org (benjamin.peterson) Date: Thu, 23 Feb 2012 21:20:18 +0100 Subject: [Python-checkins] =?utf8?b?Y3B5dGhvbiAobWVyZ2UgMi43IC0+IDIuNyk6?= =?utf8?q?_merge_heads?= Message-ID: http://hg.python.org/cpython/rev/80ab0b13eb04 changeset: 75219:80ab0b13eb04 branch: 2.7 parent: 75218:82ab1382dab1 parent: 75210:b5cb819404aa user: Benjamin Peterson date: Thu Feb 23 15:20:08 2012 -0500 summary: merge heads files: Lib/logging/__init__.py | 24 ++++++++++-------- Lib/logging/handlers.py | 36 ++++++++++++++++------------ 2 files changed, 33 insertions(+), 27 deletions(-) diff --git a/Lib/logging/__init__.py b/Lib/logging/__init__.py --- a/Lib/logging/__init__.py +++ b/Lib/logging/__init__.py @@ -1,4 +1,4 @@ -# Copyright 2001-2010 by Vinay Sajip. All Rights Reserved. +# Copyright 2001-2012 by Vinay Sajip. All Rights Reserved. # # Permission to use, copy, modify, and distribute this software and its # documentation for any purpose and without fee is hereby granted, @@ -16,9 +16,9 @@ """ Logging package for Python. Based on PEP 282 and comments thereto in -comp.lang.python, and influenced by Apache's log4j system. +comp.lang.python. -Copyright (C) 2001-2010 Vinay Sajip. All Rights Reserved. +Copyright (C) 2001-2012 Vinay Sajip. All Rights Reserved. To use, simply 'import logging' and log away! """ @@ -828,8 +828,9 @@ """ Flushes the stream. """ - if self.stream and hasattr(self.stream, "flush"): - self.stream.flush() + with self.lock: + if self.stream and hasattr(self.stream, "flush"): + self.stream.flush() def emit(self, record): """ @@ -900,12 +901,13 @@ """ Closes the stream. """ - if self.stream: - self.flush() - if hasattr(self.stream, "close"): - self.stream.close() - StreamHandler.close(self) - self.stream = None + with self.lock: + if self.stream: + self.flush() + if hasattr(self.stream, "close"): + self.stream.close() + StreamHandler.close(self) + self.stream = None def _open(self): """ diff --git a/Lib/logging/handlers.py b/Lib/logging/handlers.py --- a/Lib/logging/handlers.py +++ b/Lib/logging/handlers.py @@ -1,4 +1,4 @@ -# Copyright 2001-2010 by Vinay Sajip. All Rights Reserved. +# Copyright 2001-2012 by Vinay Sajip. All Rights Reserved. # # Permission to use, copy, modify, and distribute this software and its # documentation for any purpose and without fee is hereby granted, @@ -16,10 +16,9 @@ """ Additional handlers for the logging package for Python. The core package is -based on PEP 282 and comments thereto in comp.lang.python, and influenced by -Apache's log4j system. +based on PEP 282 and comments thereto in comp.lang.python. -Copyright (C) 2001-2010 Vinay Sajip. All Rights Reserved. +Copyright (C) 2001-2012 Vinay Sajip. All Rights Reserved. To use, simply 'import logging.handlers' and log away! """ @@ -563,9 +562,10 @@ """ Closes the socket. """ - if self.sock: - self.sock.close() - self.sock = None + with self.lock: + if self.sock: + self.sock.close() + self.sock = None logging.Handler.close(self) class DatagramHandler(SocketHandler): @@ -767,8 +767,9 @@ """ Closes the socket. """ - if self.unixsocket: - self.socket.close() + with self.lock: + if self.unixsocket: + self.socket.close() logging.Handler.close(self) def mapPriority(self, levelName): @@ -1096,7 +1097,8 @@ This version just zaps the buffer to empty. """ - self.buffer = [] + with self.lock: + self.buffer = [] def close(self): """ @@ -1144,15 +1146,17 @@ records to the target, if there is one. Override if you want different behaviour. """ - if self.target: - for record in self.buffer: - self.target.handle(record) - self.buffer = [] + with self.lock: + if self.target: + for record in self.buffer: + self.target.handle(record) + self.buffer = [] def close(self): """ Flush, set the target to None and lose the buffer. """ self.flush() - self.target = None - BufferingHandler.close(self) + with self.lock: + self.target = None + BufferingHandler.close(self) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Feb 23 21:20:17 2012 From: python-checkins at python.org (benjamin.peterson) Date: Thu, 23 Feb 2012 21:20:17 +0100 Subject: [Python-checkins] =?utf8?b?Y3B5dGhvbiAobWVyZ2UgMi43IC0+IDIuNyk6?= =?utf8?q?_merge_2=2E7_release?= Message-ID: http://hg.python.org/cpython/rev/82ab1382dab1 changeset: 75218:82ab1382dab1 branch: 2.7 parent: 75207:51615c55781f parent: 75217:2cb325d661eb user: Benjamin Peterson date: Thu Feb 23 15:19:08 2012 -0500 summary: merge 2.7 release files: Lib/pydoc_data/topics.py | 160 ++++++++++++-------------- 1 files changed, 77 insertions(+), 83 deletions(-) diff --git a/Lib/pydoc_data/topics.py b/Lib/pydoc_data/topics.py --- a/Lib/pydoc_data/topics.py +++ b/Lib/pydoc_data/topics.py @@ -1,83 +1,77 @@ -# Autogenerated by Sphinx on Sat Jun 11 09:49:30 2011 -topics = {'assert': u'\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': u'\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\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 is recursively defined as\nfollows.\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\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`` statement in the\n current code block: the name is bound to the object in the current\n local namespace.\n\n * Otherwise: the name is bound to the object in the current global\n namespace.\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 a plain integer. If it is negative, the\n sequence\'s length is added to it. The resulting value must be a\n nonnegative integer less than the sequence\'s length, and the\n sequence is asked to assign the assigned object to its item with\n that index. If the index is out of range, ``IndexError`` is raised\n (assignment to a subscripted sequence cannot add new items to a\n 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* 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 (small) integers. If either\n bound is negative, the sequence\'s length is added to it. The\n resulting bounds are clipped to lie between zero and the sequence\'s\n length, inclusive. Finally, the sequence object is asked to replace\n the slice with the items of the assigned sequence. The length of\n the 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\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': u'\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': u"\nLiterals\n********\n\nPython supports string literals and various numeric literals:\n\n literal ::= stringliteral | integer | longinteger\n | floatnumber | imagnumber\n\nEvaluation of a literal yields an object of the given type (string,\ninteger, long integer, floating point number, complex number) with the\ngiven value. The value may be approximated in the case of floating\npoint and imaginary (complex) literals. See section *Literals* for\ndetails.\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': u'\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 in new-style classes.\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 not simply execute ``self.name = value`` --- this would\n cause a recursive call to itself. Instead, it should insert the\n value in the dictionary of instance attributes, e.g.,\n ``self.__dict__[name] = value``. For new-style classes, rather\n than accessing the instance dictionary, it should call the base\n 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\n\nMore attribute access for new-style classes\n===========================================\n\nThe following methods only apply to new-style classes.\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 for new-style\n classes*.\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. Note that descriptors are only invoked for new\nstyle objects or classes (ones that subclass ``object()`` or\n``type()``).\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 a new-style object instance, ``a.x`` is transformed\n into the call: ``type(a).__dict__[\'x\'].__get__(a, type(a))``.\n\nClass Binding\n If binding to a new-style class, ``A.x`` is transformed into the\n call: ``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 both old and new-style classes have a\ndictionary for attribute storage. This wastes space for objects\nhaving very few instance variables. The space consumption can become\nacute when creating large numbers of instances.\n\nThe default can be overridden by defining *__slots__* in a new-style\nclass definition. The *__slots__* declaration takes a sequence of\ninstance variables and reserves just enough space in each instance to\nhold a value for each variable. Space is saved because *__dict__* is\nnot created for each instance.\n\n__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 new-style class, *__slots__* reserves space for the declared\n variables and prevents the automatic creation of *__dict__* and\n *__weakref__* for each instance.\n\n New in version 2.2.\n\nNotes on using *__slots__*\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 Changed in version 2.3: Previously, adding ``\'__dict__\'`` to the\n *__slots__* declaration would not enable the assignment of new\n attributes not specifically listed in the sequence of instance\n variable names.\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 Changed in version 2.3: Previously, adding ``\'__weakref__\'`` to the\n *__slots__* declaration would not enable support for weak\n references.\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 ``long``, ``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 Changed in version 2.6: Previously, *__class__* assignment raised an\n error if either new or old class had *__slots__*.\n', - 'attribute-references': u'\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, e.g., a module, list, or an instance. This\nobject is then asked to produce the attribute whose name is the\nidentifier. If this attribute is not available, the exception\n``AttributeError`` is raised. Otherwise, the type and value of the\nobject produced is determined by the object. Multiple evaluations of\nthe same attribute reference may yield different objects.\n', - 'augassign': u'\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': u'\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 (plain or long) and the other must be a sequence.\nIn the former case, the numbers are converted to a common type and\nthen multiplied together. In the latter case, sequence repetition is\nperformed; a negative 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. Plain or long integer division yields an\ninteger of the same type; the result is that of mathematical division\nwith the \'floor\' function applied to the result. Division by zero\nraises 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 [2].\n\nThe integer division and modulo operators are connected by the\nfollowing identity: ``x == (x/y)*y + (x%y)``. Integer division and\nmodulo are also connected with the built-in function ``divmod()``:\n``divmod(x, y) == (x/y, x%y)``. These identities don\'t hold for\nfloating point numbers; there similar identities hold approximately\nwhere ``x/y`` is replaced by ``floor(x/y)`` or ``floor(x/y) - 1`` [3].\n\nIn addition to performing the modulo operation on numbers, the ``%``\noperator is also overloaded by string and unicode objects to perform\nstring formatting (also known as interpolation). The syntax for string\nformatting is described in the Python Library Reference, section\n*String Formatting Operations*.\n\nDeprecated since version 2.3: The floor division operator, the modulo\noperator, and the ``divmod()`` function are no longer defined for\ncomplex numbers. Instead, convert to a floating point number using\nthe ``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': u'\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 plain or long integers. The arguments are converted to a common\ntype.\n\nThe ``^`` operator yields the bitwise XOR (exclusive OR) of its\narguments, which must be plain or long integers. The arguments are\nconverted to a common type.\n\nThe ``|`` operator yields the bitwise (inclusive) OR of its arguments,\nwhich must be plain or long integers. The arguments are converted to\na common type.\n', - 'bltin-code-objects': u'\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 ``func_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`` statement or the built-in ``eval()``\nfunction.\n\nSee *The standard type hierarchy* for more information.\n', - 'bltin-ellipsis-object': u'\nThe Ellipsis Object\n*******************\n\nThis object is used by extended slice notation (see *Slicings*). It\nsupports no special operations. There is exactly one ellipsis object,\nnamed ``Ellipsis`` (a built-in name).\n\nIt is written as ``Ellipsis``.\n', - 'bltin-file-objects': u'\nFile Objects\n************\n\nFile objects are implemented using C\'s ``stdio`` package and can be\ncreated with the built-in ``open()`` function. File objects are also\nreturned by some other built-in functions and methods, such as\n``os.popen()`` and ``os.fdopen()`` and the ``makefile()`` method of\nsocket objects. Temporary files can be created using the ``tempfile``\nmodule, and high-level file operations such as copying, moving, and\ndeleting files and directories can be achieved with the ``shutil``\nmodule.\n\nWhen a file operation fails for an I/O-related reason, the exception\n``IOError`` is raised. This includes situations where the operation\nis not defined for some reason, like ``seek()`` on a tty device or\nwriting a file opened for reading.\n\nFiles have the following methods:\n\nfile.close()\n\n Close the file. A closed file cannot be read or written any more.\n Any operation which requires that the file be open will raise a\n ``ValueError`` after the file has been closed. Calling ``close()``\n more than once is allowed.\n\n As of Python 2.5, you can avoid having to call this method\n explicitly if you use the ``with`` statement. For example, the\n following code will automatically close *f* when the ``with`` block\n is exited:\n\n from __future__ import with_statement # This isn\'t required in Python 2.6\n\n with open("hello.txt") as f:\n for line in f:\n print line\n\n In older versions of Python, you would have needed to do this to\n get the same effect:\n\n f = open("hello.txt")\n try:\n for line in f:\n print line\n finally:\n f.close()\n\n Note: Not all "file-like" types in Python support use as a context\n manager for the ``with`` statement. If your code is intended to\n work with any file-like object, you can use the function\n ``contextlib.closing()`` instead of using the object directly.\n\nfile.flush()\n\n Flush the internal buffer, like ``stdio``\'s ``fflush()``. This may\n be a no-op on some file-like objects.\n\n Note: ``flush()`` does not necessarily write the file\'s data to disk.\n Use ``flush()`` followed by ``os.fsync()`` to ensure this\n behavior.\n\nfile.fileno()\n\n Return the integer "file descriptor" that is used by the underlying\n implementation to request I/O operations from the operating system.\n This can be useful for other, lower level interfaces that use file\n descriptors, such as the ``fcntl`` module or ``os.read()`` and\n friends.\n\n Note: File-like objects which do not have a real file descriptor should\n *not* provide this method!\n\nfile.isatty()\n\n Return ``True`` if the file is connected to a tty(-like) device,\n else ``False``.\n\n Note: If a file-like object is not associated with a real file, this\n method should *not* be implemented.\n\nfile.next()\n\n A file object is its own iterator, for example ``iter(f)`` returns\n *f* (unless *f* is closed). When a file is used as an iterator,\n typically in a ``for`` loop (for example, ``for line in f: print\n line``), the ``next()`` method is called repeatedly. This method\n returns the next input line, or raises ``StopIteration`` when EOF\n is hit when the file is open for reading (behavior is undefined\n when the file is open for writing). In order to make a ``for``\n loop the most efficient way of looping over the lines of a file (a\n very common operation), the ``next()`` method uses a hidden read-\n ahead buffer. As a consequence of using a read-ahead buffer,\n combining ``next()`` with other file methods (like ``readline()``)\n does not work right. However, using ``seek()`` to reposition the\n file to an absolute position will flush the read-ahead buffer.\n\n New in version 2.3.\n\nfile.read([size])\n\n Read at most *size* bytes from the file (less if the read hits EOF\n before obtaining *size* bytes). If the *size* argument is negative\n or omitted, read all data until EOF is reached. The bytes are\n returned as a string object. An empty string is returned when EOF\n is encountered immediately. (For certain files, like ttys, it\n makes sense to continue reading after an EOF is hit.) Note that\n this method may call the underlying C function ``fread()`` more\n than once in an effort to acquire as close to *size* bytes as\n possible. Also note that when in non-blocking mode, less data than\n was requested may be returned, even if no *size* parameter was\n given.\n\n Note: This function is simply a wrapper for the underlying ``fread()``\n C function, and will behave the same in corner cases, such as\n whether the EOF value is cached.\n\nfile.readline([size])\n\n Read one entire line from the file. A trailing newline character\n is kept in the string (but may be absent when a file ends with an\n incomplete line). [5] If the *size* argument is present and non-\n negative, it is a maximum byte count (including the trailing\n newline) and an incomplete line may be returned. When *size* is not\n 0, an empty string is returned *only* when EOF is encountered\n immediately.\n\n Note: Unlike ``stdio``\'s ``fgets()``, the returned string contains null\n characters (``\'\\0\'``) if they occurred in the input.\n\nfile.readlines([sizehint])\n\n Read until EOF using ``readline()`` and return a list containing\n the lines thus read. If the optional *sizehint* argument is\n present, instead of reading up to EOF, whole lines totalling\n approximately *sizehint* bytes (possibly after rounding up to an\n internal buffer size) are read. Objects implementing a file-like\n interface may choose to ignore *sizehint* if it cannot be\n implemented, or cannot be implemented efficiently.\n\nfile.xreadlines()\n\n This method returns the same thing as ``iter(f)``.\n\n New in version 2.1.\n\n Deprecated since version 2.3: Use ``for line in file`` instead.\n\nfile.seek(offset[, whence])\n\n Set the file\'s current position, like ``stdio``\'s ``fseek()``. The\n *whence* argument is optional and defaults to ``os.SEEK_SET`` or\n ``0`` (absolute file positioning); other values are ``os.SEEK_CUR``\n or ``1`` (seek relative to the current position) and\n ``os.SEEK_END`` or ``2`` (seek relative to the file\'s end). There\n is no return value.\n\n For example, ``f.seek(2, os.SEEK_CUR)`` advances the position by\n two and ``f.seek(-3, os.SEEK_END)`` sets the position to the third\n to last.\n\n Note that if the file is opened for appending (mode ``\'a\'`` or\n ``\'a+\'``), any ``seek()`` operations will be undone at the next\n write. If the file is only opened for writing in append mode (mode\n ``\'a\'``), this method is essentially a no-op, but it remains useful\n for files opened in append mode with reading enabled (mode\n ``\'a+\'``). If the file is opened in text mode (without ``\'b\'``),\n only offsets returned by ``tell()`` are legal. Use of other\n offsets causes undefined behavior.\n\n Note that not all file objects are seekable.\n\n Changed in version 2.6: Passing float values as offset has been\n deprecated.\n\nfile.tell()\n\n Return the file\'s current position, like ``stdio``\'s ``ftell()``.\n\n Note: On Windows, ``tell()`` can return illegal values (after an\n ``fgets()``) when reading files with Unix-style line-endings. Use\n binary mode (``\'rb\'``) to circumvent this problem.\n\nfile.truncate([size])\n\n Truncate the file\'s size. If the optional *size* argument is\n present, the file is truncated to (at most) that size. The size\n defaults to the current position. The current file position is not\n changed. Note that if a specified size exceeds the file\'s current\n size, the result is platform-dependent: possibilities include that\n the file may remain unchanged, increase to the specified size as if\n zero-filled, or increase to the specified size with undefined new\n content. Availability: Windows, many Unix variants.\n\nfile.write(str)\n\n Write a string to the file. There is no return value. Due to\n buffering, the string may not actually show up in the file until\n the ``flush()`` or ``close()`` method is called.\n\nfile.writelines(sequence)\n\n Write a sequence of strings to the file. The sequence can be any\n iterable object producing strings, typically a list of strings.\n There is no return value. (The name is intended to match\n ``readlines()``; ``writelines()`` does not add line separators.)\n\nFiles support the iterator protocol. Each iteration returns the same\nresult as ``file.readline()``, and iteration ends when the\n``readline()`` method returns an empty string.\n\nFile objects also offer a number of other interesting attributes.\nThese are not required for file-like objects, but should be\nimplemented if they make sense for the particular object.\n\nfile.closed\n\n bool indicating the current state of the file object. This is a\n read-only attribute; the ``close()`` method changes the value. It\n may not be available on all file-like objects.\n\nfile.encoding\n\n The encoding that this file uses. When Unicode strings are written\n to a file, they will be converted to byte strings using this\n encoding. In addition, when the file is connected to a terminal,\n the attribute gives the encoding that the terminal is likely to use\n (that information might be incorrect if the user has misconfigured\n the terminal). The attribute is read-only and may not be present\n on all file-like objects. It may also be ``None``, in which case\n the file uses the system default encoding for converting Unicode\n strings.\n\n New in version 2.3.\n\nfile.errors\n\n The Unicode error handler used along with the encoding.\n\n New in version 2.6.\n\nfile.mode\n\n The I/O mode for the file. If the file was created using the\n ``open()`` built-in function, this will be the value of the *mode*\n parameter. This is a read-only attribute and may not be present on\n all file-like objects.\n\nfile.name\n\n If the file object was created using ``open()``, the name of the\n file. Otherwise, some string that indicates the source of the file\n object, of the form ``<...>``. This is a read-only attribute and\n may not be present on all file-like objects.\n\nfile.newlines\n\n If Python was built with universal newlines enabled (the default)\n this read-only attribute exists, and for files opened in universal\n newline read mode it keeps track of the types of newlines\n encountered while reading the file. The values it can take are\n ``\'\\r\'``, ``\'\\n\'``, ``\'\\r\\n\'``, ``None`` (unknown, no newlines read\n yet) or a tuple containing all the newline types seen, to indicate\n that multiple newline conventions were encountered. For files not\n opened in universal newline read mode the value of this attribute\n will be ``None``.\n\nfile.softspace\n\n Boolean that indicates whether a space character needs to be\n printed before another value when using the ``print`` statement.\n Classes that are trying to simulate a file object should also have\n a writable ``softspace`` attribute, which should be initialized to\n zero. This will be automatic for most classes implemented in\n Python (care may be needed for objects that override attribute\n access); types implemented in C will have to provide a writable\n ``softspace`` attribute.\n\n Note: This attribute is not used to control the ``print`` statement,\n but to allow the implementation of ``print`` to keep track of its\n internal state.\n', - 'bltin-null-object': u"\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-type-objects': u"\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: ````.\n", - 'booleans': u'\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. (See the ``__nonzero__()`` special method for a way to\nchange this.)\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': u'\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', - 'callable-types': u'\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', - 'calls': u'\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 [","]\n | expression genexpr_for] ")"\n argument_list ::= positional_arguments ["," keyword_arguments]\n ["," "*" expression] ["," keyword_arguments]\n ["," "**" expression]\n | keyword_arguments ["," "*" expression]\n ["," "**" expression]\n | "*" expression ["," "*" expression] ["," "**" 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 certain class instances\nthemselves are callable; extensions may define additional callable\nobject types). All argument expressions are evaluated before the call\nis attempted. Please refer to section *Function definitions* for the\nsyntax 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 a sequence. Elements from this\nsequence 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 "", 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. Formal parameters using the syntax ``(sublist)`` cannot be\nused as keyword argument names; the outermost sublist corresponds to a\nsingle unnamed argument slot, and the argument value is assigned to\nthe sublist using the usual tuple assignment rules after all other\nparameter processing is done.\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': u'\nClass definitions\n*****************\n\nA class definition defines a class object (see section *The standard\ntype hierarchy*):\n\n classdef ::= "class" classname [inheritance] ":" suite\n inheritance ::= "(" [expression_list] ")"\n classname ::= identifier\n\nA class definition is an executable statement. It first evaluates the\ninheritance list, if present. Each item in the inheritance list\nshould evaluate to a class object or class type which allows\nsubclassing. The class\'s suite is then executed in a new execution\nframe (see section *Naming and binding*), using a newly created local\nnamespace and the original global namespace. (Usually, the suite\ncontains only function definitions.) When the class\'s suite finishes\nexecution, its execution frame is discarded but its local namespace is\nsaved. [4] A class object is then created using the inheritance list\nfor the base classes and the saved local namespace for the attribute\ndictionary. The class name is bound to this class object in the\noriginal local namespace.\n\n**Programmer\'s note:** Variables defined in the class definition are\nclass variables; they are shared by all instances. To create instance\nvariables, they can be set in a method with ``self.name = value``.\nBoth class and instance variables are accessible through the notation\n"``self.name``", and an instance variable hides a class variable with\nthe same name when accessed in this way. Class variables can be used\nas defaults for instance variables, but using mutable values there can\nlead to unexpected results. For *new-style class*es, descriptors can\nbe used to create instance variables with different implementation\ndetails.\n\nClass definitions, like function definitions, may be wrapped by one or\nmore *decorator* expressions. The evaluation rules for the decorator\nexpressions are the same as for functions. The result must be a class\nobject, which is then bound to the class name.\n\n-[ Footnotes ]-\n\n[1] The exception is propagated to the invocation stack only if there\n is no ``finally`` clause that negates the exception.\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', - 'coercion-rules': u"\nCoercion rules\n**************\n\nThis section used to document the rules for coercion. As the language\nhas evolved, the coercion rules have become hard to document\nprecisely; documenting what one version of one particular\nimplementation does is undesirable. Instead, here are some informal\nguidelines regarding coercion. In Python 3.0, coercion will not be\nsupported.\n\n* If the left operand of a % operator is a string or Unicode object,\n no coercion takes place and the string formatting operation is\n invoked instead.\n\n* It is no longer recommended to define a coercion operation. Mixed-\n mode operations on types that don't define coercion pass the\n original arguments to the operation.\n\n* New-style classes (those derived from ``object``) never invoke the\n ``__coerce__()`` method in response to a binary operator; the only\n time ``__coerce__()`` is invoked is when the built-in function\n ``coerce()`` is called.\n\n* For most intents and purposes, an operator that returns\n ``NotImplemented`` is treated the same as one that is not\n implemented at all.\n\n* Below, ``__op__()`` and ``__rop__()`` are used to signify the\n generic method names corresponding to an operator; ``__iop__()`` is\n used for the corresponding in-place operator. For example, for the\n operator '``+``', ``__add__()`` and ``__radd__()`` are used for the\n left and right variant of the binary operator, and ``__iadd__()``\n for the in-place variant.\n\n* For objects *x* and *y*, first ``x.__op__(y)`` is tried. If this is\n not implemented or returns ``NotImplemented``, ``y.__rop__(x)`` is\n tried. If this is also not implemented or returns\n ``NotImplemented``, a ``TypeError`` exception is raised. But see\n the following exception:\n\n* Exception to the previous item: if the left operand is an instance\n of a built-in type or a new-style class, and the right operand is an\n instance of a proper subclass of that type or class and overrides\n the base's ``__rop__()`` method, the right operand's ``__rop__()``\n method is tried *before* the left operand's ``__op__()`` method.\n\n This is done so that a subclass can completely override binary\n operators. Otherwise, the left operand's ``__op__()`` method would\n always accept the right operand: when an instance of a given class\n is expected, an instance of a subclass of that class is always\n acceptable.\n\n* When either operand type defines a coercion, this coercion is called\n before that type's ``__op__()`` or ``__rop__()`` method is called,\n but no sooner. If the coercion returns an object of a different\n type for the operand whose coercion is invoked, part of the process\n is redone using the new object.\n\n* When an in-place operator (like '``+=``') is used, if the left\n operand implements ``__iop__()``, it is invoked without any\n coercion. When the operation falls back to ``__op__()`` and/or\n ``__rop__()``, the normal coercion rules apply.\n\n* In ``x + y``, if *x* is a sequence that implements sequence\n concatenation, sequence concatenation is invoked.\n\n* In ``x * y``, if one operator is a sequence that implements sequence\n repetition, and the other is an integer (``int`` or ``long``),\n sequence repetition is invoked.\n\n* Rich comparisons (implemented by methods ``__eq__()`` and so on)\n never use coercion. Three-way comparison (implemented by\n ``__cmp__()``) does use coercion under the same conditions as other\n binary operations use it.\n\n* In the current implementation, the built-in numeric types ``int``,\n ``long``, ``float``, and ``complex`` do not use coercion. All these\n types implement a ``__coerce__()`` method, for use by the built-in\n ``coerce()`` function.\n\n Changed in version 2.7.\n", - 'comparisons': u'\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 forms ``<>`` and ``!=`` are equivalent; for consistency with C,\n``!=`` is preferred; where ``!=`` is mentioned below ``<>`` is also\naccepted. The ``<>`` spelling is considered obsolescent.\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,\nobjects of different types *always* compare unequal, and are ordered\nconsistently but arbitrarily. You can control comparison behavior of\nobjects of non-built-in types by defining a ``__cmp__`` method or rich\ncomparison methods like ``__gt__``, described in section *Special\nmethod names*.\n\n(This unusual definition of comparison was used to simplify the\ndefinition of operations like sorting and the ``in`` and ``not in``\noperators. In the future, the comparison rules for objects of\ndifferent types are likely to change.)\n\nComparison of objects of the same type depends on the type:\n\n* Numbers are compared arithmetically.\n\n* Strings are compared lexicographically using the numeric equivalents\n (the result of the built-in function ``ord()``) of their characters.\n Unicode and 8-bit strings are fully interoperable in this behavior.\n [4]\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, ``cmp([1,2,x], [1,2,y])`` returns\n the same as ``cmp(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 their sorted\n (key, value) lists compare equal. [5] Outcomes other than equality\n are resolved consistently, but are not otherwise defined. [6]\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\nThe operators ``in`` and ``not in`` test for collection membership.\n``x in s`` evaluates to true if *x* is a member of the collection *s*,\nand false otherwise. ``x not in s`` returns the negation of ``x in\ns``. The collection membership test has traditionally been bound to\nsequences; an object is a member of a collection if the collection is\na sequence and contains an element equal to that object. However, it\nmake sense for many other object types to support membership tests\nwithout being a sequence. In particular, dictionaries (for keys) and\nsets support membership testing.\n\nFor the list and tuple types, ``x in y`` is true if and only if there\nexists an index *i* such that ``x == y[i]`` is true.\n\nFor the Unicode and string types, ``x in y`` is true if and only if\n*x* is a substring of *y*. An equivalent test is ``y.find(x) != -1``.\nNote, *x* and *y* need not be the same type; consequently, ``u\'ab\' in\n\'abc\'`` will return ``True``. Empty strings are always considered to\nbe a substring of any other string, so ``"" in "abc"`` will return\n``True``.\n\nChanged in version 2.3: Previously, *x* was required to be a string of\nlength ``1``.\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. [7]\n', - 'compound': u'\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. Function and class\ndefinitions are also syntactically compound 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`` statements 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 | decorated\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, and then the suite is executed. When the items are\nexhausted (which is immediately when the sequence is empty), the suite\nin the ``else`` clause, if present, is executed, and the loop\nterminates.\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\nThe target list is not deleted when the loop is finished, but if the\nsequence is empty, it will not have been assigned to at all by the\nloop. Hint: the built-in function ``range()`` returns a sequence of\nintegers suitable to emulate the effect of Pascal\'s ``for i := a to b\ndo``; e.g., ``range(3)`` returns the list ``[0, 1, 2]``.\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 internal\n counter is used to keep track of which item is used next, and this\n is incremented on each iteration. When this counter has reached the\n length of the sequence the loop terminates. This means that if the\n suite deletes the current (or a previous) item from the sequence,\n the next item will be skipped (since it gets the index of the\n 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\nChanged in version 2.5: In previous versions of Python,\n``try``...``except``...``finally`` did not work. ``try``...``except``\nhad to be nested in ``try``...``finally``.\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, a tuple containing an item compatible with the\nexception, or, in the (deprecated) case of string exceptions, is the\nraised string itself (note that the object identities must match, i.e.\nit must be the same string object, not just a string with the same\nvalue).\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 in that except clause, if present, and the except\nclause\'s suite is executed. All except clauses must have an\nexecutable block. When the end of this block is reached, execution\ncontinues normally after the entire try statement. (This means that\nif two nested handlers exist for the same exception, and the exception\noccurs in the try clause of the inner handler, the outer handler will\nnot handle the exception.)\n\nBefore an except clause\'s suite is executed, details about the\nexception are assigned to three variables in the ``sys`` module:\n``sys.exc_type`` receives the object identifying the exception;\n``sys.exc_value`` receives the exception\'s parameter;\n``sys.exc_traceback`` receives a traceback object (see section *The\nstandard type hierarchy*) identifying the point in the program where\nthe exception occurred. These details are also available through the\n``sys.exc_info()`` function, which returns a tuple ``(exc_type,\nexc_value, exc_traceback)``. Use of the corresponding variables is\ndeprecated in favor of this function, since their use is unsafe in a\nthreaded program. As of Python 1.5, the variables are restored to\ntheir previous values (before the call) when returning from a function\nthat 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 lost. The exception information is not available to the\nprogram during execution 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\nNew in version 2.5.\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\nNote: In Python 2.5, the ``with`` statement is only allowed when the\n ``with_statement`` feature has been enabled. It is always enabled\n in Python 2.6.\n\nChanged in version 2.7: 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 decorated ::= decorators (classdef | funcdef)\n decorators ::= decorator+\n decorator ::= "@" dotted_name ["(" [argument_list [","]] ")"] NEWLINE\n funcdef ::= "def" funcname "(" [parameter_list] ")" ":" suite\n dotted_name ::= identifier ("." identifier)*\n parameter_list ::= (defparameter ",")*\n ( "*" identifier [, "**" identifier]\n | "**" identifier\n | defparameter [","] )\n defparameter ::= parameter ["=" expression]\n sublist ::= parameter ("," parameter)* [","]\n parameter ::= identifier | "(" sublist ")"\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 top-level 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 must also have a default value --- this is a syntactic\nrestriction 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 that 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.\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.\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 ::= "class" classname [inheritance] ":" suite\n inheritance ::= "(" [expression_list] ")"\n classname ::= identifier\n\nA class definition is an executable statement. It first evaluates the\ninheritance list, if present. Each item in the inheritance list\nshould evaluate to a class object or class type which allows\nsubclassing. The class\'s suite is then executed in a new execution\nframe (see section *Naming and binding*), using a newly created local\nnamespace and the original global namespace. (Usually, the suite\ncontains only function definitions.) When the class\'s suite finishes\nexecution, its execution frame is discarded but its local namespace is\nsaved. [4] A class object is then created using the inheritance list\nfor the base classes and the saved local namespace for the attribute\ndictionary. The class name is bound to this class object in the\noriginal local namespace.\n\n**Programmer\'s note:** Variables defined in the class definition are\nclass variables; they are shared by all instances. To create instance\nvariables, they can be set in a method with ``self.name = value``.\nBoth class and instance variables are accessible through the notation\n"``self.name``", and an instance variable hides a class variable with\nthe same name when accessed in this way. Class variables can be used\nas defaults for instance variables, but using mutable values there can\nlead to unexpected results. For *new-style class*es, descriptors can\nbe used to create instance variables with different implementation\ndetails.\n\nClass definitions, like function definitions, may be wrapped by one or\nmore *decorator* expressions. The evaluation rules for the decorator\nexpressions are the same as for functions. The result must be a class\nobject, which is then bound to the class name.\n\n-[ Footnotes ]-\n\n[1] The exception is propagated to the invocation stack only if there\n is no ``finally`` clause that negates the exception.\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': u'\nWith Statement Context Managers\n*******************************\n\nNew in version 2.5.\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': u'\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': u'\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," the arguments\nare coerced using the coercion rules listed at *Coercion rules*. If\nboth arguments are standard numeric types, the following coercions are\napplied:\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, if either argument is a long integer, the other is\n converted to long integer;\n\n* otherwise, both must be plain integers and no conversion is\n necessary.\n\nSome additional rules apply for certain operators (e.g., a string left\nargument to the \'%\' operator). Extensions can define their own\ncoercions.\n', - 'customization': u'\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_traceback`` 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.exc_traceback`` or ``sys.last_traceback``. Circular\n references which are garbage are detected when the option cycle\n detector is enabled (it\'s on by default), but can only be cleaned\n up if there are no Python-level ``__del__()`` methods involved.\n Refer to the documentation for the ``gc`` module for more\n information about how ``__del__()`` methods are handled by the\n cycle detector, particularly the description of the ``garbage``\n 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 and by string\n conversions (reverse quotes) to compute the "official" string\n representation of an object. If at all possible, this should look\n like a valid Python expression that could be used to recreate an\n object with the same value (given an appropriate environment). If\n this is not possible, a string of the form ``<...some useful\n description...>`` should be returned. The return value must be a\n string object. If a class defines ``__repr__()`` but not\n ``__str__()``, then ``__repr__()`` is also used when an "informal"\n string representation of instances of that class is 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 statement 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.__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 New in version 2.1.\n\n These are the so-called "rich comparison" methods, and are called\n for comparison operators in preference to ``__cmp__()`` below. The\n correspondence between operator symbols and method names is as\n follows: ``xy`` call ``x.__ne__(y)``, ``x>y`` calls ``x.__gt__(y)``, and\n ``x>=y`` calls ``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.__cmp__(self, other)\n\n Called by comparison operations if rich comparison (see above) is\n not defined. Should return a negative integer if ``self < other``,\n zero if ``self == other``, a positive integer if ``self > other``.\n If no ``__cmp__()``, ``__eq__()`` or ``__ne__()`` operation is\n defined, class instances are compared by object identity\n ("address"). See also the description of ``__hash__()`` for some\n important notes on creating *hashable* objects which support custom\n comparison operations and are usable as dictionary keys. (Note: the\n restriction that exceptions are not propagated by ``__cmp__()`` has\n been removed since Python 1.5.)\n\nobject.__rcmp__(self, other)\n\n Changed in version 2.1: No longer supported.\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 a ``__cmp__()`` or ``__eq__()`` method\n it should not define a ``__hash__()`` operation either; if it\n defines ``__cmp__()`` or ``__eq__()`` but not ``__hash__()``, its\n instances will not be usable in hashed collections. If a class\n defines mutable objects and implements a ``__cmp__()`` or\n ``__eq__()`` method, it should not implement ``__hash__()``, since\n hashable collection implementations require that a object\'s hash\n value is immutable (if the object\'s hash value changes, it will be\n in the wrong hash bucket).\n\n User-defined classes have ``__cmp__()`` 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 ``__cmp__()`` or ``__eq__()`` such that\n the hash value returned is no longer appropriate (e.g. by switching\n to a value-based concept of equality instead of the default\n identity based equality) can explicitly flag themselves as being\n unhashable by setting ``__hash__ = None`` in the class definition.\n Doing so means that not only will instances of the class raise an\n appropriate ``TypeError`` when a program attempts to retrieve their\n hash value, but they will also be correctly identified as\n unhashable when checking ``isinstance(obj, collections.Hashable)``\n (unlike classes which define their own ``__hash__()`` to explicitly\n raise ``TypeError``).\n\n Changed in version 2.5: ``__hash__()`` may now also return a long\n integer object; the 32-bit integer is then derived from the hash of\n that object.\n\n Changed in version 2.6: ``__hash__`` may now be set to ``None`` to\n explicitly flag instances of a class as unhashable.\n\nobject.__nonzero__(self)\n\n Called to implement truth value testing and the built-in operation\n ``bool()``; should return ``False`` or ``True``, or their integer\n equivalents ``0`` or ``1``. When this method is not defined,\n ``__len__()`` is called, if it is defined, and the object is\n considered true if its result is nonzero. If a class defines\n neither ``__len__()`` nor ``__nonzero__()``, all its instances are\n considered true.\n\nobject.__unicode__(self)\n\n Called to implement ``unicode()`` built-in; should return a Unicode\n object. When this method is not defined, string conversion is\n attempted, and the result of string conversion is converted to\n Unicode using the system default encoding.\n', - 'debugger': u'\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 > (0)?()\n (Pdb) continue\n > (1)?()\n (Pdb) continue\n NameError: \'spam\'\n > (1)?()\n (Pdb)\n\n``pdb.py`` can also be invoked as a script to debug other scripts.\nFor example:\n\n python -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 2.4: Restarting post-mortem behavior added.\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 ``c`` 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 "", 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[, locals]])\n\n Execute the *statement* (given as a string) under debugger control.\n The debugger prompt appears before any code is executed; you can\n set breakpoints and type ``continue``, or you can step through the\n statement using ``step`` or ``next`` (all these commands are\n explained below). The optional *globals* and *locals* arguments\n specify the environment in which the code is executed; by default\n the dictionary of the module ``__main__`` is used. (See the\n explanation of the ``exec`` statement or the ``eval()`` built-in\n function.)\n\npdb.runeval(expression[, globals[, locals]])\n\n Evaluate the *expression* (given as a string) under debugger\n control. When ``runeval()`` returns, it returns the value of the\n expression. Otherwise this function is similar to ``run()``.\n\npdb.runcall(function[, argument, ...])\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])\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)\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 Example call to enable tracing with *skip*:\n\n import pdb; pdb.Pdb(skip=[\'django.*\']).set_trace()\n\n New in version 2.7: The *skip* argument.\n\n run(statement[, globals[, locals]])\n runeval(expression[, globals[, locals]])\n runcall(function[, argument, ...])\n set_trace()\n\n See the documentation for the functions explained above.\n', - 'del': u'\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 that 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\nIt is illegal to delete a name from the local namespace if it occurs\nas a free variable in a nested block.\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', - 'dict': u'\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': u'\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\nIf ``exec`` is used in a function and the function contains or is a\nnested block with free variables, the compiler will raise a\n``SyntaxError`` unless the exec explicitly specifies the local\nnamespace for the ``exec``. (In other words, ``exec obj`` would be\nillegal, but ``exec obj in ns`` would be legal.)\n\nThe ``eval()``, ``execfile()``, and ``input()`` functions and the\n``exec`` statement do not have access to the full environment for\nresolving names. Names may be resolved in the local and global\nnamespaces of the caller. Free variables are not resolved in the\nnearest enclosing namespace, but in the global namespace. [1] The\n``exec`` statement and the ``eval()`` and ``execfile()`` functions\nhave optional arguments to override the global and local namespace.\nIf only one namespace is specified, it is used for both.\n', - 'else': u'\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', - 'exceptions': u'\nExceptions\n**********\n\nExceptions are a means of breaking out of the normal flow of control\nof a code block in order to handle errors or other exceptional\nconditions. An exception is *raised* at the point where the error is\ndetected; it may be *handled* by the surrounding code block or by any\ncode block that directly or indirectly invoked the code block where\nthe error occurred.\n\nThe Python interpreter raises an exception when it detects a run-time\nerror (such as division by zero). A Python program can also\nexplicitly raise an exception with the ``raise`` statement. Exception\nhandlers are specified with the ``try`` ... ``except`` statement. The\n``finally`` clause of such a statement can be used to specify cleanup\ncode which does not handle the exception, but is executed whether an\nexception occurred or not in the preceding code.\n\nPython uses the "termination" model of error handling: an exception\nhandler can find out what happened and continue execution at an outer\nlevel, but it cannot repair the cause of the error and retry the\nfailing operation (except by re-entering the offending piece of code\nfrom the top).\n\nWhen an exception is not handled at all, the interpreter terminates\nexecution of the program, or returns to its interactive main loop. In\neither case, it prints a stack backtrace, except when the exception is\n``SystemExit``.\n\nExceptions are identified by class instances. The ``except`` clause\nis selected depending on the class of the instance: it must reference\nthe class of the instance or a base class thereof. The instance can\nbe received by the handler and can carry additional information about\nthe exceptional condition.\n\nExceptions can also be identified by strings, in which case the\n``except`` clause is selected by object identity. An arbitrary value\ncan be raised along with the identifying string which can be passed to\nthe handler.\n\nNote: Messages to exceptions are not part of the Python API. Their\n contents may change from one version of Python to the next without\n warning and should not be relied on by code which will run under\n multiple versions of the interpreter.\n\nSee also the description of the ``try`` statement in section *The try\nstatement* and ``raise`` statement in section *The raise statement*.\n\n-[ Footnotes ]-\n\n[1] This limitation occurs because the code that is executed by these\n operations is not available at the time the module is compiled.\n', - 'exec': u'\nThe ``exec`` statement\n**********************\n\n exec_stmt ::= "exec" or_expr ["in" expression ["," expression]]\n\nThis statement supports dynamic execution of Python code. The first\nexpression should evaluate to either a string, an open file object, or\na code object. If it is a string, the string is parsed as a suite of\nPython statements which is then executed (unless a syntax error\noccurs). [1] If it is an open file, the file is parsed until EOF and\nexecuted. If it is a code object, it is simply executed. In all\ncases, the code that\'s executed is expected to be valid as file input\n(see section *File input*). Be aware that the ``return`` and\n``yield`` statements may not be used outside of function definitions\neven within the context of code passed to the ``exec`` statement.\n\nIn all cases, if the optional parts are omitted, the code is executed\nin the current scope. If only the first expression after ``in`` is\nspecified, it should be a dictionary, which will be used for both the\nglobal and the local variables. If two expressions are given, they\nare used for the global and local variables, respectively. If\nprovided, *locals* can be any mapping object.\n\nChanged in version 2.4: Formerly, *locals* was required to be a\ndictionary.\n\nAs a side effect, an implementation may insert additional keys into\nthe dictionaries given besides those corresponding to variable names\nset by the executed code. For example, the current implementation may\nadd a reference to the dictionary of the built-in module\n``__builtin__`` under the key ``__builtins__`` (!).\n\n**Programmer\'s hints:** dynamic evaluation of expressions is supported\nby the built-in function ``eval()``. The built-in functions\n``globals()`` and ``locals()`` return the current global and local\ndictionary, respectively, which may be useful to pass around for use\nby ``exec``.\n\n-[ Footnotes ]-\n\n[1] Note that the parser only accepts the Unix-style end of line\n convention. If you are reading the code from a file, make sure to\n use universal newline mode to convert Windows or Mac-style\n newlines.\n', - 'execmodel': u'\nExecution model\n***************\n\n\nNaming and binding\n==================\n\n*Names* refer to objects. Names are introduced by name binding\noperations. Each occurrence of a name in the program text refers to\nthe *binding* of that name established in the innermost function block\ncontaining the use.\n\nA *block* is a piece of Python program text that is executed as a\nunit. The following are blocks: a module, a function body, and a class\ndefinition. Each command typed interactively is a block. A script\nfile (a file given as standard input to the interpreter or specified\non the interpreter command line the first argument) is a code block.\nA script command (a command specified on the interpreter command line\nwith the \'**-c**\' option) is a code block. The file read by the\nbuilt-in function ``execfile()`` is a code block. The string argument\npassed to the built-in function ``eval()`` and to the ``exec``\nstatement is a code block. The expression read and evaluated by the\nbuilt-in function ``input()`` is a code block.\n\nA code block is executed in an *execution frame*. A frame contains\nsome administrative information (used for debugging) and determines\nwhere and how execution continues after the code block\'s execution has\ncompleted.\n\nA *scope* defines the visibility of a name within a block. If a local\nvariable is defined in a block, its scope includes that block. If the\ndefinition occurs in a function block, the scope extends to any blocks\ncontained within the defining one, unless a contained block introduces\na different binding for the name. The scope of names defined in a\nclass block is limited to the class block; it does not extend to the\ncode blocks of methods -- this includes generator expressions since\nthey are implemented using a function scope. This means that the\nfollowing will fail:\n\n class A:\n a = 42\n b = list(a + i for i in range(10))\n\nWhen a name is used in a code block, it is resolved using the nearest\nenclosing scope. The set of all such scopes visible to a code block\nis called the block\'s *environment*.\n\nIf a name is bound in a block, it is a local variable of that block.\nIf a name is bound at the module level, it is a global variable. (The\nvariables of the module code block are local and global.) If a\nvariable is used in a code block but not defined there, it is a *free\nvariable*.\n\nWhen a name is not found at all, a ``NameError`` exception is raised.\nIf the name refers to a local variable that has not been bound, a\n``UnboundLocalError`` exception is raised. ``UnboundLocalError`` is a\nsubclass of ``NameError``.\n\nThe following constructs bind names: formal parameters to functions,\n``import`` statements, class and function definitions (these bind the\nclass or function name in the defining block), and targets that are\nidentifiers if occurring in an assignment, ``for`` loop header, in the\nsecond position of an ``except`` clause header or after ``as`` in a\n``with`` statement. The ``import`` statement of the form ``from ...\nimport *`` binds all names defined in the imported module, except\nthose beginning with an underscore. This form may only be used at the\nmodule level.\n\nA target occurring in a ``del`` statement is also considered bound for\nthis purpose (though the actual semantics are to unbind the name). It\nis illegal to unbind a name that is referenced by an enclosing scope;\nthe compiler will report a ``SyntaxError``.\n\nEach assignment or import statement occurs within a block defined by a\nclass or function definition or at the module level (the top-level\ncode block).\n\nIf a name binding operation occurs anywhere within a code block, all\nuses of the name within the block are treated as references to the\ncurrent block. This can lead to errors when a name is used within a\nblock before it is bound. This rule is subtle. Python lacks\ndeclarations and allows name binding operations to occur anywhere\nwithin a code block. The local variables of a code block can be\ndetermined by scanning the entire text of the block for name binding\noperations.\n\nIf the global statement occurs within a block, all uses of the name\nspecified in the statement refer to the binding of that name in the\ntop-level namespace. Names are resolved in the top-level namespace by\nsearching the global namespace, i.e. the namespace of the module\ncontaining the code block, and the builtins namespace, the namespace\nof the module ``__builtin__``. The global namespace is searched\nfirst. If the name is not found there, the builtins namespace is\nsearched. The global statement must precede all uses of the name.\n\nThe builtins namespace associated with the execution of a code block\nis actually found by looking up the name ``__builtins__`` in its\nglobal namespace; this should be a dictionary or a module (in the\nlatter case the module\'s dictionary is used). By default, when in the\n``__main__`` module, ``__builtins__`` is the built-in module\n``__builtin__`` (note: no \'s\'); when in any other module,\n``__builtins__`` is an alias for the dictionary of the ``__builtin__``\nmodule itself. ``__builtins__`` can be set to a user-created\ndictionary to create a weak form of restricted execution.\n\n**CPython implementation detail:** Users should not touch\n``__builtins__``; it is strictly an implementation detail. Users\nwanting to override values in the builtins namespace should ``import``\nthe ``__builtin__`` (no \'s\') module and modify its attributes\nappropriately.\n\nThe namespace for a module is automatically created the first time a\nmodule is imported. The main module for a script is always called\n``__main__``.\n\nThe ``global`` statement has the same scope as a name binding\noperation in the same block. If the nearest enclosing scope for a\nfree variable contains a global statement, the free variable is\ntreated as a global.\n\nA class definition is an executable statement that may use and define\nnames. These references follow the normal rules for name resolution.\nThe namespace of the class definition becomes the attribute dictionary\nof the class. Names defined at the class scope are not visible in\nmethods.\n\n\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\nIf ``exec`` is used in a function and the function contains or is a\nnested block with free variables, the compiler will raise a\n``SyntaxError`` unless the exec explicitly specifies the local\nnamespace for the ``exec``. (In other words, ``exec obj`` would be\nillegal, but ``exec obj in ns`` would be legal.)\n\nThe ``eval()``, ``execfile()``, and ``input()`` functions and the\n``exec`` statement do not have access to the full environment for\nresolving names. Names may be resolved in the local and global\nnamespaces of the caller. Free variables are not resolved in the\nnearest enclosing namespace, but in the global namespace. [1] The\n``exec`` statement and the ``eval()`` and ``execfile()`` functions\nhave optional arguments to override the global and local namespace.\nIf only one namespace is specified, it is used for both.\n\n\nExceptions\n==========\n\nExceptions are a means of breaking out of the normal flow of control\nof a code block in order to handle errors or other exceptional\nconditions. An exception is *raised* at the point where the error is\ndetected; it may be *handled* by the surrounding code block or by any\ncode block that directly or indirectly invoked the code block where\nthe error occurred.\n\nThe Python interpreter raises an exception when it detects a run-time\nerror (such as division by zero). A Python program can also\nexplicitly raise an exception with the ``raise`` statement. Exception\nhandlers are specified with the ``try`` ... ``except`` statement. The\n``finally`` clause of such a statement can be used to specify cleanup\ncode which does not handle the exception, but is executed whether an\nexception occurred or not in the preceding code.\n\nPython uses the "termination" model of error handling: an exception\nhandler can find out what happened and continue execution at an outer\nlevel, but it cannot repair the cause of the error and retry the\nfailing operation (except by re-entering the offending piece of code\nfrom the top).\n\nWhen an exception is not handled at all, the interpreter terminates\nexecution of the program, or returns to its interactive main loop. In\neither case, it prints a stack backtrace, except when the exception is\n``SystemExit``.\n\nExceptions are identified by class instances. The ``except`` clause\nis selected depending on the class of the instance: it must reference\nthe class of the instance or a base class thereof. The instance can\nbe received by the handler and can carry additional information about\nthe exceptional condition.\n\nExceptions can also be identified by strings, in which case the\n``except`` clause is selected by object identity. An arbitrary value\ncan be raised along with the identifying string which can be passed to\nthe handler.\n\nNote: Messages to exceptions are not part of the Python API. Their\n contents may change from one version of Python to the next without\n warning and should not be relied on by code which will run under\n multiple versions of the interpreter.\n\nSee also the description of the ``try`` statement in section *The try\nstatement* and ``raise`` statement in section *The raise statement*.\n\n-[ Footnotes ]-\n\n[1] This limitation occurs because the code that is executed by these\n operations is not available at the time the module is compiled.\n', - 'exprlists': u'\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': u'\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 of floating point numbers can\nlook like octal integers, but are interpreted using radix 10. For\nexample, ``077e010`` is legal, and denotes the same number as\n``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': u'\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, and then the suite is executed. When the items are\nexhausted (which is immediately when the sequence is empty), the suite\nin the ``else`` clause, if present, is executed, and the loop\nterminates.\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\nThe target list is not deleted when the loop is finished, but if the\nsequence is empty, it will not have been assigned to at all by the\nloop. Hint: the built-in function ``range()`` returns a sequence of\nintegers suitable to emulate the effect of Pascal\'s ``for i := a to b\ndo``; e.g., ``range(3)`` returns the list ``[0, 1, 2]``.\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 internal\n counter is used to keep track of which item is used next, and this\n is incremented on each iteration. When this counter has reached the\n length of the sequence the loop terminates. This means that if the\n suite deletes the current (or a previous) item from the sequence,\n the next item will be skipped (since it gets the index of the\n 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': u'\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 ::= +\n conversion ::= "r" | "s"\n format_spec ::= \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\neither a number or a keyword. If it\'s a number, it refers to a\npositional argument, and if it\'s a keyword, it refers to a named\nkeyword argument. If the numerical arg_names in a format string are\n0, 1, 2, ... in sequence, they can all be omitted (not just some) and\nthe numbers 0, 1, 2, ... will be automatically inserted in that order.\nThe *arg_name* can be followed by any number of index or attribute\nexpressions. An expression of the form ``\'.name\'`` selects the named\nattribute using ``getattr()``, while an expression of the form\n``\'[index]\'`` does an index lookup using ``__getitem__()``.\n\nChanged in version 2.7: 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\nTwo conversion flags are currently supported: ``\'!s\'`` which calls\n``str()`` on the value, and ``\'!r\'`` which calls ``repr()``.\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\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 ::= \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 is only valid for integers, and only for binary,\noctal, or hexadecimal output. If present, it specifies that the\noutput will be prefixed by ``\'0b\'``, ``\'0o\'``, or ``\'0x\'``,\nrespectively.\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 2.7: 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\'``. |\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 | The same as ``\'g\'``. |\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\') # 2.7+ 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(object):\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.5\n >>> total = 22\n >>> \'Correct answers: {:.2%}.\'.format(points/total)\n \'Correct answers: 88.64%\'\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),\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': u'\nFunction definitions\n********************\n\nA function definition defines a user-defined function object (see\nsection *The standard type hierarchy*):\n\n decorated ::= decorators (classdef | funcdef)\n decorators ::= decorator+\n decorator ::= "@" dotted_name ["(" [argument_list [","]] ")"] NEWLINE\n funcdef ::= "def" funcname "(" [parameter_list] ")" ":" suite\n dotted_name ::= identifier ("." identifier)*\n parameter_list ::= (defparameter ",")*\n ( "*" identifier [, "**" identifier]\n | "**" identifier\n | defparameter [","] )\n defparameter ::= parameter ["=" expression]\n sublist ::= parameter ("," parameter)* [","]\n parameter ::= identifier | "(" sublist ")"\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 top-level 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 must also have a default value --- this is a syntactic\nrestriction 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 that 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.\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.\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', - 'global': u'\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 an\n``exec`` statement does not affect the code block *containing* the\n``exec`` statement, and code contained in an ``exec`` statement is\nunaffected by ``global`` statements in the code containing the\n``exec`` statement. The same applies to the ``eval()``,\n``execfile()`` and ``compile()`` functions.\n', - 'id-classes': u'\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 ``__builtin__`` module.\n When not in interactive mode, ``_`` has no special meaning and is\n not 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': u'\nIdentifiers and keywords\n************************\n\nIdentifiers (also referred to as *names*) are described by the\nfollowing lexical definitions:\n\n identifier ::= (letter|"_") (letter | digit | "_")*\n letter ::= lowercase | uppercase\n lowercase ::= "a"..."z"\n uppercase ::= "A"..."Z"\n digit ::= "0"..."9"\n\nIdentifiers are unlimited in length. Case is significant.\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 and del from not while\n as elif global or with\n assert else if pass yield\n break except import print\n class exec in raise\n continue finally is return\n def for lambda try\n\nChanged in version 2.4: ``None`` became a constant and is now\nrecognized by the compiler as a name for the built-in object ``None``.\nAlthough it is not a keyword, you cannot assign a different object to\nit.\n\nChanged in version 2.5: Both ``as`` and ``with`` are only recognized\nwhen the ``with_statement`` future feature has been enabled. It will\nalways be enabled in Python 2.6. See section *The with statement* for\ndetails. Note that using ``as`` and ``with`` as identifiers will\nalways issue a warning, even when the ``with_statement`` future\ndirective is not in effect.\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 ``__builtin__`` module.\n When not in interactive mode, ``_`` has no special meaning and is\n not 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': u'\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': u'\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': u'\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.\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.\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. If the\nwild card form of import --- ``import *`` --- is used in a function\nand the function contains or is a nested block with free variables,\nthe compiler will 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 2.6 are ``unicode_literals``,\n``print_function``, ``absolute_import``, ``division``, ``generators``,\n``nested_scopes`` and ``with_statement``. ``generators``,\n``with_statement``, ``nested_scopes`` are redundant in Python version\n2.6 and above because they are always enabled.\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 an ``exec`` statement or calls to the built-in\nfunctions ``compile()`` and ``execfile()`` that occur in a module\n``M`` containing a future statement will, by default, use the new\nsyntax or semantics associated with the future statement. This can,\nstarting with Python 2.2 be controlled by optional arguments to\n``compile()`` --- see the documentation of that function for 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': u'\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 forms ``<>`` and ``!=`` are equivalent; for consistency with C,\n``!=`` is preferred; where ``!=`` is mentioned below ``<>`` is also\naccepted. The ``<>`` spelling is considered obsolescent.\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,\nobjects of different types *always* compare unequal, and are ordered\nconsistently but arbitrarily. You can control comparison behavior of\nobjects of non-built-in types by defining a ``__cmp__`` method or rich\ncomparison methods like ``__gt__``, described in section *Special\nmethod names*.\n\n(This unusual definition of comparison was used to simplify the\ndefinition of operations like sorting and the ``in`` and ``not in``\noperators. In the future, the comparison rules for objects of\ndifferent types are likely to change.)\n\nComparison of objects of the same type depends on the type:\n\n* Numbers are compared arithmetically.\n\n* Strings are compared lexicographically using the numeric equivalents\n (the result of the built-in function ``ord()``) of their characters.\n Unicode and 8-bit strings are fully interoperable in this behavior.\n [4]\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, ``cmp([1,2,x], [1,2,y])`` returns\n the same as ``cmp(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 their sorted\n (key, value) lists compare equal. [5] Outcomes other than equality\n are resolved consistently, but are not otherwise defined. [6]\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\nThe operators ``in`` and ``not in`` test for collection membership.\n``x in s`` evaluates to true if *x* is a member of the collection *s*,\nand false otherwise. ``x not in s`` returns the negation of ``x in\ns``. The collection membership test has traditionally been bound to\nsequences; an object is a member of a collection if the collection is\na sequence and contains an element equal to that object. However, it\nmake sense for many other object types to support membership tests\nwithout being a sequence. In particular, dictionaries (for keys) and\nsets support membership testing.\n\nFor the list and tuple types, ``x in y`` is true if and only if there\nexists an index *i* such that ``x == y[i]`` is true.\n\nFor the Unicode and string types, ``x in y`` is true if and only if\n*x* is a substring of *y*. An equivalent test is ``y.find(x) != -1``.\nNote, *x* and *y* need not be the same type; consequently, ``u\'ab\' in\n\'abc\'`` will return ``True``. Empty strings are always considered to\nbe a substring of any other string, so ``"" in "abc"`` will return\n``True``.\n\nChanged in version 2.3: Previously, *x* was required to be a string of\nlength ``1``.\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. [7]\n', - 'integers': u'\nInteger and long integer literals\n*********************************\n\nInteger and long integer literals are described by the following\nlexical definitions:\n\n longinteger ::= integer ("l" | "L")\n integer ::= decimalinteger | octinteger | hexinteger | bininteger\n decimalinteger ::= nonzerodigit digit* | "0"\n octinteger ::= "0" ("o" | "O") octdigit+ | "0" octdigit+\n hexinteger ::= "0" ("x" | "X") hexdigit+\n bininteger ::= "0" ("b" | "B") bindigit+\n nonzerodigit ::= "1"..."9"\n octdigit ::= "0"..."7"\n bindigit ::= "0" | "1"\n hexdigit ::= digit | "a"..."f" | "A"..."F"\n\nAlthough both lower case ``\'l\'`` and upper case ``\'L\'`` are allowed as\nsuffix for long integers, it is strongly recommended to always use\n``\'L\'``, since the letter ``\'l\'`` looks too much like the digit\n``\'1\'``.\n\nPlain integer literals that are above the largest representable plain\ninteger (e.g., 2147483647 when using 32-bit arithmetic) are accepted\nas if they were long integers instead. [1] There is no limit for long\ninteger literals apart from what can be stored in available memory.\n\nSome examples of plain integer literals (first row) and long integer\nliterals (second and third rows):\n\n 7 2147483647 0177\n 3L 79228162514264337593543950336L 0377L 0x100000000L\n 79228162514264337593543950336 0xdeadbeef\n', - 'lambda': u'\nLambdas\n*******\n\n lambda_form ::= "lambda" [parameter_list]: expression\n old_lambda_form ::= "lambda" [parameter_list]: old_expression\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 name(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.\n', - 'lists': u'\nList displays\n*************\n\nA list display is a possibly empty series of expressions enclosed in\nsquare brackets:\n\n list_display ::= "[" [expression_list | list_comprehension] "]"\n list_comprehension ::= expression list_for\n list_for ::= "for" target_list "in" old_expression_list [list_iter]\n old_expression_list ::= old_expression [("," old_expression)+ [","]]\n old_expression ::= or_test | old_lambda_form\n list_iter ::= list_for | list_if\n list_if ::= "if" old_expression [list_iter]\n\nA list display yields a new list object. Its contents are specified\nby providing either a list of expressions or a list comprehension.\nWhen a comma-separated list of expressions is supplied, its elements\nare evaluated from left to right and placed into the list object in\nthat order. When a list comprehension is supplied, it consists of a\nsingle expression followed by at least one ``for`` clause and zero or\nmore ``for`` or ``if`` clauses. In this case, the elements of the new\nlist are those that would be produced by considering each of the\n``for`` or ``if`` clauses a block, nesting from left to right, and\nevaluating the expression to produce a list element each time the\ninnermost block is reached [1].\n', - 'naming': u"\nNaming and binding\n******************\n\n*Names* refer to objects. Names are introduced by name binding\noperations. Each occurrence of a name in the program text refers to\nthe *binding* of that name established in the innermost function block\ncontaining the use.\n\nA *block* is a piece of Python program text that is executed as a\nunit. The following are blocks: a module, a function body, and a class\ndefinition. Each command typed interactively is a block. A script\nfile (a file given as standard input to the interpreter or specified\non the interpreter command line the first argument) is a code block.\nA script command (a command specified on the interpreter command line\nwith the '**-c**' option) is a code block. The file read by the\nbuilt-in function ``execfile()`` is a code block. The string argument\npassed to the built-in function ``eval()`` and to the ``exec``\nstatement is a code block. The expression read and evaluated by the\nbuilt-in function ``input()`` is a code block.\n\nA code block is executed in an *execution frame*. A frame contains\nsome administrative information (used for debugging) and determines\nwhere and how execution continues after the code block's execution has\ncompleted.\n\nA *scope* defines the visibility of a name within a block. If a local\nvariable is defined in a block, its scope includes that block. If the\ndefinition occurs in a function block, the scope extends to any blocks\ncontained within the defining one, unless a contained block introduces\na different binding for the name. The scope of names defined in a\nclass block is limited to the class block; it does not extend to the\ncode blocks of methods -- this includes generator expressions since\nthey are implemented using a function scope. This means that the\nfollowing will fail:\n\n class A:\n a = 42\n b = list(a + i for i in range(10))\n\nWhen a name is used in a code block, it is resolved using the nearest\nenclosing scope. The set of all such scopes visible to a code block\nis called the block's *environment*.\n\nIf a name is bound in a block, it is a local variable of that block.\nIf a name is bound at the module level, it is a global variable. (The\nvariables of the module code block are local and global.) If a\nvariable is used in a code block but not defined there, it is a *free\nvariable*.\n\nWhen a name is not found at all, a ``NameError`` exception is raised.\nIf the name refers to a local variable that has not been bound, a\n``UnboundLocalError`` exception is raised. ``UnboundLocalError`` is a\nsubclass of ``NameError``.\n\nThe following constructs bind names: formal parameters to functions,\n``import`` statements, class and function definitions (these bind the\nclass or function name in the defining block), and targets that are\nidentifiers if occurring in an assignment, ``for`` loop header, in the\nsecond position of an ``except`` clause header or after ``as`` in a\n``with`` statement. The ``import`` statement of the form ``from ...\nimport *`` binds all names defined in the imported module, except\nthose beginning with an underscore. This form may only be used at the\nmodule level.\n\nA target occurring in a ``del`` statement is also considered bound for\nthis purpose (though the actual semantics are to unbind the name). It\nis illegal to unbind a name that is referenced by an enclosing scope;\nthe compiler will report a ``SyntaxError``.\n\nEach assignment or import statement occurs within a block defined by a\nclass or function definition or at the module level (the top-level\ncode block).\n\nIf a name binding operation occurs anywhere within a code block, all\nuses of the name within the block are treated as references to the\ncurrent block. This can lead to errors when a name is used within a\nblock before it is bound. This rule is subtle. Python lacks\ndeclarations and allows name binding operations to occur anywhere\nwithin a code block. The local variables of a code block can be\ndetermined by scanning the entire text of the block for name binding\noperations.\n\nIf the global statement occurs within a block, all uses of the name\nspecified in the statement refer to the binding of that name in the\ntop-level namespace. Names are resolved in the top-level namespace by\nsearching the global namespace, i.e. the namespace of the module\ncontaining the code block, and the builtins namespace, the namespace\nof the module ``__builtin__``. The global namespace is searched\nfirst. If the name is not found there, the builtins namespace is\nsearched. The global statement must precede all uses of the name.\n\nThe builtins namespace associated with the execution of a code block\nis actually found by looking up the name ``__builtins__`` in its\nglobal namespace; this should be a dictionary or a module (in the\nlatter case the module's dictionary is used). By default, when in the\n``__main__`` module, ``__builtins__`` is the built-in module\n``__builtin__`` (note: no 's'); when in any other module,\n``__builtins__`` is an alias for the dictionary of the ``__builtin__``\nmodule itself. ``__builtins__`` can be set to a user-created\ndictionary to create a weak form of restricted execution.\n\n**CPython implementation detail:** Users should not touch\n``__builtins__``; it is strictly an implementation detail. Users\nwanting to override values in the builtins namespace should ``import``\nthe ``__builtin__`` (no 's') module and modify its attributes\nappropriately.\n\nThe namespace for a module is automatically created the first time a\nmodule is imported. The main module for a script is always called\n``__main__``.\n\nThe ``global`` statement has the same scope as a name binding\noperation in the same block. If the nearest enclosing scope for a\nfree variable contains a global statement, the free variable is\ntreated as a global.\n\nA class definition is an executable statement that may use and define\nnames. These references follow the normal rules for name resolution.\nThe namespace of the class definition becomes the attribute dictionary\nof the class. Names defined at the class scope are not visible in\nmethods.\n\n\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\nIf ``exec`` is used in a function and the function contains or is a\nnested block with free variables, the compiler will raise a\n``SyntaxError`` unless the exec explicitly specifies the local\nnamespace for the ``exec``. (In other words, ``exec obj`` would be\nillegal, but ``exec obj in ns`` would be legal.)\n\nThe ``eval()``, ``execfile()``, and ``input()`` functions and the\n``exec`` statement do not have access to the full environment for\nresolving names. Names may be resolved in the local and global\nnamespaces of the caller. Free variables are not resolved in the\nnearest enclosing namespace, but in the global namespace. [1] The\n``exec`` statement and the ``eval()`` and ``execfile()`` functions\nhave optional arguments to override the global and local namespace.\nIf only one namespace is specified, it is used for both.\n", - 'numbers': u"\nNumeric literals\n****************\n\nThere are four types of numeric literals: plain integers, long\nintegers, floating point numbers, and imaginary numbers. There are no\ncomplex literals (complex numbers can be formed by adding a real\nnumber and an imaginary 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': u'\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.__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 (``+``, ``-``, ``*``, ``//``, ``%``, ``divmod()``,\n ``pow()``, ``**``, ``<<``, ``>>``, ``&``, ``^``, ``|``). For\n instance, to evaluate the expression ``x + y``, where *x* is an\n 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__()`` (described below). Note\n that ``__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.__div__(self, other)\nobject.__truediv__(self, other)\n\n The division operator (``/``) is implemented by these methods. The\n ``__truediv__()`` method is used when ``__future__.division`` is in\n effect, otherwise ``__div__()`` is used. If only one of these two\n methods is defined, the object will not support division in the\n alternate context; ``TypeError`` will be raised instead.\n\nobject.__radd__(self, other)\nobject.__rsub__(self, other)\nobject.__rmul__(self, other)\nobject.__rdiv__(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 (``+``, ``-``, ``*``, ``/``, ``%``, ``divmod()``,\n ``pow()``, ``**``, ``<<``, ``>>``, ``&``, ``^``, ``|``) with\n reflected (swapped) operands. These functions are only called if\n the left operand does not support the corresponding operation and\n the operands are of different types. [2] For instance, to evaluate\n the expression ``x - y``, where *y* is an instance of a class that\n has an ``__rsub__()`` method, ``y.__rsub__(x)`` is called if\n ``x.__sub__(y)`` returns *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.__idiv__(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.__long__(self)\nobject.__float__(self)\n\n Called to implement the built-in functions ``complex()``,\n ``int()``, ``long()``, and ``float()``. Should return a value of\n the appropriate type.\n\nobject.__oct__(self)\nobject.__hex__(self)\n\n Called to implement the built-in functions ``oct()`` and ``hex()``.\n Should return a string value.\n\nobject.__index__(self)\n\n Called to implement ``operator.index()``. Also called whenever\n Python needs an integer object (such as in slicing). Must return\n an integer (int or long).\n\n New in version 2.5.\n\nobject.__coerce__(self, other)\n\n Called to implement "mixed-mode" numeric arithmetic. Should either\n return a 2-tuple containing *self* and *other* converted to a\n common numeric type, or ``None`` if conversion is impossible. When\n the common type would be the type of ``other``, it is sufficient to\n return ``None``, since the interpreter will also ask the other\n object to attempt a coercion (but sometimes, if the implementation\n of the other type cannot be changed, it is useful to do the\n conversion to the other type here). A return value of\n ``NotImplemented`` is equivalent to returning ``None``.\n', - 'objects': u'\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 provides a convenient way to do\nthis.\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': u'\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+-------------------------------------------------+---------------------------------------+\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| | [8] |\n+-------------------------------------------------+---------------------------------------+\n| ``+x``, ``-x``, ``~x`` | Positive, negative, bitwise NOT |\n+-------------------------------------------------+---------------------------------------+\n| ``**`` | Exponentiation [9] |\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, string |\n| | conversion |\n+-------------------------------------------------+---------------------------------------+\n\n-[ Footnotes ]-\n\n[1] In Python 2.3 and later releases, a list comprehension "leaks" the\n control variables of each ``for`` it contains into the containing\n scope. However, this behavior is deprecated, and relying on it\n will not work in Python 3.0\n\n[2] 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[3] If x is very close to an exact integer multiple of y, it\'s\n possible for ``floor(x/y)`` to be one larger than ``(x-x%y)/y``\n due to rounding. In such cases, Python returns the latter result,\n in order to preserve that ``divmod(x,y)[0] * y + x % y`` be very\n close to ``x``.\n\n[4] While comparisons between unicode strings make sense at the byte\n level, they may be counter-intuitive to users. For example, the\n strings ``u"\\u00C7"`` and ``u"\\u0043\\u0327"`` compare differently,\n even 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[5] The implementation computes this efficiently, without constructing\n lists or sorting.\n\n[6] Earlier versions of Python used lexicographic comparison of the\n sorted (key, value) lists, but this was very expensive for the\n common case of comparing for equality. An even earlier version of\n Python compared dictionaries by identity only, but this caused\n surprises because people expected to be able to test a dictionary\n for emptiness by comparing it to ``{}``.\n\n[7] 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[8] The ``%`` operator is also used for string formatting; the same\n precedence applies.\n\n[9] 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': u'\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': u'\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. The result type is that of the\narguments after coercion.\n\nWith mixed operand types, the coercion rules for binary arithmetic\noperators apply. For int and long int operands, the result has the\nsame type as the operands (after coercion) unless the second argument\nis negative; in that case, all arguments are converted to float and a\nfloat result is delivered. For example, ``10**2`` returns ``100``, but\n``10**-2`` returns ``0.01``. (This last feature was added in Python\n2.2. In Python 2.1 and before, if both arguments were of integer types\nand the second argument was negative, an exception was raised).\n\nRaising ``0.0`` to a negative power results in a\n``ZeroDivisionError``. Raising a negative number to a fractional power\nresults in a ``ValueError``.\n', - 'print': u'\nThe ``print`` statement\n***********************\n\n print_stmt ::= "print" ([expression ("," expression)* [","]]\n | ">>" expression [("," expression)+ [","]])\n\n``print`` evaluates each expression in turn and writes the resulting\nobject to standard output (see below). If an object is not a string,\nit is first converted to a string using the rules for string\nconversions. The (resulting or original) string is then written. A\nspace is written before each object is (converted and) written, unless\nthe output system believes it is positioned at the beginning of a\nline. This is the case (1) when no characters have yet been written\nto standard output, (2) when the last character written to standard\noutput is a whitespace character except ``\' \'``, or (3) when the last\nwrite operation on standard output was not a ``print`` statement. (In\nsome cases it may be functional to write an empty string to standard\noutput for this reason.)\n\nNote: Objects which act like file objects but which are not the built-in\n file objects often do not properly emulate this aspect of the file\n object\'s behavior, so it is best not to rely on this.\n\nA ``\'\\n\'`` character is written at the end, unless the ``print``\nstatement ends with a comma. This is the only action if the statement\ncontains just the keyword ``print``.\n\nStandard output is defined as the file object named ``stdout`` in the\nbuilt-in module ``sys``. If no such object exists, or if it does not\nhave a ``write()`` method, a ``RuntimeError`` exception is raised.\n\n``print`` also has an extended form, defined by the second portion of\nthe syntax described above. This form is sometimes referred to as\n"``print`` chevron." In this form, the first expression after the\n``>>`` must evaluate to a "file-like" object, specifically an object\nthat has a ``write()`` method as described above. With this extended\nform, the subsequent expressions are printed to this file object. If\nthe first expression evaluates to ``None``, then ``sys.stdout`` is\nused as the file for output.\n', - 'raise': u'\nThe ``raise`` statement\n***********************\n\n raise_stmt ::= "raise" [expression ["," expression ["," 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 ``TypeError`` exception is raised indicating that\nthis is an error (if running under IDLE, a ``Queue.Empty`` exception\nis raised instead).\n\nOtherwise, ``raise`` evaluates the expressions to get three objects,\nusing ``None`` as the value of omitted expressions. The first two\nobjects are used to determine the *type* and *value* of the exception.\n\nIf the first object is an instance, the type of the exception is the\nclass of the instance, the instance itself is the value, and the\nsecond object must be ``None``.\n\nIf the first object is a class, it becomes the type of the exception.\nThe second object is used to determine the exception value: If it is\nan instance of the class, the instance becomes the exception value. If\nthe second object is a tuple, it is used as the argument list for the\nclass constructor; if it is ``None``, an empty argument list is used,\nand any other object is treated as a single argument to the\nconstructor. The instance so created by calling the constructor is\nused as the exception value.\n\nIf a third object is present and not ``None``, it must be a traceback\nobject (see section *The standard type hierarchy*), and it is\nsubstituted instead of the current location as the place where the\nexception occurred. If the third object is present and not a\ntraceback object or ``None``, a ``TypeError`` exception is raised.\nThe three-expression form of ``raise`` is useful to re-raise an\nexception transparently in an except clause, but ``raise`` with no\nexpressions should be preferred if the exception to be re-raised was\nthe most recently active exception in the current scope.\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': u'\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', - 'sequence-methods': u'\nAdditional methods for emulation of sequence types\n**************************************************\n\nThe following optional methods can be defined to further emulate\nsequence objects. Immutable sequences methods should at most only\ndefine ``__getslice__()``; mutable sequences might define all three\nmethods.\n\nobject.__getslice__(self, i, j)\n\n Deprecated since version 2.0: Support slice objects as parameters\n to the ``__getitem__()`` method. (However, built-in types in\n CPython currently still implement ``__getslice__()``. Therefore,\n you have to override it in derived classes when implementing\n slicing.)\n\n Called to implement evaluation of ``self[i:j]``. The returned\n object should be of the same type as *self*. Note that missing *i*\n or *j* in the slice expression are replaced by zero or\n ``sys.maxint``, respectively. If negative indexes are used in the\n slice, the length of the sequence is added to that index. If the\n instance does not implement the ``__len__()`` method, an\n ``AttributeError`` is raised. No guarantee is made that indexes\n adjusted this way are not still negative. Indexes which are\n greater than the length of the sequence are not modified. If no\n ``__getslice__()`` is found, a slice object is created instead, and\n passed to ``__getitem__()`` instead.\n\nobject.__setslice__(self, i, j, sequence)\n\n Called to implement assignment to ``self[i:j]``. Same notes for *i*\n and *j* as for ``__getslice__()``.\n\n This method is deprecated. If no ``__setslice__()`` is found, or\n for extended slicing of the form ``self[i:j:k]``, a slice object is\n created, and passed to ``__setitem__()``, instead of\n ``__setslice__()`` being called.\n\nobject.__delslice__(self, i, j)\n\n Called to implement deletion of ``self[i:j]``. Same notes for *i*\n and *j* as for ``__getslice__()``. This method is deprecated. If no\n ``__delslice__()`` is found, or for extended slicing of the form\n ``self[i:j:k]``, a slice object is created, and passed to\n ``__delitem__()``, instead of ``__delslice__()`` being called.\n\nNotice that these methods are only invoked when a single slice with a\nsingle colon is used, and the slice method is available. For slice\noperations involving extended slice notation, or in absence of the\nslice methods, ``__getitem__()``, ``__setitem__()`` or\n``__delitem__()`` is called with a slice object as argument.\n\nThe following example demonstrate how to make your program or module\ncompatible with earlier versions of Python (assuming that methods\n``__getitem__()``, ``__setitem__()`` and ``__delitem__()`` support\nslice objects as arguments):\n\n class MyClass:\n ...\n def __getitem__(self, index):\n ...\n def __setitem__(self, index, value):\n ...\n def __delitem__(self, index):\n ...\n\n if sys.version_info < (2, 0):\n # They won\'t be defined if version is at least 2.0 final\n\n def __getslice__(self, i, j):\n return self[max(0, i):max(0, j):]\n def __setslice__(self, i, j, seq):\n self[max(0, i):max(0, j):] = seq\n def __delslice__(self, i, j):\n del self[max(0, i):max(0, j):]\n ...\n\nNote the calls to ``max()``; these are necessary because of the\nhandling of negative indices before the ``__*slice__()`` methods are\ncalled. When negative indexes are used, the ``__*item__()`` methods\nreceive them as provided, but the ``__*slice__()`` methods get a\n"cooked" form of the index values. For each negative index value, the\nlength of the sequence is added to the index before calling the method\n(which may still result in a negative index); this is the customary\nhandling of negative indexes by the built-in sequence types, and the\n``__*item__()`` methods are expected to do this as well. However,\nsince they should already be doing that, negative indexes cannot be\npassed in; they must be constrained to the bounds of the sequence\nbefore being passed to the ``__*item__()`` methods. Calling ``max(0,\ni)`` conveniently returns the proper value.\n', - 'sequence-types': u"\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. (For backwards compatibility, the method\n``__getslice__()`` (see below) can also be defined to handle simple,\nbut not extended slices.) It is also recommended that mappings provide\nthe methods ``keys()``, ``values()``, ``items()``, ``has_key()``,\n``get()``, ``clear()``, ``setdefault()``, ``iterkeys()``,\n``itervalues()``, ``iteritems()``, ``pop()``, ``popitem()``,\n``copy()``, and ``update()`` behaving similar to those for Python's\nstandard dictionary objects. The ``UserDict`` module provides a\n``DictMixin`` class to help create those methods from a base set of\n``__getitem__()``, ``__setitem__()``, ``__delitem__()``, and\n``keys()``. Mutable sequences should provide methods ``append()``,\n``count()``, ``index()``, ``extend()``, ``insert()``, ``pop()``,\n``remove()``, ``reverse()`` and ``sort()``, like Python standard list\nobjects. Finally, sequence types should implement addition (meaning\nconcatenation) and multiplication (meaning repetition) by defining the\nmethods ``__add__()``, ``__radd__()``, ``__iadd__()``, ``__mul__()``,\n``__rmul__()`` and ``__imul__()`` described below; they should not\ndefine ``__coerce__()`` or other numerical operators. It is\nrecommended that both mappings and sequences implement the\n``__contains__()`` method to allow efficient use of the ``in``\noperator; for mappings, ``in`` should be equivalent of ``has_key()``;\nfor sequences, 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``iterkeys()``; 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 ``__nonzero__()`` method and whose\n ``__len__()`` method returns zero is considered to be false in a\n Boolean context.\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 ``iterkeys()``.\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\n New in version 2.6.\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': u'\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 plain or long integers as arguments. The\narguments are converted to a common type. 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,\nn)``. Negative shift counts raise a ``ValueError`` exception.\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': u'\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 ::= simple_slicing | extended_slicing\n simple_slicing ::= primary "[" short_slice "]"\n extended_slicing ::= primary "[" slice_list "]"\n slice_list ::= slice_item ("," slice_item)* [","]\n slice_item ::= expression | proper_slice | ellipsis\n proper_slice ::= short_slice | long_slice\n short_slice ::= [lower_bound] ":" [upper_bound]\n long_slice ::= short_slice ":" [stride]\n lower_bound ::= expression\n upper_bound ::= expression\n stride ::= expression\n ellipsis ::= "..."\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 nor ellipses). Similarly, when the slice\nlist has exactly one short slice and no trailing comma, the\ninterpretation as a simple slicing takes priority over that as an\nextended slicing.\n\nThe semantics for a simple slicing are as follows. The primary must\nevaluate to a sequence object. The lower and upper bound expressions,\nif present, must evaluate to plain integers; defaults are zero and the\n``sys.maxint``, respectively. If either bound is negative, the\nsequence\'s length is added to it. The slicing now selects all items\nwith index *k* such that ``i <= k < j`` where *i* and *j* are the\nspecified lower and upper bounds. This may be an empty sequence. It\nis not an error if *i* or *j* lie outside the range of valid indexes\n(such items don\'t exist so they aren\'t selected).\n\nThe semantics for an extended slicing are as follows. The primary\nmust evaluate to a mapping object, and it is indexed with a key that\nis constructed 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 an ellipsis slice\nitem is the built-in ``Ellipsis`` object. The conversion of a proper\nslice is a slice object (see section *The standard type hierarchy*)\nwhose ``start``, ``stop`` and ``step`` attributes are the values of\nthe expressions given as lower bound, upper bound and stride,\nrespectively, substituting ``None`` for missing expressions.\n', - 'specialattrs': u"\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\nobject.__methods__\n\n Deprecated since version 2.2: Use the built-in function ``dir()``\n to get a list of an object's attributes. This attribute is no\n longer available.\n\nobject.__members__\n\n Deprecated since version 2.2: Use the built-in function ``dir()``\n to get a list of an object's attributes. This attribute is no\n longer available.\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\nThe following attributes are only supported by *new-style class*es.\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 new-style class keeps a list of weak references to its\n immediate subclasses. This method returns a list of all those\n references still alive. Example:\n\n >>> int.__subclasses__()\n []\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] To format only a tuple you should therefore provide a singleton\n tuple whose only element is the tuple to be formatted.\n\n[5] The advantage of leaving the newline on is that returning an empty\n string is then an unambiguous EOF indication. It is also possible\n (in cases where it might matter, for example, if you want to make\n an exact copy of a file while scanning its lines) to tell whether\n the last line of a file ended in a newline or not (yes this\n happens!).\n", - 'specialnames': u'\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 ``x.__getitem__(i)`` for\nold-style classes and ``type(x).__getitem__(x, i)`` for new-style\nclasses. Except where mentioned, attempts to execute an operation\nraise an 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_traceback`` 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.exc_traceback`` or ``sys.last_traceback``. Circular\n references which are garbage are detected when the option cycle\n detector is enabled (it\'s on by default), but can only be cleaned\n up if there are no Python-level ``__del__()`` methods involved.\n Refer to the documentation for the ``gc`` module for more\n information about how ``__del__()`` methods are handled by the\n cycle detector, particularly the description of the ``garbage``\n 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 and by string\n conversions (reverse quotes) to compute the "official" string\n representation of an object. If at all possible, this should look\n like a valid Python expression that could be used to recreate an\n object with the same value (given an appropriate environment). If\n this is not possible, a string of the form ``<...some useful\n description...>`` should be returned. The return value must be a\n string object. If a class defines ``__repr__()`` but not\n ``__str__()``, then ``__repr__()`` is also used when an "informal"\n string representation of instances of that class is 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 statement 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.__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 New in version 2.1.\n\n These are the so-called "rich comparison" methods, and are called\n for comparison operators in preference to ``__cmp__()`` below. The\n correspondence between operator symbols and method names is as\n follows: ``xy`` call ``x.__ne__(y)``, ``x>y`` calls ``x.__gt__(y)``, and\n ``x>=y`` calls ``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.__cmp__(self, other)\n\n Called by comparison operations if rich comparison (see above) is\n not defined. Should return a negative integer if ``self < other``,\n zero if ``self == other``, a positive integer if ``self > other``.\n If no ``__cmp__()``, ``__eq__()`` or ``__ne__()`` operation is\n defined, class instances are compared by object identity\n ("address"). See also the description of ``__hash__()`` for some\n important notes on creating *hashable* objects which support custom\n comparison operations and are usable as dictionary keys. (Note: the\n restriction that exceptions are not propagated by ``__cmp__()`` has\n been removed since Python 1.5.)\n\nobject.__rcmp__(self, other)\n\n Changed in version 2.1: No longer supported.\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 a ``__cmp__()`` or ``__eq__()`` method\n it should not define a ``__hash__()`` operation either; if it\n defines ``__cmp__()`` or ``__eq__()`` but not ``__hash__()``, its\n instances will not be usable in hashed collections. If a class\n defines mutable objects and implements a ``__cmp__()`` or\n ``__eq__()`` method, it should not implement ``__hash__()``, since\n hashable collection implementations require that a object\'s hash\n value is immutable (if the object\'s hash value changes, it will be\n in the wrong hash bucket).\n\n User-defined classes have ``__cmp__()`` 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 ``__cmp__()`` or ``__eq__()`` such that\n the hash value returned is no longer appropriate (e.g. by switching\n to a value-based concept of equality instead of the default\n identity based equality) can explicitly flag themselves as being\n unhashable by setting ``__hash__ = None`` in the class definition.\n Doing so means that not only will instances of the class raise an\n appropriate ``TypeError`` when a program attempts to retrieve their\n hash value, but they will also be correctly identified as\n unhashable when checking ``isinstance(obj, collections.Hashable)``\n (unlike classes which define their own ``__hash__()`` to explicitly\n raise ``TypeError``).\n\n Changed in version 2.5: ``__hash__()`` may now also return a long\n integer object; the 32-bit integer is then derived from the hash of\n that object.\n\n Changed in version 2.6: ``__hash__`` may now be set to ``None`` to\n explicitly flag instances of a class as unhashable.\n\nobject.__nonzero__(self)\n\n Called to implement truth value testing and the built-in operation\n ``bool()``; should return ``False`` or ``True``, or their integer\n equivalents ``0`` or ``1``. When this method is not defined,\n ``__len__()`` is called, if it is defined, and the object is\n considered true if its result is nonzero. If a class defines\n neither ``__len__()`` nor ``__nonzero__()``, all its instances are\n considered true.\n\nobject.__unicode__(self)\n\n Called to implement ``unicode()`` built-in; should return a Unicode\n object. When this method is not defined, string conversion is\n attempted, and the result of string conversion is converted to\n Unicode using the system default encoding.\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 in new-style classes.\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 not simply execute ``self.name = value`` --- this would\n cause a recursive call to itself. Instead, it should insert the\n value in the dictionary of instance attributes, e.g.,\n ``self.__dict__[name] = value``. For new-style classes, rather\n than accessing the instance dictionary, it should call the base\n 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\n\nMore attribute access for new-style classes\n-------------------------------------------\n\nThe following methods only apply to new-style classes.\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 for new-style\n classes*.\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. Note that descriptors are only invoked for new\nstyle objects or classes (ones that subclass ``object()`` or\n``type()``).\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 a new-style object instance, ``a.x`` is transformed\n into the call: ``type(a).__dict__[\'x\'].__get__(a, type(a))``.\n\nClass Binding\n If binding to a new-style class, ``A.x`` is transformed into the\n call: ``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 both old and new-style classes have a\ndictionary for attribute storage. This wastes space for objects\nhaving very few instance variables. The space consumption can become\nacute when creating large numbers of instances.\n\nThe default can be overridden by defining *__slots__* in a new-style\nclass definition. The *__slots__* declaration takes a sequence of\ninstance variables and reserves just enough space in each instance to\nhold a value for each variable. Space is saved because *__dict__* is\nnot created for each instance.\n\n__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 new-style class, *__slots__* reserves space for the declared\n variables and prevents the automatic creation of *__dict__* and\n *__weakref__* for each instance.\n\n New in version 2.2.\n\nNotes on using *__slots__*\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 Changed in version 2.3: Previously, adding ``\'__dict__\'`` to the\n *__slots__* declaration would not enable the assignment of new\n attributes not specifically listed in the sequence of instance\n variable names.\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 Changed in version 2.3: Previously, adding ``\'__weakref__\'`` to the\n *__slots__* declaration would not enable support for weak\n references.\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 ``long``, ``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 Changed in version 2.6: Previously, *__class__* assignment raised an\n error if either new or old class had *__slots__*.\n\n\nCustomizing class creation\n==========================\n\nBy default, new-style classes are constructed using ``type()``. A\nclass definition is read into a separate namespace and the value of\nclass name is bound to the result of ``type(name, bases, dict)``.\n\nWhen the class definition is read, if *__metaclass__* is defined then\nthe callable assigned to it will be called instead of ``type()``. 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\n__metaclass__\n\n This variable can be any callable accepting arguments for ``name``,\n ``bases``, and ``dict``. Upon class creation, the callable is used\n instead of the built-in ``type()``.\n\n New in version 2.2.\n\nThe appropriate metaclass is determined by the following precedence\nrules:\n\n* If ``dict[\'__metaclass__\']`` exists, it is used.\n\n* Otherwise, if there is at least one base class, its metaclass is\n used (this looks for a *__class__* attribute first and if not found,\n uses its type).\n\n* Otherwise, if a global variable named __metaclass__ exists, it is\n used.\n\n* Otherwise, the old-style, classic metaclass (types.ClassType) is\n 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\n\nCustomizing instance and subclass checks\n========================================\n\nNew in version 2.6.\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. (For backwards compatibility, the method\n``__getslice__()`` (see below) can also be defined to handle simple,\nbut not extended slices.) It is also recommended that mappings provide\nthe methods ``keys()``, ``values()``, ``items()``, ``has_key()``,\n``get()``, ``clear()``, ``setdefault()``, ``iterkeys()``,\n``itervalues()``, ``iteritems()``, ``pop()``, ``popitem()``,\n``copy()``, and ``update()`` behaving similar to those for Python\'s\nstandard dictionary objects. The ``UserDict`` module provides a\n``DictMixin`` class to help create those methods from a base set of\n``__getitem__()``, ``__setitem__()``, ``__delitem__()``, and\n``keys()``. Mutable sequences should provide methods ``append()``,\n``count()``, ``index()``, ``extend()``, ``insert()``, ``pop()``,\n``remove()``, ``reverse()`` and ``sort()``, like Python standard list\nobjects. Finally, sequence types should implement addition (meaning\nconcatenation) and multiplication (meaning repetition) by defining the\nmethods ``__add__()``, ``__radd__()``, ``__iadd__()``, ``__mul__()``,\n``__rmul__()`` and ``__imul__()`` described below; they should not\ndefine ``__coerce__()`` or other numerical operators. It is\nrecommended that both mappings and sequences implement the\n``__contains__()`` method to allow efficient use of the ``in``\noperator; for mappings, ``in`` should be equivalent of ``has_key()``;\nfor sequences, 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``iterkeys()``; 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 ``__nonzero__()`` method and whose\n ``__len__()`` method returns zero is considered to be false in a\n Boolean context.\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 ``iterkeys()``.\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\n New in version 2.6.\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\nAdditional methods for emulation of sequence types\n==================================================\n\nThe following optional methods can be defined to further emulate\nsequence objects. Immutable sequences methods should at most only\ndefine ``__getslice__()``; mutable sequences might define all three\nmethods.\n\nobject.__getslice__(self, i, j)\n\n Deprecated since version 2.0: Support slice objects as parameters\n to the ``__getitem__()`` method. (However, built-in types in\n CPython currently still implement ``__getslice__()``. Therefore,\n you have to override it in derived classes when implementing\n slicing.)\n\n Called to implement evaluation of ``self[i:j]``. The returned\n object should be of the same type as *self*. Note that missing *i*\n or *j* in the slice expression are replaced by zero or\n ``sys.maxint``, respectively. If negative indexes are used in the\n slice, the length of the sequence is added to that index. If the\n instance does not implement the ``__len__()`` method, an\n ``AttributeError`` is raised. No guarantee is made that indexes\n adjusted this way are not still negative. Indexes which are\n greater than the length of the sequence are not modified. If no\n ``__getslice__()`` is found, a slice object is created instead, and\n passed to ``__getitem__()`` instead.\n\nobject.__setslice__(self, i, j, sequence)\n\n Called to implement assignment to ``self[i:j]``. Same notes for *i*\n and *j* as for ``__getslice__()``.\n\n This method is deprecated. If no ``__setslice__()`` is found, or\n for extended slicing of the form ``self[i:j:k]``, a slice object is\n created, and passed to ``__setitem__()``, instead of\n ``__setslice__()`` being called.\n\nobject.__delslice__(self, i, j)\n\n Called to implement deletion of ``self[i:j]``. Same notes for *i*\n and *j* as for ``__getslice__()``. This method is deprecated. If no\n ``__delslice__()`` is found, or for extended slicing of the form\n ``self[i:j:k]``, a slice object is created, and passed to\n ``__delitem__()``, instead of ``__delslice__()`` being called.\n\nNotice that these methods are only invoked when a single slice with a\nsingle colon is used, and the slice method is available. For slice\noperations involving extended slice notation, or in absence of the\nslice methods, ``__getitem__()``, ``__setitem__()`` or\n``__delitem__()`` is called with a slice object as argument.\n\nThe following example demonstrate how to make your program or module\ncompatible with earlier versions of Python (assuming that methods\n``__getitem__()``, ``__setitem__()`` and ``__delitem__()`` support\nslice objects as arguments):\n\n class MyClass:\n ...\n def __getitem__(self, index):\n ...\n def __setitem__(self, index, value):\n ...\n def __delitem__(self, index):\n ...\n\n if sys.version_info < (2, 0):\n # They won\'t be defined if version is at least 2.0 final\n\n def __getslice__(self, i, j):\n return self[max(0, i):max(0, j):]\n def __setslice__(self, i, j, seq):\n self[max(0, i):max(0, j):] = seq\n def __delslice__(self, i, j):\n del self[max(0, i):max(0, j):]\n ...\n\nNote the calls to ``max()``; these are necessary because of the\nhandling of negative indices before the ``__*slice__()`` methods are\ncalled. When negative indexes are used, the ``__*item__()`` methods\nreceive them as provided, but the ``__*slice__()`` methods get a\n"cooked" form of the index values. For each negative index value, the\nlength of the sequence is added to the index before calling the method\n(which may still result in a negative index); this is the customary\nhandling of negative indexes by the built-in sequence types, and the\n``__*item__()`` methods are expected to do this as well. However,\nsince they should already be doing that, negative indexes cannot be\npassed in; they must be constrained to the bounds of the sequence\nbefore being passed to the ``__*item__()`` methods. Calling ``max(0,\ni)`` conveniently returns the proper value.\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.__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 (``+``, ``-``, ``*``, ``//``, ``%``, ``divmod()``,\n ``pow()``, ``**``, ``<<``, ``>>``, ``&``, ``^``, ``|``). For\n instance, to evaluate the expression ``x + y``, where *x* is an\n 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__()`` (described below). Note\n that ``__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.__div__(self, other)\nobject.__truediv__(self, other)\n\n The division operator (``/``) is implemented by these methods. The\n ``__truediv__()`` method is used when ``__future__.division`` is in\n effect, otherwise ``__div__()`` is used. If only one of these two\n methods is defined, the object will not support division in the\n alternate context; ``TypeError`` will be raised instead.\n\nobject.__radd__(self, other)\nobject.__rsub__(self, other)\nobject.__rmul__(self, other)\nobject.__rdiv__(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 (``+``, ``-``, ``*``, ``/``, ``%``, ``divmod()``,\n ``pow()``, ``**``, ``<<``, ``>>``, ``&``, ``^``, ``|``) with\n reflected (swapped) operands. These functions are only called if\n the left operand does not support the corresponding operation and\n the operands are of different types. [2] For instance, to evaluate\n the expression ``x - y``, where *y* is an instance of a class that\n has an ``__rsub__()`` method, ``y.__rsub__(x)`` is called if\n ``x.__sub__(y)`` returns *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.__idiv__(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.__long__(self)\nobject.__float__(self)\n\n Called to implement the built-in functions ``complex()``,\n ``int()``, ``long()``, and ``float()``. Should return a value of\n the appropriate type.\n\nobject.__oct__(self)\nobject.__hex__(self)\n\n Called to implement the built-in functions ``oct()`` and ``hex()``.\n Should return a string value.\n\nobject.__index__(self)\n\n Called to implement ``operator.index()``. Also called whenever\n Python needs an integer object (such as in slicing). Must return\n an integer (int or long).\n\n New in version 2.5.\n\nobject.__coerce__(self, other)\n\n Called to implement "mixed-mode" numeric arithmetic. Should either\n return a 2-tuple containing *self* and *other* converted to a\n common numeric type, or ``None`` if conversion is impossible. When\n the common type would be the type of ``other``, it is sufficient to\n return ``None``, since the interpreter will also ask the other\n object to attempt a coercion (but sometimes, if the implementation\n of the other type cannot be changed, it is useful to do the\n conversion to the other type here). A return value of\n ``NotImplemented`` is equivalent to returning ``None``.\n\n\nCoercion rules\n==============\n\nThis section used to document the rules for coercion. As the language\nhas evolved, the coercion rules have become hard to document\nprecisely; documenting what one version of one particular\nimplementation does is undesirable. Instead, here are some informal\nguidelines regarding coercion. In Python 3.0, coercion will not be\nsupported.\n\n* If the left operand of a % operator is a string or Unicode object,\n no coercion takes place and the string formatting operation is\n invoked instead.\n\n* It is no longer recommended to define a coercion operation. Mixed-\n mode operations on types that don\'t define coercion pass the\n original arguments to the operation.\n\n* New-style classes (those derived from ``object``) never invoke the\n ``__coerce__()`` method in response to a binary operator; the only\n time ``__coerce__()`` is invoked is when the built-in function\n ``coerce()`` is called.\n\n* For most intents and purposes, an operator that returns\n ``NotImplemented`` is treated the same as one that is not\n implemented at all.\n\n* Below, ``__op__()`` and ``__rop__()`` are used to signify the\n generic method names corresponding to an operator; ``__iop__()`` is\n used for the corresponding in-place operator. For example, for the\n operator \'``+``\', ``__add__()`` and ``__radd__()`` are used for the\n left and right variant of the binary operator, and ``__iadd__()``\n for the in-place variant.\n\n* For objects *x* and *y*, first ``x.__op__(y)`` is tried. If this is\n not implemented or returns ``NotImplemented``, ``y.__rop__(x)`` is\n tried. If this is also not implemented or returns\n ``NotImplemented``, a ``TypeError`` exception is raised. But see\n the following exception:\n\n* Exception to the previous item: if the left operand is an instance\n of a built-in type or a new-style class, and the right operand is an\n instance of a proper subclass of that type or class and overrides\n the base\'s ``__rop__()`` method, the right operand\'s ``__rop__()``\n method is tried *before* the left operand\'s ``__op__()`` method.\n\n This is done so that a subclass can completely override binary\n operators. Otherwise, the left operand\'s ``__op__()`` method would\n always accept the right operand: when an instance of a given class\n is expected, an instance of a subclass of that class is always\n acceptable.\n\n* When either operand type defines a coercion, this coercion is called\n before that type\'s ``__op__()`` or ``__rop__()`` method is called,\n but no sooner. If the coercion returns an object of a different\n type for the operand whose coercion is invoked, part of the process\n is redone using the new object.\n\n* When an in-place operator (like \'``+=``\') is used, if the left\n operand implements ``__iop__()``, it is invoked without any\n coercion. When the operation falls back to ``__op__()`` and/or\n ``__rop__()``, the normal coercion rules apply.\n\n* In ``x + y``, if *x* is a sequence that implements sequence\n concatenation, sequence concatenation is invoked.\n\n* In ``x * y``, if one operator is a sequence that implements sequence\n repetition, and the other is an integer (``int`` or ``long``),\n sequence repetition is invoked.\n\n* Rich comparisons (implemented by methods ``__eq__()`` and so on)\n never use coercion. Three-way comparison (implemented by\n ``__cmp__()``) does use coercion under the same conditions as other\n binary operations use it.\n\n* In the current implementation, the built-in numeric types ``int``,\n ``long``, ``float``, and ``complex`` do not use coercion. All these\n types implement a ``__coerce__()`` method, for use by the built-in\n ``coerce()`` function.\n\n Changed in version 2.7.\n\n\nWith Statement Context Managers\n===============================\n\nNew in version 2.5.\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 for old-style classes\n===========================================\n\nFor old-style classes, special methods are always looked up in exactly\nthe same way as any other method or attribute. This is the case\nregardless of whether the method is being looked up explicitly as in\n``x.__getitem__(i)`` or implicitly as in ``x[i]``.\n\nThis behaviour means that special methods may exhibit different\nbehaviour for different instances of a single old-style class if the\nappropriate special attributes are set differently:\n\n >>> class C:\n ... pass\n ...\n >>> c1 = C()\n >>> c2 = C()\n >>> c1.__len__ = lambda: 5\n >>> c2.__len__ = lambda: 9\n >>> len(c1)\n 5\n >>> len(c2)\n 9\n\n\nSpecial method lookup for new-style classes\n===========================================\n\nFor new-style classes, implicit invocations of special methods are\nonly guaranteed to work correctly if defined on an object\'s type, not\nin the object\'s instance dictionary. That behaviour is the reason why\nthe following code raises an exception (unlike the equivalent example\nwith old-style classes):\n\n >>> class C(object):\n ... pass\n ...\n >>> c = C()\n >>> c.__len__ = lambda: 5\n >>> len(c)\n Traceback (most recent call last):\n File "", line 1, in \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 "", line 1, in \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):\n ... __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-conversions': u'\nString conversions\n******************\n\nA string conversion is an expression list enclosed in reverse (a.k.a.\nbackward) quotes:\n\n string_conversion ::= "\'" expression_list "\'"\n\nA string conversion evaluates the contained expression list and\nconverts the resulting object into a string according to rules\nspecific to its type.\n\nIf the object is a string, a number, ``None``, or a tuple, list or\ndictionary containing only objects whose type is one of these, the\nresulting string is a valid Python expression which can be passed to\nthe built-in function ``eval()`` to yield an expression with the same\nvalue (or an approximation, if floating point numbers are involved).\n\n(In particular, converting a string adds quotes around it and converts\n"funny" characters to escape sequences that are safe to print.)\n\nRecursive objects (for example, lists or dictionaries that contain a\nreference to themselves, directly or indirectly) use ``...`` to\nindicate a recursive reference, and the result cannot be passed to\n``eval()`` to get an equal value (``SyntaxError`` will be raised\ninstead).\n\nThe built-in function ``repr()`` performs exactly the same conversion\nin its argument as enclosing it in parentheses and reverse quotes\ndoes. The built-in function ``str()`` performs a similar but more\nuser-friendly conversion.\n', - 'string-methods': u'\nString Methods\n**************\n\nBelow are listed the string methods which both 8-bit strings and\nUnicode objects support. Some of them are also available on\n``bytearray`` objects.\n\nIn addition, Python\'s strings support the sequence type methods\ndescribed in the *Sequence Types --- str, unicode, list, tuple,\nbytearray, buffer, xrange* section. To output formatted strings use\ntemplate strings or the ``%`` operator described in the *String\nFormatting Operations* section. Also, see the ``re`` module for string\nfunctions based 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\n For 8-bit strings, this method is locale-dependent.\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\n Changed in version 2.4: Support for the *fillchar* argument.\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.decode([encoding[, errors]])\n\n Decodes the string using the codec registered for *encoding*.\n *encoding* defaults to the default string encoding. *errors* may\n be given to set a different error handling scheme. The default is\n ``\'strict\'``, meaning that encoding errors raise ``UnicodeError``.\n Other possible values are ``\'ignore\'``, ``\'replace\'`` and any other\n name registered via ``codecs.register_error()``, see section *Codec\n Base Classes*.\n\n New in version 2.2.\n\n Changed in version 2.3: Support for other error handling schemes\n added.\n\n Changed in version 2.7: Support for keyword arguments added.\n\nstr.encode([encoding[, errors]])\n\n Return an encoded version of the string. Default encoding is the\n current default string encoding. *errors* may be given to set a\n different error handling scheme. The default for *errors* is\n ``\'strict\'``, meaning that encoding errors raise a\n ``UnicodeError``. Other possible values are ``\'ignore\'``,\n ``\'replace\'``, ``\'xmlcharrefreplace\'``, ``\'backslashreplace\'`` and\n any other name registered via ``codecs.register_error()``, see\n section *Codec Base Classes*. For a list of possible encodings, see\n section *Standard Encodings*.\n\n New in version 2.0.\n\n Changed in version 2.3: Support for ``\'xmlcharrefreplace\'`` and\n ``\'backslashreplace\'`` and other error handling schemes added.\n\n Changed in version 2.7: 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\n Changed in version 2.5: Accept tuples as *suffix*.\n\nstr.expandtabs([tabsize])\n\n Return a copy of the string where all tab characters are replaced\n by one 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\n This method of string formatting is the new standard in Python 3.0,\n and should be preferred to the ``%`` formatting described in\n *String Formatting Operations* in new code.\n\n New in version 2.6.\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.\n\n For 8-bit strings, this method is locale-dependent.\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.\n\n For 8-bit strings, this method is locale-dependent.\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.\n\n For 8-bit strings, this method is locale-dependent.\n\nstr.islower()\n\n Return true if all cased characters in the string are lowercase and\n there is at least one cased character, false otherwise.\n\n For 8-bit strings, this method is locale-dependent.\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.\n\n For 8-bit strings, this method is locale-dependent.\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\n For 8-bit strings, this method is locale-dependent.\n\nstr.isupper()\n\n Return true if all cased characters in the string are uppercase and\n there is at least one cased character, false otherwise.\n\n For 8-bit strings, this method is locale-dependent.\n\nstr.join(iterable)\n\n Return a string which is the concatenation of the strings in the\n *iterable* *iterable*. The separator between elements is the\n 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\n ``len(s)``.\n\n Changed in version 2.4: Support for the *fillchar* argument.\n\nstr.lower()\n\n Return a copy of the string converted to lowercase.\n\n For 8-bit strings, this method is locale-dependent.\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\n Changed in version 2.2.2: Support for the *chars* argument.\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\n New in version 2.5.\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\n ``len(s)``.\n\n Changed in version 2.4: Support for the *fillchar* argument.\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\n New in version 2.5.\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\n New in version 2.4.\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\n Changed in version 2.2.2: Support for the *chars* argument.\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\n Changed in version 2.5: Accept tuples as *prefix*.\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\n Changed in version 2.2.2: Support for the *chars* argument.\n\nstr.swapcase()\n\n Return a copy of the string with uppercase characters converted to\n lowercase and vice versa.\n\n For 8-bit strings, this method is locale-dependent.\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\n For 8-bit strings, this method is locale-dependent.\n\nstr.translate(table[, deletechars])\n\n Return a copy of the string where all characters occurring in the\n optional argument *deletechars* are removed, and the remaining\n characters have been mapped through the given translation table,\n which must be a string of length 256.\n\n You can use the ``maketrans()`` helper function in the ``string``\n module to create a translation table. For string objects, set the\n *table* argument to ``None`` for translations that only delete\n characters:\n\n >>> \'read this short text\'.translate(None, \'aeiou\')\n \'rd ths shrt txt\'\n\n New in version 2.6: Support for a ``None`` *table* argument.\n\n For Unicode objects, the ``translate()`` method does not accept the\n optional *deletechars* argument. Instead, it returns a copy of the\n *s* where all characters have been mapped through the given\n translation table which must be a mapping of Unicode ordinals to\n Unicode ordinals, Unicode strings or ``None``. Unmapped characters\n are left untouched. Characters mapped to ``None`` are deleted.\n Note, a more flexible approach is to create a custom character\n mapping codec using the ``codecs`` module (see ``encodings.cp1251``\n for an example).\n\nstr.upper()\n\n Return a copy of the string converted to uppercase.\n\n For 8-bit strings, this method is locale-dependent.\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 ``len(s)``.\n\n New in version 2.2.2.\n\nThe following methods are present only on unicode objects:\n\nunicode.isnumeric()\n\n Return ``True`` if there are only numeric characters in S,\n ``False`` otherwise. Numeric characters include digit characters,\n and all characters that have the Unicode numeric value property,\n e.g. U+2155, VULGAR FRACTION ONE FIFTH.\n\nunicode.isdecimal()\n\n Return ``True`` if there are only decimal characters in S,\n ``False`` otherwise. Decimal characters include digit characters,\n and all characters that that can be used to form decimal-radix\n numbers, e.g. U+0660, ARABIC-INDIC DIGIT ZERO.\n', - 'strings': u'\nString literals\n***************\n\nString literals are described by the following lexical definitions:\n\n stringliteral ::= [stringprefix](shortstring | longstring)\n stringprefix ::= "r" | "u" | "ur" | "R" | "U" | "UR" | "Ur" | "uR"\n | "b" | "B" | "br" | "Br" | "bR" | "BR"\n shortstring ::= "\'" shortstringitem* "\'" | \'"\' shortstringitem* \'"\'\n longstring ::= "\'\'\'" longstringitem* "\'\'\'"\n | \'"""\' longstringitem* \'"""\'\n shortstringitem ::= shortstringchar | escapeseq\n longstringitem ::= longstringchar | escapeseq\n shortstringchar ::= \n longstringchar ::= \n escapeseq ::= "\\" \n\nOne syntactic restriction not indicated by these productions is that\nwhitespace is not allowed between the **stringprefix** and the rest of\nthe string literal. The source character set is defined by the\nencoding declaration; it is ASCII if no encoding declaration is given\nin the source file; see section *Encoding declarations*.\n\nIn plain English: String literals can be enclosed in matching single\nquotes (``\'``) or double quotes (``"``). They can also be enclosed in\nmatching groups of three single or double quotes (these are generally\nreferred to as *triple-quoted strings*). The backslash (``\\``)\ncharacter is used to escape characters that otherwise have a special\nmeaning, such as newline, backslash itself, or the quote character.\nString literals may optionally be prefixed with a letter ``\'r\'`` or\n``\'R\'``; such strings are called *raw strings* and use different rules\nfor interpreting backslash escape sequences. A prefix of ``\'u\'`` or\n``\'U\'`` makes the string a Unicode string. Unicode strings use the\nUnicode character set as defined by the Unicode Consortium and ISO\n10646. Some additional escape sequences, described below, are\navailable in Unicode strings. A prefix of ``\'b\'`` or ``\'B\'`` is\nignored in Python 2; it indicates that the literal should become a\nbytes literal in Python 3 (e.g. when code is automatically converted\nwith 2to3). A ``\'u\'`` or ``\'b\'`` prefix may be followed by an ``\'r\'``\nprefix.\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`` | 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| ``\\N{name}`` | Character named *name* in the | |\n| | Unicode database (Unicode only) | |\n+-------------------+-----------------------------------+---------+\n| ``\\r`` | ASCII Carriage Return (CR) | |\n+-------------------+-----------------------------------+---------+\n| ``\\t`` | ASCII Horizontal Tab (TAB) | |\n+-------------------+-----------------------------------+---------+\n| ``\\uxxxx`` | Character with 16-bit hex value | (1) |\n| | *xxxx* (Unicode only) | |\n+-------------------+-----------------------------------+---------+\n| ``\\Uxxxxxxxx`` | Character with 32-bit hex value | (2) |\n| | *xxxxxxxx* (Unicode only) | |\n+-------------------+-----------------------------------+---------+\n| ``\\v`` | ASCII Vertical Tab (VT) | |\n+-------------------+-----------------------------------+---------+\n| ``\\ooo`` | Character with octal value *ooo* | (3,5) |\n+-------------------+-----------------------------------+---------+\n| ``\\xhh`` | Character with hex value *hh* | (4,5) |\n+-------------------+-----------------------------------+---------+\n\nNotes:\n\n1. Individual code units which form parts of a surrogate pair can be\n encoded using this escape sequence.\n\n2. 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). Individual code units which form parts of a surrogate\n pair can be encoded using this escape sequence.\n\n3. As in Standard C, up to three octal digits are accepted.\n\n4. Unlike in Standard C, exactly two hex digits are required.\n\n5. In a string literal, hexadecimal and octal escapes denote the byte\n with the given value; it is not necessary that the byte encodes a\n character in the source character set. In a Unicode literal, these\n escapes denote a Unicode character with the given value.\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 marked as "(Unicode only)"\nin the table above fall into the category of unrecognized escapes for\nnon-Unicode string literals.\n\nWhen an ``\'r\'`` or ``\'R\'`` prefix is present, a character following a\nbackslash is included in the string without change, and *all\nbackslashes are left in the string*. For example, the string literal\n``r"\\n"`` consists of two characters: a backslash and a lowercase\n``\'n\'``. String quotes can be escaped with a backslash, but the\nbackslash remains in the string; for example, ``r"\\""`` is a valid\nstring literal consisting of two characters: a backslash and a double\nquote; ``r"\\"`` is not a valid string literal (even a raw string\ncannot end in an odd number of backslashes). Specifically, *a raw\nstring cannot end in a single backslash* (since the backslash would\nescape 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\nWhen an ``\'r\'`` or ``\'R\'`` prefix is used in conjunction with a\n``\'u\'`` or ``\'U\'`` prefix, then the ``\\uXXXX`` and ``\\UXXXXXXXX``\nescape sequences are processed while *all other backslashes are left\nin the string*. For example, the string literal ``ur"\\u0062\\n"``\nconsists of three Unicode characters: \'LATIN SMALL LETTER B\', \'REVERSE\nSOLIDUS\', and \'LATIN SMALL LETTER N\'. Backslashes can be escaped with\na preceding backslash; however, both remain in the string. As a\nresult, ``\\uXXXX`` escape sequences are only recognized when there are\nan odd number of backslashes.\n', - 'subscriptions': u'\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 of a sequence or mapping type.\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 a\nplain integer. If this value is negative, the length of the sequence\nis added to it (so that, e.g., ``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).\n\nA string\'s items are characters. A character is not a separate data\ntype but a string of exactly one character.\n', - 'truth': u"\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``, ``0L``, ``0.0``,\n ``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 ``__nonzero__()`` or ``__len__()`` method, when that method returns\n the 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': u'\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\nChanged in version 2.5: In previous versions of Python,\n``try``...``except``...``finally`` did not work. ``try``...``except``\nhad to be nested in ``try``...``finally``.\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, a tuple containing an item compatible with the\nexception, or, in the (deprecated) case of string exceptions, is the\nraised string itself (note that the object identities must match, i.e.\nit must be the same string object, not just a string with the same\nvalue).\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 in that except clause, if present, and the except\nclause\'s suite is executed. All except clauses must have an\nexecutable block. When the end of this block is reached, execution\ncontinues normally after the entire try statement. (This means that\nif two nested handlers exist for the same exception, and the exception\noccurs in the try clause of the inner handler, the outer handler will\nnot handle the exception.)\n\nBefore an except clause\'s suite is executed, details about the\nexception are assigned to three variables in the ``sys`` module:\n``sys.exc_type`` receives the object identifying the exception;\n``sys.exc_value`` receives the exception\'s parameter;\n``sys.exc_traceback`` receives a traceback object (see section *The\nstandard type hierarchy*) identifying the point in the program where\nthe exception occurred. These details are also available through the\n``sys.exc_info()`` function, which returns a tuple ``(exc_type,\nexc_value, exc_traceback)``. Use of the corresponding variables is\ndeprecated in favor of this function, since their use is unsafe in a\nthreaded program. As of Python 1.5, the variables are restored to\ntheir previous values (before the call) when returning from a function\nthat 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 lost. The exception information is not available to the\nprogram during execution 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': u'\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.).\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 built-in name\n ``Ellipsis``. It is used to indicate the presence of the ``...``\n syntax in a slice. 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 three types of integers:\n\n Plain integers\n These represent numbers in the range -2147483648 through\n 2147483647. (The range may be larger on machines with a\n larger natural word size, but not smaller.) When the result\n of an operation would fall outside this range, the result is\n normally returned as a long integer (in some cases, the\n exception ``OverflowError`` is raised instead). For the\n purpose of shift and mask operations, integers are assumed to\n have a binary, 2\'s complement notation using 32 or more bits,\n and hiding no bits from the user (i.e., all 4294967296\n different bit patterns correspond to different values).\n\n Long integers\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\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 plain\n integers, 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 and the least surprises when\n switching between the plain and long integer domains. Any\n operation, if it yields a result in the plain integer domain,\n will yield the same result in the long integer domain or when\n using mixed operands. The switch between domains is transparent\n to the programmer.\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``\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 are characters. There is no separate\n character type; a character is represented by a string of one\n item. Characters represent (at least) 8-bit bytes. The\n built-in functions ``chr()`` and ``ord()`` convert between\n characters and nonnegative integers representing the byte\n values. Bytes with the values 0-127 usually represent the\n corresponding ASCII values, but the interpretation of values\n is up to the program. The string data type is also used to\n represent arrays of bytes, e.g., to hold data read from a\n file.\n\n (On systems whose native character set is not ASCII, strings\n may use EBCDIC in their internal representation, provided the\n functions ``chr()`` and ``ord()`` implement a mapping between\n ASCII and EBCDIC, and string comparison preserves the ASCII\n order. Or perhaps someone can propose a better rule?)\n\n Unicode\n The items of a Unicode object are Unicode code units. A\n Unicode code unit is represented by a Unicode 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 ``unichr()`` 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 Unicode method ``encode()`` and the\n built-in function ``unicode()``.\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 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.\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``, ``gdbm``, and ``bsddb`` provide\n additional examples of mapping types.\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 | ``func_doc`` | The function\'s documentation | Writable |\n | | string, or ``None`` if | |\n | | unavailable | |\n +-------------------------+---------------------------------+-------------+\n | ``__doc__`` | Another way of spelling | Writable |\n | | ``func_doc`` | |\n +-------------------------+---------------------------------+-------------+\n | ``func_name`` | The function\'s name | Writable |\n +-------------------------+---------------------------------+-------------+\n | ``__name__`` | Another way of spelling | Writable |\n | | ``func_name`` | |\n +-------------------------+---------------------------------+-------------+\n | ``__module__`` | The name of the module the | Writable |\n | | function was defined in, or | |\n | | ``None`` if unavailable. | |\n +-------------------------+---------------------------------+-------------+\n | ``func_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 | ``func_code`` | The code object representing | Writable |\n | | the compiled function body. | |\n +-------------------------+---------------------------------+-------------+\n | ``func_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 | ``func_dict`` | The namespace supporting | Writable |\n | | arbitrary function attributes. | |\n +-------------------------+---------------------------------+-------------+\n | ``func_closure`` | ``None`` or a tuple of cells | Read-only |\n | | that contain bindings for the | |\n | | function\'s free variables. | |\n +-------------------------+---------------------------------+-------------+\n\n Most of the attributes labelled "Writable" check the type of the\n assigned value.\n\n Changed in version 2.4: ``func_name`` is now writable.\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 User-defined methods\n A user-defined method object combines a class, a class instance\n (or ``None``) and any callable object (normally a user-defined\n function).\n\n Special read-only attributes: ``im_self`` is the class instance\n object, ``im_func`` is the function object; ``im_class`` is the\n class of ``im_self`` for bound methods or the class that asked\n for the method for unbound methods; ``__doc__`` is the method\'s\n documentation (same as ``im_func.__doc__``); ``__name__`` is the\n method name (same as ``im_func.__name__``); ``__module__`` is\n the name of the module the method was defined in, or ``None`` if\n unavailable.\n\n Changed in version 2.2: ``im_self`` used to refer to the class\n that defined the method.\n\n Changed in version 2.6: For 3.0 forward-compatibility,\n ``im_func`` is also available as ``__func__``, and ``im_self``\n as ``__self__``.\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, an unbound\n user-defined method object, or a class method object. When the\n attribute is a user-defined method object, a new method object\n is only created if the class from which it is being retrieved is\n the same as, or a derived class of, the class stored in the\n original method object; otherwise, the original method object is\n used as it is.\n\n When a user-defined method object is created by retrieving a\n user-defined function object from a class, its ``im_self``\n attribute is ``None`` and the method object is said to be\n unbound. When one is created by retrieving a user-defined\n function object from a class via one of its instances, its\n ``im_self`` attribute is the instance, and the method object is\n said to be bound. In either case, the new method\'s ``im_class``\n attribute is the class from which the retrieval takes place, and\n its ``im_func`` 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 ``im_func``\n attribute of the new instance is not the original method object\n but its ``im_func`` attribute.\n\n When a user-defined method object is created by retrieving a\n class method object from a class or instance, its ``im_self``\n attribute is the class itself (the same as the ``im_class``\n attribute), and its ``im_func`` attribute is the function object\n underlying the class method.\n\n When an unbound user-defined method object is called, the\n underlying function (``im_func``) is called, with the\n restriction that the first argument must be an instance of the\n proper class (``im_class``) or of a derived class thereof.\n\n When a bound user-defined method object is called, the\n underlying function (``im_func``) is called, inserting the class\n instance (``im_self``) in front of the argument list. For\n instance, when ``C`` is a class which contains a definition for\n a function ``f()``, and ``x`` is an instance of ``C``, calling\n ``x.f(1)`` is equivalent to calling ``C.f(x, 1)``.\n\n When a user-defined method object is derived from a class method\n object, the "class instance" stored in ``im_self`` will actually\n be the class itself, so that calling either ``x.f(1)`` or\n ``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 (unbound or\n bound) method object happens each time the attribute is\n retrieved from the class or instance. In some cases, a fruitful\n optimization is to assign the attribute to a local variable and\n call that local variable. Also notice that this transformation\n only happens for user-defined functions; other callable objects\n (and all non-callable objects) are retrieved without\n transformation. It is also important to note that user-defined\n functions which are attributes of a class instance are not\n converted to bound methods; this *only* happens when the\n function is an attribute 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 Class Types\n Class types, or "new-style classes," are callable. These\n objects normally act as factories for new instances of\n themselves, but variations are possible for class types that\n override ``__new__()``. The arguments of the call are passed to\n ``__new__()`` and, in the typical case, to ``__init__()`` to\n initialize the new instance.\n\n Classic Classes\n Class objects are described below. When a class object is\n called, a new class instance (also described below) is created\n and returned. This implies a call to the class\'s ``__init__()``\n method if it has one. Any arguments are passed on to the\n ``__init__()`` method. If there is no ``__init__()`` method,\n the class must be called without arguments.\n\n Class instances\n Class instances are described below. Class instances are\n callable only when the class has a ``__call__()`` method;\n ``x(arguments)`` is a shorthand for ``x.__call__(arguments)``.\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 func_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\nClasses\n Both class types (new-style classes) and class objects (old-\n style/classic classes) are typically created by class definitions\n (see section *Class definitions*). A class has a namespace\n implemented by a dictionary object. Class attribute references are\n translated to lookups in this dictionary, e.g., ``C.x`` is\n translated to ``C.__dict__["x"]`` (although for new-style classes\n in particular there are a number of hooks which allow for other\n means of locating attributes). When the attribute name is not found\n there, the attribute search continues in the base classes. For\n old-style classes, the search is depth-first, left-to-right in the\n order of occurrence in the base class list. New-style classes use\n the more complex C3 method resolution order which behaves correctly\n even in the presence of \'diamond\' inheritance structures where\n there are multiple inheritance paths leading back to a common\n ancestor. Additional details on the C3 MRO used by new-style\n classes can be found in the documentation accompanying the 2.3\n release at http://www.python.org/download/releases/2.3/mro/.\n\n When a class attribute reference (for class ``C``, say) would yield\n a user-defined function object or an unbound user-defined method\n object whose associated class is either ``C`` or one of its base\n classes, it is transformed into an unbound user-defined method\n object whose ``im_class`` attribute is ``C``. When it would yield a\n class method object, it is transformed into a bound user-defined\n method object whose ``im_class`` and ``im_self`` attributes are\n both ``C``. When it would yield a static method object, it is\n transformed into the object wrapped by the static method object.\n See section *Implementing Descriptors* for another way in which\n attributes retrieved from a class may differ from those actually\n contained in its ``__dict__`` (note that only new-style classes\n support descriptors).\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 or an unbound user-defined method object whose\n associated class is the class (call it ``C``) of the instance for\n which the attribute reference was initiated or one of its bases, it\n is transformed into a bound user-defined method object whose\n ``im_class`` attribute is ``C`` and whose ``im_self`` attribute is\n the instance. Static method and class method objects are also\n transformed, as if they had been retrieved from class ``C``; see\n above under "Classes". See section *Implementing Descriptors* for\n another way in which attributes of a class retrieved via its\n instances may differ from the objects actually stored in the\n class\'s ``__dict__``. If no class attribute is found, and the\n object\'s class has a ``__getattr__()`` method, that is called to\n satisfy the 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\nFiles\n A file object represents an open file. File objects are created by\n the ``open()`` built-in function, and also by ``os.popen()``,\n ``os.fdopen()``, and the ``makefile()`` method of socket objects\n (and perhaps by other functions or methods provided by extension\n modules). The objects ``sys.stdin``, ``sys.stdout`` and\n ``sys.stderr`` are initialized to file objects corresponding to the\n interpreter\'s standard input, output and error streams. See *File\n Objects* for complete documentation of file objects.\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_restricted`` is a flag indicating whether the function is\n executing in restricted execution mode; ``f_lasti`` gives the\n precise instruction (this is an index into the bytecode string\n 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_exc_type``, ``f_exc_value``,\n ``f_exc_traceback`` represent the last exception raised in the\n parent frame provided another exception was ever raised in the\n current frame (in all other cases they are None); ``f_lineno``\n is the current line number of the frame --- writing to this from\n within a trace function jumps to the given line (only for the\n bottom-most frame). A debugger can implement a Jump command\n (aka Set Next Statement) 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 ``sys.exc_traceback``,\n and also as the third item of the tuple returned by\n ``sys.exc_info()``. The latter is the preferred interface,\n since it works correctly when the program is using multiple\n threads. When the program contains no suitable handler, the\n stack trace is written (nicely formatted) to the standard error\n stream; if the interpreter is interactive, it is also made\n available to the user as ``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 when *extended slice\n syntax* is used. This is a slice using two colons, or multiple\n slices or ellipses separated by commas, e.g., ``a[i:j:step]``,\n ``a[i:j, k:l]``, or ``a[..., i:j]``. They are also created by\n the built-in ``slice()`` 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 extended slice that the slice\n object would describe if applied to a sequence of *length*\n items. It returns a tuple of three integers; respectively\n these are the *start* and *stop* indices and the *step* or\n stride length of the slice. Missing or out-of-bounds indices\n are handled in a manner consistent with regular slices.\n\n New in version 2.3.\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': u'\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': u'\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 is\n 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 New in version 2.2.\n\n Changed in version 2.3: Support for building a dictionary from\n keyword arguments added.\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 New in version 2.5: If a subclass of dict defines a method\n ``__missing__()``, if the key *key* is not present, the\n ``d[key]`` operation calls that method with the key *key* as\n argument. The ``d[key]`` operation then returns or raises\n whatever is returned or raised by the ``__missing__(key)`` call\n if the key is not present. No other operations or methods invoke\n ``__missing__()``. If ``__missing__()`` is not defined,\n ``KeyError`` is raised. ``__missing__()`` must be a method; it\n cannot be an instance variable. For an example, see\n ``collections.defaultdict``.\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 New in version 2.2.\n\n key not in d\n\n Equivalent to ``not key in d``.\n\n New in version 2.2.\n\n iter(d)\n\n Return an iterator over the keys of the dictionary. This is a\n shortcut for ``iterkeys()``.\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 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 New in version 2.3.\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 has_key(key)\n\n Test for the presence of *key* in the dictionary. ``has_key()``\n is deprecated in favor of ``key in d``.\n\n items()\n\n Return a copy of the dictionary\'s list of ``(key, value)``\n pairs.\n\n **CPython implementation detail:** Keys and values are listed in\n an arbitrary order which is non-random, varies across Python\n implementations, and depends on the dictionary\'s history of\n insertions and deletions.\n\n If ``items()``, ``keys()``, ``values()``, ``iteritems()``,\n ``iterkeys()``, and ``itervalues()`` are called with no\n intervening modifications to the dictionary, the lists will\n directly correspond. This allows the creation of ``(value,\n key)`` pairs using ``zip()``: ``pairs = zip(d.values(),\n d.keys())``. The same relationship holds for the ``iterkeys()``\n and ``itervalues()`` methods: ``pairs = zip(d.itervalues(),\n d.iterkeys())`` provides the same value for ``pairs``. Another\n way to create the same list is ``pairs = [(v, k) for (k, v) in\n d.iteritems()]``.\n\n iteritems()\n\n Return an iterator over the dictionary\'s ``(key, value)`` pairs.\n See the note for ``dict.items()``.\n\n Using ``iteritems()`` while adding or deleting entries in the\n dictionary may raise a ``RuntimeError`` or fail to iterate over\n all entries.\n\n New in version 2.2.\n\n iterkeys()\n\n Return an iterator over the dictionary\'s keys. See the note for\n ``dict.items()``.\n\n Using ``iterkeys()`` while adding or deleting entries in the\n dictionary may raise a ``RuntimeError`` or fail to iterate over\n all entries.\n\n New in version 2.2.\n\n itervalues()\n\n Return an iterator over the dictionary\'s values. See the note\n for ``dict.items()``.\n\n Using ``itervalues()`` while adding or deleting entries in the\n dictionary may raise a ``RuntimeError`` or fail to iterate over\n all entries.\n\n New in version 2.2.\n\n keys()\n\n Return a copy of the dictionary\'s list of keys. See the note\n for ``dict.items()``.\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 New in version 2.3.\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 Changed in version 2.4: Allowed the argument to be an iterable\n of key/value pairs and allowed keyword arguments.\n\n values()\n\n Return a copy of the dictionary\'s list of values. See the note\n for ``dict.items()``.\n\n viewitems()\n\n Return a new view of the dictionary\'s items (``(key, value)``\n pairs). See below for documentation of view objects.\n\n New in version 2.7.\n\n viewkeys()\n\n Return a new view of the dictionary\'s keys. See below for\n documentation of view objects.\n\n New in version 2.7.\n\n viewvalues()\n\n Return a new view of the dictionary\'s values. See below for\n documentation of view objects.\n\n New in version 2.7.\n\n\nDictionary view objects\n=======================\n\nThe objects returned by ``dict.viewkeys()``, ``dict.viewvalues()`` and\n``dict.viewitems()`` are *view objects*. They provide a dynamic view\non the 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 and\nhashable, then the items view is also set-like. (Values views are not\ntreated as set-like since the entries are generally not unique.) Then\nthese set operations are available ("other" refers either to another\nview or a set):\n\ndictview & other\n\n Return the intersection of the dictview and the other object as a\n new set.\n\ndictview | other\n\n Return the union of the dictview and the other object as a new set.\n\ndictview - other\n\n Return the difference between the dictview and the other object\n (all elements in *dictview* that aren\'t in *other*) as a new set.\n\ndictview ^ other\n\n Return the symmetric difference (all elements either in *dictview*\n or *other*, but not in both) of the dictview and the other object\n as a new set.\n\nAn example of dictionary view usage:\n\n >>> dishes = {\'eggs\': 2, \'sausage\': 1, \'bacon\': 1, \'spam\': 500}\n >>> keys = dishes.viewkeys()\n >>> values = dishes.viewvalues()\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', - 'typesmethods': u"\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\nThe implementation adds two special read-only attributes to class\ninstance methods: ``m.im_self`` is the object on which the method\noperates, and ``m.im_func`` is the function implementing the method.\nCalling ``m(arg-1, arg-2, ..., arg-n)`` is completely equivalent to\ncalling ``m.im_func(m.im_self, arg-1, arg-2, ..., arg-n)``.\n\nClass instance methods are either *bound* or *unbound*, referring to\nwhether the method was accessed through an instance or a class,\nrespectively. When a method is unbound, its ``im_self`` attribute\nwill be ``None`` and if called, an explicit ``self`` object must be\npassed as the first argument. In this case, ``self`` must be an\ninstance of the unbound method's class (or a subclass of that class),\notherwise a ``TypeError`` is raised.\n\nLike function objects, methods objects support getting arbitrary\nattributes. However, since method attributes are actually stored on\nthe underlying function object (``meth.im_func``), setting method\nattributes on either bound or unbound methods is disallowed.\nAttempting to set a method attribute results in a ``TypeError`` being\nraised. In order to set a method attribute, you need to explicitly\nset it on the underlying function object:\n\n class C:\n def method(self):\n pass\n\n c = C()\n c.method.im_func.whoami = 'my name is c'\n\nSee *The standard type hierarchy* for more information.\n", - 'typesmodules': u"\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 member 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: ````. If loaded from a file, they are written as\n````.\n", - 'typesseq': u'\nSequence Types --- ``str``, ``unicode``, ``list``, ``tuple``, ``bytearray``, ``buffer``, ``xrange``\n***************************************************************************************************\n\nThere are seven sequence types: strings, Unicode strings, lists,\ntuples, bytearrays, buffers, and xrange objects.\n\nFor other containers see the built in ``dict`` and ``set`` classes,\nand the ``collections`` module.\n\nString literals are written in single or double quotes: ``\'xyzzy\'``,\n``"frobozz"``. See *String literals* for more about string literals.\nUnicode strings are much like strings, but are specified in the syntax\nusing a preceding ``\'u\'`` character: ``u\'abc\'``, ``u"def"``. In\naddition to the functionality described here, there are also string-\nspecific methods described in the *String Methods* section. Lists are\nconstructed with square brackets, separating items with commas: ``[a,\nb, c]``. Tuples are constructed by the comma operator (not within\nsquare brackets), with or without enclosing parentheses, but an empty\ntuple must have the enclosing parentheses, such as ``a, b, c`` or\n``()``. A single item tuple must have a trailing comma, such as\n``(d,)``.\n\nBytearray objects are created with the built-in function\n``bytearray()``.\n\nBuffer objects are not directly supported by Python syntax, but can be\ncreated by calling the built-in function ``buffer()``. They don\'t\nsupport concatenation or repetition.\n\nObjects of type xrange are similar to buffers in that there is no\nspecific syntax to create them, but they are created using the\n``xrange()`` function. They don\'t support slicing, concatenation or\nrepetition, and using ``in``, ``not in``, ``min()`` or ``max()`` on\nthem 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* and *j* 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 compare\nequal and the two sequences must be of the same type and have the same\nlength. (For full details see *Comparisons* in the language\nreference.)\n\nNotes:\n\n1. When *s* is a string or Unicode string object the ``in`` and ``not\n in`` operations act like a substring test. In Python versions\n before 2.3, *x* had to be a string of length 1. In Python 2.3 and\n beyond, *x* may be a string of any length.\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. **CPython implementation detail:** If *s* and *t* are both strings,\n some Python implementations such as CPython can usually perform an\n in-place optimization for assignments of the form ``s = s + t`` or\n ``s += t``. When applicable, this optimization makes quadratic\n run-time much less likely. This optimization is both version and\n implementation dependent. For performance sensitive code, it is\n preferable to use the ``str.join()`` method which assures\n consistent linear concatenation performance across versions and\n implementations.\n\n Changed in version 2.4: Formerly, string concatenation never\n occurred in-place.\n\n\nString Methods\n==============\n\nBelow are listed the string methods which both 8-bit strings and\nUnicode objects support. Some of them are also available on\n``bytearray`` objects.\n\nIn addition, Python\'s strings support the sequence type methods\ndescribed in the *Sequence Types --- str, unicode, list, tuple,\nbytearray, buffer, xrange* section. To output formatted strings use\ntemplate strings or the ``%`` operator described in the *String\nFormatting Operations* section. Also, see the ``re`` module for string\nfunctions based 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\n For 8-bit strings, this method is locale-dependent.\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\n Changed in version 2.4: Support for the *fillchar* argument.\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.decode([encoding[, errors]])\n\n Decodes the string using the codec registered for *encoding*.\n *encoding* defaults to the default string encoding. *errors* may\n be given to set a different error handling scheme. The default is\n ``\'strict\'``, meaning that encoding errors raise ``UnicodeError``.\n Other possible values are ``\'ignore\'``, ``\'replace\'`` and any other\n name registered via ``codecs.register_error()``, see section *Codec\n Base Classes*.\n\n New in version 2.2.\n\n Changed in version 2.3: Support for other error handling schemes\n added.\n\n Changed in version 2.7: Support for keyword arguments added.\n\nstr.encode([encoding[, errors]])\n\n Return an encoded version of the string. Default encoding is the\n current default string encoding. *errors* may be given to set a\n different error handling scheme. The default for *errors* is\n ``\'strict\'``, meaning that encoding errors raise a\n ``UnicodeError``. Other possible values are ``\'ignore\'``,\n ``\'replace\'``, ``\'xmlcharrefreplace\'``, ``\'backslashreplace\'`` and\n any other name registered via ``codecs.register_error()``, see\n section *Codec Base Classes*. For a list of possible encodings, see\n section *Standard Encodings*.\n\n New in version 2.0.\n\n Changed in version 2.3: Support for ``\'xmlcharrefreplace\'`` and\n ``\'backslashreplace\'`` and other error handling schemes added.\n\n Changed in version 2.7: 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\n Changed in version 2.5: Accept tuples as *suffix*.\n\nstr.expandtabs([tabsize])\n\n Return a copy of the string where all tab characters are replaced\n by one 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\n This method of string formatting is the new standard in Python 3.0,\n and should be preferred to the ``%`` formatting described in\n *String Formatting Operations* in new code.\n\n New in version 2.6.\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.\n\n For 8-bit strings, this method is locale-dependent.\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.\n\n For 8-bit strings, this method is locale-dependent.\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.\n\n For 8-bit strings, this method is locale-dependent.\n\nstr.islower()\n\n Return true if all cased characters in the string are lowercase and\n there is at least one cased character, false otherwise.\n\n For 8-bit strings, this method is locale-dependent.\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.\n\n For 8-bit strings, this method is locale-dependent.\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\n For 8-bit strings, this method is locale-dependent.\n\nstr.isupper()\n\n Return true if all cased characters in the string are uppercase and\n there is at least one cased character, false otherwise.\n\n For 8-bit strings, this method is locale-dependent.\n\nstr.join(iterable)\n\n Return a string which is the concatenation of the strings in the\n *iterable* *iterable*. The separator between elements is the\n 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\n ``len(s)``.\n\n Changed in version 2.4: Support for the *fillchar* argument.\n\nstr.lower()\n\n Return a copy of the string converted to lowercase.\n\n For 8-bit strings, this method is locale-dependent.\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\n Changed in version 2.2.2: Support for the *chars* argument.\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\n New in version 2.5.\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\n ``len(s)``.\n\n Changed in version 2.4: Support for the *fillchar* argument.\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\n New in version 2.5.\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\n New in version 2.4.\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\n Changed in version 2.2.2: Support for the *chars* argument.\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\n Changed in version 2.5: Accept tuples as *prefix*.\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\n Changed in version 2.2.2: Support for the *chars* argument.\n\nstr.swapcase()\n\n Return a copy of the string with uppercase characters converted to\n lowercase and vice versa.\n\n For 8-bit strings, this method is locale-dependent.\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\n For 8-bit strings, this method is locale-dependent.\n\nstr.translate(table[, deletechars])\n\n Return a copy of the string where all characters occurring in the\n optional argument *deletechars* are removed, and the remaining\n characters have been mapped through the given translation table,\n which must be a string of length 256.\n\n You can use the ``maketrans()`` helper function in the ``string``\n module to create a translation table. For string objects, set the\n *table* argument to ``None`` for translations that only delete\n characters:\n\n >>> \'read this short text\'.translate(None, \'aeiou\')\n \'rd ths shrt txt\'\n\n New in version 2.6: Support for a ``None`` *table* argument.\n\n For Unicode objects, the ``translate()`` method does not accept the\n optional *deletechars* argument. Instead, it returns a copy of the\n *s* where all characters have been mapped through the given\n translation table which must be a mapping of Unicode ordinals to\n Unicode ordinals, Unicode strings or ``None``. Unmapped characters\n are left untouched. Characters mapped to ``None`` are deleted.\n Note, a more flexible approach is to create a custom character\n mapping codec using the ``codecs`` module (see ``encodings.cp1251``\n for an example).\n\nstr.upper()\n\n Return a copy of the string converted to uppercase.\n\n For 8-bit strings, this method is locale-dependent.\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 ``len(s)``.\n\n New in version 2.2.2.\n\nThe following methods are present only on unicode objects:\n\nunicode.isnumeric()\n\n Return ``True`` if there are only numeric characters in S,\n ``False`` otherwise. Numeric characters include digit characters,\n and all characters that have the Unicode numeric value property,\n e.g. U+2155, VULGAR FRACTION ONE FIFTH.\n\nunicode.isdecimal()\n\n Return ``True`` if there are only decimal characters in S,\n ``False`` otherwise. Decimal characters include digit characters,\n and all characters that that can be used to form decimal-radix\n numbers, e.g. U+0660, ARABIC-INDIC DIGIT ZERO.\n\n\nString Formatting Operations\n============================\n\nString and Unicode objects have one unique built-in operation: the\n``%`` operator (modulo). This is also known as the string\n*formatting* or *interpolation* operator. Given ``format % values``\n(where *format* is a string or Unicode object), ``%`` conversion\nspecifications in *format* are replaced with zero or more elements of\n*values*. The effect is similar to the using ``sprintf()`` in the C\nlanguage. If *format* is a Unicode object, or if any of the objects\nbeing converted using the ``%s`` conversion are Unicode objects, the\nresult will also be a Unicode object.\n\nIf *format* requires a single argument, *values* may be a single non-\ntuple object. [4] 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 width\n is read from the next element of the tuple in *values*, and the\n 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()``). | (6) |\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. The ``%r`` conversion was added in Python 2.0.\n\n The precision determines the maximal number of characters used.\n\n6. If the object or format provided is a ``unicode`` string, the\n resulting string will also be ``unicode``.\n\n The precision determines the maximal number of characters used.\n\n7. 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 2.7: ``%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\nXRange Type\n===========\n\nThe ``xrange`` type is an immutable sequence which is commonly used\nfor looping. The advantage of the ``xrange`` type is that an\n``xrange`` object will always take the same amount of memory, no\nmatter the size of the range it represents. There are no consistent\nperformance advantages.\n\nXRange objects have very little behavior: they only support indexing,\niteration, and the ``len()`` function.\n\n\nMutable Sequence Types\n======================\n\nList and ``bytearray`` objects support additional operations that\nallow in-place modification of the object. Other mutable sequence\ntypes (when added to the language) should also support these\noperations. Strings and tuples are immutable sequence types: such\nobjects cannot be modified once created. The following operations are\ndefined on mutable sequence types (where *x* is an arbitrary object):\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)] = | (2) |\n| | [x]`` | |\n+--------------------------------+----------------------------------+-----------------------+\n| ``s.extend(x)`` | same as ``s[len(s):len(s)] = x`` | (3) |\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 | (4) |\n| | ``s[k] == x`` and ``i <= k < j`` | |\n+--------------------------------+----------------------------------+-----------------------+\n| ``s.insert(i, x)`` | same as ``s[i:i] = [x]`` | (5) |\n+--------------------------------+----------------------------------+-----------------------+\n| ``s.pop([i])`` | same as ``x = s[i]; del s[i]; | (6) |\n| | return x`` | |\n+--------------------------------+----------------------------------+-----------------------+\n| ``s.remove(x)`` | same as ``del s[s.index(x)]`` | (4) |\n+--------------------------------+----------------------------------+-----------------------+\n| ``s.reverse()`` | reverses the items of *s* in | (7) |\n| | place | |\n+--------------------------------+----------------------------------+-----------------------+\n| ``s.sort([cmp[, key[, | sort the items of *s* in place | (7)(8)(9)(10) |\n| reverse]]])`` | | |\n+--------------------------------+----------------------------------+-----------------------+\n\nNotes:\n\n1. *t* must have the same length as the slice it is replacing.\n\n2. The C implementation of Python has historically accepted multiple\n parameters and implicitly joined them into a tuple; this no longer\n works in Python 2.0. Use of this misfeature has been deprecated\n since Python 1.4.\n\n3. *x* can be any iterable object.\n\n4. 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 list length is added, as for slice indices. If it is\n still negative, it is truncated to zero, as for slice indices.\n\n Changed in version 2.3: Previously, ``index()`` didn\'t have\n arguments for specifying start and stop positions.\n\n5. When a negative index is passed as the first parameter to the\n ``insert()`` method, the list length is added, as for slice\n indices. If it is still negative, it is truncated to zero, as for\n slice indices.\n\n Changed in version 2.3: Previously, all negative indices were\n truncated to zero.\n\n6. The ``pop()`` method is only supported by the list and array types.\n The optional argument *i* defaults to ``-1``, so that by default\n the last item is removed and returned.\n\n7. The ``sort()`` and ``reverse()`` methods modify the list in place\n for economy of space when sorting or reversing a large list. To\n remind you that they operate by side effect, they don\'t return the\n sorted or reversed list.\n\n8. The ``sort()`` method takes optional arguments for controlling the\n comparisons.\n\n *cmp* specifies a custom comparison function of two arguments (list\n items) which should return a negative, zero or positive number\n depending on whether the first argument is considered smaller than,\n equal to, or larger than the second argument: ``cmp=lambda x,y:\n cmp(x.lower(), y.lower())``. The default value is ``None``.\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``.\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 In general, the *key* and *reverse* conversion processes are much\n faster than specifying an equivalent *cmp* function. This is\n because *cmp* is called multiple times for each list element while\n *key* and *reverse* touch each element only once. Use\n ``functools.cmp_to_key()`` to convert an old-style *cmp* function\n to a *key* function.\n\n Changed in version 2.3: Support for ``None`` as an equivalent to\n omitting *cmp* was added.\n\n Changed in version 2.4: Support for *key* and *reverse* was added.\n\n9. Starting with Python 2.3, the ``sort()`` method is guaranteed to be\n stable. A sort is stable if it guarantees not to change the\n relative order of elements that compare equal --- this is helpful\n for sorting in multiple passes (for example, sort by department,\n then by salary grade).\n\n10. **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 2.3 and newer makes the\n list appear empty for the duration, and raises ``ValueError`` if\n it can detect that the list has been mutated during a sort.\n', - 'typesseq-mutable': u"\nMutable Sequence Types\n**********************\n\nList and ``bytearray`` objects support additional operations that\nallow in-place modification of the object. Other mutable sequence\ntypes (when added to the language) should also support these\noperations. Strings and tuples are immutable sequence types: such\nobjects cannot be modified once created. The following operations are\ndefined on mutable sequence types (where *x* is an arbitrary object):\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)] = | (2) |\n| | [x]`` | |\n+--------------------------------+----------------------------------+-----------------------+\n| ``s.extend(x)`` | same as ``s[len(s):len(s)] = x`` | (3) |\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 | (4) |\n| | ``s[k] == x`` and ``i <= k < j`` | |\n+--------------------------------+----------------------------------+-----------------------+\n| ``s.insert(i, x)`` | same as ``s[i:i] = [x]`` | (5) |\n+--------------------------------+----------------------------------+-----------------------+\n| ``s.pop([i])`` | same as ``x = s[i]; del s[i]; | (6) |\n| | return x`` | |\n+--------------------------------+----------------------------------+-----------------------+\n| ``s.remove(x)`` | same as ``del s[s.index(x)]`` | (4) |\n+--------------------------------+----------------------------------+-----------------------+\n| ``s.reverse()`` | reverses the items of *s* in | (7) |\n| | place | |\n+--------------------------------+----------------------------------+-----------------------+\n| ``s.sort([cmp[, key[, | sort the items of *s* in place | (7)(8)(9)(10) |\n| reverse]]])`` | | |\n+--------------------------------+----------------------------------+-----------------------+\n\nNotes:\n\n1. *t* must have the same length as the slice it is replacing.\n\n2. The C implementation of Python has historically accepted multiple\n parameters and implicitly joined them into a tuple; this no longer\n works in Python 2.0. Use of this misfeature has been deprecated\n since Python 1.4.\n\n3. *x* can be any iterable object.\n\n4. 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 list length is added, as for slice indices. If it is\n still negative, it is truncated to zero, as for slice indices.\n\n Changed in version 2.3: Previously, ``index()`` didn't have\n arguments for specifying start and stop positions.\n\n5. When a negative index is passed as the first parameter to the\n ``insert()`` method, the list length is added, as for slice\n indices. If it is still negative, it is truncated to zero, as for\n slice indices.\n\n Changed in version 2.3: Previously, all negative indices were\n truncated to zero.\n\n6. The ``pop()`` method is only supported by the list and array types.\n The optional argument *i* defaults to ``-1``, so that by default\n the last item is removed and returned.\n\n7. The ``sort()`` and ``reverse()`` methods modify the list in place\n for economy of space when sorting or reversing a large list. To\n remind you that they operate by side effect, they don't return the\n sorted or reversed list.\n\n8. The ``sort()`` method takes optional arguments for controlling the\n comparisons.\n\n *cmp* specifies a custom comparison function of two arguments (list\n items) which should return a negative, zero or positive number\n depending on whether the first argument is considered smaller than,\n equal to, or larger than the second argument: ``cmp=lambda x,y:\n cmp(x.lower(), y.lower())``. The default value is ``None``.\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``.\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 In general, the *key* and *reverse* conversion processes are much\n faster than specifying an equivalent *cmp* function. This is\n because *cmp* is called multiple times for each list element while\n *key* and *reverse* touch each element only once. Use\n ``functools.cmp_to_key()`` to convert an old-style *cmp* function\n to a *key* function.\n\n Changed in version 2.3: Support for ``None`` as an equivalent to\n omitting *cmp* was added.\n\n Changed in version 2.4: Support for *key* and *reverse* was added.\n\n9. Starting with Python 2.3, the ``sort()`` method is guaranteed to be\n stable. A sort is stable if it guarantees not to change the\n relative order of elements that compare equal --- this is helpful\n for sorting in multiple passes (for example, sort by department,\n then by salary grade).\n\n10. **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 2.3 and newer makes the\n list appear empty for the duration, and raises ``ValueError`` if\n it can detect that the list has been mutated during a sort.\n", - 'unary': u'\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\nplain or long integer argument. The bitwise inversion of ``x`` is\ndefined as ``-(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': u'\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': u'\nThe ``with`` statement\n**********************\n\nNew in version 2.5.\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\nNote: In Python 2.5, the ``with`` statement is only allowed when the\n ``with_statement`` feature has been enabled. It is always enabled\n in Python 2.6.\n\nChanged in version 2.7: 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': u'\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 generator\'s ``next()``\nmethod 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\nAs of Python version 2.5, the ``yield`` statement is now allowed in\nthe ``try`` clause of a ``try`` ... ``finally`` construct. If the\ngenerator is not resumed before it is finalized (by reaching a zero\nreference count or by being garbage collected), the generator-\niterator\'s ``close()`` method will be called, allowing any pending\n``finally`` clauses to execute.\n\nNote: In Python 2.2, the ``yield`` statement was only allowed when the\n ``generators`` feature has been enabled. This ``__future__`` import\n statement was used to enable the feature:\n\n from __future__ import generators\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'} +# Autogenerated by Sphinx on Thu Feb 23 15:17:35 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\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 is recursively defined as\nfollows.\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\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`` statement in the\n current code block: the name is bound to the object in the current\n local namespace.\n\n * Otherwise: the name is bound to the object in the current global\n namespace.\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 a plain integer. If it is negative, the\n sequence\'s length is added to it. The resulting value must be a\n nonnegative integer less than the sequence\'s length, and the\n sequence is asked to assign the assigned object to its item with\n that index. If the index is out of range, ``IndexError`` is raised\n (assignment to a subscripted sequence cannot add new items to a\n 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* 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 (small) integers. If either\n bound is negative, the sequence\'s length is added to it. The\n resulting bounds are clipped to lie between zero and the sequence\'s\n length, inclusive. Finally, the sequence object is asked to replace\n the slice with the items of the assigned sequence. The length of\n the 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\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 literals and various numeric literals:\n\n literal ::= stringliteral | integer | longinteger\n | floatnumber | imagnumber\n\nEvaluation of a literal yields an object of the given type (string,\ninteger, long integer, floating point number, complex number) with the\ngiven value. The value may be approximated in the case of floating\npoint and imaginary (complex) literals. See section *Literals* for\ndetails.\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 in new-style classes.\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 not simply execute ``self.name = value`` --- this would\n cause a recursive call to itself. Instead, it should insert the\n value in the dictionary of instance attributes, e.g.,\n ``self.__dict__[name] = value``. For new-style classes, rather\n than accessing the instance dictionary, it should call the base\n 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\n\nMore attribute access for new-style classes\n===========================================\n\nThe following methods only apply to new-style classes.\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 for new-style\n classes*.\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. Note that descriptors are only invoked for new\nstyle objects or classes (ones that subclass ``object()`` or\n``type()``).\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 a new-style object instance, ``a.x`` is transformed\n into the call: ``type(a).__dict__[\'x\'].__get__(a, type(a))``.\n\nClass Binding\n If binding to a new-style class, ``A.x`` is transformed into the\n call: ``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 both old and new-style classes have a\ndictionary for attribute storage. This wastes space for objects\nhaving very few instance variables. The space consumption can become\nacute when creating large numbers of instances.\n\nThe default can be overridden by defining *__slots__* in a new-style\nclass definition. The *__slots__* declaration takes a sequence of\ninstance variables and reserves just enough space in each instance to\nhold a value for each variable. Space is saved because *__dict__* is\nnot created for each instance.\n\n__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 new-style class, *__slots__* reserves space for the declared\n variables and prevents the automatic creation of *__dict__* and\n *__weakref__* for each instance.\n\n New in version 2.2.\n\nNotes on using *__slots__*\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 Changed in version 2.3: Previously, adding ``\'__dict__\'`` to the\n *__slots__* declaration would not enable the assignment of new\n attributes not specifically listed in the sequence of instance\n variable names.\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 Changed in version 2.3: Previously, adding ``\'__weakref__\'`` to the\n *__slots__* declaration would not enable support for weak\n references.\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 ``long``, ``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 Changed in version 2.6: Previously, *__class__* assignment raised an\n error if either new or old class had *__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, e.g., a module, list, or an instance. This\nobject is then asked to produce the attribute whose name is the\nidentifier. If this attribute is not available, the exception\n``AttributeError`` is raised. Otherwise, the type and value of the\nobject produced is determined by the object. Multiple evaluations of\nthe same attribute reference 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 (plain or long) and the other must be a sequence.\nIn the former case, the numbers are converted to a common type and\nthen multiplied together. In the latter case, sequence repetition is\nperformed; a negative 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. Plain or long integer division yields an\ninteger of the same type; the result is that of mathematical division\nwith the \'floor\' function applied to the result. Division by zero\nraises 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 [2].\n\nThe integer division and modulo operators are connected by the\nfollowing identity: ``x == (x/y)*y + (x%y)``. Integer division and\nmodulo are also connected with the built-in function ``divmod()``:\n``divmod(x, y) == (x/y, x%y)``. These identities don\'t hold for\nfloating point numbers; there similar identities hold approximately\nwhere ``x/y`` is replaced by ``floor(x/y)`` or ``floor(x/y) - 1`` [3].\n\nIn addition to performing the modulo operation on numbers, the ``%``\noperator is also overloaded by string and unicode objects to perform\nstring formatting (also known as interpolation). The syntax for string\nformatting is described in the Python Library Reference, section\n*String Formatting Operations*.\n\nDeprecated since version 2.3: The floor division operator, the modulo\noperator, and the ``divmod()`` function are no longer defined for\ncomplex numbers. Instead, convert to a floating point number using\nthe ``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 plain or long integers. The arguments are converted to a common\ntype.\n\nThe ``^`` operator yields the bitwise XOR (exclusive OR) of its\narguments, which must be plain or long integers. The arguments are\nconverted to a common type.\n\nThe ``|`` operator yields the bitwise (inclusive) OR of its arguments,\nwhich must be plain or long integers. The arguments are converted to\na common type.\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 ``func_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`` statement or the built-in ``eval()``\nfunction.\n\nSee *The standard type hierarchy* for more information.\n', + 'bltin-ellipsis-object': '\nThe Ellipsis Object\n*******************\n\nThis object is used by extended slice notation (see *Slicings*). It\nsupports no special operations. There is exactly one ellipsis object,\nnamed ``Ellipsis`` (a built-in name).\n\nIt is written as ``Ellipsis``. When in a subscript, it can also be\nwritten as ``...``, for example ``seq[...]``.\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-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: ````.\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. (See the ``__nonzero__()`` special method for a way to\nchange this.)\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', + 'callable-types': '\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', + '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 [","]\n | expression genexpr_for] ")"\n argument_list ::= positional_arguments ["," keyword_arguments]\n ["," "*" expression] ["," keyword_arguments]\n ["," "**" expression]\n | keyword_arguments ["," "*" expression]\n ["," "**" expression]\n | "*" expression ["," "*" expression] ["," "**" 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 certain class instances\nthemselves are callable; extensions may define additional callable\nobject types). All argument expressions are evaluated before the call\nis attempted. Please refer to section *Function definitions* for the\nsyntax 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 "", 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. Formal parameters using the syntax ``(sublist)`` cannot be\nused as keyword argument names; the outermost sublist corresponds to a\nsingle unnamed argument slot, and the argument value is assigned to\nthe sublist using the usual tuple assignment rules after all other\nparameter processing is done.\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 ::= "class" classname [inheritance] ":" suite\n inheritance ::= "(" [expression_list] ")"\n classname ::= identifier\n\nA class definition is an executable statement. It first evaluates the\ninheritance list, if present. Each item in the inheritance list\nshould evaluate to a class object or class type which allows\nsubclassing. The class\'s suite is then executed in a new execution\nframe (see section *Naming and binding*), using a newly created local\nnamespace and the original global namespace. (Usually, the suite\ncontains only function definitions.) When the class\'s suite finishes\nexecution, its execution frame is discarded but its local namespace is\nsaved. [4] A class object is then created using the inheritance list\nfor the base classes and the saved local namespace for the attribute\ndictionary. The class name is bound to this class object in the\noriginal local namespace.\n\n**Programmer\'s note:** Variables defined in the class definition are\nclass variables; they are shared by all instances. To create instance\nvariables, they can be set in a method with ``self.name = value``.\nBoth class and instance variables are accessible through the notation\n"``self.name``", and an instance variable hides a class variable with\nthe same name when accessed in this way. Class variables can be used\nas defaults for instance variables, but using mutable values there can\nlead to unexpected results. For *new-style class*es, descriptors can\nbe used to create instance variables with different implementation\ndetails.\n\nClass definitions, like function definitions, may be wrapped by one or\nmore *decorator* expressions. The evaluation rules for the decorator\nexpressions are the same as for functions. The result must be a class\nobject, which is then bound to the class name.\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 forms ``<>`` and ``!=`` are equivalent; for consistency with C,\n``!=`` is preferred; where ``!=`` is mentioned below ``<>`` is also\naccepted. The ``<>`` spelling is considered obsolescent.\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,\nobjects of different types *always* compare unequal, and are ordered\nconsistently but arbitrarily. You can control comparison behavior of\nobjects of non-built-in types by defining a ``__cmp__`` method or rich\ncomparison methods like ``__gt__``, described in section *Special\nmethod names*.\n\n(This unusual definition of comparison was used to simplify the\ndefinition of operations like sorting and the ``in`` and ``not in``\noperators. In the future, the comparison rules for objects of\ndifferent types are likely to change.)\n\nComparison of objects of the same type depends on the type:\n\n* Numbers are compared arithmetically.\n\n* Strings are compared lexicographically using the numeric equivalents\n (the result of the built-in function ``ord()``) of their characters.\n Unicode and 8-bit strings are fully interoperable in this behavior.\n [4]\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, ``cmp([1,2,x], [1,2,y])`` returns\n the same as ``cmp(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 their sorted\n (key, value) lists compare equal. [5] Outcomes other than equality\n are resolved consistently, but are not otherwise defined. [6]\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\nThe operators ``in`` and ``not in`` test for collection membership.\n``x in s`` evaluates to true if *x* is a member of the collection *s*,\nand false otherwise. ``x not in s`` returns the negation of ``x in\ns``. The collection membership test has traditionally been bound to\nsequences; an object is a member of a collection if the collection is\na sequence and contains an element equal to that object. However, it\nmake sense for many other object types to support membership tests\nwithout being a sequence. In particular, dictionaries (for keys) and\nsets support membership testing.\n\nFor the list and tuple types, ``x in y`` is true if and only if there\nexists an index *i* such that ``x == y[i]`` is true.\n\nFor the Unicode and string types, ``x in y`` is true if and only if\n*x* is a substring of *y*. An equivalent test is ``y.find(x) != -1``.\nNote, *x* and *y* need not be the same type; consequently, ``u\'ab\' in\n\'abc\'`` will return ``True``. Empty strings are always considered to\nbe a substring of any other string, so ``"" in "abc"`` will return\n``True``.\n\nChanged in version 2.3: Previously, *x* was required to be a string of\nlength ``1``.\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. [7]\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. Function and class\ndefinitions are also syntactically compound 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`` statements 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 | decorated\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, and then the suite is executed. When the items are\nexhausted (which is immediately when the sequence is empty), the suite\nin the ``else`` clause, if present, is executed, and the loop\nterminates.\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\nThe target list is not deleted when the loop is finished, but if the\nsequence is empty, it will not have been assigned to at all by the\nloop. Hint: the built-in function ``range()`` returns a sequence of\nintegers suitable to emulate the effect of Pascal\'s ``for i := a to b\ndo``; e.g., ``range(3)`` returns the list ``[0, 1, 2]``.\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 internal\n counter is used to keep track of which item is used next, and this\n is incremented on each iteration. When this counter has reached the\n length of the sequence the loop terminates. This means that if the\n suite deletes the current (or a previous) item from the sequence,\n the next item will be skipped (since it gets the index of the\n 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\nChanged in version 2.5: In previous versions of Python,\n``try``...``except``...``finally`` did not work. ``try``...``except``\nhad to be nested in ``try``...``finally``.\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, a tuple containing an item compatible with the\nexception, or, in the (deprecated) case of string exceptions, is the\nraised string itself (note that the object identities must match, i.e.\nit must be the same string object, not just a string with the same\nvalue).\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 in that except clause, if present, and the except\nclause\'s suite is executed. All except clauses must have an\nexecutable block. When the end of this block is reached, execution\ncontinues normally after the entire try statement. (This means that\nif two nested handlers exist for the same exception, and the exception\noccurs in the try clause of the inner handler, the outer handler will\nnot handle the exception.)\n\nBefore an except clause\'s suite is executed, details about the\nexception are assigned to three variables in the ``sys`` module:\n``sys.exc_type`` receives the object identifying the exception;\n``sys.exc_value`` receives the exception\'s parameter;\n``sys.exc_traceback`` receives a traceback object (see section *The\nstandard type hierarchy*) identifying the point in the program where\nthe exception occurred. These details are also available through the\n``sys.exc_info()`` function, which returns a tuple ``(exc_type,\nexc_value, exc_traceback)``. Use of the corresponding variables is\ndeprecated in favor of this function, since their use is unsafe in a\nthreaded program. As of Python 1.5, the variables are restored to\ntheir previous values (before the call) when returning from a function\nthat 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 lost. The exception information is not available to the\nprogram during execution 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\nNew in version 2.5.\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\nNote: In Python 2.5, the ``with`` statement is only allowed when the\n ``with_statement`` feature has been enabled. It is always enabled\n in Python 2.6.\n\nChanged in version 2.7: 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 decorated ::= decorators (classdef | funcdef)\n decorators ::= decorator+\n decorator ::= "@" dotted_name ["(" [argument_list [","]] ")"] NEWLINE\n funcdef ::= "def" funcname "(" [parameter_list] ")" ":" suite\n dotted_name ::= identifier ("." identifier)*\n parameter_list ::= (defparameter ",")*\n ( "*" identifier [, "**" identifier]\n | "**" identifier\n | defparameter [","] )\n defparameter ::= parameter ["=" expression]\n sublist ::= parameter ("," parameter)* [","]\n parameter ::= identifier | "(" sublist ")"\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 top-level 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 must also have a default value --- this is a syntactic\nrestriction 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.\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.\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 ::= "class" classname [inheritance] ":" suite\n inheritance ::= "(" [expression_list] ")"\n classname ::= identifier\n\nA class definition is an executable statement. It first evaluates the\ninheritance list, if present. Each item in the inheritance list\nshould evaluate to a class object or class type which allows\nsubclassing. The class\'s suite is then executed in a new execution\nframe (see section *Naming and binding*), using a newly created local\nnamespace and the original global namespace. (Usually, the suite\ncontains only function definitions.) When the class\'s suite finishes\nexecution, its execution frame is discarded but its local namespace is\nsaved. [4] A class object is then created using the inheritance list\nfor the base classes and the saved local namespace for the attribute\ndictionary. The class name is bound to this class object in the\noriginal local namespace.\n\n**Programmer\'s note:** Variables defined in the class definition are\nclass variables; they are shared by all instances. To create instance\nvariables, they can be set in a method with ``self.name = value``.\nBoth class and instance variables are accessible through the notation\n"``self.name``", and an instance variable hides a class variable with\nthe same name when accessed in this way. Class variables can be used\nas defaults for instance variables, but using mutable values there can\nlead to unexpected results. For *new-style class*es, descriptors can\nbe used to create instance variables with different implementation\ndetails.\n\nClass definitions, like function definitions, may be wrapped by one or\nmore *decorator* expressions. The evaluation rules for the decorator\nexpressions are the same as for functions. The result must be a class\nobject, which is then bound to the class name.\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\nNew in version 2.5.\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," the arguments\nare coerced using the coercion rules listed at *Coercion rules*. If\nboth arguments are standard numeric types, the following coercions are\napplied:\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, if either argument is a long integer, the other is\n converted to long integer;\n\n* otherwise, both must be plain integers and no conversion is\n necessary.\n\nSome additional rules apply for certain operators (e.g., a string left\nargument to the \'%\' operator). Extensions can define their own\ncoercions.\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_traceback`` 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.exc_traceback`` or ``sys.last_traceback``. Circular\n references which are garbage are detected when the option cycle\n detector is enabled (it\'s on by default), but can only be cleaned\n up if there are no Python-level ``__del__()`` methods involved.\n Refer to the documentation for the ``gc`` module for more\n information about how ``__del__()`` methods are handled by the\n cycle detector, particularly the description of the ``garbage``\n 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\n See also the *-R* command-line option.\n\nobject.__repr__(self)\n\n Called by the ``repr()`` built-in function and by string\n conversions (reverse quotes) to compute the "official" string\n representation of an object. If at all possible, this should look\n like a valid Python expression that could be used to recreate an\n object with the same value (given an appropriate environment). If\n this is not possible, a string of the form ``<...some useful\n description...>`` should be returned. The return value must be a\n string object. If a class defines ``__repr__()`` but not\n ``__str__()``, then ``__repr__()`` is also used when an "informal"\n string representation of instances of that class is 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 statement 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.__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 New in version 2.1.\n\n These are the so-called "rich comparison" methods, and are called\n for comparison operators in preference to ``__cmp__()`` below. The\n correspondence between operator symbols and method names is as\n follows: ``xy`` call ``x.__ne__(y)``, ``x>y`` calls ``x.__gt__(y)``, and\n ``x>=y`` calls ``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.__cmp__(self, other)\n\n Called by comparison operations if rich comparison (see above) is\n not defined. Should return a negative integer if ``self < other``,\n zero if ``self == other``, a positive integer if ``self > other``.\n If no ``__cmp__()``, ``__eq__()`` or ``__ne__()`` operation is\n defined, class instances are compared by object identity\n ("address"). See also the description of ``__hash__()`` for some\n important notes on creating *hashable* objects which support custom\n comparison operations and are usable as dictionary keys. (Note: the\n restriction that exceptions are not propagated by ``__cmp__()`` has\n been removed since Python 1.5.)\n\nobject.__rcmp__(self, other)\n\n Changed in version 2.1: No longer supported.\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 a ``__cmp__()`` or ``__eq__()`` method\n it should not define a ``__hash__()`` operation either; if it\n defines ``__cmp__()`` or ``__eq__()`` but not ``__hash__()``, its\n instances will not be usable in hashed collections. If a class\n defines mutable objects and implements a ``__cmp__()`` or\n ``__eq__()`` method, it should not implement ``__hash__()``, since\n hashable collection implementations require that a object\'s hash\n value is immutable (if the object\'s hash value changes, it will be\n in the wrong hash bucket).\n\n User-defined classes have ``__cmp__()`` 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 ``__cmp__()`` or ``__eq__()`` such that\n the hash value returned is no longer appropriate (e.g. by switching\n to a value-based concept of equality instead of the default\n identity based equality) can explicitly flag themselves as being\n unhashable by setting ``__hash__ = None`` in the class definition.\n Doing so means that not only will instances of the class raise an\n appropriate ``TypeError`` when a program attempts to retrieve their\n hash value, but they will also be correctly identified as\n unhashable when checking ``isinstance(obj, collections.Hashable)``\n (unlike classes which define their own ``__hash__()`` to explicitly\n raise ``TypeError``).\n\n Changed in version 2.5: ``__hash__()`` may now also return a long\n integer object; the 32-bit integer is then derived from the hash of\n that object.\n\n Changed in version 2.6: ``__hash__`` may now be set to ``None`` to\n explicitly flag instances of a class as unhashable.\n\nobject.__nonzero__(self)\n\n Called to implement truth value testing and the built-in operation\n ``bool()``; should return ``False`` or ``True``, or their integer\n equivalents ``0`` or ``1``. When this method is not defined,\n ``__len__()`` is called, if it is defined, and the object is\n considered true if its result is nonzero. If a class defines\n neither ``__len__()`` nor ``__nonzero__()``, all its instances are\n considered true.\n\nobject.__unicode__(self)\n\n Called to implement ``unicode()`` built-in; should return a Unicode\n object. When this method is not defined, string conversion is\n attempted, and the result of string conversion is converted to\n Unicode using the system default encoding.\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 > (0)?()\n (Pdb) continue\n > (1)?()\n (Pdb) continue\n NameError: \'spam\'\n > (1)?()\n (Pdb)\n\n``pdb.py`` can also be invoked as a script to debug other scripts.\nFor example:\n\n python -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 2.4: Restarting post-mortem behavior added.\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 ``c`` 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 "", 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[, locals]])\n\n Execute the *statement* (given as a string) under debugger control.\n The debugger prompt appears before any code is executed; you can\n set breakpoints and type ``continue``, or you can step through the\n statement using ``step`` or ``next`` (all these commands are\n explained below). The optional *globals* and *locals* arguments\n specify the environment in which the code is executed; by default\n the dictionary of the module ``__main__`` is used. (See the\n explanation of the ``exec`` statement or the ``eval()`` built-in\n function.)\n\npdb.runeval(expression[, globals[, locals]])\n\n Evaluate the *expression* (given as a string) under debugger\n control. When ``runeval()`` returns, it returns the value of the\n expression. Otherwise this function is similar to ``run()``.\n\npdb.runcall(function[, argument, ...])\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])\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)\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 Example call to enable tracing with *skip*:\n\n import pdb; pdb.Pdb(skip=[\'django.*\']).set_trace()\n\n New in version 2.7: The *skip* argument.\n\n run(statement[, globals[, locals]])\n runeval(expression[, globals[, locals]])\n runcall(function[, argument, ...])\n set_trace()\n\n See the documentation for the functions explained above.\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\nIt is illegal to delete a name from the local namespace if it occurs\nas a free variable in a nested block.\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', + '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\nIf ``exec`` is used in a function and the function contains or is a\nnested block with free variables, the compiler will raise a\n``SyntaxError`` unless the exec explicitly specifies the local\nnamespace for the ``exec``. (In other words, ``exec obj`` would be\nillegal, but ``exec obj in ns`` would be legal.)\n\nThe ``eval()``, ``execfile()``, and ``input()`` functions and the\n``exec`` statement do not have access to the full environment for\nresolving names. Names may be resolved in the local and global\nnamespaces of the caller. Free variables are not resolved in the\nnearest enclosing namespace, but in the global namespace. [1] The\n``exec`` statement and the ``eval()`` and ``execfile()`` functions\nhave optional arguments to override the global and local namespace.\nIf only one namespace is specified, 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', + 'exceptions': '\nExceptions\n**********\n\nExceptions are a means of breaking out of the normal flow of control\nof a code block in order to handle errors or other exceptional\nconditions. An exception is *raised* at the point where the error is\ndetected; it may be *handled* by the surrounding code block or by any\ncode block that directly or indirectly invoked the code block where\nthe error occurred.\n\nThe Python interpreter raises an exception when it detects a run-time\nerror (such as division by zero). A Python program can also\nexplicitly raise an exception with the ``raise`` statement. Exception\nhandlers are specified with the ``try`` ... ``except`` statement. The\n``finally`` clause of such a statement can be used to specify cleanup\ncode which does not handle the exception, but is executed whether an\nexception occurred or not in the preceding code.\n\nPython uses the "termination" model of error handling: an exception\nhandler can find out what happened and continue execution at an outer\nlevel, but it cannot repair the cause of the error and retry the\nfailing operation (except by re-entering the offending piece of code\nfrom the top).\n\nWhen an exception is not handled at all, the interpreter terminates\nexecution of the program, or returns to its interactive main loop. In\neither case, it prints a stack backtrace, except when the exception is\n``SystemExit``.\n\nExceptions are identified by class instances. The ``except`` clause\nis selected depending on the class of the instance: it must reference\nthe class of the instance or a base class thereof. The instance can\nbe received by the handler and can carry additional information about\nthe exceptional condition.\n\nExceptions can also be identified by strings, in which case the\n``except`` clause is selected by object identity. An arbitrary value\ncan be raised along with the identifying string which can be passed to\nthe handler.\n\nNote: Messages to exceptions are not part of the Python API. Their\n contents may change from one version of Python to the next without\n warning and should not be relied on by code which will run under\n multiple versions of the interpreter.\n\nSee also the description of the ``try`` statement in section *The try\nstatement* and ``raise`` statement in section *The raise statement*.\n\n-[ Footnotes ]-\n\n[1] This limitation occurs because the code that is executed by these\n operations is not available at the time the module is compiled.\n', + 'execmodel': '\nExecution model\n***************\n\n\nNaming and binding\n==================\n\n*Names* refer to objects. Names are introduced by name binding\noperations. Each occurrence of a name in the program text refers to\nthe *binding* of that name established in the innermost function block\ncontaining the use.\n\nA *block* is a piece of Python program text that is executed as a\nunit. The following are blocks: a module, a function body, and a class\ndefinition. Each command typed interactively is a block. A script\nfile (a file given as standard input to the interpreter or specified\non the interpreter command line the first argument) is a code block.\nA script command (a command specified on the interpreter command line\nwith the \'**-c**\' option) is a code block. The file read by the\nbuilt-in function ``execfile()`` is a code block. The string argument\npassed to the built-in function ``eval()`` and to the ``exec``\nstatement is a code block. The expression read and evaluated by the\nbuilt-in function ``input()`` is a code block.\n\nA code block is executed in an *execution frame*. A frame contains\nsome administrative information (used for debugging) and determines\nwhere and how execution continues after the code block\'s execution has\ncompleted.\n\nA *scope* defines the visibility of a name within a block. If a local\nvariable is defined in a block, its scope includes that block. If the\ndefinition occurs in a function block, the scope extends to any blocks\ncontained within the defining one, unless a contained block introduces\na different binding for the name. The scope of names defined in a\nclass block is limited to the class block; it does not extend to the\ncode blocks of methods -- this includes generator expressions since\nthey are implemented using a function scope. This means that the\nfollowing will fail:\n\n class A:\n a = 42\n b = list(a + i for i in range(10))\n\nWhen a name is used in a code block, it is resolved using the nearest\nenclosing scope. The set of all such scopes visible to a code block\nis called the block\'s *environment*.\n\nIf a name is bound in a block, it is a local variable of that block.\nIf a name is bound at the module level, it is a global variable. (The\nvariables of the module code block are local and global.) If a\nvariable is used in a code block but not defined there, it is a *free\nvariable*.\n\nWhen a name is not found at all, a ``NameError`` exception is raised.\nIf the name refers to a local variable that has not been bound, a\n``UnboundLocalError`` exception is raised. ``UnboundLocalError`` is a\nsubclass of ``NameError``.\n\nThe following constructs bind names: formal parameters to functions,\n``import`` statements, class and function definitions (these bind the\nclass or function name in the defining block), and targets that are\nidentifiers if occurring in an assignment, ``for`` loop header, in the\nsecond position of an ``except`` clause header or after ``as`` in a\n``with`` statement. The ``import`` statement of the form ``from ...\nimport *`` binds all names defined in the imported module, except\nthose beginning with an underscore. This form may only be used at the\nmodule level.\n\nA target occurring in a ``del`` statement is also considered bound for\nthis purpose (though the actual semantics are to unbind the name). It\nis illegal to unbind a name that is referenced by an enclosing scope;\nthe compiler will report a ``SyntaxError``.\n\nEach assignment or import statement occurs within a block defined by a\nclass or function definition or at the module level (the top-level\ncode block).\n\nIf a name binding operation occurs anywhere within a code block, all\nuses of the name within the block are treated as references to the\ncurrent block. This can lead to errors when a name is used within a\nblock before it is bound. This rule is subtle. Python lacks\ndeclarations and allows name binding operations to occur anywhere\nwithin a code block. The local variables of a code block can be\ndetermined by scanning the entire text of the block for name binding\noperations.\n\nIf the global statement occurs within a block, all uses of the name\nspecified in the statement refer to the binding of that name in the\ntop-level namespace. Names are resolved in the top-level namespace by\nsearching the global namespace, i.e. the namespace of the module\ncontaining the code block, and the builtins namespace, the namespace\nof the module ``__builtin__``. The global namespace is searched\nfirst. If the name is not found there, the builtins namespace is\nsearched. The global statement must precede all uses of the name.\n\nThe builtins namespace associated with the execution of a code block\nis actually found by looking up the name ``__builtins__`` in its\nglobal namespace; this should be a dictionary or a module (in the\nlatter case the module\'s dictionary is used). By default, when in the\n``__main__`` module, ``__builtins__`` is the built-in module\n``__builtin__`` (note: no \'s\'); when in any other module,\n``__builtins__`` is an alias for the dictionary of the ``__builtin__``\nmodule itself. ``__builtins__`` can be set to a user-created\ndictionary to create a weak form of restricted execution.\n\n**CPython implementation detail:** Users should not touch\n``__builtins__``; it is strictly an implementation detail. Users\nwanting to override values in the builtins namespace should ``import``\nthe ``__builtin__`` (no \'s\') module and modify its attributes\nappropriately.\n\nThe namespace for a module is automatically created the first time a\nmodule is imported. The main module for a script is always called\n``__main__``.\n\nThe ``global`` statement has the same scope as a name binding\noperation in the same block. If the nearest enclosing scope for a\nfree variable contains a global statement, the free variable is\ntreated as a global.\n\nA class definition is an executable statement that may use and define\nnames. These references follow the normal rules for name resolution.\nThe namespace of the class definition becomes the attribute dictionary\nof the class. Names defined at the class scope are not visible in\nmethods.\n\n\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\nIf ``exec`` is used in a function and the function contains or is a\nnested block with free variables, the compiler will raise a\n``SyntaxError`` unless the exec explicitly specifies the local\nnamespace for the ``exec``. (In other words, ``exec obj`` would be\nillegal, but ``exec obj in ns`` would be legal.)\n\nThe ``eval()``, ``execfile()``, and ``input()`` functions and the\n``exec`` statement do not have access to the full environment for\nresolving names. Names may be resolved in the local and global\nnamespaces of the caller. Free variables are not resolved in the\nnearest enclosing namespace, but in the global namespace. [1] The\n``exec`` statement and the ``eval()`` and ``execfile()`` functions\nhave optional arguments to override the global and local namespace.\nIf only one namespace is specified, it is used for both.\n\n\nExceptions\n==========\n\nExceptions are a means of breaking out of the normal flow of control\nof a code block in order to handle errors or other exceptional\nconditions. An exception is *raised* at the point where the error is\ndetected; it may be *handled* by the surrounding code block or by any\ncode block that directly or indirectly invoked the code block where\nthe error occurred.\n\nThe Python interpreter raises an exception when it detects a run-time\nerror (such as division by zero). A Python program can also\nexplicitly raise an exception with the ``raise`` statement. Exception\nhandlers are specified with the ``try`` ... ``except`` statement. The\n``finally`` clause of such a statement can be used to specify cleanup\ncode which does not handle the exception, but is executed whether an\nexception occurred or not in the preceding code.\n\nPython uses the "termination" model of error handling: an exception\nhandler can find out what happened and continue execution at an outer\nlevel, but it cannot repair the cause of the error and retry the\nfailing operation (except by re-entering the offending piece of code\nfrom the top).\n\nWhen an exception is not handled at all, the interpreter terminates\nexecution of the program, or returns to its interactive main loop. In\neither case, it prints a stack backtrace, except when the exception is\n``SystemExit``.\n\nExceptions are identified by class instances. The ``except`` clause\nis selected depending on the class of the instance: it must reference\nthe class of the instance or a base class thereof. The instance can\nbe received by the handler and can carry additional information about\nthe exceptional condition.\n\nExceptions can also be identified by strings, in which case the\n``except`` clause is selected by object identity. An arbitrary value\ncan be raised along with the identifying string which can be passed to\nthe handler.\n\nNote: Messages to exceptions are not part of the Python API. Their\n contents may change from one version of Python to the next without\n warning and should not be relied on by code which will run under\n multiple versions of the interpreter.\n\nSee also the description of the ``try`` statement in section *The try\nstatement* and ``raise`` statement in section *The raise statement*.\n\n-[ Footnotes ]-\n\n[1] This limitation occurs because the code that is executed by these\n operations is not available at the time the module is compiled.\n', + '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 of floating point numbers can\nlook like octal integers, but are interpreted using radix 10. For\nexample, ``077e010`` is legal, and denotes the same number as\n``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, and then the suite is executed. When the items are\nexhausted (which is immediately when the sequence is empty), the suite\nin the ``else`` clause, if present, is executed, and the loop\nterminates.\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\nThe target list is not deleted when the loop is finished, but if the\nsequence is empty, it will not have been assigned to at all by the\nloop. Hint: the built-in function ``range()`` returns a sequence of\nintegers suitable to emulate the effect of Pascal\'s ``for i := a to b\ndo``; e.g., ``range(3)`` returns the list ``[0, 1, 2]``.\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 internal\n counter is used to keep track of which item is used next, and this\n is incremented on each iteration. When this counter has reached the\n length of the sequence the loop terminates. This means that if the\n suite deletes the current (or a previous) item from the sequence,\n the next item will be skipped (since it gets the index of the\n 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 ::= +\n conversion ::= "r" | "s"\n format_spec ::= \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 2.7: 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\nTwo conversion flags are currently supported: ``\'!s\'`` which calls\n``str()`` on the value, and ``\'!r\'`` which calls ``repr()``.\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\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 ::= \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 is only valid for integers, and only for binary,\noctal, or hexadecimal output. If present, it specifies that the\noutput will be prefixed by ``\'0b\'``, ``\'0o\'``, or ``\'0x\'``,\nrespectively.\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 2.7: 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\'``. |\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 | The same as ``\'g\'``. |\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\') # 2.7+ 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(object):\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.5\n >>> total = 22\n >>> \'Correct answers: {:.2%}\'.format(points/total)\n \'Correct answers: 88.64%\'\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),\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 decorated ::= decorators (classdef | funcdef)\n decorators ::= decorator+\n decorator ::= "@" dotted_name ["(" [argument_list [","]] ")"] NEWLINE\n funcdef ::= "def" funcname "(" [parameter_list] ")" ":" suite\n dotted_name ::= identifier ("." identifier)*\n parameter_list ::= (defparameter ",")*\n ( "*" identifier [, "**" identifier]\n | "**" identifier\n | defparameter [","] )\n defparameter ::= parameter ["=" expression]\n sublist ::= parameter ("," parameter)* [","]\n parameter ::= identifier | "(" sublist ")"\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 top-level 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 must also have a default value --- this is a syntactic\nrestriction 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.\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.\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', + '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 an\n``exec`` statement does not affect the code block *containing* the\n``exec`` statement, and code contained in an ``exec`` statement is\nunaffected by ``global`` statements in the code containing the\n``exec`` statement. The same applies to the ``eval()``,\n``execfile()`` 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 ``__builtin__`` module.\n When not in interactive mode, ``_`` has no special meaning and is\n not 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\n identifier ::= (letter|"_") (letter | digit | "_")*\n letter ::= lowercase | uppercase\n lowercase ::= "a"..."z"\n uppercase ::= "A"..."Z"\n digit ::= "0"..."9"\n\nIdentifiers are unlimited in length. Case is significant.\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 and del from not while\n as elif global or with\n assert else if pass yield\n break except import print\n class exec in raise\n continue finally is return\n def for lambda try\n\nChanged in version 2.4: ``None`` became a constant and is now\nrecognized by the compiler as a name for the built-in object ``None``.\nAlthough it is not a keyword, you cannot assign a different object to\nit.\n\nChanged in version 2.5: Using ``as`` and ``with`` as identifiers\ntriggers a warning. To use them as keywords, enable the\n``with_statement`` future feature .\n\nChanged in version 2.6: ``as`` and ``with`` are full keywords.\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 ``__builtin__`` module.\n When not in interactive mode, ``_`` has no special meaning and is\n not 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.\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.\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. If the\nwild card form of import --- ``import *`` --- is used in a function\nand the function contains or is a nested block with free variables,\nthe compiler will 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 2.6 are ``unicode_literals``,\n``print_function``, ``absolute_import``, ``division``, ``generators``,\n``nested_scopes`` and ``with_statement``. ``generators``,\n``with_statement``, ``nested_scopes`` are redundant in Python version\n2.6 and above because they are always enabled.\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 an ``exec`` statement or calls to the built-in\nfunctions ``compile()`` and ``execfile()`` that occur in a module\n``M`` containing a future statement will, by default, use the new\nsyntax or semantics associated with the future statement. This can,\nstarting with Python 2.2 be controlled by optional arguments to\n``compile()`` --- see the documentation of that function for 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 forms ``<>`` and ``!=`` are equivalent; for consistency with C,\n``!=`` is preferred; where ``!=`` is mentioned below ``<>`` is also\naccepted. The ``<>`` spelling is considered obsolescent.\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,\nobjects of different types *always* compare unequal, and are ordered\nconsistently but arbitrarily. You can control comparison behavior of\nobjects of non-built-in types by defining a ``__cmp__`` method or rich\ncomparison methods like ``__gt__``, described in section *Special\nmethod names*.\n\n(This unusual definition of comparison was used to simplify the\ndefinition of operations like sorting and the ``in`` and ``not in``\noperators. In the future, the comparison rules for objects of\ndifferent types are likely to change.)\n\nComparison of objects of the same type depends on the type:\n\n* Numbers are compared arithmetically.\n\n* Strings are compared lexicographically using the numeric equivalents\n (the result of the built-in function ``ord()``) of their characters.\n Unicode and 8-bit strings are fully interoperable in this behavior.\n [4]\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, ``cmp([1,2,x], [1,2,y])`` returns\n the same as ``cmp(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 their sorted\n (key, value) lists compare equal. [5] Outcomes other than equality\n are resolved consistently, but are not otherwise defined. [6]\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\nThe operators ``in`` and ``not in`` test for collection membership.\n``x in s`` evaluates to true if *x* is a member of the collection *s*,\nand false otherwise. ``x not in s`` returns the negation of ``x in\ns``. The collection membership test has traditionally been bound to\nsequences; an object is a member of a collection if the collection is\na sequence and contains an element equal to that object. However, it\nmake sense for many other object types to support membership tests\nwithout being a sequence. In particular, dictionaries (for keys) and\nsets support membership testing.\n\nFor the list and tuple types, ``x in y`` is true if and only if there\nexists an index *i* such that ``x == y[i]`` is true.\n\nFor the Unicode and string types, ``x in y`` is true if and only if\n*x* is a substring of *y*. An equivalent test is ``y.find(x) != -1``.\nNote, *x* and *y* need not be the same type; consequently, ``u\'ab\' in\n\'abc\'`` will return ``True``. Empty strings are always considered to\nbe a substring of any other string, so ``"" in "abc"`` will return\n``True``.\n\nChanged in version 2.3: Previously, *x* was required to be a string of\nlength ``1``.\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. [7]\n', + 'integers': '\nInteger and long integer literals\n*********************************\n\nInteger and long integer literals are described by the following\nlexical definitions:\n\n longinteger ::= integer ("l" | "L")\n integer ::= decimalinteger | octinteger | hexinteger | bininteger\n decimalinteger ::= nonzerodigit digit* | "0"\n octinteger ::= "0" ("o" | "O") octdigit+ | "0" octdigit+\n hexinteger ::= "0" ("x" | "X") hexdigit+\n bininteger ::= "0" ("b" | "B") bindigit+\n nonzerodigit ::= "1"..."9"\n octdigit ::= "0"..."7"\n bindigit ::= "0" | "1"\n hexdigit ::= digit | "a"..."f" | "A"..."F"\n\nAlthough both lower case ``\'l\'`` and upper case ``\'L\'`` are allowed as\nsuffix for long integers, it is strongly recommended to always use\n``\'L\'``, since the letter ``\'l\'`` looks too much like the digit\n``\'1\'``.\n\nPlain integer literals that are above the largest representable plain\ninteger (e.g., 2147483647 when using 32-bit arithmetic) are accepted\nas if they were long integers instead. [1] There is no limit for long\ninteger literals apart from what can be stored in available memory.\n\nSome examples of plain integer literals (first row) and long integer\nliterals (second and third rows):\n\n 7 2147483647 0177\n 3L 79228162514264337593543950336L 0377L 0x100000000L\n 79228162514264337593543950336 0xdeadbeef\n', + 'lambda': '\nLambdas\n*******\n\n lambda_form ::= "lambda" [parameter_list]: expression\n old_lambda_form ::= "lambda" [parameter_list]: old_expression\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 name(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.\n', + 'lists': '\nList displays\n*************\n\nA list display is a possibly empty series of expressions enclosed in\nsquare brackets:\n\n list_display ::= "[" [expression_list | list_comprehension] "]"\n list_comprehension ::= expression list_for\n list_for ::= "for" target_list "in" old_expression_list [list_iter]\n old_expression_list ::= old_expression [("," old_expression)+ [","]]\n old_expression ::= or_test | old_lambda_form\n list_iter ::= list_for | list_if\n list_if ::= "if" old_expression [list_iter]\n\nA list display yields a new list object. Its contents are specified\nby providing either a list of expressions or a list comprehension.\nWhen a comma-separated list of expressions is supplied, its elements\nare evaluated from left to right and placed into the list object in\nthat order. When a list comprehension is supplied, it consists of a\nsingle expression followed by at least one ``for`` clause and zero or\nmore ``for`` or ``if`` clauses. In this case, the elements of the new\nlist are those that would be produced by considering each of the\n``for`` or ``if`` clauses a block, nesting from left to right, and\nevaluating the expression to produce a list element each time the\ninnermost block is reached [1].\n', + 'naming': "\nNaming and binding\n******************\n\n*Names* refer to objects. Names are introduced by name binding\noperations. Each occurrence of a name in the program text refers to\nthe *binding* of that name established in the innermost function block\ncontaining the use.\n\nA *block* is a piece of Python program text that is executed as a\nunit. The following are blocks: a module, a function body, and a class\ndefinition. Each command typed interactively is a block. A script\nfile (a file given as standard input to the interpreter or specified\non the interpreter command line the first argument) is a code block.\nA script command (a command specified on the interpreter command line\nwith the '**-c**' option) is a code block. The file read by the\nbuilt-in function ``execfile()`` is a code block. The string argument\npassed to the built-in function ``eval()`` and to the ``exec``\nstatement is a code block. The expression read and evaluated by the\nbuilt-in function ``input()`` is a code block.\n\nA code block is executed in an *execution frame*. A frame contains\nsome administrative information (used for debugging) and determines\nwhere and how execution continues after the code block's execution has\ncompleted.\n\nA *scope* defines the visibility of a name within a block. If a local\nvariable is defined in a block, its scope includes that block. If the\ndefinition occurs in a function block, the scope extends to any blocks\ncontained within the defining one, unless a contained block introduces\na different binding for the name. The scope of names defined in a\nclass block is limited to the class block; it does not extend to the\ncode blocks of methods -- this includes generator expressions since\nthey are implemented using a function scope. This means that the\nfollowing will fail:\n\n class A:\n a = 42\n b = list(a + i for i in range(10))\n\nWhen a name is used in a code block, it is resolved using the nearest\nenclosing scope. The set of all such scopes visible to a code block\nis called the block's *environment*.\n\nIf a name is bound in a block, it is a local variable of that block.\nIf a name is bound at the module level, it is a global variable. (The\nvariables of the module code block are local and global.) If a\nvariable is used in a code block but not defined there, it is a *free\nvariable*.\n\nWhen a name is not found at all, a ``NameError`` exception is raised.\nIf the name refers to a local variable that has not been bound, a\n``UnboundLocalError`` exception is raised. ``UnboundLocalError`` is a\nsubclass of ``NameError``.\n\nThe following constructs bind names: formal parameters to functions,\n``import`` statements, class and function definitions (these bind the\nclass or function name in the defining block), and targets that are\nidentifiers if occurring in an assignment, ``for`` loop header, in the\nsecond position of an ``except`` clause header or after ``as`` in a\n``with`` statement. The ``import`` statement of the form ``from ...\nimport *`` binds all names defined in the imported module, except\nthose beginning with an underscore. This form may only be used at the\nmodule level.\n\nA target occurring in a ``del`` statement is also considered bound for\nthis purpose (though the actual semantics are to unbind the name). It\nis illegal to unbind a name that is referenced by an enclosing scope;\nthe compiler will report a ``SyntaxError``.\n\nEach assignment or import statement occurs within a block defined by a\nclass or function definition or at the module level (the top-level\ncode block).\n\nIf a name binding operation occurs anywhere within a code block, all\nuses of the name within the block are treated as references to the\ncurrent block. This can lead to errors when a name is used within a\nblock before it is bound. This rule is subtle. Python lacks\ndeclarations and allows name binding operations to occur anywhere\nwithin a code block. The local variables of a code block can be\ndetermined by scanning the entire text of the block for name binding\noperations.\n\nIf the global statement occurs within a block, all uses of the name\nspecified in the statement refer to the binding of that name in the\ntop-level namespace. Names are resolved in the top-level namespace by\nsearching the global namespace, i.e. the namespace of the module\ncontaining the code block, and the builtins namespace, the namespace\nof the module ``__builtin__``. The global namespace is searched\nfirst. If the name is not found there, the builtins namespace is\nsearched. The global statement must precede all uses of the name.\n\nThe builtins namespace associated with the execution of a code block\nis actually found by looking up the name ``__builtins__`` in its\nglobal namespace; this should be a dictionary or a module (in the\nlatter case the module's dictionary is used). By default, when in the\n``__main__`` module, ``__builtins__`` is the built-in module\n``__builtin__`` (note: no 's'); when in any other module,\n``__builtins__`` is an alias for the dictionary of the ``__builtin__``\nmodule itself. ``__builtins__`` can be set to a user-created\ndictionary to create a weak form of restricted execution.\n\n**CPython implementation detail:** Users should not touch\n``__builtins__``; it is strictly an implementation detail. Users\nwanting to override values in the builtins namespace should ``import``\nthe ``__builtin__`` (no 's') module and modify its attributes\nappropriately.\n\nThe namespace for a module is automatically created the first time a\nmodule is imported. The main module for a script is always called\n``__main__``.\n\nThe ``global`` statement has the same scope as a name binding\noperation in the same block. If the nearest enclosing scope for a\nfree variable contains a global statement, the free variable is\ntreated as a global.\n\nA class definition is an executable statement that may use and define\nnames. These references follow the normal rules for name resolution.\nThe namespace of the class definition becomes the attribute dictionary\nof the class. Names defined at the class scope are not visible in\nmethods.\n\n\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\nIf ``exec`` is used in a function and the function contains or is a\nnested block with free variables, the compiler will raise a\n``SyntaxError`` unless the exec explicitly specifies the local\nnamespace for the ``exec``. (In other words, ``exec obj`` would be\nillegal, but ``exec obj in ns`` would be legal.)\n\nThe ``eval()``, ``execfile()``, and ``input()`` functions and the\n``exec`` statement do not have access to the full environment for\nresolving names. Names may be resolved in the local and global\nnamespaces of the caller. Free variables are not resolved in the\nnearest enclosing namespace, but in the global namespace. [1] The\n``exec`` statement and the ``eval()`` and ``execfile()`` functions\nhave optional arguments to override the global and local namespace.\nIf only one namespace is specified, it is used for both.\n", + 'numbers': "\nNumeric literals\n****************\n\nThere are four types of numeric literals: plain integers, long\nintegers, floating point numbers, and imaginary numbers. There are no\ncomplex literals (complex numbers can be formed by adding a real\nnumber and an imaginary 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.__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 (``+``, ``-``, ``*``, ``//``, ``%``, ``divmod()``,\n ``pow()``, ``**``, ``<<``, ``>>``, ``&``, ``^``, ``|``). For\n instance, to evaluate the expression ``x + y``, where *x* is an\n 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__()`` (described below). Note\n that ``__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.__div__(self, other)\nobject.__truediv__(self, other)\n\n The division operator (``/``) is implemented by these methods. The\n ``__truediv__()`` method is used when ``__future__.division`` is in\n effect, otherwise ``__div__()`` is used. If only one of these two\n methods is defined, the object will not support division in the\n alternate context; ``TypeError`` will be raised instead.\n\nobject.__radd__(self, other)\nobject.__rsub__(self, other)\nobject.__rmul__(self, other)\nobject.__rdiv__(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 (``+``, ``-``, ``*``, ``/``, ``%``, ``divmod()``,\n ``pow()``, ``**``, ``<<``, ``>>``, ``&``, ``^``, ``|``) with\n reflected (swapped) operands. These functions are only called if\n the left operand does not support the corresponding operation and\n the operands are of different types. [2] For instance, to evaluate\n the expression ``x - y``, where *y* is an instance of a class that\n has an ``__rsub__()`` method, ``y.__rsub__(x)`` is called if\n ``x.__sub__(y)`` returns *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.__idiv__(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.__long__(self)\nobject.__float__(self)\n\n Called to implement the built-in functions ``complex()``,\n ``int()``, ``long()``, and ``float()``. Should return a value of\n the appropriate type.\n\nobject.__oct__(self)\nobject.__hex__(self)\n\n Called to implement the built-in functions ``oct()`` and ``hex()``.\n Should return a string value.\n\nobject.__index__(self)\n\n Called to implement ``operator.index()``. Also called whenever\n Python needs an integer object (such as in slicing). Must return\n an integer (int or long).\n\n New in version 2.5.\n\nobject.__coerce__(self, other)\n\n Called to implement "mixed-mode" numeric arithmetic. Should either\n return a 2-tuple containing *self* and *other* converted to a\n common numeric type, or ``None`` if conversion is impossible. When\n the common type would be the type of ``other``, it is sufficient to\n return ``None``, since the interpreter will also ask the other\n object to attempt a coercion (but sometimes, if the implementation\n of the other type cannot be changed, it is useful to do the\n conversion to the other type here). A return value of\n ``NotImplemented`` is equivalent to returning ``None``.\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 provides a convenient way to do\nthis.\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+-------------------------------------------------+---------------------------------------+\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| | [8] |\n+-------------------------------------------------+---------------------------------------+\n| ``+x``, ``-x``, ``~x`` | Positive, negative, bitwise NOT |\n+-------------------------------------------------+---------------------------------------+\n| ``**`` | Exponentiation [9] |\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, string |\n| | conversion |\n+-------------------------------------------------+---------------------------------------+\n\n-[ Footnotes ]-\n\n[1] In Python 2.3 and later releases, a list comprehension "leaks" the\n control variables of each ``for`` it contains into the containing\n scope. However, this behavior is deprecated, and relying on it\n will not work in Python 3.0\n\n[2] 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[3] If x is very close to an exact integer multiple of y, it\'s\n possible for ``floor(x/y)`` to be one larger than ``(x-x%y)/y``\n due to rounding. In such cases, Python returns the latter result,\n in order to preserve that ``divmod(x,y)[0] * y + x % y`` be very\n close to ``x``.\n\n[4] While comparisons between unicode strings make sense at the byte\n level, they may be counter-intuitive to users. For example, the\n strings ``u"\\u00C7"`` and ``u"\\u0043\\u0327"`` compare differently,\n even 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[5] The implementation computes this efficiently, without constructing\n lists or sorting.\n\n[6] Earlier versions of Python used lexicographic comparison of the\n sorted (key, value) lists, but this was very expensive for the\n common case of comparing for equality. An even earlier version of\n Python compared dictionaries by identity only, but this caused\n surprises because people expected to be able to test a dictionary\n for emptiness by comparing it to ``{}``.\n\n[7] 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[8] The ``%`` operator is also used for string formatting; the same\n precedence applies.\n\n[9] 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. The result type is that of the\narguments after coercion.\n\nWith mixed operand types, the coercion rules for binary arithmetic\noperators apply. For int and long int operands, the result has the\nsame type as the operands (after coercion) unless the second argument\nis negative; in that case, all arguments are converted to float and a\nfloat result is delivered. For example, ``10**2`` returns ``100``, but\n``10**-2`` returns ``0.01``. (This last feature was added in Python\n2.2. In Python 2.1 and before, if both arguments were of integer types\nand the second argument was negative, an exception was raised).\n\nRaising ``0.0`` to a negative power results in a\n``ZeroDivisionError``. Raising a negative number to a fractional power\nresults in a ``ValueError``.\n', + 'raise': '\nThe ``raise`` statement\n***********************\n\n raise_stmt ::= "raise" [expression ["," expression ["," 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 ``TypeError`` exception is raised indicating that\nthis is an error (if running under IDLE, a ``Queue.Empty`` exception\nis raised instead).\n\nOtherwise, ``raise`` evaluates the expressions to get three objects,\nusing ``None`` as the value of omitted expressions. The first two\nobjects are used to determine the *type* and *value* of the exception.\n\nIf the first object is an instance, the type of the exception is the\nclass of the instance, the instance itself is the value, and the\nsecond object must be ``None``.\n\nIf the first object is a class, it becomes the type of the exception.\nThe second object is used to determine the exception value: If it is\nan instance of the class, the instance becomes the exception value. If\nthe second object is a tuple, it is used as the argument list for the\nclass constructor; if it is ``None``, an empty argument list is used,\nand any other object is treated as a single argument to the\nconstructor. The instance so created by calling the constructor is\nused as the exception value.\n\nIf a third object is present and not ``None``, it must be a traceback\nobject (see section *The standard type hierarchy*), and it is\nsubstituted instead of the current location as the place where the\nexception occurred. If the third object is present and not a\ntraceback object or ``None``, a ``TypeError`` exception is raised.\nThe three-expression form of ``raise`` is useful to re-raise an\nexception transparently in an except clause, but ``raise`` with no\nexpressions should be preferred if the exception to be re-raised was\nthe most recently active exception in the current scope.\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', + '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. (For backwards compatibility, the method\n``__getslice__()`` (see below) can also be defined to handle simple,\nbut not extended slices.) It is also recommended that mappings provide\nthe methods ``keys()``, ``values()``, ``items()``, ``has_key()``,\n``get()``, ``clear()``, ``setdefault()``, ``iterkeys()``,\n``itervalues()``, ``iteritems()``, ``pop()``, ``popitem()``,\n``copy()``, and ``update()`` behaving similar to those for Python's\nstandard dictionary objects. The ``UserDict`` module provides a\n``DictMixin`` class to help create those methods from a base set of\n``__getitem__()``, ``__setitem__()``, ``__delitem__()``, and\n``keys()``. Mutable sequences should provide methods ``append()``,\n``count()``, ``index()``, ``extend()``, ``insert()``, ``pop()``,\n``remove()``, ``reverse()`` and ``sort()``, like Python standard list\nobjects. Finally, sequence types should implement addition (meaning\nconcatenation) and multiplication (meaning repetition) by defining the\nmethods ``__add__()``, ``__radd__()``, ``__iadd__()``, ``__mul__()``,\n``__rmul__()`` and ``__imul__()`` described below; they should not\ndefine ``__coerce__()`` or other numerical operators. It is\nrecommended that both mappings and sequences implement the\n``__contains__()`` method to allow efficient use of the ``in``\noperator; for mappings, ``in`` should be equivalent of ``has_key()``;\nfor sequences, 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``iterkeys()``; 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 ``__nonzero__()`` method and whose\n ``__len__()`` method returns zero is considered to be false in a\n Boolean context.\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 ``iterkeys()``.\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\n New in version 2.6.\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 plain or long integers as arguments. The\narguments are converted to a common type. 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,\nn)``. Negative shift counts raise a ``ValueError`` exception.\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 ::= simple_slicing | extended_slicing\n simple_slicing ::= primary "[" short_slice "]"\n extended_slicing ::= primary "[" slice_list "]"\n slice_list ::= slice_item ("," slice_item)* [","]\n slice_item ::= expression | proper_slice | ellipsis\n proper_slice ::= short_slice | long_slice\n short_slice ::= [lower_bound] ":" [upper_bound]\n long_slice ::= short_slice ":" [stride]\n lower_bound ::= expression\n upper_bound ::= expression\n stride ::= expression\n ellipsis ::= "..."\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 nor ellipses). Similarly, when the slice\nlist has exactly one short slice and no trailing comma, the\ninterpretation as a simple slicing takes priority over that as an\nextended slicing.\n\nThe semantics for a simple slicing are as follows. The primary must\nevaluate to a sequence object. The lower and upper bound expressions,\nif present, must evaluate to plain integers; defaults are zero and the\n``sys.maxint``, respectively. If either bound is negative, the\nsequence\'s length is added to it. The slicing now selects all items\nwith index *k* such that ``i <= k < j`` where *i* and *j* are the\nspecified lower and upper bounds. This may be an empty sequence. It\nis not an error if *i* or *j* lie outside the range of valid indexes\n(such items don\'t exist so they aren\'t selected).\n\nThe semantics for an extended slicing are as follows. The primary\nmust evaluate to a mapping object, and it is indexed with a key that\nis constructed 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 an ellipsis slice\nitem is the built-in ``Ellipsis`` object. The conversion of a proper\nslice is a slice object (see section *The standard type hierarchy*)\nwhose ``start``, ``stop`` and ``step`` attributes are the values of\nthe expressions 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\nobject.__methods__\n\n Deprecated since version 2.2: Use the built-in function ``dir()``\n to get a list of an object\'s attributes. This attribute is no\n longer available.\n\nobject.__members__\n\n Deprecated since version 2.2: Use the built-in function ``dir()``\n to get a list of an object\'s attributes. This attribute is no\n longer available.\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\nThe following attributes are only supported by *new-style class*es.\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 new-style class keeps a list of weak references to its\n immediate subclasses. This method returns a list of all those\n references still alive. Example:\n\n >>> int.__subclasses__()\n []\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\n[6] The advantage of leaving the newline on is that returning an empty\n string is then an unambiguous EOF indication. It is also possible\n (in cases where it might matter, for example, if you want to make\n an exact copy of a file while scanning its lines) to tell whether\n the last line of a file ended in a newline or not (yes this\n happens!).\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 ``x.__getitem__(i)`` for\nold-style classes and ``type(x).__getitem__(x, i)`` for new-style\nclasses. Except where mentioned, attempts to execute an operation\nraise an 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_traceback`` 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.exc_traceback`` or ``sys.last_traceback``. Circular\n references which are garbage are detected when the option cycle\n detector is enabled (it\'s on by default), but can only be cleaned\n up if there are no Python-level ``__del__()`` methods involved.\n Refer to the documentation for the ``gc`` module for more\n information about how ``__del__()`` methods are handled by the\n cycle detector, particularly the description of the ``garbage``\n 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\n See also the *-R* command-line option.\n\nobject.__repr__(self)\n\n Called by the ``repr()`` built-in function and by string\n conversions (reverse quotes) to compute the "official" string\n representation of an object. If at all possible, this should look\n like a valid Python expression that could be used to recreate an\n object with the same value (given an appropriate environment). If\n this is not possible, a string of the form ``<...some useful\n description...>`` should be returned. The return value must be a\n string object. If a class defines ``__repr__()`` but not\n ``__str__()``, then ``__repr__()`` is also used when an "informal"\n string representation of instances of that class is 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 statement 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.__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 New in version 2.1.\n\n These are the so-called "rich comparison" methods, and are called\n for comparison operators in preference to ``__cmp__()`` below. The\n correspondence between operator symbols and method names is as\n follows: ``xy`` call ``x.__ne__(y)``, ``x>y`` calls ``x.__gt__(y)``, and\n ``x>=y`` calls ``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.__cmp__(self, other)\n\n Called by comparison operations if rich comparison (see above) is\n not defined. Should return a negative integer if ``self < other``,\n zero if ``self == other``, a positive integer if ``self > other``.\n If no ``__cmp__()``, ``__eq__()`` or ``__ne__()`` operation is\n defined, class instances are compared by object identity\n ("address"). See also the description of ``__hash__()`` for some\n important notes on creating *hashable* objects which support custom\n comparison operations and are usable as dictionary keys. (Note: the\n restriction that exceptions are not propagated by ``__cmp__()`` has\n been removed since Python 1.5.)\n\nobject.__rcmp__(self, other)\n\n Changed in version 2.1: No longer supported.\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 a ``__cmp__()`` or ``__eq__()`` method\n it should not define a ``__hash__()`` operation either; if it\n defines ``__cmp__()`` or ``__eq__()`` but not ``__hash__()``, its\n instances will not be usable in hashed collections. If a class\n defines mutable objects and implements a ``__cmp__()`` or\n ``__eq__()`` method, it should not implement ``__hash__()``, since\n hashable collection implementations require that a object\'s hash\n value is immutable (if the object\'s hash value changes, it will be\n in the wrong hash bucket).\n\n User-defined classes have ``__cmp__()`` 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 ``__cmp__()`` or ``__eq__()`` such that\n the hash value returned is no longer appropriate (e.g. by switching\n to a value-based concept of equality instead of the default\n identity based equality) can explicitly flag themselves as being\n unhashable by setting ``__hash__ = None`` in the class definition.\n Doing so means that not only will instances of the class raise an\n appropriate ``TypeError`` when a program attempts to retrieve their\n hash value, but they will also be correctly identified as\n unhashable when checking ``isinstance(obj, collections.Hashable)``\n (unlike classes which define their own ``__hash__()`` to explicitly\n raise ``TypeError``).\n\n Changed in version 2.5: ``__hash__()`` may now also return a long\n integer object; the 32-bit integer is then derived from the hash of\n that object.\n\n Changed in version 2.6: ``__hash__`` may now be set to ``None`` to\n explicitly flag instances of a class as unhashable.\n\nobject.__nonzero__(self)\n\n Called to implement truth value testing and the built-in operation\n ``bool()``; should return ``False`` or ``True``, or their integer\n equivalents ``0`` or ``1``. When this method is not defined,\n ``__len__()`` is called, if it is defined, and the object is\n considered true if its result is nonzero. If a class defines\n neither ``__len__()`` nor ``__nonzero__()``, all its instances are\n considered true.\n\nobject.__unicode__(self)\n\n Called to implement ``unicode()`` built-in; should return a Unicode\n object. When this method is not defined, string conversion is\n attempted, and the result of string conversion is converted to\n Unicode using the system default encoding.\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 in new-style classes.\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 not simply execute ``self.name = value`` --- this would\n cause a recursive call to itself. Instead, it should insert the\n value in the dictionary of instance attributes, e.g.,\n ``self.__dict__[name] = value``. For new-style classes, rather\n than accessing the instance dictionary, it should call the base\n 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\n\nMore attribute access for new-style classes\n-------------------------------------------\n\nThe following methods only apply to new-style classes.\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 for new-style\n classes*.\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. Note that descriptors are only invoked for new\nstyle objects or classes (ones that subclass ``object()`` or\n``type()``).\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 a new-style object instance, ``a.x`` is transformed\n into the call: ``type(a).__dict__[\'x\'].__get__(a, type(a))``.\n\nClass Binding\n If binding to a new-style class, ``A.x`` is transformed into the\n call: ``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 both old and new-style classes have a\ndictionary for attribute storage. This wastes space for objects\nhaving very few instance variables. The space consumption can become\nacute when creating large numbers of instances.\n\nThe default can be overridden by defining *__slots__* in a new-style\nclass definition. The *__slots__* declaration takes a sequence of\ninstance variables and reserves just enough space in each instance to\nhold a value for each variable. Space is saved because *__dict__* is\nnot created for each instance.\n\n__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 new-style class, *__slots__* reserves space for the declared\n variables and prevents the automatic creation of *__dict__* and\n *__weakref__* for each instance.\n\n New in version 2.2.\n\nNotes on using *__slots__*\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 Changed in version 2.3: Previously, adding ``\'__dict__\'`` to the\n *__slots__* declaration would not enable the assignment of new\n attributes not specifically listed in the sequence of instance\n variable names.\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 Changed in version 2.3: Previously, adding ``\'__weakref__\'`` to the\n *__slots__* declaration would not enable support for weak\n references.\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 ``long``, ``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 Changed in version 2.6: Previously, *__class__* assignment raised an\n error if either new or old class had *__slots__*.\n\n\nCustomizing class creation\n==========================\n\nBy default, new-style classes are constructed using ``type()``. A\nclass definition is read into a separate namespace and the value of\nclass name is bound to the result of ``type(name, bases, dict)``.\n\nWhen the class definition is read, if *__metaclass__* is defined then\nthe callable assigned to it will be called instead of ``type()``. 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\n__metaclass__\n\n This variable can be any callable accepting arguments for ``name``,\n ``bases``, and ``dict``. Upon class creation, the callable is used\n instead of the built-in ``type()``.\n\n New in version 2.2.\n\nThe appropriate metaclass is determined by the following precedence\nrules:\n\n* If ``dict[\'__metaclass__\']`` exists, it is used.\n\n* Otherwise, if there is at least one base class, its metaclass is\n used (this looks for a *__class__* attribute first and if not found,\n uses its type).\n\n* Otherwise, if a global variable named __metaclass__ exists, it is\n used.\n\n* Otherwise, the old-style, classic metaclass (types.ClassType) is\n 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\n\nCustomizing instance and subclass checks\n========================================\n\nNew in version 2.6.\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. (For backwards compatibility, the method\n``__getslice__()`` (see below) can also be defined to handle simple,\nbut not extended slices.) It is also recommended that mappings provide\nthe methods ``keys()``, ``values()``, ``items()``, ``has_key()``,\n``get()``, ``clear()``, ``setdefault()``, ``iterkeys()``,\n``itervalues()``, ``iteritems()``, ``pop()``, ``popitem()``,\n``copy()``, and ``update()`` behaving similar to those for Python\'s\nstandard dictionary objects. The ``UserDict`` module provides a\n``DictMixin`` class to help create those methods from a base set of\n``__getitem__()``, ``__setitem__()``, ``__delitem__()``, and\n``keys()``. Mutable sequences should provide methods ``append()``,\n``count()``, ``index()``, ``extend()``, ``insert()``, ``pop()``,\n``remove()``, ``reverse()`` and ``sort()``, like Python standard list\nobjects. Finally, sequence types should implement addition (meaning\nconcatenation) and multiplication (meaning repetition) by defining the\nmethods ``__add__()``, ``__radd__()``, ``__iadd__()``, ``__mul__()``,\n``__rmul__()`` and ``__imul__()`` described below; they should not\ndefine ``__coerce__()`` or other numerical operators. It is\nrecommended that both mappings and sequences implement the\n``__contains__()`` method to allow efficient use of the ``in``\noperator; for mappings, ``in`` should be equivalent of ``has_key()``;\nfor sequences, 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``iterkeys()``; 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 ``__nonzero__()`` method and whose\n ``__len__()`` method returns zero is considered to be false in a\n Boolean context.\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 ``iterkeys()``.\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\n New in version 2.6.\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\nAdditional methods for emulation of sequence types\n==================================================\n\nThe following optional methods can be defined to further emulate\nsequence objects. Immutable sequences methods should at most only\ndefine ``__getslice__()``; mutable sequences might define all three\nmethods.\n\nobject.__getslice__(self, i, j)\n\n Deprecated since version 2.0: Support slice objects as parameters\n to the ``__getitem__()`` method. (However, built-in types in\n CPython currently still implement ``__getslice__()``. Therefore,\n you have to override it in derived classes when implementing\n slicing.)\n\n Called to implement evaluation of ``self[i:j]``. The returned\n object should be of the same type as *self*. Note that missing *i*\n or *j* in the slice expression are replaced by zero or\n ``sys.maxint``, respectively. If negative indexes are used in the\n slice, the length of the sequence is added to that index. If the\n instance does not implement the ``__len__()`` method, an\n ``AttributeError`` is raised. No guarantee is made that indexes\n adjusted this way are not still negative. Indexes which are\n greater than the length of the sequence are not modified. If no\n ``__getslice__()`` is found, a slice object is created instead, and\n passed to ``__getitem__()`` instead.\n\nobject.__setslice__(self, i, j, sequence)\n\n Called to implement assignment to ``self[i:j]``. Same notes for *i*\n and *j* as for ``__getslice__()``.\n\n This method is deprecated. If no ``__setslice__()`` is found, or\n for extended slicing of the form ``self[i:j:k]``, a slice object is\n created, and passed to ``__setitem__()``, instead of\n ``__setslice__()`` being called.\n\nobject.__delslice__(self, i, j)\n\n Called to implement deletion of ``self[i:j]``. Same notes for *i*\n and *j* as for ``__getslice__()``. This method is deprecated. If no\n ``__delslice__()`` is found, or for extended slicing of the form\n ``self[i:j:k]``, a slice object is created, and passed to\n ``__delitem__()``, instead of ``__delslice__()`` being called.\n\nNotice that these methods are only invoked when a single slice with a\nsingle colon is used, and the slice method is available. For slice\noperations involving extended slice notation, or in absence of the\nslice methods, ``__getitem__()``, ``__setitem__()`` or\n``__delitem__()`` is called with a slice object as argument.\n\nThe following example demonstrate how to make your program or module\ncompatible with earlier versions of Python (assuming that methods\n``__getitem__()``, ``__setitem__()`` and ``__delitem__()`` support\nslice objects as arguments):\n\n class MyClass:\n ...\n def __getitem__(self, index):\n ...\n def __setitem__(self, index, value):\n ...\n def __delitem__(self, index):\n ...\n\n if sys.version_info < (2, 0):\n # They won\'t be defined if version is at least 2.0 final\n\n def __getslice__(self, i, j):\n return self[max(0, i):max(0, j):]\n def __setslice__(self, i, j, seq):\n self[max(0, i):max(0, j):] = seq\n def __delslice__(self, i, j):\n del self[max(0, i):max(0, j):]\n ...\n\nNote the calls to ``max()``; these are necessary because of the\nhandling of negative indices before the ``__*slice__()`` methods are\ncalled. When negative indexes are used, the ``__*item__()`` methods\nreceive them as provided, but the ``__*slice__()`` methods get a\n"cooked" form of the index values. For each negative index value, the\nlength of the sequence is added to the index before calling the method\n(which may still result in a negative index); this is the customary\nhandling of negative indexes by the built-in sequence types, and the\n``__*item__()`` methods are expected to do this as well. However,\nsince they should already be doing that, negative indexes cannot be\npassed in; they must be constrained to the bounds of the sequence\nbefore being passed to the ``__*item__()`` methods. Calling ``max(0,\ni)`` conveniently returns the proper value.\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.__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 (``+``, ``-``, ``*``, ``//``, ``%``, ``divmod()``,\n ``pow()``, ``**``, ``<<``, ``>>``, ``&``, ``^``, ``|``). For\n instance, to evaluate the expression ``x + y``, where *x* is an\n 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__()`` (described below). Note\n that ``__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.__div__(self, other)\nobject.__truediv__(self, other)\n\n The division operator (``/``) is implemented by these methods. The\n ``__truediv__()`` method is used when ``__future__.division`` is in\n effect, otherwise ``__div__()`` is used. If only one of these two\n methods is defined, the object will not support division in the\n alternate context; ``TypeError`` will be raised instead.\n\nobject.__radd__(self, other)\nobject.__rsub__(self, other)\nobject.__rmul__(self, other)\nobject.__rdiv__(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 (``+``, ``-``, ``*``, ``/``, ``%``, ``divmod()``,\n ``pow()``, ``**``, ``<<``, ``>>``, ``&``, ``^``, ``|``) with\n reflected (swapped) operands. These functions are only called if\n the left operand does not support the corresponding operation and\n the operands are of different types. [2] For instance, to evaluate\n the expression ``x - y``, where *y* is an instance of a class that\n has an ``__rsub__()`` method, ``y.__rsub__(x)`` is called if\n ``x.__sub__(y)`` returns *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.__idiv__(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.__long__(self)\nobject.__float__(self)\n\n Called to implement the built-in functions ``complex()``,\n ``int()``, ``long()``, and ``float()``. Should return a value of\n the appropriate type.\n\nobject.__oct__(self)\nobject.__hex__(self)\n\n Called to implement the built-in functions ``oct()`` and ``hex()``.\n Should return a string value.\n\nobject.__index__(self)\n\n Called to implement ``operator.index()``. Also called whenever\n Python needs an integer object (such as in slicing). Must return\n an integer (int or long).\n\n New in version 2.5.\n\nobject.__coerce__(self, other)\n\n Called to implement "mixed-mode" numeric arithmetic. Should either\n return a 2-tuple containing *self* and *other* converted to a\n common numeric type, or ``None`` if conversion is impossible. When\n the common type would be the type of ``other``, it is sufficient to\n return ``None``, since the interpreter will also ask the other\n object to attempt a coercion (but sometimes, if the implementation\n of the other type cannot be changed, it is useful to do the\n conversion to the other type here). A return value of\n ``NotImplemented`` is equivalent to returning ``None``.\n\n\nCoercion rules\n==============\n\nThis section used to document the rules for coercion. As the language\nhas evolved, the coercion rules have become hard to document\nprecisely; documenting what one version of one particular\nimplementation does is undesirable. Instead, here are some informal\nguidelines regarding coercion. In Python 3.0, coercion will not be\nsupported.\n\n* If the left operand of a % operator is a string or Unicode object,\n no coercion takes place and the string formatting operation is\n invoked instead.\n\n* It is no longer recommended to define a coercion operation. Mixed-\n mode operations on types that don\'t define coercion pass the\n original arguments to the operation.\n\n* New-style classes (those derived from ``object``) never invoke the\n ``__coerce__()`` method in response to a binary operator; the only\n time ``__coerce__()`` is invoked is when the built-in function\n ``coerce()`` is called.\n\n* For most intents and purposes, an operator that returns\n ``NotImplemented`` is treated the same as one that is not\n implemented at all.\n\n* Below, ``__op__()`` and ``__rop__()`` are used to signify the\n generic method names corresponding to an operator; ``__iop__()`` is\n used for the corresponding in-place operator. For example, for the\n operator \'``+``\', ``__add__()`` and ``__radd__()`` are used for the\n left and right variant of the binary operator, and ``__iadd__()``\n for the in-place variant.\n\n* For objects *x* and *y*, first ``x.__op__(y)`` is tried. If this is\n not implemented or returns ``NotImplemented``, ``y.__rop__(x)`` is\n tried. If this is also not implemented or returns\n ``NotImplemented``, a ``TypeError`` exception is raised. But see\n the following exception:\n\n* Exception to the previous item: if the left operand is an instance\n of a built-in type or a new-style class, and the right operand is an\n instance of a proper subclass of that type or class and overrides\n the base\'s ``__rop__()`` method, the right operand\'s ``__rop__()``\n method is tried *before* the left operand\'s ``__op__()`` method.\n\n This is done so that a subclass can completely override binary\n operators. Otherwise, the left operand\'s ``__op__()`` method would\n always accept the right operand: when an instance of a given class\n is expected, an instance of a subclass of that class is always\n acceptable.\n\n* When either operand type defines a coercion, this coercion is called\n before that type\'s ``__op__()`` or ``__rop__()`` method is called,\n but no sooner. If the coercion returns an object of a different\n type for the operand whose coercion is invoked, part of the process\n is redone using the new object.\n\n* When an in-place operator (like \'``+=``\') is used, if the left\n operand implements ``__iop__()``, it is invoked without any\n coercion. When the operation falls back to ``__op__()`` and/or\n ``__rop__()``, the normal coercion rules apply.\n\n* In ``x + y``, if *x* is a sequence that implements sequence\n concatenation, sequence concatenation is invoked.\n\n* In ``x * y``, if one operand is a sequence that implements sequence\n repetition, and the other is an integer (``int`` or ``long``),\n sequence repetition is invoked.\n\n* Rich comparisons (implemented by methods ``__eq__()`` and so on)\n never use coercion. Three-way comparison (implemented by\n ``__cmp__()``) does use coercion under the same conditions as other\n binary operations use it.\n\n* In the current implementation, the built-in numeric types ``int``,\n ``long``, ``float``, and ``complex`` do not use coercion. All these\n types implement a ``__coerce__()`` method, for use by the built-in\n ``coerce()`` function.\n\n Changed in version 2.7.\n\n\nWith Statement Context Managers\n===============================\n\nNew in version 2.5.\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 for old-style classes\n===========================================\n\nFor old-style classes, special methods are always looked up in exactly\nthe same way as any other method or attribute. This is the case\nregardless of whether the method is being looked up explicitly as in\n``x.__getitem__(i)`` or implicitly as in ``x[i]``.\n\nThis behaviour means that special methods may exhibit different\nbehaviour for different instances of a single old-style class if the\nappropriate special attributes are set differently:\n\n >>> class C:\n ... pass\n ...\n >>> c1 = C()\n >>> c2 = C()\n >>> c1.__len__ = lambda: 5\n >>> c2.__len__ = lambda: 9\n >>> len(c1)\n 5\n >>> len(c2)\n 9\n\n\nSpecial method lookup for new-style classes\n===========================================\n\nFor new-style classes, implicit invocations of special methods are\nonly guaranteed to work correctly if defined on an object\'s type, not\nin the object\'s instance dictionary. That behaviour is the reason why\nthe following code raises an exception (unlike the equivalent example\nwith old-style classes):\n\n >>> class C(object):\n ... pass\n ...\n >>> c = C()\n >>> c.__len__ = lambda: 5\n >>> len(c)\n Traceback (most recent call last):\n File "", line 1, in \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 "", line 1, in \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):\n ... __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\nBelow are listed the string methods which both 8-bit strings and\nUnicode objects support. Some of them are also available on\n``bytearray`` objects.\n\nIn addition, Python\'s strings support the sequence type methods\ndescribed in the *Sequence Types --- str, unicode, list, tuple,\nbytearray, buffer, xrange* section. To output formatted strings use\ntemplate strings or the ``%`` operator described in the *String\nFormatting Operations* section. Also, see the ``re`` module for string\nfunctions based 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\n For 8-bit strings, this method is locale-dependent.\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\n Changed in version 2.4: Support for the *fillchar* argument.\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.decode([encoding[, errors]])\n\n Decodes the string using the codec registered for *encoding*.\n *encoding* defaults to the default string encoding. *errors* may\n be given to set a different error handling scheme. The default is\n ``\'strict\'``, meaning that encoding errors raise ``UnicodeError``.\n Other possible values are ``\'ignore\'``, ``\'replace\'`` and any other\n name registered via ``codecs.register_error()``, see section *Codec\n Base Classes*.\n\n New in version 2.2.\n\n Changed in version 2.3: Support for other error handling schemes\n added.\n\n Changed in version 2.7: Support for keyword arguments added.\n\nstr.encode([encoding[, errors]])\n\n Return an encoded version of the string. Default encoding is the\n current default string encoding. *errors* may be given to set a\n different error handling scheme. The default for *errors* is\n ``\'strict\'``, meaning that encoding errors raise a\n ``UnicodeError``. Other possible values are ``\'ignore\'``,\n ``\'replace\'``, ``\'xmlcharrefreplace\'``, ``\'backslashreplace\'`` and\n any other name registered via ``codecs.register_error()``, see\n section *Codec Base Classes*. For a list of possible encodings, see\n section *Standard Encodings*.\n\n New in version 2.0.\n\n Changed in version 2.3: Support for ``\'xmlcharrefreplace\'`` and\n ``\'backslashreplace\'`` and other error handling schemes added.\n\n Changed in version 2.7: 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\n Changed in version 2.5: Accept tuples as *suffix*.\n\nstr.expandtabs([tabsize])\n\n Return a copy of the string where all tab characters are replaced\n by one 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\n This method of string formatting is the new standard in Python 3.0,\n and should be preferred to the ``%`` formatting described in\n *String Formatting Operations* in new code.\n\n New in version 2.6.\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.\n\n For 8-bit strings, this method is locale-dependent.\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.\n\n For 8-bit strings, this method is locale-dependent.\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.\n\n For 8-bit strings, this method is locale-dependent.\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\n For 8-bit strings, this method is locale-dependent.\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.\n\n For 8-bit strings, this method is locale-dependent.\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\n For 8-bit strings, this method is locale-dependent.\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\n For 8-bit strings, this method is locale-dependent.\n\nstr.join(iterable)\n\n Return a string which is the concatenation of the strings in the\n *iterable* *iterable*. The separator between elements is the\n 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\n Changed in version 2.4: Support for the *fillchar* argument.\n\nstr.lower()\n\n Return a copy of the string with all the cased characters [4]\n converted to lowercase.\n\n For 8-bit strings, this method is locale-dependent.\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\n Changed in version 2.2.2: Support for the *chars* argument.\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\n New in version 2.5.\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\n Changed in version 2.4: Support for the *fillchar* argument.\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\n New in version 2.5.\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\n New in version 2.4.\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\n Changed in version 2.2.2: Support for the *chars* argument.\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\n Changed in version 2.5: Accept tuples as *prefix*.\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\n Changed in version 2.2.2: Support for the *chars* argument.\n\nstr.swapcase()\n\n Return a copy of the string with uppercase characters converted to\n lowercase and vice versa.\n\n For 8-bit strings, this method is locale-dependent.\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\n For 8-bit strings, this method is locale-dependent.\n\nstr.translate(table[, deletechars])\n\n Return a copy of the string where all characters occurring in the\n optional argument *deletechars* are removed, and the remaining\n characters have been mapped through the given translation table,\n which must be a string of length 256.\n\n You can use the ``maketrans()`` helper function in the ``string``\n module to create a translation table. For string objects, set the\n *table* argument to ``None`` for translations that only delete\n characters:\n\n >>> \'read this short text\'.translate(None, \'aeiou\')\n \'rd ths shrt txt\'\n\n New in version 2.6: Support for a ``None`` *table* argument.\n\n For Unicode objects, the ``translate()`` method does not accept the\n optional *deletechars* argument. Instead, it returns a copy of the\n *s* where all characters have been mapped through the given\n translation table which must be a mapping of Unicode ordinals to\n Unicode ordinals, Unicode strings or ``None``. Unmapped characters\n are left untouched. Characters mapped to ``None`` are deleted.\n Note, a more flexible approach is to create a custom character\n mapping codec using the ``codecs`` module (see ``encodings.cp1251``\n 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 For 8-bit strings, this method is locale-dependent.\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 New in version 2.2.2.\n\nThe following methods are present only on unicode objects:\n\nunicode.isnumeric()\n\n Return ``True`` if there are only numeric characters in S,\n ``False`` otherwise. Numeric characters include digit characters,\n and all characters that have the Unicode numeric value property,\n e.g. U+2155, VULGAR FRACTION ONE FIFTH.\n\nunicode.isdecimal()\n\n Return ``True`` if there are only decimal characters in S,\n ``False`` otherwise. Decimal characters include digit characters,\n and all characters that can be used to form decimal-radix numbers,\n e.g. U+0660, ARABIC-INDIC DIGIT ZERO.\n', + 'strings': '\nString literals\n***************\n\nString literals are described by the following lexical definitions:\n\n stringliteral ::= [stringprefix](shortstring | longstring)\n stringprefix ::= "r" | "u" | "ur" | "R" | "U" | "UR" | "Ur" | "uR"\n | "b" | "B" | "br" | "Br" | "bR" | "BR"\n shortstring ::= "\'" shortstringitem* "\'" | \'"\' shortstringitem* \'"\'\n longstring ::= "\'\'\'" longstringitem* "\'\'\'"\n | \'"""\' longstringitem* \'"""\'\n shortstringitem ::= shortstringchar | escapeseq\n longstringitem ::= longstringchar | escapeseq\n shortstringchar ::= \n longstringchar ::= \n escapeseq ::= "\\" \n\nOne syntactic restriction not indicated by these productions is that\nwhitespace is not allowed between the ``stringprefix`` and the rest of\nthe string literal. The source character set is defined by the\nencoding declaration; it is ASCII if no encoding declaration is given\nin the source file; see section *Encoding declarations*.\n\nIn plain English: String literals can be enclosed in matching single\nquotes (``\'``) or double quotes (``"``). They can also be enclosed in\nmatching groups of three single or double quotes (these are generally\nreferred to as *triple-quoted strings*). The backslash (``\\``)\ncharacter is used to escape characters that otherwise have a special\nmeaning, such as newline, backslash itself, or the quote character.\nString literals may optionally be prefixed with a letter ``\'r\'`` or\n``\'R\'``; such strings are called *raw strings* and use different rules\nfor interpreting backslash escape sequences. A prefix of ``\'u\'`` or\n``\'U\'`` makes the string a Unicode string. Unicode strings use the\nUnicode character set as defined by the Unicode Consortium and ISO\n10646. Some additional escape sequences, described below, are\navailable in Unicode strings. A prefix of ``\'b\'`` or ``\'B\'`` is\nignored in Python 2; it indicates that the literal should become a\nbytes literal in Python 3 (e.g. when code is automatically converted\nwith 2to3). A ``\'u\'`` or ``\'b\'`` prefix may be followed by an ``\'r\'``\nprefix.\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`` | 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| ``\\N{name}`` | Character named *name* in the | |\n| | Unicode database (Unicode only) | |\n+-------------------+-----------------------------------+---------+\n| ``\\r`` | ASCII Carriage Return (CR) | |\n+-------------------+-----------------------------------+---------+\n| ``\\t`` | ASCII Horizontal Tab (TAB) | |\n+-------------------+-----------------------------------+---------+\n| ``\\uxxxx`` | Character with 16-bit hex value | (1) |\n| | *xxxx* (Unicode only) | |\n+-------------------+-----------------------------------+---------+\n| ``\\Uxxxxxxxx`` | Character with 32-bit hex value | (2) |\n| | *xxxxxxxx* (Unicode only) | |\n+-------------------+-----------------------------------+---------+\n| ``\\v`` | ASCII Vertical Tab (VT) | |\n+-------------------+-----------------------------------+---------+\n| ``\\ooo`` | Character with octal value *ooo* | (3,5) |\n+-------------------+-----------------------------------+---------+\n| ``\\xhh`` | Character with hex value *hh* | (4,5) |\n+-------------------+-----------------------------------+---------+\n\nNotes:\n\n1. Individual code units which form parts of a surrogate pair can be\n encoded using this escape sequence.\n\n2. 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). Individual code units which form parts of a surrogate\n pair can be encoded using this escape sequence.\n\n3. As in Standard C, up to three octal digits are accepted.\n\n4. Unlike in Standard C, exactly two hex digits are required.\n\n5. In a string literal, hexadecimal and octal escapes denote the byte\n with the given value; it is not necessary that the byte encodes a\n character in the source character set. In a Unicode literal, these\n escapes denote a Unicode character with the given value.\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 marked as "(Unicode only)"\nin the table above fall into the category of unrecognized escapes for\nnon-Unicode string literals.\n\nWhen an ``\'r\'`` or ``\'R\'`` prefix is present, a character following a\nbackslash is included in the string without change, and *all\nbackslashes are left in the string*. For example, the string literal\n``r"\\n"`` consists of two characters: a backslash and a lowercase\n``\'n\'``. String quotes can be escaped with a backslash, but the\nbackslash remains in the string; for example, ``r"\\""`` is a valid\nstring literal consisting of two characters: a backslash and a double\nquote; ``r"\\"`` is not a valid string literal (even a raw string\ncannot end in an odd number of backslashes). Specifically, *a raw\nstring cannot end in a single backslash* (since the backslash would\nescape 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\nWhen an ``\'r\'`` or ``\'R\'`` prefix is used in conjunction with a\n``\'u\'`` or ``\'U\'`` prefix, then the ``\\uXXXX`` and ``\\UXXXXXXXX``\nescape sequences are processed while *all other backslashes are left\nin the string*. For example, the string literal ``ur"\\u0062\\n"``\nconsists of three Unicode characters: \'LATIN SMALL LETTER B\', \'REVERSE\nSOLIDUS\', and \'LATIN SMALL LETTER N\'. Backslashes can be escaped with\na preceding backslash; however, both remain in the string. As a\nresult, ``\\uXXXX`` escape sequences are only recognized when there are\nan odd number of backslashes.\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 of a sequence or mapping type.\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 a\nplain integer. If this value is negative, the length of the sequence\nis added to it (so that, e.g., ``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).\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``, ``0L``, ``0.0``,\n ``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 ``__nonzero__()`` or ``__len__()`` method, when that method returns\n the 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\nChanged in version 2.5: In previous versions of Python,\n``try``...``except``...``finally`` did not work. ``try``...``except``\nhad to be nested in ``try``...``finally``.\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, a tuple containing an item compatible with the\nexception, or, in the (deprecated) case of string exceptions, is the\nraised string itself (note that the object identities must match, i.e.\nit must be the same string object, not just a string with the same\nvalue).\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 in that except clause, if present, and the except\nclause\'s suite is executed. All except clauses must have an\nexecutable block. When the end of this block is reached, execution\ncontinues normally after the entire try statement. (This means that\nif two nested handlers exist for the same exception, and the exception\noccurs in the try clause of the inner handler, the outer handler will\nnot handle the exception.)\n\nBefore an except clause\'s suite is executed, details about the\nexception are assigned to three variables in the ``sys`` module:\n``sys.exc_type`` receives the object identifying the exception;\n``sys.exc_value`` receives the exception\'s parameter;\n``sys.exc_traceback`` receives a traceback object (see section *The\nstandard type hierarchy*) identifying the point in the program where\nthe exception occurred. These details are also available through the\n``sys.exc_info()`` function, which returns a tuple ``(exc_type,\nexc_value, exc_traceback)``. Use of the corresponding variables is\ndeprecated in favor of this function, since their use is unsafe in a\nthreaded program. As of Python 1.5, the variables are restored to\ntheir previous values (before the call) when returning from a function\nthat 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 lost. The exception information is not available to the\nprogram during execution 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.).\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 built-in name\n ``Ellipsis``. It is used to indicate the presence of the ``...``\n syntax in a slice. 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 three types of integers:\n\n Plain integers\n These represent numbers in the range -2147483648 through\n 2147483647. (The range may be larger on machines with a\n larger natural word size, but not smaller.) When the result\n of an operation would fall outside this range, the result is\n normally returned as a long integer (in some cases, the\n exception ``OverflowError`` is raised instead). For the\n purpose of shift and mask operations, integers are assumed to\n have a binary, 2\'s complement notation using 32 or more bits,\n and hiding no bits from the user (i.e., all 4294967296\n different bit patterns correspond to different values).\n\n Long integers\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\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 plain\n integers, 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 and the least surprises when\n switching between the plain and long integer domains. Any\n operation, if it yields a result in the plain integer domain,\n will yield the same result in the long integer domain or when\n using mixed operands. The switch between domains is transparent\n to the programmer.\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``\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 are characters. There is no separate\n character type; a character is represented by a string of one\n item. Characters represent (at least) 8-bit bytes. The\n built-in functions ``chr()`` and ``ord()`` convert between\n characters and nonnegative integers representing the byte\n values. Bytes with the values 0-127 usually represent the\n corresponding ASCII values, but the interpretation of values\n is up to the program. The string data type is also used to\n represent arrays of bytes, e.g., to hold data read from a\n file.\n\n (On systems whose native character set is not ASCII, strings\n may use EBCDIC in their internal representation, provided the\n functions ``chr()`` and ``ord()`` implement a mapping between\n ASCII and EBCDIC, and string comparison preserves the ASCII\n order. Or perhaps someone can propose a better rule?)\n\n Unicode\n The items of a Unicode object are Unicode code units. A\n Unicode code unit is represented by a Unicode 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 ``unichr()`` 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 Unicode method ``encode()`` and the\n built-in function ``unicode()``.\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 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.\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``, ``gdbm``, and ``bsddb`` provide\n additional examples of mapping types.\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 | ``func_doc`` | The function\'s documentation | Writable |\n | | string, or ``None`` if | |\n | | unavailable | |\n +-------------------------+---------------------------------+-------------+\n | ``__doc__`` | Another way of spelling | Writable |\n | | ``func_doc`` | |\n +-------------------------+---------------------------------+-------------+\n | ``func_name`` | The function\'s name | Writable |\n +-------------------------+---------------------------------+-------------+\n | ``__name__`` | Another way of spelling | Writable |\n | | ``func_name`` | |\n +-------------------------+---------------------------------+-------------+\n | ``__module__`` | The name of the module the | Writable |\n | | function was defined in, or | |\n | | ``None`` if unavailable. | |\n +-------------------------+---------------------------------+-------------+\n | ``func_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 | ``func_code`` | The code object representing | Writable |\n | | the compiled function body. | |\n +-------------------------+---------------------------------+-------------+\n | ``func_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 | ``func_dict`` | The namespace supporting | Writable |\n | | arbitrary function attributes. | |\n +-------------------------+---------------------------------+-------------+\n | ``func_closure`` | ``None`` or a tuple of cells | Read-only |\n | | that contain bindings for the | |\n | | function\'s free variables. | |\n +-------------------------+---------------------------------+-------------+\n\n Most of the attributes labelled "Writable" check the type of the\n assigned value.\n\n Changed in version 2.4: ``func_name`` is now writable.\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 User-defined methods\n A user-defined method object combines a class, a class instance\n (or ``None``) and any callable object (normally a user-defined\n function).\n\n Special read-only attributes: ``im_self`` is the class instance\n object, ``im_func`` is the function object; ``im_class`` is the\n class of ``im_self`` for bound methods or the class that asked\n for the method for unbound methods; ``__doc__`` is the method\'s\n documentation (same as ``im_func.__doc__``); ``__name__`` is the\n method name (same as ``im_func.__name__``); ``__module__`` is\n the name of the module the method was defined in, or ``None`` if\n unavailable.\n\n Changed in version 2.2: ``im_self`` used to refer to the class\n that defined the method.\n\n Changed in version 2.6: For 3.0 forward-compatibility,\n ``im_func`` is also available as ``__func__``, and ``im_self``\n as ``__self__``.\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, an unbound\n user-defined method object, or a class method object. When the\n attribute is a user-defined method object, a new method object\n is only created if the class from which it is being retrieved is\n the same as, or a derived class of, the class stored in the\n original method object; otherwise, the original method object is\n used as it is.\n\n When a user-defined method object is created by retrieving a\n user-defined function object from a class, its ``im_self``\n attribute is ``None`` and the method object is said to be\n unbound. When one is created by retrieving a user-defined\n function object from a class via one of its instances, its\n ``im_self`` attribute is the instance, and the method object is\n said to be bound. In either case, the new method\'s ``im_class``\n attribute is the class from which the retrieval takes place, and\n its ``im_func`` 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 ``im_func``\n attribute of the new instance is not the original method object\n but its ``im_func`` attribute.\n\n When a user-defined method object is created by retrieving a\n class method object from a class or instance, its ``im_self``\n attribute is the class itself (the same as the ``im_class``\n attribute), and its ``im_func`` attribute is the function object\n underlying the class method.\n\n When an unbound user-defined method object is called, the\n underlying function (``im_func``) is called, with the\n restriction that the first argument must be an instance of the\n proper class (``im_class``) or of a derived class thereof.\n\n When a bound user-defined method object is called, the\n underlying function (``im_func``) is called, inserting the class\n instance (``im_self``) in front of the argument list. For\n instance, when ``C`` is a class which contains a definition for\n a function ``f()``, and ``x`` is an instance of ``C``, calling\n ``x.f(1)`` is equivalent to calling ``C.f(x, 1)``.\n\n When a user-defined method object is derived from a class method\n object, the "class instance" stored in ``im_self`` will actually\n be the class itself, so that calling either ``x.f(1)`` or\n ``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 (unbound or\n bound) method object happens each time the attribute is\n retrieved from the class or instance. In some cases, a fruitful\n optimization is to assign the attribute to a local variable and\n call that local variable. Also notice that this transformation\n only happens for user-defined functions; other callable objects\n (and all non-callable objects) are retrieved without\n transformation. It is also important to note that user-defined\n functions which are attributes of a class instance are not\n converted to bound methods; this *only* happens when the\n function is an attribute 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 Class Types\n Class types, or "new-style classes," are callable. These\n objects normally act as factories for new instances of\n themselves, but variations are possible for class types that\n override ``__new__()``. The arguments of the call are passed to\n ``__new__()`` and, in the typical case, to ``__init__()`` to\n initialize the new instance.\n\n Classic Classes\n Class objects are described below. When a class object is\n called, a new class instance (also described below) is created\n and returned. This implies a call to the class\'s ``__init__()``\n method if it has one. Any arguments are passed on to the\n ``__init__()`` method. If there is no ``__init__()`` method,\n the class must be called without arguments.\n\n Class instances\n Class instances are described below. Class instances are\n callable only when the class has a ``__call__()`` method;\n ``x(arguments)`` is a shorthand for ``x.__call__(arguments)``.\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 func_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\nClasses\n Both class types (new-style classes) and class objects (old-\n style/classic classes) are typically created by class definitions\n (see section *Class definitions*). A class has a namespace\n implemented by a dictionary object. Class attribute references are\n translated to lookups in this dictionary, e.g., ``C.x`` is\n translated to ``C.__dict__["x"]`` (although for new-style classes\n in particular there are a number of hooks which allow for other\n means of locating attributes). When the attribute name is not found\n there, the attribute search continues in the base classes. For\n old-style classes, the search is depth-first, left-to-right in the\n order of occurrence in the base class list. New-style classes use\n the more complex C3 method resolution order which behaves correctly\n even in the presence of \'diamond\' inheritance structures where\n there are multiple inheritance paths leading back to a common\n ancestor. Additional details on the C3 MRO used by new-style\n classes can be found in the documentation accompanying the 2.3\n release at http://www.python.org/download/releases/2.3/mro/.\n\n When a class attribute reference (for class ``C``, say) would yield\n a user-defined function object or an unbound user-defined method\n object whose associated class is either ``C`` or one of its base\n classes, it is transformed into an unbound user-defined method\n object whose ``im_class`` attribute is ``C``. When it would yield a\n class method object, it is transformed into a bound user-defined\n method object whose ``im_class`` and ``im_self`` attributes are\n both ``C``. When it would yield a static method object, it is\n transformed into the object wrapped by the static method object.\n See section *Implementing Descriptors* for another way in which\n attributes retrieved from a class may differ from those actually\n contained in its ``__dict__`` (note that only new-style classes\n support descriptors).\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 or an unbound user-defined method object whose\n associated class is the class (call it ``C``) of the instance for\n which the attribute reference was initiated or one of its bases, it\n is transformed into a bound user-defined method object whose\n ``im_class`` attribute is ``C`` and whose ``im_self`` attribute is\n the instance. Static method and class method objects are also\n transformed, as if they had been retrieved from class ``C``; see\n above under "Classes". See section *Implementing Descriptors* for\n another way in which attributes of a class retrieved via its\n instances may differ from the objects actually stored in the\n class\'s ``__dict__``. If no class attribute is found, and the\n object\'s class has a ``__getattr__()`` method, that is called to\n satisfy the 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\nFiles\n A file object represents an open file. File objects are created by\n the ``open()`` built-in function, and also by ``os.popen()``,\n ``os.fdopen()``, and the ``makefile()`` method of socket objects\n (and perhaps by other functions or methods provided by extension\n modules). The objects ``sys.stdin``, ``sys.stdout`` and\n ``sys.stderr`` are initialized to file objects corresponding to the\n interpreter\'s standard input, output and error streams. See *File\n Objects* for complete documentation of file objects.\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_restricted`` is a flag indicating whether the function is\n executing in restricted execution mode; ``f_lasti`` gives the\n precise instruction (this is an index into the bytecode string\n 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_exc_type``, ``f_exc_value``,\n ``f_exc_traceback`` represent the last exception raised in the\n parent frame provided another exception was ever raised in the\n current frame (in all other cases they are None); ``f_lineno``\n is the current line number of the frame --- writing to this from\n within a trace function jumps to the given line (only for the\n bottom-most frame). A debugger can implement a Jump command\n (aka Set Next Statement) 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 ``sys.exc_traceback``,\n and also as the third item of the tuple returned by\n ``sys.exc_info()``. The latter is the preferred interface,\n since it works correctly when the program is using multiple\n threads. When the program contains no suitable handler, the\n stack trace is written (nicely formatted) to the standard error\n stream; if the interpreter is interactive, it is also made\n available to the user as ``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 when *extended slice\n syntax* is used. This is a slice using two colons, or multiple\n slices or ellipses separated by commas, e.g., ``a[i:j:step]``,\n ``a[i:j, k:l]``, or ``a[..., i:j]``. They are also created by\n the built-in ``slice()`` 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 extended slice that the slice\n object would describe if applied to a sequence of *length*\n items. It returns a tuple of three integers; respectively\n these are the *start* and *stop* indices and the *step* or\n stride length of the slice. Missing or out-of-bounds indices\n are handled in a manner consistent with regular slices.\n\n New in version 2.3.\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 is\n 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 New in version 2.2.\n\n Changed in version 2.3: Support for building a dictionary from\n keyword arguments added.\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 New in version 2.5: If a subclass of dict defines a method\n ``__missing__()``, if the key *key* is not present, the\n ``d[key]`` operation calls that method with the key *key* as\n argument. The ``d[key]`` operation then returns or raises\n whatever is returned or raised by the ``__missing__(key)`` call\n if the key is not present. No other operations or methods invoke\n ``__missing__()``. If ``__missing__()`` is not defined,\n ``KeyError`` is raised. ``__missing__()`` must be a method; it\n cannot be an instance variable. For an example, see\n ``collections.defaultdict``.\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 New in version 2.2.\n\n key not in d\n\n Equivalent to ``not key in d``.\n\n New in version 2.2.\n\n iter(d)\n\n Return an iterator over the keys of the dictionary. This is a\n shortcut for ``iterkeys()``.\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 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 New in version 2.3.\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 has_key(key)\n\n Test for the presence of *key* in the dictionary. ``has_key()``\n is deprecated in favor of ``key in d``.\n\n items()\n\n Return a copy of the dictionary\'s list of ``(key, value)``\n pairs.\n\n **CPython implementation detail:** Keys and values are listed in\n an arbitrary order which is non-random, varies across Python\n implementations, and depends on the dictionary\'s history of\n insertions and deletions.\n\n If ``items()``, ``keys()``, ``values()``, ``iteritems()``,\n ``iterkeys()``, and ``itervalues()`` are called with no\n intervening modifications to the dictionary, the lists will\n directly correspond. This allows the creation of ``(value,\n key)`` pairs using ``zip()``: ``pairs = zip(d.values(),\n d.keys())``. The same relationship holds for the ``iterkeys()``\n and ``itervalues()`` methods: ``pairs = zip(d.itervalues(),\n d.iterkeys())`` provides the same value for ``pairs``. Another\n way to create the same list is ``pairs = [(v, k) for (k, v) in\n d.iteritems()]``.\n\n iteritems()\n\n Return an iterator over the dictionary\'s ``(key, value)`` pairs.\n See the note for ``dict.items()``.\n\n Using ``iteritems()`` while adding or deleting entries in the\n dictionary may raise a ``RuntimeError`` or fail to iterate over\n all entries.\n\n New in version 2.2.\n\n iterkeys()\n\n Return an iterator over the dictionary\'s keys. See the note for\n ``dict.items()``.\n\n Using ``iterkeys()`` while adding or deleting entries in the\n dictionary may raise a ``RuntimeError`` or fail to iterate over\n all entries.\n\n New in version 2.2.\n\n itervalues()\n\n Return an iterator over the dictionary\'s values. See the note\n for ``dict.items()``.\n\n Using ``itervalues()`` while adding or deleting entries in the\n dictionary may raise a ``RuntimeError`` or fail to iterate over\n all entries.\n\n New in version 2.2.\n\n keys()\n\n Return a copy of the dictionary\'s list of keys. See the note\n for ``dict.items()``.\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 New in version 2.3.\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 Changed in version 2.4: Allowed the argument to be an iterable\n of key/value pairs and allowed keyword arguments.\n\n values()\n\n Return a copy of the dictionary\'s list of values. See the note\n for ``dict.items()``.\n\n viewitems()\n\n Return a new view of the dictionary\'s items (``(key, value)``\n pairs). See below for documentation of view objects.\n\n New in version 2.7.\n\n viewkeys()\n\n Return a new view of the dictionary\'s keys. See below for\n documentation of view objects.\n\n New in version 2.7.\n\n viewvalues()\n\n Return a new view of the dictionary\'s values. See below for\n documentation of view objects.\n\n New in version 2.7.\n\n\nDictionary view objects\n=======================\n\nThe objects returned by ``dict.viewkeys()``, ``dict.viewvalues()`` and\n``dict.viewitems()`` are *view objects*. They provide a dynamic view\non the 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 and\nhashable, then the items view is also set-like. (Values views are not\ntreated as set-like since the entries are generally not unique.) Then\nthese set operations are available ("other" refers either to another\nview or a set):\n\ndictview & other\n\n Return the intersection of the dictview and the other object as a\n new set.\n\ndictview | other\n\n Return the union of the dictview and the other object as a new set.\n\ndictview - other\n\n Return the difference between the dictview and the other object\n (all elements in *dictview* that aren\'t in *other*) as a new set.\n\ndictview ^ other\n\n Return the symmetric difference (all elements either in *dictview*\n or *other*, but not in both) of the dictview and the other object\n as a new set.\n\nAn example of dictionary view usage:\n\n >>> dishes = {\'eggs\': 2, \'sausage\': 1, \'bacon\': 1, \'spam\': 500}\n >>> keys = dishes.viewkeys()\n >>> values = dishes.viewvalues()\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', + '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\nThe implementation adds two special read-only attributes to class\ninstance methods: ``m.im_self`` is the object on which the method\noperates, and ``m.im_func`` is the function implementing the method.\nCalling ``m(arg-1, arg-2, ..., arg-n)`` is completely equivalent to\ncalling ``m.im_func(m.im_self, arg-1, arg-2, ..., arg-n)``.\n\nClass instance methods are either *bound* or *unbound*, referring to\nwhether the method was accessed through an instance or a class,\nrespectively. When a method is unbound, its ``im_self`` attribute\nwill be ``None`` and if called, an explicit ``self`` object must be\npassed as the first argument. In this case, ``self`` must be an\ninstance of the unbound method's class (or a subclass of that class),\notherwise a ``TypeError`` is raised.\n\nLike function objects, methods objects support getting arbitrary\nattributes. However, since method attributes are actually stored on\nthe underlying function object (``meth.im_func``), setting method\nattributes on either bound or unbound methods is disallowed.\nAttempting to set a method attribute results in a ``TypeError`` being\nraised. In order to set a method attribute, you need to explicitly\nset it on the underlying function object:\n\n class C:\n def method(self):\n pass\n\n c = C()\n c.method.im_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: ````. If loaded from a file, they are written as\n````.\n", + 'typesseq': '\nSequence Types --- ``str``, ``unicode``, ``list``, ``tuple``, ``bytearray``, ``buffer``, ``xrange``\n***************************************************************************************************\n\nThere are seven sequence types: strings, Unicode strings, lists,\ntuples, bytearrays, buffers, and xrange objects.\n\nFor other containers see the built in ``dict`` and ``set`` classes,\nand the ``collections`` module.\n\nString literals are written in single or double quotes: ``\'xyzzy\'``,\n``"frobozz"``. See *String literals* for more about string literals.\nUnicode strings are much like strings, but are specified in the syntax\nusing a preceding ``\'u\'`` character: ``u\'abc\'``, ``u"def"``. In\naddition to the functionality described here, there are also string-\nspecific methods described in the *String Methods* section. Lists are\nconstructed with square brackets, separating items with commas: ``[a,\nb, c]``. Tuples are constructed by the comma operator (not within\nsquare brackets), with or without enclosing parentheses, but an empty\ntuple must have the enclosing parentheses, such as ``a, b, c`` or\n``()``. A single item tuple must have a trailing comma, such as\n``(d,)``.\n\nBytearray objects are created with the built-in function\n``bytearray()``.\n\nBuffer objects are not directly supported by Python syntax, but can be\ncreated by calling the built-in function ``buffer()``. They don\'t\nsupport concatenation or repetition.\n\nObjects of type xrange are similar to buffers in that there is no\nspecific syntax to create them, but they are created using the\n``xrange()`` function. They don\'t support slicing, concatenation or\nrepetition, and using ``in``, ``not in``, ``min()`` or ``max()`` on\nthem 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* and *j* 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 compare\nequal and the two sequences must be of the same type and have the same\nlength. (For full details see *Comparisons* in the language\nreference.)\n\nNotes:\n\n1. When *s* is a string or Unicode string object the ``in`` and ``not\n in`` operations act like a substring test. In Python versions\n before 2.3, *x* had to be a string of length 1. In Python 2.3 and\n beyond, *x* may be a string of any length.\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. **CPython implementation detail:** If *s* and *t* are both strings,\n some Python implementations such as CPython can usually perform an\n in-place optimization for assignments of the form ``s = s + t`` or\n ``s += t``. When applicable, this optimization makes quadratic\n run-time much less likely. This optimization is both version and\n implementation dependent. For performance sensitive code, it is\n preferable to use the ``str.join()`` method which assures\n consistent linear concatenation performance across versions and\n implementations.\n\n Changed in version 2.4: Formerly, string concatenation never\n occurred in-place.\n\n\nString Methods\n==============\n\nBelow are listed the string methods which both 8-bit strings and\nUnicode objects support. Some of them are also available on\n``bytearray`` objects.\n\nIn addition, Python\'s strings support the sequence type methods\ndescribed in the *Sequence Types --- str, unicode, list, tuple,\nbytearray, buffer, xrange* section. To output formatted strings use\ntemplate strings or the ``%`` operator described in the *String\nFormatting Operations* section. Also, see the ``re`` module for string\nfunctions based 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\n For 8-bit strings, this method is locale-dependent.\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\n Changed in version 2.4: Support for the *fillchar* argument.\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.decode([encoding[, errors]])\n\n Decodes the string using the codec registered for *encoding*.\n *encoding* defaults to the default string encoding. *errors* may\n be given to set a different error handling scheme. The default is\n ``\'strict\'``, meaning that encoding errors raise ``UnicodeError``.\n Other possible values are ``\'ignore\'``, ``\'replace\'`` and any other\n name registered via ``codecs.register_error()``, see section *Codec\n Base Classes*.\n\n New in version 2.2.\n\n Changed in version 2.3: Support for other error handling schemes\n added.\n\n Changed in version 2.7: Support for keyword arguments added.\n\nstr.encode([encoding[, errors]])\n\n Return an encoded version of the string. Default encoding is the\n current default string encoding. *errors* may be given to set a\n different error handling scheme. The default for *errors* is\n ``\'strict\'``, meaning that encoding errors raise a\n ``UnicodeError``. Other possible values are ``\'ignore\'``,\n ``\'replace\'``, ``\'xmlcharrefreplace\'``, ``\'backslashreplace\'`` and\n any other name registered via ``codecs.register_error()``, see\n section *Codec Base Classes*. For a list of possible encodings, see\n section *Standard Encodings*.\n\n New in version 2.0.\n\n Changed in version 2.3: Support for ``\'xmlcharrefreplace\'`` and\n ``\'backslashreplace\'`` and other error handling schemes added.\n\n Changed in version 2.7: 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\n Changed in version 2.5: Accept tuples as *suffix*.\n\nstr.expandtabs([tabsize])\n\n Return a copy of the string where all tab characters are replaced\n by one 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\n This method of string formatting is the new standard in Python 3.0,\n and should be preferred to the ``%`` formatting described in\n *String Formatting Operations* in new code.\n\n New in version 2.6.\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.\n\n For 8-bit strings, this method is locale-dependent.\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.\n\n For 8-bit strings, this method is locale-dependent.\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.\n\n For 8-bit strings, this method is locale-dependent.\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\n For 8-bit strings, this method is locale-dependent.\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.\n\n For 8-bit strings, this method is locale-dependent.\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\n For 8-bit strings, this method is locale-dependent.\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\n For 8-bit strings, this method is locale-dependent.\n\nstr.join(iterable)\n\n Return a string which is the concatenation of the strings in the\n *iterable* *iterable*. The separator between elements is the\n 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\n Changed in version 2.4: Support for the *fillchar* argument.\n\nstr.lower()\n\n Return a copy of the string with all the cased characters [4]\n converted to lowercase.\n\n For 8-bit strings, this method is locale-dependent.\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\n Changed in version 2.2.2: Support for the *chars* argument.\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\n New in version 2.5.\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\n Changed in version 2.4: Support for the *fillchar* argument.\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\n New in version 2.5.\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\n New in version 2.4.\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\n Changed in version 2.2.2: Support for the *chars* argument.\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\n Changed in version 2.5: Accept tuples as *prefix*.\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\n Changed in version 2.2.2: Support for the *chars* argument.\n\nstr.swapcase()\n\n Return a copy of the string with uppercase characters converted to\n lowercase and vice versa.\n\n For 8-bit strings, this method is locale-dependent.\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\n For 8-bit strings, this method is locale-dependent.\n\nstr.translate(table[, deletechars])\n\n Return a copy of the string where all characters occurring in the\n optional argument *deletechars* are removed, and the remaining\n characters have been mapped through the given translation table,\n which must be a string of length 256.\n\n You can use the ``maketrans()`` helper function in the ``string``\n module to create a translation table. For string objects, set the\n *table* argument to ``None`` for translations that only delete\n characters:\n\n >>> \'read this short text\'.translate(None, \'aeiou\')\n \'rd ths shrt txt\'\n\n New in version 2.6: Support for a ``None`` *table* argument.\n\n For Unicode objects, the ``translate()`` method does not accept the\n optional *deletechars* argument. Instead, it returns a copy of the\n *s* where all characters have been mapped through the given\n translation table which must be a mapping of Unicode ordinals to\n Unicode ordinals, Unicode strings or ``None``. Unmapped characters\n are left untouched. Characters mapped to ``None`` are deleted.\n Note, a more flexible approach is to create a custom character\n mapping codec using the ``codecs`` module (see ``encodings.cp1251``\n 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 For 8-bit strings, this method is locale-dependent.\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 New in version 2.2.2.\n\nThe following methods are present only on unicode objects:\n\nunicode.isnumeric()\n\n Return ``True`` if there are only numeric characters in S,\n ``False`` otherwise. Numeric characters include digit characters,\n and all characters that have the Unicode numeric value property,\n e.g. U+2155, VULGAR FRACTION ONE FIFTH.\n\nunicode.isdecimal()\n\n Return ``True`` if there are only decimal characters in S,\n ``False`` otherwise. Decimal characters include digit characters,\n and all characters that can be used to form decimal-radix numbers,\n e.g. U+0660, ARABIC-INDIC DIGIT ZERO.\n\n\nString Formatting Operations\n============================\n\nString and Unicode objects have one unique built-in operation: the\n``%`` operator (modulo). This is also known as the string\n*formatting* or *interpolation* operator. Given ``format % values``\n(where *format* is a string or Unicode object), ``%`` conversion\nspecifications in *format* are replaced with zero or more elements of\n*values*. The effect is similar to the using ``sprintf()`` in the C\nlanguage. If *format* is a Unicode object, or if any of the objects\nbeing converted using the ``%s`` conversion are Unicode objects, the\nresult will also be a Unicode object.\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 width\n is read from the next element of the tuple in *values*, and the\n 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()``). | (6) |\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. The ``%r`` conversion was added in Python 2.0.\n\n The precision determines the maximal number of characters used.\n\n6. If the object or format provided is a ``unicode`` string, the\n resulting string will also be ``unicode``.\n\n The precision determines the maximal number of characters used.\n\n7. 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 2.7: ``%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\nXRange Type\n===========\n\nThe ``xrange`` type is an immutable sequence which is commonly used\nfor looping. The advantage of the ``xrange`` type is that an\n``xrange`` object will always take the same amount of memory, no\nmatter the size of the range it represents. There are no consistent\nperformance advantages.\n\nXRange objects have very little behavior: they only support indexing,\niteration, and the ``len()`` function.\n\n\nMutable Sequence Types\n======================\n\nList and ``bytearray`` objects support additional operations that\nallow in-place modification of the object. Other mutable sequence\ntypes (when added to the language) should also support these\noperations. Strings and tuples are immutable sequence types: such\nobjects cannot be modified once created. The following operations are\ndefined on mutable sequence types (where *x* is an arbitrary object):\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)] = | (2) |\n| | [x]`` | |\n+--------------------------------+----------------------------------+-----------------------+\n| ``s.extend(x)`` | same as ``s[len(s):len(s)] = x`` | (3) |\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 | (4) |\n| | ``s[k] == x`` and ``i <= k < j`` | |\n+--------------------------------+----------------------------------+-----------------------+\n| ``s.insert(i, x)`` | same as ``s[i:i] = [x]`` | (5) |\n+--------------------------------+----------------------------------+-----------------------+\n| ``s.pop([i])`` | same as ``x = s[i]; del s[i]; | (6) |\n| | return x`` | |\n+--------------------------------+----------------------------------+-----------------------+\n| ``s.remove(x)`` | same as ``del s[s.index(x)]`` | (4) |\n+--------------------------------+----------------------------------+-----------------------+\n| ``s.reverse()`` | reverses the items of *s* in | (7) |\n| | place | |\n+--------------------------------+----------------------------------+-----------------------+\n| ``s.sort([cmp[, key[, | sort the items of *s* in place | (7)(8)(9)(10) |\n| reverse]]])`` | | |\n+--------------------------------+----------------------------------+-----------------------+\n\nNotes:\n\n1. *t* must have the same length as the slice it is replacing.\n\n2. The C implementation of Python has historically accepted multiple\n parameters and implicitly joined them into a tuple; this no longer\n works in Python 2.0. Use of this misfeature has been deprecated\n since Python 1.4.\n\n3. *x* can be any iterable object.\n\n4. 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 list length is added, as for slice indices. If it is\n still negative, it is truncated to zero, as for slice indices.\n\n Changed in version 2.3: Previously, ``index()`` didn\'t have\n arguments for specifying start and stop positions.\n\n5. When a negative index is passed as the first parameter to the\n ``insert()`` method, the list length is added, as for slice\n indices. If it is still negative, it is truncated to zero, as for\n slice indices.\n\n Changed in version 2.3: Previously, all negative indices were\n truncated to zero.\n\n6. The ``pop()`` method is only supported by the list and array types.\n The optional argument *i* defaults to ``-1``, so that by default\n the last item is removed and returned.\n\n7. The ``sort()`` and ``reverse()`` methods modify the list in place\n for economy of space when sorting or reversing a large list. To\n remind you that they operate by side effect, they don\'t return the\n sorted or reversed list.\n\n8. The ``sort()`` method takes optional arguments for controlling the\n comparisons.\n\n *cmp* specifies a custom comparison function of two arguments (list\n items) which should return a negative, zero or positive number\n depending on whether the first argument is considered smaller than,\n equal to, or larger than the second argument: ``cmp=lambda x,y:\n cmp(x.lower(), y.lower())``. The default value is ``None``.\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``.\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 In general, the *key* and *reverse* conversion processes are much\n faster than specifying an equivalent *cmp* function. This is\n because *cmp* is called multiple times for each list element while\n *key* and *reverse* touch each element only once. Use\n ``functools.cmp_to_key()`` to convert an old-style *cmp* function\n to a *key* function.\n\n Changed in version 2.3: Support for ``None`` as an equivalent to\n omitting *cmp* was added.\n\n Changed in version 2.4: Support for *key* and *reverse* was added.\n\n9. Starting with Python 2.3, the ``sort()`` method is guaranteed to be\n stable. A sort is stable if it guarantees not to change the\n relative order of elements that compare equal --- this is helpful\n for sorting in multiple passes (for example, sort by department,\n then by salary grade).\n\n10. **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 2.3 and newer makes the\n list appear empty for the duration, and raises ``ValueError`` if\n it can detect that the list has been mutated during a sort.\n', + 'typesseq-mutable': "\nMutable Sequence Types\n**********************\n\nList and ``bytearray`` objects support additional operations that\nallow in-place modification of the object. Other mutable sequence\ntypes (when added to the language) should also support these\noperations. Strings and tuples are immutable sequence types: such\nobjects cannot be modified once created. The following operations are\ndefined on mutable sequence types (where *x* is an arbitrary object):\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)] = | (2) |\n| | [x]`` | |\n+--------------------------------+----------------------------------+-----------------------+\n| ``s.extend(x)`` | same as ``s[len(s):len(s)] = x`` | (3) |\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 | (4) |\n| | ``s[k] == x`` and ``i <= k < j`` | |\n+--------------------------------+----------------------------------+-----------------------+\n| ``s.insert(i, x)`` | same as ``s[i:i] = [x]`` | (5) |\n+--------------------------------+----------------------------------+-----------------------+\n| ``s.pop([i])`` | same as ``x = s[i]; del s[i]; | (6) |\n| | return x`` | |\n+--------------------------------+----------------------------------+-----------------------+\n| ``s.remove(x)`` | same as ``del s[s.index(x)]`` | (4) |\n+--------------------------------+----------------------------------+-----------------------+\n| ``s.reverse()`` | reverses the items of *s* in | (7) |\n| | place | |\n+--------------------------------+----------------------------------+-----------------------+\n| ``s.sort([cmp[, key[, | sort the items of *s* in place | (7)(8)(9)(10) |\n| reverse]]])`` | | |\n+--------------------------------+----------------------------------+-----------------------+\n\nNotes:\n\n1. *t* must have the same length as the slice it is replacing.\n\n2. The C implementation of Python has historically accepted multiple\n parameters and implicitly joined them into a tuple; this no longer\n works in Python 2.0. Use of this misfeature has been deprecated\n since Python 1.4.\n\n3. *x* can be any iterable object.\n\n4. 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 list length is added, as for slice indices. If it is\n still negative, it is truncated to zero, as for slice indices.\n\n Changed in version 2.3: Previously, ``index()`` didn't have\n arguments for specifying start and stop positions.\n\n5. When a negative index is passed as the first parameter to the\n ``insert()`` method, the list length is added, as for slice\n indices. If it is still negative, it is truncated to zero, as for\n slice indices.\n\n Changed in version 2.3: Previously, all negative indices were\n truncated to zero.\n\n6. The ``pop()`` method is only supported by the list and array types.\n The optional argument *i* defaults to ``-1``, so that by default\n the last item is removed and returned.\n\n7. The ``sort()`` and ``reverse()`` methods modify the list in place\n for economy of space when sorting or reversing a large list. To\n remind you that they operate by side effect, they don't return the\n sorted or reversed list.\n\n8. The ``sort()`` method takes optional arguments for controlling the\n comparisons.\n\n *cmp* specifies a custom comparison function of two arguments (list\n items) which should return a negative, zero or positive number\n depending on whether the first argument is considered smaller than,\n equal to, or larger than the second argument: ``cmp=lambda x,y:\n cmp(x.lower(), y.lower())``. The default value is ``None``.\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``.\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 In general, the *key* and *reverse* conversion processes are much\n faster than specifying an equivalent *cmp* function. This is\n because *cmp* is called multiple times for each list element while\n *key* and *reverse* touch each element only once. Use\n ``functools.cmp_to_key()`` to convert an old-style *cmp* function\n to a *key* function.\n\n Changed in version 2.3: Support for ``None`` as an equivalent to\n omitting *cmp* was added.\n\n Changed in version 2.4: Support for *key* and *reverse* was added.\n\n9. Starting with Python 2.3, the ``sort()`` method is guaranteed to be\n stable. A sort is stable if it guarantees not to change the\n relative order of elements that compare equal --- this is helpful\n for sorting in multiple passes (for example, sort by department,\n then by salary grade).\n\n10. **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 2.3 and newer makes the\n list appear empty for the duration, and raises ``ValueError`` if\n it can detect that the list has been mutated during a sort.\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\nplain or long integer argument. The bitwise inversion of ``x`` is\ndefined as ``-(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\nNew in version 2.5.\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\nNote: In Python 2.5, the ``with`` statement is only allowed when the\n ``with_statement`` feature has been enabled. It is always enabled\n in Python 2.6.\n\nChanged in version 2.7: 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.\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 generator\'s ``next()``\nmethod 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\nAs of Python version 2.5, the ``yield`` statement is now allowed in\nthe ``try`` clause of a ``try`` ... ``finally`` construct. If the\ngenerator is not resumed before it is finalized (by reaching a zero\nreference count or by being garbage collected), the generator-\niterator\'s ``close()`` method will be called, allowing any pending\n``finally`` clauses to execute.\n\nNote: In Python 2.2, the ``yield`` statement was only allowed when the\n ``generators`` feature has been enabled. This ``__future__`` import\n statement was used to enable the feature:\n\n from __future__ import generators\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'} -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Feb 23 21:57:21 2012 From: python-checkins at python.org (vinay.sajip) Date: Thu, 23 Feb 2012 21:57:21 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=282=2E7=29=3A_Fix_added_for_r?= =?utf8?q?ecent_changes_in_non-threading_environments=2E?= Message-ID: http://hg.python.org/cpython/rev/2ab3a97d544c changeset: 75220:2ab3a97d544c branch: 2.7 parent: 75210:b5cb819404aa user: Vinay Sajip date: Thu Feb 23 20:45:03 2012 +0000 summary: Fix added for recent changes in non-threading environments. files: Lib/logging/__init__.py | 10 ++++++++-- Lib/logging/handlers.py | 25 ++++++++++++++++++++----- 2 files changed, 28 insertions(+), 7 deletions(-) diff --git a/Lib/logging/__init__.py b/Lib/logging/__init__.py --- a/Lib/logging/__init__.py +++ b/Lib/logging/__init__.py @@ -828,9 +828,12 @@ """ Flushes the stream. """ - with self.lock: + self.acquire() + try: if self.stream and hasattr(self.stream, "flush"): self.stream.flush() + finally: + self.release() def emit(self, record): """ @@ -901,13 +904,16 @@ """ Closes the stream. """ - with self.lock: + self.acquire() + try: if self.stream: self.flush() if hasattr(self.stream, "close"): self.stream.close() StreamHandler.close(self) self.stream = None + finally: + self.release() def _open(self): """ diff --git a/Lib/logging/handlers.py b/Lib/logging/handlers.py --- a/Lib/logging/handlers.py +++ b/Lib/logging/handlers.py @@ -562,10 +562,13 @@ """ Closes the socket. """ - with self.lock: + self.acquire() + try: if self.sock: self.sock.close() self.sock = None + finally: + self.release() logging.Handler.close(self) class DatagramHandler(SocketHandler): @@ -767,9 +770,12 @@ """ Closes the socket. """ - with self.lock: + self.acquire() + try: if self.unixsocket: self.socket.close() + finally: + self.release() logging.Handler.close(self) def mapPriority(self, levelName): @@ -1097,8 +1103,11 @@ This version just zaps the buffer to empty. """ - with self.lock: + self.acquire() + try: self.buffer = [] + finally: + self.release() def close(self): """ @@ -1146,17 +1155,23 @@ records to the target, if there is one. Override if you want different behaviour. """ - with self.lock: + self.acquire() + try: if self.target: for record in self.buffer: self.target.handle(record) self.buffer = [] + finally: + self.release() def close(self): """ Flush, set the target to None and lose the buffer. """ self.flush() - with self.lock: + self.acquire() + try: self.target = None BufferingHandler.close(self) + finally: + self.release() -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Feb 23 21:57:22 2012 From: python-checkins at python.org (vinay.sajip) Date: Thu, 23 Feb 2012 21:57:22 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=283=2E2=29=3A_Fix_added_for_r?= =?utf8?q?ecent_changes_in_non-threading_environments=2E?= Message-ID: http://hg.python.org/cpython/rev/344b4737d2fe changeset: 75221:344b4737d2fe branch: 3.2 parent: 75211:b2adcd90e656 user: Vinay Sajip date: Thu Feb 23 20:49:08 2012 +0000 summary: Fix added for recent changes in non-threading environments. files: Lib/logging/__init__.py | 10 ++++++++-- Lib/logging/handlers.py | 25 ++++++++++++++++++++----- 2 files changed, 28 insertions(+), 7 deletions(-) diff --git a/Lib/logging/__init__.py b/Lib/logging/__init__.py --- a/Lib/logging/__init__.py +++ b/Lib/logging/__init__.py @@ -917,9 +917,12 @@ """ Flushes the stream. """ - with self.lock: + self.acquire() + try: if self.stream and hasattr(self.stream, "flush"): self.stream.flush() + finally: + self.release() def emit(self, record): """ @@ -970,13 +973,16 @@ """ Closes the stream. """ - with self.lock: + self.acquire() + try: if self.stream: self.flush() if hasattr(self.stream, "close"): self.stream.close() StreamHandler.close(self) self.stream = None + finally: + self.release() def _open(self): """ diff --git a/Lib/logging/handlers.py b/Lib/logging/handlers.py --- a/Lib/logging/handlers.py +++ b/Lib/logging/handlers.py @@ -553,11 +553,14 @@ """ Closes the socket. """ - with self.lock: + self.acquire() + try: if self.sock: self.sock.close() self.sock = None logging.Handler.close(self) + finally: + self.release() class DatagramHandler(SocketHandler): """ @@ -752,10 +755,13 @@ """ Closes the socket. """ - with self.lock: + self.acquire() + try: if self.unixsocket: self.socket.close() logging.Handler.close(self) + finally: + self.release() def mapPriority(self, levelName): """ @@ -1096,8 +1102,11 @@ This version just zaps the buffer to empty. """ - with self.lock: + self.acquire() + try: self.buffer = [] + finally: + self.release() def close(self): """ @@ -1147,20 +1156,26 @@ The record buffer is also cleared by this operation. """ - with self.lock: + self.acquire() + try: if self.target: for record in self.buffer: self.target.handle(record) self.buffer = [] + finally: + self.release() def close(self): """ Flush, set the target to None and lose the buffer. """ self.flush() - with self.lock: + self.acquire() + try: self.target = None BufferingHandler.close(self) + finally: + self.release() class QueueHandler(logging.Handler): -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Feb 23 21:57:23 2012 From: python-checkins at python.org (vinay.sajip) Date: Thu, 23 Feb 2012 21:57:23 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_3=2E2_-=3E_default=29?= =?utf8?q?=3A_Merged_fix_added_for_recent_changes_in_non-threading_environ?= =?utf8?q?ments=2E?= Message-ID: http://hg.python.org/cpython/rev/ef060b833183 changeset: 75222:ef060b833183 parent: 75212:cb9a2dff6240 parent: 75221:344b4737d2fe user: Vinay Sajip date: Thu Feb 23 20:51:18 2012 +0000 summary: Merged fix added for recent changes in non-threading environments. files: Lib/logging/__init__.py | 10 ++++++++-- Lib/logging/handlers.py | 25 ++++++++++++++++++++----- 2 files changed, 28 insertions(+), 7 deletions(-) diff --git a/Lib/logging/__init__.py b/Lib/logging/__init__.py --- a/Lib/logging/__init__.py +++ b/Lib/logging/__init__.py @@ -914,9 +914,12 @@ """ Flushes the stream. """ - with self.lock: + self.acquire() + try: if self.stream and hasattr(self.stream, "flush"): self.stream.flush() + finally: + self.release() def emit(self, record): """ @@ -965,13 +968,16 @@ """ Closes the stream. """ - with self.lock: + self.acquire() + try: if self.stream: self.flush() if hasattr(self.stream, "close"): self.stream.close() StreamHandler.close(self) self.stream = None + finally: + self.release() def _open(self): """ diff --git a/Lib/logging/handlers.py b/Lib/logging/handlers.py --- a/Lib/logging/handlers.py +++ b/Lib/logging/handlers.py @@ -593,11 +593,14 @@ """ Closes the socket. """ - with self.lock: + self.acquire() + try: if self.sock: self.sock.close() self.sock = None logging.Handler.close(self) + finally: + self.release() class DatagramHandler(SocketHandler): """ @@ -792,9 +795,12 @@ """ Closes the socket. """ - with self.lock: + self.acquire() + try: self.socket.close() logging.Handler.close(self) + finally: + self.release() def mapPriority(self, levelName): """ @@ -1138,8 +1144,11 @@ This version just zaps the buffer to empty. """ - with self.lock: + self.acquire() + try: self.buffer = [] + finally: + self.release() def close(self): """ @@ -1189,20 +1198,26 @@ The record buffer is also cleared by this operation. """ - with self.lock: + self.acquire() + try: if self.target: for record in self.buffer: self.target.handle(record) self.buffer = [] + finally: + self.release() def close(self): """ Flush, set the target to None and lose the buffer. """ self.flush() - with self.lock: + self.acquire() + try: self.target = None BufferingHandler.close(self) + finally: + self.release() class QueueHandler(logging.Handler): -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Feb 23 21:57:24 2012 From: python-checkins at python.org (vinay.sajip) Date: Thu, 23 Feb 2012 21:57:24 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_default_-=3E_default?= =?utf8?q?=29=3A_Merged_upstream_changes=2E?= Message-ID: http://hg.python.org/cpython/rev/0fee31f0cc7f changeset: 75223:0fee31f0cc7f parent: 75222:ef060b833183 parent: 75216:54a3f30c58c0 user: Vinay Sajip date: Thu Feb 23 20:51:57 2012 +0000 summary: Merged upstream changes. files: Doc/library/subprocess.rst | 2 +- Doc/library/sys.rst | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/Doc/library/subprocess.rst b/Doc/library/subprocess.rst --- a/Doc/library/subprocess.rst +++ b/Doc/library/subprocess.rst @@ -240,7 +240,7 @@ When *stdout* or *stderr* are pipes and *universal_newlines* is :const:`True` then the output data is assumed to be encoded as UTF-8 and will automatically be decoded to text. All line endings will be converted - to ``'\n'`` as described for the universal newlines `'U'`` mode argument + to ``'\n'`` as described for the universal newlines ``'U'`` mode argument to :func:`open`. If *shell* is :const:`True`, the specified command will be executed through diff --git a/Doc/library/sys.rst b/Doc/library/sys.rst --- a/Doc/library/sys.rst +++ b/Doc/library/sys.rst @@ -195,7 +195,7 @@ be set at build time with the ``--exec-prefix`` argument to the :program:`configure` script. Specifically, all configuration files (e.g. the :file:`pyconfig.h` header file) are installed in the directory - :file:`{exec_prefix}/lib/python{X.Y}/config', and shared library modules are + :file:`{exec_prefix}/lib/python{X.Y}/config`, and shared library modules are installed in :file:`{exec_prefix}/lib/python{X.Y}/lib-dynload`, where *X.Y* is the version number of Python, for example ``3.2``. @@ -756,6 +756,7 @@ always use the ``startswith`` idiom presented above. .. seealso:: + :attr:`os.name` has a coarser granularity. :func:`os.uname` gives system-dependent version information. @@ -771,7 +772,7 @@ argument to the :program:`configure` script. The main collection of Python 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 + stored in :file:`{prefix}/include/python{X.Y}`, where *X.Y* is the version number of Python, for example ``3.2``. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Feb 23 21:57:24 2012 From: python-checkins at python.org (vinay.sajip) Date: Thu, 23 Feb 2012 21:57:24 +0100 Subject: [Python-checkins] =?utf8?b?Y3B5dGhvbiAobWVyZ2UgMy4yIC0+IDMuMik6?= =?utf8?q?_Merged_upstream_changes=2E?= Message-ID: http://hg.python.org/cpython/rev/092599f9c89a changeset: 75224:092599f9c89a branch: 3.2 parent: 75221:344b4737d2fe parent: 75215:c06bcfbbf123 user: Vinay Sajip date: Thu Feb 23 20:53:40 2012 +0000 summary: Merged upstream changes. files: Doc/library/subprocess.rst | 2 +- Doc/library/sys.rst | 6 +++- Lib/pydoc_data/topics.py | 28 +++++++++++++------------- 3 files changed, 19 insertions(+), 17 deletions(-) diff --git a/Doc/library/subprocess.rst b/Doc/library/subprocess.rst --- a/Doc/library/subprocess.rst +++ b/Doc/library/subprocess.rst @@ -207,7 +207,7 @@ When *stdout* or *stderr* are pipes and *universal_newlines* is :const:`True` then the output data is assumed to be encoded as UTF-8 and will automatically be decoded to text. All line endings will be converted - to ``'\n'`` as described for the universal newlines `'U'`` mode argument + to ``'\n'`` as described for the universal newlines ``'U'`` mode argument to :func:`open`. If *shell* is :const:`True`, the specified command will be executed through diff --git a/Doc/library/sys.rst b/Doc/library/sys.rst --- a/Doc/library/sys.rst +++ b/Doc/library/sys.rst @@ -195,7 +195,7 @@ be set at build time with the ``--exec-prefix`` argument to the :program:`configure` script. Specifically, all configuration files (e.g. the :file:`pyconfig.h` header file) are installed in the directory - :file:`{exec_prefix}/lib/python{X.Y}/config', and shared library modules are + :file:`{exec_prefix}/lib/python{X.Y}/config`, and shared library modules are installed in :file:`{exec_prefix}/lib/python{X.Y}/lib-dynload`, where *X.Y* is the version number of Python, for example ``3.2``. @@ -750,12 +750,14 @@ ====================== =========================== .. seealso:: + :attr:`os.name` has a coarser granularity. :func:`os.uname` gives system-dependent version information. The :mod:`platform` module provides detailed checks for the system's identity. + .. data:: prefix A string giving the site-specific directory prefix where the platform @@ -764,7 +766,7 @@ argument to the :program:`configure` script. The main collection of Python 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 + stored in :file:`{prefix}/include/python{X.Y}`, where *X.Y* is the version number of Python, for example ``3.2``. diff --git a/Lib/pydoc_data/topics.py b/Lib/pydoc_data/topics.py --- a/Lib/pydoc_data/topics.py +++ b/Lib/pydoc_data/topics.py @@ -1,8 +1,8 @@ -# Autogenerated by Sphinx on Sat Sep 3 10:35:42 2011 +# Autogenerated by Sphinx on Thu Feb 23 18:37:54 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\nWith the exception of bytes literals, these all correspond to\nimmutable data types, and hence the object's identity is less\nimportant than its value. Multiple evaluations of literals with the\nsame value (either the same occurrence in the program text or a\ndifferent occurrence) may obtain the same object or a different object\nwith the same value.\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-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', @@ -16,15 +16,15 @@ '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', 'callable-types': '\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', '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 "", 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 ::= "(" [argument_list [","] | comprehension] ")"\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', + '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 lost. The exception information is not available to the\nprogram during execution 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 ["(" [argument_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 that 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 ::= "(" [argument_list [","] | comprehension] ")"\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, 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', '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.__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: ``xy`` 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 .__hash__``. Otherwise the inheritance of\n ``__hash__()`` will be blocked, just as if ``__hash__`` had been\n explicitly set to ``None``.\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', + '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: ``xy`` 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 .__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 > (0)?()\n (Pdb) continue\n > (1)?()\n (Pdb) continue\n NameError: \'spam\'\n > (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 "", 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 that 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', + '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', '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,8 +33,8 @@ '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 ::= +\n conversion ::= "r" | "s" | "a"\n format_spec ::= \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\neither a number or a keyword. If it\'s a number, it refers to a\npositional argument, and if it\'s a keyword, it refers to a named\nkeyword argument. If the numerical arg_names in a format string are\n0, 1, 2, ... in sequence, they can all be omitted (not just some) and\nthe numbers 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 ::= \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 ["(" [argument_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 that 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 ::= +\n conversion ::= "r" | "s" | "a"\n format_spec ::= \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 ::= \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', '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 ::= \n id_continue ::= \n xid_start ::= \n xid_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', @@ -53,24 +53,24 @@ '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 ``TypeError`` exception is raised indicating that\nthis is an error (if running under IDLE, a ``queue.Empty`` exception\nis raised instead).\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 "", line 2, in \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 "", line 4, in \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 "", line 2, in \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 "", line 4, in \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', + '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 "", line 2, in \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 "", line 4, in \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 "", line 2, in \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 "", line 4, in \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', '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\nThe following attributes are only supported by *new-style class*es.\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 new-style class keeps a list of weak references to its\n immediate subclasses. This method returns a list of all those\n references still alive. Example:\n\n >>> int.__subclasses__()\n []\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] 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.__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: ``xy`` 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 .__hash__``. Otherwise the inheritance of\n ``__hash__()`` will be blocked, just as if ``__hash__`` had been\n explicitly set to ``None``.\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 "", line 1, in \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 "", line 1, in \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 one 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 that can be used\n to form decimal-radix numbers, e.g. U+0660, ARABIC-INDIC DIGIT\n 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 in the string are lowercase and\n there is at least one cased character, false otherwise. Cased\n characters are those with general category property being one of\n "Lu", "Ll", or "Lt" and lowercase characters are those with general\n category property "Ll".\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 in the string are uppercase and\n there is at least one cased character, false otherwise. Cased\n characters are those with general category property being one of\n "Lu", "Ll", or "Lt" and uppercase characters are those with general\n category property "Lu".\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 *seq*, including ``bytes`` objects. The\n 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\n ``len(s)``.\n\nstr.lower()\n\n Return a copy of the string 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\n ``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 converted to uppercase.\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 ``len(s)``.\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 []\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: ``xy`` 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 .__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 "", line 1, in \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 "", line 1, in \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 ::= \n longstringchar ::= \n stringescapeseq ::= "\\" \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 ::= \n longbyteschar ::= \n bytesescapeseq ::= "\\" \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', '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 lost. The exception information is not available to the\nprogram during execution 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', + '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', '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', '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: ````. If loaded from a file, they are written as\n````.\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. **CPython implementation detail:** If *s* and *t* are both strings,\n some Python implementations such as CPython can usually perform an\n in-place optimization for assignments of the form ``s = s + t`` or\n ``s += t``. When applicable, this optimization makes quadratic\n run-time much less likely. This optimization is both version and\n implementation dependent. For performance sensitive code, it is\n preferable to use the ``str.join()`` method which assures\n consistent linear concatenation performance across versions and\n implementations.\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 one 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 that can be used\n to form decimal-radix numbers, e.g. U+0660, ARABIC-INDIC DIGIT\n 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 in the string are lowercase and\n there is at least one cased character, false otherwise. Cased\n characters are those with general category property being one of\n "Lu", "Ll", or "Lt" and lowercase characters are those with general\n category property "Ll".\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 in the string are uppercase and\n there is at least one cased character, false otherwise. Cased\n characters are those with general category property being one of\n "Lu", "Ll", or "Lt" and uppercase characters are those with general\n category property "Lu".\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 *seq*, including ``bytes`` objects. The\n 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\n ``len(s)``.\n\nstr.lower()\n\n Return a copy of the string 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\n ``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 converted to uppercase.\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 ``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. [4] 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': '\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', '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', -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Feb 23 21:57:25 2012 From: python-checkins at python.org (vinay.sajip) Date: Thu, 23 Feb 2012 21:57:25 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_3=2E2_-=3E_default=29?= =?utf8?q?=3A_Merged_upstream_changes=2E?= Message-ID: http://hg.python.org/cpython/rev/d937a32fe173 changeset: 75225:d937a32fe173 parent: 75223:0fee31f0cc7f parent: 75224:092599f9c89a user: Vinay Sajip date: Thu Feb 23 20:55:35 2012 +0000 summary: Merged upstream changes. files: -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Thu Feb 23 21:57:26 2012 From: python-checkins at python.org (vinay.sajip) Date: Thu, 23 Feb 2012 21:57:26 +0100 Subject: [Python-checkins] =?utf8?b?Y3B5dGhvbiAobWVyZ2UgMi43IC0+IDIuNyk6?= =?utf8?q?_Merged_upstream_changes=2E?= Message-ID: http://hg.python.org/cpython/rev/dd4f5c87d6bb changeset: 75226:dd4f5c87d6bb branch: 2.7 parent: 75220:2ab3a97d544c parent: 75219:80ab0b13eb04 user: Vinay Sajip date: Thu Feb 23 20:55:58 2012 +0000 summary: Merged upstream changes. files: Lib/pydoc_data/topics.py | 160 ++++++++++++-------------- 1 files changed, 77 insertions(+), 83 deletions(-) diff --git a/Lib/pydoc_data/topics.py b/Lib/pydoc_data/topics.py --- a/Lib/pydoc_data/topics.py +++ b/Lib/pydoc_data/topics.py @@ -1,83 +1,77 @@ -# Autogenerated by Sphinx on Sat Jun 11 09:49:30 2011 -topics = {'assert': u'\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': u'\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\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 is recursively defined as\nfollows.\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\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`` statement in the\n current code block: the name is bound to the object in the current\n local namespace.\n\n * Otherwise: the name is bound to the object in the current global\n namespace.\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 a plain integer. If it is negative, the\n sequence\'s length is added to it. The resulting value must be a\n nonnegative integer less than the sequence\'s length, and the\n sequence is asked to assign the assigned object to its item with\n that index. If the index is out of range, ``IndexError`` is raised\n (assignment to a subscripted sequence cannot add new items to a\n 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* 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 (small) integers. If either\n bound is negative, the sequence\'s length is added to it. The\n resulting bounds are clipped to lie between zero and the sequence\'s\n length, inclusive. Finally, the sequence object is asked to replace\n the slice with the items of the assigned sequence. The length of\n the 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\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': u'\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': u"\nLiterals\n********\n\nPython supports string literals and various numeric literals:\n\n literal ::= stringliteral | integer | longinteger\n | floatnumber | imagnumber\n\nEvaluation of a literal yields an object of the given type (string,\ninteger, long integer, floating point number, complex number) with the\ngiven value. The value may be approximated in the case of floating\npoint and imaginary (complex) literals. See section *Literals* for\ndetails.\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': u'\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 in new-style classes.\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 not simply execute ``self.name = value`` --- this would\n cause a recursive call to itself. Instead, it should insert the\n value in the dictionary of instance attributes, e.g.,\n ``self.__dict__[name] = value``. For new-style classes, rather\n than accessing the instance dictionary, it should call the base\n 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\n\nMore attribute access for new-style classes\n===========================================\n\nThe following methods only apply to new-style classes.\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 for new-style\n classes*.\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. Note that descriptors are only invoked for new\nstyle objects or classes (ones that subclass ``object()`` or\n``type()``).\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 a new-style object instance, ``a.x`` is transformed\n into the call: ``type(a).__dict__[\'x\'].__get__(a, type(a))``.\n\nClass Binding\n If binding to a new-style class, ``A.x`` is transformed into the\n call: ``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 both old and new-style classes have a\ndictionary for attribute storage. This wastes space for objects\nhaving very few instance variables. The space consumption can become\nacute when creating large numbers of instances.\n\nThe default can be overridden by defining *__slots__* in a new-style\nclass definition. The *__slots__* declaration takes a sequence of\ninstance variables and reserves just enough space in each instance to\nhold a value for each variable. Space is saved because *__dict__* is\nnot created for each instance.\n\n__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 new-style class, *__slots__* reserves space for the declared\n variables and prevents the automatic creation of *__dict__* and\n *__weakref__* for each instance.\n\n New in version 2.2.\n\nNotes on using *__slots__*\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 Changed in version 2.3: Previously, adding ``\'__dict__\'`` to the\n *__slots__* declaration would not enable the assignment of new\n attributes not specifically listed in the sequence of instance\n variable names.\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 Changed in version 2.3: Previously, adding ``\'__weakref__\'`` to the\n *__slots__* declaration would not enable support for weak\n references.\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 ``long``, ``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 Changed in version 2.6: Previously, *__class__* assignment raised an\n error if either new or old class had *__slots__*.\n', - 'attribute-references': u'\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, e.g., a module, list, or an instance. This\nobject is then asked to produce the attribute whose name is the\nidentifier. If this attribute is not available, the exception\n``AttributeError`` is raised. Otherwise, the type and value of the\nobject produced is determined by the object. Multiple evaluations of\nthe same attribute reference may yield different objects.\n', - 'augassign': u'\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': u'\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 (plain or long) and the other must be a sequence.\nIn the former case, the numbers are converted to a common type and\nthen multiplied together. In the latter case, sequence repetition is\nperformed; a negative 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. Plain or long integer division yields an\ninteger of the same type; the result is that of mathematical division\nwith the \'floor\' function applied to the result. Division by zero\nraises 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 [2].\n\nThe integer division and modulo operators are connected by the\nfollowing identity: ``x == (x/y)*y + (x%y)``. Integer division and\nmodulo are also connected with the built-in function ``divmod()``:\n``divmod(x, y) == (x/y, x%y)``. These identities don\'t hold for\nfloating point numbers; there similar identities hold approximately\nwhere ``x/y`` is replaced by ``floor(x/y)`` or ``floor(x/y) - 1`` [3].\n\nIn addition to performing the modulo operation on numbers, the ``%``\noperator is also overloaded by string and unicode objects to perform\nstring formatting (also known as interpolation). The syntax for string\nformatting is described in the Python Library Reference, section\n*String Formatting Operations*.\n\nDeprecated since version 2.3: The floor division operator, the modulo\noperator, and the ``divmod()`` function are no longer defined for\ncomplex numbers. Instead, convert to a floating point number using\nthe ``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': u'\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 plain or long integers. The arguments are converted to a common\ntype.\n\nThe ``^`` operator yields the bitwise XOR (exclusive OR) of its\narguments, which must be plain or long integers. The arguments are\nconverted to a common type.\n\nThe ``|`` operator yields the bitwise (inclusive) OR of its arguments,\nwhich must be plain or long integers. The arguments are converted to\na common type.\n', - 'bltin-code-objects': u'\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 ``func_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`` statement or the built-in ``eval()``\nfunction.\n\nSee *The standard type hierarchy* for more information.\n', - 'bltin-ellipsis-object': u'\nThe Ellipsis Object\n*******************\n\nThis object is used by extended slice notation (see *Slicings*). It\nsupports no special operations. There is exactly one ellipsis object,\nnamed ``Ellipsis`` (a built-in name).\n\nIt is written as ``Ellipsis``.\n', - 'bltin-file-objects': u'\nFile Objects\n************\n\nFile objects are implemented using C\'s ``stdio`` package and can be\ncreated with the built-in ``open()`` function. File objects are also\nreturned by some other built-in functions and methods, such as\n``os.popen()`` and ``os.fdopen()`` and the ``makefile()`` method of\nsocket objects. Temporary files can be created using the ``tempfile``\nmodule, and high-level file operations such as copying, moving, and\ndeleting files and directories can be achieved with the ``shutil``\nmodule.\n\nWhen a file operation fails for an I/O-related reason, the exception\n``IOError`` is raised. This includes situations where the operation\nis not defined for some reason, like ``seek()`` on a tty device or\nwriting a file opened for reading.\n\nFiles have the following methods:\n\nfile.close()\n\n Close the file. A closed file cannot be read or written any more.\n Any operation which requires that the file be open will raise a\n ``ValueError`` after the file has been closed. Calling ``close()``\n more than once is allowed.\n\n As of Python 2.5, you can avoid having to call this method\n explicitly if you use the ``with`` statement. For example, the\n following code will automatically close *f* when the ``with`` block\n is exited:\n\n from __future__ import with_statement # This isn\'t required in Python 2.6\n\n with open("hello.txt") as f:\n for line in f:\n print line\n\n In older versions of Python, you would have needed to do this to\n get the same effect:\n\n f = open("hello.txt")\n try:\n for line in f:\n print line\n finally:\n f.close()\n\n Note: Not all "file-like" types in Python support use as a context\n manager for the ``with`` statement. If your code is intended to\n work with any file-like object, you can use the function\n ``contextlib.closing()`` instead of using the object directly.\n\nfile.flush()\n\n Flush the internal buffer, like ``stdio``\'s ``fflush()``. This may\n be a no-op on some file-like objects.\n\n Note: ``flush()`` does not necessarily write the file\'s data to disk.\n Use ``flush()`` followed by ``os.fsync()`` to ensure this\n behavior.\n\nfile.fileno()\n\n Return the integer "file descriptor" that is used by the underlying\n implementation to request I/O operations from the operating system.\n This can be useful for other, lower level interfaces that use file\n descriptors, such as the ``fcntl`` module or ``os.read()`` and\n friends.\n\n Note: File-like objects which do not have a real file descriptor should\n *not* provide this method!\n\nfile.isatty()\n\n Return ``True`` if the file is connected to a tty(-like) device,\n else ``False``.\n\n Note: If a file-like object is not associated with a real file, this\n method should *not* be implemented.\n\nfile.next()\n\n A file object is its own iterator, for example ``iter(f)`` returns\n *f* (unless *f* is closed). When a file is used as an iterator,\n typically in a ``for`` loop (for example, ``for line in f: print\n line``), the ``next()`` method is called repeatedly. This method\n returns the next input line, or raises ``StopIteration`` when EOF\n is hit when the file is open for reading (behavior is undefined\n when the file is open for writing). In order to make a ``for``\n loop the most efficient way of looping over the lines of a file (a\n very common operation), the ``next()`` method uses a hidden read-\n ahead buffer. As a consequence of using a read-ahead buffer,\n combining ``next()`` with other file methods (like ``readline()``)\n does not work right. However, using ``seek()`` to reposition the\n file to an absolute position will flush the read-ahead buffer.\n\n New in version 2.3.\n\nfile.read([size])\n\n Read at most *size* bytes from the file (less if the read hits EOF\n before obtaining *size* bytes). If the *size* argument is negative\n or omitted, read all data until EOF is reached. The bytes are\n returned as a string object. An empty string is returned when EOF\n is encountered immediately. (For certain files, like ttys, it\n makes sense to continue reading after an EOF is hit.) Note that\n this method may call the underlying C function ``fread()`` more\n than once in an effort to acquire as close to *size* bytes as\n possible. Also note that when in non-blocking mode, less data than\n was requested may be returned, even if no *size* parameter was\n given.\n\n Note: This function is simply a wrapper for the underlying ``fread()``\n C function, and will behave the same in corner cases, such as\n whether the EOF value is cached.\n\nfile.readline([size])\n\n Read one entire line from the file. A trailing newline character\n is kept in the string (but may be absent when a file ends with an\n incomplete line). [5] If the *size* argument is present and non-\n negative, it is a maximum byte count (including the trailing\n newline) and an incomplete line may be returned. When *size* is not\n 0, an empty string is returned *only* when EOF is encountered\n immediately.\n\n Note: Unlike ``stdio``\'s ``fgets()``, the returned string contains null\n characters (``\'\\0\'``) if they occurred in the input.\n\nfile.readlines([sizehint])\n\n Read until EOF using ``readline()`` and return a list containing\n the lines thus read. If the optional *sizehint* argument is\n present, instead of reading up to EOF, whole lines totalling\n approximately *sizehint* bytes (possibly after rounding up to an\n internal buffer size) are read. Objects implementing a file-like\n interface may choose to ignore *sizehint* if it cannot be\n implemented, or cannot be implemented efficiently.\n\nfile.xreadlines()\n\n This method returns the same thing as ``iter(f)``.\n\n New in version 2.1.\n\n Deprecated since version 2.3: Use ``for line in file`` instead.\n\nfile.seek(offset[, whence])\n\n Set the file\'s current position, like ``stdio``\'s ``fseek()``. The\n *whence* argument is optional and defaults to ``os.SEEK_SET`` or\n ``0`` (absolute file positioning); other values are ``os.SEEK_CUR``\n or ``1`` (seek relative to the current position) and\n ``os.SEEK_END`` or ``2`` (seek relative to the file\'s end). There\n is no return value.\n\n For example, ``f.seek(2, os.SEEK_CUR)`` advances the position by\n two and ``f.seek(-3, os.SEEK_END)`` sets the position to the third\n to last.\n\n Note that if the file is opened for appending (mode ``\'a\'`` or\n ``\'a+\'``), any ``seek()`` operations will be undone at the next\n write. If the file is only opened for writing in append mode (mode\n ``\'a\'``), this method is essentially a no-op, but it remains useful\n for files opened in append mode with reading enabled (mode\n ``\'a+\'``). If the file is opened in text mode (without ``\'b\'``),\n only offsets returned by ``tell()`` are legal. Use of other\n offsets causes undefined behavior.\n\n Note that not all file objects are seekable.\n\n Changed in version 2.6: Passing float values as offset has been\n deprecated.\n\nfile.tell()\n\n Return the file\'s current position, like ``stdio``\'s ``ftell()``.\n\n Note: On Windows, ``tell()`` can return illegal values (after an\n ``fgets()``) when reading files with Unix-style line-endings. Use\n binary mode (``\'rb\'``) to circumvent this problem.\n\nfile.truncate([size])\n\n Truncate the file\'s size. If the optional *size* argument is\n present, the file is truncated to (at most) that size. The size\n defaults to the current position. The current file position is not\n changed. Note that if a specified size exceeds the file\'s current\n size, the result is platform-dependent: possibilities include that\n the file may remain unchanged, increase to the specified size as if\n zero-filled, or increase to the specified size with undefined new\n content. Availability: Windows, many Unix variants.\n\nfile.write(str)\n\n Write a string to the file. There is no return value. Due to\n buffering, the string may not actually show up in the file until\n the ``flush()`` or ``close()`` method is called.\n\nfile.writelines(sequence)\n\n Write a sequence of strings to the file. The sequence can be any\n iterable object producing strings, typically a list of strings.\n There is no return value. (The name is intended to match\n ``readlines()``; ``writelines()`` does not add line separators.)\n\nFiles support the iterator protocol. Each iteration returns the same\nresult as ``file.readline()``, and iteration ends when the\n``readline()`` method returns an empty string.\n\nFile objects also offer a number of other interesting attributes.\nThese are not required for file-like objects, but should be\nimplemented if they make sense for the particular object.\n\nfile.closed\n\n bool indicating the current state of the file object. This is a\n read-only attribute; the ``close()`` method changes the value. It\n may not be available on all file-like objects.\n\nfile.encoding\n\n The encoding that this file uses. When Unicode strings are written\n to a file, they will be converted to byte strings using this\n encoding. In addition, when the file is connected to a terminal,\n the attribute gives the encoding that the terminal is likely to use\n (that information might be incorrect if the user has misconfigured\n the terminal). The attribute is read-only and may not be present\n on all file-like objects. It may also be ``None``, in which case\n the file uses the system default encoding for converting Unicode\n strings.\n\n New in version 2.3.\n\nfile.errors\n\n The Unicode error handler used along with the encoding.\n\n New in version 2.6.\n\nfile.mode\n\n The I/O mode for the file. If the file was created using the\n ``open()`` built-in function, this will be the value of the *mode*\n parameter. This is a read-only attribute and may not be present on\n all file-like objects.\n\nfile.name\n\n If the file object was created using ``open()``, the name of the\n file. Otherwise, some string that indicates the source of the file\n object, of the form ``<...>``. This is a read-only attribute and\n may not be present on all file-like objects.\n\nfile.newlines\n\n If Python was built with universal newlines enabled (the default)\n this read-only attribute exists, and for files opened in universal\n newline read mode it keeps track of the types of newlines\n encountered while reading the file. The values it can take are\n ``\'\\r\'``, ``\'\\n\'``, ``\'\\r\\n\'``, ``None`` (unknown, no newlines read\n yet) or a tuple containing all the newline types seen, to indicate\n that multiple newline conventions were encountered. For files not\n opened in universal newline read mode the value of this attribute\n will be ``None``.\n\nfile.softspace\n\n Boolean that indicates whether a space character needs to be\n printed before another value when using the ``print`` statement.\n Classes that are trying to simulate a file object should also have\n a writable ``softspace`` attribute, which should be initialized to\n zero. This will be automatic for most classes implemented in\n Python (care may be needed for objects that override attribute\n access); types implemented in C will have to provide a writable\n ``softspace`` attribute.\n\n Note: This attribute is not used to control the ``print`` statement,\n but to allow the implementation of ``print`` to keep track of its\n internal state.\n', - 'bltin-null-object': u"\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-type-objects': u"\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: ````.\n", - 'booleans': u'\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. (See the ``__nonzero__()`` special method for a way to\nchange this.)\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': u'\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', - 'callable-types': u'\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', - 'calls': u'\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 [","]\n | expression genexpr_for] ")"\n argument_list ::= positional_arguments ["," keyword_arguments]\n ["," "*" expression] ["," keyword_arguments]\n ["," "**" expression]\n | keyword_arguments ["," "*" expression]\n ["," "**" expression]\n | "*" expression ["," "*" expression] ["," "**" 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 certain class instances\nthemselves are callable; extensions may define additional callable\nobject types). All argument expressions are evaluated before the call\nis attempted. Please refer to section *Function definitions* for the\nsyntax 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 a sequence. Elements from this\nsequence 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 "", 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. Formal parameters using the syntax ``(sublist)`` cannot be\nused as keyword argument names; the outermost sublist corresponds to a\nsingle unnamed argument slot, and the argument value is assigned to\nthe sublist using the usual tuple assignment rules after all other\nparameter processing is done.\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': u'\nClass definitions\n*****************\n\nA class definition defines a class object (see section *The standard\ntype hierarchy*):\n\n classdef ::= "class" classname [inheritance] ":" suite\n inheritance ::= "(" [expression_list] ")"\n classname ::= identifier\n\nA class definition is an executable statement. It first evaluates the\ninheritance list, if present. Each item in the inheritance list\nshould evaluate to a class object or class type which allows\nsubclassing. The class\'s suite is then executed in a new execution\nframe (see section *Naming and binding*), using a newly created local\nnamespace and the original global namespace. (Usually, the suite\ncontains only function definitions.) When the class\'s suite finishes\nexecution, its execution frame is discarded but its local namespace is\nsaved. [4] A class object is then created using the inheritance list\nfor the base classes and the saved local namespace for the attribute\ndictionary. The class name is bound to this class object in the\noriginal local namespace.\n\n**Programmer\'s note:** Variables defined in the class definition are\nclass variables; they are shared by all instances. To create instance\nvariables, they can be set in a method with ``self.name = value``.\nBoth class and instance variables are accessible through the notation\n"``self.name``", and an instance variable hides a class variable with\nthe same name when accessed in this way. Class variables can be used\nas defaults for instance variables, but using mutable values there can\nlead to unexpected results. For *new-style class*es, descriptors can\nbe used to create instance variables with different implementation\ndetails.\n\nClass definitions, like function definitions, may be wrapped by one or\nmore *decorator* expressions. The evaluation rules for the decorator\nexpressions are the same as for functions. The result must be a class\nobject, which is then bound to the class name.\n\n-[ Footnotes ]-\n\n[1] The exception is propagated to the invocation stack only if there\n is no ``finally`` clause that negates the exception.\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', - 'coercion-rules': u"\nCoercion rules\n**************\n\nThis section used to document the rules for coercion. As the language\nhas evolved, the coercion rules have become hard to document\nprecisely; documenting what one version of one particular\nimplementation does is undesirable. Instead, here are some informal\nguidelines regarding coercion. In Python 3.0, coercion will not be\nsupported.\n\n* If the left operand of a % operator is a string or Unicode object,\n no coercion takes place and the string formatting operation is\n invoked instead.\n\n* It is no longer recommended to define a coercion operation. Mixed-\n mode operations on types that don't define coercion pass the\n original arguments to the operation.\n\n* New-style classes (those derived from ``object``) never invoke the\n ``__coerce__()`` method in response to a binary operator; the only\n time ``__coerce__()`` is invoked is when the built-in function\n ``coerce()`` is called.\n\n* For most intents and purposes, an operator that returns\n ``NotImplemented`` is treated the same as one that is not\n implemented at all.\n\n* Below, ``__op__()`` and ``__rop__()`` are used to signify the\n generic method names corresponding to an operator; ``__iop__()`` is\n used for the corresponding in-place operator. For example, for the\n operator '``+``', ``__add__()`` and ``__radd__()`` are used for the\n left and right variant of the binary operator, and ``__iadd__()``\n for the in-place variant.\n\n* For objects *x* and *y*, first ``x.__op__(y)`` is tried. If this is\n not implemented or returns ``NotImplemented``, ``y.__rop__(x)`` is\n tried. If this is also not implemented or returns\n ``NotImplemented``, a ``TypeError`` exception is raised. But see\n the following exception:\n\n* Exception to the previous item: if the left operand is an instance\n of a built-in type or a new-style class, and the right operand is an\n instance of a proper subclass of that type or class and overrides\n the base's ``__rop__()`` method, the right operand's ``__rop__()``\n method is tried *before* the left operand's ``__op__()`` method.\n\n This is done so that a subclass can completely override binary\n operators. Otherwise, the left operand's ``__op__()`` method would\n always accept the right operand: when an instance of a given class\n is expected, an instance of a subclass of that class is always\n acceptable.\n\n* When either operand type defines a coercion, this coercion is called\n before that type's ``__op__()`` or ``__rop__()`` method is called,\n but no sooner. If the coercion returns an object of a different\n type for the operand whose coercion is invoked, part of the process\n is redone using the new object.\n\n* When an in-place operator (like '``+=``') is used, if the left\n operand implements ``__iop__()``, it is invoked without any\n coercion. When the operation falls back to ``__op__()`` and/or\n ``__rop__()``, the normal coercion rules apply.\n\n* In ``x + y``, if *x* is a sequence that implements sequence\n concatenation, sequence concatenation is invoked.\n\n* In ``x * y``, if one operator is a sequence that implements sequence\n repetition, and the other is an integer (``int`` or ``long``),\n sequence repetition is invoked.\n\n* Rich comparisons (implemented by methods ``__eq__()`` and so on)\n never use coercion. Three-way comparison (implemented by\n ``__cmp__()``) does use coercion under the same conditions as other\n binary operations use it.\n\n* In the current implementation, the built-in numeric types ``int``,\n ``long``, ``float``, and ``complex`` do not use coercion. All these\n types implement a ``__coerce__()`` method, for use by the built-in\n ``coerce()`` function.\n\n Changed in version 2.7.\n", - 'comparisons': u'\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 forms ``<>`` and ``!=`` are equivalent; for consistency with C,\n``!=`` is preferred; where ``!=`` is mentioned below ``<>`` is also\naccepted. The ``<>`` spelling is considered obsolescent.\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,\nobjects of different types *always* compare unequal, and are ordered\nconsistently but arbitrarily. You can control comparison behavior of\nobjects of non-built-in types by defining a ``__cmp__`` method or rich\ncomparison methods like ``__gt__``, described in section *Special\nmethod names*.\n\n(This unusual definition of comparison was used to simplify the\ndefinition of operations like sorting and the ``in`` and ``not in``\noperators. In the future, the comparison rules for objects of\ndifferent types are likely to change.)\n\nComparison of objects of the same type depends on the type:\n\n* Numbers are compared arithmetically.\n\n* Strings are compared lexicographically using the numeric equivalents\n (the result of the built-in function ``ord()``) of their characters.\n Unicode and 8-bit strings are fully interoperable in this behavior.\n [4]\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, ``cmp([1,2,x], [1,2,y])`` returns\n the same as ``cmp(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 their sorted\n (key, value) lists compare equal. [5] Outcomes other than equality\n are resolved consistently, but are not otherwise defined. [6]\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\nThe operators ``in`` and ``not in`` test for collection membership.\n``x in s`` evaluates to true if *x* is a member of the collection *s*,\nand false otherwise. ``x not in s`` returns the negation of ``x in\ns``. The collection membership test has traditionally been bound to\nsequences; an object is a member of a collection if the collection is\na sequence and contains an element equal to that object. However, it\nmake sense for many other object types to support membership tests\nwithout being a sequence. In particular, dictionaries (for keys) and\nsets support membership testing.\n\nFor the list and tuple types, ``x in y`` is true if and only if there\nexists an index *i* such that ``x == y[i]`` is true.\n\nFor the Unicode and string types, ``x in y`` is true if and only if\n*x* is a substring of *y*. An equivalent test is ``y.find(x) != -1``.\nNote, *x* and *y* need not be the same type; consequently, ``u\'ab\' in\n\'abc\'`` will return ``True``. Empty strings are always considered to\nbe a substring of any other string, so ``"" in "abc"`` will return\n``True``.\n\nChanged in version 2.3: Previously, *x* was required to be a string of\nlength ``1``.\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. [7]\n', - 'compound': u'\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. Function and class\ndefinitions are also syntactically compound 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`` statements 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 | decorated\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, and then the suite is executed. When the items are\nexhausted (which is immediately when the sequence is empty), the suite\nin the ``else`` clause, if present, is executed, and the loop\nterminates.\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\nThe target list is not deleted when the loop is finished, but if the\nsequence is empty, it will not have been assigned to at all by the\nloop. Hint: the built-in function ``range()`` returns a sequence of\nintegers suitable to emulate the effect of Pascal\'s ``for i := a to b\ndo``; e.g., ``range(3)`` returns the list ``[0, 1, 2]``.\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 internal\n counter is used to keep track of which item is used next, and this\n is incremented on each iteration. When this counter has reached the\n length of the sequence the loop terminates. This means that if the\n suite deletes the current (or a previous) item from the sequence,\n the next item will be skipped (since it gets the index of the\n 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\nChanged in version 2.5: In previous versions of Python,\n``try``...``except``...``finally`` did not work. ``try``...``except``\nhad to be nested in ``try``...``finally``.\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, a tuple containing an item compatible with the\nexception, or, in the (deprecated) case of string exceptions, is the\nraised string itself (note that the object identities must match, i.e.\nit must be the same string object, not just a string with the same\nvalue).\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 in that except clause, if present, and the except\nclause\'s suite is executed. All except clauses must have an\nexecutable block. When the end of this block is reached, execution\ncontinues normally after the entire try statement. (This means that\nif two nested handlers exist for the same exception, and the exception\noccurs in the try clause of the inner handler, the outer handler will\nnot handle the exception.)\n\nBefore an except clause\'s suite is executed, details about the\nexception are assigned to three variables in the ``sys`` module:\n``sys.exc_type`` receives the object identifying the exception;\n``sys.exc_value`` receives the exception\'s parameter;\n``sys.exc_traceback`` receives a traceback object (see section *The\nstandard type hierarchy*) identifying the point in the program where\nthe exception occurred. These details are also available through the\n``sys.exc_info()`` function, which returns a tuple ``(exc_type,\nexc_value, exc_traceback)``. Use of the corresponding variables is\ndeprecated in favor of this function, since their use is unsafe in a\nthreaded program. As of Python 1.5, the variables are restored to\ntheir previous values (before the call) when returning from a function\nthat 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 lost. The exception information is not available to the\nprogram during execution 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\nNew in version 2.5.\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\nNote: In Python 2.5, the ``with`` statement is only allowed when the\n ``with_statement`` feature has been enabled. It is always enabled\n in Python 2.6.\n\nChanged in version 2.7: 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 decorated ::= decorators (classdef | funcdef)\n decorators ::= decorator+\n decorator ::= "@" dotted_name ["(" [argument_list [","]] ")"] NEWLINE\n funcdef ::= "def" funcname "(" [parameter_list] ")" ":" suite\n dotted_name ::= identifier ("." identifier)*\n parameter_list ::= (defparameter ",")*\n ( "*" identifier [, "**" identifier]\n | "**" identifier\n | defparameter [","] )\n defparameter ::= parameter ["=" expression]\n sublist ::= parameter ("," parameter)* [","]\n parameter ::= identifier | "(" sublist ")"\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 top-level 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 must also have a default value --- this is a syntactic\nrestriction 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 that 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.\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.\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 ::= "class" classname [inheritance] ":" suite\n inheritance ::= "(" [expression_list] ")"\n classname ::= identifier\n\nA class definition is an executable statement. It first evaluates the\ninheritance list, if present. Each item in the inheritance list\nshould evaluate to a class object or class type which allows\nsubclassing. The class\'s suite is then executed in a new execution\nframe (see section *Naming and binding*), using a newly created local\nnamespace and the original global namespace. (Usually, the suite\ncontains only function definitions.) When the class\'s suite finishes\nexecution, its execution frame is discarded but its local namespace is\nsaved. [4] A class object is then created using the inheritance list\nfor the base classes and the saved local namespace for the attribute\ndictionary. The class name is bound to this class object in the\noriginal local namespace.\n\n**Programmer\'s note:** Variables defined in the class definition are\nclass variables; they are shared by all instances. To create instance\nvariables, they can be set in a method with ``self.name = value``.\nBoth class and instance variables are accessible through the notation\n"``self.name``", and an instance variable hides a class variable with\nthe same name when accessed in this way. Class variables can be used\nas defaults for instance variables, but using mutable values there can\nlead to unexpected results. For *new-style class*es, descriptors can\nbe used to create instance variables with different implementation\ndetails.\n\nClass definitions, like function definitions, may be wrapped by one or\nmore *decorator* expressions. The evaluation rules for the decorator\nexpressions are the same as for functions. The result must be a class\nobject, which is then bound to the class name.\n\n-[ Footnotes ]-\n\n[1] The exception is propagated to the invocation stack only if there\n is no ``finally`` clause that negates the exception.\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': u'\nWith Statement Context Managers\n*******************************\n\nNew in version 2.5.\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': u'\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': u'\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," the arguments\nare coerced using the coercion rules listed at *Coercion rules*. If\nboth arguments are standard numeric types, the following coercions are\napplied:\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, if either argument is a long integer, the other is\n converted to long integer;\n\n* otherwise, both must be plain integers and no conversion is\n necessary.\n\nSome additional rules apply for certain operators (e.g., a string left\nargument to the \'%\' operator). Extensions can define their own\ncoercions.\n', - 'customization': u'\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_traceback`` 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.exc_traceback`` or ``sys.last_traceback``. Circular\n references which are garbage are detected when the option cycle\n detector is enabled (it\'s on by default), but can only be cleaned\n up if there are no Python-level ``__del__()`` methods involved.\n Refer to the documentation for the ``gc`` module for more\n information about how ``__del__()`` methods are handled by the\n cycle detector, particularly the description of the ``garbage``\n 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 and by string\n conversions (reverse quotes) to compute the "official" string\n representation of an object. If at all possible, this should look\n like a valid Python expression that could be used to recreate an\n object with the same value (given an appropriate environment). If\n this is not possible, a string of the form ``<...some useful\n description...>`` should be returned. The return value must be a\n string object. If a class defines ``__repr__()`` but not\n ``__str__()``, then ``__repr__()`` is also used when an "informal"\n string representation of instances of that class is 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 statement 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.__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 New in version 2.1.\n\n These are the so-called "rich comparison" methods, and are called\n for comparison operators in preference to ``__cmp__()`` below. The\n correspondence between operator symbols and method names is as\n follows: ``xy`` call ``x.__ne__(y)``, ``x>y`` calls ``x.__gt__(y)``, and\n ``x>=y`` calls ``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.__cmp__(self, other)\n\n Called by comparison operations if rich comparison (see above) is\n not defined. Should return a negative integer if ``self < other``,\n zero if ``self == other``, a positive integer if ``self > other``.\n If no ``__cmp__()``, ``__eq__()`` or ``__ne__()`` operation is\n defined, class instances are compared by object identity\n ("address"). See also the description of ``__hash__()`` for some\n important notes on creating *hashable* objects which support custom\n comparison operations and are usable as dictionary keys. (Note: the\n restriction that exceptions are not propagated by ``__cmp__()`` has\n been removed since Python 1.5.)\n\nobject.__rcmp__(self, other)\n\n Changed in version 2.1: No longer supported.\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 a ``__cmp__()`` or ``__eq__()`` method\n it should not define a ``__hash__()`` operation either; if it\n defines ``__cmp__()`` or ``__eq__()`` but not ``__hash__()``, its\n instances will not be usable in hashed collections. If a class\n defines mutable objects and implements a ``__cmp__()`` or\n ``__eq__()`` method, it should not implement ``__hash__()``, since\n hashable collection implementations require that a object\'s hash\n value is immutable (if the object\'s hash value changes, it will be\n in the wrong hash bucket).\n\n User-defined classes have ``__cmp__()`` 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 ``__cmp__()`` or ``__eq__()`` such that\n the hash value returned is no longer appropriate (e.g. by switching\n to a value-based concept of equality instead of the default\n identity based equality) can explicitly flag themselves as being\n unhashable by setting ``__hash__ = None`` in the class definition.\n Doing so means that not only will instances of the class raise an\n appropriate ``TypeError`` when a program attempts to retrieve their\n hash value, but they will also be correctly identified as\n unhashable when checking ``isinstance(obj, collections.Hashable)``\n (unlike classes which define their own ``__hash__()`` to explicitly\n raise ``TypeError``).\n\n Changed in version 2.5: ``__hash__()`` may now also return a long\n integer object; the 32-bit integer is then derived from the hash of\n that object.\n\n Changed in version 2.6: ``__hash__`` may now be set to ``None`` to\n explicitly flag instances of a class as unhashable.\n\nobject.__nonzero__(self)\n\n Called to implement truth value testing and the built-in operation\n ``bool()``; should return ``False`` or ``True``, or their integer\n equivalents ``0`` or ``1``. When this method is not defined,\n ``__len__()`` is called, if it is defined, and the object is\n considered true if its result is nonzero. If a class defines\n neither ``__len__()`` nor ``__nonzero__()``, all its instances are\n considered true.\n\nobject.__unicode__(self)\n\n Called to implement ``unicode()`` built-in; should return a Unicode\n object. When this method is not defined, string conversion is\n attempted, and the result of string conversion is converted to\n Unicode using the system default encoding.\n', - 'debugger': u'\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 > (0)?()\n (Pdb) continue\n > (1)?()\n (Pdb) continue\n NameError: \'spam\'\n > (1)?()\n (Pdb)\n\n``pdb.py`` can also be invoked as a script to debug other scripts.\nFor example:\n\n python -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 2.4: Restarting post-mortem behavior added.\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 ``c`` 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 "", 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[, locals]])\n\n Execute the *statement* (given as a string) under debugger control.\n The debugger prompt appears before any code is executed; you can\n set breakpoints and type ``continue``, or you can step through the\n statement using ``step`` or ``next`` (all these commands are\n explained below). The optional *globals* and *locals* arguments\n specify the environment in which the code is executed; by default\n the dictionary of the module ``__main__`` is used. (See the\n explanation of the ``exec`` statement or the ``eval()`` built-in\n function.)\n\npdb.runeval(expression[, globals[, locals]])\n\n Evaluate the *expression* (given as a string) under debugger\n control. When ``runeval()`` returns, it returns the value of the\n expression. Otherwise this function is similar to ``run()``.\n\npdb.runcall(function[, argument, ...])\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])\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)\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 Example call to enable tracing with *skip*:\n\n import pdb; pdb.Pdb(skip=[\'django.*\']).set_trace()\n\n New in version 2.7: The *skip* argument.\n\n run(statement[, globals[, locals]])\n runeval(expression[, globals[, locals]])\n runcall(function[, argument, ...])\n set_trace()\n\n See the documentation for the functions explained above.\n', - 'del': u'\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 that 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\nIt is illegal to delete a name from the local namespace if it occurs\nas a free variable in a nested block.\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', - 'dict': u'\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': u'\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\nIf ``exec`` is used in a function and the function contains or is a\nnested block with free variables, the compiler will raise a\n``SyntaxError`` unless the exec explicitly specifies the local\nnamespace for the ``exec``. (In other words, ``exec obj`` would be\nillegal, but ``exec obj in ns`` would be legal.)\n\nThe ``eval()``, ``execfile()``, and ``input()`` functions and the\n``exec`` statement do not have access to the full environment for\nresolving names. Names may be resolved in the local and global\nnamespaces of the caller. Free variables are not resolved in the\nnearest enclosing namespace, but in the global namespace. [1] The\n``exec`` statement and the ``eval()`` and ``execfile()`` functions\nhave optional arguments to override the global and local namespace.\nIf only one namespace is specified, it is used for both.\n', - 'else': u'\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', - 'exceptions': u'\nExceptions\n**********\n\nExceptions are a means of breaking out of the normal flow of control\nof a code block in order to handle errors or other exceptional\nconditions. An exception is *raised* at the point where the error is\ndetected; it may be *handled* by the surrounding code block or by any\ncode block that directly or indirectly invoked the code block where\nthe error occurred.\n\nThe Python interpreter raises an exception when it detects a run-time\nerror (such as division by zero). A Python program can also\nexplicitly raise an exception with the ``raise`` statement. Exception\nhandlers are specified with the ``try`` ... ``except`` statement. The\n``finally`` clause of such a statement can be used to specify cleanup\ncode which does not handle the exception, but is executed whether an\nexception occurred or not in the preceding code.\n\nPython uses the "termination" model of error handling: an exception\nhandler can find out what happened and continue execution at an outer\nlevel, but it cannot repair the cause of the error and retry the\nfailing operation (except by re-entering the offending piece of code\nfrom the top).\n\nWhen an exception is not handled at all, the interpreter terminates\nexecution of the program, or returns to its interactive main loop. In\neither case, it prints a stack backtrace, except when the exception is\n``SystemExit``.\n\nExceptions are identified by class instances. The ``except`` clause\nis selected depending on the class of the instance: it must reference\nthe class of the instance or a base class thereof. The instance can\nbe received by the handler and can carry additional information about\nthe exceptional condition.\n\nExceptions can also be identified by strings, in which case the\n``except`` clause is selected by object identity. An arbitrary value\ncan be raised along with the identifying string which can be passed to\nthe handler.\n\nNote: Messages to exceptions are not part of the Python API. Their\n contents may change from one version of Python to the next without\n warning and should not be relied on by code which will run under\n multiple versions of the interpreter.\n\nSee also the description of the ``try`` statement in section *The try\nstatement* and ``raise`` statement in section *The raise statement*.\n\n-[ Footnotes ]-\n\n[1] This limitation occurs because the code that is executed by these\n operations is not available at the time the module is compiled.\n', - 'exec': u'\nThe ``exec`` statement\n**********************\n\n exec_stmt ::= "exec" or_expr ["in" expression ["," expression]]\n\nThis statement supports dynamic execution of Python code. The first\nexpression should evaluate to either a string, an open file object, or\na code object. If it is a string, the string is parsed as a suite of\nPython statements which is then executed (unless a syntax error\noccurs). [1] If it is an open file, the file is parsed until EOF and\nexecuted. If it is a code object, it is simply executed. In all\ncases, the code that\'s executed is expected to be valid as file input\n(see section *File input*). Be aware that the ``return`` and\n``yield`` statements may not be used outside of function definitions\neven within the context of code passed to the ``exec`` statement.\n\nIn all cases, if the optional parts are omitted, the code is executed\nin the current scope. If only the first expression after ``in`` is\nspecified, it should be a dictionary, which will be used for both the\nglobal and the local variables. If two expressions are given, they\nare used for the global and local variables, respectively. If\nprovided, *locals* can be any mapping object.\n\nChanged in version 2.4: Formerly, *locals* was required to be a\ndictionary.\n\nAs a side effect, an implementation may insert additional keys into\nthe dictionaries given besides those corresponding to variable names\nset by the executed code. For example, the current implementation may\nadd a reference to the dictionary of the built-in module\n``__builtin__`` under the key ``__builtins__`` (!).\n\n**Programmer\'s hints:** dynamic evaluation of expressions is supported\nby the built-in function ``eval()``. The built-in functions\n``globals()`` and ``locals()`` return the current global and local\ndictionary, respectively, which may be useful to pass around for use\nby ``exec``.\n\n-[ Footnotes ]-\n\n[1] Note that the parser only accepts the Unix-style end of line\n convention. If you are reading the code from a file, make sure to\n use universal newline mode to convert Windows or Mac-style\n newlines.\n', - 'execmodel': u'\nExecution model\n***************\n\n\nNaming and binding\n==================\n\n*Names* refer to objects. Names are introduced by name binding\noperations. Each occurrence of a name in the program text refers to\nthe *binding* of that name established in the innermost function block\ncontaining the use.\n\nA *block* is a piece of Python program text that is executed as a\nunit. The following are blocks: a module, a function body, and a class\ndefinition. Each command typed interactively is a block. A script\nfile (a file given as standard input to the interpreter or specified\non the interpreter command line the first argument) is a code block.\nA script command (a command specified on the interpreter command line\nwith the \'**-c**\' option) is a code block. The file read by the\nbuilt-in function ``execfile()`` is a code block. The string argument\npassed to the built-in function ``eval()`` and to the ``exec``\nstatement is a code block. The expression read and evaluated by the\nbuilt-in function ``input()`` is a code block.\n\nA code block is executed in an *execution frame*. A frame contains\nsome administrative information (used for debugging) and determines\nwhere and how execution continues after the code block\'s execution has\ncompleted.\n\nA *scope* defines the visibility of a name within a block. If a local\nvariable is defined in a block, its scope includes that block. If the\ndefinition occurs in a function block, the scope extends to any blocks\ncontained within the defining one, unless a contained block introduces\na different binding for the name. The scope of names defined in a\nclass block is limited to the class block; it does not extend to the\ncode blocks of methods -- this includes generator expressions since\nthey are implemented using a function scope. This means that the\nfollowing will fail:\n\n class A:\n a = 42\n b = list(a + i for i in range(10))\n\nWhen a name is used in a code block, it is resolved using the nearest\nenclosing scope. The set of all such scopes visible to a code block\nis called the block\'s *environment*.\n\nIf a name is bound in a block, it is a local variable of that block.\nIf a name is bound at the module level, it is a global variable. (The\nvariables of the module code block are local and global.) If a\nvariable is used in a code block but not defined there, it is a *free\nvariable*.\n\nWhen a name is not found at all, a ``NameError`` exception is raised.\nIf the name refers to a local variable that has not been bound, a\n``UnboundLocalError`` exception is raised. ``UnboundLocalError`` is a\nsubclass of ``NameError``.\n\nThe following constructs bind names: formal parameters to functions,\n``import`` statements, class and function definitions (these bind the\nclass or function name in the defining block), and targets that are\nidentifiers if occurring in an assignment, ``for`` loop header, in the\nsecond position of an ``except`` clause header or after ``as`` in a\n``with`` statement. The ``import`` statement of the form ``from ...\nimport *`` binds all names defined in the imported module, except\nthose beginning with an underscore. This form may only be used at the\nmodule level.\n\nA target occurring in a ``del`` statement is also considered bound for\nthis purpose (though the actual semantics are to unbind the name). It\nis illegal to unbind a name that is referenced by an enclosing scope;\nthe compiler will report a ``SyntaxError``.\n\nEach assignment or import statement occurs within a block defined by a\nclass or function definition or at the module level (the top-level\ncode block).\n\nIf a name binding operation occurs anywhere within a code block, all\nuses of the name within the block are treated as references to the\ncurrent block. This can lead to errors when a name is used within a\nblock before it is bound. This rule is subtle. Python lacks\ndeclarations and allows name binding operations to occur anywhere\nwithin a code block. The local variables of a code block can be\ndetermined by scanning the entire text of the block for name binding\noperations.\n\nIf the global statement occurs within a block, all uses of the name\nspecified in the statement refer to the binding of that name in the\ntop-level namespace. Names are resolved in the top-level namespace by\nsearching the global namespace, i.e. the namespace of the module\ncontaining the code block, and the builtins namespace, the namespace\nof the module ``__builtin__``. The global namespace is searched\nfirst. If the name is not found there, the builtins namespace is\nsearched. The global statement must precede all uses of the name.\n\nThe builtins namespace associated with the execution of a code block\nis actually found by looking up the name ``__builtins__`` in its\nglobal namespace; this should be a dictionary or a module (in the\nlatter case the module\'s dictionary is used). By default, when in the\n``__main__`` module, ``__builtins__`` is the built-in module\n``__builtin__`` (note: no \'s\'); when in any other module,\n``__builtins__`` is an alias for the dictionary of the ``__builtin__``\nmodule itself. ``__builtins__`` can be set to a user-created\ndictionary to create a weak form of restricted execution.\n\n**CPython implementation detail:** Users should not touch\n``__builtins__``; it is strictly an implementation detail. Users\nwanting to override values in the builtins namespace should ``import``\nthe ``__builtin__`` (no \'s\') module and modify its attributes\nappropriately.\n\nThe namespace for a module is automatically created the first time a\nmodule is imported. The main module for a script is always called\n``__main__``.\n\nThe ``global`` statement has the same scope as a name binding\noperation in the same block. If the nearest enclosing scope for a\nfree variable contains a global statement, the free variable is\ntreated as a global.\n\nA class definition is an executable statement that may use and define\nnames. These references follow the normal rules for name resolution.\nThe namespace of the class definition becomes the attribute dictionary\nof the class. Names defined at the class scope are not visible in\nmethods.\n\n\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\nIf ``exec`` is used in a function and the function contains or is a\nnested block with free variables, the compiler will raise a\n``SyntaxError`` unless the exec explicitly specifies the local\nnamespace for the ``exec``. (In other words, ``exec obj`` would be\nillegal, but ``exec obj in ns`` would be legal.)\n\nThe ``eval()``, ``execfile()``, and ``input()`` functions and the\n``exec`` statement do not have access to the full environment for\nresolving names. Names may be resolved in the local and global\nnamespaces of the caller. Free variables are not resolved in the\nnearest enclosing namespace, but in the global namespace. [1] The\n``exec`` statement and the ``eval()`` and ``execfile()`` functions\nhave optional arguments to override the global and local namespace.\nIf only one namespace is specified, it is used for both.\n\n\nExceptions\n==========\n\nExceptions are a means of breaking out of the normal flow of control\nof a code block in order to handle errors or other exceptional\nconditions. An exception is *raised* at the point where the error is\ndetected; it may be *handled* by the surrounding code block or by any\ncode block that directly or indirectly invoked the code block where\nthe error occurred.\n\nThe Python interpreter raises an exception when it detects a run-time\nerror (such as division by zero). A Python program can also\nexplicitly raise an exception with the ``raise`` statement. Exception\nhandlers are specified with the ``try`` ... ``except`` statement. The\n``finally`` clause of such a statement can be used to specify cleanup\ncode which does not handle the exception, but is executed whether an\nexception occurred or not in the preceding code.\n\nPython uses the "termination" model of error handling: an exception\nhandler can find out what happened and continue execution at an outer\nlevel, but it cannot repair the cause of the error and retry the\nfailing operation (except by re-entering the offending piece of code\nfrom the top).\n\nWhen an exception is not handled at all, the interpreter terminates\nexecution of the program, or returns to its interactive main loop. In\neither case, it prints a stack backtrace, except when the exception is\n``SystemExit``.\n\nExceptions are identified by class instances. The ``except`` clause\nis selected depending on the class of the instance: it must reference\nthe class of the instance or a base class thereof. The instance can\nbe received by the handler and can carry additional information about\nthe exceptional condition.\n\nExceptions can also be identified by strings, in which case the\n``except`` clause is selected by object identity. An arbitrary value\ncan be raised along with the identifying string which can be passed to\nthe handler.\n\nNote: Messages to exceptions are not part of the Python API. Their\n contents may change from one version of Python to the next without\n warning and should not be relied on by code which will run under\n multiple versions of the interpreter.\n\nSee also the description of the ``try`` statement in section *The try\nstatement* and ``raise`` statement in section *The raise statement*.\n\n-[ Footnotes ]-\n\n[1] This limitation occurs because the code that is executed by these\n operations is not available at the time the module is compiled.\n', - 'exprlists': u'\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': u'\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 of floating point numbers can\nlook like octal integers, but are interpreted using radix 10. For\nexample, ``077e010`` is legal, and denotes the same number as\n``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': u'\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, and then the suite is executed. When the items are\nexhausted (which is immediately when the sequence is empty), the suite\nin the ``else`` clause, if present, is executed, and the loop\nterminates.\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\nThe target list is not deleted when the loop is finished, but if the\nsequence is empty, it will not have been assigned to at all by the\nloop. Hint: the built-in function ``range()`` returns a sequence of\nintegers suitable to emulate the effect of Pascal\'s ``for i := a to b\ndo``; e.g., ``range(3)`` returns the list ``[0, 1, 2]``.\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 internal\n counter is used to keep track of which item is used next, and this\n is incremented on each iteration. When this counter has reached the\n length of the sequence the loop terminates. This means that if the\n suite deletes the current (or a previous) item from the sequence,\n the next item will be skipped (since it gets the index of the\n 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': u'\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 ::= +\n conversion ::= "r" | "s"\n format_spec ::= \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\neither a number or a keyword. If it\'s a number, it refers to a\npositional argument, and if it\'s a keyword, it refers to a named\nkeyword argument. If the numerical arg_names in a format string are\n0, 1, 2, ... in sequence, they can all be omitted (not just some) and\nthe numbers 0, 1, 2, ... will be automatically inserted in that order.\nThe *arg_name* can be followed by any number of index or attribute\nexpressions. An expression of the form ``\'.name\'`` selects the named\nattribute using ``getattr()``, while an expression of the form\n``\'[index]\'`` does an index lookup using ``__getitem__()``.\n\nChanged in version 2.7: 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\nTwo conversion flags are currently supported: ``\'!s\'`` which calls\n``str()`` on the value, and ``\'!r\'`` which calls ``repr()``.\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\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 ::= \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 is only valid for integers, and only for binary,\noctal, or hexadecimal output. If present, it specifies that the\noutput will be prefixed by ``\'0b\'``, ``\'0o\'``, or ``\'0x\'``,\nrespectively.\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 2.7: 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\'``. |\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 | The same as ``\'g\'``. |\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\') # 2.7+ 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(object):\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.5\n >>> total = 22\n >>> \'Correct answers: {:.2%}.\'.format(points/total)\n \'Correct answers: 88.64%\'\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),\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': u'\nFunction definitions\n********************\n\nA function definition defines a user-defined function object (see\nsection *The standard type hierarchy*):\n\n decorated ::= decorators (classdef | funcdef)\n decorators ::= decorator+\n decorator ::= "@" dotted_name ["(" [argument_list [","]] ")"] NEWLINE\n funcdef ::= "def" funcname "(" [parameter_list] ")" ":" suite\n dotted_name ::= identifier ("." identifier)*\n parameter_list ::= (defparameter ",")*\n ( "*" identifier [, "**" identifier]\n | "**" identifier\n | defparameter [","] )\n defparameter ::= parameter ["=" expression]\n sublist ::= parameter ("," parameter)* [","]\n parameter ::= identifier | "(" sublist ")"\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 top-level 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 must also have a default value --- this is a syntactic\nrestriction 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 that 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.\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.\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', - 'global': u'\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 an\n``exec`` statement does not affect the code block *containing* the\n``exec`` statement, and code contained in an ``exec`` statement is\nunaffected by ``global`` statements in the code containing the\n``exec`` statement. The same applies to the ``eval()``,\n``execfile()`` and ``compile()`` functions.\n', - 'id-classes': u'\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 ``__builtin__`` module.\n When not in interactive mode, ``_`` has no special meaning and is\n not 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': u'\nIdentifiers and keywords\n************************\n\nIdentifiers (also referred to as *names*) are described by the\nfollowing lexical definitions:\n\n identifier ::= (letter|"_") (letter | digit | "_")*\n letter ::= lowercase | uppercase\n lowercase ::= "a"..."z"\n uppercase ::= "A"..."Z"\n digit ::= "0"..."9"\n\nIdentifiers are unlimited in length. Case is significant.\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 and del from not while\n as elif global or with\n assert else if pass yield\n break except import print\n class exec in raise\n continue finally is return\n def for lambda try\n\nChanged in version 2.4: ``None`` became a constant and is now\nrecognized by the compiler as a name for the built-in object ``None``.\nAlthough it is not a keyword, you cannot assign a different object to\nit.\n\nChanged in version 2.5: Both ``as`` and ``with`` are only recognized\nwhen the ``with_statement`` future feature has been enabled. It will\nalways be enabled in Python 2.6. See section *The with statement* for\ndetails. Note that using ``as`` and ``with`` as identifiers will\nalways issue a warning, even when the ``with_statement`` future\ndirective is not in effect.\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 ``__builtin__`` module.\n When not in interactive mode, ``_`` has no special meaning and is\n not 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': u'\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': u'\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': u'\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.\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.\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. If the\nwild card form of import --- ``import *`` --- is used in a function\nand the function contains or is a nested block with free variables,\nthe compiler will 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 2.6 are ``unicode_literals``,\n``print_function``, ``absolute_import``, ``division``, ``generators``,\n``nested_scopes`` and ``with_statement``. ``generators``,\n``with_statement``, ``nested_scopes`` are redundant in Python version\n2.6 and above because they are always enabled.\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 an ``exec`` statement or calls to the built-in\nfunctions ``compile()`` and ``execfile()`` that occur in a module\n``M`` containing a future statement will, by default, use the new\nsyntax or semantics associated with the future statement. This can,\nstarting with Python 2.2 be controlled by optional arguments to\n``compile()`` --- see the documentation of that function for 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': u'\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 forms ``<>`` and ``!=`` are equivalent; for consistency with C,\n``!=`` is preferred; where ``!=`` is mentioned below ``<>`` is also\naccepted. The ``<>`` spelling is considered obsolescent.\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,\nobjects of different types *always* compare unequal, and are ordered\nconsistently but arbitrarily. You can control comparison behavior of\nobjects of non-built-in types by defining a ``__cmp__`` method or rich\ncomparison methods like ``__gt__``, described in section *Special\nmethod names*.\n\n(This unusual definition of comparison was used to simplify the\ndefinition of operations like sorting and the ``in`` and ``not in``\noperators. In the future, the comparison rules for objects of\ndifferent types are likely to change.)\n\nComparison of objects of the same type depends on the type:\n\n* Numbers are compared arithmetically.\n\n* Strings are compared lexicographically using the numeric equivalents\n (the result of the built-in function ``ord()``) of their characters.\n Unicode and 8-bit strings are fully interoperable in this behavior.\n [4]\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, ``cmp([1,2,x], [1,2,y])`` returns\n the same as ``cmp(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 their sorted\n (key, value) lists compare equal. [5] Outcomes other than equality\n are resolved consistently, but are not otherwise defined. [6]\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\nThe operators ``in`` and ``not in`` test for collection membership.\n``x in s`` evaluates to true if *x* is a member of the collection *s*,\nand false otherwise. ``x not in s`` returns the negation of ``x in\ns``. The collection membership test has traditionally been bound to\nsequences; an object is a member of a collection if the collection is\na sequence and contains an element equal to that object. However, it\nmake sense for many other object types to support membership tests\nwithout being a sequence. In particular, dictionaries (for keys) and\nsets support membership testing.\n\nFor the list and tuple types, ``x in y`` is true if and only if there\nexists an index *i* such that ``x == y[i]`` is true.\n\nFor the Unicode and string types, ``x in y`` is true if and only if\n*x* is a substring of *y*. An equivalent test is ``y.find(x) != -1``.\nNote, *x* and *y* need not be the same type; consequently, ``u\'ab\' in\n\'abc\'`` will return ``True``. Empty strings are always considered to\nbe a substring of any other string, so ``"" in "abc"`` will return\n``True``.\n\nChanged in version 2.3: Previously, *x* was required to be a string of\nlength ``1``.\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. [7]\n', - 'integers': u'\nInteger and long integer literals\n*********************************\n\nInteger and long integer literals are described by the following\nlexical definitions:\n\n longinteger ::= integer ("l" | "L")\n integer ::= decimalinteger | octinteger | hexinteger | bininteger\n decimalinteger ::= nonzerodigit digit* | "0"\n octinteger ::= "0" ("o" | "O") octdigit+ | "0" octdigit+\n hexinteger ::= "0" ("x" | "X") hexdigit+\n bininteger ::= "0" ("b" | "B") bindigit+\n nonzerodigit ::= "1"..."9"\n octdigit ::= "0"..."7"\n bindigit ::= "0" | "1"\n hexdigit ::= digit | "a"..."f" | "A"..."F"\n\nAlthough both lower case ``\'l\'`` and upper case ``\'L\'`` are allowed as\nsuffix for long integers, it is strongly recommended to always use\n``\'L\'``, since the letter ``\'l\'`` looks too much like the digit\n``\'1\'``.\n\nPlain integer literals that are above the largest representable plain\ninteger (e.g., 2147483647 when using 32-bit arithmetic) are accepted\nas if they were long integers instead. [1] There is no limit for long\ninteger literals apart from what can be stored in available memory.\n\nSome examples of plain integer literals (first row) and long integer\nliterals (second and third rows):\n\n 7 2147483647 0177\n 3L 79228162514264337593543950336L 0377L 0x100000000L\n 79228162514264337593543950336 0xdeadbeef\n', - 'lambda': u'\nLambdas\n*******\n\n lambda_form ::= "lambda" [parameter_list]: expression\n old_lambda_form ::= "lambda" [parameter_list]: old_expression\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 name(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.\n', - 'lists': u'\nList displays\n*************\n\nA list display is a possibly empty series of expressions enclosed in\nsquare brackets:\n\n list_display ::= "[" [expression_list | list_comprehension] "]"\n list_comprehension ::= expression list_for\n list_for ::= "for" target_list "in" old_expression_list [list_iter]\n old_expression_list ::= old_expression [("," old_expression)+ [","]]\n old_expression ::= or_test | old_lambda_form\n list_iter ::= list_for | list_if\n list_if ::= "if" old_expression [list_iter]\n\nA list display yields a new list object. Its contents are specified\nby providing either a list of expressions or a list comprehension.\nWhen a comma-separated list of expressions is supplied, its elements\nare evaluated from left to right and placed into the list object in\nthat order. When a list comprehension is supplied, it consists of a\nsingle expression followed by at least one ``for`` clause and zero or\nmore ``for`` or ``if`` clauses. In this case, the elements of the new\nlist are those that would be produced by considering each of the\n``for`` or ``if`` clauses a block, nesting from left to right, and\nevaluating the expression to produce a list element each time the\ninnermost block is reached [1].\n', - 'naming': u"\nNaming and binding\n******************\n\n*Names* refer to objects. Names are introduced by name binding\noperations. Each occurrence of a name in the program text refers to\nthe *binding* of that name established in the innermost function block\ncontaining the use.\n\nA *block* is a piece of Python program text that is executed as a\nunit. The following are blocks: a module, a function body, and a class\ndefinition. Each command typed interactively is a block. A script\nfile (a file given as standard input to the interpreter or specified\non the interpreter command line the first argument) is a code block.\nA script command (a command specified on the interpreter command line\nwith the '**-c**' option) is a code block. The file read by the\nbuilt-in function ``execfile()`` is a code block. The string argument\npassed to the built-in function ``eval()`` and to the ``exec``\nstatement is a code block. The expression read and evaluated by the\nbuilt-in function ``input()`` is a code block.\n\nA code block is executed in an *execution frame*. A frame contains\nsome administrative information (used for debugging) and determines\nwhere and how execution continues after the code block's execution has\ncompleted.\n\nA *scope* defines the visibility of a name within a block. If a local\nvariable is defined in a block, its scope includes that block. If the\ndefinition occurs in a function block, the scope extends to any blocks\ncontained within the defining one, unless a contained block introduces\na different binding for the name. The scope of names defined in a\nclass block is limited to the class block; it does not extend to the\ncode blocks of methods -- this includes generator expressions since\nthey are implemented using a function scope. This means that the\nfollowing will fail:\n\n class A:\n a = 42\n b = list(a + i for i in range(10))\n\nWhen a name is used in a code block, it is resolved using the nearest\nenclosing scope. The set of all such scopes visible to a code block\nis called the block's *environment*.\n\nIf a name is bound in a block, it is a local variable of that block.\nIf a name is bound at the module level, it is a global variable. (The\nvariables of the module code block are local and global.) If a\nvariable is used in a code block but not defined there, it is a *free\nvariable*.\n\nWhen a name is not found at all, a ``NameError`` exception is raised.\nIf the name refers to a local variable that has not been bound, a\n``UnboundLocalError`` exception is raised. ``UnboundLocalError`` is a\nsubclass of ``NameError``.\n\nThe following constructs bind names: formal parameters to functions,\n``import`` statements, class and function definitions (these bind the\nclass or function name in the defining block), and targets that are\nidentifiers if occurring in an assignment, ``for`` loop header, in the\nsecond position of an ``except`` clause header or after ``as`` in a\n``with`` statement. The ``import`` statement of the form ``from ...\nimport *`` binds all names defined in the imported module, except\nthose beginning with an underscore. This form may only be used at the\nmodule level.\n\nA target occurring in a ``del`` statement is also considered bound for\nthis purpose (though the actual semantics are to unbind the name). It\nis illegal to unbind a name that is referenced by an enclosing scope;\nthe compiler will report a ``SyntaxError``.\n\nEach assignment or import statement occurs within a block defined by a\nclass or function definition or at the module level (the top-level\ncode block).\n\nIf a name binding operation occurs anywhere within a code block, all\nuses of the name within the block are treated as references to the\ncurrent block. This can lead to errors when a name is used within a\nblock before it is bound. This rule is subtle. Python lacks\ndeclarations and allows name binding operations to occur anywhere\nwithin a code block. The local variables of a code block can be\ndetermined by scanning the entire text of the block for name binding\noperations.\n\nIf the global statement occurs within a block, all uses of the name\nspecified in the statement refer to the binding of that name in the\ntop-level namespace. Names are resolved in the top-level namespace by\nsearching the global namespace, i.e. the namespace of the module\ncontaining the code block, and the builtins namespace, the namespace\nof the module ``__builtin__``. The global namespace is searched\nfirst. If the name is not found there, the builtins namespace is\nsearched. The global statement must precede all uses of the name.\n\nThe builtins namespace associated with the execution of a code block\nis actually found by looking up the name ``__builtins__`` in its\nglobal namespace; this should be a dictionary or a module (in the\nlatter case the module's dictionary is used). By default, when in the\n``__main__`` module, ``__builtins__`` is the built-in module\n``__builtin__`` (note: no 's'); when in any other module,\n``__builtins__`` is an alias for the dictionary of the ``__builtin__``\nmodule itself. ``__builtins__`` can be set to a user-created\ndictionary to create a weak form of restricted execution.\n\n**CPython implementation detail:** Users should not touch\n``__builtins__``; it is strictly an implementation detail. Users\nwanting to override values in the builtins namespace should ``import``\nthe ``__builtin__`` (no 's') module and modify its attributes\nappropriately.\n\nThe namespace for a module is automatically created the first time a\nmodule is imported. The main module for a script is always called\n``__main__``.\n\nThe ``global`` statement has the same scope as a name binding\noperation in the same block. If the nearest enclosing scope for a\nfree variable contains a global statement, the free variable is\ntreated as a global.\n\nA class definition is an executable statement that may use and define\nnames. These references follow the normal rules for name resolution.\nThe namespace of the class definition becomes the attribute dictionary\nof the class. Names defined at the class scope are not visible in\nmethods.\n\n\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\nIf ``exec`` is used in a function and the function contains or is a\nnested block with free variables, the compiler will raise a\n``SyntaxError`` unless the exec explicitly specifies the local\nnamespace for the ``exec``. (In other words, ``exec obj`` would be\nillegal, but ``exec obj in ns`` would be legal.)\n\nThe ``eval()``, ``execfile()``, and ``input()`` functions and the\n``exec`` statement do not have access to the full environment for\nresolving names. Names may be resolved in the local and global\nnamespaces of the caller. Free variables are not resolved in the\nnearest enclosing namespace, but in the global namespace. [1] The\n``exec`` statement and the ``eval()`` and ``execfile()`` functions\nhave optional arguments to override the global and local namespace.\nIf only one namespace is specified, it is used for both.\n", - 'numbers': u"\nNumeric literals\n****************\n\nThere are four types of numeric literals: plain integers, long\nintegers, floating point numbers, and imaginary numbers. There are no\ncomplex literals (complex numbers can be formed by adding a real\nnumber and an imaginary 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': u'\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.__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 (``+``, ``-``, ``*``, ``//``, ``%``, ``divmod()``,\n ``pow()``, ``**``, ``<<``, ``>>``, ``&``, ``^``, ``|``). For\n instance, to evaluate the expression ``x + y``, where *x* is an\n 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__()`` (described below). Note\n that ``__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.__div__(self, other)\nobject.__truediv__(self, other)\n\n The division operator (``/``) is implemented by these methods. The\n ``__truediv__()`` method is used when ``__future__.division`` is in\n effect, otherwise ``__div__()`` is used. If only one of these two\n methods is defined, the object will not support division in the\n alternate context; ``TypeError`` will be raised instead.\n\nobject.__radd__(self, other)\nobject.__rsub__(self, other)\nobject.__rmul__(self, other)\nobject.__rdiv__(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 (``+``, ``-``, ``*``, ``/``, ``%``, ``divmod()``,\n ``pow()``, ``**``, ``<<``, ``>>``, ``&``, ``^``, ``|``) with\n reflected (swapped) operands. These functions are only called if\n the left operand does not support the corresponding operation and\n the operands are of different types. [2] For instance, to evaluate\n the expression ``x - y``, where *y* is an instance of a class that\n has an ``__rsub__()`` method, ``y.__rsub__(x)`` is called if\n ``x.__sub__(y)`` returns *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.__idiv__(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.__long__(self)\nobject.__float__(self)\n\n Called to implement the built-in functions ``complex()``,\n ``int()``, ``long()``, and ``float()``. Should return a value of\n the appropriate type.\n\nobject.__oct__(self)\nobject.__hex__(self)\n\n Called to implement the built-in functions ``oct()`` and ``hex()``.\n Should return a string value.\n\nobject.__index__(self)\n\n Called to implement ``operator.index()``. Also called whenever\n Python needs an integer object (such as in slicing). Must return\n an integer (int or long).\n\n New in version 2.5.\n\nobject.__coerce__(self, other)\n\n Called to implement "mixed-mode" numeric arithmetic. Should either\n return a 2-tuple containing *self* and *other* converted to a\n common numeric type, or ``None`` if conversion is impossible. When\n the common type would be the type of ``other``, it is sufficient to\n return ``None``, since the interpreter will also ask the other\n object to attempt a coercion (but sometimes, if the implementation\n of the other type cannot be changed, it is useful to do the\n conversion to the other type here). A return value of\n ``NotImplemented`` is equivalent to returning ``None``.\n', - 'objects': u'\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 provides a convenient way to do\nthis.\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': u'\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+-------------------------------------------------+---------------------------------------+\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| | [8] |\n+-------------------------------------------------+---------------------------------------+\n| ``+x``, ``-x``, ``~x`` | Positive, negative, bitwise NOT |\n+-------------------------------------------------+---------------------------------------+\n| ``**`` | Exponentiation [9] |\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, string |\n| | conversion |\n+-------------------------------------------------+---------------------------------------+\n\n-[ Footnotes ]-\n\n[1] In Python 2.3 and later releases, a list comprehension "leaks" the\n control variables of each ``for`` it contains into the containing\n scope. However, this behavior is deprecated, and relying on it\n will not work in Python 3.0\n\n[2] 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[3] If x is very close to an exact integer multiple of y, it\'s\n possible for ``floor(x/y)`` to be one larger than ``(x-x%y)/y``\n due to rounding. In such cases, Python returns the latter result,\n in order to preserve that ``divmod(x,y)[0] * y + x % y`` be very\n close to ``x``.\n\n[4] While comparisons between unicode strings make sense at the byte\n level, they may be counter-intuitive to users. For example, the\n strings ``u"\\u00C7"`` and ``u"\\u0043\\u0327"`` compare differently,\n even 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[5] The implementation computes this efficiently, without constructing\n lists or sorting.\n\n[6] Earlier versions of Python used lexicographic comparison of the\n sorted (key, value) lists, but this was very expensive for the\n common case of comparing for equality. An even earlier version of\n Python compared dictionaries by identity only, but this caused\n surprises because people expected to be able to test a dictionary\n for emptiness by comparing it to ``{}``.\n\n[7] 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[8] The ``%`` operator is also used for string formatting; the same\n precedence applies.\n\n[9] 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': u'\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': u'\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. The result type is that of the\narguments after coercion.\n\nWith mixed operand types, the coercion rules for binary arithmetic\noperators apply. For int and long int operands, the result has the\nsame type as the operands (after coercion) unless the second argument\nis negative; in that case, all arguments are converted to float and a\nfloat result is delivered. For example, ``10**2`` returns ``100``, but\n``10**-2`` returns ``0.01``. (This last feature was added in Python\n2.2. In Python 2.1 and before, if both arguments were of integer types\nand the second argument was negative, an exception was raised).\n\nRaising ``0.0`` to a negative power results in a\n``ZeroDivisionError``. Raising a negative number to a fractional power\nresults in a ``ValueError``.\n', - 'print': u'\nThe ``print`` statement\n***********************\n\n print_stmt ::= "print" ([expression ("," expression)* [","]]\n | ">>" expression [("," expression)+ [","]])\n\n``print`` evaluates each expression in turn and writes the resulting\nobject to standard output (see below). If an object is not a string,\nit is first converted to a string using the rules for string\nconversions. The (resulting or original) string is then written. A\nspace is written before each object is (converted and) written, unless\nthe output system believes it is positioned at the beginning of a\nline. This is the case (1) when no characters have yet been written\nto standard output, (2) when the last character written to standard\noutput is a whitespace character except ``\' \'``, or (3) when the last\nwrite operation on standard output was not a ``print`` statement. (In\nsome cases it may be functional to write an empty string to standard\noutput for this reason.)\n\nNote: Objects which act like file objects but which are not the built-in\n file objects often do not properly emulate this aspect of the file\n object\'s behavior, so it is best not to rely on this.\n\nA ``\'\\n\'`` character is written at the end, unless the ``print``\nstatement ends with a comma. This is the only action if the statement\ncontains just the keyword ``print``.\n\nStandard output is defined as the file object named ``stdout`` in the\nbuilt-in module ``sys``. If no such object exists, or if it does not\nhave a ``write()`` method, a ``RuntimeError`` exception is raised.\n\n``print`` also has an extended form, defined by the second portion of\nthe syntax described above. This form is sometimes referred to as\n"``print`` chevron." In this form, the first expression after the\n``>>`` must evaluate to a "file-like" object, specifically an object\nthat has a ``write()`` method as described above. With this extended\nform, the subsequent expressions are printed to this file object. If\nthe first expression evaluates to ``None``, then ``sys.stdout`` is\nused as the file for output.\n', - 'raise': u'\nThe ``raise`` statement\n***********************\n\n raise_stmt ::= "raise" [expression ["," expression ["," 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 ``TypeError`` exception is raised indicating that\nthis is an error (if running under IDLE, a ``Queue.Empty`` exception\nis raised instead).\n\nOtherwise, ``raise`` evaluates the expressions to get three objects,\nusing ``None`` as the value of omitted expressions. The first two\nobjects are used to determine the *type* and *value* of the exception.\n\nIf the first object is an instance, the type of the exception is the\nclass of the instance, the instance itself is the value, and the\nsecond object must be ``None``.\n\nIf the first object is a class, it becomes the type of the exception.\nThe second object is used to determine the exception value: If it is\nan instance of the class, the instance becomes the exception value. If\nthe second object is a tuple, it is used as the argument list for the\nclass constructor; if it is ``None``, an empty argument list is used,\nand any other object is treated as a single argument to the\nconstructor. The instance so created by calling the constructor is\nused as the exception value.\n\nIf a third object is present and not ``None``, it must be a traceback\nobject (see section *The standard type hierarchy*), and it is\nsubstituted instead of the current location as the place where the\nexception occurred. If the third object is present and not a\ntraceback object or ``None``, a ``TypeError`` exception is raised.\nThe three-expression form of ``raise`` is useful to re-raise an\nexception transparently in an except clause, but ``raise`` with no\nexpressions should be preferred if the exception to be re-raised was\nthe most recently active exception in the current scope.\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': u'\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', - 'sequence-methods': u'\nAdditional methods for emulation of sequence types\n**************************************************\n\nThe following optional methods can be defined to further emulate\nsequence objects. Immutable sequences methods should at most only\ndefine ``__getslice__()``; mutable sequences might define all three\nmethods.\n\nobject.__getslice__(self, i, j)\n\n Deprecated since version 2.0: Support slice objects as parameters\n to the ``__getitem__()`` method. (However, built-in types in\n CPython currently still implement ``__getslice__()``. Therefore,\n you have to override it in derived classes when implementing\n slicing.)\n\n Called to implement evaluation of ``self[i:j]``. The returned\n object should be of the same type as *self*. Note that missing *i*\n or *j* in the slice expression are replaced by zero or\n ``sys.maxint``, respectively. If negative indexes are used in the\n slice, the length of the sequence is added to that index. If the\n instance does not implement the ``__len__()`` method, an\n ``AttributeError`` is raised. No guarantee is made that indexes\n adjusted this way are not still negative. Indexes which are\n greater than the length of the sequence are not modified. If no\n ``__getslice__()`` is found, a slice object is created instead, and\n passed to ``__getitem__()`` instead.\n\nobject.__setslice__(self, i, j, sequence)\n\n Called to implement assignment to ``self[i:j]``. Same notes for *i*\n and *j* as for ``__getslice__()``.\n\n This method is deprecated. If no ``__setslice__()`` is found, or\n for extended slicing of the form ``self[i:j:k]``, a slice object is\n created, and passed to ``__setitem__()``, instead of\n ``__setslice__()`` being called.\n\nobject.__delslice__(self, i, j)\n\n Called to implement deletion of ``self[i:j]``. Same notes for *i*\n and *j* as for ``__getslice__()``. This method is deprecated. If no\n ``__delslice__()`` is found, or for extended slicing of the form\n ``self[i:j:k]``, a slice object is created, and passed to\n ``__delitem__()``, instead of ``__delslice__()`` being called.\n\nNotice that these methods are only invoked when a single slice with a\nsingle colon is used, and the slice method is available. For slice\noperations involving extended slice notation, or in absence of the\nslice methods, ``__getitem__()``, ``__setitem__()`` or\n``__delitem__()`` is called with a slice object as argument.\n\nThe following example demonstrate how to make your program or module\ncompatible with earlier versions of Python (assuming that methods\n``__getitem__()``, ``__setitem__()`` and ``__delitem__()`` support\nslice objects as arguments):\n\n class MyClass:\n ...\n def __getitem__(self, index):\n ...\n def __setitem__(self, index, value):\n ...\n def __delitem__(self, index):\n ...\n\n if sys.version_info < (2, 0):\n # They won\'t be defined if version is at least 2.0 final\n\n def __getslice__(self, i, j):\n return self[max(0, i):max(0, j):]\n def __setslice__(self, i, j, seq):\n self[max(0, i):max(0, j):] = seq\n def __delslice__(self, i, j):\n del self[max(0, i):max(0, j):]\n ...\n\nNote the calls to ``max()``; these are necessary because of the\nhandling of negative indices before the ``__*slice__()`` methods are\ncalled. When negative indexes are used, the ``__*item__()`` methods\nreceive them as provided, but the ``__*slice__()`` methods get a\n"cooked" form of the index values. For each negative index value, the\nlength of the sequence is added to the index before calling the method\n(which may still result in a negative index); this is the customary\nhandling of negative indexes by the built-in sequence types, and the\n``__*item__()`` methods are expected to do this as well. However,\nsince they should already be doing that, negative indexes cannot be\npassed in; they must be constrained to the bounds of the sequence\nbefore being passed to the ``__*item__()`` methods. Calling ``max(0,\ni)`` conveniently returns the proper value.\n', - 'sequence-types': u"\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. (For backwards compatibility, the method\n``__getslice__()`` (see below) can also be defined to handle simple,\nbut not extended slices.) It is also recommended that mappings provide\nthe methods ``keys()``, ``values()``, ``items()``, ``has_key()``,\n``get()``, ``clear()``, ``setdefault()``, ``iterkeys()``,\n``itervalues()``, ``iteritems()``, ``pop()``, ``popitem()``,\n``copy()``, and ``update()`` behaving similar to those for Python's\nstandard dictionary objects. The ``UserDict`` module provides a\n``DictMixin`` class to help create those methods from a base set of\n``__getitem__()``, ``__setitem__()``, ``__delitem__()``, and\n``keys()``. Mutable sequences should provide methods ``append()``,\n``count()``, ``index()``, ``extend()``, ``insert()``, ``pop()``,\n``remove()``, ``reverse()`` and ``sort()``, like Python standard list\nobjects. Finally, sequence types should implement addition (meaning\nconcatenation) and multiplication (meaning repetition) by defining the\nmethods ``__add__()``, ``__radd__()``, ``__iadd__()``, ``__mul__()``,\n``__rmul__()`` and ``__imul__()`` described below; they should not\ndefine ``__coerce__()`` or other numerical operators. It is\nrecommended that both mappings and sequences implement the\n``__contains__()`` method to allow efficient use of the ``in``\noperator; for mappings, ``in`` should be equivalent of ``has_key()``;\nfor sequences, 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``iterkeys()``; 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 ``__nonzero__()`` method and whose\n ``__len__()`` method returns zero is considered to be false in a\n Boolean context.\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 ``iterkeys()``.\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\n New in version 2.6.\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': u'\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 plain or long integers as arguments. The\narguments are converted to a common type. 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,\nn)``. Negative shift counts raise a ``ValueError`` exception.\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': u'\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 ::= simple_slicing | extended_slicing\n simple_slicing ::= primary "[" short_slice "]"\n extended_slicing ::= primary "[" slice_list "]"\n slice_list ::= slice_item ("," slice_item)* [","]\n slice_item ::= expression | proper_slice | ellipsis\n proper_slice ::= short_slice | long_slice\n short_slice ::= [lower_bound] ":" [upper_bound]\n long_slice ::= short_slice ":" [stride]\n lower_bound ::= expression\n upper_bound ::= expression\n stride ::= expression\n ellipsis ::= "..."\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 nor ellipses). Similarly, when the slice\nlist has exactly one short slice and no trailing comma, the\ninterpretation as a simple slicing takes priority over that as an\nextended slicing.\n\nThe semantics for a simple slicing are as follows. The primary must\nevaluate to a sequence object. The lower and upper bound expressions,\nif present, must evaluate to plain integers; defaults are zero and the\n``sys.maxint``, respectively. If either bound is negative, the\nsequence\'s length is added to it. The slicing now selects all items\nwith index *k* such that ``i <= k < j`` where *i* and *j* are the\nspecified lower and upper bounds. This may be an empty sequence. It\nis not an error if *i* or *j* lie outside the range of valid indexes\n(such items don\'t exist so they aren\'t selected).\n\nThe semantics for an extended slicing are as follows. The primary\nmust evaluate to a mapping object, and it is indexed with a key that\nis constructed 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 an ellipsis slice\nitem is the built-in ``Ellipsis`` object. The conversion of a proper\nslice is a slice object (see section *The standard type hierarchy*)\nwhose ``start``, ``stop`` and ``step`` attributes are the values of\nthe expressions given as lower bound, upper bound and stride,\nrespectively, substituting ``None`` for missing expressions.\n', - 'specialattrs': u"\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\nobject.__methods__\n\n Deprecated since version 2.2: Use the built-in function ``dir()``\n to get a list of an object's attributes. This attribute is no\n longer available.\n\nobject.__members__\n\n Deprecated since version 2.2: Use the built-in function ``dir()``\n to get a list of an object's attributes. This attribute is no\n longer available.\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\nThe following attributes are only supported by *new-style class*es.\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 new-style class keeps a list of weak references to its\n immediate subclasses. This method returns a list of all those\n references still alive. Example:\n\n >>> int.__subclasses__()\n []\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] To format only a tuple you should therefore provide a singleton\n tuple whose only element is the tuple to be formatted.\n\n[5] The advantage of leaving the newline on is that returning an empty\n string is then an unambiguous EOF indication. It is also possible\n (in cases where it might matter, for example, if you want to make\n an exact copy of a file while scanning its lines) to tell whether\n the last line of a file ended in a newline or not (yes this\n happens!).\n", - 'specialnames': u'\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 ``x.__getitem__(i)`` for\nold-style classes and ``type(x).__getitem__(x, i)`` for new-style\nclasses. Except where mentioned, attempts to execute an operation\nraise an 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_traceback`` 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.exc_traceback`` or ``sys.last_traceback``. Circular\n references which are garbage are detected when the option cycle\n detector is enabled (it\'s on by default), but can only be cleaned\n up if there are no Python-level ``__del__()`` methods involved.\n Refer to the documentation for the ``gc`` module for more\n information about how ``__del__()`` methods are handled by the\n cycle detector, particularly the description of the ``garbage``\n 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 and by string\n conversions (reverse quotes) to compute the "official" string\n representation of an object. If at all possible, this should look\n like a valid Python expression that could be used to recreate an\n object with the same value (given an appropriate environment). If\n this is not possible, a string of the form ``<...some useful\n description...>`` should be returned. The return value must be a\n string object. If a class defines ``__repr__()`` but not\n ``__str__()``, then ``__repr__()`` is also used when an "informal"\n string representation of instances of that class is 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 statement 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.__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 New in version 2.1.\n\n These are the so-called "rich comparison" methods, and are called\n for comparison operators in preference to ``__cmp__()`` below. The\n correspondence between operator symbols and method names is as\n follows: ``xy`` call ``x.__ne__(y)``, ``x>y`` calls ``x.__gt__(y)``, and\n ``x>=y`` calls ``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.__cmp__(self, other)\n\n Called by comparison operations if rich comparison (see above) is\n not defined. Should return a negative integer if ``self < other``,\n zero if ``self == other``, a positive integer if ``self > other``.\n If no ``__cmp__()``, ``__eq__()`` or ``__ne__()`` operation is\n defined, class instances are compared by object identity\n ("address"). See also the description of ``__hash__()`` for some\n important notes on creating *hashable* objects which support custom\n comparison operations and are usable as dictionary keys. (Note: the\n restriction that exceptions are not propagated by ``__cmp__()`` has\n been removed since Python 1.5.)\n\nobject.__rcmp__(self, other)\n\n Changed in version 2.1: No longer supported.\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 a ``__cmp__()`` or ``__eq__()`` method\n it should not define a ``__hash__()`` operation either; if it\n defines ``__cmp__()`` or ``__eq__()`` but not ``__hash__()``, its\n instances will not be usable in hashed collections. If a class\n defines mutable objects and implements a ``__cmp__()`` or\n ``__eq__()`` method, it should not implement ``__hash__()``, since\n hashable collection implementations require that a object\'s hash\n value is immutable (if the object\'s hash value changes, it will be\n in the wrong hash bucket).\n\n User-defined classes have ``__cmp__()`` 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 ``__cmp__()`` or ``__eq__()`` such that\n the hash value returned is no longer appropriate (e.g. by switching\n to a value-based concept of equality instead of the default\n identity based equality) can explicitly flag themselves as being\n unhashable by setting ``__hash__ = None`` in the class definition.\n Doing so means that not only will instances of the class raise an\n appropriate ``TypeError`` when a program attempts to retrieve their\n hash value, but they will also be correctly identified as\n unhashable when checking ``isinstance(obj, collections.Hashable)``\n (unlike classes which define their own ``__hash__()`` to explicitly\n raise ``TypeError``).\n\n Changed in version 2.5: ``__hash__()`` may now also return a long\n integer object; the 32-bit integer is then derived from the hash of\n that object.\n\n Changed in version 2.6: ``__hash__`` may now be set to ``None`` to\n explicitly flag instances of a class as unhashable.\n\nobject.__nonzero__(self)\n\n Called to implement truth value testing and the built-in operation\n ``bool()``; should return ``False`` or ``True``, or their integer\n equivalents ``0`` or ``1``. When this method is not defined,\n ``__len__()`` is called, if it is defined, and the object is\n considered true if its result is nonzero. If a class defines\n neither ``__len__()`` nor ``__nonzero__()``, all its instances are\n considered true.\n\nobject.__unicode__(self)\n\n Called to implement ``unicode()`` built-in; should return a Unicode\n object. When this method is not defined, string conversion is\n attempted, and the result of string conversion is converted to\n Unicode using the system default encoding.\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 in new-style classes.\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 not simply execute ``self.name = value`` --- this would\n cause a recursive call to itself. Instead, it should insert the\n value in the dictionary of instance attributes, e.g.,\n ``self.__dict__[name] = value``. For new-style classes, rather\n than accessing the instance dictionary, it should call the base\n 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\n\nMore attribute access for new-style classes\n-------------------------------------------\n\nThe following methods only apply to new-style classes.\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 for new-style\n classes*.\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. Note that descriptors are only invoked for new\nstyle objects or classes (ones that subclass ``object()`` or\n``type()``).\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 a new-style object instance, ``a.x`` is transformed\n into the call: ``type(a).__dict__[\'x\'].__get__(a, type(a))``.\n\nClass Binding\n If binding to a new-style class, ``A.x`` is transformed into the\n call: ``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 both old and new-style classes have a\ndictionary for attribute storage. This wastes space for objects\nhaving very few instance variables. The space consumption can become\nacute when creating large numbers of instances.\n\nThe default can be overridden by defining *__slots__* in a new-style\nclass definition. The *__slots__* declaration takes a sequence of\ninstance variables and reserves just enough space in each instance to\nhold a value for each variable. Space is saved because *__dict__* is\nnot created for each instance.\n\n__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 new-style class, *__slots__* reserves space for the declared\n variables and prevents the automatic creation of *__dict__* and\n *__weakref__* for each instance.\n\n New in version 2.2.\n\nNotes on using *__slots__*\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 Changed in version 2.3: Previously, adding ``\'__dict__\'`` to the\n *__slots__* declaration would not enable the assignment of new\n attributes not specifically listed in the sequence of instance\n variable names.\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 Changed in version 2.3: Previously, adding ``\'__weakref__\'`` to the\n *__slots__* declaration would not enable support for weak\n references.\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 ``long``, ``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 Changed in version 2.6: Previously, *__class__* assignment raised an\n error if either new or old class had *__slots__*.\n\n\nCustomizing class creation\n==========================\n\nBy default, new-style classes are constructed using ``type()``. A\nclass definition is read into a separate namespace and the value of\nclass name is bound to the result of ``type(name, bases, dict)``.\n\nWhen the class definition is read, if *__metaclass__* is defined then\nthe callable assigned to it will be called instead of ``type()``. 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\n__metaclass__\n\n This variable can be any callable accepting arguments for ``name``,\n ``bases``, and ``dict``. Upon class creation, the callable is used\n instead of the built-in ``type()``.\n\n New in version 2.2.\n\nThe appropriate metaclass is determined by the following precedence\nrules:\n\n* If ``dict[\'__metaclass__\']`` exists, it is used.\n\n* Otherwise, if there is at least one base class, its metaclass is\n used (this looks for a *__class__* attribute first and if not found,\n uses its type).\n\n* Otherwise, if a global variable named __metaclass__ exists, it is\n used.\n\n* Otherwise, the old-style, classic metaclass (types.ClassType) is\n 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\n\nCustomizing instance and subclass checks\n========================================\n\nNew in version 2.6.\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. (For backwards compatibility, the method\n``__getslice__()`` (see below) can also be defined to handle simple,\nbut not extended slices.) It is also recommended that mappings provide\nthe methods ``keys()``, ``values()``, ``items()``, ``has_key()``,\n``get()``, ``clear()``, ``setdefault()``, ``iterkeys()``,\n``itervalues()``, ``iteritems()``, ``pop()``, ``popitem()``,\n``copy()``, and ``update()`` behaving similar to those for Python\'s\nstandard dictionary objects. The ``UserDict`` module provides a\n``DictMixin`` class to help create those methods from a base set of\n``__getitem__()``, ``__setitem__()``, ``__delitem__()``, and\n``keys()``. Mutable sequences should provide methods ``append()``,\n``count()``, ``index()``, ``extend()``, ``insert()``, ``pop()``,\n``remove()``, ``reverse()`` and ``sort()``, like Python standard list\nobjects. Finally, sequence types should implement addition (meaning\nconcatenation) and multiplication (meaning repetition) by defining the\nmethods ``__add__()``, ``__radd__()``, ``__iadd__()``, ``__mul__()``,\n``__rmul__()`` and ``__imul__()`` described below; they should not\ndefine ``__coerce__()`` or other numerical operators. It is\nrecommended that both mappings and sequences implement the\n``__contains__()`` method to allow efficient use of the ``in``\noperator; for mappings, ``in`` should be equivalent of ``has_key()``;\nfor sequences, 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``iterkeys()``; 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 ``__nonzero__()`` method and whose\n ``__len__()`` method returns zero is considered to be false in a\n Boolean context.\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 ``iterkeys()``.\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\n New in version 2.6.\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\nAdditional methods for emulation of sequence types\n==================================================\n\nThe following optional methods can be defined to further emulate\nsequence objects. Immutable sequences methods should at most only\ndefine ``__getslice__()``; mutable sequences might define all three\nmethods.\n\nobject.__getslice__(self, i, j)\n\n Deprecated since version 2.0: Support slice objects as parameters\n to the ``__getitem__()`` method. (However, built-in types in\n CPython currently still implement ``__getslice__()``. Therefore,\n you have to override it in derived classes when implementing\n slicing.)\n\n Called to implement evaluation of ``self[i:j]``. The returned\n object should be of the same type as *self*. Note that missing *i*\n or *j* in the slice expression are replaced by zero or\n ``sys.maxint``, respectively. If negative indexes are used in the\n slice, the length of the sequence is added to that index. If the\n instance does not implement the ``__len__()`` method, an\n ``AttributeError`` is raised. No guarantee is made that indexes\n adjusted this way are not still negative. Indexes which are\n greater than the length of the sequence are not modified. If no\n ``__getslice__()`` is found, a slice object is created instead, and\n passed to ``__getitem__()`` instead.\n\nobject.__setslice__(self, i, j, sequence)\n\n Called to implement assignment to ``self[i:j]``. Same notes for *i*\n and *j* as for ``__getslice__()``.\n\n This method is deprecated. If no ``__setslice__()`` is found, or\n for extended slicing of the form ``self[i:j:k]``, a slice object is\n created, and passed to ``__setitem__()``, instead of\n ``__setslice__()`` being called.\n\nobject.__delslice__(self, i, j)\n\n Called to implement deletion of ``self[i:j]``. Same notes for *i*\n and *j* as for ``__getslice__()``. This method is deprecated. If no\n ``__delslice__()`` is found, or for extended slicing of the form\n ``self[i:j:k]``, a slice object is created, and passed to\n ``__delitem__()``, instead of ``__delslice__()`` being called.\n\nNotice that these methods are only invoked when a single slice with a\nsingle colon is used, and the slice method is available. For slice\noperations involving extended slice notation, or in absence of the\nslice methods, ``__getitem__()``, ``__setitem__()`` or\n``__delitem__()`` is called with a slice object as argument.\n\nThe following example demonstrate how to make your program or module\ncompatible with earlier versions of Python (assuming that methods\n``__getitem__()``, ``__setitem__()`` and ``__delitem__()`` support\nslice objects as arguments):\n\n class MyClass:\n ...\n def __getitem__(self, index):\n ...\n def __setitem__(self, index, value):\n ...\n def __delitem__(self, index):\n ...\n\n if sys.version_info < (2, 0):\n # They won\'t be defined if version is at least 2.0 final\n\n def __getslice__(self, i, j):\n return self[max(0, i):max(0, j):]\n def __setslice__(self, i, j, seq):\n self[max(0, i):max(0, j):] = seq\n def __delslice__(self, i, j):\n del self[max(0, i):max(0, j):]\n ...\n\nNote the calls to ``max()``; these are necessary because of the\nhandling of negative indices before the ``__*slice__()`` methods are\ncalled. When negative indexes are used, the ``__*item__()`` methods\nreceive them as provided, but the ``__*slice__()`` methods get a\n"cooked" form of the index values. For each negative index value, the\nlength of the sequence is added to the index before calling the method\n(which may still result in a negative index); this is the customary\nhandling of negative indexes by the built-in sequence types, and the\n``__*item__()`` methods are expected to do this as well. However,\nsince they should already be doing that, negative indexes cannot be\npassed in; they must be constrained to the bounds of the sequence\nbefore being passed to the ``__*item__()`` methods. Calling ``max(0,\ni)`` conveniently returns the proper value.\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.__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 (``+``, ``-``, ``*``, ``//``, ``%``, ``divmod()``,\n ``pow()``, ``**``, ``<<``, ``>>``, ``&``, ``^``, ``|``). For\n instance, to evaluate the expression ``x + y``, where *x* is an\n 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__()`` (described below). Note\n that ``__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.__div__(self, other)\nobject.__truediv__(self, other)\n\n The division operator (``/``) is implemented by these methods. The\n ``__truediv__()`` method is used when ``__future__.division`` is in\n effect, otherwise ``__div__()`` is used. If only one of these two\n methods is defined, the object will not support division in the\n alternate context; ``TypeError`` will be raised instead.\n\nobject.__radd__(self, other)\nobject.__rsub__(self, other)\nobject.__rmul__(self, other)\nobject.__rdiv__(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 (``+``, ``-``, ``*``, ``/``, ``%``, ``divmod()``,\n ``pow()``, ``**``, ``<<``, ``>>``, ``&``, ``^``, ``|``) with\n reflected (swapped) operands. These functions are only called if\n the left operand does not support the corresponding operation and\n the operands are of different types. [2] For instance, to evaluate\n the expression ``x - y``, where *y* is an instance of a class that\n has an ``__rsub__()`` method, ``y.__rsub__(x)`` is called if\n ``x.__sub__(y)`` returns *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.__idiv__(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.__long__(self)\nobject.__float__(self)\n\n Called to implement the built-in functions ``complex()``,\n ``int()``, ``long()``, and ``float()``. Should return a value of\n the appropriate type.\n\nobject.__oct__(self)\nobject.__hex__(self)\n\n Called to implement the built-in functions ``oct()`` and ``hex()``.\n Should return a string value.\n\nobject.__index__(self)\n\n Called to implement ``operator.index()``. Also called whenever\n Python needs an integer object (such as in slicing). Must return\n an integer (int or long).\n\n New in version 2.5.\n\nobject.__coerce__(self, other)\n\n Called to implement "mixed-mode" numeric arithmetic. Should either\n return a 2-tuple containing *self* and *other* converted to a\n common numeric type, or ``None`` if conversion is impossible. When\n the common type would be the type of ``other``, it is sufficient to\n return ``None``, since the interpreter will also ask the other\n object to attempt a coercion (but sometimes, if the implementation\n of the other type cannot be changed, it is useful to do the\n conversion to the other type here). A return value of\n ``NotImplemented`` is equivalent to returning ``None``.\n\n\nCoercion rules\n==============\n\nThis section used to document the rules for coercion. As the language\nhas evolved, the coercion rules have become hard to document\nprecisely; documenting what one version of one particular\nimplementation does is undesirable. Instead, here are some informal\nguidelines regarding coercion. In Python 3.0, coercion will not be\nsupported.\n\n* If the left operand of a % operator is a string or Unicode object,\n no coercion takes place and the string formatting operation is\n invoked instead.\n\n* It is no longer recommended to define a coercion operation. Mixed-\n mode operations on types that don\'t define coercion pass the\n original arguments to the operation.\n\n* New-style classes (those derived from ``object``) never invoke the\n ``__coerce__()`` method in response to a binary operator; the only\n time ``__coerce__()`` is invoked is when the built-in function\n ``coerce()`` is called.\n\n* For most intents and purposes, an operator that returns\n ``NotImplemented`` is treated the same as one that is not\n implemented at all.\n\n* Below, ``__op__()`` and ``__rop__()`` are used to signify the\n generic method names corresponding to an operator; ``__iop__()`` is\n used for the corresponding in-place operator. For example, for the\n operator \'``+``\', ``__add__()`` and ``__radd__()`` are used for the\n left and right variant of the binary operator, and ``__iadd__()``\n for the in-place variant.\n\n* For objects *x* and *y*, first ``x.__op__(y)`` is tried. If this is\n not implemented or returns ``NotImplemented``, ``y.__rop__(x)`` is\n tried. If this is also not implemented or returns\n ``NotImplemented``, a ``TypeError`` exception is raised. But see\n the following exception:\n\n* Exception to the previous item: if the left operand is an instance\n of a built-in type or a new-style class, and the right operand is an\n instance of a proper subclass of that type or class and overrides\n the base\'s ``__rop__()`` method, the right operand\'s ``__rop__()``\n method is tried *before* the left operand\'s ``__op__()`` method.\n\n This is done so that a subclass can completely override binary\n operators. Otherwise, the left operand\'s ``__op__()`` method would\n always accept the right operand: when an instance of a given class\n is expected, an instance of a subclass of that class is always\n acceptable.\n\n* When either operand type defines a coercion, this coercion is called\n before that type\'s ``__op__()`` or ``__rop__()`` method is called,\n but no sooner. If the coercion returns an object of a different\n type for the operand whose coercion is invoked, part of the process\n is redone using the new object.\n\n* When an in-place operator (like \'``+=``\') is used, if the left\n operand implements ``__iop__()``, it is invoked without any\n coercion. When the operation falls back to ``__op__()`` and/or\n ``__rop__()``, the normal coercion rules apply.\n\n* In ``x + y``, if *x* is a sequence that implements sequence\n concatenation, sequence concatenation is invoked.\n\n* In ``x * y``, if one operator is a sequence that implements sequence\n repetition, and the other is an integer (``int`` or ``long``),\n sequence repetition is invoked.\n\n* Rich comparisons (implemented by methods ``__eq__()`` and so on)\n never use coercion. Three-way comparison (implemented by\n ``__cmp__()``) does use coercion under the same conditions as other\n binary operations use it.\n\n* In the current implementation, the built-in numeric types ``int``,\n ``long``, ``float``, and ``complex`` do not use coercion. All these\n types implement a ``__coerce__()`` method, for use by the built-in\n ``coerce()`` function.\n\n Changed in version 2.7.\n\n\nWith Statement Context Managers\n===============================\n\nNew in version 2.5.\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 for old-style classes\n===========================================\n\nFor old-style classes, special methods are always looked up in exactly\nthe same way as any other method or attribute. This is the case\nregardless of whether the method is being looked up explicitly as in\n``x.__getitem__(i)`` or implicitly as in ``x[i]``.\n\nThis behaviour means that special methods may exhibit different\nbehaviour for different instances of a single old-style class if the\nappropriate special attributes are set differently:\n\n >>> class C:\n ... pass\n ...\n >>> c1 = C()\n >>> c2 = C()\n >>> c1.__len__ = lambda: 5\n >>> c2.__len__ = lambda: 9\n >>> len(c1)\n 5\n >>> len(c2)\n 9\n\n\nSpecial method lookup for new-style classes\n===========================================\n\nFor new-style classes, implicit invocations of special methods are\nonly guaranteed to work correctly if defined on an object\'s type, not\nin the object\'s instance dictionary. That behaviour is the reason why\nthe following code raises an exception (unlike the equivalent example\nwith old-style classes):\n\n >>> class C(object):\n ... pass\n ...\n >>> c = C()\n >>> c.__len__ = lambda: 5\n >>> len(c)\n Traceback (most recent call last):\n File "", line 1, in \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 "", line 1, in \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):\n ... __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-conversions': u'\nString conversions\n******************\n\nA string conversion is an expression list enclosed in reverse (a.k.a.\nbackward) quotes:\n\n string_conversion ::= "\'" expression_list "\'"\n\nA string conversion evaluates the contained expression list and\nconverts the resulting object into a string according to rules\nspecific to its type.\n\nIf the object is a string, a number, ``None``, or a tuple, list or\ndictionary containing only objects whose type is one of these, the\nresulting string is a valid Python expression which can be passed to\nthe built-in function ``eval()`` to yield an expression with the same\nvalue (or an approximation, if floating point numbers are involved).\n\n(In particular, converting a string adds quotes around it and converts\n"funny" characters to escape sequences that are safe to print.)\n\nRecursive objects (for example, lists or dictionaries that contain a\nreference to themselves, directly or indirectly) use ``...`` to\nindicate a recursive reference, and the result cannot be passed to\n``eval()`` to get an equal value (``SyntaxError`` will be raised\ninstead).\n\nThe built-in function ``repr()`` performs exactly the same conversion\nin its argument as enclosing it in parentheses and reverse quotes\ndoes. The built-in function ``str()`` performs a similar but more\nuser-friendly conversion.\n', - 'string-methods': u'\nString Methods\n**************\n\nBelow are listed the string methods which both 8-bit strings and\nUnicode objects support. Some of them are also available on\n``bytearray`` objects.\n\nIn addition, Python\'s strings support the sequence type methods\ndescribed in the *Sequence Types --- str, unicode, list, tuple,\nbytearray, buffer, xrange* section. To output formatted strings use\ntemplate strings or the ``%`` operator described in the *String\nFormatting Operations* section. Also, see the ``re`` module for string\nfunctions based 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\n For 8-bit strings, this method is locale-dependent.\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\n Changed in version 2.4: Support for the *fillchar* argument.\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.decode([encoding[, errors]])\n\n Decodes the string using the codec registered for *encoding*.\n *encoding* defaults to the default string encoding. *errors* may\n be given to set a different error handling scheme. The default is\n ``\'strict\'``, meaning that encoding errors raise ``UnicodeError``.\n Other possible values are ``\'ignore\'``, ``\'replace\'`` and any other\n name registered via ``codecs.register_error()``, see section *Codec\n Base Classes*.\n\n New in version 2.2.\n\n Changed in version 2.3: Support for other error handling schemes\n added.\n\n Changed in version 2.7: Support for keyword arguments added.\n\nstr.encode([encoding[, errors]])\n\n Return an encoded version of the string. Default encoding is the\n current default string encoding. *errors* may be given to set a\n different error handling scheme. The default for *errors* is\n ``\'strict\'``, meaning that encoding errors raise a\n ``UnicodeError``. Other possible values are ``\'ignore\'``,\n ``\'replace\'``, ``\'xmlcharrefreplace\'``, ``\'backslashreplace\'`` and\n any other name registered via ``codecs.register_error()``, see\n section *Codec Base Classes*. For a list of possible encodings, see\n section *Standard Encodings*.\n\n New in version 2.0.\n\n Changed in version 2.3: Support for ``\'xmlcharrefreplace\'`` and\n ``\'backslashreplace\'`` and other error handling schemes added.\n\n Changed in version 2.7: 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\n Changed in version 2.5: Accept tuples as *suffix*.\n\nstr.expandtabs([tabsize])\n\n Return a copy of the string where all tab characters are replaced\n by one 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\n This method of string formatting is the new standard in Python 3.0,\n and should be preferred to the ``%`` formatting described in\n *String Formatting Operations* in new code.\n\n New in version 2.6.\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.\n\n For 8-bit strings, this method is locale-dependent.\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.\n\n For 8-bit strings, this method is locale-dependent.\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.\n\n For 8-bit strings, this method is locale-dependent.\n\nstr.islower()\n\n Return true if all cased characters in the string are lowercase and\n there is at least one cased character, false otherwise.\n\n For 8-bit strings, this method is locale-dependent.\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.\n\n For 8-bit strings, this method is locale-dependent.\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\n For 8-bit strings, this method is locale-dependent.\n\nstr.isupper()\n\n Return true if all cased characters in the string are uppercase and\n there is at least one cased character, false otherwise.\n\n For 8-bit strings, this method is locale-dependent.\n\nstr.join(iterable)\n\n Return a string which is the concatenation of the strings in the\n *iterable* *iterable*. The separator between elements is the\n 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\n ``len(s)``.\n\n Changed in version 2.4: Support for the *fillchar* argument.\n\nstr.lower()\n\n Return a copy of the string converted to lowercase.\n\n For 8-bit strings, this method is locale-dependent.\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\n Changed in version 2.2.2: Support for the *chars* argument.\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\n New in version 2.5.\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\n ``len(s)``.\n\n Changed in version 2.4: Support for the *fillchar* argument.\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\n New in version 2.5.\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\n New in version 2.4.\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\n Changed in version 2.2.2: Support for the *chars* argument.\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\n Changed in version 2.5: Accept tuples as *prefix*.\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\n Changed in version 2.2.2: Support for the *chars* argument.\n\nstr.swapcase()\n\n Return a copy of the string with uppercase characters converted to\n lowercase and vice versa.\n\n For 8-bit strings, this method is locale-dependent.\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\n For 8-bit strings, this method is locale-dependent.\n\nstr.translate(table[, deletechars])\n\n Return a copy of the string where all characters occurring in the\n optional argument *deletechars* are removed, and the remaining\n characters have been mapped through the given translation table,\n which must be a string of length 256.\n\n You can use the ``maketrans()`` helper function in the ``string``\n module to create a translation table. For string objects, set the\n *table* argument to ``None`` for translations that only delete\n characters:\n\n >>> \'read this short text\'.translate(None, \'aeiou\')\n \'rd ths shrt txt\'\n\n New in version 2.6: Support for a ``None`` *table* argument.\n\n For Unicode objects, the ``translate()`` method does not accept the\n optional *deletechars* argument. Instead, it returns a copy of the\n *s* where all characters have been mapped through the given\n translation table which must be a mapping of Unicode ordinals to\n Unicode ordinals, Unicode strings or ``None``. Unmapped characters\n are left untouched. Characters mapped to ``None`` are deleted.\n Note, a more flexible approach is to create a custom character\n mapping codec using the ``codecs`` module (see ``encodings.cp1251``\n for an example).\n\nstr.upper()\n\n Return a copy of the string converted to uppercase.\n\n For 8-bit strings, this method is locale-dependent.\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 ``len(s)``.\n\n New in version 2.2.2.\n\nThe following methods are present only on unicode objects:\n\nunicode.isnumeric()\n\n Return ``True`` if there are only numeric characters in S,\n ``False`` otherwise. Numeric characters include digit characters,\n and all characters that have the Unicode numeric value property,\n e.g. U+2155, VULGAR FRACTION ONE FIFTH.\n\nunicode.isdecimal()\n\n Return ``True`` if there are only decimal characters in S,\n ``False`` otherwise. Decimal characters include digit characters,\n and all characters that that can be used to form decimal-radix\n numbers, e.g. U+0660, ARABIC-INDIC DIGIT ZERO.\n', - 'strings': u'\nString literals\n***************\n\nString literals are described by the following lexical definitions:\n\n stringliteral ::= [stringprefix](shortstring | longstring)\n stringprefix ::= "r" | "u" | "ur" | "R" | "U" | "UR" | "Ur" | "uR"\n | "b" | "B" | "br" | "Br" | "bR" | "BR"\n shortstring ::= "\'" shortstringitem* "\'" | \'"\' shortstringitem* \'"\'\n longstring ::= "\'\'\'" longstringitem* "\'\'\'"\n | \'"""\' longstringitem* \'"""\'\n shortstringitem ::= shortstringchar | escapeseq\n longstringitem ::= longstringchar | escapeseq\n shortstringchar ::= \n longstringchar ::= \n escapeseq ::= "\\" \n\nOne syntactic restriction not indicated by these productions is that\nwhitespace is not allowed between the **stringprefix** and the rest of\nthe string literal. The source character set is defined by the\nencoding declaration; it is ASCII if no encoding declaration is given\nin the source file; see section *Encoding declarations*.\n\nIn plain English: String literals can be enclosed in matching single\nquotes (``\'``) or double quotes (``"``). They can also be enclosed in\nmatching groups of three single or double quotes (these are generally\nreferred to as *triple-quoted strings*). The backslash (``\\``)\ncharacter is used to escape characters that otherwise have a special\nmeaning, such as newline, backslash itself, or the quote character.\nString literals may optionally be prefixed with a letter ``\'r\'`` or\n``\'R\'``; such strings are called *raw strings* and use different rules\nfor interpreting backslash escape sequences. A prefix of ``\'u\'`` or\n``\'U\'`` makes the string a Unicode string. Unicode strings use the\nUnicode character set as defined by the Unicode Consortium and ISO\n10646. Some additional escape sequences, described below, are\navailable in Unicode strings. A prefix of ``\'b\'`` or ``\'B\'`` is\nignored in Python 2; it indicates that the literal should become a\nbytes literal in Python 3 (e.g. when code is automatically converted\nwith 2to3). A ``\'u\'`` or ``\'b\'`` prefix may be followed by an ``\'r\'``\nprefix.\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`` | 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| ``\\N{name}`` | Character named *name* in the | |\n| | Unicode database (Unicode only) | |\n+-------------------+-----------------------------------+---------+\n| ``\\r`` | ASCII Carriage Return (CR) | |\n+-------------------+-----------------------------------+---------+\n| ``\\t`` | ASCII Horizontal Tab (TAB) | |\n+-------------------+-----------------------------------+---------+\n| ``\\uxxxx`` | Character with 16-bit hex value | (1) |\n| | *xxxx* (Unicode only) | |\n+-------------------+-----------------------------------+---------+\n| ``\\Uxxxxxxxx`` | Character with 32-bit hex value | (2) |\n| | *xxxxxxxx* (Unicode only) | |\n+-------------------+-----------------------------------+---------+\n| ``\\v`` | ASCII Vertical Tab (VT) | |\n+-------------------+-----------------------------------+---------+\n| ``\\ooo`` | Character with octal value *ooo* | (3,5) |\n+-------------------+-----------------------------------+---------+\n| ``\\xhh`` | Character with hex value *hh* | (4,5) |\n+-------------------+-----------------------------------+---------+\n\nNotes:\n\n1. Individual code units which form parts of a surrogate pair can be\n encoded using this escape sequence.\n\n2. 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). Individual code units which form parts of a surrogate\n pair can be encoded using this escape sequence.\n\n3. As in Standard C, up to three octal digits are accepted.\n\n4. Unlike in Standard C, exactly two hex digits are required.\n\n5. In a string literal, hexadecimal and octal escapes denote the byte\n with the given value; it is not necessary that the byte encodes a\n character in the source character set. In a Unicode literal, these\n escapes denote a Unicode character with the given value.\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 marked as "(Unicode only)"\nin the table above fall into the category of unrecognized escapes for\nnon-Unicode string literals.\n\nWhen an ``\'r\'`` or ``\'R\'`` prefix is present, a character following a\nbackslash is included in the string without change, and *all\nbackslashes are left in the string*. For example, the string literal\n``r"\\n"`` consists of two characters: a backslash and a lowercase\n``\'n\'``. String quotes can be escaped with a backslash, but the\nbackslash remains in the string; for example, ``r"\\""`` is a valid\nstring literal consisting of two characters: a backslash and a double\nquote; ``r"\\"`` is not a valid string literal (even a raw string\ncannot end in an odd number of backslashes). Specifically, *a raw\nstring cannot end in a single backslash* (since the backslash would\nescape 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\nWhen an ``\'r\'`` or ``\'R\'`` prefix is used in conjunction with a\n``\'u\'`` or ``\'U\'`` prefix, then the ``\\uXXXX`` and ``\\UXXXXXXXX``\nescape sequences are processed while *all other backslashes are left\nin the string*. For example, the string literal ``ur"\\u0062\\n"``\nconsists of three Unicode characters: \'LATIN SMALL LETTER B\', \'REVERSE\nSOLIDUS\', and \'LATIN SMALL LETTER N\'. Backslashes can be escaped with\na preceding backslash; however, both remain in the string. As a\nresult, ``\\uXXXX`` escape sequences are only recognized when there are\nan odd number of backslashes.\n', - 'subscriptions': u'\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 of a sequence or mapping type.\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 a\nplain integer. If this value is negative, the length of the sequence\nis added to it (so that, e.g., ``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).\n\nA string\'s items are characters. A character is not a separate data\ntype but a string of exactly one character.\n', - 'truth': u"\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``, ``0L``, ``0.0``,\n ``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 ``__nonzero__()`` or ``__len__()`` method, when that method returns\n the 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': u'\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\nChanged in version 2.5: In previous versions of Python,\n``try``...``except``...``finally`` did not work. ``try``...``except``\nhad to be nested in ``try``...``finally``.\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, a tuple containing an item compatible with the\nexception, or, in the (deprecated) case of string exceptions, is the\nraised string itself (note that the object identities must match, i.e.\nit must be the same string object, not just a string with the same\nvalue).\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 in that except clause, if present, and the except\nclause\'s suite is executed. All except clauses must have an\nexecutable block. When the end of this block is reached, execution\ncontinues normally after the entire try statement. (This means that\nif two nested handlers exist for the same exception, and the exception\noccurs in the try clause of the inner handler, the outer handler will\nnot handle the exception.)\n\nBefore an except clause\'s suite is executed, details about the\nexception are assigned to three variables in the ``sys`` module:\n``sys.exc_type`` receives the object identifying the exception;\n``sys.exc_value`` receives the exception\'s parameter;\n``sys.exc_traceback`` receives a traceback object (see section *The\nstandard type hierarchy*) identifying the point in the program where\nthe exception occurred. These details are also available through the\n``sys.exc_info()`` function, which returns a tuple ``(exc_type,\nexc_value, exc_traceback)``. Use of the corresponding variables is\ndeprecated in favor of this function, since their use is unsafe in a\nthreaded program. As of Python 1.5, the variables are restored to\ntheir previous values (before the call) when returning from a function\nthat 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 lost. The exception information is not available to the\nprogram during execution 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': u'\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.).\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 built-in name\n ``Ellipsis``. It is used to indicate the presence of the ``...``\n syntax in a slice. 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 three types of integers:\n\n Plain integers\n These represent numbers in the range -2147483648 through\n 2147483647. (The range may be larger on machines with a\n larger natural word size, but not smaller.) When the result\n of an operation would fall outside this range, the result is\n normally returned as a long integer (in some cases, the\n exception ``OverflowError`` is raised instead). For the\n purpose of shift and mask operations, integers are assumed to\n have a binary, 2\'s complement notation using 32 or more bits,\n and hiding no bits from the user (i.e., all 4294967296\n different bit patterns correspond to different values).\n\n Long integers\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\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 plain\n integers, 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 and the least surprises when\n switching between the plain and long integer domains. Any\n operation, if it yields a result in the plain integer domain,\n will yield the same result in the long integer domain or when\n using mixed operands. The switch between domains is transparent\n to the programmer.\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``\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 are characters. There is no separate\n character type; a character is represented by a string of one\n item. Characters represent (at least) 8-bit bytes. The\n built-in functions ``chr()`` and ``ord()`` convert between\n characters and nonnegative integers representing the byte\n values. Bytes with the values 0-127 usually represent the\n corresponding ASCII values, but the interpretation of values\n is up to the program. The string data type is also used to\n represent arrays of bytes, e.g., to hold data read from a\n file.\n\n (On systems whose native character set is not ASCII, strings\n may use EBCDIC in their internal representation, provided the\n functions ``chr()`` and ``ord()`` implement a mapping between\n ASCII and EBCDIC, and string comparison preserves the ASCII\n order. Or perhaps someone can propose a better rule?)\n\n Unicode\n The items of a Unicode object are Unicode code units. A\n Unicode code unit is represented by a Unicode 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 ``unichr()`` 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 Unicode method ``encode()`` and the\n built-in function ``unicode()``.\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 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.\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``, ``gdbm``, and ``bsddb`` provide\n additional examples of mapping types.\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 | ``func_doc`` | The function\'s documentation | Writable |\n | | string, or ``None`` if | |\n | | unavailable | |\n +-------------------------+---------------------------------+-------------+\n | ``__doc__`` | Another way of spelling | Writable |\n | | ``func_doc`` | |\n +-------------------------+---------------------------------+-------------+\n | ``func_name`` | The function\'s name | Writable |\n +-------------------------+---------------------------------+-------------+\n | ``__name__`` | Another way of spelling | Writable |\n | | ``func_name`` | |\n +-------------------------+---------------------------------+-------------+\n | ``__module__`` | The name of the module the | Writable |\n | | function was defined in, or | |\n | | ``None`` if unavailable. | |\n +-------------------------+---------------------------------+-------------+\n | ``func_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 | ``func_code`` | The code object representing | Writable |\n | | the compiled function body. | |\n +-------------------------+---------------------------------+-------------+\n | ``func_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 | ``func_dict`` | The namespace supporting | Writable |\n | | arbitrary function attributes. | |\n +-------------------------+---------------------------------+-------------+\n | ``func_closure`` | ``None`` or a tuple of cells | Read-only |\n | | that contain bindings for the | |\n | | function\'s free variables. | |\n +-------------------------+---------------------------------+-------------+\n\n Most of the attributes labelled "Writable" check the type of the\n assigned value.\n\n Changed in version 2.4: ``func_name`` is now writable.\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 User-defined methods\n A user-defined method object combines a class, a class instance\n (or ``None``) and any callable object (normally a user-defined\n function).\n\n Special read-only attributes: ``im_self`` is the class instance\n object, ``im_func`` is the function object; ``im_class`` is the\n class of ``im_self`` for bound methods or the class that asked\n for the method for unbound methods; ``__doc__`` is the method\'s\n documentation (same as ``im_func.__doc__``); ``__name__`` is the\n method name (same as ``im_func.__name__``); ``__module__`` is\n the name of the module the method was defined in, or ``None`` if\n unavailable.\n\n Changed in version 2.2: ``im_self`` used to refer to the class\n that defined the method.\n\n Changed in version 2.6: For 3.0 forward-compatibility,\n ``im_func`` is also available as ``__func__``, and ``im_self``\n as ``__self__``.\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, an unbound\n user-defined method object, or a class method object. When the\n attribute is a user-defined method object, a new method object\n is only created if the class from which it is being retrieved is\n the same as, or a derived class of, the class stored in the\n original method object; otherwise, the original method object is\n used as it is.\n\n When a user-defined method object is created by retrieving a\n user-defined function object from a class, its ``im_self``\n attribute is ``None`` and the method object is said to be\n unbound. When one is created by retrieving a user-defined\n function object from a class via one of its instances, its\n ``im_self`` attribute is the instance, and the method object is\n said to be bound. In either case, the new method\'s ``im_class``\n attribute is the class from which the retrieval takes place, and\n its ``im_func`` 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 ``im_func``\n attribute of the new instance is not the original method object\n but its ``im_func`` attribute.\n\n When a user-defined method object is created by retrieving a\n class method object from a class or instance, its ``im_self``\n attribute is the class itself (the same as the ``im_class``\n attribute), and its ``im_func`` attribute is the function object\n underlying the class method.\n\n When an unbound user-defined method object is called, the\n underlying function (``im_func``) is called, with the\n restriction that the first argument must be an instance of the\n proper class (``im_class``) or of a derived class thereof.\n\n When a bound user-defined method object is called, the\n underlying function (``im_func``) is called, inserting the class\n instance (``im_self``) in front of the argument list. For\n instance, when ``C`` is a class which contains a definition for\n a function ``f()``, and ``x`` is an instance of ``C``, calling\n ``x.f(1)`` is equivalent to calling ``C.f(x, 1)``.\n\n When a user-defined method object is derived from a class method\n object, the "class instance" stored in ``im_self`` will actually\n be the class itself, so that calling either ``x.f(1)`` or\n ``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 (unbound or\n bound) method object happens each time the attribute is\n retrieved from the class or instance. In some cases, a fruitful\n optimization is to assign the attribute to a local variable and\n call that local variable. Also notice that this transformation\n only happens for user-defined functions; other callable objects\n (and all non-callable objects) are retrieved without\n transformation. It is also important to note that user-defined\n functions which are attributes of a class instance are not\n converted to bound methods; this *only* happens when the\n function is an attribute 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 Class Types\n Class types, or "new-style classes," are callable. These\n objects normally act as factories for new instances of\n themselves, but variations are possible for class types that\n override ``__new__()``. The arguments of the call are passed to\n ``__new__()`` and, in the typical case, to ``__init__()`` to\n initialize the new instance.\n\n Classic Classes\n Class objects are described below. When a class object is\n called, a new class instance (also described below) is created\n and returned. This implies a call to the class\'s ``__init__()``\n method if it has one. Any arguments are passed on to the\n ``__init__()`` method. If there is no ``__init__()`` method,\n the class must be called without arguments.\n\n Class instances\n Class instances are described below. Class instances are\n callable only when the class has a ``__call__()`` method;\n ``x(arguments)`` is a shorthand for ``x.__call__(arguments)``.\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 func_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\nClasses\n Both class types (new-style classes) and class objects (old-\n style/classic classes) are typically created by class definitions\n (see section *Class definitions*). A class has a namespace\n implemented by a dictionary object. Class attribute references are\n translated to lookups in this dictionary, e.g., ``C.x`` is\n translated to ``C.__dict__["x"]`` (although for new-style classes\n in particular there are a number of hooks which allow for other\n means of locating attributes). When the attribute name is not found\n there, the attribute search continues in the base classes. For\n old-style classes, the search is depth-first, left-to-right in the\n order of occurrence in the base class list. New-style classes use\n the more complex C3 method resolution order which behaves correctly\n even in the presence of \'diamond\' inheritance structures where\n there are multiple inheritance paths leading back to a common\n ancestor. Additional details on the C3 MRO used by new-style\n classes can be found in the documentation accompanying the 2.3\n release at http://www.python.org/download/releases/2.3/mro/.\n\n When a class attribute reference (for class ``C``, say) would yield\n a user-defined function object or an unbound user-defined method\n object whose associated class is either ``C`` or one of its base\n classes, it is transformed into an unbound user-defined method\n object whose ``im_class`` attribute is ``C``. When it would yield a\n class method object, it is transformed into a bound user-defined\n method object whose ``im_class`` and ``im_self`` attributes are\n both ``C``. When it would yield a static method object, it is\n transformed into the object wrapped by the static method object.\n See section *Implementing Descriptors* for another way in which\n attributes retrieved from a class may differ from those actually\n contained in its ``__dict__`` (note that only new-style classes\n support descriptors).\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 or an unbound user-defined method object whose\n associated class is the class (call it ``C``) of the instance for\n which the attribute reference was initiated or one of its bases, it\n is transformed into a bound user-defined method object whose\n ``im_class`` attribute is ``C`` and whose ``im_self`` attribute is\n the instance. Static method and class method objects are also\n transformed, as if they had been retrieved from class ``C``; see\n above under "Classes". See section *Implementing Descriptors* for\n another way in which attributes of a class retrieved via its\n instances may differ from the objects actually stored in the\n class\'s ``__dict__``. If no class attribute is found, and the\n object\'s class has a ``__getattr__()`` method, that is called to\n satisfy the 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\nFiles\n A file object represents an open file. File objects are created by\n the ``open()`` built-in function, and also by ``os.popen()``,\n ``os.fdopen()``, and the ``makefile()`` method of socket objects\n (and perhaps by other functions or methods provided by extension\n modules). The objects ``sys.stdin``, ``sys.stdout`` and\n ``sys.stderr`` are initialized to file objects corresponding to the\n interpreter\'s standard input, output and error streams. See *File\n Objects* for complete documentation of file objects.\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_restricted`` is a flag indicating whether the function is\n executing in restricted execution mode; ``f_lasti`` gives the\n precise instruction (this is an index into the bytecode string\n 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_exc_type``, ``f_exc_value``,\n ``f_exc_traceback`` represent the last exception raised in the\n parent frame provided another exception was ever raised in the\n current frame (in all other cases they are None); ``f_lineno``\n is the current line number of the frame --- writing to this from\n within a trace function jumps to the given line (only for the\n bottom-most frame). A debugger can implement a Jump command\n (aka Set Next Statement) 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 ``sys.exc_traceback``,\n and also as the third item of the tuple returned by\n ``sys.exc_info()``. The latter is the preferred interface,\n since it works correctly when the program is using multiple\n threads. When the program contains no suitable handler, the\n stack trace is written (nicely formatted) to the standard error\n stream; if the interpreter is interactive, it is also made\n available to the user as ``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 when *extended slice\n syntax* is used. This is a slice using two colons, or multiple\n slices or ellipses separated by commas, e.g., ``a[i:j:step]``,\n ``a[i:j, k:l]``, or ``a[..., i:j]``. They are also created by\n the built-in ``slice()`` 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 extended slice that the slice\n object would describe if applied to a sequence of *length*\n items. It returns a tuple of three integers; respectively\n these are the *start* and *stop* indices and the *step* or\n stride length of the slice. Missing or out-of-bounds indices\n are handled in a manner consistent with regular slices.\n\n New in version 2.3.\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': u'\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': u'\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 is\n 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 New in version 2.2.\n\n Changed in version 2.3: Support for building a dictionary from\n keyword arguments added.\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 New in version 2.5: If a subclass of dict defines a method\n ``__missing__()``, if the key *key* is not present, the\n ``d[key]`` operation calls that method with the key *key* as\n argument. The ``d[key]`` operation then returns or raises\n whatever is returned or raised by the ``__missing__(key)`` call\n if the key is not present. No other operations or methods invoke\n ``__missing__()``. If ``__missing__()`` is not defined,\n ``KeyError`` is raised. ``__missing__()`` must be a method; it\n cannot be an instance variable. For an example, see\n ``collections.defaultdict``.\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 New in version 2.2.\n\n key not in d\n\n Equivalent to ``not key in d``.\n\n New in version 2.2.\n\n iter(d)\n\n Return an iterator over the keys of the dictionary. This is a\n shortcut for ``iterkeys()``.\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 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 New in version 2.3.\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 has_key(key)\n\n Test for the presence of *key* in the dictionary. ``has_key()``\n is deprecated in favor of ``key in d``.\n\n items()\n\n Return a copy of the dictionary\'s list of ``(key, value)``\n pairs.\n\n **CPython implementation detail:** Keys and values are listed in\n an arbitrary order which is non-random, varies across Python\n implementations, and depends on the dictionary\'s history of\n insertions and deletions.\n\n If ``items()``, ``keys()``, ``values()``, ``iteritems()``,\n ``iterkeys()``, and ``itervalues()`` are called with no\n intervening modifications to the dictionary, the lists will\n directly correspond. This allows the creation of ``(value,\n key)`` pairs using ``zip()``: ``pairs = zip(d.values(),\n d.keys())``. The same relationship holds for the ``iterkeys()``\n and ``itervalues()`` methods: ``pairs = zip(d.itervalues(),\n d.iterkeys())`` provides the same value for ``pairs``. Another\n way to create the same list is ``pairs = [(v, k) for (k, v) in\n d.iteritems()]``.\n\n iteritems()\n\n Return an iterator over the dictionary\'s ``(key, value)`` pairs.\n See the note for ``dict.items()``.\n\n Using ``iteritems()`` while adding or deleting entries in the\n dictionary may raise a ``RuntimeError`` or fail to iterate over\n all entries.\n\n New in version 2.2.\n\n iterkeys()\n\n Return an iterator over the dictionary\'s keys. See the note for\n ``dict.items()``.\n\n Using ``iterkeys()`` while adding or deleting entries in the\n dictionary may raise a ``RuntimeError`` or fail to iterate over\n all entries.\n\n New in version 2.2.\n\n itervalues()\n\n Return an iterator over the dictionary\'s values. See the note\n for ``dict.items()``.\n\n Using ``itervalues()`` while adding or deleting entries in the\n dictionary may raise a ``RuntimeError`` or fail to iterate over\n all entries.\n\n New in version 2.2.\n\n keys()\n\n Return a copy of the dictionary\'s list of keys. See the note\n for ``dict.items()``.\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 New in version 2.3.\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 Changed in version 2.4: Allowed the argument to be an iterable\n of key/value pairs and allowed keyword arguments.\n\n values()\n\n Return a copy of the dictionary\'s list of values. See the note\n for ``dict.items()``.\n\n viewitems()\n\n Return a new view of the dictionary\'s items (``(key, value)``\n pairs). See below for documentation of view objects.\n\n New in version 2.7.\n\n viewkeys()\n\n Return a new view of the dictionary\'s keys. See below for\n documentation of view objects.\n\n New in version 2.7.\n\n viewvalues()\n\n Return a new view of the dictionary\'s values. See below for\n documentation of view objects.\n\n New in version 2.7.\n\n\nDictionary view objects\n=======================\n\nThe objects returned by ``dict.viewkeys()``, ``dict.viewvalues()`` and\n``dict.viewitems()`` are *view objects*. They provide a dynamic view\non the 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 and\nhashable, then the items view is also set-like. (Values views are not\ntreated as set-like since the entries are generally not unique.) Then\nthese set operations are available ("other" refers either to another\nview or a set):\n\ndictview & other\n\n Return the intersection of the dictview and the other object as a\n new set.\n\ndictview | other\n\n Return the union of the dictview and the other object as a new set.\n\ndictview - other\n\n Return the difference between the dictview and the other object\n (all elements in *dictview* that aren\'t in *other*) as a new set.\n\ndictview ^ other\n\n Return the symmetric difference (all elements either in *dictview*\n or *other*, but not in both) of the dictview and the other object\n as a new set.\n\nAn example of dictionary view usage:\n\n >>> dishes = {\'eggs\': 2, \'sausage\': 1, \'bacon\': 1, \'spam\': 500}\n >>> keys = dishes.viewkeys()\n >>> values = dishes.viewvalues()\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', - 'typesmethods': u"\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\nThe implementation adds two special read-only attributes to class\ninstance methods: ``m.im_self`` is the object on which the method\noperates, and ``m.im_func`` is the function implementing the method.\nCalling ``m(arg-1, arg-2, ..., arg-n)`` is completely equivalent to\ncalling ``m.im_func(m.im_self, arg-1, arg-2, ..., arg-n)``.\n\nClass instance methods are either *bound* or *unbound*, referring to\nwhether the method was accessed through an instance or a class,\nrespectively. When a method is unbound, its ``im_self`` attribute\nwill be ``None`` and if called, an explicit ``self`` object must be\npassed as the first argument. In this case, ``self`` must be an\ninstance of the unbound method's class (or a subclass of that class),\notherwise a ``TypeError`` is raised.\n\nLike function objects, methods objects support getting arbitrary\nattributes. However, since method attributes are actually stored on\nthe underlying function object (``meth.im_func``), setting method\nattributes on either bound or unbound methods is disallowed.\nAttempting to set a method attribute results in a ``TypeError`` being\nraised. In order to set a method attribute, you need to explicitly\nset it on the underlying function object:\n\n class C:\n def method(self):\n pass\n\n c = C()\n c.method.im_func.whoami = 'my name is c'\n\nSee *The standard type hierarchy* for more information.\n", - 'typesmodules': u"\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 member 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: ````. If loaded from a file, they are written as\n````.\n", - 'typesseq': u'\nSequence Types --- ``str``, ``unicode``, ``list``, ``tuple``, ``bytearray``, ``buffer``, ``xrange``\n***************************************************************************************************\n\nThere are seven sequence types: strings, Unicode strings, lists,\ntuples, bytearrays, buffers, and xrange objects.\n\nFor other containers see the built in ``dict`` and ``set`` classes,\nand the ``collections`` module.\n\nString literals are written in single or double quotes: ``\'xyzzy\'``,\n``"frobozz"``. See *String literals* for more about string literals.\nUnicode strings are much like strings, but are specified in the syntax\nusing a preceding ``\'u\'`` character: ``u\'abc\'``, ``u"def"``. In\naddition to the functionality described here, there are also string-\nspecific methods described in the *String Methods* section. Lists are\nconstructed with square brackets, separating items with commas: ``[a,\nb, c]``. Tuples are constructed by the comma operator (not within\nsquare brackets), with or without enclosing parentheses, but an empty\ntuple must have the enclosing parentheses, such as ``a, b, c`` or\n``()``. A single item tuple must have a trailing comma, such as\n``(d,)``.\n\nBytearray objects are created with the built-in function\n``bytearray()``.\n\nBuffer objects are not directly supported by Python syntax, but can be\ncreated by calling the built-in function ``buffer()``. They don\'t\nsupport concatenation or repetition.\n\nObjects of type xrange are similar to buffers in that there is no\nspecific syntax to create them, but they are created using the\n``xrange()`` function. They don\'t support slicing, concatenation or\nrepetition, and using ``in``, ``not in``, ``min()`` or ``max()`` on\nthem 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* and *j* 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 compare\nequal and the two sequences must be of the same type and have the same\nlength. (For full details see *Comparisons* in the language\nreference.)\n\nNotes:\n\n1. When *s* is a string or Unicode string object the ``in`` and ``not\n in`` operations act like a substring test. In Python versions\n before 2.3, *x* had to be a string of length 1. In Python 2.3 and\n beyond, *x* may be a string of any length.\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. **CPython implementation detail:** If *s* and *t* are both strings,\n some Python implementations such as CPython can usually perform an\n in-place optimization for assignments of the form ``s = s + t`` or\n ``s += t``. When applicable, this optimization makes quadratic\n run-time much less likely. This optimization is both version and\n implementation dependent. For performance sensitive code, it is\n preferable to use the ``str.join()`` method which assures\n consistent linear concatenation performance across versions and\n implementations.\n\n Changed in version 2.4: Formerly, string concatenation never\n occurred in-place.\n\n\nString Methods\n==============\n\nBelow are listed the string methods which both 8-bit strings and\nUnicode objects support. Some of them are also available on\n``bytearray`` objects.\n\nIn addition, Python\'s strings support the sequence type methods\ndescribed in the *Sequence Types --- str, unicode, list, tuple,\nbytearray, buffer, xrange* section. To output formatted strings use\ntemplate strings or the ``%`` operator described in the *String\nFormatting Operations* section. Also, see the ``re`` module for string\nfunctions based 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\n For 8-bit strings, this method is locale-dependent.\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\n Changed in version 2.4: Support for the *fillchar* argument.\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.decode([encoding[, errors]])\n\n Decodes the string using the codec registered for *encoding*.\n *encoding* defaults to the default string encoding. *errors* may\n be given to set a different error handling scheme. The default is\n ``\'strict\'``, meaning that encoding errors raise ``UnicodeError``.\n Other possible values are ``\'ignore\'``, ``\'replace\'`` and any other\n name registered via ``codecs.register_error()``, see section *Codec\n Base Classes*.\n\n New in version 2.2.\n\n Changed in version 2.3: Support for other error handling schemes\n added.\n\n Changed in version 2.7: Support for keyword arguments added.\n\nstr.encode([encoding[, errors]])\n\n Return an encoded version of the string. Default encoding is the\n current default string encoding. *errors* may be given to set a\n different error handling scheme. The default for *errors* is\n ``\'strict\'``, meaning that encoding errors raise a\n ``UnicodeError``. Other possible values are ``\'ignore\'``,\n ``\'replace\'``, ``\'xmlcharrefreplace\'``, ``\'backslashreplace\'`` and\n any other name registered via ``codecs.register_error()``, see\n section *Codec Base Classes*. For a list of possible encodings, see\n section *Standard Encodings*.\n\n New in version 2.0.\n\n Changed in version 2.3: Support for ``\'xmlcharrefreplace\'`` and\n ``\'backslashreplace\'`` and other error handling schemes added.\n\n Changed in version 2.7: 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\n Changed in version 2.5: Accept tuples as *suffix*.\n\nstr.expandtabs([tabsize])\n\n Return a copy of the string where all tab characters are replaced\n by one 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\n This method of string formatting is the new standard in Python 3.0,\n and should be preferred to the ``%`` formatting described in\n *String Formatting Operations* in new code.\n\n New in version 2.6.\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.\n\n For 8-bit strings, this method is locale-dependent.\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.\n\n For 8-bit strings, this method is locale-dependent.\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.\n\n For 8-bit strings, this method is locale-dependent.\n\nstr.islower()\n\n Return true if all cased characters in the string are lowercase and\n there is at least one cased character, false otherwise.\n\n For 8-bit strings, this method is locale-dependent.\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.\n\n For 8-bit strings, this method is locale-dependent.\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\n For 8-bit strings, this method is locale-dependent.\n\nstr.isupper()\n\n Return true if all cased characters in the string are uppercase and\n there is at least one cased character, false otherwise.\n\n For 8-bit strings, this method is locale-dependent.\n\nstr.join(iterable)\n\n Return a string which is the concatenation of the strings in the\n *iterable* *iterable*. The separator between elements is the\n 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\n ``len(s)``.\n\n Changed in version 2.4: Support for the *fillchar* argument.\n\nstr.lower()\n\n Return a copy of the string converted to lowercase.\n\n For 8-bit strings, this method is locale-dependent.\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\n Changed in version 2.2.2: Support for the *chars* argument.\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\n New in version 2.5.\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\n ``len(s)``.\n\n Changed in version 2.4: Support for the *fillchar* argument.\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\n New in version 2.5.\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\n New in version 2.4.\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\n Changed in version 2.2.2: Support for the *chars* argument.\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\n Changed in version 2.5: Accept tuples as *prefix*.\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\n Changed in version 2.2.2: Support for the *chars* argument.\n\nstr.swapcase()\n\n Return a copy of the string with uppercase characters converted to\n lowercase and vice versa.\n\n For 8-bit strings, this method is locale-dependent.\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\n For 8-bit strings, this method is locale-dependent.\n\nstr.translate(table[, deletechars])\n\n Return a copy of the string where all characters occurring in the\n optional argument *deletechars* are removed, and the remaining\n characters have been mapped through the given translation table,\n which must be a string of length 256.\n\n You can use the ``maketrans()`` helper function in the ``string``\n module to create a translation table. For string objects, set the\n *table* argument to ``None`` for translations that only delete\n characters:\n\n >>> \'read this short text\'.translate(None, \'aeiou\')\n \'rd ths shrt txt\'\n\n New in version 2.6: Support for a ``None`` *table* argument.\n\n For Unicode objects, the ``translate()`` method does not accept the\n optional *deletechars* argument. Instead, it returns a copy of the\n *s* where all characters have been mapped through the given\n translation table which must be a mapping of Unicode ordinals to\n Unicode ordinals, Unicode strings or ``None``. Unmapped characters\n are left untouched. Characters mapped to ``None`` are deleted.\n Note, a more flexible approach is to create a custom character\n mapping codec using the ``codecs`` module (see ``encodings.cp1251``\n for an example).\n\nstr.upper()\n\n Return a copy of the string converted to uppercase.\n\n For 8-bit strings, this method is locale-dependent.\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 ``len(s)``.\n\n New in version 2.2.2.\n\nThe following methods are present only on unicode objects:\n\nunicode.isnumeric()\n\n Return ``True`` if there are only numeric characters in S,\n ``False`` otherwise. Numeric characters include digit characters,\n and all characters that have the Unicode numeric value property,\n e.g. U+2155, VULGAR FRACTION ONE FIFTH.\n\nunicode.isdecimal()\n\n Return ``True`` if there are only decimal characters in S,\n ``False`` otherwise. Decimal characters include digit characters,\n and all characters that that can be used to form decimal-radix\n numbers, e.g. U+0660, ARABIC-INDIC DIGIT ZERO.\n\n\nString Formatting Operations\n============================\n\nString and Unicode objects have one unique built-in operation: the\n``%`` operator (modulo). This is also known as the string\n*formatting* or *interpolation* operator. Given ``format % values``\n(where *format* is a string or Unicode object), ``%`` conversion\nspecifications in *format* are replaced with zero or more elements of\n*values*. The effect is similar to the using ``sprintf()`` in the C\nlanguage. If *format* is a Unicode object, or if any of the objects\nbeing converted using the ``%s`` conversion are Unicode objects, the\nresult will also be a Unicode object.\n\nIf *format* requires a single argument, *values* may be a single non-\ntuple object. [4] 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 width\n is read from the next element of the tuple in *values*, and the\n 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()``). | (6) |\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. The ``%r`` conversion was added in Python 2.0.\n\n The precision determines the maximal number of characters used.\n\n6. If the object or format provided is a ``unicode`` string, the\n resulting string will also be ``unicode``.\n\n The precision determines the maximal number of characters used.\n\n7. 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 2.7: ``%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\nXRange Type\n===========\n\nThe ``xrange`` type is an immutable sequence which is commonly used\nfor looping. The advantage of the ``xrange`` type is that an\n``xrange`` object will always take the same amount of memory, no\nmatter the size of the range it represents. There are no consistent\nperformance advantages.\n\nXRange objects have very little behavior: they only support indexing,\niteration, and the ``len()`` function.\n\n\nMutable Sequence Types\n======================\n\nList and ``bytearray`` objects support additional operations that\nallow in-place modification of the object. Other mutable sequence\ntypes (when added to the language) should also support these\noperations. Strings and tuples are immutable sequence types: such\nobjects cannot be modified once created. The following operations are\ndefined on mutable sequence types (where *x* is an arbitrary object):\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)] = | (2) |\n| | [x]`` | |\n+--------------------------------+----------------------------------+-----------------------+\n| ``s.extend(x)`` | same as ``s[len(s):len(s)] = x`` | (3) |\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 | (4) |\n| | ``s[k] == x`` and ``i <= k < j`` | |\n+--------------------------------+----------------------------------+-----------------------+\n| ``s.insert(i, x)`` | same as ``s[i:i] = [x]`` | (5) |\n+--------------------------------+----------------------------------+-----------------------+\n| ``s.pop([i])`` | same as ``x = s[i]; del s[i]; | (6) |\n| | return x`` | |\n+--------------------------------+----------------------------------+-----------------------+\n| ``s.remove(x)`` | same as ``del s[s.index(x)]`` | (4) |\n+--------------------------------+----------------------------------+-----------------------+\n| ``s.reverse()`` | reverses the items of *s* in | (7) |\n| | place | |\n+--------------------------------+----------------------------------+-----------------------+\n| ``s.sort([cmp[, key[, | sort the items of *s* in place | (7)(8)(9)(10) |\n| reverse]]])`` | | |\n+--------------------------------+----------------------------------+-----------------------+\n\nNotes:\n\n1. *t* must have the same length as the slice it is replacing.\n\n2. The C implementation of Python has historically accepted multiple\n parameters and implicitly joined them into a tuple; this no longer\n works in Python 2.0. Use of this misfeature has been deprecated\n since Python 1.4.\n\n3. *x* can be any iterable object.\n\n4. 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 list length is added, as for slice indices. If it is\n still negative, it is truncated to zero, as for slice indices.\n\n Changed in version 2.3: Previously, ``index()`` didn\'t have\n arguments for specifying start and stop positions.\n\n5. When a negative index is passed as the first parameter to the\n ``insert()`` method, the list length is added, as for slice\n indices. If it is still negative, it is truncated to zero, as for\n slice indices.\n\n Changed in version 2.3: Previously, all negative indices were\n truncated to zero.\n\n6. The ``pop()`` method is only supported by the list and array types.\n The optional argument *i* defaults to ``-1``, so that by default\n the last item is removed and returned.\n\n7. The ``sort()`` and ``reverse()`` methods modify the list in place\n for economy of space when sorting or reversing a large list. To\n remind you that they operate by side effect, they don\'t return the\n sorted or reversed list.\n\n8. The ``sort()`` method takes optional arguments for controlling the\n comparisons.\n\n *cmp* specifies a custom comparison function of two arguments (list\n items) which should return a negative, zero or positive number\n depending on whether the first argument is considered smaller than,\n equal to, or larger than the second argument: ``cmp=lambda x,y:\n cmp(x.lower(), y.lower())``. The default value is ``None``.\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``.\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 In general, the *key* and *reverse* conversion processes are much\n faster than specifying an equivalent *cmp* function. This is\n because *cmp* is called multiple times for each list element while\n *key* and *reverse* touch each element only once. Use\n ``functools.cmp_to_key()`` to convert an old-style *cmp* function\n to a *key* function.\n\n Changed in version 2.3: Support for ``None`` as an equivalent to\n omitting *cmp* was added.\n\n Changed in version 2.4: Support for *key* and *reverse* was added.\n\n9. Starting with Python 2.3, the ``sort()`` method is guaranteed to be\n stable. A sort is stable if it guarantees not to change the\n relative order of elements that compare equal --- this is helpful\n for sorting in multiple passes (for example, sort by department,\n then by salary grade).\n\n10. **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 2.3 and newer makes the\n list appear empty for the duration, and raises ``ValueError`` if\n it can detect that the list has been mutated during a sort.\n', - 'typesseq-mutable': u"\nMutable Sequence Types\n**********************\n\nList and ``bytearray`` objects support additional operations that\nallow in-place modification of the object. Other mutable sequence\ntypes (when added to the language) should also support these\noperations. Strings and tuples are immutable sequence types: such\nobjects cannot be modified once created. The following operations are\ndefined on mutable sequence types (where *x* is an arbitrary object):\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)] = | (2) |\n| | [x]`` | |\n+--------------------------------+----------------------------------+-----------------------+\n| ``s.extend(x)`` | same as ``s[len(s):len(s)] = x`` | (3) |\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 | (4) |\n| | ``s[k] == x`` and ``i <= k < j`` | |\n+--------------------------------+----------------------------------+-----------------------+\n| ``s.insert(i, x)`` | same as ``s[i:i] = [x]`` | (5) |\n+--------------------------------+----------------------------------+-----------------------+\n| ``s.pop([i])`` | same as ``x = s[i]; del s[i]; | (6) |\n| | return x`` | |\n+--------------------------------+----------------------------------+-----------------------+\n| ``s.remove(x)`` | same as ``del s[s.index(x)]`` | (4) |\n+--------------------------------+----------------------------------+-----------------------+\n| ``s.reverse()`` | reverses the items of *s* in | (7) |\n| | place | |\n+--------------------------------+----------------------------------+-----------------------+\n| ``s.sort([cmp[, key[, | sort the items of *s* in place | (7)(8)(9)(10) |\n| reverse]]])`` | | |\n+--------------------------------+----------------------------------+-----------------------+\n\nNotes:\n\n1. *t* must have the same length as the slice it is replacing.\n\n2. The C implementation of Python has historically accepted multiple\n parameters and implicitly joined them into a tuple; this no longer\n works in Python 2.0. Use of this misfeature has been deprecated\n since Python 1.4.\n\n3. *x* can be any iterable object.\n\n4. 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 list length is added, as for slice indices. If it is\n still negative, it is truncated to zero, as for slice indices.\n\n Changed in version 2.3: Previously, ``index()`` didn't have\n arguments for specifying start and stop positions.\n\n5. When a negative index is passed as the first parameter to the\n ``insert()`` method, the list length is added, as for slice\n indices. If it is still negative, it is truncated to zero, as for\n slice indices.\n\n Changed in version 2.3: Previously, all negative indices were\n truncated to zero.\n\n6. The ``pop()`` method is only supported by the list and array types.\n The optional argument *i* defaults to ``-1``, so that by default\n the last item is removed and returned.\n\n7. The ``sort()`` and ``reverse()`` methods modify the list in place\n for economy of space when sorting or reversing a large list. To\n remind you that they operate by side effect, they don't return the\n sorted or reversed list.\n\n8. The ``sort()`` method takes optional arguments for controlling the\n comparisons.\n\n *cmp* specifies a custom comparison function of two arguments (list\n items) which should return a negative, zero or positive number\n depending on whether the first argument is considered smaller than,\n equal to, or larger than the second argument: ``cmp=lambda x,y:\n cmp(x.lower(), y.lower())``. The default value is ``None``.\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``.\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 In general, the *key* and *reverse* conversion processes are much\n faster than specifying an equivalent *cmp* function. This is\n because *cmp* is called multiple times for each list element while\n *key* and *reverse* touch each element only once. Use\n ``functools.cmp_to_key()`` to convert an old-style *cmp* function\n to a *key* function.\n\n Changed in version 2.3: Support for ``None`` as an equivalent to\n omitting *cmp* was added.\n\n Changed in version 2.4: Support for *key* and *reverse* was added.\n\n9. Starting with Python 2.3, the ``sort()`` method is guaranteed to be\n stable. A sort is stable if it guarantees not to change the\n relative order of elements that compare equal --- this is helpful\n for sorting in multiple passes (for example, sort by department,\n then by salary grade).\n\n10. **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 2.3 and newer makes the\n list appear empty for the duration, and raises ``ValueError`` if\n it can detect that the list has been mutated during a sort.\n", - 'unary': u'\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\nplain or long integer argument. The bitwise inversion of ``x`` is\ndefined as ``-(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': u'\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': u'\nThe ``with`` statement\n**********************\n\nNew in version 2.5.\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\nNote: In Python 2.5, the ``with`` statement is only allowed when the\n ``with_statement`` feature has been enabled. It is always enabled\n in Python 2.6.\n\nChanged in version 2.7: 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': u'\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 generator\'s ``next()``\nmethod 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\nAs of Python version 2.5, the ``yield`` statement is now allowed in\nthe ``try`` clause of a ``try`` ... ``finally`` construct. If the\ngenerator is not resumed before it is finalized (by reaching a zero\nreference count or by being garbage collected), the generator-\niterator\'s ``close()`` method will be called, allowing any pending\n``finally`` clauses to execute.\n\nNote: In Python 2.2, the ``yield`` statement was only allowed when the\n ``generators`` feature has been enabled. This ``__future__`` import\n statement was used to enable the feature:\n\n from __future__ import generators\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'} +# Autogenerated by Sphinx on Thu Feb 23 15:17:35 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\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 is recursively defined as\nfollows.\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\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`` statement in the\n current code block: the name is bound to the object in the current\n local namespace.\n\n * Otherwise: the name is bound to the object in the current global\n namespace.\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 a plain integer. If it is negative, the\n sequence\'s length is added to it. The resulting value must be a\n nonnegative integer less than the sequence\'s length, and the\n sequence is asked to assign the assigned object to its item with\n that index. If the index is out of range, ``IndexError`` is raised\n (assignment to a subscripted sequence cannot add new items to a\n 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* 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 (small) integers. If either\n bound is negative, the sequence\'s length is added to it. The\n resulting bounds are clipped to lie between zero and the sequence\'s\n length, inclusive. Finally, the sequence object is asked to replace\n the slice with the items of the assigned sequence. The length of\n the 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\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 literals and various numeric literals:\n\n literal ::= stringliteral | integer | longinteger\n | floatnumber | imagnumber\n\nEvaluation of a literal yields an object of the given type (string,\ninteger, long integer, floating point number, complex number) with the\ngiven value. The value may be approximated in the case of floating\npoint and imaginary (complex) literals. See section *Literals* for\ndetails.\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 in new-style classes.\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 not simply execute ``self.name = value`` --- this would\n cause a recursive call to itself. Instead, it should insert the\n value in the dictionary of instance attributes, e.g.,\n ``self.__dict__[name] = value``. For new-style classes, rather\n than accessing the instance dictionary, it should call the base\n 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\n\nMore attribute access for new-style classes\n===========================================\n\nThe following methods only apply to new-style classes.\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 for new-style\n classes*.\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. Note that descriptors are only invoked for new\nstyle objects or classes (ones that subclass ``object()`` or\n``type()``).\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 a new-style object instance, ``a.x`` is transformed\n into the call: ``type(a).__dict__[\'x\'].__get__(a, type(a))``.\n\nClass Binding\n If binding to a new-style class, ``A.x`` is transformed into the\n call: ``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 both old and new-style classes have a\ndictionary for attribute storage. This wastes space for objects\nhaving very few instance variables. The space consumption can become\nacute when creating large numbers of instances.\n\nThe default can be overridden by defining *__slots__* in a new-style\nclass definition. The *__slots__* declaration takes a sequence of\ninstance variables and reserves just enough space in each instance to\nhold a value for each variable. Space is saved because *__dict__* is\nnot created for each instance.\n\n__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 new-style class, *__slots__* reserves space for the declared\n variables and prevents the automatic creation of *__dict__* and\n *__weakref__* for each instance.\n\n New in version 2.2.\n\nNotes on using *__slots__*\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 Changed in version 2.3: Previously, adding ``\'__dict__\'`` to the\n *__slots__* declaration would not enable the assignment of new\n attributes not specifically listed in the sequence of instance\n variable names.\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 Changed in version 2.3: Previously, adding ``\'__weakref__\'`` to the\n *__slots__* declaration would not enable support for weak\n references.\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 ``long``, ``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 Changed in version 2.6: Previously, *__class__* assignment raised an\n error if either new or old class had *__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, e.g., a module, list, or an instance. This\nobject is then asked to produce the attribute whose name is the\nidentifier. If this attribute is not available, the exception\n``AttributeError`` is raised. Otherwise, the type and value of the\nobject produced is determined by the object. Multiple evaluations of\nthe same attribute reference 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 (plain or long) and the other must be a sequence.\nIn the former case, the numbers are converted to a common type and\nthen multiplied together. In the latter case, sequence repetition is\nperformed; a negative 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. Plain or long integer division yields an\ninteger of the same type; the result is that of mathematical division\nwith the \'floor\' function applied to the result. Division by zero\nraises 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 [2].\n\nThe integer division and modulo operators are connected by the\nfollowing identity: ``x == (x/y)*y + (x%y)``. Integer division and\nmodulo are also connected with the built-in function ``divmod()``:\n``divmod(x, y) == (x/y, x%y)``. These identities don\'t hold for\nfloating point numbers; there similar identities hold approximately\nwhere ``x/y`` is replaced by ``floor(x/y)`` or ``floor(x/y) - 1`` [3].\n\nIn addition to performing the modulo operation on numbers, the ``%``\noperator is also overloaded by string and unicode objects to perform\nstring formatting (also known as interpolation). The syntax for string\nformatting is described in the Python Library Reference, section\n*String Formatting Operations*.\n\nDeprecated since version 2.3: The floor division operator, the modulo\noperator, and the ``divmod()`` function are no longer defined for\ncomplex numbers. Instead, convert to a floating point number using\nthe ``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 plain or long integers. The arguments are converted to a common\ntype.\n\nThe ``^`` operator yields the bitwise XOR (exclusive OR) of its\narguments, which must be plain or long integers. The arguments are\nconverted to a common type.\n\nThe ``|`` operator yields the bitwise (inclusive) OR of its arguments,\nwhich must be plain or long integers. The arguments are converted to\na common type.\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 ``func_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`` statement or the built-in ``eval()``\nfunction.\n\nSee *The standard type hierarchy* for more information.\n', + 'bltin-ellipsis-object': '\nThe Ellipsis Object\n*******************\n\nThis object is used by extended slice notation (see *Slicings*). It\nsupports no special operations. There is exactly one ellipsis object,\nnamed ``Ellipsis`` (a built-in name).\n\nIt is written as ``Ellipsis``. When in a subscript, it can also be\nwritten as ``...``, for example ``seq[...]``.\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-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: ````.\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. (See the ``__nonzero__()`` special method for a way to\nchange this.)\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', + 'callable-types': '\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', + '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 [","]\n | expression genexpr_for] ")"\n argument_list ::= positional_arguments ["," keyword_arguments]\n ["," "*" expression] ["," keyword_arguments]\n ["," "**" expression]\n | keyword_arguments ["," "*" expression]\n ["," "**" expression]\n | "*" expression ["," "*" expression] ["," "**" 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 certain class instances\nthemselves are callable; extensions may define additional callable\nobject types). All argument expressions are evaluated before the call\nis attempted. Please refer to section *Function definitions* for the\nsyntax 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 "", 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. Formal parameters using the syntax ``(sublist)`` cannot be\nused as keyword argument names; the outermost sublist corresponds to a\nsingle unnamed argument slot, and the argument value is assigned to\nthe sublist using the usual tuple assignment rules after all other\nparameter processing is done.\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 ::= "class" classname [inheritance] ":" suite\n inheritance ::= "(" [expression_list] ")"\n classname ::= identifier\n\nA class definition is an executable statement. It first evaluates the\ninheritance list, if present. Each item in the inheritance list\nshould evaluate to a class object or class type which allows\nsubclassing. The class\'s suite is then executed in a new execution\nframe (see section *Naming and binding*), using a newly created local\nnamespace and the original global namespace. (Usually, the suite\ncontains only function definitions.) When the class\'s suite finishes\nexecution, its execution frame is discarded but its local namespace is\nsaved. [4] A class object is then created using the inheritance list\nfor the base classes and the saved local namespace for the attribute\ndictionary. The class name is bound to this class object in the\noriginal local namespace.\n\n**Programmer\'s note:** Variables defined in the class definition are\nclass variables; they are shared by all instances. To create instance\nvariables, they can be set in a method with ``self.name = value``.\nBoth class and instance variables are accessible through the notation\n"``self.name``", and an instance variable hides a class variable with\nthe same name when accessed in this way. Class variables can be used\nas defaults for instance variables, but using mutable values there can\nlead to unexpected results. For *new-style class*es, descriptors can\nbe used to create instance variables with different implementation\ndetails.\n\nClass definitions, like function definitions, may be wrapped by one or\nmore *decorator* expressions. The evaluation rules for the decorator\nexpressions are the same as for functions. The result must be a class\nobject, which is then bound to the class name.\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 forms ``<>`` and ``!=`` are equivalent; for consistency with C,\n``!=`` is preferred; where ``!=`` is mentioned below ``<>`` is also\naccepted. The ``<>`` spelling is considered obsolescent.\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,\nobjects of different types *always* compare unequal, and are ordered\nconsistently but arbitrarily. You can control comparison behavior of\nobjects of non-built-in types by defining a ``__cmp__`` method or rich\ncomparison methods like ``__gt__``, described in section *Special\nmethod names*.\n\n(This unusual definition of comparison was used to simplify the\ndefinition of operations like sorting and the ``in`` and ``not in``\noperators. In the future, the comparison rules for objects of\ndifferent types are likely to change.)\n\nComparison of objects of the same type depends on the type:\n\n* Numbers are compared arithmetically.\n\n* Strings are compared lexicographically using the numeric equivalents\n (the result of the built-in function ``ord()``) of their characters.\n Unicode and 8-bit strings are fully interoperable in this behavior.\n [4]\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, ``cmp([1,2,x], [1,2,y])`` returns\n the same as ``cmp(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 their sorted\n (key, value) lists compare equal. [5] Outcomes other than equality\n are resolved consistently, but are not otherwise defined. [6]\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\nThe operators ``in`` and ``not in`` test for collection membership.\n``x in s`` evaluates to true if *x* is a member of the collection *s*,\nand false otherwise. ``x not in s`` returns the negation of ``x in\ns``. The collection membership test has traditionally been bound to\nsequences; an object is a member of a collection if the collection is\na sequence and contains an element equal to that object. However, it\nmake sense for many other object types to support membership tests\nwithout being a sequence. In particular, dictionaries (for keys) and\nsets support membership testing.\n\nFor the list and tuple types, ``x in y`` is true if and only if there\nexists an index *i* such that ``x == y[i]`` is true.\n\nFor the Unicode and string types, ``x in y`` is true if and only if\n*x* is a substring of *y*. An equivalent test is ``y.find(x) != -1``.\nNote, *x* and *y* need not be the same type; consequently, ``u\'ab\' in\n\'abc\'`` will return ``True``. Empty strings are always considered to\nbe a substring of any other string, so ``"" in "abc"`` will return\n``True``.\n\nChanged in version 2.3: Previously, *x* was required to be a string of\nlength ``1``.\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. [7]\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. Function and class\ndefinitions are also syntactically compound 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`` statements 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 | decorated\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, and then the suite is executed. When the items are\nexhausted (which is immediately when the sequence is empty), the suite\nin the ``else`` clause, if present, is executed, and the loop\nterminates.\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\nThe target list is not deleted when the loop is finished, but if the\nsequence is empty, it will not have been assigned to at all by the\nloop. Hint: the built-in function ``range()`` returns a sequence of\nintegers suitable to emulate the effect of Pascal\'s ``for i := a to b\ndo``; e.g., ``range(3)`` returns the list ``[0, 1, 2]``.\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 internal\n counter is used to keep track of which item is used next, and this\n is incremented on each iteration. When this counter has reached the\n length of the sequence the loop terminates. This means that if the\n suite deletes the current (or a previous) item from the sequence,\n the next item will be skipped (since it gets the index of the\n 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\nChanged in version 2.5: In previous versions of Python,\n``try``...``except``...``finally`` did not work. ``try``...``except``\nhad to be nested in ``try``...``finally``.\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, a tuple containing an item compatible with the\nexception, or, in the (deprecated) case of string exceptions, is the\nraised string itself (note that the object identities must match, i.e.\nit must be the same string object, not just a string with the same\nvalue).\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 in that except clause, if present, and the except\nclause\'s suite is executed. All except clauses must have an\nexecutable block. When the end of this block is reached, execution\ncontinues normally after the entire try statement. (This means that\nif two nested handlers exist for the same exception, and the exception\noccurs in the try clause of the inner handler, the outer handler will\nnot handle the exception.)\n\nBefore an except clause\'s suite is executed, details about the\nexception are assigned to three variables in the ``sys`` module:\n``sys.exc_type`` receives the object identifying the exception;\n``sys.exc_value`` receives the exception\'s parameter;\n``sys.exc_traceback`` receives a traceback object (see section *The\nstandard type hierarchy*) identifying the point in the program where\nthe exception occurred. These details are also available through the\n``sys.exc_info()`` function, which returns a tuple ``(exc_type,\nexc_value, exc_traceback)``. Use of the corresponding variables is\ndeprecated in favor of this function, since their use is unsafe in a\nthreaded program. As of Python 1.5, the variables are restored to\ntheir previous values (before the call) when returning from a function\nthat 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 lost. The exception information is not available to the\nprogram during execution 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\nNew in version 2.5.\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\nNote: In Python 2.5, the ``with`` statement is only allowed when the\n ``with_statement`` feature has been enabled. It is always enabled\n in Python 2.6.\n\nChanged in version 2.7: 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 decorated ::= decorators (classdef | funcdef)\n decorators ::= decorator+\n decorator ::= "@" dotted_name ["(" [argument_list [","]] ")"] NEWLINE\n funcdef ::= "def" funcname "(" [parameter_list] ")" ":" suite\n dotted_name ::= identifier ("." identifier)*\n parameter_list ::= (defparameter ",")*\n ( "*" identifier [, "**" identifier]\n | "**" identifier\n | defparameter [","] )\n defparameter ::= parameter ["=" expression]\n sublist ::= parameter ("," parameter)* [","]\n parameter ::= identifier | "(" sublist ")"\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 top-level 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 must also have a default value --- this is a syntactic\nrestriction 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.\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.\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 ::= "class" classname [inheritance] ":" suite\n inheritance ::= "(" [expression_list] ")"\n classname ::= identifier\n\nA class definition is an executable statement. It first evaluates the\ninheritance list, if present. Each item in the inheritance list\nshould evaluate to a class object or class type which allows\nsubclassing. The class\'s suite is then executed in a new execution\nframe (see section *Naming and binding*), using a newly created local\nnamespace and the original global namespace. (Usually, the suite\ncontains only function definitions.) When the class\'s suite finishes\nexecution, its execution frame is discarded but its local namespace is\nsaved. [4] A class object is then created using the inheritance list\nfor the base classes and the saved local namespace for the attribute\ndictionary. The class name is bound to this class object in the\noriginal local namespace.\n\n**Programmer\'s note:** Variables defined in the class definition are\nclass variables; they are shared by all instances. To create instance\nvariables, they can be set in a method with ``self.name = value``.\nBoth class and instance variables are accessible through the notation\n"``self.name``", and an instance variable hides a class variable with\nthe same name when accessed in this way. Class variables can be used\nas defaults for instance variables, but using mutable values there can\nlead to unexpected results. For *new-style class*es, descriptors can\nbe used to create instance variables with different implementation\ndetails.\n\nClass definitions, like function definitions, may be wrapped by one or\nmore *decorator* expressions. The evaluation rules for the decorator\nexpressions are the same as for functions. The result must be a class\nobject, which is then bound to the class name.\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\nNew in version 2.5.\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," the arguments\nare coerced using the coercion rules listed at *Coercion rules*. If\nboth arguments are standard numeric types, the following coercions are\napplied:\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, if either argument is a long integer, the other is\n converted to long integer;\n\n* otherwise, both must be plain integers and no conversion is\n necessary.\n\nSome additional rules apply for certain operators (e.g., a string left\nargument to the \'%\' operator). Extensions can define their own\ncoercions.\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_traceback`` 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.exc_traceback`` or ``sys.last_traceback``. Circular\n references which are garbage are detected when the option cycle\n detector is enabled (it\'s on by default), but can only be cleaned\n up if there are no Python-level ``__del__()`` methods involved.\n Refer to the documentation for the ``gc`` module for more\n information about how ``__del__()`` methods are handled by the\n cycle detector, particularly the description of the ``garbage``\n 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\n See also the *-R* command-line option.\n\nobject.__repr__(self)\n\n Called by the ``repr()`` built-in function and by string\n conversions (reverse quotes) to compute the "official" string\n representation of an object. If at all possible, this should look\n like a valid Python expression that could be used to recreate an\n object with the same value (given an appropriate environment). If\n this is not possible, a string of the form ``<...some useful\n description...>`` should be returned. The return value must be a\n string object. If a class defines ``__repr__()`` but not\n ``__str__()``, then ``__repr__()`` is also used when an "informal"\n string representation of instances of that class is 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 statement 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.__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 New in version 2.1.\n\n These are the so-called "rich comparison" methods, and are called\n for comparison operators in preference to ``__cmp__()`` below. The\n correspondence between operator symbols and method names is as\n follows: ``xy`` call ``x.__ne__(y)``, ``x>y`` calls ``x.__gt__(y)``, and\n ``x>=y`` calls ``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.__cmp__(self, other)\n\n Called by comparison operations if rich comparison (see above) is\n not defined. Should return a negative integer if ``self < other``,\n zero if ``self == other``, a positive integer if ``self > other``.\n If no ``__cmp__()``, ``__eq__()`` or ``__ne__()`` operation is\n defined, class instances are compared by object identity\n ("address"). See also the description of ``__hash__()`` for some\n important notes on creating *hashable* objects which support custom\n comparison operations and are usable as dictionary keys. (Note: the\n restriction that exceptions are not propagated by ``__cmp__()`` has\n been removed since Python 1.5.)\n\nobject.__rcmp__(self, other)\n\n Changed in version 2.1: No longer supported.\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 a ``__cmp__()`` or ``__eq__()`` method\n it should not define a ``__hash__()`` operation either; if it\n defines ``__cmp__()`` or ``__eq__()`` but not ``__hash__()``, its\n instances will not be usable in hashed collections. If a class\n defines mutable objects and implements a ``__cmp__()`` or\n ``__eq__()`` method, it should not implement ``__hash__()``, since\n hashable collection implementations require that a object\'s hash\n value is immutable (if the object\'s hash value changes, it will be\n in the wrong hash bucket).\n\n User-defined classes have ``__cmp__()`` 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 ``__cmp__()`` or ``__eq__()`` such that\n the hash value returned is no longer appropriate (e.g. by switching\n to a value-based concept of equality instead of the default\n identity based equality) can explicitly flag themselves as being\n unhashable by setting ``__hash__ = None`` in the class definition.\n Doing so means that not only will instances of the class raise an\n appropriate ``TypeError`` when a program attempts to retrieve their\n hash value, but they will also be correctly identified as\n unhashable when checking ``isinstance(obj, collections.Hashable)``\n (unlike classes which define their own ``__hash__()`` to explicitly\n raise ``TypeError``).\n\n Changed in version 2.5: ``__hash__()`` may now also return a long\n integer object; the 32-bit integer is then derived from the hash of\n that object.\n\n Changed in version 2.6: ``__hash__`` may now be set to ``None`` to\n explicitly flag instances of a class as unhashable.\n\nobject.__nonzero__(self)\n\n Called to implement truth value testing and the built-in operation\n ``bool()``; should return ``False`` or ``True``, or their integer\n equivalents ``0`` or ``1``. When this method is not defined,\n ``__len__()`` is called, if it is defined, and the object is\n considered true if its result is nonzero. If a class defines\n neither ``__len__()`` nor ``__nonzero__()``, all its instances are\n considered true.\n\nobject.__unicode__(self)\n\n Called to implement ``unicode()`` built-in; should return a Unicode\n object. When this method is not defined, string conversion is\n attempted, and the result of string conversion is converted to\n Unicode using the system default encoding.\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 > (0)?()\n (Pdb) continue\n > (1)?()\n (Pdb) continue\n NameError: \'spam\'\n > (1)?()\n (Pdb)\n\n``pdb.py`` can also be invoked as a script to debug other scripts.\nFor example:\n\n python -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 2.4: Restarting post-mortem behavior added.\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 ``c`` 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 "", 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[, locals]])\n\n Execute the *statement* (given as a string) under debugger control.\n The debugger prompt appears before any code is executed; you can\n set breakpoints and type ``continue``, or you can step through the\n statement using ``step`` or ``next`` (all these commands are\n explained below). The optional *globals* and *locals* arguments\n specify the environment in which the code is executed; by default\n the dictionary of the module ``__main__`` is used. (See the\n explanation of the ``exec`` statement or the ``eval()`` built-in\n function.)\n\npdb.runeval(expression[, globals[, locals]])\n\n Evaluate the *expression* (given as a string) under debugger\n control. When ``runeval()`` returns, it returns the value of the\n expression. Otherwise this function is similar to ``run()``.\n\npdb.runcall(function[, argument, ...])\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])\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)\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 Example call to enable tracing with *skip*:\n\n import pdb; pdb.Pdb(skip=[\'django.*\']).set_trace()\n\n New in version 2.7: The *skip* argument.\n\n run(statement[, globals[, locals]])\n runeval(expression[, globals[, locals]])\n runcall(function[, argument, ...])\n set_trace()\n\n See the documentation for the functions explained above.\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\nIt is illegal to delete a name from the local namespace if it occurs\nas a free variable in a nested block.\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', + '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\nIf ``exec`` is used in a function and the function contains or is a\nnested block with free variables, the compiler will raise a\n``SyntaxError`` unless the exec explicitly specifies the local\nnamespace for the ``exec``. (In other words, ``exec obj`` would be\nillegal, but ``exec obj in ns`` would be legal.)\n\nThe ``eval()``, ``execfile()``, and ``input()`` functions and the\n``exec`` statement do not have access to the full environment for\nresolving names. Names may be resolved in the local and global\nnamespaces of the caller. Free variables are not resolved in the\nnearest enclosing namespace, but in the global namespace. [1] The\n``exec`` statement and the ``eval()`` and ``execfile()`` functions\nhave optional arguments to override the global and local namespace.\nIf only one namespace is specified, 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', + 'exceptions': '\nExceptions\n**********\n\nExceptions are a means of breaking out of the normal flow of control\nof a code block in order to handle errors or other exceptional\nconditions. An exception is *raised* at the point where the error is\ndetected; it may be *handled* by the surrounding code block or by any\ncode block that directly or indirectly invoked the code block where\nthe error occurred.\n\nThe Python interpreter raises an exception when it detects a run-time\nerror (such as division by zero). A Python program can also\nexplicitly raise an exception with the ``raise`` statement. Exception\nhandlers are specified with the ``try`` ... ``except`` statement. The\n``finally`` clause of such a statement can be used to specify cleanup\ncode which does not handle the exception, but is executed whether an\nexception occurred or not in the preceding code.\n\nPython uses the "termination" model of error handling: an exception\nhandler can find out what happened and continue execution at an outer\nlevel, but it cannot repair the cause of the error and retry the\nfailing operation (except by re-entering the offending piece of code\nfrom the top).\n\nWhen an exception is not handled at all, the interpreter terminates\nexecution of the program, or returns to its interactive main loop. In\neither case, it prints a stack backtrace, except when the exception is\n``SystemExit``.\n\nExceptions are identified by class instances. The ``except`` clause\nis selected depending on the class of the instance: it must reference\nthe class of the instance or a base class thereof. The instance can\nbe received by the handler and can carry additional information about\nthe exceptional condition.\n\nExceptions can also be identified by strings, in which case the\n``except`` clause is selected by object identity. An arbitrary value\ncan be raised along with the identifying string which can be passed to\nthe handler.\n\nNote: Messages to exceptions are not part of the Python API. Their\n contents may change from one version of Python to the next without\n warning and should not be relied on by code which will run under\n multiple versions of the interpreter.\n\nSee also the description of the ``try`` statement in section *The try\nstatement* and ``raise`` statement in section *The raise statement*.\n\n-[ Footnotes ]-\n\n[1] This limitation occurs because the code that is executed by these\n operations is not available at the time the module is compiled.\n', + 'execmodel': '\nExecution model\n***************\n\n\nNaming and binding\n==================\n\n*Names* refer to objects. Names are introduced by name binding\noperations. Each occurrence of a name in the program text refers to\nthe *binding* of that name established in the innermost function block\ncontaining the use.\n\nA *block* is a piece of Python program text that is executed as a\nunit. The following are blocks: a module, a function body, and a class\ndefinition. Each command typed interactively is a block. A script\nfile (a file given as standard input to the interpreter or specified\non the interpreter command line the first argument) is a code block.\nA script command (a command specified on the interpreter command line\nwith the \'**-c**\' option) is a code block. The file read by the\nbuilt-in function ``execfile()`` is a code block. The string argument\npassed to the built-in function ``eval()`` and to the ``exec``\nstatement is a code block. The expression read and evaluated by the\nbuilt-in function ``input()`` is a code block.\n\nA code block is executed in an *execution frame*. A frame contains\nsome administrative information (used for debugging) and determines\nwhere and how execution continues after the code block\'s execution has\ncompleted.\n\nA *scope* defines the visibility of a name within a block. If a local\nvariable is defined in a block, its scope includes that block. If the\ndefinition occurs in a function block, the scope extends to any blocks\ncontained within the defining one, unless a contained block introduces\na different binding for the name. The scope of names defined in a\nclass block is limited to the class block; it does not extend to the\ncode blocks of methods -- this includes generator expressions since\nthey are implemented using a function scope. This means that the\nfollowing will fail:\n\n class A:\n a = 42\n b = list(a + i for i in range(10))\n\nWhen a name is used in a code block, it is resolved using the nearest\nenclosing scope. The set of all such scopes visible to a code block\nis called the block\'s *environment*.\n\nIf a name is bound in a block, it is a local variable of that block.\nIf a name is bound at the module level, it is a global variable. (The\nvariables of the module code block are local and global.) If a\nvariable is used in a code block but not defined there, it is a *free\nvariable*.\n\nWhen a name is not found at all, a ``NameError`` exception is raised.\nIf the name refers to a local variable that has not been bound, a\n``UnboundLocalError`` exception is raised. ``UnboundLocalError`` is a\nsubclass of ``NameError``.\n\nThe following constructs bind names: formal parameters to functions,\n``import`` statements, class and function definitions (these bind the\nclass or function name in the defining block), and targets that are\nidentifiers if occurring in an assignment, ``for`` loop header, in the\nsecond position of an ``except`` clause header or after ``as`` in a\n``with`` statement. The ``import`` statement of the form ``from ...\nimport *`` binds all names defined in the imported module, except\nthose beginning with an underscore. This form may only be used at the\nmodule level.\n\nA target occurring in a ``del`` statement is also considered bound for\nthis purpose (though the actual semantics are to unbind the name). It\nis illegal to unbind a name that is referenced by an enclosing scope;\nthe compiler will report a ``SyntaxError``.\n\nEach assignment or import statement occurs within a block defined by a\nclass or function definition or at the module level (the top-level\ncode block).\n\nIf a name binding operation occurs anywhere within a code block, all\nuses of the name within the block are treated as references to the\ncurrent block. This can lead to errors when a name is used within a\nblock before it is bound. This rule is subtle. Python lacks\ndeclarations and allows name binding operations to occur anywhere\nwithin a code block. The local variables of a code block can be\ndetermined by scanning the entire text of the block for name binding\noperations.\n\nIf the global statement occurs within a block, all uses of the name\nspecified in the statement refer to the binding of that name in the\ntop-level namespace. Names are resolved in the top-level namespace by\nsearching the global namespace, i.e. the namespace of the module\ncontaining the code block, and the builtins namespace, the namespace\nof the module ``__builtin__``. The global namespace is searched\nfirst. If the name is not found there, the builtins namespace is\nsearched. The global statement must precede all uses of the name.\n\nThe builtins namespace associated with the execution of a code block\nis actually found by looking up the name ``__builtins__`` in its\nglobal namespace; this should be a dictionary or a module (in the\nlatter case the module\'s dictionary is used). By default, when in the\n``__main__`` module, ``__builtins__`` is the built-in module\n``__builtin__`` (note: no \'s\'); when in any other module,\n``__builtins__`` is an alias for the dictionary of the ``__builtin__``\nmodule itself. ``__builtins__`` can be set to a user-created\ndictionary to create a weak form of restricted execution.\n\n**CPython implementation detail:** Users should not touch\n``__builtins__``; it is strictly an implementation detail. Users\nwanting to override values in the builtins namespace should ``import``\nthe ``__builtin__`` (no \'s\') module and modify its attributes\nappropriately.\n\nThe namespace for a module is automatically created the first time a\nmodule is imported. The main module for a script is always called\n``__main__``.\n\nThe ``global`` statement has the same scope as a name binding\noperation in the same block. If the nearest enclosing scope for a\nfree variable contains a global statement, the free variable is\ntreated as a global.\n\nA class definition is an executable statement that may use and define\nnames. These references follow the normal rules for name resolution.\nThe namespace of the class definition becomes the attribute dictionary\nof the class. Names defined at the class scope are not visible in\nmethods.\n\n\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\nIf ``exec`` is used in a function and the function contains or is a\nnested block with free variables, the compiler will raise a\n``SyntaxError`` unless the exec explicitly specifies the local\nnamespace for the ``exec``. (In other words, ``exec obj`` would be\nillegal, but ``exec obj in ns`` would be legal.)\n\nThe ``eval()``, ``execfile()``, and ``input()`` functions and the\n``exec`` statement do not have access to the full environment for\nresolving names. Names may be resolved in the local and global\nnamespaces of the caller. Free variables are not resolved in the\nnearest enclosing namespace, but in the global namespace. [1] The\n``exec`` statement and the ``eval()`` and ``execfile()`` functions\nhave optional arguments to override the global and local namespace.\nIf only one namespace is specified, it is used for both.\n\n\nExceptions\n==========\n\nExceptions are a means of breaking out of the normal flow of control\nof a code block in order to handle errors or other exceptional\nconditions. An exception is *raised* at the point where the error is\ndetected; it may be *handled* by the surrounding code block or by any\ncode block that directly or indirectly invoked the code block where\nthe error occurred.\n\nThe Python interpreter raises an exception when it detects a run-time\nerror (such as division by zero). A Python program can also\nexplicitly raise an exception with the ``raise`` statement. Exception\nhandlers are specified with the ``try`` ... ``except`` statement. The\n``finally`` clause of such a statement can be used to specify cleanup\ncode which does not handle the exception, but is executed whether an\nexception occurred or not in the preceding code.\n\nPython uses the "termination" model of error handling: an exception\nhandler can find out what happened and continue execution at an outer\nlevel, but it cannot repair the cause of the error and retry the\nfailing operation (except by re-entering the offending piece of code\nfrom the top).\n\nWhen an exception is not handled at all, the interpreter terminates\nexecution of the program, or returns to its interactive main loop. In\neither case, it prints a stack backtrace, except when the exception is\n``SystemExit``.\n\nExceptions are identified by class instances. The ``except`` clause\nis selected depending on the class of the instance: it must reference\nthe class of the instance or a base class thereof. The instance can\nbe received by the handler and can carry additional information about\nthe exceptional condition.\n\nExceptions can also be identified by strings, in which case the\n``except`` clause is selected by object identity. An arbitrary value\ncan be raised along with the identifying string which can be passed to\nthe handler.\n\nNote: Messages to exceptions are not part of the Python API. Their\n contents may change from one version of Python to the next without\n warning and should not be relied on by code which will run under\n multiple versions of the interpreter.\n\nSee also the description of the ``try`` statement in section *The try\nstatement* and ``raise`` statement in section *The raise statement*.\n\n-[ Footnotes ]-\n\n[1] This limitation occurs because the code that is executed by these\n operations is not available at the time the module is compiled.\n', + '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 of floating point numbers can\nlook like octal integers, but are interpreted using radix 10. For\nexample, ``077e010`` is legal, and denotes the same number as\n``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, and then the suite is executed. When the items are\nexhausted (which is immediately when the sequence is empty), the suite\nin the ``else`` clause, if present, is executed, and the loop\nterminates.\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\nThe target list is not deleted when the loop is finished, but if the\nsequence is empty, it will not have been assigned to at all by the\nloop. Hint: the built-in function ``range()`` returns a sequence of\nintegers suitable to emulate the effect of Pascal\'s ``for i := a to b\ndo``; e.g., ``range(3)`` returns the list ``[0, 1, 2]``.\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 internal\n counter is used to keep track of which item is used next, and this\n is incremented on each iteration. When this counter has reached the\n length of the sequence the loop terminates. This means that if the\n suite deletes the current (or a previous) item from the sequence,\n the next item will be skipped (since it gets the index of the\n 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 ::= +\n conversion ::= "r" | "s"\n format_spec ::= \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 2.7: 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\nTwo conversion flags are currently supported: ``\'!s\'`` which calls\n``str()`` on the value, and ``\'!r\'`` which calls ``repr()``.\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\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 ::= \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 is only valid for integers, and only for binary,\noctal, or hexadecimal output. If present, it specifies that the\noutput will be prefixed by ``\'0b\'``, ``\'0o\'``, or ``\'0x\'``,\nrespectively.\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 2.7: 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\'``. |\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 | The same as ``\'g\'``. |\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\') # 2.7+ 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(object):\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.5\n >>> total = 22\n >>> \'Correct answers: {:.2%}\'.format(points/total)\n \'Correct answers: 88.64%\'\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),\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 decorated ::= decorators (classdef | funcdef)\n decorators ::= decorator+\n decorator ::= "@" dotted_name ["(" [argument_list [","]] ")"] NEWLINE\n funcdef ::= "def" funcname "(" [parameter_list] ")" ":" suite\n dotted_name ::= identifier ("." identifier)*\n parameter_list ::= (defparameter ",")*\n ( "*" identifier [, "**" identifier]\n | "**" identifier\n | defparameter [","] )\n defparameter ::= parameter ["=" expression]\n sublist ::= parameter ("," parameter)* [","]\n parameter ::= identifier | "(" sublist ")"\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 top-level 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 must also have a default value --- this is a syntactic\nrestriction 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.\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.\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', + '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 an\n``exec`` statement does not affect the code block *containing* the\n``exec`` statement, and code contained in an ``exec`` statement is\nunaffected by ``global`` statements in the code containing the\n``exec`` statement. The same applies to the ``eval()``,\n``execfile()`` 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 ``__builtin__`` module.\n When not in interactive mode, ``_`` has no special meaning and is\n not 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\n identifier ::= (letter|"_") (letter | digit | "_")*\n letter ::= lowercase | uppercase\n lowercase ::= "a"..."z"\n uppercase ::= "A"..."Z"\n digit ::= "0"..."9"\n\nIdentifiers are unlimited in length. Case is significant.\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 and del from not while\n as elif global or with\n assert else if pass yield\n break except import print\n class exec in raise\n continue finally is return\n def for lambda try\n\nChanged in version 2.4: ``None`` became a constant and is now\nrecognized by the compiler as a name for the built-in object ``None``.\nAlthough it is not a keyword, you cannot assign a different object to\nit.\n\nChanged in version 2.5: Using ``as`` and ``with`` as identifiers\ntriggers a warning. To use them as keywords, enable the\n``with_statement`` future feature .\n\nChanged in version 2.6: ``as`` and ``with`` are full keywords.\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 ``__builtin__`` module.\n When not in interactive mode, ``_`` has no special meaning and is\n not 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.\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.\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. If the\nwild card form of import --- ``import *`` --- is used in a function\nand the function contains or is a nested block with free variables,\nthe compiler will 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 2.6 are ``unicode_literals``,\n``print_function``, ``absolute_import``, ``division``, ``generators``,\n``nested_scopes`` and ``with_statement``. ``generators``,\n``with_statement``, ``nested_scopes`` are redundant in Python version\n2.6 and above because they are always enabled.\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 an ``exec`` statement or calls to the built-in\nfunctions ``compile()`` and ``execfile()`` that occur in a module\n``M`` containing a future statement will, by default, use the new\nsyntax or semantics associated with the future statement. This can,\nstarting with Python 2.2 be controlled by optional arguments to\n``compile()`` --- see the documentation of that function for 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 forms ``<>`` and ``!=`` are equivalent; for consistency with C,\n``!=`` is preferred; where ``!=`` is mentioned below ``<>`` is also\naccepted. The ``<>`` spelling is considered obsolescent.\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,\nobjects of different types *always* compare unequal, and are ordered\nconsistently but arbitrarily. You can control comparison behavior of\nobjects of non-built-in types by defining a ``__cmp__`` method or rich\ncomparison methods like ``__gt__``, described in section *Special\nmethod names*.\n\n(This unusual definition of comparison was used to simplify the\ndefinition of operations like sorting and the ``in`` and ``not in``\noperators. In the future, the comparison rules for objects of\ndifferent types are likely to change.)\n\nComparison of objects of the same type depends on the type:\n\n* Numbers are compared arithmetically.\n\n* Strings are compared lexicographically using the numeric equivalents\n (the result of the built-in function ``ord()``) of their characters.\n Unicode and 8-bit strings are fully interoperable in this behavior.\n [4]\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, ``cmp([1,2,x], [1,2,y])`` returns\n the same as ``cmp(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 their sorted\n (key, value) lists compare equal. [5] Outcomes other than equality\n are resolved consistently, but are not otherwise defined. [6]\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\nThe operators ``in`` and ``not in`` test for collection membership.\n``x in s`` evaluates to true if *x* is a member of the collection *s*,\nand false otherwise. ``x not in s`` returns the negation of ``x in\ns``. The collection membership test has traditionally been bound to\nsequences; an object is a member of a collection if the collection is\na sequence and contains an element equal to that object. However, it\nmake sense for many other object types to support membership tests\nwithout being a sequence. In particular, dictionaries (for keys) and\nsets support membership testing.\n\nFor the list and tuple types, ``x in y`` is true if and only if there\nexists an index *i* such that ``x == y[i]`` is true.\n\nFor the Unicode and string types, ``x in y`` is true if and only if\n*x* is a substring of *y*. An equivalent test is ``y.find(x) != -1``.\nNote, *x* and *y* need not be the same type; consequently, ``u\'ab\' in\n\'abc\'`` will return ``True``. Empty strings are always considered to\nbe a substring of any other string, so ``"" in "abc"`` will return\n``True``.\n\nChanged in version 2.3: Previously, *x* was required to be a string of\nlength ``1``.\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. [7]\n', + 'integers': '\nInteger and long integer literals\n*********************************\n\nInteger and long integer literals are described by the following\nlexical definitions:\n\n longinteger ::= integer ("l" | "L")\n integer ::= decimalinteger | octinteger | hexinteger | bininteger\n decimalinteger ::= nonzerodigit digit* | "0"\n octinteger ::= "0" ("o" | "O") octdigit+ | "0" octdigit+\n hexinteger ::= "0" ("x" | "X") hexdigit+\n bininteger ::= "0" ("b" | "B") bindigit+\n nonzerodigit ::= "1"..."9"\n octdigit ::= "0"..."7"\n bindigit ::= "0" | "1"\n hexdigit ::= digit | "a"..."f" | "A"..."F"\n\nAlthough both lower case ``\'l\'`` and upper case ``\'L\'`` are allowed as\nsuffix for long integers, it is strongly recommended to always use\n``\'L\'``, since the letter ``\'l\'`` looks too much like the digit\n``\'1\'``.\n\nPlain integer literals that are above the largest representable plain\ninteger (e.g., 2147483647 when using 32-bit arithmetic) are accepted\nas if they were long integers instead. [1] There is no limit for long\ninteger literals apart from what can be stored in available memory.\n\nSome examples of plain integer literals (first row) and long integer\nliterals (second and third rows):\n\n 7 2147483647 0177\n 3L 79228162514264337593543950336L 0377L 0x100000000L\n 79228162514264337593543950336 0xdeadbeef\n', + 'lambda': '\nLambdas\n*******\n\n lambda_form ::= "lambda" [parameter_list]: expression\n old_lambda_form ::= "lambda" [parameter_list]: old_expression\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 name(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.\n', + 'lists': '\nList displays\n*************\n\nA list display is a possibly empty series of expressions enclosed in\nsquare brackets:\n\n list_display ::= "[" [expression_list | list_comprehension] "]"\n list_comprehension ::= expression list_for\n list_for ::= "for" target_list "in" old_expression_list [list_iter]\n old_expression_list ::= old_expression [("," old_expression)+ [","]]\n old_expression ::= or_test | old_lambda_form\n list_iter ::= list_for | list_if\n list_if ::= "if" old_expression [list_iter]\n\nA list display yields a new list object. Its contents are specified\nby providing either a list of expressions or a list comprehension.\nWhen a comma-separated list of expressions is supplied, its elements\nare evaluated from left to right and placed into the list object in\nthat order. When a list comprehension is supplied, it consists of a\nsingle expression followed by at least one ``for`` clause and zero or\nmore ``for`` or ``if`` clauses. In this case, the elements of the new\nlist are those that would be produced by considering each of the\n``for`` or ``if`` clauses a block, nesting from left to right, and\nevaluating the expression to produce a list element each time the\ninnermost block is reached [1].\n', + 'naming': "\nNaming and binding\n******************\n\n*Names* refer to objects. Names are introduced by name binding\noperations. Each occurrence of a name in the program text refers to\nthe *binding* of that name established in the innermost function block\ncontaining the use.\n\nA *block* is a piece of Python program text that is executed as a\nunit. The following are blocks: a module, a function body, and a class\ndefinition. Each command typed interactively is a block. A script\nfile (a file given as standard input to the interpreter or specified\non the interpreter command line the first argument) is a code block.\nA script command (a command specified on the interpreter command line\nwith the '**-c**' option) is a code block. The file read by the\nbuilt-in function ``execfile()`` is a code block. The string argument\npassed to the built-in function ``eval()`` and to the ``exec``\nstatement is a code block. The expression read and evaluated by the\nbuilt-in function ``input()`` is a code block.\n\nA code block is executed in an *execution frame*. A frame contains\nsome administrative information (used for debugging) and determines\nwhere and how execution continues after the code block's execution has\ncompleted.\n\nA *scope* defines the visibility of a name within a block. If a local\nvariable is defined in a block, its scope includes that block. If the\ndefinition occurs in a function block, the scope extends to any blocks\ncontained within the defining one, unless a contained block introduces\na different binding for the name. The scope of names defined in a\nclass block is limited to the class block; it does not extend to the\ncode blocks of methods -- this includes generator expressions since\nthey are implemented using a function scope. This means that the\nfollowing will fail:\n\n class A:\n a = 42\n b = list(a + i for i in range(10))\n\nWhen a name is used in a code block, it is resolved using the nearest\nenclosing scope. The set of all such scopes visible to a code block\nis called the block's *environment*.\n\nIf a name is bound in a block, it is a local variable of that block.\nIf a name is bound at the module level, it is a global variable. (The\nvariables of the module code block are local and global.) If a\nvariable is used in a code block but not defined there, it is a *free\nvariable*.\n\nWhen a name is not found at all, a ``NameError`` exception is raised.\nIf the name refers to a local variable that has not been bound, a\n``UnboundLocalError`` exception is raised. ``UnboundLocalError`` is a\nsubclass of ``NameError``.\n\nThe following constructs bind names: formal parameters to functions,\n``import`` statements, class and function definitions (these bind the\nclass or function name in the defining block), and targets that are\nidentifiers if occurring in an assignment, ``for`` loop header, in the\nsecond position of an ``except`` clause header or after ``as`` in a\n``with`` statement. The ``import`` statement of the form ``from ...\nimport *`` binds all names defined in the imported module, except\nthose beginning with an underscore. This form may only be used at the\nmodule level.\n\nA target occurring in a ``del`` statement is also considered bound for\nthis purpose (though the actual semantics are to unbind the name). It\nis illegal to unbind a name that is referenced by an enclosing scope;\nthe compiler will report a ``SyntaxError``.\n\nEach assignment or import statement occurs within a block defined by a\nclass or function definition or at the module level (the top-level\ncode block).\n\nIf a name binding operation occurs anywhere within a code block, all\nuses of the name within the block are treated as references to the\ncurrent block. This can lead to errors when a name is used within a\nblock before it is bound. This rule is subtle. Python lacks\ndeclarations and allows name binding operations to occur anywhere\nwithin a code block. The local variables of a code block can be\ndetermined by scanning the entire text of the block for name binding\noperations.\n\nIf the global statement occurs within a block, all uses of the name\nspecified in the statement refer to the binding of that name in the\ntop-level namespace. Names are resolved in the top-level namespace by\nsearching the global namespace, i.e. the namespace of the module\ncontaining the code block, and the builtins namespace, the namespace\nof the module ``__builtin__``. The global namespace is searched\nfirst. If the name is not found there, the builtins namespace is\nsearched. The global statement must precede all uses of the name.\n\nThe builtins namespace associated with the execution of a code block\nis actually found by looking up the name ``__builtins__`` in its\nglobal namespace; this should be a dictionary or a module (in the\nlatter case the module's dictionary is used). By default, when in the\n``__main__`` module, ``__builtins__`` is the built-in module\n``__builtin__`` (note: no 's'); when in any other module,\n``__builtins__`` is an alias for the dictionary of the ``__builtin__``\nmodule itself. ``__builtins__`` can be set to a user-created\ndictionary to create a weak form of restricted execution.\n\n**CPython implementation detail:** Users should not touch\n``__builtins__``; it is strictly an implementation detail. Users\nwanting to override values in the builtins namespace should ``import``\nthe ``__builtin__`` (no 's') module and modify its attributes\nappropriately.\n\nThe namespace for a module is automatically created the first time a\nmodule is imported. The main module for a script is always called\n``__main__``.\n\nThe ``global`` statement has the same scope as a name binding\noperation in the same block. If the nearest enclosing scope for a\nfree variable contains a global statement, the free variable is\ntreated as a global.\n\nA class definition is an executable statement that may use and define\nnames. These references follow the normal rules for name resolution.\nThe namespace of the class definition becomes the attribute dictionary\nof the class. Names defined at the class scope are not visible in\nmethods.\n\n\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\nIf ``exec`` is used in a function and the function contains or is a\nnested block with free variables, the compiler will raise a\n``SyntaxError`` unless the exec explicitly specifies the local\nnamespace for the ``exec``. (In other words, ``exec obj`` would be\nillegal, but ``exec obj in ns`` would be legal.)\n\nThe ``eval()``, ``execfile()``, and ``input()`` functions and the\n``exec`` statement do not have access to the full environment for\nresolving names. Names may be resolved in the local and global\nnamespaces of the caller. Free variables are not resolved in the\nnearest enclosing namespace, but in the global namespace. [1] The\n``exec`` statement and the ``eval()`` and ``execfile()`` functions\nhave optional arguments to override the global and local namespace.\nIf only one namespace is specified, it is used for both.\n", + 'numbers': "\nNumeric literals\n****************\n\nThere are four types of numeric literals: plain integers, long\nintegers, floating point numbers, and imaginary numbers. There are no\ncomplex literals (complex numbers can be formed by adding a real\nnumber and an imaginary 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.__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 (``+``, ``-``, ``*``, ``//``, ``%``, ``divmod()``,\n ``pow()``, ``**``, ``<<``, ``>>``, ``&``, ``^``, ``|``). For\n instance, to evaluate the expression ``x + y``, where *x* is an\n 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__()`` (described below). Note\n that ``__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.__div__(self, other)\nobject.__truediv__(self, other)\n\n The division operator (``/``) is implemented by these methods. The\n ``__truediv__()`` method is used when ``__future__.division`` is in\n effect, otherwise ``__div__()`` is used. If only one of these two\n methods is defined, the object will not support division in the\n alternate context; ``TypeError`` will be raised instead.\n\nobject.__radd__(self, other)\nobject.__rsub__(self, other)\nobject.__rmul__(self, other)\nobject.__rdiv__(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 (``+``, ``-``, ``*``, ``/``, ``%``, ``divmod()``,\n ``pow()``, ``**``, ``<<``, ``>>``, ``&``, ``^``, ``|``) with\n reflected (swapped) operands. These functions are only called if\n the left operand does not support the corresponding operation and\n the operands are of different types. [2] For instance, to evaluate\n the expression ``x - y``, where *y* is an instance of a class that\n has an ``__rsub__()`` method, ``y.__rsub__(x)`` is called if\n ``x.__sub__(y)`` returns *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.__idiv__(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.__long__(self)\nobject.__float__(self)\n\n Called to implement the built-in functions ``complex()``,\n ``int()``, ``long()``, and ``float()``. Should return a value of\n the appropriate type.\n\nobject.__oct__(self)\nobject.__hex__(self)\n\n Called to implement the built-in functions ``oct()`` and ``hex()``.\n Should return a string value.\n\nobject.__index__(self)\n\n Called to implement ``operator.index()``. Also called whenever\n Python needs an integer object (such as in slicing). Must return\n an integer (int or long).\n\n New in version 2.5.\n\nobject.__coerce__(self, other)\n\n Called to implement "mixed-mode" numeric arithmetic. Should either\n return a 2-tuple containing *self* and *other* converted to a\n common numeric type, or ``None`` if conversion is impossible. When\n the common type would be the type of ``other``, it is sufficient to\n return ``None``, since the interpreter will also ask the other\n object to attempt a coercion (but sometimes, if the implementation\n of the other type cannot be changed, it is useful to do the\n conversion to the other type here). A return value of\n ``NotImplemented`` is equivalent to returning ``None``.\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 provides a convenient way to do\nthis.\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+-------------------------------------------------+---------------------------------------+\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| | [8] |\n+-------------------------------------------------+---------------------------------------+\n| ``+x``, ``-x``, ``~x`` | Positive, negative, bitwise NOT |\n+-------------------------------------------------+---------------------------------------+\n| ``**`` | Exponentiation [9] |\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, string |\n| | conversion |\n+-------------------------------------------------+---------------------------------------+\n\n-[ Footnotes ]-\n\n[1] In Python 2.3 and later releases, a list comprehension "leaks" the\n control variables of each ``for`` it contains into the containing\n scope. However, this behavior is deprecated, and relying on it\n will not work in Python 3.0\n\n[2] 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[3] If x is very close to an exact integer multiple of y, it\'s\n possible for ``floor(x/y)`` to be one larger than ``(x-x%y)/y``\n due to rounding. In such cases, Python returns the latter result,\n in order to preserve that ``divmod(x,y)[0] * y + x % y`` be very\n close to ``x``.\n\n[4] While comparisons between unicode strings make sense at the byte\n level, they may be counter-intuitive to users. For example, the\n strings ``u"\\u00C7"`` and ``u"\\u0043\\u0327"`` compare differently,\n even 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[5] The implementation computes this efficiently, without constructing\n lists or sorting.\n\n[6] Earlier versions of Python used lexicographic comparison of the\n sorted (key, value) lists, but this was very expensive for the\n common case of comparing for equality. An even earlier version of\n Python compared dictionaries by identity only, but this caused\n surprises because people expected to be able to test a dictionary\n for emptiness by comparing it to ``{}``.\n\n[7] 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[8] The ``%`` operator is also used for string formatting; the same\n precedence applies.\n\n[9] 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. The result type is that of the\narguments after coercion.\n\nWith mixed operand types, the coercion rules for binary arithmetic\noperators apply. For int and long int operands, the result has the\nsame type as the operands (after coercion) unless the second argument\nis negative; in that case, all arguments are converted to float and a\nfloat result is delivered. For example, ``10**2`` returns ``100``, but\n``10**-2`` returns ``0.01``. (This last feature was added in Python\n2.2. In Python 2.1 and before, if both arguments were of integer types\nand the second argument was negative, an exception was raised).\n\nRaising ``0.0`` to a negative power results in a\n``ZeroDivisionError``. Raising a negative number to a fractional power\nresults in a ``ValueError``.\n', + 'raise': '\nThe ``raise`` statement\n***********************\n\n raise_stmt ::= "raise" [expression ["," expression ["," 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 ``TypeError`` exception is raised indicating that\nthis is an error (if running under IDLE, a ``Queue.Empty`` exception\nis raised instead).\n\nOtherwise, ``raise`` evaluates the expressions to get three objects,\nusing ``None`` as the value of omitted expressions. The first two\nobjects are used to determine the *type* and *value* of the exception.\n\nIf the first object is an instance, the type of the exception is the\nclass of the instance, the instance itself is the value, and the\nsecond object must be ``None``.\n\nIf the first object is a class, it becomes the type of the exception.\nThe second object is used to determine the exception value: If it is\nan instance of the class, the instance becomes the exception value. If\nthe second object is a tuple, it is used as the argument list for the\nclass constructor; if it is ``None``, an empty argument list is used,\nand any other object is treated as a single argument to the\nconstructor. The instance so created by calling the constructor is\nused as the exception value.\n\nIf a third object is present and not ``None``, it must be a traceback\nobject (see section *The standard type hierarchy*), and it is\nsubstituted instead of the current location as the place where the\nexception occurred. If the third object is present and not a\ntraceback object or ``None``, a ``TypeError`` exception is raised.\nThe three-expression form of ``raise`` is useful to re-raise an\nexception transparently in an except clause, but ``raise`` with no\nexpressions should be preferred if the exception to be re-raised was\nthe most recently active exception in the current scope.\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', + '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. (For backwards compatibility, the method\n``__getslice__()`` (see below) can also be defined to handle simple,\nbut not extended slices.) It is also recommended that mappings provide\nthe methods ``keys()``, ``values()``, ``items()``, ``has_key()``,\n``get()``, ``clear()``, ``setdefault()``, ``iterkeys()``,\n``itervalues()``, ``iteritems()``, ``pop()``, ``popitem()``,\n``copy()``, and ``update()`` behaving similar to those for Python's\nstandard dictionary objects. The ``UserDict`` module provides a\n``DictMixin`` class to help create those methods from a base set of\n``__getitem__()``, ``__setitem__()``, ``__delitem__()``, and\n``keys()``. Mutable sequences should provide methods ``append()``,\n``count()``, ``index()``, ``extend()``, ``insert()``, ``pop()``,\n``remove()``, ``reverse()`` and ``sort()``, like Python standard list\nobjects. Finally, sequence types should implement addition (meaning\nconcatenation) and multiplication (meaning repetition) by defining the\nmethods ``__add__()``, ``__radd__()``, ``__iadd__()``, ``__mul__()``,\n``__rmul__()`` and ``__imul__()`` described below; they should not\ndefine ``__coerce__()`` or other numerical operators. It is\nrecommended that both mappings and sequences implement the\n``__contains__()`` method to allow efficient use of the ``in``\noperator; for mappings, ``in`` should be equivalent of ``has_key()``;\nfor sequences, 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``iterkeys()``; 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 ``__nonzero__()`` method and whose\n ``__len__()`` method returns zero is considered to be false in a\n Boolean context.\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 ``iterkeys()``.\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\n New in version 2.6.\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 plain or long integers as arguments. The\narguments are converted to a common type. 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,\nn)``. Negative shift counts raise a ``ValueError`` exception.\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 ::= simple_slicing | extended_slicing\n simple_slicing ::= primary "[" short_slice "]"\n extended_slicing ::= primary "[" slice_list "]"\n slice_list ::= slice_item ("," slice_item)* [","]\n slice_item ::= expression | proper_slice | ellipsis\n proper_slice ::= short_slice | long_slice\n short_slice ::= [lower_bound] ":" [upper_bound]\n long_slice ::= short_slice ":" [stride]\n lower_bound ::= expression\n upper_bound ::= expression\n stride ::= expression\n ellipsis ::= "..."\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 nor ellipses). Similarly, when the slice\nlist has exactly one short slice and no trailing comma, the\ninterpretation as a simple slicing takes priority over that as an\nextended slicing.\n\nThe semantics for a simple slicing are as follows. The primary must\nevaluate to a sequence object. The lower and upper bound expressions,\nif present, must evaluate to plain integers; defaults are zero and the\n``sys.maxint``, respectively. If either bound is negative, the\nsequence\'s length is added to it. The slicing now selects all items\nwith index *k* such that ``i <= k < j`` where *i* and *j* are the\nspecified lower and upper bounds. This may be an empty sequence. It\nis not an error if *i* or *j* lie outside the range of valid indexes\n(such items don\'t exist so they aren\'t selected).\n\nThe semantics for an extended slicing are as follows. The primary\nmust evaluate to a mapping object, and it is indexed with a key that\nis constructed 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 an ellipsis slice\nitem is the built-in ``Ellipsis`` object. The conversion of a proper\nslice is a slice object (see section *The standard type hierarchy*)\nwhose ``start``, ``stop`` and ``step`` attributes are the values of\nthe expressions 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\nobject.__methods__\n\n Deprecated since version 2.2: Use the built-in function ``dir()``\n to get a list of an object\'s attributes. This attribute is no\n longer available.\n\nobject.__members__\n\n Deprecated since version 2.2: Use the built-in function ``dir()``\n to get a list of an object\'s attributes. This attribute is no\n longer available.\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\nThe following attributes are only supported by *new-style class*es.\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 new-style class keeps a list of weak references to its\n immediate subclasses. This method returns a list of all those\n references still alive. Example:\n\n >>> int.__subclasses__()\n []\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\n[6] The advantage of leaving the newline on is that returning an empty\n string is then an unambiguous EOF indication. It is also possible\n (in cases where it might matter, for example, if you want to make\n an exact copy of a file while scanning its lines) to tell whether\n the last line of a file ended in a newline or not (yes this\n happens!).\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 ``x.__getitem__(i)`` for\nold-style classes and ``type(x).__getitem__(x, i)`` for new-style\nclasses. Except where mentioned, attempts to execute an operation\nraise an 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_traceback`` 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.exc_traceback`` or ``sys.last_traceback``. Circular\n references which are garbage are detected when the option cycle\n detector is enabled (it\'s on by default), but can only be cleaned\n up if there are no Python-level ``__del__()`` methods involved.\n Refer to the documentation for the ``gc`` module for more\n information about how ``__del__()`` methods are handled by the\n cycle detector, particularly the description of the ``garbage``\n 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\n See also the *-R* command-line option.\n\nobject.__repr__(self)\n\n Called by the ``repr()`` built-in function and by string\n conversions (reverse quotes) to compute the "official" string\n representation of an object. If at all possible, this should look\n like a valid Python expression that could be used to recreate an\n object with the same value (given an appropriate environment). If\n this is not possible, a string of the form ``<...some useful\n description...>`` should be returned. The return value must be a\n string object. If a class defines ``__repr__()`` but not\n ``__str__()``, then ``__repr__()`` is also used when an "informal"\n string representation of instances of that class is 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 statement 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.__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 New in version 2.1.\n\n These are the so-called "rich comparison" methods, and are called\n for comparison operators in preference to ``__cmp__()`` below. The\n correspondence between operator symbols and method names is as\n follows: ``xy`` call ``x.__ne__(y)``, ``x>y`` calls ``x.__gt__(y)``, and\n ``x>=y`` calls ``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.__cmp__(self, other)\n\n Called by comparison operations if rich comparison (see above) is\n not defined. Should return a negative integer if ``self < other``,\n zero if ``self == other``, a positive integer if ``self > other``.\n If no ``__cmp__()``, ``__eq__()`` or ``__ne__()`` operation is\n defined, class instances are compared by object identity\n ("address"). See also the description of ``__hash__()`` for some\n important notes on creating *hashable* objects which support custom\n comparison operations and are usable as dictionary keys. (Note: the\n restriction that exceptions are not propagated by ``__cmp__()`` has\n been removed since Python 1.5.)\n\nobject.__rcmp__(self, other)\n\n Changed in version 2.1: No longer supported.\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 a ``__cmp__()`` or ``__eq__()`` method\n it should not define a ``__hash__()`` operation either; if it\n defines ``__cmp__()`` or ``__eq__()`` but not ``__hash__()``, its\n instances will not be usable in hashed collections. If a class\n defines mutable objects and implements a ``__cmp__()`` or\n ``__eq__()`` method, it should not implement ``__hash__()``, since\n hashable collection implementations require that a object\'s hash\n value is immutable (if the object\'s hash value changes, it will be\n in the wrong hash bucket).\n\n User-defined classes have ``__cmp__()`` 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 ``__cmp__()`` or ``__eq__()`` such that\n the hash value returned is no longer appropriate (e.g. by switching\n to a value-based concept of equality instead of the default\n identity based equality) can explicitly flag themselves as being\n unhashable by setting ``__hash__ = None`` in the class definition.\n Doing so means that not only will instances of the class raise an\n appropriate ``TypeError`` when a program attempts to retrieve their\n hash value, but they will also be correctly identified as\n unhashable when checking ``isinstance(obj, collections.Hashable)``\n (unlike classes which define their own ``__hash__()`` to explicitly\n raise ``TypeError``).\n\n Changed in version 2.5: ``__hash__()`` may now also return a long\n integer object; the 32-bit integer is then derived from the hash of\n that object.\n\n Changed in version 2.6: ``__hash__`` may now be set to ``None`` to\n explicitly flag instances of a class as unhashable.\n\nobject.__nonzero__(self)\n\n Called to implement truth value testing and the built-in operation\n ``bool()``; should return ``False`` or ``True``, or their integer\n equivalents ``0`` or ``1``. When this method is not defined,\n ``__len__()`` is called, if it is defined, and the object is\n considered true if its result is nonzero. If a class defines\n neither ``__len__()`` nor ``__nonzero__()``, all its instances are\n considered true.\n\nobject.__unicode__(self)\n\n Called to implement ``unicode()`` built-in; should return a Unicode\n object. When this method is not defined, string conversion is\n attempted, and the result of string conversion is converted to\n Unicode using the system default encoding.\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 in new-style classes.\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 not simply execute ``self.name = value`` --- this would\n cause a recursive call to itself. Instead, it should insert the\n value in the dictionary of instance attributes, e.g.,\n ``self.__dict__[name] = value``. For new-style classes, rather\n than accessing the instance dictionary, it should call the base\n 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\n\nMore attribute access for new-style classes\n-------------------------------------------\n\nThe following methods only apply to new-style classes.\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 for new-style\n classes*.\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. Note that descriptors are only invoked for new\nstyle objects or classes (ones that subclass ``object()`` or\n``type()``).\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 a new-style object instance, ``a.x`` is transformed\n into the call: ``type(a).__dict__[\'x\'].__get__(a, type(a))``.\n\nClass Binding\n If binding to a new-style class, ``A.x`` is transformed into the\n call: ``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 both old and new-style classes have a\ndictionary for attribute storage. This wastes space for objects\nhaving very few instance variables. The space consumption can become\nacute when creating large numbers of instances.\n\nThe default can be overridden by defining *__slots__* in a new-style\nclass definition. The *__slots__* declaration takes a sequence of\ninstance variables and reserves just enough space in each instance to\nhold a value for each variable. Space is saved because *__dict__* is\nnot created for each instance.\n\n__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 new-style class, *__slots__* reserves space for the declared\n variables and prevents the automatic creation of *__dict__* and\n *__weakref__* for each instance.\n\n New in version 2.2.\n\nNotes on using *__slots__*\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 Changed in version 2.3: Previously, adding ``\'__dict__\'`` to the\n *__slots__* declaration would not enable the assignment of new\n attributes not specifically listed in the sequence of instance\n variable names.\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 Changed in version 2.3: Previously, adding ``\'__weakref__\'`` to the\n *__slots__* declaration would not enable support for weak\n references.\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 ``long``, ``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 Changed in version 2.6: Previously, *__class__* assignment raised an\n error if either new or old class had *__slots__*.\n\n\nCustomizing class creation\n==========================\n\nBy default, new-style classes are constructed using ``type()``. A\nclass definition is read into a separate namespace and the value of\nclass name is bound to the result of ``type(name, bases, dict)``.\n\nWhen the class definition is read, if *__metaclass__* is defined then\nthe callable assigned to it will be called instead of ``type()``. 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\n__metaclass__\n\n This variable can be any callable accepting arguments for ``name``,\n ``bases``, and ``dict``. Upon class creation, the callable is used\n instead of the built-in ``type()``.\n\n New in version 2.2.\n\nThe appropriate metaclass is determined by the following precedence\nrules:\n\n* If ``dict[\'__metaclass__\']`` exists, it is used.\n\n* Otherwise, if there is at least one base class, its metaclass is\n used (this looks for a *__class__* attribute first and if not found,\n uses its type).\n\n* Otherwise, if a global variable named __metaclass__ exists, it is\n used.\n\n* Otherwise, the old-style, classic metaclass (types.ClassType) is\n 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\n\nCustomizing instance and subclass checks\n========================================\n\nNew in version 2.6.\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. (For backwards compatibility, the method\n``__getslice__()`` (see below) can also be defined to handle simple,\nbut not extended slices.) It is also recommended that mappings provide\nthe methods ``keys()``, ``values()``, ``items()``, ``has_key()``,\n``get()``, ``clear()``, ``setdefault()``, ``iterkeys()``,\n``itervalues()``, ``iteritems()``, ``pop()``, ``popitem()``,\n``copy()``, and ``update()`` behaving similar to those for Python\'s\nstandard dictionary objects. The ``UserDict`` module provides a\n``DictMixin`` class to help create those methods from a base set of\n``__getitem__()``, ``__setitem__()``, ``__delitem__()``, and\n``keys()``. Mutable sequences should provide methods ``append()``,\n``count()``, ``index()``, ``extend()``, ``insert()``, ``pop()``,\n``remove()``, ``reverse()`` and ``sort()``, like Python standard list\nobjects. Finally, sequence types should implement addition (meaning\nconcatenation) and multiplication (meaning repetition) by defining the\nmethods ``__add__()``, ``__radd__()``, ``__iadd__()``, ``__mul__()``,\n``__rmul__()`` and ``__imul__()`` described below; they should not\ndefine ``__coerce__()`` or other numerical operators. It is\nrecommended that both mappings and sequences implement the\n``__contains__()`` method to allow efficient use of the ``in``\noperator; for mappings, ``in`` should be equivalent of ``has_key()``;\nfor sequences, 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``iterkeys()``; 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 ``__nonzero__()`` method and whose\n ``__len__()`` method returns zero is considered to be false in a\n Boolean context.\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 ``iterkeys()``.\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\n New in version 2.6.\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\nAdditional methods for emulation of sequence types\n==================================================\n\nThe following optional methods can be defined to further emulate\nsequence objects. Immutable sequences methods should at most only\ndefine ``__getslice__()``; mutable sequences might define all three\nmethods.\n\nobject.__getslice__(self, i, j)\n\n Deprecated since version 2.0: Support slice objects as parameters\n to the ``__getitem__()`` method. (However, built-in types in\n CPython currently still implement ``__getslice__()``. Therefore,\n you have to override it in derived classes when implementing\n slicing.)\n\n Called to implement evaluation of ``self[i:j]``. The returned\n object should be of the same type as *self*. Note that missing *i*\n or *j* in the slice expression are replaced by zero or\n ``sys.maxint``, respectively. If negative indexes are used in the\n slice, the length of the sequence is added to that index. If the\n instance does not implement the ``__len__()`` method, an\n ``AttributeError`` is raised. No guarantee is made that indexes\n adjusted this way are not still negative. Indexes which are\n greater than the length of the sequence are not modified. If no\n ``__getslice__()`` is found, a slice object is created instead, and\n passed to ``__getitem__()`` instead.\n\nobject.__setslice__(self, i, j, sequence)\n\n Called to implement assignment to ``self[i:j]``. Same notes for *i*\n and *j* as for ``__getslice__()``.\n\n This method is deprecated. If no ``__setslice__()`` is found, or\n for extended slicing of the form ``self[i:j:k]``, a slice object is\n created, and passed to ``__setitem__()``, instead of\n ``__setslice__()`` being called.\n\nobject.__delslice__(self, i, j)\n\n Called to implement deletion of ``self[i:j]``. Same notes for *i*\n and *j* as for ``__getslice__()``. This method is deprecated. If no\n ``__delslice__()`` is found, or for extended slicing of the form\n ``self[i:j:k]``, a slice object is created, and passed to\n ``__delitem__()``, instead of ``__delslice__()`` being called.\n\nNotice that these methods are only invoked when a single slice with a\nsingle colon is used, and the slice method is available. For slice\noperations involving extended slice notation, or in absence of the\nslice methods, ``__getitem__()``, ``__setitem__()`` or\n``__delitem__()`` is called with a slice object as argument.\n\nThe following example demonstrate how to make your program or module\ncompatible with earlier versions of Python (assuming that methods\n``__getitem__()``, ``__setitem__()`` and ``__delitem__()`` support\nslice objects as arguments):\n\n class MyClass:\n ...\n def __getitem__(self, index):\n ...\n def __setitem__(self, index, value):\n ...\n def __delitem__(self, index):\n ...\n\n if sys.version_info < (2, 0):\n # They won\'t be defined if version is at least 2.0 final\n\n def __getslice__(self, i, j):\n return self[max(0, i):max(0, j):]\n def __setslice__(self, i, j, seq):\n self[max(0, i):max(0, j):] = seq\n def __delslice__(self, i, j):\n del self[max(0, i):max(0, j):]\n ...\n\nNote the calls to ``max()``; these are necessary because of the\nhandling of negative indices before the ``__*slice__()`` methods are\ncalled. When negative indexes are used, the ``__*item__()`` methods\nreceive them as provided, but the ``__*slice__()`` methods get a\n"cooked" form of the index values. For each negative index value, the\nlength of the sequence is added to the index before calling the method\n(which may still result in a negative index); this is the customary\nhandling of negative indexes by the built-in sequence types, and the\n``__*item__()`` methods are expected to do this as well. However,\nsince they should already be doing that, negative indexes cannot be\npassed in; they must be constrained to the bounds of the sequence\nbefore being passed to the ``__*item__()`` methods. Calling ``max(0,\ni)`` conveniently returns the proper value.\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.__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 (``+``, ``-``, ``*``, ``//``, ``%``, ``divmod()``,\n ``pow()``, ``**``, ``<<``, ``>>``, ``&``, ``^``, ``|``). For\n instance, to evaluate the expression ``x + y``, where *x* is an\n 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__()`` (described below). Note\n that ``__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.__div__(self, other)\nobject.__truediv__(self, other)\n\n The division operator (``/``) is implemented by these methods. The\n ``__truediv__()`` method is used when ``__future__.division`` is in\n effect, otherwise ``__div__()`` is used. If only one of these two\n methods is defined, the object will not support division in the\n alternate context; ``TypeError`` will be raised instead.\n\nobject.__radd__(self, other)\nobject.__rsub__(self, other)\nobject.__rmul__(self, other)\nobject.__rdiv__(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 (``+``, ``-``, ``*``, ``/``, ``%``, ``divmod()``,\n ``pow()``, ``**``, ``<<``, ``>>``, ``&``, ``^``, ``|``) with\n reflected (swapped) operands. These functions are only called if\n the left operand does not support the corresponding operation and\n the operands are of different types. [2] For instance, to evaluate\n the expression ``x - y``, where *y* is an instance of a class that\n has an ``__rsub__()`` method, ``y.__rsub__(x)`` is called if\n ``x.__sub__(y)`` returns *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.__idiv__(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.__long__(self)\nobject.__float__(self)\n\n Called to implement the built-in functions ``complex()``,\n ``int()``, ``long()``, and ``float()``. Should return a value of\n the appropriate type.\n\nobject.__oct__(self)\nobject.__hex__(self)\n\n Called to implement the built-in functions ``oct()`` and ``hex()``.\n Should return a string value.\n\nobject.__index__(self)\n\n Called to implement ``operator.index()``. Also called whenever\n Python needs an integer object (such as in slicing). Must return\n an integer (int or long).\n\n New in version 2.5.\n\nobject.__coerce__(self, other)\n\n Called to implement "mixed-mode" numeric arithmetic. Should either\n return a 2-tuple containing *self* and *other* converted to a\n common numeric type, or ``None`` if conversion is impossible. When\n the common type would be the type of ``other``, it is sufficient to\n return ``None``, since the interpreter will also ask the other\n object to attempt a coercion (but sometimes, if the implementation\n of the other type cannot be changed, it is useful to do the\n conversion to the other type here). A return value of\n ``NotImplemented`` is equivalent to returning ``None``.\n\n\nCoercion rules\n==============\n\nThis section used to document the rules for coercion. As the language\nhas evolved, the coercion rules have become hard to document\nprecisely; documenting what one version of one particular\nimplementation does is undesirable. Instead, here are some informal\nguidelines regarding coercion. In Python 3.0, coercion will not be\nsupported.\n\n* If the left operand of a % operator is a string or Unicode object,\n no coercion takes place and the string formatting operation is\n invoked instead.\n\n* It is no longer recommended to define a coercion operation. Mixed-\n mode operations on types that don\'t define coercion pass the\n original arguments to the operation.\n\n* New-style classes (those derived from ``object``) never invoke the\n ``__coerce__()`` method in response to a binary operator; the only\n time ``__coerce__()`` is invoked is when the built-in function\n ``coerce()`` is called.\n\n* For most intents and purposes, an operator that returns\n ``NotImplemented`` is treated the same as one that is not\n implemented at all.\n\n* Below, ``__op__()`` and ``__rop__()`` are used to signify the\n generic method names corresponding to an operator; ``__iop__()`` is\n used for the corresponding in-place operator. For example, for the\n operator \'``+``\', ``__add__()`` and ``__radd__()`` are used for the\n left and right variant of the binary operator, and ``__iadd__()``\n for the in-place variant.\n\n* For objects *x* and *y*, first ``x.__op__(y)`` is tried. If this is\n not implemented or returns ``NotImplemented``, ``y.__rop__(x)`` is\n tried. If this is also not implemented or returns\n ``NotImplemented``, a ``TypeError`` exception is raised. But see\n the following exception:\n\n* Exception to the previous item: if the left operand is an instance\n of a built-in type or a new-style class, and the right operand is an\n instance of a proper subclass of that type or class and overrides\n the base\'s ``__rop__()`` method, the right operand\'s ``__rop__()``\n method is tried *before* the left operand\'s ``__op__()`` method.\n\n This is done so that a subclass can completely override binary\n operators. Otherwise, the left operand\'s ``__op__()`` method would\n always accept the right operand: when an instance of a given class\n is expected, an instance of a subclass of that class is always\n acceptable.\n\n* When either operand type defines a coercion, this coercion is called\n before that type\'s ``__op__()`` or ``__rop__()`` method is called,\n but no sooner. If the coercion returns an object of a different\n type for the operand whose coercion is invoked, part of the process\n is redone using the new object.\n\n* When an in-place operator (like \'``+=``\') is used, if the left\n operand implements ``__iop__()``, it is invoked without any\n coercion. When the operation falls back to ``__op__()`` and/or\n ``__rop__()``, the normal coercion rules apply.\n\n* In ``x + y``, if *x* is a sequence that implements sequence\n concatenation, sequence concatenation is invoked.\n\n* In ``x * y``, if one operand is a sequence that implements sequence\n repetition, and the other is an integer (``int`` or ``long``),\n sequence repetition is invoked.\n\n* Rich comparisons (implemented by methods ``__eq__()`` and so on)\n never use coercion. Three-way comparison (implemented by\n ``__cmp__()``) does use coercion under the same conditions as other\n binary operations use it.\n\n* In the current implementation, the built-in numeric types ``int``,\n ``long``, ``float``, and ``complex`` do not use coercion. All these\n types implement a ``__coerce__()`` method, for use by the built-in\n ``coerce()`` function.\n\n Changed in version 2.7.\n\n\nWith Statement Context Managers\n===============================\n\nNew in version 2.5.\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 for old-style classes\n===========================================\n\nFor old-style classes, special methods are always looked up in exactly\nthe same way as any other method or attribute. This is the case\nregardless of whether the method is being looked up explicitly as in\n``x.__getitem__(i)`` or implicitly as in ``x[i]``.\n\nThis behaviour means that special methods may exhibit different\nbehaviour for different instances of a single old-style class if the\nappropriate special attributes are set differently:\n\n >>> class C:\n ... pass\n ...\n >>> c1 = C()\n >>> c2 = C()\n >>> c1.__len__ = lambda: 5\n >>> c2.__len__ = lambda: 9\n >>> len(c1)\n 5\n >>> len(c2)\n 9\n\n\nSpecial method lookup for new-style classes\n===========================================\n\nFor new-style classes, implicit invocations of special methods are\nonly guaranteed to work correctly if defined on an object\'s type, not\nin the object\'s instance dictionary. That behaviour is the reason why\nthe following code raises an exception (unlike the equivalent example\nwith old-style classes):\n\n >>> class C(object):\n ... pass\n ...\n >>> c = C()\n >>> c.__len__ = lambda: 5\n >>> len(c)\n Traceback (most recent call last):\n File "", line 1, in \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 "", line 1, in \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):\n ... __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\nBelow are listed the string methods which both 8-bit strings and\nUnicode objects support. Some of them are also available on\n``bytearray`` objects.\n\nIn addition, Python\'s strings support the sequence type methods\ndescribed in the *Sequence Types --- str, unicode, list, tuple,\nbytearray, buffer, xrange* section. To output formatted strings use\ntemplate strings or the ``%`` operator described in the *String\nFormatting Operations* section. Also, see the ``re`` module for string\nfunctions based 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\n For 8-bit strings, this method is locale-dependent.\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\n Changed in version 2.4: Support for the *fillchar* argument.\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.decode([encoding[, errors]])\n\n Decodes the string using the codec registered for *encoding*.\n *encoding* defaults to the default string encoding. *errors* may\n be given to set a different error handling scheme. The default is\n ``\'strict\'``, meaning that encoding errors raise ``UnicodeError``.\n Other possible values are ``\'ignore\'``, ``\'replace\'`` and any other\n name registered via ``codecs.register_error()``, see section *Codec\n Base Classes*.\n\n New in version 2.2.\n\n Changed in version 2.3: Support for other error handling schemes\n added.\n\n Changed in version 2.7: Support for keyword arguments added.\n\nstr.encode([encoding[, errors]])\n\n Return an encoded version of the string. Default encoding is the\n current default string encoding. *errors* may be given to set a\n different error handling scheme. The default for *errors* is\n ``\'strict\'``, meaning that encoding errors raise a\n ``UnicodeError``. Other possible values are ``\'ignore\'``,\n ``\'replace\'``, ``\'xmlcharrefreplace\'``, ``\'backslashreplace\'`` and\n any other name registered via ``codecs.register_error()``, see\n section *Codec Base Classes*. For a list of possible encodings, see\n section *Standard Encodings*.\n\n New in version 2.0.\n\n Changed in version 2.3: Support for ``\'xmlcharrefreplace\'`` and\n ``\'backslashreplace\'`` and other error handling schemes added.\n\n Changed in version 2.7: 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\n Changed in version 2.5: Accept tuples as *suffix*.\n\nstr.expandtabs([tabsize])\n\n Return a copy of the string where all tab characters are replaced\n by one 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\n This method of string formatting is the new standard in Python 3.0,\n and should be preferred to the ``%`` formatting described in\n *String Formatting Operations* in new code.\n\n New in version 2.6.\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.\n\n For 8-bit strings, this method is locale-dependent.\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.\n\n For 8-bit strings, this method is locale-dependent.\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.\n\n For 8-bit strings, this method is locale-dependent.\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\n For 8-bit strings, this method is locale-dependent.\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.\n\n For 8-bit strings, this method is locale-dependent.\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\n For 8-bit strings, this method is locale-dependent.\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\n For 8-bit strings, this method is locale-dependent.\n\nstr.join(iterable)\n\n Return a string which is the concatenation of the strings in the\n *iterable* *iterable*. The separator between elements is the\n 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\n Changed in version 2.4: Support for the *fillchar* argument.\n\nstr.lower()\n\n Return a copy of the string with all the cased characters [4]\n converted to lowercase.\n\n For 8-bit strings, this method is locale-dependent.\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\n Changed in version 2.2.2: Support for the *chars* argument.\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\n New in version 2.5.\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\n Changed in version 2.4: Support for the *fillchar* argument.\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\n New in version 2.5.\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\n New in version 2.4.\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\n Changed in version 2.2.2: Support for the *chars* argument.\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\n Changed in version 2.5: Accept tuples as *prefix*.\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\n Changed in version 2.2.2: Support for the *chars* argument.\n\nstr.swapcase()\n\n Return a copy of the string with uppercase characters converted to\n lowercase and vice versa.\n\n For 8-bit strings, this method is locale-dependent.\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\n For 8-bit strings, this method is locale-dependent.\n\nstr.translate(table[, deletechars])\n\n Return a copy of the string where all characters occurring in the\n optional argument *deletechars* are removed, and the remaining\n characters have been mapped through the given translation table,\n which must be a string of length 256.\n\n You can use the ``maketrans()`` helper function in the ``string``\n module to create a translation table. For string objects, set the\n *table* argument to ``None`` for translations that only delete\n characters:\n\n >>> \'read this short text\'.translate(None, \'aeiou\')\n \'rd ths shrt txt\'\n\n New in version 2.6: Support for a ``None`` *table* argument.\n\n For Unicode objects, the ``translate()`` method does not accept the\n optional *deletechars* argument. Instead, it returns a copy of the\n *s* where all characters have been mapped through the given\n translation table which must be a mapping of Unicode ordinals to\n Unicode ordinals, Unicode strings or ``None``. Unmapped characters\n are left untouched. Characters mapped to ``None`` are deleted.\n Note, a more flexible approach is to create a custom character\n mapping codec using the ``codecs`` module (see ``encodings.cp1251``\n 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 For 8-bit strings, this method is locale-dependent.\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 New in version 2.2.2.\n\nThe following methods are present only on unicode objects:\n\nunicode.isnumeric()\n\n Return ``True`` if there are only numeric characters in S,\n ``False`` otherwise. Numeric characters include digit characters,\n and all characters that have the Unicode numeric value property,\n e.g. U+2155, VULGAR FRACTION ONE FIFTH.\n\nunicode.isdecimal()\n\n Return ``True`` if there are only decimal characters in S,\n ``False`` otherwise. Decimal characters include digit characters,\n and all characters that can be used to form decimal-radix numbers,\n e.g. U+0660, ARABIC-INDIC DIGIT ZERO.\n', + 'strings': '\nString literals\n***************\n\nString literals are described by the following lexical definitions:\n\n stringliteral ::= [stringprefix](shortstring | longstring)\n stringprefix ::= "r" | "u" | "ur" | "R" | "U" | "UR" | "Ur" | "uR"\n | "b" | "B" | "br" | "Br" | "bR" | "BR"\n shortstring ::= "\'" shortstringitem* "\'" | \'"\' shortstringitem* \'"\'\n longstring ::= "\'\'\'" longstringitem* "\'\'\'"\n | \'"""\' longstringitem* \'"""\'\n shortstringitem ::= shortstringchar | escapeseq\n longstringitem ::= longstringchar | escapeseq\n shortstringchar ::= \n longstringchar ::= \n escapeseq ::= "\\" \n\nOne syntactic restriction not indicated by these productions is that\nwhitespace is not allowed between the ``stringprefix`` and the rest of\nthe string literal. The source character set is defined by the\nencoding declaration; it is ASCII if no encoding declaration is given\nin the source file; see section *Encoding declarations*.\n\nIn plain English: String literals can be enclosed in matching single\nquotes (``\'``) or double quotes (``"``). They can also be enclosed in\nmatching groups of three single or double quotes (these are generally\nreferred to as *triple-quoted strings*). The backslash (``\\``)\ncharacter is used to escape characters that otherwise have a special\nmeaning, such as newline, backslash itself, or the quote character.\nString literals may optionally be prefixed with a letter ``\'r\'`` or\n``\'R\'``; such strings are called *raw strings* and use different rules\nfor interpreting backslash escape sequences. A prefix of ``\'u\'`` or\n``\'U\'`` makes the string a Unicode string. Unicode strings use the\nUnicode character set as defined by the Unicode Consortium and ISO\n10646. Some additional escape sequences, described below, are\navailable in Unicode strings. A prefix of ``\'b\'`` or ``\'B\'`` is\nignored in Python 2; it indicates that the literal should become a\nbytes literal in Python 3 (e.g. when code is automatically converted\nwith 2to3). A ``\'u\'`` or ``\'b\'`` prefix may be followed by an ``\'r\'``\nprefix.\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`` | 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| ``\\N{name}`` | Character named *name* in the | |\n| | Unicode database (Unicode only) | |\n+-------------------+-----------------------------------+---------+\n| ``\\r`` | ASCII Carriage Return (CR) | |\n+-------------------+-----------------------------------+---------+\n| ``\\t`` | ASCII Horizontal Tab (TAB) | |\n+-------------------+-----------------------------------+---------+\n| ``\\uxxxx`` | Character with 16-bit hex value | (1) |\n| | *xxxx* (Unicode only) | |\n+-------------------+-----------------------------------+---------+\n| ``\\Uxxxxxxxx`` | Character with 32-bit hex value | (2) |\n| | *xxxxxxxx* (Unicode only) | |\n+-------------------+-----------------------------------+---------+\n| ``\\v`` | ASCII Vertical Tab (VT) | |\n+-------------------+-----------------------------------+---------+\n| ``\\ooo`` | Character with octal value *ooo* | (3,5) |\n+-------------------+-----------------------------------+---------+\n| ``\\xhh`` | Character with hex value *hh* | (4,5) |\n+-------------------+-----------------------------------+---------+\n\nNotes:\n\n1. Individual code units which form parts of a surrogate pair can be\n encoded using this escape sequence.\n\n2. 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). Individual code units which form parts of a surrogate\n pair can be encoded using this escape sequence.\n\n3. As in Standard C, up to three octal digits are accepted.\n\n4. Unlike in Standard C, exactly two hex digits are required.\n\n5. In a string literal, hexadecimal and octal escapes denote the byte\n with the given value; it is not necessary that the byte encodes a\n character in the source character set. In a Unicode literal, these\n escapes denote a Unicode character with the given value.\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 marked as "(Unicode only)"\nin the table above fall into the category of unrecognized escapes for\nnon-Unicode string literals.\n\nWhen an ``\'r\'`` or ``\'R\'`` prefix is present, a character following a\nbackslash is included in the string without change, and *all\nbackslashes are left in the string*. For example, the string literal\n``r"\\n"`` consists of two characters: a backslash and a lowercase\n``\'n\'``. String quotes can be escaped with a backslash, but the\nbackslash remains in the string; for example, ``r"\\""`` is a valid\nstring literal consisting of two characters: a backslash and a double\nquote; ``r"\\"`` is not a valid string literal (even a raw string\ncannot end in an odd number of backslashes). Specifically, *a raw\nstring cannot end in a single backslash* (since the backslash would\nescape 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\nWhen an ``\'r\'`` or ``\'R\'`` prefix is used in conjunction with a\n``\'u\'`` or ``\'U\'`` prefix, then the ``\\uXXXX`` and ``\\UXXXXXXXX``\nescape sequences are processed while *all other backslashes are left\nin the string*. For example, the string literal ``ur"\\u0062\\n"``\nconsists of three Unicode characters: \'LATIN SMALL LETTER B\', \'REVERSE\nSOLIDUS\', and \'LATIN SMALL LETTER N\'. Backslashes can be escaped with\na preceding backslash; however, both remain in the string. As a\nresult, ``\\uXXXX`` escape sequences are only recognized when there are\nan odd number of backslashes.\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 of a sequence or mapping type.\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 a\nplain integer. If this value is negative, the length of the sequence\nis added to it (so that, e.g., ``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).\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``, ``0L``, ``0.0``,\n ``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 ``__nonzero__()`` or ``__len__()`` method, when that method returns\n the 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\nChanged in version 2.5: In previous versions of Python,\n``try``...``except``...``finally`` did not work. ``try``...``except``\nhad to be nested in ``try``...``finally``.\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, a tuple containing an item compatible with the\nexception, or, in the (deprecated) case of string exceptions, is the\nraised string itself (note that the object identities must match, i.e.\nit must be the same string object, not just a string with the same\nvalue).\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 in that except clause, if present, and the except\nclause\'s suite is executed. All except clauses must have an\nexecutable block. When the end of this block is reached, execution\ncontinues normally after the entire try statement. (This means that\nif two nested handlers exist for the same exception, and the exception\noccurs in the try clause of the inner handler, the outer handler will\nnot handle the exception.)\n\nBefore an except clause\'s suite is executed, details about the\nexception are assigned to three variables in the ``sys`` module:\n``sys.exc_type`` receives the object identifying the exception;\n``sys.exc_value`` receives the exception\'s parameter;\n``sys.exc_traceback`` receives a traceback object (see section *The\nstandard type hierarchy*) identifying the point in the program where\nthe exception occurred. These details are also available through the\n``sys.exc_info()`` function, which returns a tuple ``(exc_type,\nexc_value, exc_traceback)``. Use of the corresponding variables is\ndeprecated in favor of this function, since their use is unsafe in a\nthreaded program. As of Python 1.5, the variables are restored to\ntheir previous values (before the call) when returning from a function\nthat 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 lost. The exception information is not available to the\nprogram during execution 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.).\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 built-in name\n ``Ellipsis``. It is used to indicate the presence of the ``...``\n syntax in a slice. 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 three types of integers:\n\n Plain integers\n These represent numbers in the range -2147483648 through\n 2147483647. (The range may be larger on machines with a\n larger natural word size, but not smaller.) When the result\n of an operation would fall outside this range, the result is\n normally returned as a long integer (in some cases, the\n exception ``OverflowError`` is raised instead). For the\n purpose of shift and mask operations, integers are assumed to\n have a binary, 2\'s complement notation using 32 or more bits,\n and hiding no bits from the user (i.e., all 4294967296\n different bit patterns correspond to different values).\n\n Long integers\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\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 plain\n integers, 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 and the least surprises when\n switching between the plain and long integer domains. Any\n operation, if it yields a result in the plain integer domain,\n will yield the same result in the long integer domain or when\n using mixed operands. The switch between domains is transparent\n to the programmer.\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``\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 are characters. There is no separate\n character type; a character is represented by a string of one\n item. Characters represent (at least) 8-bit bytes. The\n built-in functions ``chr()`` and ``ord()`` convert between\n characters and nonnegative integers representing the byte\n values. Bytes with the values 0-127 usually represent the\n corresponding ASCII values, but the interpretation of values\n is up to the program. The string data type is also used to\n represent arrays of bytes, e.g., to hold data read from a\n file.\n\n (On systems whose native character set is not ASCII, strings\n may use EBCDIC in their internal representation, provided the\n functions ``chr()`` and ``ord()`` implement a mapping between\n ASCII and EBCDIC, and string comparison preserves the ASCII\n order. Or perhaps someone can propose a better rule?)\n\n Unicode\n The items of a Unicode object are Unicode code units. A\n Unicode code unit is represented by a Unicode 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 ``unichr()`` 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 Unicode method ``encode()`` and the\n built-in function ``unicode()``.\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 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.\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``, ``gdbm``, and ``bsddb`` provide\n additional examples of mapping types.\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 | ``func_doc`` | The function\'s documentation | Writable |\n | | string, or ``None`` if | |\n | | unavailable | |\n +-------------------------+---------------------------------+-------------+\n | ``__doc__`` | Another way of spelling | Writable |\n | | ``func_doc`` | |\n +-------------------------+---------------------------------+-------------+\n | ``func_name`` | The function\'s name | Writable |\n +-------------------------+---------------------------------+-------------+\n | ``__name__`` | Another way of spelling | Writable |\n | | ``func_name`` | |\n +-------------------------+---------------------------------+-------------+\n | ``__module__`` | The name of the module the | Writable |\n | | function was defined in, or | |\n | | ``None`` if unavailable. | |\n +-------------------------+---------------------------------+-------------+\n | ``func_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 | ``func_code`` | The code object representing | Writable |\n | | the compiled function body. | |\n +-------------------------+---------------------------------+-------------+\n | ``func_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 | ``func_dict`` | The namespace supporting | Writable |\n | | arbitrary function attributes. | |\n +-------------------------+---------------------------------+-------------+\n | ``func_closure`` | ``None`` or a tuple of cells | Read-only |\n | | that contain bindings for the | |\n | | function\'s free variables. | |\n +-------------------------+---------------------------------+-------------+\n\n Most of the attributes labelled "Writable" check the type of the\n assigned value.\n\n Changed in version 2.4: ``func_name`` is now writable.\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 User-defined methods\n A user-defined method object combines a class, a class instance\n (or ``None``) and any callable object (normally a user-defined\n function).\n\n Special read-only attributes: ``im_self`` is the class instance\n object, ``im_func`` is the function object; ``im_class`` is the\n class of ``im_self`` for bound methods or the class that asked\n for the method for unbound methods; ``__doc__`` is the method\'s\n documentation (same as ``im_func.__doc__``); ``__name__`` is the\n method name (same as ``im_func.__name__``); ``__module__`` is\n the name of the module the method was defined in, or ``None`` if\n unavailable.\n\n Changed in version 2.2: ``im_self`` used to refer to the class\n that defined the method.\n\n Changed in version 2.6: For 3.0 forward-compatibility,\n ``im_func`` is also available as ``__func__``, and ``im_self``\n as ``__self__``.\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, an unbound\n user-defined method object, or a class method object. When the\n attribute is a user-defined method object, a new method object\n is only created if the class from which it is being retrieved is\n the same as, or a derived class of, the class stored in the\n original method object; otherwise, the original method object is\n used as it is.\n\n When a user-defined method object is created by retrieving a\n user-defined function object from a class, its ``im_self``\n attribute is ``None`` and the method object is said to be\n unbound. When one is created by retrieving a user-defined\n function object from a class via one of its instances, its\n ``im_self`` attribute is the instance, and the method object is\n said to be bound. In either case, the new method\'s ``im_class``\n attribute is the class from which the retrieval takes place, and\n its ``im_func`` 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 ``im_func``\n attribute of the new instance is not the original method object\n but its ``im_func`` attribute.\n\n When a user-defined method object is created by retrieving a\n class method object from a class or instance, its ``im_self``\n attribute is the class itself (the same as the ``im_class``\n attribute), and its ``im_func`` attribute is the function object\n underlying the class method.\n\n When an unbound user-defined method object is called, the\n underlying function (``im_func``) is called, with the\n restriction that the first argument must be an instance of the\n proper class (``im_class``) or of a derived class thereof.\n\n When a bound user-defined method object is called, the\n underlying function (``im_func``) is called, inserting the class\n instance (``im_self``) in front of the argument list. For\n instance, when ``C`` is a class which contains a definition for\n a function ``f()``, and ``x`` is an instance of ``C``, calling\n ``x.f(1)`` is equivalent to calling ``C.f(x, 1)``.\n\n When a user-defined method object is derived from a class method\n object, the "class instance" stored in ``im_self`` will actually\n be the class itself, so that calling either ``x.f(1)`` or\n ``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 (unbound or\n bound) method object happens each time the attribute is\n retrieved from the class or instance. In some cases, a fruitful\n optimization is to assign the attribute to a local variable and\n call that local variable. Also notice that this transformation\n only happens for user-defined functions; other callable objects\n (and all non-callable objects) are retrieved without\n transformation. It is also important to note that user-defined\n functions which are attributes of a class instance are not\n converted to bound methods; this *only* happens when the\n function is an attribute 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 Class Types\n Class types, or "new-style classes," are callable. These\n objects normally act as factories for new instances of\n themselves, but variations are possible for class types that\n override ``__new__()``. The arguments of the call are passed to\n ``__new__()`` and, in the typical case, to ``__init__()`` to\n initialize the new instance.\n\n Classic Classes\n Class objects are described below. When a class object is\n called, a new class instance (also described below) is created\n and returned. This implies a call to the class\'s ``__init__()``\n method if it has one. Any arguments are passed on to the\n ``__init__()`` method. If there is no ``__init__()`` method,\n the class must be called without arguments.\n\n Class instances\n Class instances are described below. Class instances are\n callable only when the class has a ``__call__()`` method;\n ``x(arguments)`` is a shorthand for ``x.__call__(arguments)``.\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 func_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\nClasses\n Both class types (new-style classes) and class objects (old-\n style/classic classes) are typically created by class definitions\n (see section *Class definitions*). A class has a namespace\n implemented by a dictionary object. Class attribute references are\n translated to lookups in this dictionary, e.g., ``C.x`` is\n translated to ``C.__dict__["x"]`` (although for new-style classes\n in particular there are a number of hooks which allow for other\n means of locating attributes). When the attribute name is not found\n there, the attribute search continues in the base classes. For\n old-style classes, the search is depth-first, left-to-right in the\n order of occurrence in the base class list. New-style classes use\n the more complex C3 method resolution order which behaves correctly\n even in the presence of \'diamond\' inheritance structures where\n there are multiple inheritance paths leading back to a common\n ancestor. Additional details on the C3 MRO used by new-style\n classes can be found in the documentation accompanying the 2.3\n release at http://www.python.org/download/releases/2.3/mro/.\n\n When a class attribute reference (for class ``C``, say) would yield\n a user-defined function object or an unbound user-defined method\n object whose associated class is either ``C`` or one of its base\n classes, it is transformed into an unbound user-defined method\n object whose ``im_class`` attribute is ``C``. When it would yield a\n class method object, it is transformed into a bound user-defined\n method object whose ``im_class`` and ``im_self`` attributes are\n both ``C``. When it would yield a static method object, it is\n transformed into the object wrapped by the static method object.\n See section *Implementing Descriptors* for another way in which\n attributes retrieved from a class may differ from those actually\n contained in its ``__dict__`` (note that only new-style classes\n support descriptors).\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 or an unbound user-defined method object whose\n associated class is the class (call it ``C``) of the instance for\n which the attribute reference was initiated or one of its bases, it\n is transformed into a bound user-defined method object whose\n ``im_class`` attribute is ``C`` and whose ``im_self`` attribute is\n the instance. Static method and class method objects are also\n transformed, as if they had been retrieved from class ``C``; see\n above under "Classes". See section *Implementing Descriptors* for\n another way in which attributes of a class retrieved via its\n instances may differ from the objects actually stored in the\n class\'s ``__dict__``. If no class attribute is found, and the\n object\'s class has a ``__getattr__()`` method, that is called to\n satisfy the 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\nFiles\n A file object represents an open file. File objects are created by\n the ``open()`` built-in function, and also by ``os.popen()``,\n ``os.fdopen()``, and the ``makefile()`` method of socket objects\n (and perhaps by other functions or methods provided by extension\n modules). The objects ``sys.stdin``, ``sys.stdout`` and\n ``sys.stderr`` are initialized to file objects corresponding to the\n interpreter\'s standard input, output and error streams. See *File\n Objects* for complete documentation of file objects.\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_restricted`` is a flag indicating whether the function is\n executing in restricted execution mode; ``f_lasti`` gives the\n precise instruction (this is an index into the bytecode string\n 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_exc_type``, ``f_exc_value``,\n ``f_exc_traceback`` represent the last exception raised in the\n parent frame provided another exception was ever raised in the\n current frame (in all other cases they are None); ``f_lineno``\n is the current line number of the frame --- writing to this from\n within a trace function jumps to the given line (only for the\n bottom-most frame). A debugger can implement a Jump command\n (aka Set Next Statement) 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 ``sys.exc_traceback``,\n and also as the third item of the tuple returned by\n ``sys.exc_info()``. The latter is the preferred interface,\n since it works correctly when the program is using multiple\n threads. When the program contains no suitable handler, the\n stack trace is written (nicely formatted) to the standard error\n stream; if the interpreter is interactive, it is also made\n available to the user as ``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 when *extended slice\n syntax* is used. This is a slice using two colons, or multiple\n slices or ellipses separated by commas, e.g., ``a[i:j:step]``,\n ``a[i:j, k:l]``, or ``a[..., i:j]``. They are also created by\n the built-in ``slice()`` 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 extended slice that the slice\n object would describe if applied to a sequence of *length*\n items. It returns a tuple of three integers; respectively\n these are the *start* and *stop* indices and the *step* or\n stride length of the slice. Missing or out-of-bounds indices\n are handled in a manner consistent with regular slices.\n\n New in version 2.3.\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 is\n 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 New in version 2.2.\n\n Changed in version 2.3: Support for building a dictionary from\n keyword arguments added.\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 New in version 2.5: If a subclass of dict defines a method\n ``__missing__()``, if the key *key* is not present, the\n ``d[key]`` operation calls that method with the key *key* as\n argument. The ``d[key]`` operation then returns or raises\n whatever is returned or raised by the ``__missing__(key)`` call\n if the key is not present. No other operations or methods invoke\n ``__missing__()``. If ``__missing__()`` is not defined,\n ``KeyError`` is raised. ``__missing__()`` must be a method; it\n cannot be an instance variable. For an example, see\n ``collections.defaultdict``.\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 New in version 2.2.\n\n key not in d\n\n Equivalent to ``not key in d``.\n\n New in version 2.2.\n\n iter(d)\n\n Return an iterator over the keys of the dictionary. This is a\n shortcut for ``iterkeys()``.\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 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 New in version 2.3.\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 has_key(key)\n\n Test for the presence of *key* in the dictionary. ``has_key()``\n is deprecated in favor of ``key in d``.\n\n items()\n\n Return a copy of the dictionary\'s list of ``(key, value)``\n pairs.\n\n **CPython implementation detail:** Keys and values are listed in\n an arbitrary order which is non-random, varies across Python\n implementations, and depends on the dictionary\'s history of\n insertions and deletions.\n\n If ``items()``, ``keys()``, ``values()``, ``iteritems()``,\n ``iterkeys()``, and ``itervalues()`` are called with no\n intervening modifications to the dictionary, the lists will\n directly correspond. This allows the creation of ``(value,\n key)`` pairs using ``zip()``: ``pairs = zip(d.values(),\n d.keys())``. The same relationship holds for the ``iterkeys()``\n and ``itervalues()`` methods: ``pairs = zip(d.itervalues(),\n d.iterkeys())`` provides the same value for ``pairs``. Another\n way to create the same list is ``pairs = [(v, k) for (k, v) in\n d.iteritems()]``.\n\n iteritems()\n\n Return an iterator over the dictionary\'s ``(key, value)`` pairs.\n See the note for ``dict.items()``.\n\n Using ``iteritems()`` while adding or deleting entries in the\n dictionary may raise a ``RuntimeError`` or fail to iterate over\n all entries.\n\n New in version 2.2.\n\n iterkeys()\n\n Return an iterator over the dictionary\'s keys. See the note for\n ``dict.items()``.\n\n Using ``iterkeys()`` while adding or deleting entries in the\n dictionary may raise a ``RuntimeError`` or fail to iterate over\n all entries.\n\n New in version 2.2.\n\n itervalues()\n\n Return an iterator over the dictionary\'s values. See the note\n for ``dict.items()``.\n\n Using ``itervalues()`` while adding or deleting entries in the\n dictionary may raise a ``RuntimeError`` or fail to iterate over\n all entries.\n\n New in version 2.2.\n\n keys()\n\n Return a copy of the dictionary\'s list of keys. See the note\n for ``dict.items()``.\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 New in version 2.3.\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 Changed in version 2.4: Allowed the argument to be an iterable\n of key/value pairs and allowed keyword arguments.\n\n values()\n\n Return a copy of the dictionary\'s list of values. See the note\n for ``dict.items()``.\n\n viewitems()\n\n Return a new view of the dictionary\'s items (``(key, value)``\n pairs). See below for documentation of view objects.\n\n New in version 2.7.\n\n viewkeys()\n\n Return a new view of the dictionary\'s keys. See below for\n documentation of view objects.\n\n New in version 2.7.\n\n viewvalues()\n\n Return a new view of the dictionary\'s values. See below for\n documentation of view objects.\n\n New in version 2.7.\n\n\nDictionary view objects\n=======================\n\nThe objects returned by ``dict.viewkeys()``, ``dict.viewvalues()`` and\n``dict.viewitems()`` are *view objects*. They provide a dynamic view\non the 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 and\nhashable, then the items view is also set-like. (Values views are not\ntreated as set-like since the entries are generally not unique.) Then\nthese set operations are available ("other" refers either to another\nview or a set):\n\ndictview & other\n\n Return the intersection of the dictview and the other object as a\n new set.\n\ndictview | other\n\n Return the union of the dictview and the other object as a new set.\n\ndictview - other\n\n Return the difference between the dictview and the other object\n (all elements in *dictview* that aren\'t in *other*) as a new set.\n\ndictview ^ other\n\n Return the symmetric difference (all elements either in *dictview*\n or *other*, but not in both) of the dictview and the other object\n as a new set.\n\nAn example of dictionary view usage:\n\n >>> dishes = {\'eggs\': 2, \'sausage\': 1, \'bacon\': 1, \'spam\': 500}\n >>> keys = dishes.viewkeys()\n >>> values = dishes.viewvalues()\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', + '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\nThe implementation adds two special read-only attributes to class\ninstance methods: ``m.im_self`` is the object on which the method\noperates, and ``m.im_func`` is the function implementing the method.\nCalling ``m(arg-1, arg-2, ..., arg-n)`` is completely equivalent to\ncalling ``m.im_func(m.im_self, arg-1, arg-2, ..., arg-n)``.\n\nClass instance methods are either *bound* or *unbound*, referring to\nwhether the method was accessed through an instance or a class,\nrespectively. When a method is unbound, its ``im_self`` attribute\nwill be ``None`` and if called, an explicit ``self`` object must be\npassed as the first argument. In this case, ``self`` must be an\ninstance of the unbound method's class (or a subclass of that class),\notherwise a ``TypeError`` is raised.\n\nLike function objects, methods objects support getting arbitrary\nattributes. However, since method attributes are actually stored on\nthe underlying function object (``meth.im_func``), setting method\nattributes on either bound or unbound methods is disallowed.\nAttempting to set a method attribute results in a ``TypeError`` being\nraised. In order to set a method attribute, you need to explicitly\nset it on the underlying function object:\n\n class C:\n def method(self):\n pass\n\n c = C()\n c.method.im_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: ````. If loaded from a file, they are written as\n````.\n", + 'typesseq': '\nSequence Types --- ``str``, ``unicode``, ``list``, ``tuple``, ``bytearray``, ``buffer``, ``xrange``\n***************************************************************************************************\n\nThere are seven sequence types: strings, Unicode strings, lists,\ntuples, bytearrays, buffers, and xrange objects.\n\nFor other containers see the built in ``dict`` and ``set`` classes,\nand the ``collections`` module.\n\nString literals are written in single or double quotes: ``\'xyzzy\'``,\n``"frobozz"``. See *String literals* for more about string literals.\nUnicode strings are much like strings, but are specified in the syntax\nusing a preceding ``\'u\'`` character: ``u\'abc\'``, ``u"def"``. In\naddition to the functionality described here, there are also string-\nspecific methods described in the *String Methods* section. Lists are\nconstructed with square brackets, separating items with commas: ``[a,\nb, c]``. Tuples are constructed by the comma operator (not within\nsquare brackets), with or without enclosing parentheses, but an empty\ntuple must have the enclosing parentheses, such as ``a, b, c`` or\n``()``. A single item tuple must have a trailing comma, such as\n``(d,)``.\n\nBytearray objects are created with the built-in function\n``bytearray()``.\n\nBuffer objects are not directly supported by Python syntax, but can be\ncreated by calling the built-in function ``buffer()``. They don\'t\nsupport concatenation or repetition.\n\nObjects of type xrange are similar to buffers in that there is no\nspecific syntax to create them, but they are created using the\n``xrange()`` function. They don\'t support slicing, concatenation or\nrepetition, and using ``in``, ``not in``, ``min()`` or ``max()`` on\nthem 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* and *j* 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 compare\nequal and the two sequences must be of the same type and have the same\nlength. (For full details see *Comparisons* in the language\nreference.)\n\nNotes:\n\n1. When *s* is a string or Unicode string object the ``in`` and ``not\n in`` operations act like a substring test. In Python versions\n before 2.3, *x* had to be a string of length 1. In Python 2.3 and\n beyond, *x* may be a string of any length.\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. **CPython implementation detail:** If *s* and *t* are both strings,\n some Python implementations such as CPython can usually perform an\n in-place optimization for assignments of the form ``s = s + t`` or\n ``s += t``. When applicable, this optimization makes quadratic\n run-time much less likely. This optimization is both version and\n implementation dependent. For performance sensitive code, it is\n preferable to use the ``str.join()`` method which assures\n consistent linear concatenation performance across versions and\n implementations.\n\n Changed in version 2.4: Formerly, string concatenation never\n occurred in-place.\n\n\nString Methods\n==============\n\nBelow are listed the string methods which both 8-bit strings and\nUnicode objects support. Some of them are also available on\n``bytearray`` objects.\n\nIn addition, Python\'s strings support the sequence type methods\ndescribed in the *Sequence Types --- str, unicode, list, tuple,\nbytearray, buffer, xrange* section. To output formatted strings use\ntemplate strings or the ``%`` operator described in the *String\nFormatting Operations* section. Also, see the ``re`` module for string\nfunctions based 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\n For 8-bit strings, this method is locale-dependent.\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\n Changed in version 2.4: Support for the *fillchar* argument.\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.decode([encoding[, errors]])\n\n Decodes the string using the codec registered for *encoding*.\n *encoding* defaults to the default string encoding. *errors* may\n be given to set a different error handling scheme. The default is\n ``\'strict\'``, meaning that encoding errors raise ``UnicodeError``.\n Other possible values are ``\'ignore\'``, ``\'replace\'`` and any other\n name registered via ``codecs.register_error()``, see section *Codec\n Base Classes*.\n\n New in version 2.2.\n\n Changed in version 2.3: Support for other error handling schemes\n added.\n\n Changed in version 2.7: Support for keyword arguments added.\n\nstr.encode([encoding[, errors]])\n\n Return an encoded version of the string. Default encoding is the\n current default string encoding. *errors* may be given to set a\n different error handling scheme. The default for *errors* is\n ``\'strict\'``, meaning that encoding errors raise a\n ``UnicodeError``. Other possible values are ``\'ignore\'``,\n ``\'replace\'``, ``\'xmlcharrefreplace\'``, ``\'backslashreplace\'`` and\n any other name registered via ``codecs.register_error()``, see\n section *Codec Base Classes*. For a list of possible encodings, see\n section *Standard Encodings*.\n\n New in version 2.0.\n\n Changed in version 2.3: Support for ``\'xmlcharrefreplace\'`` and\n ``\'backslashreplace\'`` and other error handling schemes added.\n\n Changed in version 2.7: 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\n Changed in version 2.5: Accept tuples as *suffix*.\n\nstr.expandtabs([tabsize])\n\n Return a copy of the string where all tab characters are replaced\n by one 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\n This method of string formatting is the new standard in Python 3.0,\n and should be preferred to the ``%`` formatting described in\n *String Formatting Operations* in new code.\n\n New in version 2.6.\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.\n\n For 8-bit strings, this method is locale-dependent.\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.\n\n For 8-bit strings, this method is locale-dependent.\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.\n\n For 8-bit strings, this method is locale-dependent.\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\n For 8-bit strings, this method is locale-dependent.\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.\n\n For 8-bit strings, this method is locale-dependent.\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\n For 8-bit strings, this method is locale-dependent.\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\n For 8-bit strings, this method is locale-dependent.\n\nstr.join(iterable)\n\n Return a string which is the concatenation of the strings in the\n *iterable* *iterable*. The separator between elements is the\n 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\n Changed in version 2.4: Support for the *fillchar* argument.\n\nstr.lower()\n\n Return a copy of the string with all the cased characters [4]\n converted to lowercase.\n\n For 8-bit strings, this method is locale-dependent.\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\n Changed in version 2.2.2: Support for the *chars* argument.\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\n New in version 2.5.\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\n Changed in version 2.4: Support for the *fillchar* argument.\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\n New in version 2.5.\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\n New in version 2.4.\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\n Changed in version 2.2.2: Support for the *chars* argument.\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\n Changed in version 2.5: Accept tuples as *prefix*.\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\n Changed in version 2.2.2: Support for the *chars* argument.\n\nstr.swapcase()\n\n Return a copy of the string with uppercase characters converted to\n lowercase and vice versa.\n\n For 8-bit strings, this method is locale-dependent.\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\n For 8-bit strings, this method is locale-dependent.\n\nstr.translate(table[, deletechars])\n\n Return a copy of the string where all characters occurring in the\n optional argument *deletechars* are removed, and the remaining\n characters have been mapped through the given translation table,\n which must be a string of length 256.\n\n You can use the ``maketrans()`` helper function in the ``string``\n module to create a translation table. For string objects, set the\n *table* argument to ``None`` for translations that only delete\n characters:\n\n >>> \'read this short text\'.translate(None, \'aeiou\')\n \'rd ths shrt txt\'\n\n New in version 2.6: Support for a ``None`` *table* argument.\n\n For Unicode objects, the ``translate()`` method does not accept the\n optional *deletechars* argument. Instead, it returns a copy of the\n *s* where all characters have been mapped through the given\n translation table which must be a mapping of Unicode ordinals to\n Unicode ordinals, Unicode strings or ``None``. Unmapped characters\n are left untouched. Characters mapped to ``None`` are deleted.\n Note, a more flexible approach is to create a custom character\n mapping codec using the ``codecs`` module (see ``encodings.cp1251``\n 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 For 8-bit strings, this method is locale-dependent.\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 New in version 2.2.2.\n\nThe following methods are present only on unicode objects:\n\nunicode.isnumeric()\n\n Return ``True`` if there are only numeric characters in S,\n ``False`` otherwise. Numeric characters include digit characters,\n and all characters that have the Unicode numeric value property,\n e.g. U+2155, VULGAR FRACTION ONE FIFTH.\n\nunicode.isdecimal()\n\n Return ``True`` if there are only decimal characters in S,\n ``False`` otherwise. Decimal characters include digit characters,\n and all characters that can be used to form decimal-radix numbers,\n e.g. U+0660, ARABIC-INDIC DIGIT ZERO.\n\n\nString Formatting Operations\n============================\n\nString and Unicode objects have one unique built-in operation: the\n``%`` operator (modulo). This is also known as the string\n*formatting* or *interpolation* operator. Given ``format % values``\n(where *format* is a string or Unicode object), ``%`` conversion\nspecifications in *format* are replaced with zero or more elements of\n*values*. The effect is similar to the using ``sprintf()`` in the C\nlanguage. If *format* is a Unicode object, or if any of the objects\nbeing converted using the ``%s`` conversion are Unicode objects, the\nresult will also be a Unicode object.\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 width\n is read from the next element of the tuple in *values*, and the\n 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()``). | (6) |\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. The ``%r`` conversion was added in Python 2.0.\n\n The precision determines the maximal number of characters used.\n\n6. If the object or format provided is a ``unicode`` string, the\n resulting string will also be ``unicode``.\n\n The precision determines the maximal number of characters used.\n\n7. 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 2.7: ``%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\nXRange Type\n===========\n\nThe ``xrange`` type is an immutable sequence which is commonly used\nfor looping. The advantage of the ``xrange`` type is that an\n``xrange`` object will always take the same amount of memory, no\nmatter the size of the range it represents. There are no consistent\nperformance advantages.\n\nXRange objects have very little behavior: they only support indexing,\niteration, and the ``len()`` function.\n\n\nMutable Sequence Types\n======================\n\nList and ``bytearray`` objects support additional operations that\nallow in-place modification of the object. Other mutable sequence\ntypes (when added to the language) should also support these\noperations. Strings and tuples are immutable sequence types: such\nobjects cannot be modified once created. The following operations are\ndefined on mutable sequence types (where *x* is an arbitrary object):\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)] = | (2) |\n| | [x]`` | |\n+--------------------------------+----------------------------------+-----------------------+\n| ``s.extend(x)`` | same as ``s[len(s):len(s)] = x`` | (3) |\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 | (4) |\n| | ``s[k] == x`` and ``i <= k < j`` | |\n+--------------------------------+----------------------------------+-----------------------+\n| ``s.insert(i, x)`` | same as ``s[i:i] = [x]`` | (5) |\n+--------------------------------+----------------------------------+-----------------------+\n| ``s.pop([i])`` | same as ``x = s[i]; del s[i]; | (6) |\n| | return x`` | |\n+--------------------------------+----------------------------------+-----------------------+\n| ``s.remove(x)`` | same as ``del s[s.index(x)]`` | (4) |\n+--------------------------------+----------------------------------+-----------------------+\n| ``s.reverse()`` | reverses the items of *s* in | (7) |\n| | place | |\n+--------------------------------+----------------------------------+-----------------------+\n| ``s.sort([cmp[, key[, | sort the items of *s* in place | (7)(8)(9)(10) |\n| reverse]]])`` | | |\n+--------------------------------+----------------------------------+-----------------------+\n\nNotes:\n\n1. *t* must have the same length as the slice it is replacing.\n\n2. The C implementation of Python has historically accepted multiple\n parameters and implicitly joined them into a tuple; this no longer\n works in Python 2.0. Use of this misfeature has been deprecated\n since Python 1.4.\n\n3. *x* can be any iterable object.\n\n4. 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 list length is added, as for slice indices. If it is\n still negative, it is truncated to zero, as for slice indices.\n\n Changed in version 2.3: Previously, ``index()`` didn\'t have\n arguments for specifying start and stop positions.\n\n5. When a negative index is passed as the first parameter to the\n ``insert()`` method, the list length is added, as for slice\n indices. If it is still negative, it is truncated to zero, as for\n slice indices.\n\n Changed in version 2.3: Previously, all negative indices were\n truncated to zero.\n\n6. The ``pop()`` method is only supported by the list and array types.\n The optional argument *i* defaults to ``-1``, so that by default\n the last item is removed and returned.\n\n7. The ``sort()`` and ``reverse()`` methods modify the list in place\n for economy of space when sorting or reversing a large list. To\n remind you that they operate by side effect, they don\'t return the\n sorted or reversed list.\n\n8. The ``sort()`` method takes optional arguments for controlling the\n comparisons.\n\n *cmp* specifies a custom comparison function of two arguments (list\n items) which should return a negative, zero or positive number\n depending on whether the first argument is considered smaller than,\n equal to, or larger than the second argument: ``cmp=lambda x,y:\n cmp(x.lower(), y.lower())``. The default value is ``None``.\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``.\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 In general, the *key* and *reverse* conversion processes are much\n faster than specifying an equivalent *cmp* function. This is\n because *cmp* is called multiple times for each list element while\n *key* and *reverse* touch each element only once. Use\n ``functools.cmp_to_key()`` to convert an old-style *cmp* function\n to a *key* function.\n\n Changed in version 2.3: Support for ``None`` as an equivalent to\n omitting *cmp* was added.\n\n Changed in version 2.4: Support for *key* and *reverse* was added.\n\n9. Starting with Python 2.3, the ``sort()`` method is guaranteed to be\n stable. A sort is stable if it guarantees not to change the\n relative order of elements that compare equal --- this is helpful\n for sorting in multiple passes (for example, sort by department,\n then by salary grade).\n\n10. **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 2.3 and newer makes the\n list appear empty for the duration, and raises ``ValueError`` if\n it can detect that the list has been mutated during a sort.\n', + 'typesseq-mutable': "\nMutable Sequence Types\n**********************\n\nList and ``bytearray`` objects support additional operations that\nallow in-place modification of the object. Other mutable sequence\ntypes (when added to the language) should also support these\noperations. Strings and tuples are immutable sequence types: such\nobjects cannot be modified once created. The following operations are\ndefined on mutable sequence types (where *x* is an arbitrary object):\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)] = | (2) |\n| | [x]`` | |\n+--------------------------------+----------------------------------+-----------------------+\n| ``s.extend(x)`` | same as ``s[len(s):len(s)] = x`` | (3) |\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 | (4) |\n| | ``s[k] == x`` and ``i <= k < j`` | |\n+--------------------------------+----------------------------------+-----------------------+\n| ``s.insert(i, x)`` | same as ``s[i:i] = [x]`` | (5) |\n+--------------------------------+----------------------------------+-----------------------+\n| ``s.pop([i])`` | same as ``x = s[i]; del s[i]; | (6) |\n| | return x`` | |\n+--------------------------------+----------------------------------+-----------------------+\n| ``s.remove(x)`` | same as ``del s[s.index(x)]`` | (4) |\n+--------------------------------+----------------------------------+-----------------------+\n| ``s.reverse()`` | reverses the items of *s* in | (7) |\n| | place | |\n+--------------------------------+----------------------------------+-----------------------+\n| ``s.sort([cmp[, key[, | sort the items of *s* in place | (7)(8)(9)(10) |\n| reverse]]])`` | | |\n+--------------------------------+----------------------------------+-----------------------+\n\nNotes:\n\n1. *t* must have the same length as the slice it is replacing.\n\n2. The C implementation of Python has historically accepted multiple\n parameters and implicitly joined them into a tuple; this no longer\n works in Python 2.0. Use of this misfeature has been deprecated\n since Python 1.4.\n\n3. *x* can be any iterable object.\n\n4. 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 list length is added, as for slice indices. If it is\n still negative, it is truncated to zero, as for slice indices.\n\n Changed in version 2.3: Previously, ``index()`` didn't have\n arguments for specifying start and stop positions.\n\n5. When a negative index is passed as the first parameter to the\n ``insert()`` method, the list length is added, as for slice\n indices. If it is still negative, it is truncated to zero, as for\n slice indices.\n\n Changed in version 2.3: Previously, all negative indices were\n truncated to zero.\n\n6. The ``pop()`` method is only supported by the list and array types.\n The optional argument *i* defaults to ``-1``, so that by default\n the last item is removed and returned.\n\n7. The ``sort()`` and ``reverse()`` methods modify the list in place\n for economy of space when sorting or reversing a large list. To\n remind you that they operate by side effect, they don't return the\n sorted or reversed list.\n\n8. The ``sort()`` method takes optional arguments for controlling the\n comparisons.\n\n *cmp* specifies a custom comparison function of two arguments (list\n items) which should return a negative, zero or positive number\n depending on whether the first argument is considered smaller than,\n equal to, or larger than the second argument: ``cmp=lambda x,y:\n cmp(x.lower(), y.lower())``. The default value is ``None``.\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``.\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 In general, the *key* and *reverse* conversion processes are much\n faster than specifying an equivalent *cmp* function. This is\n because *cmp* is called multiple times for each list element while\n *key* and *reverse* touch each element only once. Use\n ``functools.cmp_to_key()`` to convert an old-style *cmp* function\n to a *key* function.\n\n Changed in version 2.3: Support for ``None`` as an equivalent to\n omitting *cmp* was added.\n\n Changed in version 2.4: Support for *key* and *reverse* was added.\n\n9. Starting with Python 2.3, the ``sort()`` method is guaranteed to be\n stable. A sort is stable if it guarantees not to change the\n relative order of elements that compare equal --- this is helpful\n for sorting in multiple passes (for example, sort by department,\n then by salary grade).\n\n10. **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 2.3 and newer makes the\n list appear empty for the duration, and raises ``ValueError`` if\n it can detect that the list has been mutated during a sort.\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\nplain or long integer argument. The bitwise inversion of ``x`` is\ndefined as ``-(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\nNew in version 2.5.\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\nNote: In Python 2.5, the ``with`` statement is only allowed when the\n ``with_statement`` feature has been enabled. It is always enabled\n in Python 2.6.\n\nChanged in version 2.7: 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.\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 generator\'s ``next()``\nmethod 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\nAs of Python version 2.5, the ``yield`` statement is now allowed in\nthe ``try`` clause of a ``try`` ... ``finally`` construct. If the\ngenerator is not resumed before it is finalized (by reaching a zero\nreference count or by being garbage collected), the generator-\niterator\'s ``close()`` method will be called, allowing any pending\n``finally`` clauses to execute.\n\nNote: In Python 2.2, the ``yield`` statement was only allowed when the\n ``generators`` feature has been enabled. This ``__future__`` import\n statement was used to enable the feature:\n\n from __future__ import generators\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'} -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Fri Feb 24 00:10:16 2012 From: python-checkins at python.org (victor.stinner) Date: Fri, 24 Feb 2012 00:10:16 +0100 Subject: [Python-checkins] =?utf8?q?cpython=3A_Issue_=2313846=3A_Enhance_t?= =?utf8?q?ime=2Emonotonic=28=29_documentation?= Message-ID: http://hg.python.org/cpython/rev/50b1f2d07011 changeset: 75227:50b1f2d07011 parent: 75225:d937a32fe173 user: Victor Stinner date: Fri Feb 24 00:10:45 2012 +0100 summary: Issue #13846: Enhance time.monotonic() documentation files: Doc/library/time.rst | 5 +++-- 1 files changed, 3 insertions(+), 2 deletions(-) diff --git a/Doc/library/time.rst b/Doc/library/time.rst --- a/Doc/library/time.rst +++ b/Doc/library/time.rst @@ -228,8 +228,9 @@ .. function:: monotonic() - Monotonic clock. The reference point of the returned value is undefined so - only the difference of consecutive calls is valid. + Monotonic non-decreasing clock. The clock is not related to the system clock + and cannot go backward. The reference point of the returned + value is undefined so only the difference of consecutive calls is valid. .. versionadded:: 3.3 -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Fri Feb 24 00:30:16 2012 From: python-checkins at python.org (brett.cannon) Date: Fri, 24 Feb 2012 00:30:16 +0100 Subject: [Python-checkins] =?utf8?q?cpython=3A_Do_a_type_check_instead_of_?= =?utf8?q?an_interface_check=2E?= Message-ID: http://hg.python.org/cpython/rev/909935a236e3 changeset: 75228:909935a236e3 parent: 75194:6f578f73d14a user: Brett Cannon date: Thu Feb 23 18:18:48 2012 -0500 summary: Do a type check instead of an interface check. files: Lib/importlib/_bootstrap.py | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Lib/importlib/_bootstrap.py b/Lib/importlib/_bootstrap.py --- a/Lib/importlib/_bootstrap.py +++ b/Lib/importlib/_bootstrap.py @@ -920,12 +920,12 @@ def _sanity_check(name, package, level): """Verify arguments are "sane".""" - if not hasattr(name, 'rpartition'): + 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 hasattr(package, 'rindex'): + if not isinstance(package, str): raise ValueError("__package__ not set to a string") elif package not in sys.modules: msg = ("Parent module {0!r} not loaded, cannot perform relative " -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Fri Feb 24 00:30:17 2012 From: python-checkins at python.org (brett.cannon) Date: Fri, 24 Feb 2012 00:30:17 +0100 Subject: [Python-checkins] =?utf8?q?cpython=3A_Improper_type_for_=5F=5Fpac?= =?utf8?q?kage=5F=5F_should_raise_TypeError=2C_not_ValueError=2E?= Message-ID: http://hg.python.org/cpython/rev/8d1040fdac60 changeset: 75229:8d1040fdac60 user: Brett Cannon date: Thu Feb 23 18:29:12 2012 -0500 summary: Improper type for __package__ should raise TypeError, not ValueError. files: Lib/importlib/_bootstrap.py | 2 +- Lib/importlib/test/import_/test___package__.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Lib/importlib/_bootstrap.py b/Lib/importlib/_bootstrap.py --- a/Lib/importlib/_bootstrap.py +++ b/Lib/importlib/_bootstrap.py @@ -926,7 +926,7 @@ raise ValueError('level must be >= 0') if package: if not isinstance(package, str): - raise ValueError("__package__ not set to a string") + raise TypeError("__package__ not set to a string") elif package not in sys.modules: msg = ("Parent module {0!r} not loaded, cannot perform relative " "import") diff --git a/Lib/importlib/test/import_/test___package__.py b/Lib/importlib/test/import_/test___package__.py --- a/Lib/importlib/test/import_/test___package__.py +++ b/Lib/importlib/test/import_/test___package__.py @@ -67,7 +67,7 @@ def test_bunk__package__(self): globals = {'__package__': 42} - with self.assertRaises(ValueError): + with self.assertRaises(TypeError): import_util.import_('', globals, {}, ['relimport'], 1) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Fri Feb 24 00:30:18 2012 From: python-checkins at python.org (brett.cannon) Date: Fri, 24 Feb 2012 00:30:18 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_default_-=3E_default?= =?utf8?q?=29=3A_merge?= Message-ID: http://hg.python.org/cpython/rev/548a023c8230 changeset: 75230:548a023c8230 parent: 75229:8d1040fdac60 parent: 75227:50b1f2d07011 user: Brett Cannon date: Thu Feb 23 18:30:04 2012 -0500 summary: merge files: .hgtags | 1 + Doc/library/subprocess.rst | 2 +- Doc/library/sys.rst | 5 +- Doc/library/time.rst | 5 +- Lib/logging/__init__.py | 28 ++++++++---- Lib/logging/handlers.py | 53 +++++++++++++++++-------- 6 files changed, 62 insertions(+), 32 deletions(-) diff --git a/.hgtags b/.hgtags --- a/.hgtags +++ b/.hgtags @@ -77,6 +77,7 @@ a4f75773c0060cee38b0bb651a7aba6f56b0e996 v3.1.3 32fcb9e94985cb19ce37ba9543f091c0dbe9d7dd v3.1.4rc1 c918ec9f3a76d6afedfbb5d455004de880443a3d v3.1.4 +ee26aca3219cf4bb0b93352e83edcc9cb28c7802 v3.1.5rc1 b37b7834757492d009b99cf0ca4d42d2153d7fac v3.2a1 56d4373cecb73c8b45126ba7b045b3c7b3f94b0b v3.2a2 da012d9a2c23d144e399d2e01a55b8a83ad94573 v3.2a3 diff --git a/Doc/library/subprocess.rst b/Doc/library/subprocess.rst --- a/Doc/library/subprocess.rst +++ b/Doc/library/subprocess.rst @@ -240,7 +240,7 @@ When *stdout* or *stderr* are pipes and *universal_newlines* is :const:`True` then the output data is assumed to be encoded as UTF-8 and will automatically be decoded to text. All line endings will be converted - to ``'\n'`` as described for the universal newlines `'U'`` mode argument + to ``'\n'`` as described for the universal newlines ``'U'`` mode argument to :func:`open`. If *shell* is :const:`True`, the specified command will be executed through diff --git a/Doc/library/sys.rst b/Doc/library/sys.rst --- a/Doc/library/sys.rst +++ b/Doc/library/sys.rst @@ -195,7 +195,7 @@ be set at build time with the ``--exec-prefix`` argument to the :program:`configure` script. Specifically, all configuration files (e.g. the :file:`pyconfig.h` header file) are installed in the directory - :file:`{exec_prefix}/lib/python{X.Y}/config', and shared library modules are + :file:`{exec_prefix}/lib/python{X.Y}/config`, and shared library modules are installed in :file:`{exec_prefix}/lib/python{X.Y}/lib-dynload`, where *X.Y* is the version number of Python, for example ``3.2``. @@ -756,6 +756,7 @@ always use the ``startswith`` idiom presented above. .. seealso:: + :attr:`os.name` has a coarser granularity. :func:`os.uname` gives system-dependent version information. @@ -771,7 +772,7 @@ argument to the :program:`configure` script. The main collection of Python 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 + stored in :file:`{prefix}/include/python{X.Y}`, where *X.Y* is the version number of Python, for example ``3.2``. diff --git a/Doc/library/time.rst b/Doc/library/time.rst --- a/Doc/library/time.rst +++ b/Doc/library/time.rst @@ -228,8 +228,9 @@ .. function:: monotonic() - Monotonic clock. The reference point of the returned value is undefined so - only the difference of consecutive calls is valid. + Monotonic non-decreasing clock. The clock is not related to the system clock + and cannot go backward. The reference point of the returned + value is undefined so only the difference of consecutive calls is valid. .. versionadded:: 3.3 diff --git a/Lib/logging/__init__.py b/Lib/logging/__init__.py --- a/Lib/logging/__init__.py +++ b/Lib/logging/__init__.py @@ -16,9 +16,9 @@ """ Logging package for Python. Based on PEP 282 and comments thereto in -comp.lang.python, and influenced by Apache's log4j system. +comp.lang.python. -Copyright (C) 2001-2011 Vinay Sajip. All Rights Reserved. +Copyright (C) 2001-2012 Vinay Sajip. All Rights Reserved. To use, simply 'import logging' and log away! """ @@ -914,8 +914,12 @@ """ Flushes the stream. """ - if self.stream and hasattr(self.stream, "flush"): - self.stream.flush() + self.acquire() + try: + if self.stream and hasattr(self.stream, "flush"): + self.stream.flush() + finally: + self.release() def emit(self, record): """ @@ -964,12 +968,16 @@ """ Closes the stream. """ - if self.stream: - self.flush() - if hasattr(self.stream, "close"): - self.stream.close() - StreamHandler.close(self) - self.stream = None + self.acquire() + try: + if self.stream: + self.flush() + if hasattr(self.stream, "close"): + self.stream.close() + StreamHandler.close(self) + self.stream = None + finally: + self.release() def _open(self): """ diff --git a/Lib/logging/handlers.py b/Lib/logging/handlers.py --- a/Lib/logging/handlers.py +++ b/Lib/logging/handlers.py @@ -1,4 +1,4 @@ -# Copyright 2001-2010 by Vinay Sajip. All Rights Reserved. +# Copyright 2001-2012 by Vinay Sajip. All Rights Reserved. # # Permission to use, copy, modify, and distribute this software and its # documentation for any purpose and without fee is hereby granted, @@ -16,10 +16,9 @@ """ Additional handlers for the logging package for Python. The core package is -based on PEP 282 and comments thereto in comp.lang.python, and influenced by -Apache's log4j system. +based on PEP 282 and comments thereto in comp.lang.python. -Copyright (C) 2001-2010 Vinay Sajip. All Rights Reserved. +Copyright (C) 2001-2012 Vinay Sajip. All Rights Reserved. To use, simply 'import logging.handlers' and log away! """ @@ -594,10 +593,14 @@ """ Closes the socket. """ - if self.sock: - self.sock.close() - self.sock = None - logging.Handler.close(self) + self.acquire() + try: + if self.sock: + self.sock.close() + self.sock = None + logging.Handler.close(self) + finally: + self.release() class DatagramHandler(SocketHandler): """ @@ -792,8 +795,12 @@ """ Closes the socket. """ - self.socket.close() - logging.Handler.close(self) + self.acquire() + try: + self.socket.close() + logging.Handler.close(self) + finally: + self.release() def mapPriority(self, levelName): """ @@ -1137,7 +1144,11 @@ This version just zaps the buffer to empty. """ - self.buffer = [] + self.acquire() + try: + self.buffer = [] + finally: + self.release() def close(self): """ @@ -1187,18 +1198,26 @@ The record buffer is also cleared by this operation. """ - if self.target: - for record in self.buffer: - self.target.handle(record) - self.buffer = [] + self.acquire() + try: + if self.target: + for record in self.buffer: + self.target.handle(record) + self.buffer = [] + finally: + self.release() def close(self): """ Flush, set the target to None and lose the buffer. """ self.flush() - self.target = None - BufferingHandler.close(self) + self.acquire() + try: + self.target = None + BufferingHandler.close(self) + finally: + self.release() class QueueHandler(logging.Handler): -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Fri Feb 24 00:49:31 2012 From: python-checkins at python.org (victor.stinner) Date: Fri, 24 Feb 2012 00:49:31 +0100 Subject: [Python-checkins] =?utf8?q?cpython=3A_Issue_=2313706=3A_Fix_forma?= =?utf8?q?t=28int=2C_=22n=22=29_for_locale_with_non-ASCII_thousands_separa?= =?utf8?q?tor?= Message-ID: http://hg.python.org/cpython/rev/f89e2f4cda88 changeset: 75231:f89e2f4cda88 user: Victor Stinner date: Fri Feb 24 00:37:51 2012 +0100 summary: Issue #13706: Fix format(int, "n") for locale with non-ASCII thousands separator * Decode thousands separator and decimal point using PyUnicode_DecodeLocale() (from the locale encoding), instead of decoding them implicitly from latin1 * Remove _PyUnicode_InsertThousandsGroupingLocale(), it was not used * Change _PyUnicode_InsertThousandsGrouping() API to return the maximum character if unicode is NULL * Replace MIN/MAX macros by Py_MIN/Py_MAX * stringlib/undef.h undefines STRINGLIB_IS_UNICODE * stringlib/localeutil.h only supports Unicode files: Include/unicodeobject.h | 18 +-- Lib/test/test_format.py | 15 ++ Objects/stringlib/asciilib.h | 3 - Objects/stringlib/localeutil.h | 71 +++------ Objects/stringlib/stringdefs.h | 2 - Objects/stringlib/ucs1lib.h | 3 - Objects/stringlib/ucs2lib.h | 3 - Objects/stringlib/ucs4lib.h | 3 - Objects/stringlib/undef.h | 2 +- Objects/stringlib/unicodedefs.h | 2 - Objects/unicodeobject.c | 77 ++++++++-- Python/formatter_unicode.c | 142 ++++++++++++------- 12 files changed, 189 insertions(+), 152 deletions(-) diff --git a/Include/unicodeobject.h b/Include/unicodeobject.h --- a/Include/unicodeobject.h +++ b/Include/unicodeobject.h @@ -1936,32 +1936,20 @@ ); #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( PyObject *unicode, - int kind, - void *buffer, + Py_ssize_t index, Py_ssize_t n_buffer, void *digits, Py_ssize_t n_digits, Py_ssize_t min_width, const char *grouping, - const char *thousands_sep); + PyObject *thousands_sep, + Py_UCS4 *maxchar); #endif /* === Characters Type APIs =============================================== */ diff --git a/Lib/test/test_format.py b/Lib/test/test_format.py --- 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 @@ -282,6 +283,20 @@ 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, '') + except locale.Error as err: + self.skipTest("Cannot set locale: {}".format(err)) + try: + sep = locale.localeconv()['thousands_sep'] + text = format(123456789, "n") + self.assertIn(sep, text) + self.assertEqual(text.replace(sep, ''), '123456789') + finally: + locale.setlocale(locale.LC_ALL, oldloc) + + def test_main(): support.run_unittest(FormatTest) diff --git a/Objects/stringlib/asciilib.h b/Objects/stringlib/asciilib.h --- a/Objects/stringlib/asciilib.h +++ b/Objects/stringlib/asciilib.h @@ -21,12 +21,9 @@ #define STRINGLIB_RESIZE not_supported #define STRINGLIB_CHECK PyUnicode_Check #define STRINGLIB_CHECK_EXACT PyUnicode_CheckExact -#define STRINGLIB_GROUPING _PyUnicode_InsertThousandsGrouping -#define STRINGLIB_GROUPING_LOCALE _PyUnicode_InsertThousandsGroupingLocale #define STRINGLIB_TOSTR PyObject_Str #define STRINGLIB_TOASCII PyObject_ASCII #define _Py_InsertThousandsGrouping _PyUnicode_ascii_InsertThousandsGrouping -#define _Py_InsertThousandsGroupingLocale _PyUnicode_ascii_InsertThousandsGroupingLocale diff --git a/Objects/stringlib/localeutil.h b/Objects/stringlib/localeutil.h --- a/Objects/stringlib/localeutil.h +++ b/Objects/stringlib/localeutil.h @@ -2,8 +2,9 @@ #include -#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; @@ -46,7 +47,7 @@ are optional, depending on when we're called. */ static void STRINGLIB(fill)(STRINGLIB_CHAR **digits_end, STRINGLIB_CHAR **buffer_end, - Py_ssize_t n_chars, Py_ssize_t n_zeros, const char* thousands_sep, + Py_ssize_t n_chars, Py_ssize_t n_zeros, STRINGLIB_CHAR* thousands_sep, Py_ssize_t thousands_sep_len) { Py_ssize_t i; @@ -55,15 +56,8 @@ *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,7 +70,7 @@ } /** - * _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 @@ -106,13 +100,15 @@ _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) +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; @@ -124,7 +120,6 @@ 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 @@ -138,9 +133,9 @@ } while ((l = STRINGLIB(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)); + 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 */ @@ -168,9 +163,9 @@ 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; @@ -183,25 +178,3 @@ 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); -} diff --git a/Objects/stringlib/stringdefs.h b/Objects/stringlib/stringdefs.h --- a/Objects/stringlib/stringdefs.h +++ b/Objects/stringlib/stringdefs.h @@ -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 --- a/Objects/stringlib/ucs1lib.h +++ b/Objects/stringlib/ucs1lib.h @@ -21,13 +21,10 @@ #define STRINGLIB_RESIZE not_supported #define STRINGLIB_CHECK PyUnicode_Check #define STRINGLIB_CHECK_EXACT PyUnicode_CheckExact -#define STRINGLIB_GROUPING _PyUnicode_InsertThousandsGrouping -#define STRINGLIB_GROUPING_LOCALE _PyUnicode_InsertThousandsGroupingLocale #define STRINGLIB_TOSTR PyObject_Str #define STRINGLIB_TOASCII PyObject_ASCII #define _Py_InsertThousandsGrouping _PyUnicode_ucs1_InsertThousandsGrouping -#define _Py_InsertThousandsGroupingLocale _PyUnicode_ucs1_InsertThousandsGroupingLocale diff --git a/Objects/stringlib/ucs2lib.h b/Objects/stringlib/ucs2lib.h --- a/Objects/stringlib/ucs2lib.h +++ b/Objects/stringlib/ucs2lib.h @@ -21,12 +21,9 @@ #define STRINGLIB_RESIZE not_supported #define STRINGLIB_CHECK PyUnicode_Check #define STRINGLIB_CHECK_EXACT PyUnicode_CheckExact -#define STRINGLIB_GROUPING _PyUnicode_InsertThousandsGrouping -#define STRINGLIB_GROUPING_LOCALE _PyUnicode_InsertThousandsGroupingLocale #define STRINGLIB_TOSTR PyObject_Str #define STRINGLIB_TOASCII PyObject_ASCII #define _Py_InsertThousandsGrouping _PyUnicode_ucs2_InsertThousandsGrouping -#define _Py_InsertThousandsGroupingLocale _PyUnicode_ucs2_InsertThousandsGroupingLocale diff --git a/Objects/stringlib/ucs4lib.h b/Objects/stringlib/ucs4lib.h --- a/Objects/stringlib/ucs4lib.h +++ b/Objects/stringlib/ucs4lib.h @@ -21,12 +21,9 @@ #define STRINGLIB_RESIZE not_supported #define STRINGLIB_CHECK PyUnicode_Check #define STRINGLIB_CHECK_EXACT PyUnicode_CheckExact -#define STRINGLIB_GROUPING _PyUnicode_InsertThousandsGrouping -#define STRINGLIB_GROUPING_LOCALE _PyUnicode_InsertThousandsGroupingLocale #define STRINGLIB_TOSTR PyObject_Str #define STRINGLIB_TOASCII PyObject_ASCII #define _Py_InsertThousandsGrouping _PyUnicode_ucs4_InsertThousandsGrouping -#define _Py_InsertThousandsGroupingLocale _PyUnicode_ucs4_InsertThousandsGroupingLocale diff --git a/Objects/stringlib/undef.h b/Objects/stringlib/undef.h --- a/Objects/stringlib/undef.h +++ b/Objects/stringlib/undef.h @@ -7,5 +7,5 @@ #undef STRINGLIB_NEW #undef STRINGLIB_RESIZE #undef _Py_InsertThousandsGrouping -#undef _Py_InsertThousandsGroupingLocale +#undef STRINGLIB_IS_UNICODE diff --git a/Objects/stringlib/unicodedefs.h b/Objects/stringlib/unicodedefs.h --- a/Objects/stringlib/unicodedefs.h +++ b/Objects/stringlib/unicodedefs.h @@ -24,8 +24,6 @@ #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/unicodeobject.c b/Objects/unicodeobject.c --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -9151,34 +9151,75 @@ } Py_ssize_t -_PyUnicode_InsertThousandsGrouping(PyObject *unicode, int kind, void *data, - Py_ssize_t n_buffer, - void *digits, Py_ssize_t n_digits, - Py_ssize_t min_width, - const char *grouping, - const char *thousands_sep) -{ +_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; + void *data, *thousands_sep_data; + Py_ssize_t thousands_sep_len; + Py_ssize_t len; + + if (unicode != NULL) { + kind = PyUnicode_KIND(unicode); + data = 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) { + thousands_sep_data = _PyUnicode_AsKind(thousands_sep, kind); + if (!thousands_sep_data) + return -1; + } + switch (kind) { case PyUnicode_1BYTE_KIND: if (unicode != NULL && PyUnicode_IS_ASCII(unicode)) - return _PyUnicode_ascii_InsertThousandsGrouping( + len = asciilib_InsertThousandsGrouping( (Py_UCS1*)data, n_buffer, (Py_UCS1*)digits, n_digits, - min_width, grouping, thousands_sep); + min_width, grouping, + thousands_sep_data, thousands_sep_len); else - return _PyUnicode_ucs1_InsertThousandsGrouping( + len = ucs1lib_InsertThousandsGrouping( (Py_UCS1*)data, n_buffer, (Py_UCS1*)digits, n_digits, - min_width, grouping, thousands_sep); + min_width, grouping, + thousands_sep_data, thousands_sep_len); + break; case PyUnicode_2BYTE_KIND: - return _PyUnicode_ucs2_InsertThousandsGrouping( + len = ucs2lib_InsertThousandsGrouping( (Py_UCS2*)data, n_buffer, (Py_UCS2*)digits, n_digits, - min_width, grouping, thousands_sep); + min_width, grouping, + thousands_sep_data, thousands_sep_len); + break; case PyUnicode_4BYTE_KIND: - return _PyUnicode_ucs4_InsertThousandsGrouping( + len = ucs4lib_InsertThousandsGrouping( (Py_UCS4*)data, n_buffer, (Py_UCS4*)digits, n_digits, - min_width, grouping, thousands_sep); - } - assert(0); - return -1; + min_width, grouping, + thousands_sep_data, thousands_sep_len); + break; + default: + assert(0); + return -1; + } + if (unicode != NULL && thousands_sep_kind != kind) + PyMem_Free(thousands_sep_data); + if (unicode == NULL) { + *maxchar = 127; + if (len != n_digits) { + *maxchar = Py_MAX(*maxchar, + PyUnicode_MAX_CHAR_VALUE(thousands_sep)); + } + } + return len; } diff --git a/Python/formatter_unicode.c b/Python/formatter_unicode.c --- a/Python/formatter_unicode.c +++ b/Python/formatter_unicode.c @@ -346,11 +346,13 @@ 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; + 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 { @@ -415,7 +417,7 @@ 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) + const InternalFormatSpec *format, Py_UCS4 *maxchar) { Py_ssize_t n_non_digit_non_padding; Py_ssize_t n_padding; @@ -423,7 +425,7 @@ 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 ? strlen(locale->decimal_point) : 0; + 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; @@ -484,11 +486,15 @@ to special case it because the grouping code always wants to have at least one character. */ spec->n_grouped_digits = 0; - else + else { + Py_UCS4 grouping_maxchar; spec->n_grouped_digits = _PyUnicode_InsertThousandsGrouping( - NULL, PyUnicode_1BYTE_KIND, NULL, 0, NULL, + NULL, 0, + 0, NULL, spec->n_digits, spec->n_min_width, - locale->grouping, locale->thousands_sep); + 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 @@ -519,6 +525,10 @@ break; } } + + if (spec->n_lpadding || spec->n_spadding || spec->n_rpadding) + *maxchar = Py_MAX(*maxchar, format->fill_char); + 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; @@ -587,12 +597,11 @@ r = #endif _PyUnicode_InsertThousandsGrouping( - out, kind, - (char*)data + kind * pos, + out, pos, spec->n_grouped_digits, pdigits + kind * d_pos, spec->n_digits, spec->n_min_width, - locale->grouping, locale->thousands_sep); + locale->grouping, locale->thousands_sep, NULL); #ifndef NDEBUG assert(r == spec->n_grouped_digits); #endif @@ -615,10 +624,8 @@ pos += spec->n_grouped_digits; if (spec->n_decimal) { - Py_ssize_t t; - for (t = 0; t < spec->n_decimal; ++t) - PyUnicode_WRITE(kind, data, pos + t, - locale->decimal_point[t]); + if (PyUnicode_CopyCharacters(out, pos, locale->decimal_point, 0, spec->n_decimal) < 0) + return -1; pos += spec->n_decimal; d_pos += 1; } @@ -643,32 +650,60 @@ 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 +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 = locale_data->decimal_point; - locale_info->thousands_sep = locale_data->thousands_sep; + 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 = "."; - locale_info->thousands_sep = ","; + 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 = "."; - locale_info->thousands_sep = ""; + 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); } /************************************************************************/ @@ -769,7 +804,7 @@ /* Locale settings, either from the actual locale or from a hard-code pseudo-locale */ - LocaleInfo locale; + LocaleInfo locale = STATIC_LOCALE_INFO_INIT; /* no precision allowed on integers */ if (format->precision != -1) { @@ -868,18 +903,17 @@ } /* 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); + 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); - - if (spec.n_lpadding || spec.n_spadding || spec.n_rpadding) - maxchar = Py_MAX(maxchar, format->fill_char); + inumeric_chars + n_digits, n_remainder, 0, + &locale, format, &maxchar); /* Allocate the memory. */ result = PyUnicode_New(n_total, maxchar); @@ -897,6 +931,7 @@ done: Py_XDECREF(tmp); + free_locale_info(&locale); assert(!result || _PyUnicode_CheckConsistency(result, 1)); return result; } @@ -938,7 +973,7 @@ /* Locale settings, either from the actual locale or from a hard-code pseudo-locale */ - LocaleInfo locale; + LocaleInfo locale = STATIC_LOCALE_INFO_INIT; if (format->alternate) flags |= Py_DTSF_ALT; @@ -1009,19 +1044,17 @@ parse_number(unicode_tmp, index, index + 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); + 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); - - if (spec.n_lpadding || spec.n_spadding || spec.n_rpadding) - maxchar = Py_MAX(maxchar, format->fill_char); + &locale, format, &maxchar); /* Allocate the memory. */ result = PyUnicode_New(n_total, maxchar); @@ -1040,6 +1073,7 @@ done: PyMem_Free(buf); Py_DECREF(unicode_tmp); + free_locale_info(&locale); assert(!result || _PyUnicode_CheckConsistency(result, 1)); return result; } @@ -1094,7 +1128,7 @@ /* Locale settings, either from the actual locale or from a hard-code pseudo-locale */ - LocaleInfo locale; + LocaleInfo locale = STATIC_LOCALE_INFO_INIT; /* Zero padding is not allowed. */ if (format->fill_char == '0') { @@ -1190,11 +1224,12 @@ &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); + 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. */ @@ -1205,7 +1240,8 @@ /* 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); + 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 @@ -1214,7 +1250,8 @@ 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); + im_has_decimal, &locale, &tmp_format, + &maxchar); if (skip_re) n_re_total = 0; @@ -1223,9 +1260,7 @@ calc_padding(n_re_total + n_im_total + 1 + add_parens * 2, format->width, format->align, &lpad, &rpad, &total); - if (re_spec.n_lpadding || re_spec.n_spadding || re_spec.n_rpadding - || im_spec.n_lpadding || im_spec.n_spadding || im_spec.n_rpadding - || lpad || rpad) + if (lpad || rpad) maxchar = Py_MAX(maxchar, format->fill_char); result = PyUnicode_New(total, maxchar); @@ -1275,6 +1310,7 @@ PyMem_Free(im_buf); Py_XDECREF(re_unicode_tmp); Py_XDECREF(im_unicode_tmp); + free_locale_info(&locale); assert(!result || _PyUnicode_CheckConsistency(result, 1)); return result; } -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Fri Feb 24 01:35:00 2012 From: python-checkins at python.org (brett.cannon) Date: Fri, 24 Feb 2012 01:35:00 +0100 Subject: [Python-checkins] =?utf8?q?cpython=3A_Make_the_benchmark_recordin?= =?utf8?q?g_more_sensible_for_importlib=2Etest=2Ebenchmark=2E?= Message-ID: http://hg.python.org/cpython/rev/2e7a042a4760 changeset: 75232:2e7a042a4760 parent: 75230:548a023c8230 user: Brett Cannon date: Thu Feb 23 19:34:35 2012 -0500 summary: Make the benchmark recording more sensible for importlib.test.benchmark. files: Lib/importlib/test/benchmark.py | 56 ++++++++++---------- 1 files changed, 27 insertions(+), 29 deletions(-) diff --git a/Lib/importlib/test/benchmark.py b/Lib/importlib/test/benchmark.py --- a/Lib/importlib/test/benchmark.py +++ b/Lib/importlib/test/benchmark.py @@ -157,10 +157,10 @@ decimal_using_bytecode = _using_bytecode(decimal) -def main(import_, filename=None, benchmark=None): - if filename and os.path.exists(filename): - with open(filename, 'r') as file: - prev_results = json.load(file) +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_ @@ -172,13 +172,14 @@ decimal_writing_bytecode, decimal_wo_bytecode, decimal_using_bytecode, ) - if benchmark: + if options.benchmark: for b in benchmarks: - if b.__doc__ == benchmark: + if b.__doc__ == options.benchmark: benchmarks = [b] break else: - print('Unknown benchmark: {!r}'.format(benchmark, file=sys.stderr)) + print('Unknown benchmark: {!r}'.format(options.benchmark, + file=sys.stderr)) sys.exit(1) seconds = 1 seconds_plural = 's' if seconds > 1 else '' @@ -200,22 +201,19 @@ assert not sys.dont_write_bytecode print("]", "best is", format(max(results), ',d')) new_results[benchmark.__doc__] = results - prev_results[import_.__module__] = new_results - if 'importlib._bootstrap' in prev_results and 'builtins' in prev_results: - print('\n\nComparing importlib vs. __import__\n') - importlib_results = prev_results['importlib._bootstrap'] - builtins_results = prev_results['builtins'] + if prev_results: + print('\n\nComparing new vs. old\n') for benchmark in benchmarks: benchmark_name = benchmark.__doc__ - importlib_result = max(importlib_results[benchmark_name]) - builtins_result = max(builtins_results[benchmark_name]) - result = '{:,d} vs. {:,d} ({:%})'.format(importlib_result, - builtins_result, - importlib_result/builtins_result) + 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 filename: - with open(filename, 'w') as file: - json.dump(prev_results, file, indent=2) + if options.dest_file: + with options.dest_file: + json.dump(new_results, options.dest_file, indent=2) if __name__ == '__main__': @@ -224,18 +222,18 @@ parser = argparse.ArgumentParser() parser.add_argument('-b', '--builtin', dest='builtin', action='store_true', default=False, help="use the built-in __import__") - parser.add_argument('-f', '--file', dest='filename', default=None, - help='file to read/write results from/to' - '(incompatible w/ --benchmark)') + 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 ' - '(incompatible w/ --file)') + help='specific benchmark to run') options = parser.parse_args() - if options.filename and options.benchmark: - print('Cannot specify a benchmark *and* read/write results') - sys.exit(1) import_ = __import__ if not options.builtin: import_ = importlib.__import__ - main(import_, options.filename, options.benchmark) + main(import_, options) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Fri Feb 24 01:35:01 2012 From: python-checkins at python.org (brett.cannon) Date: Fri, 24 Feb 2012 01:35:01 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_default_-=3E_default?= =?utf8?q?=29=3A_merge?= Message-ID: http://hg.python.org/cpython/rev/e394e62473ee changeset: 75233:e394e62473ee parent: 75232:2e7a042a4760 parent: 75231:f89e2f4cda88 user: Brett Cannon date: Thu Feb 23 19:34:55 2012 -0500 summary: merge files: Include/unicodeobject.h | 18 +-- Lib/test/test_format.py | 15 ++ Objects/stringlib/asciilib.h | 3 - Objects/stringlib/localeutil.h | 71 +++------ Objects/stringlib/stringdefs.h | 2 - Objects/stringlib/ucs1lib.h | 3 - Objects/stringlib/ucs2lib.h | 3 - Objects/stringlib/ucs4lib.h | 3 - Objects/stringlib/undef.h | 2 +- Objects/stringlib/unicodedefs.h | 2 - Objects/unicodeobject.c | 77 ++++++++-- Python/formatter_unicode.c | 142 ++++++++++++------- 12 files changed, 189 insertions(+), 152 deletions(-) diff --git a/Include/unicodeobject.h b/Include/unicodeobject.h --- a/Include/unicodeobject.h +++ b/Include/unicodeobject.h @@ -1936,32 +1936,20 @@ ); #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( PyObject *unicode, - int kind, - void *buffer, + Py_ssize_t index, Py_ssize_t n_buffer, void *digits, Py_ssize_t n_digits, Py_ssize_t min_width, const char *grouping, - const char *thousands_sep); + PyObject *thousands_sep, + Py_UCS4 *maxchar); #endif /* === Characters Type APIs =============================================== */ diff --git a/Lib/test/test_format.py b/Lib/test/test_format.py --- 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 @@ -282,6 +283,20 @@ 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, '') + except locale.Error as err: + self.skipTest("Cannot set locale: {}".format(err)) + try: + sep = locale.localeconv()['thousands_sep'] + text = format(123456789, "n") + self.assertIn(sep, text) + self.assertEqual(text.replace(sep, ''), '123456789') + finally: + locale.setlocale(locale.LC_ALL, oldloc) + + def test_main(): support.run_unittest(FormatTest) diff --git a/Objects/stringlib/asciilib.h b/Objects/stringlib/asciilib.h --- a/Objects/stringlib/asciilib.h +++ b/Objects/stringlib/asciilib.h @@ -21,12 +21,9 @@ #define STRINGLIB_RESIZE not_supported #define STRINGLIB_CHECK PyUnicode_Check #define STRINGLIB_CHECK_EXACT PyUnicode_CheckExact -#define STRINGLIB_GROUPING _PyUnicode_InsertThousandsGrouping -#define STRINGLIB_GROUPING_LOCALE _PyUnicode_InsertThousandsGroupingLocale #define STRINGLIB_TOSTR PyObject_Str #define STRINGLIB_TOASCII PyObject_ASCII #define _Py_InsertThousandsGrouping _PyUnicode_ascii_InsertThousandsGrouping -#define _Py_InsertThousandsGroupingLocale _PyUnicode_ascii_InsertThousandsGroupingLocale diff --git a/Objects/stringlib/localeutil.h b/Objects/stringlib/localeutil.h --- a/Objects/stringlib/localeutil.h +++ b/Objects/stringlib/localeutil.h @@ -2,8 +2,9 @@ #include -#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; @@ -46,7 +47,7 @@ are optional, depending on when we're called. */ static void STRINGLIB(fill)(STRINGLIB_CHAR **digits_end, STRINGLIB_CHAR **buffer_end, - Py_ssize_t n_chars, Py_ssize_t n_zeros, const char* thousands_sep, + Py_ssize_t n_chars, Py_ssize_t n_zeros, STRINGLIB_CHAR* thousands_sep, Py_ssize_t thousands_sep_len) { Py_ssize_t i; @@ -55,15 +56,8 @@ *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,7 +70,7 @@ } /** - * _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 @@ -106,13 +100,15 @@ _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) +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; @@ -124,7 +120,6 @@ 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 @@ -138,9 +133,9 @@ } while ((l = STRINGLIB(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)); + 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 */ @@ -168,9 +163,9 @@ 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; @@ -183,25 +178,3 @@ 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); -} diff --git a/Objects/stringlib/stringdefs.h b/Objects/stringlib/stringdefs.h --- a/Objects/stringlib/stringdefs.h +++ b/Objects/stringlib/stringdefs.h @@ -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 --- a/Objects/stringlib/ucs1lib.h +++ b/Objects/stringlib/ucs1lib.h @@ -21,13 +21,10 @@ #define STRINGLIB_RESIZE not_supported #define STRINGLIB_CHECK PyUnicode_Check #define STRINGLIB_CHECK_EXACT PyUnicode_CheckExact -#define STRINGLIB_GROUPING _PyUnicode_InsertThousandsGrouping -#define STRINGLIB_GROUPING_LOCALE _PyUnicode_InsertThousandsGroupingLocale #define STRINGLIB_TOSTR PyObject_Str #define STRINGLIB_TOASCII PyObject_ASCII #define _Py_InsertThousandsGrouping _PyUnicode_ucs1_InsertThousandsGrouping -#define _Py_InsertThousandsGroupingLocale _PyUnicode_ucs1_InsertThousandsGroupingLocale diff --git a/Objects/stringlib/ucs2lib.h b/Objects/stringlib/ucs2lib.h --- a/Objects/stringlib/ucs2lib.h +++ b/Objects/stringlib/ucs2lib.h @@ -21,12 +21,9 @@ #define STRINGLIB_RESIZE not_supported #define STRINGLIB_CHECK PyUnicode_Check #define STRINGLIB_CHECK_EXACT PyUnicode_CheckExact -#define STRINGLIB_GROUPING _PyUnicode_InsertThousandsGrouping -#define STRINGLIB_GROUPING_LOCALE _PyUnicode_InsertThousandsGroupingLocale #define STRINGLIB_TOSTR PyObject_Str #define STRINGLIB_TOASCII PyObject_ASCII #define _Py_InsertThousandsGrouping _PyUnicode_ucs2_InsertThousandsGrouping -#define _Py_InsertThousandsGroupingLocale _PyUnicode_ucs2_InsertThousandsGroupingLocale diff --git a/Objects/stringlib/ucs4lib.h b/Objects/stringlib/ucs4lib.h --- a/Objects/stringlib/ucs4lib.h +++ b/Objects/stringlib/ucs4lib.h @@ -21,12 +21,9 @@ #define STRINGLIB_RESIZE not_supported #define STRINGLIB_CHECK PyUnicode_Check #define STRINGLIB_CHECK_EXACT PyUnicode_CheckExact -#define STRINGLIB_GROUPING _PyUnicode_InsertThousandsGrouping -#define STRINGLIB_GROUPING_LOCALE _PyUnicode_InsertThousandsGroupingLocale #define STRINGLIB_TOSTR PyObject_Str #define STRINGLIB_TOASCII PyObject_ASCII #define _Py_InsertThousandsGrouping _PyUnicode_ucs4_InsertThousandsGrouping -#define _Py_InsertThousandsGroupingLocale _PyUnicode_ucs4_InsertThousandsGroupingLocale diff --git a/Objects/stringlib/undef.h b/Objects/stringlib/undef.h --- a/Objects/stringlib/undef.h +++ b/Objects/stringlib/undef.h @@ -7,5 +7,5 @@ #undef STRINGLIB_NEW #undef STRINGLIB_RESIZE #undef _Py_InsertThousandsGrouping -#undef _Py_InsertThousandsGroupingLocale +#undef STRINGLIB_IS_UNICODE diff --git a/Objects/stringlib/unicodedefs.h b/Objects/stringlib/unicodedefs.h --- a/Objects/stringlib/unicodedefs.h +++ b/Objects/stringlib/unicodedefs.h @@ -24,8 +24,6 @@ #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/unicodeobject.c b/Objects/unicodeobject.c --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -9151,34 +9151,75 @@ } Py_ssize_t -_PyUnicode_InsertThousandsGrouping(PyObject *unicode, int kind, void *data, - Py_ssize_t n_buffer, - void *digits, Py_ssize_t n_digits, - Py_ssize_t min_width, - const char *grouping, - const char *thousands_sep) -{ +_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; + void *data, *thousands_sep_data; + Py_ssize_t thousands_sep_len; + Py_ssize_t len; + + if (unicode != NULL) { + kind = PyUnicode_KIND(unicode); + data = 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) { + thousands_sep_data = _PyUnicode_AsKind(thousands_sep, kind); + if (!thousands_sep_data) + return -1; + } + switch (kind) { case PyUnicode_1BYTE_KIND: if (unicode != NULL && PyUnicode_IS_ASCII(unicode)) - return _PyUnicode_ascii_InsertThousandsGrouping( + len = asciilib_InsertThousandsGrouping( (Py_UCS1*)data, n_buffer, (Py_UCS1*)digits, n_digits, - min_width, grouping, thousands_sep); + min_width, grouping, + thousands_sep_data, thousands_sep_len); else - return _PyUnicode_ucs1_InsertThousandsGrouping( + len = ucs1lib_InsertThousandsGrouping( (Py_UCS1*)data, n_buffer, (Py_UCS1*)digits, n_digits, - min_width, grouping, thousands_sep); + min_width, grouping, + thousands_sep_data, thousands_sep_len); + break; case PyUnicode_2BYTE_KIND: - return _PyUnicode_ucs2_InsertThousandsGrouping( + len = ucs2lib_InsertThousandsGrouping( (Py_UCS2*)data, n_buffer, (Py_UCS2*)digits, n_digits, - min_width, grouping, thousands_sep); + min_width, grouping, + thousands_sep_data, thousands_sep_len); + break; case PyUnicode_4BYTE_KIND: - return _PyUnicode_ucs4_InsertThousandsGrouping( + len = ucs4lib_InsertThousandsGrouping( (Py_UCS4*)data, n_buffer, (Py_UCS4*)digits, n_digits, - min_width, grouping, thousands_sep); - } - assert(0); - return -1; + min_width, grouping, + thousands_sep_data, thousands_sep_len); + break; + default: + assert(0); + return -1; + } + if (unicode != NULL && thousands_sep_kind != kind) + PyMem_Free(thousands_sep_data); + if (unicode == NULL) { + *maxchar = 127; + if (len != n_digits) { + *maxchar = Py_MAX(*maxchar, + PyUnicode_MAX_CHAR_VALUE(thousands_sep)); + } + } + return len; } diff --git a/Python/formatter_unicode.c b/Python/formatter_unicode.c --- a/Python/formatter_unicode.c +++ b/Python/formatter_unicode.c @@ -346,11 +346,13 @@ 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; + 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 { @@ -415,7 +417,7 @@ 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) + const InternalFormatSpec *format, Py_UCS4 *maxchar) { Py_ssize_t n_non_digit_non_padding; Py_ssize_t n_padding; @@ -423,7 +425,7 @@ 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 ? strlen(locale->decimal_point) : 0; + 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; @@ -484,11 +486,15 @@ to special case it because the grouping code always wants to have at least one character. */ spec->n_grouped_digits = 0; - else + else { + Py_UCS4 grouping_maxchar; spec->n_grouped_digits = _PyUnicode_InsertThousandsGrouping( - NULL, PyUnicode_1BYTE_KIND, NULL, 0, NULL, + NULL, 0, + 0, NULL, spec->n_digits, spec->n_min_width, - locale->grouping, locale->thousands_sep); + 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 @@ -519,6 +525,10 @@ break; } } + + if (spec->n_lpadding || spec->n_spadding || spec->n_rpadding) + *maxchar = Py_MAX(*maxchar, format->fill_char); + 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; @@ -587,12 +597,11 @@ r = #endif _PyUnicode_InsertThousandsGrouping( - out, kind, - (char*)data + kind * pos, + out, pos, spec->n_grouped_digits, pdigits + kind * d_pos, spec->n_digits, spec->n_min_width, - locale->grouping, locale->thousands_sep); + locale->grouping, locale->thousands_sep, NULL); #ifndef NDEBUG assert(r == spec->n_grouped_digits); #endif @@ -615,10 +624,8 @@ pos += spec->n_grouped_digits; if (spec->n_decimal) { - Py_ssize_t t; - for (t = 0; t < spec->n_decimal; ++t) - PyUnicode_WRITE(kind, data, pos + t, - locale->decimal_point[t]); + if (PyUnicode_CopyCharacters(out, pos, locale->decimal_point, 0, spec->n_decimal) < 0) + return -1; pos += spec->n_decimal; d_pos += 1; } @@ -643,32 +650,60 @@ 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 +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 = locale_data->decimal_point; - locale_info->thousands_sep = locale_data->thousands_sep; + 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 = "."; - locale_info->thousands_sep = ","; + 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 = "."; - locale_info->thousands_sep = ""; + 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); } /************************************************************************/ @@ -769,7 +804,7 @@ /* Locale settings, either from the actual locale or from a hard-code pseudo-locale */ - LocaleInfo locale; + LocaleInfo locale = STATIC_LOCALE_INFO_INIT; /* no precision allowed on integers */ if (format->precision != -1) { @@ -868,18 +903,17 @@ } /* 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); + 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); - - if (spec.n_lpadding || spec.n_spadding || spec.n_rpadding) - maxchar = Py_MAX(maxchar, format->fill_char); + inumeric_chars + n_digits, n_remainder, 0, + &locale, format, &maxchar); /* Allocate the memory. */ result = PyUnicode_New(n_total, maxchar); @@ -897,6 +931,7 @@ done: Py_XDECREF(tmp); + free_locale_info(&locale); assert(!result || _PyUnicode_CheckConsistency(result, 1)); return result; } @@ -938,7 +973,7 @@ /* Locale settings, either from the actual locale or from a hard-code pseudo-locale */ - LocaleInfo locale; + LocaleInfo locale = STATIC_LOCALE_INFO_INIT; if (format->alternate) flags |= Py_DTSF_ALT; @@ -1009,19 +1044,17 @@ parse_number(unicode_tmp, index, index + 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); + 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); - - if (spec.n_lpadding || spec.n_spadding || spec.n_rpadding) - maxchar = Py_MAX(maxchar, format->fill_char); + &locale, format, &maxchar); /* Allocate the memory. */ result = PyUnicode_New(n_total, maxchar); @@ -1040,6 +1073,7 @@ done: PyMem_Free(buf); Py_DECREF(unicode_tmp); + free_locale_info(&locale); assert(!result || _PyUnicode_CheckConsistency(result, 1)); return result; } @@ -1094,7 +1128,7 @@ /* Locale settings, either from the actual locale or from a hard-code pseudo-locale */ - LocaleInfo locale; + LocaleInfo locale = STATIC_LOCALE_INFO_INIT; /* Zero padding is not allowed. */ if (format->fill_char == '0') { @@ -1190,11 +1224,12 @@ &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); + 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. */ @@ -1205,7 +1240,8 @@ /* 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); + 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 @@ -1214,7 +1250,8 @@ 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); + im_has_decimal, &locale, &tmp_format, + &maxchar); if (skip_re) n_re_total = 0; @@ -1223,9 +1260,7 @@ calc_padding(n_re_total + n_im_total + 1 + add_parens * 2, format->width, format->align, &lpad, &rpad, &total); - if (re_spec.n_lpadding || re_spec.n_spadding || re_spec.n_rpadding - || im_spec.n_lpadding || im_spec.n_spadding || im_spec.n_rpadding - || lpad || rpad) + if (lpad || rpad) maxchar = Py_MAX(maxchar, format->fill_char); result = PyUnicode_New(total, maxchar); @@ -1275,6 +1310,7 @@ PyMem_Free(im_buf); Py_XDECREF(re_unicode_tmp); Py_XDECREF(im_unicode_tmp); + free_locale_info(&locale); assert(!result || _PyUnicode_CheckConsistency(result, 1)); return result; } -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Fri Feb 24 01:47:04 2012 From: python-checkins at python.org (victor.stinner) Date: Fri, 24 Feb 2012 01:47:04 +0100 Subject: [Python-checkins] =?utf8?q?cpython=3A_Issue_=2313706=3A_Fix_forma?= =?utf8?q?t=28float=2C_=22n=22=29_for_locale_with_non-ASCII_decimal_point?= Message-ID: http://hg.python.org/cpython/rev/a29d20fa85b4 changeset: 75234:a29d20fa85b4 user: Victor Stinner date: Fri Feb 24 01:44:47 2012 +0100 summary: Issue #13706: Fix format(float, "n") for locale with non-ASCII decimal point (e.g. ps_aF) files: Lib/test/test_format.py | 10 +++++++++- Objects/unicodeobject.c | 21 ++++++++++++++++----- Python/formatter_unicode.c | 15 ++++++--------- 3 files changed, 31 insertions(+), 15 deletions(-) diff --git a/Lib/test/test_format.py b/Lib/test/test_format.py --- a/Lib/test/test_format.py +++ b/Lib/test/test_format.py @@ -289,10 +289,18 @@ except locale.Error as err: self.skipTest("Cannot set locale: {}".format(err)) try: - sep = locale.localeconv()['thousands_sep'] + 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) diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -9176,9 +9176,16 @@ thousands_sep_data = PyUnicode_DATA(thousands_sep); thousands_sep_len = PyUnicode_GET_LENGTH(thousands_sep); if (unicode != NULL && thousands_sep_kind != kind) { - thousands_sep_data = _PyUnicode_AsKind(thousands_sep, kind); - if (!thousands_sep_data) - return -1; + 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; + } } switch (kind) { @@ -9210,8 +9217,12 @@ assert(0); return -1; } - if (unicode != NULL && thousands_sep_kind != kind) - PyMem_Free(thousands_sep_data); + 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) { diff --git a/Python/formatter_unicode.c b/Python/formatter_unicode.c --- a/Python/formatter_unicode.c +++ b/Python/formatter_unicode.c @@ -529,6 +529,9 @@ 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; @@ -548,10 +551,7 @@ Py_ssize_t d_pos = d_start; unsigned int kind = PyUnicode_KIND(out); void *data = PyUnicode_DATA(out); - -#ifndef NDEBUG Py_ssize_t r; -#endif if (spec->n_lpadding) { PyUnicode_Fill(out, pos, pos + spec->n_lpadding, fill_char); @@ -593,18 +593,15 @@ if (pdigits == NULL) return -1; } -#ifndef NDEBUG - r = -#endif - _PyUnicode_InsertThousandsGrouping( + r = _PyUnicode_InsertThousandsGrouping( out, pos, spec->n_grouped_digits, pdigits + kind * d_pos, spec->n_digits, spec->n_min_width, locale->grouping, locale->thousands_sep, NULL); -#ifndef NDEBUG + if (r == -1) + return -1; assert(r == spec->n_grouped_digits); -#endif if (PyUnicode_KIND(digits) < kind) PyMem_Free(pdigits); d_pos += spec->n_digits; -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Fri Feb 24 02:48:19 2012 From: python-checkins at python.org (brett.cannon) Date: Fri, 24 Feb 2012 02:48:19 +0100 Subject: [Python-checkins] =?utf8?q?cpython=3A_Turn_=5Freturn=5Fmodule=28?= =?utf8?b?KSBpbnRvIF9oYW5kbGVfZnJvbWxpc3QoKS4=?= Message-ID: http://hg.python.org/cpython/rev/3670df23081d changeset: 75235:3670df23081d parent: 75233:e394e62473ee user: Brett Cannon date: Thu Feb 23 20:47:57 2012 -0500 summary: Turn _return_module() into _handle_fromlist(). files: Lib/importlib/_bootstrap.py | 50 ++++++++++++------------ 1 files changed, 25 insertions(+), 25 deletions(-) diff --git a/Lib/importlib/_bootstrap.py b/Lib/importlib/_bootstrap.py --- a/Lib/importlib/_bootstrap.py +++ b/Lib/importlib/_bootstrap.py @@ -1001,7 +1001,7 @@ return _find_and_load(name, _gcd_import) -def _return_module(module, name, fromlist, level, import_): +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 @@ -1010,29 +1010,18 @@ """ # 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]] - elif not name: - return module - else: - cut_off = len(name) - len(name.partition('.')[0]) - return sys.modules[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: - import_('{0}.{1}'.format(module.__name__, x)) - except ImportError: - pass - return module + # 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: + import_('{0}.{1}'.format(module.__name__, x)) + except ImportError: + pass + return module def _calc___package__(globals): @@ -1066,7 +1055,18 @@ else: package = _calc___package__(globals) module = _gcd_import(name, package, level) - return _return_module(module, name, fromlist, level, _gcd_import) + 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]] + elif not name: + return module + else: + cut_off = len(name) - len(name.partition('.')[0]) + return sys.modules[module.__name__[:-cut_off]] + else: + return _handle_fromlist(module, fromlist, _gcd_import) def _setup(sys_module, imp_module): -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Fri Feb 24 02:48:20 2012 From: python-checkins at python.org (brett.cannon) Date: Fri, 24 Feb 2012 02:48:20 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_default_-=3E_default?= =?utf8?q?=29=3A_merge?= Message-ID: http://hg.python.org/cpython/rev/aceedef02c63 changeset: 75236:aceedef02c63 parent: 75235:3670df23081d parent: 75234:a29d20fa85b4 user: Brett Cannon date: Thu Feb 23 20:48:13 2012 -0500 summary: merge files: Lib/test/test_format.py | 10 +++++++++- Objects/unicodeobject.c | 21 ++++++++++++++++----- Python/formatter_unicode.c | 15 ++++++--------- 3 files changed, 31 insertions(+), 15 deletions(-) diff --git a/Lib/test/test_format.py b/Lib/test/test_format.py --- a/Lib/test/test_format.py +++ b/Lib/test/test_format.py @@ -289,10 +289,18 @@ except locale.Error as err: self.skipTest("Cannot set locale: {}".format(err)) try: - sep = locale.localeconv()['thousands_sep'] + 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) diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -9176,9 +9176,16 @@ thousands_sep_data = PyUnicode_DATA(thousands_sep); thousands_sep_len = PyUnicode_GET_LENGTH(thousands_sep); if (unicode != NULL && thousands_sep_kind != kind) { - thousands_sep_data = _PyUnicode_AsKind(thousands_sep, kind); - if (!thousands_sep_data) - return -1; + 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; + } } switch (kind) { @@ -9210,8 +9217,12 @@ assert(0); return -1; } - if (unicode != NULL && thousands_sep_kind != kind) - PyMem_Free(thousands_sep_data); + 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) { diff --git a/Python/formatter_unicode.c b/Python/formatter_unicode.c --- a/Python/formatter_unicode.c +++ b/Python/formatter_unicode.c @@ -529,6 +529,9 @@ 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; @@ -548,10 +551,7 @@ Py_ssize_t d_pos = d_start; unsigned int kind = PyUnicode_KIND(out); void *data = PyUnicode_DATA(out); - -#ifndef NDEBUG Py_ssize_t r; -#endif if (spec->n_lpadding) { PyUnicode_Fill(out, pos, pos + spec->n_lpadding, fill_char); @@ -593,18 +593,15 @@ if (pdigits == NULL) return -1; } -#ifndef NDEBUG - r = -#endif - _PyUnicode_InsertThousandsGrouping( + r = _PyUnicode_InsertThousandsGrouping( out, pos, spec->n_grouped_digits, pdigits + kind * d_pos, spec->n_digits, spec->n_min_width, locale->grouping, locale->thousands_sep, NULL); -#ifndef NDEBUG + if (r == -1) + return -1; assert(r == spec->n_grouped_digits); -#endif if (PyUnicode_KIND(digits) < kind) PyMem_Free(pdigits); d_pos += spec->n_digits; -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Fri Feb 24 11:44:17 2012 From: python-checkins at python.org (ezio.melotti) Date: Fri, 24 Feb 2012 11:44:17 +0100 Subject: [Python-checkins] =?utf8?q?cpython=3A_=2313973=3A_move_a_couple_o?= =?utf8?q?f_imports_at_module_level=2E__Patch_by_Tshepang?= Message-ID: http://hg.python.org/cpython/rev/a3e8f8d10dce changeset: 75237:a3e8f8d10dce user: Ezio Melotti date: Fri Feb 24 12:44:04 2012 +0200 summary: #13973: move a couple of imports at module level. Patch by Tshepang Lekhonkhobe. files: Lib/xmlrpc/client.py | 3 +-- 1 files changed, 1 insertions(+), 2 deletions(-) diff --git a/Lib/xmlrpc/client.py b/Lib/xmlrpc/client.py --- a/Lib/xmlrpc/client.py +++ b/Lib/xmlrpc/client.py @@ -132,6 +132,7 @@ import time from datetime import datetime import http.client +import urllib.parse from xml.parsers import expat import socket import errno @@ -1190,7 +1191,6 @@ if isinstance(host, tuple): host, x509 = host - import urllib.parse auth, host = urllib.parse.splituser(host) if auth: @@ -1383,7 +1383,6 @@ # 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") -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Fri Feb 24 13:45:49 2012 From: python-checkins at python.org (antoine.pitrou) Date: Fri, 24 Feb 2012 13:45:49 +0100 Subject: [Python-checkins] =?utf8?q?cpython=3A_Fix_compilation_error_under?= =?utf8?q?_Windows_=28and_warnings_too=29=2E?= Message-ID: http://hg.python.org/cpython/rev/6cfbca7d0539 changeset: 75238:6cfbca7d0539 user: Antoine Pitrou date: Fri Feb 24 13:30:46 2012 +0100 summary: Fix compilation error under Windows (and warnings too). files: Objects/unicodeobject.c | 18 +++++++++--------- 1 files changed, 9 insertions(+), 9 deletions(-) diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -9160,13 +9160,13 @@ Py_UCS4 *maxchar) { unsigned int kind, thousands_sep_kind; - void *data, *thousands_sep_data; + char *data, *thousands_sep_data; Py_ssize_t thousands_sep_len; Py_ssize_t len; if (unicode != NULL) { kind = PyUnicode_KIND(unicode); - data = PyUnicode_DATA(unicode) + index * kind; + data = (char *) PyUnicode_DATA(unicode) + index * kind; } else { kind = PyUnicode_1BYTE_KIND; @@ -9192,26 +9192,26 @@ case PyUnicode_1BYTE_KIND: if (unicode != NULL && PyUnicode_IS_ASCII(unicode)) len = asciilib_InsertThousandsGrouping( - (Py_UCS1*)data, n_buffer, (Py_UCS1*)digits, n_digits, + (Py_UCS1 *) data, n_buffer, (Py_UCS1 *) digits, n_digits, min_width, grouping, - thousands_sep_data, thousands_sep_len); + (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, - thousands_sep_data, thousands_sep_len); + (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, + (Py_UCS2 *) data, n_buffer, (Py_UCS2 *) digits, n_digits, min_width, grouping, - thousands_sep_data, thousands_sep_len); + (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, + (Py_UCS4 *) data, n_buffer, (Py_UCS4 *) digits, n_digits, min_width, grouping, - thousands_sep_data, thousands_sep_len); + (Py_UCS4 *) thousands_sep_data, thousands_sep_len); break; default: assert(0); -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Fri Feb 24 17:21:00 2012 From: python-checkins at python.org (brett.cannon) Date: Fri, 24 Feb 2012 17:21:00 +0100 Subject: [Python-checkins] =?utf8?q?cpython=3A_Simplify_importib=2E=5Freso?= =?utf8?b?bHZlX25hbWUoKS4=?= Message-ID: http://hg.python.org/cpython/rev/5cfc9c97af23 changeset: 75239:5cfc9c97af23 user: Brett Cannon date: Fri Feb 24 11:20:54 2012 -0500 summary: Simplify importib._resolve_name(). files: Lib/importlib/_bootstrap.py | 16 +++++----------- 1 files changed, 5 insertions(+), 11 deletions(-) diff --git a/Lib/importlib/_bootstrap.py b/Lib/importlib/_bootstrap.py --- a/Lib/importlib/_bootstrap.py +++ b/Lib/importlib/_bootstrap.py @@ -890,17 +890,11 @@ def _resolve_name(name, package, level): """Resolve a relative module name to an absolute one.""" - 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: - return "{0}.{1}".format(package[:dot], name) - else: - return package[:dot] + bits = package.rsplit('.', level-1) + if len(bits) < level: + raise ValueError('attempted relative import beyond top-level package') + base = bits[0] + return '{0}.{1}'.format(base, name) if name else base def _find_module(name, path): -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Fri Feb 24 17:49:13 2012 From: python-checkins at python.org (benjamin.peterson) Date: Fri, 24 Feb 2012 17:49:13 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=283=2E2=29=3A_Bump_version_to?= =?utf8?q?_3=2E2=2E3rc1=2E?= Message-ID: http://hg.python.org/cpython/rev/64e9b07ee70a changeset: 75240:64e9b07ee70a branch: 3.2 parent: 75214:1fc4e9f1fcf2 user: Georg Brandl date: Thu Feb 23 21:14:12 2012 +0100 summary: Bump version to 3.2.3rc1. files: Include/patchlevel.h | 8 ++++---- Lib/distutils/__init__.py | 2 +- Lib/idlelib/idlever.py | 2 +- Misc/NEWS | 14 +++++++------- Misc/RPM/python-3.2.spec | 2 +- README | 4 ++-- 6 files changed, 16 insertions(+), 16 deletions(-) diff --git a/Include/patchlevel.h b/Include/patchlevel.h --- a/Include/patchlevel.h +++ b/Include/patchlevel.h @@ -18,12 +18,12 @@ /*--start constants--*/ #define PY_MAJOR_VERSION 3 #define PY_MINOR_VERSION 2 -#define PY_MICRO_VERSION 2 -#define PY_RELEASE_LEVEL PY_RELEASE_LEVEL_FINAL -#define PY_RELEASE_SERIAL 0 +#define PY_MICRO_VERSION 3 +#define PY_RELEASE_LEVEL PY_RELEASE_LEVEL_GAMMA +#define PY_RELEASE_SERIAL 1 /* Version as a string */ -#define PY_VERSION "3.2.2+" +#define PY_VERSION "3.2.3rc1" /*--end constants--*/ /* Subversion Revision number of this file (not of the repository). Empty diff --git a/Lib/distutils/__init__.py b/Lib/distutils/__init__.py --- a/Lib/distutils/__init__.py +++ b/Lib/distutils/__init__.py @@ -13,5 +13,5 @@ # Updated automatically by the Python release process. # #--start constants-- -__version__ = "3.2.2" +__version__ = "3.2.3rc1" #--end constants-- diff --git a/Lib/idlelib/idlever.py b/Lib/idlelib/idlever.py --- a/Lib/idlelib/idlever.py +++ b/Lib/idlelib/idlever.py @@ -1,1 +1,1 @@ -IDLE_VERSION = "3.2.2" +IDLE_VERSION = "3.2.3rc1" diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -2,22 +2,22 @@ Python News +++++++++++ -What's New in Python 3.2.3? -=========================== - -*Release date: XX-XXX-2011* +What's New in Python 3.2.3 release candidate 1? +=============================================== + +*Release date: 24-Feb-2011* Core and Builtins ----------------- -- Issue #14084: Fix a file descriptor leak when importing a module with a - bad encoding. - - 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. diff --git a/Misc/RPM/python-3.2.spec b/Misc/RPM/python-3.2.spec --- a/Misc/RPM/python-3.2.spec +++ b/Misc/RPM/python-3.2.spec @@ -39,7 +39,7 @@ %define name python #--start constants-- -%define version 3.2.2 +%define version 3.2.3rc1 %define libvers 3.2 #--end constants-- %define release 1pydotorg diff --git a/README b/README --- a/README +++ b/README @@ -1,5 +1,5 @@ -This is Python version 3.2.2 -============================ +This is Python version 3.2.3 rc1 +================================ Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 Python Software Foundation. All rights reserved. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Fri Feb 24 17:49:14 2012 From: python-checkins at python.org (benjamin.peterson) Date: Fri, 24 Feb 2012 17:49:14 +0100 Subject: [Python-checkins] =?utf8?b?Y3B5dGhvbiAoMy4yKTogQWRkIDMuMi4zIHRv?= =?utf8?q?_license=2E?= Message-ID: http://hg.python.org/cpython/rev/be939110f709 changeset: 75241:be939110f709 branch: 3.2 user: Georg Brandl date: Thu Feb 23 21:19:18 2012 +0100 summary: Add 3.2.3 to license. files: Doc/license.rst | 2 ++ LICENSE | 1 + 2 files changed, 3 insertions(+), 0 deletions(-) diff --git a/Doc/license.rst b/Doc/license.rst --- a/Doc/license.rst +++ b/Doc/license.rst @@ -118,6 +118,8 @@ +----------------+--------------+------------+------------+-----------------+ | 3.2.2 | 3.2.1 | 2011 | PSF | yes | +----------------+--------------+------------+------------+-----------------+ +| 3.2.3 | 3.2.2 | 2012 | PSF | yes | ++----------------+--------------+------------+------------+-----------------+ .. note:: diff --git a/LICENSE b/LICENSE --- a/LICENSE +++ b/LICENSE @@ -73,6 +73,7 @@ 3.2 3.1 2011 PSF yes 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 Footnotes: -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Fri Feb 24 17:49:15 2012 From: python-checkins at python.org (benjamin.peterson) Date: Fri, 24 Feb 2012 17:49:15 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=283=2E2=29=3A_Update_copyrigh?= =?utf8?q?t_year=2E?= Message-ID: http://hg.python.org/cpython/rev/7085403daf43 changeset: 75242:7085403daf43 branch: 3.2 tag: v3.2.3rc1 user: Georg Brandl date: Thu Feb 23 21:19:25 2012 +0100 summary: Update copyright year. files: PC/python_nt.rc | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/PC/python_nt.rc b/PC/python_nt.rc --- a/PC/python_nt.rc +++ b/PC/python_nt.rc @@ -61,7 +61,7 @@ VALUE "FileDescription", "Python Core\0" VALUE "FileVersion", PYTHON_VERSION VALUE "InternalName", "Python DLL\0" - VALUE "LegalCopyright", "Copyright ? 2001-2011 Python Software Foundation. Copyright ? 2000 BeOpen.com. Copyright ? 1995-2001 CNRI. Copyright ? 1991-1995 SMC.\0" + VALUE "LegalCopyright", "Copyright ? 2001-2012 Python Software Foundation. Copyright ? 2000 BeOpen.com. Copyright ? 1995-2001 CNRI. Copyright ? 1991-1995 SMC.\0" VALUE "OriginalFilename", PYTHON_DLL_NAME "\0" VALUE "ProductName", "Python\0" VALUE "ProductVersion", PYTHON_VERSION -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Fri Feb 24 17:49:15 2012 From: python-checkins at python.org (benjamin.peterson) Date: Fri, 24 Feb 2012 17:49:15 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=283=2E2=29=3A_Added_tag_v3=2E?= =?utf8?q?2=2E3rc1_for_changeset_7085403daf43?= Message-ID: http://hg.python.org/cpython/rev/7615f497881a changeset: 75243:7615f497881a branch: 3.2 user: Georg Brandl date: Thu Feb 23 21:19:41 2012 +0100 summary: Added tag v3.2.3rc1 for changeset 7085403daf43 files: .hgtags | 1 + 1 files changed, 1 insertions(+), 0 deletions(-) diff --git a/.hgtags b/.hgtags --- a/.hgtags +++ b/.hgtags @@ -94,3 +94,4 @@ ac1f7e5c05104d557d5acd922e95625ba5d1fe10 v3.2.1 c860feaa348d663e598986894ee4680480577e15 v3.2.2rc1 137e45f15c0bd262c9ad4c032d97425bc0589456 v3.2.2 +7085403daf439adb3f9e70ef13f6bedb1c447376 v3.2.3rc1 -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Fri Feb 24 17:49:16 2012 From: python-checkins at python.org (benjamin.peterson) Date: Fri, 24 Feb 2012 17:49:16 +0100 Subject: [Python-checkins] =?utf8?b?Y3B5dGhvbiAobWVyZ2UgMy4yIC0+IDMuMik6?= =?utf8?q?_merge_3=2E2=2E2_release_branch_for_rc?= Message-ID: http://hg.python.org/cpython/rev/a51da0faf39f changeset: 75244:a51da0faf39f branch: 3.2 parent: 75224:092599f9c89a parent: 75243:7615f497881a user: Benjamin Peterson date: Fri Feb 24 11:47:29 2012 -0500 summary: merge 3.2.2 release branch for rc files: .hgtags | 1 + Doc/license.rst | 2 ++ Include/patchlevel.h | 8 ++++---- LICENSE | 1 + Lib/distutils/__init__.py | 2 +- Lib/idlelib/idlever.py | 2 +- Misc/NEWS | 14 +++++++------- Misc/RPM/python-3.2.spec | 2 +- PC/python_nt.rc | 2 +- README | 4 ++-- 10 files changed, 21 insertions(+), 17 deletions(-) diff --git a/.hgtags b/.hgtags --- a/.hgtags +++ b/.hgtags @@ -94,3 +94,4 @@ ac1f7e5c05104d557d5acd922e95625ba5d1fe10 v3.2.1 c860feaa348d663e598986894ee4680480577e15 v3.2.2rc1 137e45f15c0bd262c9ad4c032d97425bc0589456 v3.2.2 +7085403daf439adb3f9e70ef13f6bedb1c447376 v3.2.3rc1 diff --git a/Doc/license.rst b/Doc/license.rst --- a/Doc/license.rst +++ b/Doc/license.rst @@ -118,6 +118,8 @@ +----------------+--------------+------------+------------+-----------------+ | 3.2.2 | 3.2.1 | 2011 | PSF | yes | +----------------+--------------+------------+------------+-----------------+ +| 3.2.3 | 3.2.2 | 2012 | PSF | yes | ++----------------+--------------+------------+------------+-----------------+ .. note:: diff --git a/Include/patchlevel.h b/Include/patchlevel.h --- a/Include/patchlevel.h +++ b/Include/patchlevel.h @@ -18,12 +18,12 @@ /*--start constants--*/ #define PY_MAJOR_VERSION 3 #define PY_MINOR_VERSION 2 -#define PY_MICRO_VERSION 2 -#define PY_RELEASE_LEVEL PY_RELEASE_LEVEL_FINAL -#define PY_RELEASE_SERIAL 0 +#define PY_MICRO_VERSION 3 +#define PY_RELEASE_LEVEL PY_RELEASE_LEVEL_GAMMA +#define PY_RELEASE_SERIAL 1 /* Version as a string */ -#define PY_VERSION "3.2.2+" +#define PY_VERSION "3.2.3rc1" /*--end constants--*/ /* Subversion Revision number of this file (not of the repository). Empty diff --git a/LICENSE b/LICENSE --- a/LICENSE +++ b/LICENSE @@ -73,6 +73,7 @@ 3.2 3.1 2011 PSF yes 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 Footnotes: diff --git a/Lib/distutils/__init__.py b/Lib/distutils/__init__.py --- a/Lib/distutils/__init__.py +++ b/Lib/distutils/__init__.py @@ -13,5 +13,5 @@ # Updated automatically by the Python release process. # #--start constants-- -__version__ = "3.2.2" +__version__ = "3.2.3rc1" #--end constants-- diff --git a/Lib/idlelib/idlever.py b/Lib/idlelib/idlever.py --- a/Lib/idlelib/idlever.py +++ b/Lib/idlelib/idlever.py @@ -1,1 +1,1 @@ -IDLE_VERSION = "3.2.2" +IDLE_VERSION = "3.2.3rc1" diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -2,22 +2,22 @@ Python News +++++++++++ -What's New in Python 3.2.3? -=========================== - -*Release date: XX-XXX-2011* +What's New in Python 3.2.3 release candidate 1? +=============================================== + +*Release date: 24-Feb-2011* Core and Builtins ----------------- -- Issue #14084: Fix a file descriptor leak when importing a module with a - bad encoding. - - 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. diff --git a/Misc/RPM/python-3.2.spec b/Misc/RPM/python-3.2.spec --- a/Misc/RPM/python-3.2.spec +++ b/Misc/RPM/python-3.2.spec @@ -39,7 +39,7 @@ %define name python #--start constants-- -%define version 3.2.2 +%define version 3.2.3rc1 %define libvers 3.2 #--end constants-- %define release 1pydotorg diff --git a/PC/python_nt.rc b/PC/python_nt.rc --- a/PC/python_nt.rc +++ b/PC/python_nt.rc @@ -61,7 +61,7 @@ VALUE "FileDescription", "Python Core\0" VALUE "FileVersion", PYTHON_VERSION VALUE "InternalName", "Python DLL\0" - VALUE "LegalCopyright", "Copyright ? 2001-2011 Python Software Foundation. Copyright ? 2000 BeOpen.com. Copyright ? 1995-2001 CNRI. Copyright ? 1991-1995 SMC.\0" + VALUE "LegalCopyright", "Copyright ? 2001-2012 Python Software Foundation. Copyright ? 2000 BeOpen.com. Copyright ? 1995-2001 CNRI. Copyright ? 1991-1995 SMC.\0" VALUE "OriginalFilename", PYTHON_DLL_NAME "\0" VALUE "ProductName", "Python\0" VALUE "ProductVersion", PYTHON_VERSION diff --git a/README b/README --- a/README +++ b/README @@ -1,5 +1,5 @@ -This is Python version 3.2.2 -============================ +This is Python version 3.2.3 rc1 +================================ Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 Python Software Foundation. All rights reserved. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Fri Feb 24 17:49:17 2012 From: python-checkins at python.org (benjamin.peterson) Date: Fri, 24 Feb 2012 17:49:17 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_3=2E2_-=3E_default=29?= =?utf8?q?=3A_merge_3=2E2?= Message-ID: http://hg.python.org/cpython/rev/532639ee6641 changeset: 75245:532639ee6641 parent: 75238:6cfbca7d0539 parent: 75244:a51da0faf39f user: Benjamin Peterson date: Fri Feb 24 11:48:47 2012 -0500 summary: merge 3.2 files: .hgtags | 1 + PC/python_nt.rc | 2 +- 2 files changed, 2 insertions(+), 1 deletions(-) diff --git a/.hgtags b/.hgtags --- a/.hgtags +++ b/.hgtags @@ -94,3 +94,4 @@ ac1f7e5c05104d557d5acd922e95625ba5d1fe10 v3.2.1 c860feaa348d663e598986894ee4680480577e15 v3.2.2rc1 137e45f15c0bd262c9ad4c032d97425bc0589456 v3.2.2 +7085403daf439adb3f9e70ef13f6bedb1c447376 v3.2.3rc1 diff --git a/PC/python_nt.rc b/PC/python_nt.rc --- a/PC/python_nt.rc +++ b/PC/python_nt.rc @@ -61,7 +61,7 @@ VALUE "FileDescription", "Python Core\0" VALUE "FileVersion", PYTHON_VERSION VALUE "InternalName", "Python DLL\0" - VALUE "LegalCopyright", "Copyright ? 2001-2011 Python Software Foundation. Copyright ? 2000 BeOpen.com. Copyright ? 1995-2001 CNRI. Copyright ? 1991-1995 SMC.\0" + VALUE "LegalCopyright", "Copyright ? 2001-2012 Python Software Foundation. Copyright ? 2000 BeOpen.com. Copyright ? 1995-2001 CNRI. Copyright ? 1991-1995 SMC.\0" VALUE "OriginalFilename", PYTHON_DLL_NAME "\0" VALUE "ProductName", "Python\0" VALUE "ProductVersion", PYTHON_VERSION -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Fri Feb 24 17:49:18 2012 From: python-checkins at python.org (benjamin.peterson) Date: Fri, 24 Feb 2012 17:49:18 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_default_-=3E_default?= =?utf8?q?=29=3A_merge_heads?= Message-ID: http://hg.python.org/cpython/rev/e2eccc906354 changeset: 75246:e2eccc906354 parent: 75245:532639ee6641 parent: 75239:5cfc9c97af23 user: Benjamin Peterson date: Fri Feb 24 11:49:07 2012 -0500 summary: merge heads files: Lib/importlib/_bootstrap.py | 16 +++++----------- 1 files changed, 5 insertions(+), 11 deletions(-) diff --git a/Lib/importlib/_bootstrap.py b/Lib/importlib/_bootstrap.py --- a/Lib/importlib/_bootstrap.py +++ b/Lib/importlib/_bootstrap.py @@ -890,17 +890,11 @@ def _resolve_name(name, package, level): """Resolve a relative module name to an absolute one.""" - 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: - return "{0}.{1}".format(package[:dot], name) - else: - return package[:dot] + bits = package.rsplit('.', level-1) + if len(bits) < level: + raise ValueError('attempted relative import beyond top-level package') + base = bits[0] + return '{0}.{1}'.format(base, name) if name else base def _find_module(name, path): -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Fri Feb 24 18:04:58 2012 From: python-checkins at python.org (nick.coghlan) Date: Fri, 24 Feb 2012 18:04:58 +0100 Subject: [Python-checkins] =?utf8?q?peps=3A_Add_PEP_413_as_a_competitor_to?= =?utf8?q?_PEP_407?= Message-ID: http://hg.python.org/peps/rev/e0373d66b395 changeset: 4073:e0373d66b395 user: Nick Coghlan date: Sat Feb 25 03:04:48 2012 +1000 summary: Add PEP 413 as a competitor to PEP 407 files: pep-0413.txt | 371 +++++++++++++++++++++++++++++++++++++++ 1 files changed, 371 insertions(+), 0 deletions(-) diff --git a/pep-0413.txt b/pep-0413.txt new file mode 100644 --- /dev/null +++ b/pep-0413.txt @@ -0,0 +1,371 @@ +PEP: 413 +Title: Faster evolution of the Python Standard Library +Version: $Revision$ +Last-Modified: $Date$ +Author: Nick Coghlan +Status: Draft +Type: Process +Content-Type: text/x-rst +Created: 2012-02-24 +Post-History: 2012-02-24 +Resolution: TBD + + +Abstract +======== + +This PEP proposes the adoption of a new date-based versioning scheme for +the standard library (distinct from, but coupled to, the existing language +versioning scheme) that allows accelerated releases of the Python standard +library, while maintaining (or even slowing down) the current rate of +change in the core language definition. + +Like PEP 407, it aims to adjust the current balance between measured +change that allows the broader community time to adapt and being able to +keep pace with external influences that evolve more rapidly than the current +release cycle can handle (this problem is particularly notable for +standard library elements that relate to web technologies). + +However, it's more conservative in its aims than PEP 407, seeking to +restrict the increased pace of development to builtin and standard library +interfaces, without affecting the rate of change for other elements such +as the language syntax and version numbering as well as the CPython +binary API and bytecode format. + + +Rationale +========= + +To quote the PEP 407 abstract: + + Finding a release cycle for an open-source project is a delicate exercise + in managing mutually contradicting constraints: developer manpower, + availability of release management volunteers, ease of maintenance for + users and third-party packagers, quick availability of new features (and + behavioural changes), availability of bug fixes without pulling in new + features or behavioural changes. + + The current release cycle errs on the conservative side. It is adequate + for people who value stability over reactivity. This PEP is an attempt to + keep the stability that has become a Python trademark, while offering a + more fluid release of features, by introducing the notion of long-term + support versions. + +I agree with the PEP 407 authors that the current release cycle of the +*standard library* is too slow to effectively cope with the pace of change +in some key programming areas (specifically, web protocols and related +technologies, including databases, templating and serialisation formats). + +However, I have written this competing PEP because I believe that the +approach proposed in PEP 407 of offering full, potentially binary +incompatible releases of CPython every 6 months places too great a burden +on the wider Python ecosystem. + +Under the current CPython release cycle, distributors of key binary +extensions will often support Python releases even after the CPython branches +enter "security fix only" mode (for example, Twisted currently ships binaries +for 2.5, 2.6 and 2.7, NumPy and SciPy suport those 3 along with 3.1 and 3.2, +PyGame adds a 2.4 binary release, wxPython provides both 32-bit and 64-bit +binaries for 2.6 and 2.7, etc). + +If CPython were to triple (or more) its rate of releases, the developers of +those libraries (many of which are even more resource starved than CPython) +would face an unpalatable choice: either adopt the faster release cycle +themselves (up to 18 simultaneous binary releases for PyGame!), drop +older Python versions more quickly, or else tell their users to stick to the +CPython LTS releases (thus defeating the entire point of speeding up the +CPython release cycle in the first place). + +Similarly, many support tools for Python (e.g. syntax highlighters) can take +quite some time to catch up with language level changes. + +At a cultural level, the Python community is also accustomed to a certain +meaning for Python version numbers - they're linked to deprecation periods, +support periods, all sorts of things. PEP 407 proposes that collective +knowledge all be swept aside, without offering a compelling rationale for why +such a course of action is actually *necessary* (aside from, perhaps, making +the lives of the CPython core developers a little easier at the expense of +everyone else). + +But, if we go back to the primary rationale for increasing the pace of change +(i.e. more timely support for web protocols and related technologies), we can +note that those only require *standard library* changes. That means many +(perhaps even most) of the negative effects on the wider community can be +avoided by explicitly limiting which parts of CPython are affected by the +new release cycle, and allowing other parts to evolve at their current, more +sedate, pace. + + +Proposal +======== + +This PEP proposes the addition of a new ``sys.stdlib_info`` attribute that +records a date based standard library version above and beyond the underlying +interpreter version:: + + sys.stdlib_info(year=2012, month=8, micro=0, releaselevel='final', serial=0) + +This information would also be included in the ``sys.version`` string:: + + Python 3.3.0 (12.08.0, default:c1a07c8092f7+, Feb 17 2012, 23:03:41) + [GCC 4.6.1] + +When maintenance releases are created, *two* new versions of Python would +actually be published on python.org (using the first 3.3 maintenance release, +planned for February 2013 as an example):: + + 3.3.1 + 12.08.1 # Maintenance release + 3.3.1 + 13.02.0 # Standard library release + +A standard library release would just be the corresponding maintenance +release, with the following additional, backwards compatible changes: + +* new features in pure Python modules +* new features in C extension modules (subject to PEP 399 compatibility + requirements) +* new features in language builtins (provided the C ABI remains unaffected) + +A further 6 months later, the next 3.3 maintenance release would again be +accompanied by a new standard library release:: + + 3.3.2 + 12.08.2 # Maintenance release + 3.3.2 + 13.08.1 # Standard library release + +Again, the standard library release would be binary compatible with the +previous language release, merely offering additional features at the +Python level. + +Finally, 18 months after the release of 3.3, a new language release would +be made around the same time as the final 3.3 maintenance release: + + 3.3.3 + 12.08.3 # Maintenance release + 3.4.0 + 14.02.0 # Language release + +Language releases would then contain all the features that are not +permitted in standard library releases: + +* new language syntax +* new deprecation warnings +* removal of previously deprecated features +* changes to the emitted bytecode +* changes to the AST +* any other significant changes to the compilation toolchain +* changes to the C ABI + +The 3.4 release cycle would then follow a similar pattern to that for 3.3:: + + 3.4.1 + 14.02.1 # Maintenance release + 3.4.1 + 14.08.0 # Standard library release + 3.4.2 + 14.02.2 # Maintenance release + 3.4.2 + 15.02.0 # Standard library release + 3.4.3 + 14.02.3 # Maintenance release + 3.5.0 + 15.08.0 # Language release + + +Effects +======= + +Effect on development cycle +--------------------------- + +Similar to PEP 407, this PEP will break up the delivery of new features into +more discrete chunks. Instead of whole raft of changes landing all at once +in a language release, each language release will be limited to 6 months +worth of standard library changes, as well as any changes associated with +new syntax. + +Effect on workflow +------------------ + +This PEP proposes the creation of a single additional branch for use in the +normal workflow. After the release of 3.3, the following branches would be +in use:: + + 2.7 # Maintenance branch, no change + 3.3 # Maintenance branch, as for 3.2 + 3.3-compat # New branch, backwards compatible changes + default # Language changes, standard library updates that depend on them + +When working on a new feature, developers will need to decide whether or not +it is an acceptable change for a standard library release. If so, then it +should be checked in on ``3.3-compat`` and then merged to ``default``. +Otherwise it should be checked in directly to ``default``. + + +Effect on bugfix cycle +---------------------- + +The effect on the bug fix cycle is essentially the same as that on the +workflow for new features - there is one additional branch to pass through +before the change reaches default branch. + + +Effect on the community +----------------------- + +PEP 407 has this to say about the effects on the community: + + People who value stability can just synchronize on the LTS releases which, + with the proposed figures, would give a similar support cycle (both in + duration and in stability). + +I believe this statement is just plain wrong. Life isn't that simple. Instead, +developers of third party modules and frameworks will come under pressure to +support the full pace of the new release cycle with binary updates, teachers +and book authors will receive complaints that they're only covering an "old" +version of Python ("You're only using 3.3, the latest is 3.5!"), etc. + +As the minor version number starts climbing 3 times faster than it has in the +past, I believe perceptions of language stability would also fall (whether +such opinions were justified or not). + +I believe isolating the increased pace of change to the standard library, +and clearly delineating it with a separate date-based version number will +greatly reassure the rest of the community that no, we're not suddenly +asking them to triple their own rate of development. Instead, we're merely +going to ship standard library updates for the next language release in +three 6-monthly installments rather than delaying them all, even those that +are backwards compatible with the previously released version of Python. + +The community benefits list in PEP 407 are equally applicable to this PEP, +at least as far as the standard library is concerned: + + People who value reactivity and access to new features (without taking the + risk to install alpha versions or Mercurial snapshots) would get much more + value from the new release cycle than currently. + + People who want to contribute new features or improvements would be more + motivated to do so, knowing that their contributions will be more quickly + available to normal users. + +If the faster release cycle encourages more people to focus on contributing +to the standard library rather than proposing changes to the language +definition, I don't see that as a bad thing. + + +Handling News Updates +===================== + + +What's New? +----------- + +The "What's New" documents would be split out into separate documents for +standard library releases and language releases. If the major version +number only continues to increase once every decade or so, resolving the +eventual numbering conflict can be safely deemed somebody elses problem :) + + +NEWS +---- + +Merge conflicts on the NEWS file is already a hassle. Since this PEP +proposes introduction of an additional branch into the normal workflow, +resolving this becomes even more critical. While Mercurial phases will +help to some degree, it would be good to eliminate the problem entirely. + +One suggestion from Barry Warsaw is to adopt a non-conflicting +separate-files-per-change approach, similar to that used by Twisted [2_]. + +For this PEP, one possible layout for such an approach (adopted following +the release of 3.3.0+12.8.0 using the existing NEWS process) might look +like:: + + Misc/ + lang_news/ + 3.3.1/ + + 3.4.0/ + + stdlib_news/ + 12.08.1/ + builtins/ + + extensions/ + + library/ + + documentation/ + + tests/ + + 13.02.0/ + builtins/ + + extensions/ + + library/ + + documentation/ + + tests/ + + NEWS # Now autogenerated from lang_news and stdlib_news + +Putting the version information in the directory heirarchy isn't strictly +necessary (since the NEWS file generator could figure out from the version +history), but does make it easy for *humans* to keep the different versions +in order. + + +Why isn't PEP 384 enough? +========================= + +PEP 384 introduced the notion of a "Stable ABI" for CPython, a limited +subset of the full C ABI that is guaranteed to remain stable. Extensions +built against the stable ABI should be able to support all subsequent +Python versions with the same binary. + +This will help new projects to avoid coupling their C extension modules too +closely to a specific version of CPython. For existing modules, however, +migrating to the stable ABI can involve quite a lot of work (especially for +extension modules that define a lot of classes). With limited development +resources available, any time spent on such a change is time that could +otherwise have been spent working on features that are offer more direct +benefits to end users. + + +Why not separate out the standard library entirely? +=================================================== + +Because it's a lot of work for next to no pay-off. CPython without the +standard library is useless (the build chain won't even finish). You +can't create a standalone pure Python standard library, because too many +"modules" are actually tightly linked in to the internal details of the +respective interpreters (e.g. ``weakref``, ``gc``, ``sys``). + +Creating a separate development branch that is kept compatible with the +previous feature release should provide most of the benefits of a +separate standard library repository with only a fraction of the pain. + + +Acknowledgements +================ + +Thanks go to the PEP 407 authors for starting this discussion, as well as +to those authors and Larry Hastings for initial discussions of the proposal +made in this PEP. + +References +========== + +.. [1] PEP 407: New release cycle and introducing long-term support versions + http://www.python.org/dev/peps/pep-0407/ + +.. [2] Twisted's "topfiles" approach to NEWS generation + http://twistedmatrix.com/trac/wiki/ReviewProcess#Newsfiles + +Copyright +========= + +This document has been placed in the public domain. + + +.. + Local Variables: + mode: indented-text + indent-tabs-mode: nil + sentence-end-double-space: t + fill-column: 70 + coding: utf-8 + End: -- Repository URL: http://hg.python.org/peps From python-checkins at python.org Sat Feb 25 00:43:41 2012 From: python-checkins at python.org (victor.stinner) Date: Sat, 25 Feb 2012 00:43:41 +0100 Subject: [Python-checkins] =?utf8?q?cpython=3A_Issue_=2314107=3A_fix_bigme?= =?utf8?q?m_tests_on_str=2Ecapitalize=28=29=2C_str=2Eswapcase=28=29_and?= Message-ID: http://hg.python.org/cpython/rev/4afcb25988c4 changeset: 75247:4afcb25988c4 user: Victor Stinner date: Sat Feb 25 00:43:27 2012 +0100 summary: Issue #14107: fix bigmem tests on str.capitalize(), str.swapcase() and str.title(). Compute correctly how much memory is required for the test (memuse). files: Lib/test/test_bigmem.py | 45 +++++++++++++++++++++++++--- Objects/unicodeobject.c | 24 +++++++++++--- 2 files changed, 57 insertions(+), 12 deletions(-) diff --git a/Lib/test/test_bigmem.py b/Lib/test/test_bigmem.py --- a/Lib/test/test_bigmem.py +++ b/Lib/test/test_bigmem.py @@ -69,8 +69,7 @@ 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 @@ -421,8 +420,7 @@ 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) @@ -433,8 +431,7 @@ 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) @@ -608,6 +605,18 @@ for name, memuse in self._adjusted.items(): getattr(type(self), name).memuse = memuse + @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. @@ -763,6 +772,18 @@ 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): @@ -774,6 +795,18 @@ 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 diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -10628,7 +10628,10 @@ { if (PyUnicode_READY(self) == -1) return NULL; - return case_operation(self, do_title); + if (PyUnicode_IS_ASCII(self)) + return ascii_case_operation(self, ascii_do_title); + else + return case_operation(self, do_title); } PyDoc_STRVAR(capitalize__doc__, @@ -10644,7 +10647,10 @@ return NULL; if (PyUnicode_GET_LENGTH(self) == 0) return unicode_result_unchanged(self); - return case_operation(self, do_capitalize); + if (PyUnicode_IS_ASCII(self)) + return ascii_case_operation(self, ascii_do_capitalize); + else + return case_operation(self, do_capitalize); } PyDoc_STRVAR(casefold__doc__, @@ -10659,7 +10665,8 @@ return NULL; if (PyUnicode_IS_ASCII(self)) return ascii_upper_or_lower(self, 1); - return case_operation(self, do_casefold); + else + return case_operation(self, do_casefold); } @@ -11893,7 +11900,8 @@ return NULL; if (PyUnicode_IS_ASCII(self)) return ascii_upper_or_lower(self, 1); - return case_operation(self, do_lower); + else + return case_operation(self, do_lower); } #define LEFTSTRIP 0 @@ -12784,7 +12792,10 @@ { if (PyUnicode_READY(self) == -1) return NULL; - return case_operation(self, do_swapcase); + if (PyUnicode_IS_ASCII(self)) + return ascii_case_operation(self, ascii_do_swapcase); + else + return case_operation(self, do_swapcase); } PyDoc_STRVAR(maketrans__doc__, @@ -12934,7 +12945,8 @@ return NULL; if (PyUnicode_IS_ASCII(self)) return ascii_upper_or_lower(self, 0); - return case_operation(self, do_upper); + else + return case_operation(self, do_upper); } PyDoc_STRVAR(zfill__doc__, -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sat Feb 25 00:47:22 2012 From: python-checkins at python.org (victor.stinner) Date: Sat, 25 Feb 2012 00:47:22 +0100 Subject: [Python-checkins] =?utf8?q?cpython=3A_Oops=2C_revert_unwanted_cha?= =?utf8?q?nges?= Message-ID: http://hg.python.org/cpython/rev/84d752c3ab6f changeset: 75248:84d752c3ab6f user: Victor Stinner date: Sat Feb 25 00:47:08 2012 +0100 summary: Oops, revert unwanted changes files: Objects/unicodeobject.c | 24 ++++++------------------ 1 files changed, 6 insertions(+), 18 deletions(-) diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -10628,10 +10628,7 @@ { if (PyUnicode_READY(self) == -1) return NULL; - if (PyUnicode_IS_ASCII(self)) - return ascii_case_operation(self, ascii_do_title); - else - return case_operation(self, do_title); + return case_operation(self, do_title); } PyDoc_STRVAR(capitalize__doc__, @@ -10647,10 +10644,7 @@ return NULL; if (PyUnicode_GET_LENGTH(self) == 0) return unicode_result_unchanged(self); - if (PyUnicode_IS_ASCII(self)) - return ascii_case_operation(self, ascii_do_capitalize); - else - return case_operation(self, do_capitalize); + return case_operation(self, do_capitalize); } PyDoc_STRVAR(casefold__doc__, @@ -10665,8 +10659,7 @@ return NULL; if (PyUnicode_IS_ASCII(self)) return ascii_upper_or_lower(self, 1); - else - return case_operation(self, do_casefold); + return case_operation(self, do_casefold); } @@ -11900,8 +11893,7 @@ return NULL; if (PyUnicode_IS_ASCII(self)) return ascii_upper_or_lower(self, 1); - else - return case_operation(self, do_lower); + return case_operation(self, do_lower); } #define LEFTSTRIP 0 @@ -12792,10 +12784,7 @@ { if (PyUnicode_READY(self) == -1) return NULL; - if (PyUnicode_IS_ASCII(self)) - return ascii_case_operation(self, ascii_do_swapcase); - else - return case_operation(self, do_swapcase); + return case_operation(self, do_swapcase); } PyDoc_STRVAR(maketrans__doc__, @@ -12945,8 +12934,7 @@ return NULL; if (PyUnicode_IS_ASCII(self)) return ascii_upper_or_lower(self, 0); - else - return case_operation(self, do_upper); + return case_operation(self, do_upper); } PyDoc_STRVAR(zfill__doc__, -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sat Feb 25 01:34:20 2012 From: python-checkins at python.org (victor.stinner) Date: Sat, 25 Feb 2012 01:34:20 +0100 Subject: [Python-checkins] =?utf8?q?cpython=3A_Close_=2314095=3A_type=2E?= =?utf8?b?X19uZXdfXygpIGRvZXNuJ3QgcmVtb3ZlIF9fcXVhbG5hbWVfXyBrZXkgZnJvbSB0?= =?utf8?q?he_class?= Message-ID: http://hg.python.org/cpython/rev/b83ae75beaca changeset: 75249:b83ae75beaca user: Victor Stinner date: Sat Feb 25 01:22:36 2012 +0100 summary: Close #14095: type.__new__() doesn't remove __qualname__ key from the class dict anymore if the key is present. Reject also non-string qualified names. And fix reference leaks in type.__new__(). files: Lib/test/test_descr.py | 16 ++- Objects/typeobject.c | 159 +++++++++++++--------------- 2 files changed, 85 insertions(+), 90 deletions(-) diff --git a/Lib/test/test_descr.py b/Lib/test/test_descr.py --- a/Lib/test/test_descr.py +++ b/Lib/test/test_descr.py @@ -4474,6 +4474,16 @@ self.assertEqual(float.real.__qualname__, 'float.real') self.assertEqual(int.__add__.__qualname__, 'int.__add__') + def test_qualname_dict(self): + ns = {'__qualname__': 'some.name'} + tp = type('Foo', (), ns) + self.assertEqual(tp.__qualname__, 'some.name') + self.assertEqual(tp.__dict__['__qualname__'], 'some.name') + self.assertEqual(ns, {'__qualname__': 'some.name'}) + + ns = {'__qualname__': 1} + self.assertRaises(TypeError, type, 'Foo', (), ns) + class DictProxyTests(unittest.TestCase): def setUp(self): @@ -4491,7 +4501,7 @@ keys = list(it) keys.sort() self.assertEqual(keys, ['__dict__', '__doc__', '__module__', - '__weakref__', 'meth']) + '__qualname__', '__weakref__', 'meth']) @unittest.skipIf(hasattr(sys, 'gettrace') and sys.gettrace(), 'trace function introduces __local__') @@ -4500,7 +4510,7 @@ it = self.C.__dict__.values() self.assertNotIsInstance(it, list) values = list(it) - self.assertEqual(len(values), 5) + self.assertEqual(len(values), 6) @unittest.skipIf(hasattr(sys, 'gettrace') and sys.gettrace(), 'trace function introduces __local__') @@ -4511,7 +4521,7 @@ keys = [item[0] for item in it] keys.sort() self.assertEqual(keys, ['__dict__', '__doc__', '__module__', - '__weakref__', 'meth']) + '__qualname__', '__weakref__', 'meth']) def test_dict_type_with_metaclass(self): # Testing type of __dict__ when metaclass set... diff --git a/Objects/typeobject.c b/Objects/typeobject.c --- a/Objects/typeobject.c +++ b/Objects/typeobject.c @@ -1961,10 +1961,10 @@ 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 *qualname, *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; @@ -1998,7 +1998,7 @@ 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: */ @@ -2018,39 +2018,27 @@ 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; - } - - /* Check for a __qualname__ variable in dict */ - qualname = PyDict_GetItemString(dict, "__qualname__"); - if (qualname == NULL) { - qualname = name; - } - else { - if (PyDict_DelItemString(dict, "__qualname__") < 0) { - 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__"); @@ -2075,10 +2063,8 @@ 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? */ @@ -2088,24 +2074,21 @@ "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++; } @@ -2115,7 +2098,7 @@ "__weakref__ slot disallowed: " "either we already got one, " "or __itemsize__ != 0"); - goto bad_slots; + goto error; } add_weak++; } @@ -2127,7 +2110,7 @@ */ 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 && @@ -2138,7 +2121,7 @@ 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)) { @@ -2146,24 +2129,21 @@ "%R in __slots__ conflicts with class variable", tmp); Py_DECREF(newslots); - goto bad_slots; + 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 && @@ -2191,24 +2171,17 @@ } } - /* 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); - Py_INCREF(qualname); et->ht_name = name; - et->ht_qualname = qualname; et->ht_slots = slots; + slots = NULL; /* Initialize tp_flags */ type->tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HEAPTYPE | @@ -2222,22 +2195,18 @@ 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) { @@ -2247,11 +2216,29 @@ if (tmp != NULL) { if (PyDict_SetItemString(dict, "__module__", tmp) < 0) - return NULL; + goto error; } } } + /* Set ht_qualname to dict['__qualname__'] if available, else to + __name__. The __qualname__ accessor will look for ht_qualname. + */ + qualname = PyDict_GetItemString(dict, "__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; + } + } + else { + qualname = et->ht_name; + } + Py_INCREF(qualname); + et->ht_qualname = qualname; + /* 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__. @@ -2264,17 +2251,13 @@ 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; } @@ -2285,10 +2268,8 @@ tmp = PyDict_GetItemString(dict, "__new__"); if (tmp != NULL && PyFunction_Check(tmp)) { tmp = PyStaticMethod_New(tmp); - if (tmp == NULL) { - Py_DECREF(type); - return NULL; - } + if (tmp == NULL) + goto error; PyDict_SetItemString(dict, "__new__", tmp); Py_DECREF(tmp); } @@ -2296,14 +2277,12 @@ /* 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; @@ -2364,15 +2343,21 @@ 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[] = { -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sat Feb 25 06:51:22 2012 From: python-checkins at python.org (philip.jenvey) Date: Sat, 25 Feb 2012 06:51:22 +0100 Subject: [Python-checkins] =?utf8?q?cpython=3A_unused_imports=2C_pep8?= Message-ID: http://hg.python.org/cpython/rev/8840037a9c53 changeset: 75250:8840037a9c53 user: Philip Jenvey date: Fri Feb 24 21:48:17 2012 -0800 summary: unused imports, pep8 files: Lib/importlib/_bootstrap.py | 14 ++++++++------ Lib/importlib/abc.py | 10 ++++------ 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/Lib/importlib/_bootstrap.py b/Lib/importlib/_bootstrap.py --- a/Lib/importlib/_bootstrap.py +++ b/Lib/importlib/_bootstrap.py @@ -69,7 +69,7 @@ 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) + for x in args if x) def _path_exists(path): @@ -406,14 +406,16 @@ pass else: if _r_long(raw_timestamp) != source_mtime: - raise ImportError("bytecode is stale for {}".format(fullname)) + raise ImportError( + "bytecode is stale for {}".format(fullname)) 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)) + raise ImportError( + "bytecode is stale for {}".format(fullname)) # Can't return the code object as errors from marshal loading need to # propagate even when source is available. return data[12:] @@ -519,7 +521,7 @@ code_object = compile(source_bytes, source_path, 'exec', dont_inherit=True) if (not sys.dont_write_bytecode and bytecode_path is not None and - source_mtime is not None): + 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. @@ -890,7 +892,7 @@ def _resolve_name(name, package, level): """Resolve a relative module name to an absolute one.""" - bits = package.rsplit('.', level-1) + bits = package.rsplit('.', level - 1) if len(bits) < level: raise ValueError('attempted relative import beyond top-level package') base = bits[0] @@ -1010,7 +1012,7 @@ fromlist = list(fromlist) fromlist.remove('*') fromlist.extend(module.__all__) - for x in (y for y in fromlist if not hasattr(module,y)): + for x in (y for y in fromlist if not hasattr(module, y)): try: import_('{0}.{1}'.format(module.__name__, x)) except ImportError: diff --git a/Lib/importlib/abc.py b/Lib/importlib/abc.py --- a/Lib/importlib/abc.py +++ b/Lib/importlib/abc.py @@ -1,15 +1,11 @@ """Abstract base classes related to import.""" from . import _bootstrap from . import machinery -from . import util import abc import imp -import io import marshal -import os.path import sys import tokenize -import types import warnings @@ -256,7 +252,8 @@ try: magic = data[:4] if len(magic) < 4: - raise ImportError("bad magic number in {}".format(fullname)) + raise ImportError( + "bad magic number in {}".format(fullname)) raw_timestamp = data[4:8] if len(raw_timestamp) < 4: raise EOFError("bad timestamp in {}".format(fullname)) @@ -264,7 +261,8 @@ bytecode = data[8:] # 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)) # Verify that the bytecode is not stale (only matters when # there is source to fall back on. if source_timestamp: -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sat Feb 25 09:30:24 2012 From: python-checkins at python.org (nick.coghlan) Date: Sat, 25 Feb 2012 09:30:24 +0100 Subject: [Python-checkins] =?utf8?q?peps=3A_Update_PEP_413_to_better_expla?= =?utf8?q?in_rationale_for_a_separate_version_number_and?= Message-ID: http://hg.python.org/peps/rev/a01c412dec58 changeset: 4074:a01c412dec58 user: Nick Coghlan date: Sat Feb 25 18:30:03 2012 +1000 summary: Update PEP 413 to better explain rationale for a separate version number and note the possibility of actually slowing down the rate of change for the language definition itself files: pep-0413.txt | 262 +++++++++++++++++++++++++++++++++++++- 1 files changed, 250 insertions(+), 12 deletions(-) diff --git a/pep-0413.txt b/pep-0413.txt --- a/pep-0413.txt +++ b/pep-0413.txt @@ -7,7 +7,7 @@ Type: Process Content-Type: text/x-rst Created: 2012-02-24 -Post-History: 2012-02-24 +Post-History: 2012-02-24, 2012-02-25 Resolution: TBD @@ -162,6 +162,177 @@ 3.5.0 + 15.08.0 # Language release +User Scenarios +============== + +The versioning scheme proposed above is based on a number of user scenarios +that are likely to be encountered if this scheme is adopted. In each case, +the scenario is described for both the status quo (i.e. slow release cycle) +the versioning scheme in this PEP and the free wheeling minor version number +scheme proposed in PEP 407. + +To give away the ending, the point of using a separate version number is that +for almost all scenarios, the important number is the *language* version, not +the standard library version. Most users won't even need to care that the +standard library version number exists. In the two identified cases where +it matters, providing it as a separate number is actually clearer and more +explicit than embedding the two different kinds of number into a single +sequence and then tagging some of the numbers in the unified sequence as +special. + + +Novice user, downloading Python from python.org in March 2013 +------------------------------------------------------------- + +*Status quo:* must choose between 3.3 and 2.7 + +*This PEP:* must first choose between 3.3 and 2.7. If choosing 3.3, must then +choose between 3.3 (13.02) or 3.3 (12.08) + +*PEP 407:* must choose between 3.4, 3.3 (LTS) and 2.7. + +Verdict: explaining the meaning of a Long Term Support release is about as +complicated as explaining the meaning of the proposed standard library +version numbers. I call this a tie. + + +Novice user, looking for appropriate binary release +--------------------------------------------------- + +*Status quo:* look for the binary corresponding to the Python version you are +running. + +*This PEP:* same as status quo. + +*PEP 407 (full releases):* same as status quo, but corresponding binary version +is more likely to be missing (or, if it does exist, has to be found amongst +a much larger list of alternatives). + +*PEP 407 (ABI updates limited to LTS releases):* all binary release pages will +need to tell users that Python 3.3, 3.4 and 3.5 all need the 3.3 binary. + +Verdict: I call this a clear win for the scheme in this PEP. Absolutely +nothing changes from the current situation, since the standard library +version is actually irrelevant in this case (only binary extension +compatibility is important). + + +Extension module author, deciding whether or not to make a binary release +------------------------------------------------------------------------- + +*Status quo:* unless using the PEP 384 stable ABI, a new binary release is +needed every time the minor version number changes. + +*This PEP:* same as status quo. + +*PEP 407 (full releases):* same as status quo, but becomes a far more +frequent occurrence. + +*PEP 407 (ABI updates limited to LTS releases):* before deciding, must first +look up whether the new release is an LTS release or an interim release. If +it is an LTS release, then a new build is necessary. + +Verdict: I call this another clear win for the scheme in this PEP. As with +the end user facing side of this problem, the standard library version is +actually irrelevant in this case. Moving that information out to a +separate number avoids creating unnecessary confusion. + + +Python developer, deciding priority of eliminating a Deprecation Warning +------------------------------------------------------------------------ + +*Status quo:* code that triggers deprecation warnings is not guaranteed to +run on a version of Python with a higher minor version number. + +*This PEP:* same as status quo + +*PEP 407:* unclear, as the PEP doesn't currently spell this out. Assuming the +deprecation cycle is linked to LTS releases, then upgrading to a non-LTS +release is safe but upgrading to the next LTS release may require avoiding +the deprecated construct. + +Verdict: another clear win for the scheme in this PEP since, once again, the +standard library version is irrelevant in this scenario. + + +Alternative interpreter implementor, updating with new features +--------------------------------------------------------------- + +*Status quo:* new Python versions arrive infrequently, but are a mish-mash of +standard library updates and core language definition and interpreter +changes. + +*This PEP:* standard library updates, which are easier to integrate, are +made available more frequently in a form that is clearly and explicitly +compatible with the previous version of the language definition. This means +that, once an alternative implementation catches up to Python 3.3, they +should have a much easier time incorporating standard library features as +they happen (especially pure Python changes), leaving minor version number +updates as the only task that requires updates to their core compilation and +execution components. + +*PEP 407 (full releases):* same as status quo, but becomes a far more +frequent occurrence. + +*PEP 407 (language updates limited to LTS releases):* unclear, as the PEP +doesn't currently spell out a specific development strategy. Assuming a +3.3 compatibility branch is adopted (as proposed in this PEP), then the +outcome would be much the same, but the version number signalling would be +slightly less clear (since you would have to look up to see if a particular +release was an LTS release or not). + +Verdict: while not as clear cut as some previous scenarios, I'm still calling +this one in favour of the scheme in this PEP. Explicit is better than +implicit, and the scheme in this PEP makes a clear split between the two +different kinds of update rather than adding a separate "LTS" tag to an +otherwise ordinary release number. Tagging is great for version control +systems, but it's a lousy way to communicate information to other humans. + + +Python developer, deciding their minimum version dependency +----------------------------------------------------------- + +*Status quo:* look for "version added" or "version tagged" markers in the +documentation, check against ``sys.version_info`` + +*This PEP:* look for "version added" or "version tagged" markers in the +documentation. If written as a bare Python version, such as "3.3", check +against ``sys.version_info``. If qualified with a standard library version, +such as "3.3 (13.02)", check against ``sys.stdlib_info``. + +*PEP 407:* same as status quo + +Verdict: the scheme in this PEP actually allows third party libraries to be +more explicit about their rate of adoption of standard library features. More +conservative projects will likely pin their dependency to the language +version and avoid features added in the standard library releases. Faster +moving projects could instead declare their dependency on a particular +standard library version. However, since PEP 407 does have the advantage of +preserving the status quo, I'm calling this one for PEP 407 (albeit with a +slim margin). + + +Python developers, attempting to reproduce a tracker issue +---------------------------------------------------------- + +*Status quo:* if not already provided, ask the reporter which version of +Python they're using. This is often done by asking for the first two lines +displayed by the interactive prompt or the value of ``sys.version``. + +*This PEP:* same as the status quo (as ``sys.version`` will be updated to +also include the standard library version), but may be needed on additional +occasions (where the user knew enough to state their Python version, but that +proved to be insufficient to reproduce the fault). + +*PEP 407:* same as the status quo + +Verdict: another marginal win for PEP 407. The new standard library version +*is* an extra piece of information that users may need to pass back to +developers when reporting issues with Python libraries (or Python itself, +on our own tracker). However, by including it in ``sys.version``, many +fault reports will already include, and it is easy to request if needed. + + Effects ======= @@ -174,6 +345,10 @@ worth of standard library changes, as well as any changes associated with new syntax. +If a release date slips by a month or two, I would keep the planned standard +library version number rather than updating it to reflect the actual release +date. + Effect on workflow ------------------ @@ -191,6 +366,16 @@ should be checked in on ``3.3-compat`` and then merged to ``default``. Otherwise it should be checked in directly to ``default``. +The ``3.3-compat`` branch would be closed after the 3.3+13.08 release, as +the next release at that time will be a full language release. + +The "version added" and "version changed" markers for any changes made on +the ``3.3-compat`` branch would need to be flagged with both the language +version and the standard library version. For example: "3.3 (13.02)". + +Any changes made directly on the ``default`` branch would just be flagged +with "3.4" as usual. + Effect on bugfix cycle ---------------------- @@ -259,7 +444,7 @@ NEWS ---- -Merge conflicts on the NEWS file is already a hassle. Since this PEP +Merge conflicts on the NEWS file are already a hassle. Since this PEP proposes introduction of an additional branch into the normal workflow, resolving this becomes even more critical. While Mercurial phases will help to some degree, it would be good to eliminate the problem entirely. @@ -272,13 +457,8 @@ like:: Misc/ - lang_news/ - 3.3.1/ - - 3.4.0/ - - stdlib_news/ - 12.08.1/ + news_entries/ + 3.3.1/ # Maintenance branch changes builtins/ extensions/ @@ -289,7 +469,9 @@ tests/ - 13.02.0/ + 3.4.0/ # default branch changes + language/ + builtins/ extensions/ @@ -300,14 +482,70 @@ tests/ - NEWS # Now autogenerated from lang_news and stdlib_news + 13.02.0/ # 3.3 compatibility branch changes + builtins/ + + extensions/ + + library/ + + documentation/ + + tests/ + + NEWS # Now autogenerated from news_entries Putting the version information in the directory heirarchy isn't strictly necessary (since the NEWS file generator could figure out from the version -history), but does make it easy for *humans* to keep the different versions +history), but does make it easier for *humans* to keep the different versions in order. +Option: Slowing down the language release cycle +=============================================== + +The current release cycle is a compromise between the desire for stability +in the core language definition and C extension ABI, and the desire to get +new feature (most notably standard library updates) into users hands quickly. + +With the standard library release cycle decoupled (to some degree) from that +of the core language definition, it provides an opportunity to actually +*slow down* the rate of change in the language definition. The language +moratorium for Python 3.2 effectively slowed that cycle down to *more than 3 +years* (3.1: June 2009, 3.3: August 2012) without causing any major +complaints. + +The NEWS file management scheme described above is actually designed to +allow us the flexibility to slow down language releases at the same time +as standard library releases become more frequent. + +As simple example, if a full two years was allowed between 3.3 and 3.4, +the 3.3 release cycle would be up looking like:: + + 3.2.4 # Maintenance release + 3.3.0 + 12.08.0 # Language release + + 3.3.1 + 12.08.1 # Maintenance release + 3.3.1 + 13.02.0 # Standard library release + + 3.3.2 + 12.08.2 # Maintenance release + 3.3.2 + 13.08.1 # Standard library release + + 3.3.3 + 12.08.3 # Maintenance release + 3.3.3 + 14.02.1 # Standard library release + + 3.3.4 + 12.08.4 # Maintenance release + 3.4.0 + 14.08.0 # Language release + +The elegance of the proposed NEWS entry layout is that this decision +wouldn't need to be made until after the 13.08 standard library release. At +that point, the ``3.3-compat`` branch could be kept open (thus adding +another standard library release to the cycle), or else it could be closed, +committing to the next release being a full language release. The choice +between another standard library release or a full language release would +then be available every 6 months after that. + + Why isn't PEP 384 enough? ========================= -- Repository URL: http://hg.python.org/peps From python-checkins at python.org Sat Feb 25 09:42:55 2012 From: python-checkins at python.org (nick.coghlan) Date: Sat, 25 Feb 2012 09:42:55 +0100 Subject: [Python-checkins] =?utf8?q?peps=3A_Formatting_fixes=2C_wording_up?= =?utf8?q?date_on_the_comment_about_tagging_as_a_way_of?= Message-ID: http://hg.python.org/peps/rev/cc186e9b167f changeset: 4075:cc186e9b167f user: Nick Coghlan date: Sat Feb 25 18:42:49 2012 +1000 summary: Formatting fixes, wording update on the comment about tagging as a way of communicating files: pep-0413.txt | 71 ++++++++++++++++++++------------------- 1 files changed, 36 insertions(+), 35 deletions(-) diff --git a/pep-0413.txt b/pep-0413.txt --- a/pep-0413.txt +++ b/pep-0413.txt @@ -184,14 +184,14 @@ Novice user, downloading Python from python.org in March 2013 ------------------------------------------------------------- -*Status quo:* must choose between 3.3 and 2.7 +**Status quo:** must choose between 3.3 and 2.7 -*This PEP:* must first choose between 3.3 and 2.7. If choosing 3.3, must then +**This PEP:** must first choose between 3.3 and 2.7. If choosing 3.3, must then choose between 3.3 (13.02) or 3.3 (12.08) -*PEP 407:* must choose between 3.4, 3.3 (LTS) and 2.7. +**PEP 407:** must choose between 3.4, 3.3 (LTS) and 2.7. -Verdict: explaining the meaning of a Long Term Support release is about as +**Verdict:** explaining the meaning of a Long Term Support release is about as complicated as explaining the meaning of the proposed standard library version numbers. I call this a tie. @@ -199,19 +199,19 @@ Novice user, looking for appropriate binary release --------------------------------------------------- -*Status quo:* look for the binary corresponding to the Python version you are +**Status quo:** look for the binary corresponding to the Python version you are running. -*This PEP:* same as status quo. +**This PEP:** same as status quo. -*PEP 407 (full releases):* same as status quo, but corresponding binary version +**PEP 407 (full releases):** same as status quo, but corresponding binary version is more likely to be missing (or, if it does exist, has to be found amongst a much larger list of alternatives). -*PEP 407 (ABI updates limited to LTS releases):* all binary release pages will +**PEP 407 (ABI updates limited to LTS releases):** all binary release pages will need to tell users that Python 3.3, 3.4 and 3.5 all need the 3.3 binary. -Verdict: I call this a clear win for the scheme in this PEP. Absolutely +**Verdict:** I call this a clear win for the scheme in this PEP. Absolutely nothing changes from the current situation, since the standard library version is actually irrelevant in this case (only binary extension compatibility is important). @@ -220,19 +220,19 @@ Extension module author, deciding whether or not to make a binary release ------------------------------------------------------------------------- -*Status quo:* unless using the PEP 384 stable ABI, a new binary release is +**Status quo:** unless using the PEP 384 stable ABI, a new binary release is needed every time the minor version number changes. -*This PEP:* same as status quo. +**This PEP:** same as status quo. -*PEP 407 (full releases):* same as status quo, but becomes a far more +**PEP 407 (full releases):** same as status quo, but becomes a far more frequent occurrence. -*PEP 407 (ABI updates limited to LTS releases):* before deciding, must first +**PEP 407 (ABI updates limited to LTS releases):** before deciding, must first look up whether the new release is an LTS release or an interim release. If it is an LTS release, then a new build is necessary. -Verdict: I call this another clear win for the scheme in this PEP. As with +**Verdict:** I call this another clear win for the scheme in this PEP. As with the end user facing side of this problem, the standard library version is actually irrelevant in this case. Moving that information out to a separate number avoids creating unnecessary confusion. @@ -241,28 +241,28 @@ Python developer, deciding priority of eliminating a Deprecation Warning ------------------------------------------------------------------------ -*Status quo:* code that triggers deprecation warnings is not guaranteed to +**Status quo:** code that triggers deprecation warnings is not guaranteed to run on a version of Python with a higher minor version number. -*This PEP:* same as status quo +**This PEP:** same as status quo -*PEP 407:* unclear, as the PEP doesn't currently spell this out. Assuming the +**PEP 407:** unclear, as the PEP doesn't currently spell this out. Assuming the deprecation cycle is linked to LTS releases, then upgrading to a non-LTS release is safe but upgrading to the next LTS release may require avoiding the deprecated construct. -Verdict: another clear win for the scheme in this PEP since, once again, the +**Verdict:** another clear win for the scheme in this PEP since, once again, the standard library version is irrelevant in this scenario. Alternative interpreter implementor, updating with new features --------------------------------------------------------------- -*Status quo:* new Python versions arrive infrequently, but are a mish-mash of +**Status quo:** new Python versions arrive infrequently, but are a mish-mash of standard library updates and core language definition and interpreter changes. -*This PEP:* standard library updates, which are easier to integrate, are +**This PEP:** standard library updates, which are easier to integrate, are made available more frequently in a form that is clearly and explicitly compatible with the previous version of the language definition. This means that, once an alternative implementation catches up to Python 3.3, they @@ -271,38 +271,39 @@ updates as the only task that requires updates to their core compilation and execution components. -*PEP 407 (full releases):* same as status quo, but becomes a far more +**PEP 407 (full releases):** same as status quo, but becomes a far more frequent occurrence. -*PEP 407 (language updates limited to LTS releases):* unclear, as the PEP +**PEP 407 (language updates limited to LTS releases):** unclear, as the PEP doesn't currently spell out a specific development strategy. Assuming a 3.3 compatibility branch is adopted (as proposed in this PEP), then the outcome would be much the same, but the version number signalling would be slightly less clear (since you would have to look up to see if a particular release was an LTS release or not). -Verdict: while not as clear cut as some previous scenarios, I'm still calling -this one in favour of the scheme in this PEP. Explicit is better than +**Verdict:** while not as clear cut as some previous scenarios, I'm still +calling this one in favour of the scheme in this PEP. Explicit is better than implicit, and the scheme in this PEP makes a clear split between the two different kinds of update rather than adding a separate "LTS" tag to an -otherwise ordinary release number. Tagging is great for version control -systems, but it's a lousy way to communicate information to other humans. - +otherwise ordinary release number. Tagging a particular version as being +special is great for communicating with version control systems and associated +automated tools, but it's a lousy way to communicate information to other +humans. Python developer, deciding their minimum version dependency ----------------------------------------------------------- -*Status quo:* look for "version added" or "version tagged" markers in the +**Status quo:** look for "version added" or "version tagged" markers in the documentation, check against ``sys.version_info`` -*This PEP:* look for "version added" or "version tagged" markers in the +**This PEP:** look for "version added" or "version tagged" markers in the documentation. If written as a bare Python version, such as "3.3", check against ``sys.version_info``. If qualified with a standard library version, such as "3.3 (13.02)", check against ``sys.stdlib_info``. -*PEP 407:* same as status quo +**PEP 407:** same as status quo -Verdict: the scheme in this PEP actually allows third party libraries to be +**Verdict:** the scheme in this PEP actually allows third party libraries to be more explicit about their rate of adoption of standard library features. More conservative projects will likely pin their dependency to the language version and avoid features added in the standard library releases. Faster @@ -315,18 +316,18 @@ Python developers, attempting to reproduce a tracker issue ---------------------------------------------------------- -*Status quo:* if not already provided, ask the reporter which version of +**Status quo:** if not already provided, ask the reporter which version of Python they're using. This is often done by asking for the first two lines displayed by the interactive prompt or the value of ``sys.version``. -*This PEP:* same as the status quo (as ``sys.version`` will be updated to +**This PEP:** same as the status quo (as ``sys.version`` will be updated to also include the standard library version), but may be needed on additional occasions (where the user knew enough to state their Python version, but that proved to be insufficient to reproduce the fault). -*PEP 407:* same as the status quo +**PEP 407:** same as the status quo -Verdict: another marginal win for PEP 407. The new standard library version +**Verdict:** another marginal win for PEP 407. The new standard library version *is* an extra piece of information that users may need to pass back to developers when reporting issues with Python libraries (or Python itself, on our own tracker). However, by including it in ``sys.version``, many -- Repository URL: http://hg.python.org/peps From python-checkins at python.org Sat Feb 25 09:52:45 2012 From: python-checkins at python.org (nick.coghlan) Date: Sat, 25 Feb 2012 09:52:45 +0100 Subject: [Python-checkins] =?utf8?q?peps=3A_Present_both_alternatives_as_f?= =?utf8?q?lat_lists?= Message-ID: http://hg.python.org/peps/rev/666f63844229 changeset: 4076:666f63844229 user: Nick Coghlan date: Sat Feb 25 18:52:38 2012 +1000 summary: Present both alternatives as flat lists files: pep-0413.txt | 3 +-- 1 files changed, 1 insertions(+), 2 deletions(-) diff --git a/pep-0413.txt b/pep-0413.txt --- a/pep-0413.txt +++ b/pep-0413.txt @@ -186,8 +186,7 @@ **Status quo:** must choose between 3.3 and 2.7 -**This PEP:** must first choose between 3.3 and 2.7. If choosing 3.3, must then -choose between 3.3 (13.02) or 3.3 (12.08) +**This PEP:** must first choose between 3.3 (13.02), 3.3 (12.08) and 2.7. **PEP 407:** must choose between 3.4, 3.3 (LTS) and 2.7. -- Repository URL: http://hg.python.org/peps From python-checkins at python.org Sat Feb 25 09:55:06 2012 From: python-checkins at python.org (nick.coghlan) Date: Sat, 25 Feb 2012 09:55:06 +0100 Subject: [Python-checkins] =?utf8?q?peps=3A_Clarify_heading?= Message-ID: http://hg.python.org/peps/rev/224cf2f49296 changeset: 4077:224cf2f49296 user: Nick Coghlan date: Sat Feb 25 18:53:22 2012 +1000 summary: Clarify heading files: pep-0413.txt | 3 ++- 1 files changed, 2 insertions(+), 1 deletions(-) diff --git a/pep-0413.txt b/pep-0413.txt --- a/pep-0413.txt +++ b/pep-0413.txt @@ -195,8 +195,8 @@ version numbers. I call this a tie. -Novice user, looking for appropriate binary release ---------------------------------------------------- +Novice user, looking for an extension module binary release +----------------------------------------------------------- **Status quo:** look for the binary corresponding to the Python version you are running. -- Repository URL: http://hg.python.org/peps From python-checkins at python.org Sat Feb 25 09:56:19 2012 From: python-checkins at python.org (nick.coghlan) Date: Sat, 25 Feb 2012 09:56:19 +0100 Subject: [Python-checkins] =?utf8?q?peps=3A_Fix__lack_of_communication_bet?= =?utf8?q?ween_brain_and_fingers?= Message-ID: http://hg.python.org/peps/rev/a0a65a5df76e changeset: 4078:a0a65a5df76e user: Nick Coghlan date: Sat Feb 25 18:56:13 2012 +1000 summary: Fix lack of communication between brain and fingers files: pep-0413.txt | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) diff --git a/pep-0413.txt b/pep-0413.txt --- a/pep-0413.txt +++ b/pep-0413.txt @@ -292,10 +292,10 @@ Python developer, deciding their minimum version dependency ----------------------------------------------------------- -**Status quo:** look for "version added" or "version tagged" markers in the +**Status quo:** look for "version added" or "version changed" markers in the documentation, check against ``sys.version_info`` -**This PEP:** look for "version added" or "version tagged" markers in the +**This PEP:** look for "version added" or "version changed" markers in the documentation. If written as a bare Python version, such as "3.3", check against ``sys.version_info``. If qualified with a standard library version, such as "3.3 (13.02)", check against ``sys.stdlib_info``. -- Repository URL: http://hg.python.org/peps From python-checkins at python.org Sat Feb 25 10:06:41 2012 From: python-checkins at python.org (nick.coghlan) Date: Sat, 25 Feb 2012 10:06:41 +0100 Subject: [Python-checkins] =?utf8?q?peps=3A_Add_another_scenario_that_was_?= =?utf8?q?previously_only_mentioned_in_the_=27effects_on_the?= Message-ID: http://hg.python.org/peps/rev/716b96587821 changeset: 4079:716b96587821 user: Nick Coghlan date: Sat Feb 25 19:06:36 2012 +1000 summary: Add another scenario that was previously only mentioned in the 'effects on the community' section files: pep-0413.txt | 19 +++++++++++++++++++ 1 files changed, 19 insertions(+), 0 deletions(-) diff --git a/pep-0413.txt b/pep-0413.txt --- a/pep-0413.txt +++ b/pep-0413.txt @@ -195,6 +195,25 @@ version numbers. I call this a tie. +Novice user, attempting to judge currency of third party documentation +---------------------------------------------------------------------- + +**Status quo:** minor version differences indicate 18-24 months of +language evolution + +**This PEP:** same as status quo for language core, or just compare the +standard library version numbers to get a rough time in months. + +**PEP 407:** minor version differences indicate 18-24 months of language +evolution up to 3.3, then 6 months of language evolution thereafter. + +**Verdict:** date based numbering schemes with regular release cycles are +a *much* better way to give novices a rough handle on the currency of +information. Since keeping the minor version implications the same is a gain +for *current* Python users, I'm calling this a win twice over for the schemes +in this PEP. + + Novice user, looking for an extension module binary release ----------------------------------------------------------- -- Repository URL: http://hg.python.org/peps From python-checkins at python.org Sat Feb 25 10:38:17 2012 From: python-checkins at python.org (martin.v.loewis) Date: Sat, 25 Feb 2012 10:38:17 +0100 Subject: [Python-checkins] =?utf8?b?Y3B5dGhvbiAoMi43KTogQWRkIDIuNy4zIGFu?= =?utf8?q?d_2=2E7=2E4_UUIDs?= Message-ID: http://hg.python.org/cpython/rev/4dd71a933f20 changeset: 75251:4dd71a933f20 branch: 2.7 parent: 75226:dd4f5c87d6bb user: Martin v. L?wis date: Sat Feb 25 10:37:41 2012 +0100 summary: Add 2.7.3 and 2.7.4 UUIDs files: Tools/msi/uuids.py | 4 ++++ 1 files changed, 4 insertions(+), 0 deletions(-) diff --git a/Tools/msi/uuids.py b/Tools/msi/uuids.py --- a/Tools/msi/uuids.py +++ b/Tools/msi/uuids.py @@ -55,4 +55,8 @@ '2.7.1150':'{32939827-d8e5-470a-b126-870db3c69fdf}', # 2.7.1 '2.7.2121':'{B2E1F06E-F719-4786-972A-488A336EB2A0}', # 2.7.2rc1 '2.7.2150':'{2E295B5B-1AD4-4d36-97C2-A316084722CF}', # 2.7.2 + '2.7.3121':'{1ACB88BF-1425-4f11-B664-6C89A3D7699C}', # 2.7.3rc1 + '2.7.3150':'{C0C31BCC-56FB-42a7-8766-D29E1BD74C7C}', # 2.7.3 + '2.7.4121':'{47F45F45-72D7-4e54-AF41-26767EDE95CF}', # 2.7.4rc1 + '2.7.4150':'{84ADC96C-B7E0-4938-9D6E-2B640D5DA224}', # 2.7.4 } -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sat Feb 25 10:48:14 2012 From: python-checkins at python.org (martin.v.loewis) Date: Sat, 25 Feb 2012 10:48:14 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=283=2E2=29=3A_Package_mime=2E?= =?utf8?q?types?= Message-ID: http://hg.python.org/cpython/rev/5e517dd84cec changeset: 75252:5e517dd84cec branch: 3.2 parent: 75244:a51da0faf39f user: Martin v. L?wis date: Sat Feb 25 10:40:13 2012 +0100 summary: Package mime.types files: Tools/msi/msi.py | 1 + 1 files changed, 1 insertions(+), 0 deletions(-) diff --git a/Tools/msi/msi.py b/Tools/msi/msi.py --- a/Tools/msi/msi.py +++ b/Tools/msi/msi.py @@ -1021,6 +1021,7 @@ lib.add_file("check_soundcard.vbs") lib.add_file("empty.vbs") lib.add_file("Sine-1000Hz-300ms.aif") + lib.add_file("mime.types") lib.glob("*.uue") lib.glob("*.pem") lib.glob("*.pck") -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sat Feb 25 10:48:15 2012 From: python-checkins at python.org (martin.v.loewis) Date: Sat, 25 Feb 2012 10:48:15 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_3=2E2_-=3E_default=29?= =?utf8?q?=3A_Merge_with_3=2E2?= Message-ID: http://hg.python.org/cpython/rev/24ca28cc9c9c changeset: 75253:24ca28cc9c9c parent: 75250:8840037a9c53 parent: 75252:5e517dd84cec user: Martin v. L?wis date: Sat Feb 25 10:47:30 2012 +0100 summary: Merge with 3.2 files: -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sat Feb 25 12:25:28 2012 From: python-checkins at python.org (stefan.krah) Date: Sat, 25 Feb 2012 12:25:28 +0100 Subject: [Python-checkins] =?utf8?q?cpython=3A_-_Issue_=2310181=3A_New_mem?= =?utf8?q?oryview_implementation_fixes_multiple_ownership?= Message-ID: http://hg.python.org/cpython/rev/3f9b3b6f7ff0 changeset: 75254:3f9b3b6f7ff0 user: Stefan Krah date: Sat Feb 25 12:24:21 2012 +0100 summary: - 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. Thanks to Nick Coghlan, Antoine Pitrou and Pauli Virtanen for review and many ideas. - Issue #12834: Fix incorrect results of memoryview.tobytes() for non-contiguous arrays. - Issue #5231: Introduce memoryview.cast() method that allows changing format and shape without making a copy of the underlying memory. files: Doc/c-api/buffer.rst | 521 +- Doc/c-api/memoryview.rst | 29 +- Doc/c-api/typeobj.rst | 94 +- Doc/library/stdtypes.rst | 306 +- Doc/whatsnew/3.3.rst | 56 + Include/abstract.h | 2 +- Include/memoryobject.h | 84 +- Include/object.h | 7 +- Lib/ctypes/test/test_pep3118.py | 76 +- Lib/test/test_buffer.py | 3437 +++++++++++++++++++ Lib/test/test_memoryview.py | 50 +- Lib/test/test_sys.py | 4 +- Misc/ACKS | 1 + Misc/NEWS | 17 + Misc/valgrind-python.supp | 11 + Modules/_testbuffer.c | 2683 ++++++++++++++ Modules/_testcapimodule.c | 91 - Objects/abstract.c | 14 +- Objects/memoryobject.c | 3173 +++++++++++++--- Objects/object.c | 3 + PCbuild/_testbuffer.vcproj | 521 ++ PCbuild/pcbuild.sln | 21 + PCbuild/readme.txt | 3 + setup.py | 2 + 24 files changed, 10023 insertions(+), 1183 deletions(-) diff --git a/Doc/c-api/buffer.rst b/Doc/c-api/buffer.rst --- a/Doc/c-api/buffer.rst +++ b/Doc/c-api/buffer.rst @@ -7,6 +7,7 @@ .. sectionauthor:: Greg Stein .. sectionauthor:: Benjamin Peterson +.. sectionauthor:: Stefan Krah .. index:: @@ -20,7 +21,7 @@ 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 @@ 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 @@ -81,93 +84,330 @@ .. c:type:: Py_buffer - .. c:member:: void *buf + .. c:member:: void \*obj - A pointer to the start of the memory for the object. + A new reference to the exporting object or *NULL*. The reference is owned + by the consumer and automatically decremented and set to *NULL* by + :c:func:`PyBuffer_Release`. + + For temporary buffers that are wrapped by :c:func:`PyMemoryView_FromBuffer` + this field must be *NULL*. + + .. 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:: const char *format - :noindex: + .. c:member:: Py_ssize_t itemsize - 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. + 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 + + 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*. + 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*. - .. c:member:: Py_ssize_t *shape + 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. - 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 \*shape - .. c:member:: Py_ssize_t *strides + 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`. - 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. + Shape values are restricted to ``shape[n] >= 0``. The case + ``shape[n] == 0`` requires special attention. See `complex arrays`_ + for further information. - .. c:member:: Py_ssize_t *suboffsets + The shape array is read-only for the consumer. - 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). + .. c:member:: Py_ssize_t \*strides - 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:: + 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. - 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; - } + 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 itemsize + .. c:member:: Py_ssize_t \*suboffsets - 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. + 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). - .. c:member:: void *internal + 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. + + 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 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. + +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`. + + +readonly, format +~~~~~~~~~~~~~~~~ + + .. c:macro:: PyBUF_WRITABLE + + 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. + + .. c:macro:: PyBUF_FORMAT + + Controls the :c:member:`~Py_buffer.format` field. If set, this field MUST + be filled in correctly. Otherwise, this field MUST be *NULL*. + + +: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. + +: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). + + +shape, strides, suboffsets +~~~~~~~~~~~~~~~~~~~~~~~~~~ + +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. + + ++-----------------------------+-------+---------+------------+ +| 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 | ++-----------------------------+-------+---------+------------+ + + +contiguity requests +~~~~~~~~~~~~~~~~~~~ + +C or Fortran contiguity can be explicitly requested, with and without stride +information. Without stride information, the buffer must be C-contiguous. + ++-----------------------------------+-------+---------+------------+--------+ +| 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 | ++-----------------------------------+-------+---------+------------+--------+ + + +compound requests +~~~~~~~~~~~~~~~~~ + +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. + +In the following table *U* stands for undefined contiguity. The consumer would +have to call :c:func:`PyBuffer_IsContiguous` to determine contiguity. + + + ++-------------------------------+-------+---------+------------+--------+----------+--------+ +| 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 | ++-------------------------------+-------+---------+------------+--------+----------+--------+ + + +Complex arrays +============== + +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; + } + Buffer-related functions ======================== - .. c:function:: int PyObject_CheckBuffer(PyObject *obj) Return 1 if *obj* supports the buffer interface otherwise 0. When 1 is @@ -175,152 +415,69 @@ succeed. -.. c:function:: int PyObject_GetBuffer(PyObject *obj, Py_buffer *view, int flags) +.. c:function:: int PyObject_GetBuffer(PyObject *exporter, Py_buffer *view, int flags) - 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). + 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. - 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. + On success, fill in *view*, set :c:member:`view->obj` to a new reference + to *exporter* and return 0. - 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. - - The following are the possible values to the *flags* arguments. - - .. c:macro:: PyBUF_SIMPLE - - 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_WRITABLE - - Like :c:macro:`PyBUF_SIMPLE`, but the returned buffer is writable. If - the exporter doesn't support writable buffers, an error is raised. - - .. c:macro:: PyBUF_STRIDES - - 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 - - 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 - - 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:macro:: PyBUF_INDIRECT - - 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 - - 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). - - .. c:macro:: PyBUF_STRIDED - - This is equivalent to ``(PyBUF_STRIDES | PyBUF_WRITABLE)``. - - .. c:macro:: PyBUF_STRIDED_RO - - This is equivalent to ``(PyBUF_STRIDES)``. - - .. c:macro:: PyBUF_RECORDS - - This is equivalent to ``(PyBUF_STRIDES | PyBUF_FORMAT | - PyBUF_WRITABLE)``. - - .. c:macro:: PyBUF_RECORDS_RO - - This is equivalent to ``(PyBUF_STRIDES | PyBUF_FORMAT)``. - - .. c:macro:: PyBUF_FULL - - This is equivalent to ``(PyBUF_INDIRECT | PyBUF_FORMAT | - PyBUF_WRITABLE)``. - - .. c:macro:: PyBUF_FULL_RO - - This is equivalent to ``(PyBUF_INDIRECT | PyBUF_FORMAT)``. - - .. c:macro:: PyBUF_CONTIG - - This is equivalent to ``(PyBUF_ND | PyBUF_WRITABLE)``. - - .. c:macro:: PyBUF_CONTIG_RO - - 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) - 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. + 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 `, + *exporter* MUST be set to the exporting object. Otherwise, *exporter* MUST + be NULL. + + + diff --git a/Doc/c-api/memoryview.rst b/Doc/c-api/memoryview.rst --- a/Doc/c-api/memoryview.rst +++ b/Doc/c-api/memoryview.rst @@ -17,16 +17,19 @@ 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`. .. 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 +46,16 @@ 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 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 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 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/typeobj.rst b/Doc/c-api/typeobj.rst --- a/Doc/c-api/typeobj.rst +++ b/Doc/c-api/typeobj.rst @@ -1198,46 +1198,74 @@ .. sectionauthor:: Greg J. Stein .. sectionauthor:: Benjamin Peterson - - -The :ref:`buffer interface ` exports a model where an object can expose its internal -data. - -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. - +.. sectionauthor:: Stefan Krah .. c:type:: PyBufferProcs - Structure used to hold the function pointers which define an implementation of - the buffer protocol. + This structure holds pointers to the functions required by the + :ref:`Buffer protocol `. The protocol defines how + an exporter object can expose its internal data to consumer objects. - .. c:member:: getbufferproc bf_getbuffer +.. c:member:: getbufferproc PyBufferProcs.bf_getbuffer - 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. + The signature of this function is:: + int (PyObject *exporter, Py_buffer *view, int flags); - .. c:member:: releasebufferproc bf_releasebuffer + Handle a request to *exporter* to fill in *view* as specified by *flags*. + A standard implementation of this function will take these steps: - 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. + - Check if the request can be met. If not, raise :c:data:`PyExc_BufferError`, + set :c:data:`view->obj` to *NULL* and return -1. - 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. + - Fill in the requested fields. - See :c:func:`PyBuffer_Release`. + - Increment an internal counter for the number of exports. + + - Set :c:data:`view->obj` to *exporter* and increment :c:data:`view->obj`. + + - Return 0. + + The individual fields of *view* are described in section + :ref:`Buffer structure `, the rules how an exporter + must react to specific requests are in section + :ref:`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.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); + + Handle a request to release the resources of the buffer. If no resources + need to be released, this field may be *NULL*. A standard implementation + of this function will take these steps: + + - Decrement an internal counter for the number of exports. + + - 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 (if present). This field is guaranteed + to remain constant, while a consumer MAY pass a copy of the original buffer + as the *view* argument. + + + This function MUST NOT decrement :c:data:`view->obj`, since that is + done automatically in :c:func:`PyBuffer_Release`. + + + :c:func:`PyBuffer_Release` is the interface for the consumer that + wraps this function. diff --git a/Doc/library/stdtypes.rst b/Doc/library/stdtypes.rst --- a/Doc/library/stdtypes.rst +++ b/Doc/library/stdtypes.rst @@ -2377,7 +2377,7 @@ :class:`memoryview` objects allow Python code to access the internal data of an object that supports the :ref:`buffer protocol ` without -copying. Memory is generally interpreted as simple bytes. +copying. .. class:: memoryview(obj) @@ -2391,52 +2391,88 @@ 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 + ``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. 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] - - >>> bytes(v[1:4]) - b'bce' - - If the object the memoryview is over supports changing its data, the - memoryview supports slice assignment:: + 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] + + >>> 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] = b'z' + >>> v[0] = ord(b'z') >>> data bytearray(b'zbcefg') >>> v[1:4] = b'123' >>> data bytearray(b'z123fg') - >>> v[2] = b'spam' + >>> v[2:3] = b'spam' Traceback (most recent call last): - File "", line 1, in - ValueError: cannot modify size of memoryview object - - Notice how the size of the memoryview object cannot be changed. - - Memoryviews of hashable (read-only) types are also hashable and their - hash value matches the corresponding bytes object:: + File "", line 1, in + ValueError: memoryview assignment: lvalue and rvalue have different structures + >>> v[2:6] = b'spam' + >>> data + bytearray(b'z1spam') + + Memoryviews of hashable (read-only) types 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 + + Hashing of multi-dimensional objects is supported:: + + >>> buf = bytes(list(range(12))) + >>> x = memoryview(buf) + >>> y = x.cast('B', shape=[2,2,3]) + >>> x.tolist() + [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11] + >>> y.tolist() + [[[0, 1, 2], [3, 4, 5]], [[6, 7, 8], [9, 10, 11]]] + >>> hash(x) == hash(y) == hash(y.tobytes()) + True .. versionchanged:: 3.3 Memoryview objects are now hashable. @@ -2455,12 +2491,20 @@ >>> bytes(m) b'abc' + For non-contiguous arrays the result is equal to the flattened list + representation with all elements converted to bytes. + .. method:: tolist() - Return the data in the buffer as a list of integers. :: + 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] .. method:: release() @@ -2487,7 +2531,7 @@ >>> with memoryview(b'abc') as m: ... m[0] ... - b'a' + 97 >>> m[0] Traceback (most recent call last): File "", line 1, in @@ -2495,45 +2539,219 @@ .. 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. 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 "", line 1, in + 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. This defaults to ``'B'``, a simple bytestring. + 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. Special care must be taken + when comparing memoryviews. Since comparisons are required to return a + value for ``==`` and ``!=``, two memoryviews referencing the same + exporter can compare as not-equal if the exporter's format is not + understood:: + + >>> 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 == b + False + >>> a.tolist() + Traceback (most recent call last): + File "", line 1, in + NotImplementedError: memoryview: unsupported format T{>l:x:>l:y:} .. attribute:: itemsize The size in bytes of each element of the memoryview:: - >>> m = memoryview(array.array('H', [1,2,3])) + >>> import array, struct + >>> m = memoryview(array.array('H', [32000, 32001, 32002])) >>> m.itemsize 2 >>> m[0] - b'\x01\x00' - >>> len(m[0]) == m.itemsize + 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 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 + .. 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 .. _typecontextmanager: diff --git a/Doc/whatsnew/3.3.rst b/Doc/whatsnew/3.3.rst --- a/Doc/whatsnew/3.3.rst +++ b/Doc/whatsnew/3.3.rst @@ -49,6 +49,62 @@ This article explains the new features in Python 3.3, compared to 3.2. +.. _pep-3118: + +PEP 3118: New memoryview implementation and buffer protocol documentation +========================================================================= + +:issue:`10181` - memoryview bug fixes and features. + Written by Stefan Krah. + +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. + +* All array types are hashable if the exporting object is hashable + and the view is read-only. + +* 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. + + .. _pep-393: PEP 393: Flexible String Representation diff --git a/Include/abstract.h b/Include/abstract.h --- a/Include/abstract.h +++ b/Include/abstract.h @@ -559,7 +559,7 @@ /* 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, diff --git a/Include/memoryobject.h b/Include/memoryobject.h --- a/Include/memoryobject.h +++ b/Include/memoryobject.h @@ -6,70 +6,64 @@ 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; - Py_hash_t hash; + 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 */ + Py_ssize_t ob_array[1]; /* shape, strides, suboffsets */ } PyMemoryViewObject; #endif diff --git a/Include/object.h b/Include/object.h --- a/Include/object.h +++ b/Include/object.h @@ -186,15 +186,16 @@ 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 */ diff --git a/Lib/ctypes/test/test_pep3118.py b/Lib/ctypes/test/test_pep3118.py --- a/Lib/ctypes/test/test_pep3118.py +++ b/Lib/ctypes/test/test_pep3118.py @@ -25,14 +25,17 @@ 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 @@ 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 @@ ## simple types - (c_char, "l:x:>l:y:}", None, BEPoint), - (LEPoint, "T{l:x:>l:y:}", None, POINTER(BEPoint)), - (POINTER(LEPoint), "&T{l:x:>l:y:}", (), BEPoint), + (LEPoint, "T{l:x:>l:y:}", (), POINTER(BEPoint)), + (POINTER(LEPoint), "&T{':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<= 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 + + + at unittest.skipUnless(struct, 'struct module required for this test.') + at unittest.skipUnless(ndarray, 'ndarray object required for this test') +class TestBufferProtocol(unittest.TestCase): + + def setUp(self): + self.sizeof_void_p = get_config_var('SIZEOF_VOID_P') + if not self.sizeof_void_p: + self.sizeof_void_p = 8 if architecture()[0] == '64bit' else 4 + + 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) + + if not buf_err and is_memoryview_format(fmt): + + # 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) + contig = get_contiguous(result, PyBUF_READ, order) + self.assertEqual(contig.tobytes(), b) + self.assertTrue(cmp_contig(contig, expected)) + + 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') + + # 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_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, "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(" 1: 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) + + # 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) + + # different format + 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.assertNotEqual(v, nd2) + self.assertNotEqual(w, nd1) + self.assertNotEqual(v, w) + + ##### ndim > 1: 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) + + # 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) + + # different format + 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.assertNotEqual(v, nd2) + self.assertNotEqual(w, nd1) + self.assertNotEqual(v, w) + + ##### ndim > 1: 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) + + ##### ndim > 1: non-contiguous + # different values + 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) + + # 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 format + ex1 = ndarray(list(range(30)), shape=[5, 3, 2], format='i') + nd1 = ex1[1:3:, ::-2] + nd2 = ndarray(list(range(30)), shape=[5, 3, 2], format='@I') + 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) + + ##### ndim > 1: 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) + + # ndim > 1: 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()) + + ##### ndim > 1: 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) + + # 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) + + # different format + ex1 = ndarray(list(range(30)), shape=[5, 3, 2], format='i', flags=ND_PIL) + nd1 = ex1[1:3:, ::-2] + nd2 = 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.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) + + 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(). + + nd = ndarray([-529, 576, -625, 676, -729], shape=[5], format='@h') + + m = memoryview(nd) + self.assertEqual(m.tobytes(), nd.tobytes()) + + 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)) + + # non-byte formats + nd = ndarray(list(range(12)), shape=[2,2,3], format='L') + m = memoryview(nd) + self.assertEqual(hash(m), hash(nd.tobytes())) + + nd = ndarray(list(range(-6, 6)), shape=[2,2,3], format='h') + m = memoryview(nd) + self.assertEqual(hash(m), hash(nd.tobytes())) + + 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() + + # 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() + + # 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')) + + # XXX If m1 has exports, raise BufferError. + # x = bytearray(b'123') + # with memoryview(x) as m1: + # ex = ndarray(m1) + # m1[0] == ord(b'1') + + 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_memoryview.py b/Lib/test/test_memoryview.py --- a/Lib/test/test_memoryview.py +++ b/Lib/test/test_memoryview.py @@ -24,15 +24,14 @@ 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 +75,9 @@ 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 +103,17 @@ # 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 +183,7 @@ 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 +217,16 @@ # 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 +238,17 @@ 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,9 +306,12 @@ 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 the corresponding object. + # hash as hash(obj.tobytes()). tp = self.ro_type if tp is None: self.skipTest("no read-only type to test") diff --git a/Lib/test/test_sys.py b/Lib/test/test_sys.py --- a/Lib/test/test_sys.py +++ b/Lib/test/test_sys.py @@ -773,8 +773,8 @@ check(int(PyLong_BASE), size(vh) + 2*self.longdigit) check(int(PyLong_BASE**2-1), size(vh) + 2*self.longdigit) check(int(PyLong_BASE**2), size(vh) + 3*self.longdigit) - # memory (Py_buffer + hash value) - check(memoryview(b''), size(h + 'PP2P2i7P' + 'P')) + # memoryview + check(memoryview(b''), size(h + 'PPiP4P2i5P3cP')) # module check(unittest, size(h + '3P')) # None diff --git a/Misc/ACKS b/Misc/ACKS --- a/Misc/ACKS +++ b/Misc/ACKS @@ -1041,6 +1041,7 @@ Kannan Vijayan Kurt Vile Norman Vine +Pauli Virtanen Frank Visser Johannes Vogel Sjoerd de Vries diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -10,6 +10,23 @@ Core and Builtins ----------------- +- 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. + + Thanks to Nick Coghlan, Antoine Pitrou and Pauli Virtanen for review + and many ideas. + +- Issue #12834: Fix incorrect results of memoryview.tobytes() for + non-contiguous arrays. + +- Issue #5231: Introduce memoryview.cast() method that allows changing + format and shape without making a copy of the underlying memory. + - Issue #14084: Fix a file descriptor leak when importing a module with a bad encoding. diff --git a/Misc/valgrind-python.supp b/Misc/valgrind-python.supp --- a/Misc/valgrind-python.supp +++ b/Misc/valgrind-python.supp @@ -412,4 +412,15 @@ fun:SHA1_Update } +{ + test_buffer_non_debug + Memcheck:Addr4 + fun:PyUnicodeUCS2_FSConverter +} +{ + test_buffer_non_debug + Memcheck:Addr4 + fun:PyUnicode_FSConverter +} + diff --git a/Modules/_testbuffer.c b/Modules/_testbuffer.c new file mode 100644 --- /dev/null +++ b/Modules/_testbuffer.c @@ -0,0 +1,2683 @@ +/* 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) + + +/**************************************************************************/ +/* 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) + +/* 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_GETBUF_FAIL 0x020 /* test issue 7385 */ + +/* Default: NumPy style (strides), read-only, no var-export, C-style layout */ +#define ND_DEFAULT 0x0 + +/* Internal flags for the base buffer */ +#define ND_C 0x040 /* C contiguous layout (default) */ +#define ND_OWN_ARRAYS 0x080 /* consumer owns arrays */ +#define ND_UNUSED 0x100 /* initializer */ + +/* 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; iformat == NULL && src->format == NULL) || \ + (strcmp(dest->format, src->format) == 0)); + + if (!same_fmt || + 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_UNUSED; /* 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_UNUSED) { + PyErr_SetString(PyExc_TypeError, + "construction from exporter object only takes a single " + "additional getbuf argument"); + return -1; + } + + getbuf = (getbuf == PyBUF_UNUSED) ? PyBUF_FULL_RO : getbuf; + + if (ndarray_init_staticbuf(v, nd, getbuf) < 0) + return -1; + + init_flags(nd->head); + + 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_UNUSED) + flags = ND_DEFAULT; + 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_UNUSED; /* 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; + + /* 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"); + 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 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); + 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; + } + + ord = get_ascii_order(order); + if (ord == CHAR_MAX) { + return NULL; + } + + return PyMemoryView_GetContiguous(obj, (int)type, ord); +} + +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 */ +}; + + +static struct PyMethodDef _testbuffer_functions[] = { + {"slice_indices", slice_indices, METH_VARARGS, NULL}, + {"get_pointer", get_pointer, METH_VARARGS, NULL}, + {"get_contiguous", get_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); + + 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, "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 --- a/Modules/_testcapimodule.c +++ b/Modules/_testcapimodule.c @@ -275,95 +275,6 @@ } -/* 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(). @@ -2421,7 +2332,6 @@ {"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}, @@ -2684,7 +2594,6 @@ 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/Objects/abstract.c b/Objects/abstract.c --- a/Objects/abstract.c +++ b/Objects/abstract.c @@ -340,7 +340,7 @@ } static int -_IsFortranContiguous(Py_buffer *view) +_IsFortranContiguous(const Py_buffer *view) { Py_ssize_t sd, dim; int i; @@ -361,7 +361,7 @@ } static int -_IsCContiguous(Py_buffer *view) +_IsCContiguous(const Py_buffer *view) { Py_ssize_t sd, dim; int i; @@ -382,16 +382,16 @@ } 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; } @@ -651,7 +651,7 @@ PyBuffer_FillInfo(Py_buffer *view, PyObject *obj, void *buf, Py_ssize_t len, 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, diff --git a/Objects/memoryobject.c b/Objects/memoryobject.c --- a/Objects/memoryobject.c +++ b/Objects/memoryobject.c @@ -1,127 +1,918 @@ - /* Memoryview object implementation */ #include "Python.h" - -#define IS_RELEASED(memobj) \ - (((PyMemoryViewObject *) memobj)->view.buf == NULL) - -#define CHECK_RELEASED(memobj) \ - if (IS_RELEASED(memobj)) { \ - PyErr_SetString(PyExc_ValueError, \ - "operation forbidden on released memoryview object"); \ - return NULL; \ +#include + + +/****************************************************************************/ +/* 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. + + 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. + + 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 must be NULL. */ + Py_DECREF(mbuf); + return NULL; } -static Py_ssize_t -get_shape0(Py_buffer *buf) + /* Assume that master.obj is a new reference to base. */ + assert(mbuf->master.obj == base); + + return (PyObject *)mbuf; +} + +static void +mbuf_release(_PyManagedBufferObject *self) { - 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; + 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 -dup_buffer(Py_buffer *dest, Py_buffer *src) +mbuf_dealloc(_PyManagedBufferObject *self) { - *dest = *src; - if (src->ndim == 1 && src->shape != NULL) { - dest->shape = &(dest->smalltable[0]); - dest->shape[0] = get_shape0(src); + 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 +mbuf_traverse(_PyManagedBufferObject *self, visitproc visit, void *arg) +{ + Py_VISIT(self->master.obj); + return 0; +} + +static int +mbuf_clear(_PyManagedBufferObject *self) +{ + 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; \ } - if (src->ndim == 1 && src->strides != NULL) { - dest->strides = &(dest->smalltable[1]); - dest->strides[0] = src->strides[0]; + +#define CHECK_RELEASED_INT(mv) \ + if (BASE_INACCESSIBLE(mv)) { \ + PyErr_SetString(PyExc_ValueError, \ + "operation forbidden on released memoryview object"); \ + return -1; \ } -} - -static int -memory_getbuf(PyMemoryViewObject *self, Py_buffer *view, int flags) -{ - 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; -} - -static void -memory_releasebuf(PyMemoryViewObject *self, Py_buffer *view) -{ - PyBuffer_Release(view); -} + +#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(Py_buffer *dest, 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); +} + +/* Check that the logical structure of the destination and source buffers + is identical. */ +static int +cmp_structure(Py_buffer *dest, Py_buffer *src) +{ + const char *dfmt, *sfmt; + int i; + + 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 || + dest->ndim != src->ndim) { + goto value_error; + } + + for (i = 0; i < dest->ndim; i++) { + if (dest->shape[i] != src->shape[i]) + goto value_error; + if (dest->shape[i] == 0) + break; + } + + return 0; + +value_error: + PyErr_SetString(PyExc_ValueError, + "ndarray assignment: lvalue and rvalue have different structures"); + 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 (cmp_structure(dest, src) < 0) + 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 (cmp_structure(dest, src) < 0) + 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 C-contiguous representation. Assumptions: + len(mem) == src->len. */ +static int +buffer_to_c_contiguous(char *mem, Py_buffer *src) +{ + Py_buffer dest; + Py_ssize_t *strides; + int ret; + + 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 as a C-contiguous buffer */ + dest = *src; + dest.buf = mem; + /* shape is constant and shared */ + dest.strides = strides; + init_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; + + _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; - mview->hash = -1; - 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; - - if (!PyObject_CheckBuffer(base)) { - PyErr_SetString(PyExc_TypeError, - "cannot make memory view because object does " - "not have the buffer interface"); + _PyManagedBufferObject *mbuf; + + 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)) { @@ -132,216 +923,1526 @@ } +/****************************************************************************/ +/* 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 +_memory_release(PyMemoryViewObject *self) +{ + 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; + } + + Py_FatalError("_memory_release(): negative export count"); + return -1; +} + +static PyObject * +memory_release(PyMemoryViewObject *self) +{ + if (_memory_release(self) < 0) + return NULL; + Py_RETURN_NONE; +} + 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) +memory_dealloc(PyMemoryViewObject *self) { - int k; - Py_ssize_t outstride; - - if (nd==0) { - memcpy(dest, src, itemsize); + assert(self->exports == 0); + _PyObject_GC_UNTRACK(self); + (void)_memory_release(self); + Py_CLEAR(self->mbuf); + 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); +} + + +/****************************************************************************/ +/* 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; } - else if (nd == 1) { - for (k = 0; k 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; + } + + 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; + } + + 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; + } + + 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 { + len = copy_shape(view->shape, shape, ndim, view->itemsize); + if (len < 0) + return -1; + init_strides_from_shape(view); + } + + if (view->len != len) { + PyErr_SetString(PyExc_TypeError, + "memoryview: product(shape) * itemsize != buffer size"); + return -1; + } + + 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; +} + +/* + 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. + + 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) +{ + static char *kwlist[] = {"format", "shape", NULL}; + PyMemoryViewObject *mv = NULL; + PyObject *shape = NULL; + PyObject *format; + Py_ssize_t ndim = 1; + + CHECK_RELEASED(self); + + if (!PyArg_ParseTupleAndKeywords(args, kwds, "O|O", kwlist, + &format, &shape)) { + return NULL; + } + if (!PyUnicode_Check(format)) { + PyErr_SetString(PyExc_TypeError, + "memoryview: format argument must be a string"); + return 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; + } + 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; } } + + 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 (REQ_C_CONTIGUOUS(flags) && !MV_C_CONTIGUOUS(baseflags)) { + PyErr_SetString(PyExc_BufferError, + "memoryview: underlying buffer is not C-contiguous"); + return -1; + } + if (REQ_F_CONTIGUOUS(flags) && !MV_F_CONTIGUOUS(baseflags)) { + PyErr_SetString(PyExc_BufferError, + "memoryview: underlying buffer is not Fortran contiguous"); + return -1; + } + if (REQ_ANY_CONTIGUOUS(flags) && !MV_ANY_CONTIGUOUS(baseflags)) { + PyErr_SetString(PyExc_BufferError, + "memoryview: underlying buffer is not contiguous"); + return -1; + } + if (!REQ_INDIRECT(flags) && (baseflags & _Py_MEMORYVIEW_PIL)) { + PyErr_SetString(PyExc_BufferError, + "memoryview: underlying buffer requires suboffsets"); + return -1; + } + if (!REQ_STRIDES(flags)) { + if (!MV_C_CONTIGUOUS(baseflags)) { + PyErr_SetString(PyExc_BufferError, + "memoryview: underlying buffer 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->exports++; + + return 0; +} + +static void +memory_releasebuf(PyMemoryViewObject *self, Py_buffer *view) +{ + self->exports--; + return; + /* PyBuffer_Release() decrements view->obj after this function returns. */ +} + +/* 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) +{ + PyErr_Format(PyExc_TypeError, + "memoryview: invalid type for format '%s'", fmt); + return -1; +} + +static int +value_error_int(const char *fmt) +{ + PyErr_Format(PyExc_ValueError, + "memoryview: invalid value for format '%s'", fmt); + return -1; +} + +static int +fix_error_int(const char *fmt) +{ + assert(PyErr_Occurred()); + if (PyErr_ExceptionMatches(PyExc_TypeError)) { + PyErr_Clear(); + return type_error_int(fmt); + } + else if (PyErr_ExceptionMatches(PyExc_OverflowError) || + PyErr_ExceptionMatches(PyExc_ValueError)) { + PyErr_Clear(); + return value_error_int(fmt); + } + + return -1; +} + +/* Accept integer objects or objects with an __index__() method. */ +static long +pylong_as_ld(PyObject *item) +{ + PyObject *tmp; + long ld; + + tmp = PyNumber_Index(item); + if (tmp == NULL) + return -1; + + ld = PyLong_AsLong(tmp); + Py_DECREF(tmp); + return ld; +} + +static unsigned long +pylong_as_lu(PyObject *item) +{ + 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; +} + +#ifdef HAVE_LONG_LONG +static PY_LONG_LONG +pylong_as_lld(PyObject *item) +{ + 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 unsigned PY_LONG_LONG +pylong_as_llu(PyObject *item) +{ + 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 Py_ssize_t +pylong_as_zd(PyObject *item) +{ + 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; +} + +static size_t +pylong_as_zu(PyObject *item) +{ + PyObject *tmp; + size_t zu; + + tmp = PyNumber_Index(item); + if (tmp == NULL) + return (size_t)-1; + + zu = PyLong_AsSize_t(tmp); + Py_DECREF(tmp); + return zu; +} + +/* 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) +{ + 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; +} + +#define PACK_SINGLE(ptr, src, type) \ + do { \ + type x; \ + x = (type)src; \ + memcpy(ptr, (char *)&x, sizeof x); \ + } while (0) + +/* 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) +{ + 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; + + /* 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; +} + + +/****************************************************************************/ +/* 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; + + 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(lst); + return NULL; + } + PyList_SET_ITEM(lst, i, item); + } + + return lst; +} + +/* 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) +{ + 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); + } + + return lst; +} + +/* Return a list representation of the memoryview. Currently only buffers + with native format strings are supported. */ +static PyObject * +memory_tolist(PyMemoryViewObject *mv, PyObject *noargs) +{ + 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 { - 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; kbuf, view->ndim, view->shape, + view->strides, view->suboffsets, + fmt); + } +} + +static PyObject * +memory_tobytes(PyMemoryViewObject *self, PyObject *dummy) +{ + Py_buffer *src = VIEW_ADDR(self); + PyObject *bytes = NULL; + + CHECK_RELEASED(self); + + if (MV_C_CONTIGUOUS(self->flags)) { + return PyBytes_FromStringAndSize(src->buf, src->len); + } + + bytes = PyBytes_FromStringAndSize(NULL, src->len); + if (bytes == NULL) + return NULL; + + if (buffer_to_c_contiguous(PyBytes_AS_STRING(bytes), src) < 0) { + Py_DECREF(bytes); + return NULL; + } + + return bytes; +} + +static PyObject * +memory_repr(PyMemoryViewObject *self) +{ + if (self->flags & _Py_MEMORYVIEW_RELEASED) + return PyUnicode_FromFormat("", self); + else + return PyUnicode_FromFormat("", self); +} + + +/**************************************************************************/ +/* Indexing and slicing */ +/**************************************************************************/ + +/* Get the pointer to the item at index. */ +static char * +ptr_from_index(Py_buffer *view, Py_ssize_t index) +{ + 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; +} + +/* 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 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_TypeError, "invalid indexing of 0-dim memory"); + return NULL; + } + if (view->ndim == 1) { + char *ptr = ptr_from_index(view, index); + if (ptr == NULL) + return NULL; + return unpack_single(ptr, fmt); + } + + PyErr_SetString(PyExc_NotImplementedError, + "multi-dimensional sub-views are not implemented"); + return NULL; +} + +Py_LOCAL_INLINE(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 +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) +{ + Py_buffer *view; + view = &(self->view); + + CHECK_RELEASED(self); + + if (view->ndim == 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_TypeError, + "invalid indexing of 0-dim memory"); + return NULL; + } + } + + if (PyIndex_Check(key)) { + 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)) { + PyMemoryViewObject *sliced; + + 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; + } + 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_SetString(PyExc_TypeError, "memoryview: invalid slice key"); + return NULL; +} + +static int +memory_ass_sub(PyMemoryViewObject *self, PyObject *key, PyObject *value) +{ + Py_buffer *view = &(self->view); + 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"); + return -1; + } + if (value == NULL) { + PyErr_SetString(PyExc_TypeError, "cannot delete memory"); + return -1; + } + 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); + } + else { + PyErr_SetString(PyExc_TypeError, + "invalid indexing of 0-dim memory"); + return -1; + } + } + if (view->ndim != 1) { + PyErr_SetString(PyExc_NotImplementedError, + "memoryview assignments are currently restricted to ndim = 1"); + return -1; + } + + if (PyIndex_Check(key)) { + Py_ssize_t index = PyNumber_AsSsize_t(key, PyExc_IndexError); + if (index == -1 && PyErr_Occurred()) + return -1; + ptr = ptr_from_index(view, index); + if (ptr == NULL) + return -1; + return pack_single(ptr, value, fmt); + } + /* 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; + } + 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; + } + + 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 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, const char *fmt) +{ + int equal; + + switch (fmt[0]) { + + /* 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; + + /* Py_NotImplemented */ + default: return -1; + } +} + +/* 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, + const char *fmt) +{ + 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); + 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, + const char *fmt) +{ + 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); + } + + 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); + if (equal <= 0) + return equal; + } + + return 1; +} + +static PyObject * +memory_richcompare(PyObject *v, PyObject *w, int op) +{ + PyObject *res; + Py_buffer wbuf, *vv, *ww = NULL; + const char *vfmt, *wfmt; + int equal = -1; /* Py_NotImplemented */ + + if (op != Py_EQ && op != Py_NE) + goto result; /* Py_NotImplemented */ + + assert(PyMemoryView_Check(v)); + if (BASE_INACCESSIBLE(v)) { + equal = (v == w); + goto result; + } + 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; + } + + vfmt = adjust_fmt(vv); + wfmt = adjust_fmt(ww); + if (vfmt == NULL || wfmt == NULL) { + PyErr_Clear(); + goto result; /* Py_NotImplemented */ + } + + if (cmp_structure(vv, ww) < 0) { + PyErr_Clear(); + equal = 0; + goto result; + } + + if (vv->ndim == 0) { + equal = unpack_cmp(vv->buf, ww->buf, vfmt); + } + else if (vv->ndim == 1) { + equal = cmp_base(vv->buf, ww->buf, vv->shape, + vv->strides, vv->suboffsets, + ww->strides, ww->suboffsets, + vfmt); + } + else { + equal = cmp_rec(vv->buf, ww->buf, vv->ndim, vv->shape, + vv->strides, vv->suboffsets, + ww->strides, ww->suboffsets, + vfmt); + } + +result: + if (equal < 0) + res = Py_NotImplemented; + else if ((equal && op == Py_EQ) || (!equal && op == Py_NE)) + res = Py_True; + else + res = Py_False; + + if (ww == &wbuf) + PyBuffer_Release(ww); + Py_INCREF(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; + + CHECK_RELEASED_INT(self); + + if (!view->readonly) { + PyErr_SetString(PyExc_ValueError, + "cannot hash writable memoryview object"); + return -1; + } + if (view->obj != NULL && PyObject_Hash(view->obj) == -1) { + /* Keep the original error message */ + return -1; + } + + if (!MV_C_CONTIGUOUS(self->flags)) { + mem = PyMem_Malloc(view->len); + if (mem == NULL) { + PyErr_NoMemory(); + return -1; } - for (k=0; khash = _Py_HashBytes((unsigned char *)mem, view->len); + + if (mem != view->buf) + PyMem_Free(mem); } - return; + + return self->hash; } -static int -_indirect_copy_nd(char *dest, Py_buffer *view, char fort) -{ - 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(); - return -1; - } - - indices = (Py_ssize_t *)PyMem_Malloc(sizeof(Py_ssize_t)*view->ndim); - if (indices == NULL) { - PyErr_NoMemory(); - return -1; - } - for (k=0; kndim;k++) { - indices[k] = 0; - } - - elements = 1; - for (k=0; kndim; k++) { - elements *= view->shape[k]; - } - if (fort == 'F') { - func = _Py_add_one_to_index_F; - } - else { - func = _Py_add_one_to_index_C; - } - while (elements--) { - func(view->ndim, indices, view->shape); - ptr = PyBuffer_GetPointer(view, indices); - memcpy(dest, ptr, view->itemsize); - dest += view->itemsize; - } - - PyMem_Free(indices); - 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. - */ - -PyObject * -PyMemoryView_GetContiguous(PyObject *obj, int buffertype, char fort) -{ - PyMemoryViewObject *mem; - PyObject *bytes; - Py_buffer *view; - int flags; - char *dest; - - if (!PyObject_CheckBuffer(obj)) { - PyErr_SetString(PyExc_TypeError, - "object does not support the buffer interface"); - return NULL; - } - - mem = PyObject_GC_New(PyMemoryViewObject, &PyMemoryView_Type); - if (mem == NULL) - return NULL; - - view = &mem->view; - flags = PyBUF_FULL_RO; - switch(buffertype) { - case PyBUF_WRITE: - flags = PyBUF_FULL; - break; - } - - if (PyObject_GetBuffer(obj, view, flags) != 0) { - Py_DECREF(mem); - return NULL; - } - - if (PyBuffer_IsContiguous(view, fort)) { - /* no copy needed */ - _PyObject_GC_TRACK(mem); - return (PyObject *)mem; - } - /* otherwise a copy is needed */ - if (buffertype == PyBUF_WRITE) { - Py_DECREF(mem); - PyErr_SetString(PyExc_BufferError, - "writable contiguous buffer requested " - "for a non-contiguousobject."); - return NULL; - } - bytes = PyBytes_FromStringAndSize(NULL, view->len); - if (bytes == NULL) { - Py_DECREF(mem); - return NULL; - } - 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); - } - else { - if (_indirect_copy_nd(dest, view, fort) < 0) { - Py_DECREF(bytes); - Py_DECREF(mem); - return NULL; - } - PyBuffer_Release(view); /* XXX ? */ - } - _PyObject_GC_TRACK(mem); - return (PyObject *)mem; -} - - -static PyObject * -memory_format_get(PyMemoryViewObject *self) -{ - CHECK_RELEASED(self); - return PyUnicode_FromString(self->view.format); -} - -static PyObject * -memory_itemsize_get(PyMemoryViewObject *self) -{ - CHECK_RELEASED(self); - return PyLong_FromSsize_t(self->view.itemsize); -} + +/**************************************************************************/ +/* getters */ +/**************************************************************************/ static PyObject * _IntTupleFromSsizet(int len, Py_ssize_t *vals) @@ -350,10 +2451,9 @@ PyObject *o; PyObject *intTuple; - if (vals == NULL) { - Py_INCREF(Py_None); - return Py_None; - } + if (vals == NULL) + return PyTuple_New(0); + intTuple = PyTuple_New(len); if (!intTuple) return NULL; @@ -369,6 +2469,40 @@ } static PyObject * +memory_obj_get(PyMemoryViewObject *self) +{ + 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); +} + +static PyObject * +memory_format_get(PyMemoryViewObject *self) +{ + CHECK_RELEASED(self); + return PyUnicode_FromString(self->view.format); +} + +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); @@ -403,455 +2537,60 @@ return PyLong_FromLong(self->view.ndim); } -static PyGetSetDef memory_getsetlist[] ={ - {"format", (getter)memory_format_get, NULL, NULL}, - {"itemsize", (getter)memory_itemsize_get, NULL, NULL}, - {"shape", (getter)memory_shape_get, NULL, NULL}, - {"strides", (getter)memory_strides_get, NULL, NULL}, - {"suboffsets", (getter)memory_suboffsets_get, NULL, NULL}, - {"readonly", (getter)memory_readonly_get, NULL, NULL}, - {"ndim", (getter)memory_ndim_get, NULL, NULL}, +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)); +} + +static PyGetSetDef memory_getsetlist[] = { + {"obj", (getter)memory_obj_get, NULL, NULL}, + {"nbytes", (getter)memory_nbytes_get, NULL, NULL}, + {"readonly", (getter)memory_readonly_get, NULL, NULL}, + {"itemsize", (getter)memory_itemsize_get, NULL, NULL}, + {"format", (getter)memory_format_get, NULL, NULL}, + {"ndim", (getter)memory_ndim_get, NULL, NULL}, + {"shape", (getter)memory_shape_get, NULL, NULL}, + {"strides", (getter)memory_strides_get, NULL, NULL}, + {"suboffsets", (getter)memory_suboffsets_get, NULL, NULL}, + {"c_contiguous", (getter)memory_c_contiguous, NULL, NULL}, + {"f_contiguous", (getter)memory_f_contiguous, NULL, NULL}, + {"contiguous", (getter)memory_contiguous, NULL, NULL}, {NULL, NULL, NULL, NULL}, }; -static PyObject * -memory_tobytes(PyMemoryViewObject *mem, PyObject *noargs) -{ - CHECK_RELEASED(mem); - return PyObject_CallFunctionObjArgs( - (PyObject *) &PyBytes_Type, mem, NULL); -} - -/* TODO: rewrite this function using the struct module to unpack - each buffer item */ - -static PyObject * -memory_tolist(PyMemoryViewObject *mem, PyObject *noargs) -{ - Py_buffer *view = &(mem->view); - Py_ssize_t i; - PyObject *res, *item; - char *buf; - - CHECK_RELEASED(mem); - if (strcmp(view->format, "B") || view->itemsize != 1) { - PyErr_SetString(PyExc_NotImplementedError, - "tolist() only supports byte views"); - return NULL; - } - if (view->ndim != 1) { - PyErr_SetString(PyExc_NotImplementedError, - "tolist() only supports one-dimensional objects"); - return NULL; - } - res = PyList_New(view->len); - if (res == NULL) - return NULL; - buf = view->buf; - for (i = 0; i < view->len; i++) { - item = PyLong_FromUnsignedLong((unsigned char) *buf); - if (item == NULL) { - Py_DECREF(res); - return NULL; - } - PyList_SET_ITEM(res, i, item); - buf++; - } - return res; -} - -static void -do_release(PyMemoryViewObject *self) -{ - if (self->view.obj != NULL) { - PyBuffer_Release(&(self->view)); - } - self->view.obj = NULL; - self->view.buf = NULL; -} - -static PyObject * -memory_enter(PyObject *self, PyObject *args) -{ - CHECK_RELEASED(self); - Py_INCREF(self); - return self; -} - -static PyObject * -memory_exit(PyObject *self, PyObject *args) -{ - do_release((PyMemoryViewObject *) self); - Py_RETURN_NONE; -} - static PyMethodDef memory_methods[] = { - {"release", memory_exit, METH_NOARGS}, - {"tobytes", (PyCFunction)memory_tobytes, METH_NOARGS, NULL}, - {"tolist", (PyCFunction)memory_tolist, METH_NOARGS, NULL}, - {"__enter__", memory_enter, METH_NOARGS}, - {"__exit__", memory_exit, METH_VARARGS}, - {NULL, NULL} /* sentinel */ -}; - - -static void -memory_dealloc(PyMemoryViewObject *self) -{ - _PyObject_GC_UNTRACK(self); - do_release(self); - PyObject_GC_Del(self); -} - -static PyObject * -memory_repr(PyMemoryViewObject *self) -{ - if (IS_RELEASED(self)) - return PyUnicode_FromFormat("", self); - else - return PyUnicode_FromFormat("", self); -} - -static Py_hash_t -memory_hash(PyMemoryViewObject *self) -{ - if (self->hash == -1) { - Py_buffer *view = &self->view; - CHECK_RELEASED_INT(self); - if (view->ndim > 1) { - PyErr_SetString(PyExc_NotImplementedError, - "can't hash multi-dimensional memoryview object"); - return -1; - } - if (view->strides && view->strides[0] != view->itemsize) { - PyErr_SetString(PyExc_NotImplementedError, - "can't hash strided memoryview object"); - return -1; - } - if (!view->readonly) { - PyErr_SetString(PyExc_ValueError, - "can't hash writable memoryview object"); - return -1; - } - if (view->obj != NULL && PyObject_Hash(view->obj) == -1) { - /* Keep the original error message */ - return -1; - } - /* Can't fail */ - self->hash = _Py_HashBytes((unsigned char *) view->buf, view->len); - } - return self->hash; -} - -/* Sequence methods */ -static Py_ssize_t -memory_length(PyMemoryViewObject *self) -{ - CHECK_RELEASED_INT(self); - return get_shape0(&self->view); -} - -/* Alternate version of memory_subcript that only accepts indices. - Used by PySeqIter_New(). -*/ -static PyObject * -memory_item(PyMemoryViewObject *self, Py_ssize_t result) -{ - Py_buffer *view = &(self->view); - - CHECK_RELEASED(self); - if (view->ndim == 0) { - PyErr_SetString(PyExc_IndexError, - "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"); - 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); - } -} - -/* - 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. - - 0-d memory-view objects can be referenced using ... or () but - not with anything else. - */ -static PyObject * -memory_subscript(PyMemoryViewObject *self, PyObject *key) -{ - Py_buffer *view; - view = &(self->view); - - CHECK_RELEASED(self); - if (view->ndim == 0) { - if (key == Py_Ellipsis || - (PyTuple_Check(key) && PyTuple_GET_SIZE(key)==0)) { - Py_INCREF(self); - return (PyObject *)self; - } - else { - PyErr_SetString(PyExc_IndexError, - "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); - } - else if (PySlice_Check(key)) { - Py_ssize_t start, stop, step, slicelength; - - if (PySlice_GetIndicesEx(key, get_shape0(view), - &start, &stop, &step, &slicelength) < 0) { - 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); - return NULL; - } - PyErr_Format(PyExc_TypeError, - "cannot index memory using \"%.200s\"", - key->ob_type->tp_name); - 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; - - CHECK_RELEASED_INT(self); - if (view->readonly) { - 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); - 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 ((start < 0) || (start >= get_shape0(view))) { - PyErr_SetString(PyExc_IndexError, - "index out of bounds"); - return -1; - } - len = 1; - } - else if (PySlice_Check(key)) { - Py_ssize_t stop, step; - - if (PySlice_GetIndicesEx(key, get_shape0(view), - &start, &stop, &step, &len) < 0) { - return -1; - } - if (step != 1) { - PyErr_SetNone(PyExc_NotImplementedError); - return -1; - } - } - else { - PyErr_Format(PyExc_TypeError, - "cannot index memory using \"%.200s\"", - key->ob_type->tp_name); - return -1; - } - if (PyObject_GetBuffer(value, &srcview, PyBUF_CONTIG_RO) == -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); - return 0; - -_error: - PyBuffer_Release(&srcview); - return -1; -} - -static PyObject * -memory_richcompare(PyObject *v, PyObject *w, int op) -{ - Py_buffer vv, ww; - int equal = 0; - PyObject *res; - - 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))) { - equal = (v == w); - goto _end; - } - if (PyObject_GetBuffer(v, &vv, PyBUF_CONTIG_RO) == -1) { - PyErr_Clear(); - goto _notimpl; - } - if (PyObject_GetBuffer(w, &ww, PyBUF_CONTIG_RO) == -1) { - PyErr_Clear(); - goto _notimpl; - } - - if (vv.itemsize != ww.itemsize || vv.len != ww.len) - goto _end; - - equal = !memcmp(vv.buf, ww.buf, vv.len); - -_end: - PyBuffer_Release(&vv); - PyBuffer_Release(&ww); - if ((equal && op == Py_EQ) || (!equal && op == Py_NE)) - res = Py_True; - else - res = Py_False; - Py_INCREF(res); - return res; - -_notimpl: - PyBuffer_Release(&vv); - PyBuffer_Release(&ww); - Py_RETURN_NOTIMPLEMENTED; -} - - -static int -memory_traverse(PyMemoryViewObject *self, visitproc visit, void *arg) -{ - if (self->view.obj != NULL) - Py_VISIT(self->view.obj); - return 0; -} - -static int -memory_clear(PyMemoryViewObject *self) -{ - PyBuffer_Release(&self->view); - return 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 */ -}; - -static PySequenceMethods memory_as_sequence = { - 0, /* sq_length */ - 0, /* sq_concat */ - 0, /* sq_repeat */ - (ssizeargfunc)memory_item, /* sq_item */ -}; - -/* Buffer methods */ - -static PyBufferProcs memory_as_buffer = { - (getbufferproc)memory_getbuf, /* bf_getbuffer */ - (releasebufferproc)memory_releasebuf, /* bf_releasebuffer */ + {"release", (PyCFunction)memory_release, METH_NOARGS}, + {"tobytes", (PyCFunction)memory_tobytes, METH_NOARGS, NULL}, + {"tolist", (PyCFunction)memory_tolist, METH_NOARGS, NULL}, + {"cast", (PyCFunction)memory_cast, METH_VARARGS|METH_KEYWORDS, NULL}, + {"__enter__", memory_enter, METH_NOARGS}, + {"__exit__", memory_exit, METH_VARARGS}, + {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 */ diff --git a/Objects/object.c b/Objects/object.c --- a/Objects/object.c +++ b/Objects/object.c @@ -1650,6 +1650,9 @@ 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"); diff --git a/PCbuild/_testbuffer.vcproj b/PCbuild/_testbuffer.vcproj new file mode 100644 --- /dev/null +++ b/PCbuild/_testbuffer.vcproj @@ -0,0 +1,521 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/PCbuild/pcbuild.sln b/PCbuild/pcbuild.sln --- a/PCbuild/pcbuild.sln +++ b/PCbuild/pcbuild.sln @@ -142,6 +142,11 @@ 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 @@ -609,6 +614,22 @@ {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 diff --git a/PCbuild/readme.txt b/PCbuild/readme.txt --- a/PCbuild/readme.txt +++ b/PCbuild/readme.txt @@ -92,6 +92,9 @@ _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/ diff --git a/setup.py b/setup.py --- a/setup.py +++ b/setup.py @@ -530,6 +530,8 @@ # Python C API test module exts.append( Extension('_testcapi', ['_testcapimodule.c'], depends=['testcapi_long.h']) ) + # Python PEP-3118 (buffer protocol) test module + exts.append( Extension('_testbuffer', ['_testbuffer.c']) ) # profiler (_lsprof is for cProfile.py) exts.append( Extension('_lsprof', ['_lsprof.c', 'rotatingtree.c']) ) # static Unicode character database -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sat Feb 25 13:24:19 2012 From: python-checkins at python.org (nick.coghlan) Date: Sat, 25 Feb 2012 13:24:19 +0100 Subject: [Python-checkins] =?utf8?q?peps=3A_Assorted_cleanups=2C_plus_a_no?= =?utf8?q?te_about_support_for_even_faster_stdlib_release?= Message-ID: http://hg.python.org/peps/rev/f2e7ef06ce78 changeset: 4080:f2e7ef06ce78 user: Nick Coghlan date: Sat Feb 25 22:24:14 2012 +1000 summary: Assorted cleanups, plus a note about support for even faster stdlib release cycles files: pep-0413.txt | 117 +++++++++++++++++++++++++++++--------- 1 files changed, 88 insertions(+), 29 deletions(-) diff --git a/pep-0413.txt b/pep-0413.txt --- a/pep-0413.txt +++ b/pep-0413.txt @@ -136,7 +136,7 @@ Python level. Finally, 18 months after the release of 3.3, a new language release would -be made around the same time as the final 3.3 maintenance release: +be made around the same time as the final 3.3 maintenance release:: 3.3.3 + 12.08.3 # Maintenance release 3.4.0 + 14.02.0 # Language release @@ -150,6 +150,7 @@ * changes to the emitted bytecode * changes to the AST * any other significant changes to the compilation toolchain +* changes to the core eval loop * changes to the C ABI The 3.4 release cycle would then follow a similar pattern to that for 3.3:: @@ -186,7 +187,7 @@ **Status quo:** must choose between 3.3 and 2.7 -**This PEP:** must first choose between 3.3 (13.02), 3.3 (12.08) and 2.7. +**This PEP:** must choose between 3.3 (13.02), 3.3 (12.08) and 2.7. **PEP 407:** must choose between 3.4, 3.3 (LTS) and 2.7. @@ -349,7 +350,7 @@ *is* an extra piece of information that users may need to pass back to developers when reporting issues with Python libraries (or Python itself, on our own tracker). However, by including it in ``sys.version``, many -fault reports will already include, and it is easy to request if needed. +fault reports will already include it, and it is easy to request if needed. Effects @@ -359,14 +360,15 @@ --------------------------- Similar to PEP 407, this PEP will break up the delivery of new features into -more discrete chunks. Instead of whole raft of changes landing all at once +more discrete chunks. Instead of a whole raft of changes landing all at once in a language release, each language release will be limited to 6 months worth of standard library changes, as well as any changes associated with new syntax. -If a release date slips by a month or two, I would keep the planned standard -library version number rather than updating it to reflect the actual release -date. +If a release date slips by a month or two, the current proposal is to keep +the planned standard library version number rather than updating it to +reflect the actual release date. + Effect on workflow ------------------ @@ -385,9 +387,6 @@ should be checked in on ``3.3-compat`` and then merged to ``default``. Otherwise it should be checked in directly to ``default``. -The ``3.3-compat`` branch would be closed after the 3.3+13.08 release, as -the next release at that time will be a full language release. - The "version added" and "version changed" markers for any changes made on the ``3.3-compat`` branch would need to be flagged with both the language version and the standard library version. For example: "3.3 (13.02)". @@ -395,13 +394,33 @@ Any changes made directly on the ``default`` branch would just be flagged with "3.4" as usual. +The ``3.3-compat`` branch would be closed after the 3.3+13.08 release, as +the next release at that time will be a full language release and changes +(including standard library changes) should be marked accordingly. + Effect on bugfix cycle ---------------------- -The effect on the bug fix cycle is essentially the same as that on the +The effect on the bug fix workflow is essentially the same as that on the workflow for new features - there is one additional branch to pass through -before the change reaches default branch. +before the change reaches the ``default`` branch. + +If critical bugs are found in a maintenance release, then new maintenance and +standard library releases will be created to resolve the problem. The micro +release number will be incremented for both the language version and the +standard library version. + +If critical bugs are found in a standard library release that do not affect +the associated maintenance release, then only a new standard library release +will be created and only the standard library version's micro release number +will be incremented. + +Note that in these circumstances, the standard library release *may* include +additional features, rather than just containing the bug fix. It is +assumed that anyone that cares about receiving *only* bug fixes without any +new features mixed in will already be relying strictly on the maintenance +releases rather than using the new standard library releases. Effect on the community @@ -428,10 +447,11 @@ greatly reassure the rest of the community that no, we're not suddenly asking them to triple their own rate of development. Instead, we're merely going to ship standard library updates for the next language release in -three 6-monthly installments rather than delaying them all, even those that -are backwards compatible with the previously released version of Python. +6-monthly installments rather than delaying them all until the next language +definition update, even those changes that are backwards compatible with the +previously released version of Python. -The community benefits list in PEP 407 are equally applicable to this PEP, +The community benefits listed in PEP 407 are equally applicable to this PEP, at least as far as the standard library is concerned: People who value reactivity and access to new features (without taking the @@ -455,9 +475,20 @@ ----------- The "What's New" documents would be split out into separate documents for -standard library releases and language releases. If the major version -number only continues to increase once every decade or so, resolving the -eventual numbering conflict can be safely deemed somebody elses problem :) +standard library releases and language releases. So, during the 3.3 release +cycle, we would see: + +* What's New in Python 3.3? +* What's New in Python 3.3 (13.02)? +* What's New in Python 3.3 (13.08)? + +And the finally, we would see the next language release: + +* What's New in Python 3.4? + +For the benefit of users that ignore standard library releases, the 3.4 +What's New would link back to the What's New documents for each of the +standard library releases in the 3.3 series. NEWS @@ -465,15 +496,15 @@ Merge conflicts on the NEWS file are already a hassle. Since this PEP proposes introduction of an additional branch into the normal workflow, -resolving this becomes even more critical. While Mercurial phases will +resolving this becomes even more critical. While Mercurial phases may help to some degree, it would be good to eliminate the problem entirely. One suggestion from Barry Warsaw is to adopt a non-conflicting separate-files-per-change approach, similar to that used by Twisted [2_]. -For this PEP, one possible layout for such an approach (adopted following -the release of 3.3.0+12.8.0 using the existing NEWS process) might look -like:: +For this PEP, one possible layout for such an approach (to be adopted +following the initial release of 3.3.0+12.8.0 that will use the current NEWS +process) might look like:: Misc/ news_entries/ @@ -489,7 +520,7 @@ tests/ 3.4.0/ # default branch changes - language/ + language/ # Only exists for "x.y.0" builtins/ @@ -519,6 +550,10 @@ history), but does make it easier for *humans* to keep the different versions in order. +Other layouts are obviously also possible (for example, having separate "3.3" +and "3.4" directories to group entries for each language version and the +associated maintenance and standard library releases). + Option: Slowing down the language release cycle =============================================== @@ -565,6 +600,27 @@ then be available every 6 months after that. +Future: Further increasing the pace of standard library development +=================================================================== + +A further benefit of the scheme proposed in this PEP is that it almost +*fully* decouples the language release cycle from the standard library +release cycle. The standard library could be updated every 3 months, or +even once a month, without having any flow on effects on the language +version numbering or the perceived stability of the core language. + +While that pace of development isn't practical as long as the binary +installer creation for Windows and Mac OS X involves several manual steps and +for as long as we don't have separate "-release" trees that only +receive versions that have been marked as good by the stable buildbots, +it's a useful criterion to keep in mind: what if we want to make standard +library releases even *faster* than every 6 months? + +If the practical issues were ever resolved, then the separate date-based +versioning scheme in this PEP could handle it. The approach proposed in +PEP 407 could not. + + Why isn't PEP 384 enough? ========================= @@ -586,14 +642,17 @@ =================================================== Because it's a lot of work for next to no pay-off. CPython without the -standard library is useless (the build chain won't even finish). You -can't create a standalone pure Python standard library, because too many -"modules" are actually tightly linked in to the internal details of the -respective interpreters (e.g. ``weakref``, ``gc``, ``sys``). +standard library is useless (the build chain won't even run, let alone the +test suite). You can't create a standalone pure Python standard library, +because too many "modules" are actually tightly linked in to the internal +details of their respective interpreters (e.g. ``weakref``, ``gc``, ``sys``, +``inspect``, ``ast``). Creating a separate development branch that is kept compatible with the -previous feature release should provide most of the benefits of a -separate standard library repository with only a fraction of the pain. +previous feature release, and making releases from that branch that are +flagged with a separate date-based version number should provide most of +the benefits of a separate standard library repository with only a fraction +of the pain. Acknowledgements -- Repository URL: http://hg.python.org/peps From python-checkins at python.org Sat Feb 25 13:29:44 2012 From: python-checkins at python.org (nick.coghlan) Date: Sat, 25 Feb 2012 13:29:44 +0100 Subject: [Python-checkins] =?utf8?q?peps=3A_Typo?= Message-ID: http://hg.python.org/peps/rev/4a7f0fedeff8 changeset: 4081:4a7f0fedeff8 user: Nick Coghlan date: Sat Feb 25 22:29:41 2012 +1000 summary: Typo files: pep-0413.txt | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/pep-0413.txt b/pep-0413.txt --- a/pep-0413.txt +++ b/pep-0413.txt @@ -482,7 +482,7 @@ * What's New in Python 3.3 (13.02)? * What's New in Python 3.3 (13.08)? -And the finally, we would see the next language release: +And then finally, we would see the next language release: * What's New in Python 3.4? -- Repository URL: http://hg.python.org/peps From python-checkins at python.org Sat Feb 25 15:05:51 2012 From: python-checkins at python.org (nadeem.vawda) Date: Sat, 25 Feb 2012 15:05:51 +0100 Subject: [Python-checkins] =?utf8?q?cpython=3A_Use_assertEqual_in_test=5Fs?= =?utf8?q?trptime_for_better_failure_messages_=28cf=2E_issue_=2314113=29?= =?utf8?q?=2E?= Message-ID: http://hg.python.org/cpython/rev/d5aa731bae5e changeset: 75255:d5aa731bae5e user: Nadeem Vawda date: Sat Feb 25 15:58:36 2012 +0200 summary: Use assertEqual in test_strptime for better failure messages (cf. issue #14113). files: Lib/test/test_strptime.py | 15 ++++++--------- 1 files changed, 6 insertions(+), 9 deletions(-) diff --git a/Lib/test/test_strptime.py b/Lib/test/test_strptime.py --- a/Lib/test/test_strptime.py +++ b/Lib/test/test_strptime.py @@ -86,17 +86,14 @@ # output. magic_date = (1999, 3, 17, 22, 44, 55, 2, 76, 0) strftime_output = time.strftime("%c", magic_date) - self.assertTrue(strftime_output == time.strftime(self.LT_ins.LC_date_time, - magic_date), - "LC_date_time incorrect") + self.assertEqual(time.strftime(self.LT_ins.LC_date_time, magic_date), + strftime_output, "LC_date_time incorrect") strftime_output = time.strftime("%x", magic_date) - self.assertTrue(strftime_output == time.strftime(self.LT_ins.LC_date, - magic_date), - "LC_date incorrect") + self.assertEqual(time.strftime(self.LT_ins.LC_date, magic_date), + strftime_output, "LC_date incorrect") strftime_output = time.strftime("%X", magic_date) - self.assertTrue(strftime_output == time.strftime(self.LT_ins.LC_time, - magic_date), - "LC_time incorrect") + self.assertEqual(time.strftime(self.LT_ins.LC_time, magic_date), + strftime_output, "LC_time incorrect") LT = _strptime.LocaleTime() LT.am_pm = ('', '') self.assertTrue(LT.LC_time, "LocaleTime's LC directives cannot handle " -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sat Feb 25 16:13:59 2012 From: python-checkins at python.org (eric.araujo) Date: Sat, 25 Feb 2012 16:13:59 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=282=2E7=29=3A_Fix_long-standi?= =?utf8?q?ng_bugs_with_MANIFEST=2Ein_parsing_on_Windows_=28=236884=29=2E?= Message-ID: http://hg.python.org/cpython/rev/47788c90f80b changeset: 75256:47788c90f80b branch: 2.7 parent: 75251:4dd71a933f20 user: ?ric Araujo date: Sat Feb 25 16:13:53 2012 +0100 summary: Fix long-standing bugs with MANIFEST.in parsing on Windows (#6884). These regex changes fix a number of issues for distutils on Windows: - #6884: impossible to include a file starting with 'build' - #9691 and #14004: sdist includes too many files - #13193: test_filelist failures This commit replaces the incorrect changes done in 557a973709de, c566a3447ba1 and 3925081a7ca0 to fix #13193; we were too eager to fix the test failures and I did not study the code enough before greenlighting patches. This time we have unit tests from the problems reported by users to be sure we have the right fix. Thanks to Nadeem Vawda for his help. files: Lib/distutils/filelist.py | 20 +- Lib/distutils/tests/test_filelist.py | 111 +++++++++----- Lib/distutils/tests/test_sdist.py | 14 +- Misc/NEWS | 5 +- 4 files changed, 97 insertions(+), 53 deletions(-) diff --git a/Lib/distutils/filelist.py b/Lib/distutils/filelist.py --- a/Lib/distutils/filelist.py +++ b/Lib/distutils/filelist.py @@ -210,6 +210,7 @@ Return 1 if files are found. """ + # XXX docstring lying about what the special chars are? files_found = 0 pattern_re = translate_pattern(pattern, anchor, prefix, is_regex) self.debug_print("include_pattern: applying regex r'%s'" % @@ -297,11 +298,14 @@ # IMHO is wrong -- '?' and '*' aren't supposed to match slash in Unix, # and by extension they shouldn't match such "special characters" under # any OS. So change all non-escaped dots in the RE to match any - # character except the special characters. - # XXX currently the "special characters" are just slash -- i.e. this is - # Unix-only. - pattern_re = re.sub(r'((? http://hg.python.org/cpython/rev/020364d3e359 changeset: 75257:020364d3e359 branch: 2.7 user: ?ric Araujo date: Sat Feb 25 16:24:59 2012 +0100 summary: Add test file for scripts in Tools (#13447). When people find bugs in scripts such as reindent.py, msgfmt.py or pygettext.py, we have to try to reproduce the bug manually, apply a fix and test manually again. The alternative is to only read the code and trust that it works. This test file is a way to stop that unsatisfactory state of things and write proper unit tests instead. files: Lib/test/test_tools.py | 39 ++++++++++++++++++++++++++++++ Misc/NEWS | 3 ++ 2 files changed, 42 insertions(+), 0 deletions(-) diff --git a/Lib/test/test_tools.py b/Lib/test/test_tools.py new file mode 100644 --- /dev/null +++ b/Lib/test/test_tools.py @@ -0,0 +1,39 @@ +"""Tests for scripts in the Tools directory. + +This file contains regression tests for some of the scripts found in the +Tools directory of a Python checkout or tarball, such as reindent.py. +""" + +import os +import unittest +import sysconfig +from test import test_support +from test.script_helper import assert_python_ok + +if not sysconfig.is_python_build(): + # XXX some installers do contain the tools, should we detect that + # and run the tests in that case too? + raise unittest.SkipTest('test irrelevant for an installed Python') + +srcdir = sysconfig.get_config_var('projectbase') +basepath = os.path.join(os.getcwd(), srcdir, 'Tools') + + +class ReindentTests(unittest.TestCase): + script = os.path.join(basepath, 'scripts', 'reindent.py') + + def test_noargs(self): + assert_python_ok(self.script) + + def test_help(self): + rc, out, err = assert_python_ok(self.script, '-h') + self.assertEqual(out, b'') + self.assertGreater(err, b'') + + +def test_main(): + test_support.run_unittest(ReindentTests) + + +if __name__ == '__main__': + unittest.main() diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -98,6 +98,9 @@ Library ------- +- Issue #13447: Add a test file to host regression tests for bugs in the + scripts found in the Tools directory. + - Issue #6884: Fix long-standing bugs with MANIFEST.in parsing in distutils on Windows. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sat Feb 25 16:32:24 2012 From: python-checkins at python.org (eric.araujo) Date: Sat, 25 Feb 2012 16:32:24 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=283=2E2=29=3A_Fix_long-standi?= =?utf8?q?ng_bugs_with_MANIFEST=2Ein_parsing_on_Windows_=28=236884=29=2E?= Message-ID: http://hg.python.org/cpython/rev/73aa4c9305b3 changeset: 75258:73aa4c9305b3 branch: 3.2 parent: 75252:5e517dd84cec user: ?ric Araujo date: Sat Feb 25 16:28:05 2012 +0100 summary: Fix long-standing bugs with MANIFEST.in parsing on Windows (#6884). These regex changes fix a number of issues for distutils on Windows: - #6884: impossible to include a file starting with 'build' - #9691 and #14004: sdist includes too many files - #13193: test_filelist failures This commit replaces the incorrect changes done in 0a94e2f807c7 and 90b30d62caf2 to fix #13193; we were too eager to fix the test failures and I did not study the code enough before greenlighting patches. This time we have unit tests from the problems reported by users to be sure we have the right fix. Thanks to Nadeem Vawda for his help. files: Lib/distutils/filelist.py | 22 +- Lib/distutils/tests/test_filelist.py | 128 +++++++++++--- Lib/distutils/tests/test_sdist.py | 27 +- Misc/NEWS | 3 + 4 files changed, 133 insertions(+), 47 deletions(-) diff --git a/Lib/distutils/filelist.py b/Lib/distutils/filelist.py --- a/Lib/distutils/filelist.py +++ b/Lib/distutils/filelist.py @@ -201,6 +201,7 @@ Return True if files are found, False otherwise. """ + # XXX docstring lying about what the special chars are? files_found = False pattern_re = translate_pattern(pattern, anchor, prefix, is_regex) self.debug_print("include_pattern: applying regex r'%s'" % @@ -284,11 +285,14 @@ # IMHO is wrong -- '?' and '*' aren't supposed to match slash in Unix, # and by extension they shouldn't match such "special characters" under # any OS. So change all non-escaped dots in the RE to match any - # character except the special characters. - # XXX currently the "special characters" are just slash -- i.e. this is - # Unix-only. - pattern_re = re.sub(r'((? http://hg.python.org/cpython/rev/e1740afa1a04 changeset: 75259:e1740afa1a04 parent: 75255:d5aa731bae5e parent: 75258:73aa4c9305b3 user: ?ric Araujo date: Sat Feb 25 16:32:18 2012 +0100 summary: Merge 3.2 files: Lib/distutils/filelist.py | 22 +- Lib/distutils/tests/test_filelist.py | 128 +++++++++++--- Lib/distutils/tests/test_sdist.py | 27 +- Misc/NEWS | 3 + 4 files changed, 133 insertions(+), 47 deletions(-) diff --git a/Lib/distutils/filelist.py b/Lib/distutils/filelist.py --- a/Lib/distutils/filelist.py +++ b/Lib/distutils/filelist.py @@ -201,6 +201,7 @@ Return True if files are found, False otherwise. """ + # XXX docstring lying about what the special chars are? files_found = False pattern_re = translate_pattern(pattern, anchor, prefix, is_regex) self.debug_print("include_pattern: applying regex r'%s'" % @@ -284,11 +285,14 @@ # IMHO is wrong -- '?' and '*' aren't supposed to match slash in Unix, # and by extension they shouldn't match such "special characters" under # any OS. So change all non-escaped dots in the RE to match any - # character except the special characters. - # XXX currently the "special characters" are just slash -- i.e. this is - # Unix-only. - pattern_re = re.sub(r'((? http://hg.python.org/cpython/rev/64b9ff3c91bb changeset: 75260:64b9ff3c91bb branch: 2.7 parent: 75257:020364d3e359 user: Ezio Melotti date: Sat Feb 25 19:24:24 2012 +0200 summary: #14114: don't include copybutton.js in the htmlhelp output. files: Doc/tools/sphinxext/layout.html | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Doc/tools/sphinxext/layout.html b/Doc/tools/sphinxext/layout.html --- a/Doc/tools/sphinxext/layout.html +++ b/Doc/tools/sphinxext/layout.html @@ -6,7 +6,7 @@ {% endblock %} {% block extrahead %} - + {% if not embedded %}{% endif %} {{ super() }} {% endblock %} {% block footer %} -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sat Feb 25 18:26:53 2012 From: python-checkins at python.org (ezio.melotti) Date: Sat, 25 Feb 2012 18:26:53 +0100 Subject: [Python-checkins] =?utf8?b?Y3B5dGhvbiAoMy4yKTogIzE0MTE0OiBkb24n?= =?utf8?q?t_include_copybutton=2Ejs_in_the_htmlhelp_output=2E?= Message-ID: http://hg.python.org/cpython/rev/7f651187b25c changeset: 75261:7f651187b25c branch: 3.2 parent: 75258:73aa4c9305b3 user: Ezio Melotti date: Sat Feb 25 19:24:24 2012 +0200 summary: #14114: don't include copybutton.js in the htmlhelp output. files: Doc/tools/sphinxext/layout.html | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Doc/tools/sphinxext/layout.html b/Doc/tools/sphinxext/layout.html --- a/Doc/tools/sphinxext/layout.html +++ b/Doc/tools/sphinxext/layout.html @@ -6,7 +6,7 @@ {% endblock %} {% block extrahead %} - + {% if not embedded %}{% endif %} {{ super() }} {% endblock %} {% block footer %} -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sat Feb 25 18:26:54 2012 From: python-checkins at python.org (ezio.melotti) Date: Sat, 25 Feb 2012 18:26:54 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_3=2E2_-=3E_default=29?= =?utf8?q?=3A_=2314114=3A_merge_with_3=2E2=2E?= Message-ID: http://hg.python.org/cpython/rev/39ddcc5c7fb9 changeset: 75262:39ddcc5c7fb9 parent: 75259:e1740afa1a04 parent: 75261:7f651187b25c user: Ezio Melotti date: Sat Feb 25 19:26:39 2012 +0200 summary: #14114: merge with 3.2. files: Doc/tools/sphinxext/layout.html | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Doc/tools/sphinxext/layout.html b/Doc/tools/sphinxext/layout.html --- a/Doc/tools/sphinxext/layout.html +++ b/Doc/tools/sphinxext/layout.html @@ -6,7 +6,7 @@ {% endblock %} {% block extrahead %} - + {% if not embedded %}{% endif %} {{ super() }} {% endblock %} {% block footer %} -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sat Feb 25 19:41:22 2012 From: python-checkins at python.org (sandro.tosi) Date: Sat, 25 Feb 2012 19:41:22 +0100 Subject: [Python-checkins] =?utf8?b?Y3B5dGhvbiAoMi43KTogSXNzdWUgIzEzOTk5?= =?utf8?q?=3A_refer_to_multiprocessing=2EQueue_when_needed?= Message-ID: http://hg.python.org/cpython/rev/5d4f2f994f75 changeset: 75263:5d4f2f994f75 branch: 2.7 parent: 75260:64b9ff3c91bb user: Sandro Tosi date: Sat Feb 25 19:35:16 2012 +0100 summary: Issue #13999: refer to multiprocessing.Queue when needed files: Doc/library/multiprocessing.rst | 20 ++++++++++---------- 1 files changed, 10 insertions(+), 10 deletions(-) diff --git a/Doc/library/multiprocessing.rst b/Doc/library/multiprocessing.rst --- a/Doc/library/multiprocessing.rst +++ b/Doc/library/multiprocessing.rst @@ -107,7 +107,7 @@ **Queues** - The :class:`Queue` class is a near clone of :class:`Queue.Queue`. For + The :class:`~multiprocessing.Queue` class is a near clone of :class:`Queue.Queue`. For example:: from multiprocessing import Process, Queue @@ -231,7 +231,7 @@ 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 + :class:`Event`, :class:`~multiprocessing.Queue`, :class:`Value` and :class:`Array`. For example, :: from multiprocessing import Process, Manager @@ -464,9 +464,9 @@ 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:`~multiprocessing.Queue`, :class:`multiprocessing.queues.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 +standard library. They differ in that :class:`~multiprocessing.Queue` lacks the :meth:`~Queue.Queue.task_done` and :meth:`~Queue.Queue.join` methods introduced into Python 2.5's :class:`Queue.Queue` class. @@ -489,7 +489,7 @@ .. warning:: If a process is killed using :meth:`Process.terminate` or :func:`os.kill` - while it is trying to use a :class:`Queue`, then the data in the queue is + while it is trying to use a :class:`~multiprocessing.Queue`, then the data in the queue is likely to become corrupted. This may cause any other process to get an exception when it tries to use the queue later on. @@ -531,7 +531,7 @@ The usual :exc:`Queue.Empty` and :exc:`Queue.Full` exceptions from the standard library's :mod:`Queue` module are raised to signal timeouts. - :class:`Queue` implements all the methods of :class:`Queue.Queue` except for + :class:`~multiprocessing.Queue` implements all the methods of :class:`Queue.Queue` except for :meth:`~Queue.Queue.task_done` and :meth:`~Queue.Queue.join`. .. method:: qsize() @@ -582,7 +582,7 @@ Equivalent to ``get(False)``. - :class:`multiprocessing.Queue` has a few additional methods not found in + :class:`~multiprocessing.Queue` has a few additional methods not found in :class:`Queue.Queue`. These methods are usually unnecessary for most code: @@ -612,7 +612,7 @@ .. class:: multiprocessing.queues.SimpleQueue() - It is a simplified :class:`Queue` type, very close to a locked :class:`Pipe`. + It is a simplified :class:`~multiprocessing.Queue` type, very close to a locked :class:`Pipe`. .. method:: empty() @@ -629,7 +629,7 @@ .. class:: JoinableQueue([maxsize]) - :class:`JoinableQueue`, a :class:`Queue` subclass, is a queue which + :class:`JoinableQueue`, a :class:`~multiprocessing.Queue` subclass, is a queue which additionally has :meth:`task_done` and :meth:`join` methods. .. method:: task_done() @@ -2084,7 +2084,7 @@ Bear in mind that a process that has put items in a queue will wait before terminating until all the buffered items are fed by the "feeder" thread to the underlying pipe. (The child process can call the - :meth:`Queue.cancel_join_thread` method of the queue to avoid this behaviour.) + :meth:`~multiprocessing.Queue.cancel_join_thread` method of the queue to avoid this behaviour.) This means that whenever you use a queue you need to make sure that all items which have been put on the queue will eventually be removed before the -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sat Feb 25 19:53:04 2012 From: python-checkins at python.org (armin.ronacher) Date: Sat, 25 Feb 2012 19:53:04 +0100 Subject: [Python-checkins] =?utf8?q?peps=3A_Added_unicode_literals_pepe?= Message-ID: http://hg.python.org/peps/rev/506fb28ce80f changeset: 4082:506fb28ce80f user: Armin Ronacher date: Sat Feb 25 18:52:45 2012 +0000 summary: Added unicode literals pepe files: pep-0414.txt | 256 +++++++++++++++++++++++++++++++++++++++ 1 files changed, 256 insertions(+), 0 deletions(-) diff --git a/pep-0414.txt b/pep-0414.txt new file mode 100644 --- /dev/null +++ b/pep-0414.txt @@ -0,0 +1,256 @@ +PEP: 414 +Title: Explicit Unicode Literal for Python 3.3 +Version: $Revision$ +Last-Modified: $Date$ +Author: Armin Ronacher +Status: Draft +Type: Standards Track +Content-Type: text/x-rst +Created: 15-Feb-2012 + + +Abstract +======== + +This document proposes the reintegration of an explicit unicode literal +from Python 2.x to the Python 3.x language specification, in order to +enable side-by-side support of libraries for both Python 2 and Python 3 +without the need for an explicit 2to3 run. + + +Rationale and Goals +=================== + +Python 3 is a major new revision of the language, and it was decided very +early on that breaking backwards compatibility was part of the design. The +migration from a Python 2.x to a Python 3 codebase is to be accomplished +with the aid of a separate translation tool that converts the Python 2.x +sourcecode to Python 3 syntax. With more and more libraries supporting +Python 3, however, it has become clear that 2to3 as a tool is +insufficient, and people are now attempting to find ways to make the same +source work in both Python 2.x and Python 3.x, with varying levels of +success. + +Python 2.6 and Python 2.7 support syntax features from Python 3 which for +the most part make a unified code base possible. Many thought that the +``unicode_literals`` future import might make a common source possible, +but it turns out that it's doing more harm than good. + +With the design of the updated WSGI specification a few new terms for +strings were loosely defined: unicode strings, byte strings and native +strings. In Python 3 the native string type is unicode, in Python 2 the +native string type is a bytestring. These native string types are used in +a couple of places. The native string type can be interned and is +preferably used for identifier names, filenames, source code and a few +other low level interpreter operations such as the return value of a +``__repr__`` or exception messages. + +In Python 2.7 these string types can be defined explicitly. Without any +future imports ``b'foo'`` means bytestring, ``u'foo'`` declares a unicode +string and ``'foo'`` a native string which in Python 2.x means bytes. +With the ``unicode_literals`` import the native string type is no longer +available and has to be incorrectly labeled as bytestring. If such a +codebase is then used in Python 3, the interpreter will start using byte +objects in places where they are no longer accepted (such as identifiers). +This can be solved by a module that detects 2.x and 3.x and provides +wrapper functions that transcode literals at runtime. Unfortunately, this +has the side effect of slowing down the runtime performance of Python and +makes for less beautiful code. Considering that Python 2 and Python 3 +support for most libraries will have to continue side by side for several +more years to come, this means that such modules lose one of Python's key +properties: easily readable and understandable code. + +Additionally, the vast majority of people who maintain Python 2.x +codebases are more familiar with Python 2.x semantics, and a per-file +difference in literal meanings will be very annoying for them in the long +run. A quick poll on Twitter about the use of the division future import +supported my suspicions that people opt out of behaviour-changing future +imports because they are a maintenance burden. Every time you review code +you have to check the top of the file to see if the behaviour was changed. +Obviously that was an unscientific informal poll, but it might be +something worth considering. + +Proposed Solution +================= + +The idea is to support (with Python 3.3) an explicit ``u`` and ``U`` +prefix for native strings in addition to the prefix-less variants. These +would stick around for the entirety of the Python 3 lifetime but might at +some point yield deprecation warnings if deemed appropriate. This could +be something for pyflakes or other similar libraries to support. + +Python 3.2 and earlier +====================== + +An argument against this proposal was made on the Python-Dev mailinglist, +mentioning that Ubuntu LTS will ship Python 3.2 and 2.7 for only 5 years. +The counterargument is that Python 2.7 is currently the Python version of +choice for users who want LTS support. As it stands, Python 3 is +currently a bad choice for long-term investments, since the ecosystem is +not yet properly developed, and libraries are still fighting with their +API decisions for Python 3. + +A valid point is that this would encourage people to become dependent on +Python 3.3 for their ports. Fortunately that is not a big problem since +that could be fixed at installation time similar to how many projects are +currently invoking 2to3 as part of their installation process. + +For Python 3.1 and Python 3.2 (even 3.0 if necessary) a simple +on-installation hook could be provided that tokenizes all source files and +strips away the otherwise unnecessary ``u`` prefix at installation time. + +Who Benefits? +============= + +There are a couple of places where decisions have to be made for or +against unicode support almost arbitrarily. This is mostly the case for +protocols that do not support unicode all the way down, or hide it behind +transport encodings that might or might not be unicode themselves. HTTP, +Email and WSGI are good examples of that. For certain ambiguous cases it +would be possible to apply the same logic for unicode that Python 3 +applies to the Python 2 versions of the library as well but, if those +details were exposed to the user of the API, it would mean breaking +compatibility for existing users of the Python 2 API which is a no-go for +many situations. The automatic upgrading of binary strings to unicode +strings that would be enabled by this proposal would make it much easier +to port such libraries over. + +Not only the libraries but also the users of these APIs would benefit from +that. For instance, the urllib module in Python 2 is using byte strings, +and the one in Python 3 is using unicode strings. By leveraging a native +string, users can avoid having to adjust for that. + +Problems with 2to3 +================== + +In practice 2to3 currently suffers from a few problems which make it +unnecessarily difficult and/or unpleasant to use: + +- Bad overall performance. In many cases 2to3 runs one or two orders of + magnitude slower than the testsuite for the library or application + it's testing. +- Slightly different behaviour in 2to3 between different versions of + Python cause different outcomes when paired with custom fixers. +- Line numbers from error messages do not match up with the real source + lines due to added/rewritten imports. +- extending 2to3 with custom fixers is nontrivial without using + distribute. By default 2to3 works acceptably well for upgrading + byte-based APIs to unicode based APIs but it fails to upgrade APIs + which already support unicode to Python 3:: + + --- test.py (original) + +++ test.py (refactored) + @@ -1,5 +1,5 @@ + class Foo(object): + def __unicode__(self): + - return u'test' + + return 'test' + def __str__(self): + - return unicode(self).encode('utf-8') + + return str(self).encode('utf-8') + + +APIs and Concepts Using Native Strings +====================================== + +The following is an incomplete list of APIs and general concepts that use +native strings and need implicit upgrading to unicode in Python 3, and +which would directly benefit from this support: + +- Python identifiers (dict keys, class names, module names, import + paths) +- URLs for the most part as well as HTTP headers in urllib/http servers +- WSGI environment keys and CGI-inherited values +- Python source code for dynamic compilation and AST hacks +- Exception messages +- ``__repr__`` return value +- preferred filesystem paths +- preferred OS environment + + +Modernizing Code +================ + +The 2to3 tool can be easily adjusted to generate code that runs on both +Python 2 and Python 3. An experimental extension to 2to3 which only +modernizes Python code to the extent that it runs on Python 2.7 or later +with support for the ``six`` library is available as python-modernize +[1]_. For most cases the runtime impact of ``six`` can be neglected (like +a function that calls ``iteritems()`` on a passed dictionary under 2.x or +``items()`` under 3.x), but to make strings cheap for both 2.x and 3.x it +is nearly impossible. The way it currently works is by abusing the +``unicode-escape`` codec on Python 2.x native strings. This is especially +ugly if such a string literal is used in a tight loop. + +This proposal would fix this. The modernize module could easily be +adjusted to simply not translate unicode strings, and the runtime overhead +would disappear. + +Possible Downsides +================== + +The obvious downside for this is that potential Python 3 users would have +to be aware of the fact that ``u`` is an optional prefix for strings. +This is something that Python 3 in general tried to avoid. The second +inequality comparison operator was removed, the ``L`` prefix for long +integers etc. This PEP would propose a slight revert on that practice by +reintroducing redundant syntax. On the other hand, Python already has +multiple literals for strings with mostly the same behavior (single +quoted, double quoted, single triple quoted, double triple quoted). + +Runtime Overhead of Wrappers +============================ + +I did some basic timings on the performance of a ``u()`` wrapper function +as used by the `six` library. The implementation of ``u()`` is as +follows:: + + if sys.version_info >= (3, 0): + def u(value): + return value + else: + def u(value): + return unicode(value, 'unicode-escape') + +The intention is that ``u'foo'`` can be turned to ``u('foo')`` and that on +Python 2.x an implicit decoding happens. In this case the wrapper will +have a decoding overhead for Python 2.x. I did some basic timings [2]_ to +see how bad the performance loss would be. The following examples measure +the execution time over 10000 iterations:: + + u'\N{SNOWMAN}barbaz' 1000 loops, best of 3: 295 usec per loop + u('\N{SNOWMAN}barbaz') 10 loops, best of 3: 18.5 msec per loop + u'foobarbaz_%d' % x 100 loops, best of 3: 8.32 msec per loop + u('foobarbaz_%d') % x 10 loops, best of 3: 25.6 msec per loop + u'f??barbaz' 1000 loops, best of 3: 289 usec per loop + u('f??barbaz') 100 loops, best of 3: 15.1 msec per loop + u'foobarbaz' 1000 loops, best of 3: 294 usec per loop + u('foobarbaz') 100 loops, best of 3: 14.3 msec per loop + +The overhead of the wrapper function in Python 3 is the price of a +function call since the function only has to return the argument +unchanged. + + +References +========== + +.. [1] Python-Modernize + (http://github.com/mitsuhiko/python-modernize) +.. [2] Benchmark + (https://github.com/mitsuhiko/unicode-literals-pep/blob/master/timing.py) + + +Copyright +========= + +This document has been placed in the public domain. + + +.. + Local Variables: + mode: indented-text + indent-tabs-mode: nil + sentence-end-double-space: t + fill-column: 70 + End: -- Repository URL: http://hg.python.org/peps From python-checkins at python.org Sat Feb 25 20:02:40 2012 From: python-checkins at python.org (armin.ronacher) Date: Sat, 25 Feb 2012 20:02:40 +0100 Subject: [Python-checkins] =?utf8?q?peps=3A_Consistent_quotes_for_=22six?= =?utf8?q?=22_in_pep_0414?= Message-ID: http://hg.python.org/peps/rev/606470f2d09a changeset: 4083:606470f2d09a user: Armin Ronacher date: Sat Feb 25 19:02:36 2012 +0000 summary: Consistent quotes for "six" in pep 0414 files: pep-0414.txt | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/pep-0414.txt b/pep-0414.txt --- a/pep-0414.txt +++ b/pep-0414.txt @@ -202,7 +202,7 @@ ============================ I did some basic timings on the performance of a ``u()`` wrapper function -as used by the `six` library. The implementation of ``u()`` is as +as used by the ``six`` library. The implementation of ``u()`` is as follows:: if sys.version_info >= (3, 0): -- Repository URL: http://hg.python.org/peps From solipsis at pitrou.net Sun Feb 26 03:34:00 2012 From: solipsis at pitrou.net (solipsis at pitrou.net) Date: Sun, 26 Feb 2012 03:34:00 +0100 Subject: [Python-checkins] Daily reference leaks (39ddcc5c7fb9): sum=0 Message-ID: results for 39ddcc5c7fb9 on branch "default" -------------------------------------------- Command line was: ['./python', '-m', 'test.regrtest', '-uall', '-R', '3:3:/home/antoine/cpython/refleaks/reflog5AuqZd', '-x'] From python-checkins at python.org Sun Feb 26 03:49:06 2012 From: python-checkins at python.org (eric.araujo) Date: Sun, 26 Feb 2012 03:49:06 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=282=2E7=29=3A_Improve_interli?= =?utf8?q?nking_of_archiving/compression_modules_docs=2E?= Message-ID: http://hg.python.org/cpython/rev/7c22281e967c changeset: 75264:7c22281e967c branch: 2.7 parent: 75257:020364d3e359 user: ?ric Araujo date: Sun Feb 26 01:10:14 2012 +0100 summary: Improve interlinking of archiving/compression modules docs. - Remove duplicate list of links to the other modules from each module?s doc (people can already go up to library/archiving and there they can see the list). - Link to shutil high-level operations. Reviewed by Nadeem Vawda in #6715. files: Doc/library/archiving.rst | 1 + Doc/library/bz2.rst | 3 --- Doc/library/gzip.rst | 3 --- Doc/library/shutil.rst | 16 ++++++++++++---- Doc/library/tarfile.rst | 3 ++- Doc/library/zipfile.rst | 3 --- Doc/library/zlib.rst | 4 +--- 7 files changed, 16 insertions(+), 17 deletions(-) diff --git a/Doc/library/archiving.rst b/Doc/library/archiving.rst --- a/Doc/library/archiving.rst +++ b/Doc/library/archiving.rst @@ -7,6 +7,7 @@ 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. .. toctree:: diff --git a/Doc/library/bz2.rst b/Doc/library/bz2.rst --- a/Doc/library/bz2.rst +++ b/Doc/library/bz2.rst @@ -14,9 +14,6 @@ It implements a complete file interface, one-shot (de)compression functions, and types for sequential (de)compression. -For other archive formats, see the :mod:`gzip`, :mod:`zipfile`, and -:mod:`tarfile` modules. - Here is a summary of the features offered by the bz2 module: * :class:`BZ2File` class implements a complete file interface, including diff --git a/Doc/library/gzip.rst b/Doc/library/gzip.rst --- a/Doc/library/gzip.rst +++ b/Doc/library/gzip.rst @@ -22,9 +22,6 @@ :program:`gzip` and :program:`gunzip` programs, such as those produced by :program:`compress` and :program:`pack`, are not supported by this module. -For other archive formats, see the :mod:`bz2`, :mod:`zipfile`, and -:mod:`tarfile` modules. - The module defines the following items: diff --git a/Doc/library/shutil.rst b/Doc/library/shutil.rst --- a/Doc/library/shutil.rst +++ b/Doc/library/shutil.rst @@ -31,6 +31,8 @@ are not copied. +.. _file-operations: + Directory and files operations ------------------------------ @@ -185,7 +187,7 @@ .. versionadded:: 2.3 -.. _shutil-example: +.. _copytree-example: copytree example :::::::::::::::: @@ -254,8 +256,13 @@ copytree(source, destination, ignore=_logpath) -Archives operations -------------------- +.. _archiving-operations: + +Archiving operations +-------------------- + +High-level utilities to create and read compressed and archived files are also +provided. They rely on the :mod:`zipfile` and :mod:`tarfile` modules. .. function:: make_archive(base_name, format, [root_dir, [base_dir, [verbose, [dry_run, [owner, [group, [logger]]]]]]]) @@ -322,6 +329,8 @@ .. versionadded:: 2.7 +.. _archiving-example: + Archiving example ::::::::::::::::: @@ -346,5 +355,3 @@ -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 - - diff --git a/Doc/library/tarfile.rst b/Doc/library/tarfile.rst --- a/Doc/library/tarfile.rst +++ b/Doc/library/tarfile.rst @@ -16,7 +16,8 @@ The :mod:`tarfile` module makes it possible to read and write tar archives, including those using gzip or bz2 compression. -(:file:`.zip` files can be read and written using the :mod:`zipfile` module.) +Use the :mod:`zipfile` module to read or write :file:`.zip` files, or the +higher-level functions in :ref:`shutil `. Some facts and figures: diff --git a/Doc/library/zipfile.rst b/Doc/library/zipfile.rst --- a/Doc/library/zipfile.rst +++ b/Doc/library/zipfile.rst @@ -25,9 +25,6 @@ create an encrypted file. Decryption is extremely slow as it is implemented in native Python rather than C. -For other archive formats, see the :mod:`bz2`, :mod:`gzip`, and -:mod:`tarfile` modules. - The module defines the following items: .. exception:: BadZipfile diff --git a/Doc/library/zlib.rst b/Doc/library/zlib.rst --- a/Doc/library/zlib.rst +++ b/Doc/library/zlib.rst @@ -19,9 +19,7 @@ consult the zlib manual at http://www.zlib.net/manual.html for authoritative information. -For reading and writing ``.gz`` files see the :mod:`gzip` module. For -other archive formats, see the :mod:`bz2`, :mod:`zipfile`, and -:mod:`tarfile` modules. +For reading and writing ``.gz`` files see the :mod:`gzip` module. The available exception and functions in this module are: -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Feb 26 03:49:07 2012 From: python-checkins at python.org (eric.araujo) Date: Sun, 26 Feb 2012 03:49:07 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=282=2E7=29=3A_Stop_ignoring_R?= =?utf8?q?PMs_in_distutils=27_upload_command_=28=232945=29=2E?= Message-ID: http://hg.python.org/cpython/rev/f606d722ca23 changeset: 75265:f606d722ca23 branch: 2.7 user: ?ric Araujo date: Sun Feb 26 01:16:47 2012 +0100 summary: Stop ignoring RPMs in distutils' upload command (#2945). Bug reported by Hartmut Goebel and patch contributed by Carl Robben. Untested backport of the fix committed and tested for 3.2. files: Lib/distutils/command/bdist_rpm.py | 12 ++++++++++++ Lib/distutils/tests/test_bdist_rpm.py | 9 +++++++++ Misc/ACKS | 1 + Misc/NEWS | 2 ++ 4 files changed, 24 insertions(+), 0 deletions(-) diff --git a/Lib/distutils/command/bdist_rpm.py b/Lib/distutils/command/bdist_rpm.py --- a/Lib/distutils/command/bdist_rpm.py +++ b/Lib/distutils/command/bdist_rpm.py @@ -379,16 +379,28 @@ self.spawn(rpm_cmd) if not self.dry_run: + if self.distribution.has_ext_modules(): + pyversion = get_python_version() + else: + pyversion = 'any' + if not self.binary_only: srpm = os.path.join(rpm_dir['SRPMS'], source_rpm) assert(os.path.exists(srpm)) self.move_file(srpm, self.dist_dir) + filename = os.path.join(self.dist_dir, source_rpm) + self.distribution.dist_files.append( + ('bdist_rpm', pyversion, filename)) if not self.source_only: for rpm in binary_rpms: rpm = os.path.join(rpm_dir['RPMS'], rpm) if os.path.exists(rpm): self.move_file(rpm, self.dist_dir) + filename = os.path.join(self.dist_dir, + os.path.basename(rpm)) + self.distribution.dist_files.append( + ('bdist_rpm', pyversion, filename)) # run() def _dist_path(self, path): diff --git a/Lib/distutils/tests/test_bdist_rpm.py b/Lib/distutils/tests/test_bdist_rpm.py --- a/Lib/distutils/tests/test_bdist_rpm.py +++ b/Lib/distutils/tests/test_bdist_rpm.py @@ -79,6 +79,10 @@ dist_created = os.listdir(os.path.join(pkg_dir, 'dist')) self.assertTrue('foo-0.1-1.noarch.rpm' in dist_created) + # bug #2945: upload ignores bdist_rpm files + self.assertIn(('bdist_rpm', 'any', 'dist/foo-0.1-1.src.rpm'), dist.dist_files) + self.assertIn(('bdist_rpm', 'any', 'dist/foo-0.1-1.noarch.rpm'), dist.dist_files) + def test_no_optimize_flag(self): # XXX I am unable yet to make this test work without @@ -118,6 +122,11 @@ dist_created = os.listdir(os.path.join(pkg_dir, 'dist')) self.assertTrue('foo-0.1-1.noarch.rpm' in dist_created) + + # bug #2945: upload ignores bdist_rpm files + self.assertIn(('bdist_rpm', 'any', 'dist/foo-0.1-1.src.rpm'), dist.dist_files) + self.assertIn(('bdist_rpm', 'any', 'dist/foo-0.1-1.noarch.rpm'), dist.dist_files) + os.remove(os.path.join(pkg_dir, 'dist', 'foo-0.1-1.noarch.rpm')) def test_suite(): diff --git a/Misc/ACKS b/Misc/ACKS --- a/Misc/ACKS +++ b/Misc/ACKS @@ -709,6 +709,7 @@ Juan M. Bello Rivas Davide Rizzo Anthony Roach +Carl Robben Mark Roberts Jim Robinson Andy Robinson diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -98,6 +98,8 @@ Library ------- +- Issue #2945: Make the distutils upload command aware of bdist_rpm products. + - Issue #13447: Add a test file to host regression tests for bugs in the scripts found in the Tools directory. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Feb 26 03:49:08 2012 From: python-checkins at python.org (eric.araujo) Date: Sun, 26 Feb 2012 03:49:08 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=282=2E7=29=3A_Hide_or_remove_?= =?utf8?q?user-visible_XXX_notes_from_distutils_doc_=28=2313716=29=2E?= Message-ID: http://hg.python.org/cpython/rev/e853ea9efc6e changeset: 75266:e853ea9efc6e branch: 2.7 user: ?ric Araujo date: Sun Feb 26 01:21:31 2012 +0100 summary: Hide or remove user-visible XXX notes from distutils doc (#13716). Requested by Florent Xicluna with the rationale that they make the docs look unfinished. When I get to replace the XXX notes with the real info for packaging, I?ll backport it. Also removed a few XXX notes that were not visible in the HTML but could waste contributors? time by suggesting improvements that are never going to happen for distutils. files: Doc/distutils/apiref.rst | 38 ++++++++------------------- 1 files changed, 11 insertions(+), 27 deletions(-) diff --git a/Doc/distutils/apiref.rst b/Doc/distutils/apiref.rst --- a/Doc/distutils/apiref.rst +++ b/Doc/distutils/apiref.rst @@ -444,7 +444,9 @@ Define a preprocessor macro for all compilations driven by this compiler object. The optional parameter *value* should be a string; if it is not supplied, then the macro will be defined without an explicit value and the exact outcome - depends on the compiler used (XXX true? does ANSI say anything about this?) + depends on the compiler used. + + .. XXX true? does ANSI say anything about this? .. method:: CCompiler.undefine_macro(name) @@ -598,7 +600,9 @@ *output_libname* should be a library name, not a filename; the filename will be inferred from the library name. *output_dir* is the directory where the library - file will be put. XXX defaults to what? + file will be put. + + .. XXX defaults to what? *debug* is a boolean; if true, debugging information will be included in the library (note that on most platforms, it is the compile step where this matters: @@ -718,30 +722,29 @@ Invokes :func:`distutils.util.execute` This method invokes a Python function *func* with the given arguments *args*, after logging and taking into account - the *dry_run* flag. XXX see also. + the *dry_run* flag. .. method:: CCompiler.spawn(cmd) Invokes :func:`distutils.util.spawn`. This invokes an external process to run - the given command. XXX see also. + the given command. .. method:: CCompiler.mkpath(name[, mode=511]) Invokes :func:`distutils.dir_util.mkpath`. This creates a directory and any - missing ancestor directories. XXX see also. + missing ancestor directories. .. method:: CCompiler.move_file(src, dst) - Invokes :meth:`distutils.file_util.move_file`. Renames *src* to *dst*. XXX see - also. + Invokes :meth:`distutils.file_util.move_file`. Renames *src* to *dst*. .. method:: CCompiler.announce(msg[, level=1]) - Write a message using :func:`distutils.log.debug`. XXX see also. + Write a message using :func:`distutils.log.debug`. .. method:: CCompiler.warn(msg) @@ -869,8 +872,6 @@ prefix of all files and directories in the archive. *root_dir* and *base_dir* both default to the current directory. Returns the name of the archive file. - .. XXX This should be changed to support bz2 files. - .. function:: make_tarball(base_name, base_dir[, compress='gzip', verbose=0, dry_run=0]) @@ -882,8 +883,6 @@ possibly plus the appropriate compression extension (:file:`.gz`, :file:`.bz2` or :file:`.Z`). Return the output filename. - .. XXX This should be replaced with calls to the :mod:`tarfile` module. - .. function:: make_zipfile(base_name, base_dir[, verbose=0, dry_run=0]) @@ -995,8 +994,6 @@ errors are ignored (apart from being reported to ``sys.stdout`` if *verbose* is true). -.. XXX Some of this could be replaced with the shutil module? - :mod:`distutils.file_util` --- Single file operations ===================================================== @@ -1110,8 +1107,6 @@ * ``macosx-10.6-intel`` - .. % XXX isn't this also provided by some other non-distutils module? - .. function:: convert_path(pathname) @@ -1311,8 +1306,6 @@ the "negative alias" of :option:`--verbose`, then :option:`--quiet` on the command line sets *verbose* to false. -.. XXX Should be replaced with :mod:`optparse`. - .. function:: fancy_getopt(options, negative_opt, object, args) @@ -1329,8 +1322,6 @@ Wraps *text* to less than *width* wide. - .. XXX Should be replaced with :mod:`textwrap` (which is available in Python - 2.3 and later). .. class:: FancyGetopt([option_table=None]) @@ -1394,10 +1385,6 @@ :synopsis: A simple logging mechanism, 282-style -.. XXX Should be replaced with standard :mod:`logging` module. - - - :mod:`distutils.spawn` --- Spawn a sub-process ============================================== @@ -1894,9 +1881,6 @@ :synopsis: Build the .py/.pyc files of a package -.. % todo - - :mod:`distutils.command.build_scripts` --- Build the scripts of a package ========================================================================= -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Feb 26 03:49:09 2012 From: python-checkins at python.org (eric.araujo) Date: Sun, 26 Feb 2012 03:49:09 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=282=2E7=29=3A_Mark_up_constan?= =?utf8?q?ts_in_socket_doc_as_such?= Message-ID: http://hg.python.org/cpython/rev/bb3c228302d0 changeset: 75267:bb3c228302d0 branch: 2.7 user: ?ric Araujo date: Sun Feb 26 01:25:11 2012 +0100 summary: Mark up constants in socket doc as such files: Doc/library/socket.rst | 14 +++++++------- 1 files changed, 7 insertions(+), 7 deletions(-) diff --git a/Doc/library/socket.rst b/Doc/library/socket.rst --- a/Doc/library/socket.rst +++ b/Doc/library/socket.rst @@ -72,17 +72,17 @@ tuple, and the fields depend on the address type. The general tuple form is ``(addr_type, v1, v2, v3 [, scope])``, where: - - *addr_type* is one of TIPC_ADDR_NAMESEQ, TIPC_ADDR_NAME, or - TIPC_ADDR_ID. - - *scope* is one of TIPC_ZONE_SCOPE, TIPC_CLUSTER_SCOPE, and - TIPC_NODE_SCOPE. - - If *addr_type* is TIPC_ADDR_NAME, then *v1* is the server type, *v2* is + - *addr_type* is one of :const;`TIPC_ADDR_NAMESEQ`, :const:`TIPC_ADDR_NAME`, + or :const:`TIPC_ADDR_ID`. + - *scope* is one of :const:`TIPC_ZONE_SCOPE`, :const:`TIPC_CLUSTER_SCOPE`, + and :const:`TIPC_NODE_SCOPE`. + - If *addr_type* is :const:`TIPC_ADDR_NAME`, then *v1* is the server type, *v2* is the port identifier, and *v3* should be 0. - If *addr_type* is TIPC_ADDR_NAMESEQ, then *v1* is the server type, *v2* + If *addr_type* is :const:`TIPC_ADDR_NAMESEQ`, then *v1* is the server type, *v2* is the lower port number, and *v3* is the upper port number. - If *addr_type* is TIPC_ADDR_ID, then *v1* is the node, *v2* is the + If *addr_type* is :const:`TIPC_ADDR_ID`, then *v1* is the node, *v2* is the reference, and *v3* should be set to 0. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Feb 26 03:49:10 2012 From: python-checkins at python.org (eric.araujo) Date: Sun, 26 Feb 2012 03:49:10 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=282=2E7=29=3A_Fix_instruction?= =?utf8?q?s_on_how_to_rebuild_some_modules?= Message-ID: http://hg.python.org/cpython/rev/05a808bc6867 changeset: 75268:05a808bc6867 branch: 2.7 user: ?ric Araujo date: Sun Feb 26 01:26:09 2012 +0100 summary: Fix instructions on how to rebuild some modules files: Lib/keyword.py | 2 +- Lib/symbol.py | 2 +- Lib/token.py | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Lib/keyword.py b/Lib/keyword.py --- a/Lib/keyword.py +++ b/Lib/keyword.py @@ -7,7 +7,7 @@ To update the symbols in this file, 'cd' to the top directory of the python source tree after building the interpreter and run: - python Lib/keyword.py + ./python Lib/keyword.py """ __all__ = ["iskeyword", "kwlist"] diff --git a/Lib/symbol.py b/Lib/symbol.py --- a/Lib/symbol.py +++ b/Lib/symbol.py @@ -7,7 +7,7 @@ # To update the symbols in this file, 'cd' to the top directory of # the python source tree after building the interpreter and run: # -# python Lib/symbol.py +# ./python Lib/symbol.py #--start constants-- single_input = 256 diff --git a/Lib/token.py b/Lib/token.py --- a/Lib/token.py +++ b/Lib/token.py @@ -7,7 +7,7 @@ # To update the symbols in this file, 'cd' to the top directory of # the python source tree after building the interpreter and run: # -# python Lib/token.py +# ./python Lib/token.py #--start constants-- ENDMARKER = 0 -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Feb 26 03:49:10 2012 From: python-checkins at python.org (eric.araujo) Date: Sun, 26 Feb 2012 03:49:10 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=282=2E7=29=3A_Update_lingerin?= =?utf8?q?g_references_to_ex-parrot=2E__I_mean_ex-devguide=2E?= Message-ID: http://hg.python.org/cpython/rev/05f94e7e3b49 changeset: 75269:05f94e7e3b49 branch: 2.7 user: ?ric Araujo date: Sun Feb 26 01:28:34 2012 +0100 summary: Update lingering references to ex-parrot. I mean ex-devguide. files: Lib/locale.py | 3 +-- Misc/python.man | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/Lib/locale.py b/Lib/locale.py --- a/Lib/locale.py +++ b/Lib/locale.py @@ -1581,8 +1581,7 @@ # to include every locale up to Windows Vista. # # NOTE: this mapping is incomplete. If your language is missing, please -# submit a bug report to Python bug manager, which you can find via: -# http://www.python.org/dev/ +# submit a bug report to the Python bug tracker at http://bugs.python.org/ # Make sure you include the missing language identifier and the suggested # locale code. # diff --git a/Misc/python.man b/Misc/python.man --- a/Misc/python.man +++ b/Misc/python.man @@ -459,7 +459,7 @@ .br Documentation: http://docs.python.org/ .br -Developer resources: http://www.python.org/dev/ +Developer resources: http://docs.python.org/devguide/ .br Downloads: http://python.org/download/ .br -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Feb 26 03:49:11 2012 From: python-checkins at python.org (eric.araujo) Date: Sun, 26 Feb 2012 03:49:11 +0100 Subject: [Python-checkins] =?utf8?b?Y3B5dGhvbiAoMi43KTogRml4IHR5cG8gKCMx?= =?utf8?q?3467=29?= Message-ID: http://hg.python.org/cpython/rev/c78b41fa5258 changeset: 75270:c78b41fa5258 branch: 2.7 user: ?ric Araujo date: Sun Feb 26 01:29:09 2012 +0100 summary: Fix typo (#13467) files: Doc/library/sysconfig.rst | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Doc/library/sysconfig.rst b/Doc/library/sysconfig.rst --- a/Doc/library/sysconfig.rst +++ b/Doc/library/sysconfig.rst @@ -129,7 +129,7 @@ one may call this function and get the default value. If *scheme* is provided, it must be a value from the list returned by - :func:`get_path_names`. Otherwise, the default scheme for the current + :func:`get_scheme_names`. Otherwise, the default scheme for the current platform is used. If *vars* is provided, it must be a dictionary of variables that will update -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Feb 26 03:49:11 2012 From: python-checkins at python.org (eric.araujo) Date: Sun, 26 Feb 2012 03:49:11 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=282=2E7=29=3A_Use_raw_strings?= =?utf8?q?_for_docstrings_with_backslashes_in_ASCII_diagrams?= Message-ID: http://hg.python.org/cpython/rev/efe1824f4ca2 changeset: 75271:efe1824f4ca2 branch: 2.7 user: ?ric Araujo date: Sun Feb 26 01:33:22 2012 +0100 summary: Use raw strings for docstrings with backslashes in ASCII diagrams files: Lib/cookielib.py | 2 +- Lib/httplib.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Lib/cookielib.py b/Lib/cookielib.py --- a/Lib/cookielib.py +++ b/Lib/cookielib.py @@ -1,4 +1,4 @@ -"""HTTP cookie handling for web clients. +r"""HTTP cookie handling for web clients. This module has (now fairly distant) origins in Gisle Aas' Perl module HTTP::Cookies, from the libwww-perl library. diff --git a/Lib/httplib.py b/Lib/httplib.py --- a/Lib/httplib.py +++ b/Lib/httplib.py @@ -1,4 +1,4 @@ -"""HTTP/1.1 client library +r"""HTTP/1.1 client library -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Feb 26 03:49:14 2012 From: python-checkins at python.org (eric.araujo) Date: Sun, 26 Feb 2012 03:49:14 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=282=2E7=29=3A_Document_that_s?= =?utf8?q?hutil=2Emake=5Farchive_does_not_typecheck_its_logger_argument?= Message-ID: http://hg.python.org/cpython/rev/f3e4e9ffab88 changeset: 75272:f3e4e9ffab88 branch: 2.7 user: ?ric Araujo date: Sun Feb 26 01:33:49 2012 +0100 summary: Document that shutil.make_archive does not typecheck its logger argument files: Doc/library/shutil.rst | 3 ++- 1 files changed, 2 insertions(+), 1 deletions(-) diff --git a/Doc/library/shutil.rst b/Doc/library/shutil.rst --- a/Doc/library/shutil.rst +++ b/Doc/library/shutil.rst @@ -285,7 +285,8 @@ *owner* and *group* are used when creating a tar archive. By default, uses the current owner and group. - *logger* is an instance of :class:`logging.Logger`. + *logger* must be an object compatible with :pep:`282`, usually an instance of + :class:`logging.Logger`. .. versionadded:: 2.7 -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Feb 26 03:49:15 2012 From: python-checkins at python.org (eric.araujo) Date: Sun, 26 Feb 2012 03:49:15 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=282=2E7=29=3A_Avoid_relying_o?= =?utf8?q?n_the_default_reST_role_in_logging_library_doc?= Message-ID: http://hg.python.org/cpython/rev/f9089a5fa14b changeset: 75273:f9089a5fa14b branch: 2.7 user: ?ric Araujo date: Sun Feb 26 01:36:31 2012 +0100 summary: Avoid relying on the default reST role in logging library doc files: Doc/library/logging.rst | 5 ++--- 1 files changed, 2 insertions(+), 3 deletions(-) diff --git a/Doc/library/logging.rst b/Doc/library/logging.rst --- a/Doc/library/logging.rst +++ b/Doc/library/logging.rst @@ -915,12 +915,11 @@ If *capture* is ``True``, warnings issued by the :mod:`warnings` module will be redirected to the logging system. Specifically, a warning will be formatted using :func:`warnings.formatwarning` and the resulting string - logged to a logger named 'py.warnings' with a severity of `WARNING`. + logged to a logger named ``'py.warnings'`` with a severity of :const:`WARNING`. If *capture* is ``False``, the redirection of warnings to the logging system will stop, and warnings will be redirected to their original destinations - (i.e. those in effect before `captureWarnings(True)` was called). - + (i.e. those in effect before ``captureWarnings(True)`` was called). .. seealso:: -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Feb 26 03:49:17 2012 From: python-checkins at python.org (eric.araujo) Date: Sun, 26 Feb 2012 03:49:17 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=282=2E7=29=3A_Update_docstrin?= =?utf8?q?g_with_more_useful_text_=28from_the_PEP=29?= Message-ID: http://hg.python.org/cpython/rev/e14adec6724d changeset: 75274:e14adec6724d branch: 2.7 user: ?ric Araujo date: Sun Feb 26 01:37:47 2012 +0100 summary: Update docstring with more useful text (from the PEP) files: Lib/numbers.py | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Lib/numbers.py b/Lib/numbers.py --- a/Lib/numbers.py +++ b/Lib/numbers.py @@ -303,7 +303,7 @@ raise NotImplementedError def __index__(self): - """index(self)""" + """Called whenever an index is needed, such as in slicing""" return long(self) @abstractmethod -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Feb 26 03:49:20 2012 From: python-checkins at python.org (eric.araujo) Date: Sun, 26 Feb 2012 03:49:20 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=282=2E7=29=3A_State_explicite?= =?utf8?q?ly_that_PYTHONDONTWRITEBYTECODE_is_equivalent_to_-B?= Message-ID: http://hg.python.org/cpython/rev/26ca56b10c2b changeset: 75275:26ca56b10c2b branch: 2.7 user: ?ric Araujo date: Sun Feb 26 01:38:26 2012 +0100 summary: State explicitely that PYTHONDONTWRITEBYTECODE is equivalent to -B files: Doc/using/cmdline.rst | 3 ++- 1 files changed, 2 insertions(+), 1 deletions(-) diff --git a/Doc/using/cmdline.rst b/Doc/using/cmdline.rst --- a/Doc/using/cmdline.rst +++ b/Doc/using/cmdline.rst @@ -541,7 +541,8 @@ .. envvar:: PYTHONDONTWRITEBYTECODE If this is set, Python won't try to write ``.pyc`` or ``.pyo`` files on the - import of source modules. + import of source modules. This is equivalent to specifying the :option:`-B` + option. .. versionadded:: 2.6 -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Feb 26 03:49:20 2012 From: python-checkins at python.org (eric.araujo) Date: Sun, 26 Feb 2012 03:49:20 +0100 Subject: [Python-checkins] =?utf8?b?Y3B5dGhvbiAoMi43KTogRml4IHR5cG8g4oCc?= =?utf8?b?c2VwZXJhdG9y4oCd?= Message-ID: http://hg.python.org/cpython/rev/da1517e71178 changeset: 75276:da1517e71178 branch: 2.7 user: ?ric Araujo date: Sun Feb 26 01:41:39 2012 +0100 summary: Fix typo ?seperator? files: Lib/_pyio.py | 2 +- Modules/_io/_iomodule.c | 2 +- Modules/_io/textio.c | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Lib/_pyio.py b/Lib/_pyio.py --- a/Lib/_pyio.py +++ b/Lib/_pyio.py @@ -1451,7 +1451,7 @@ enabled. With this enabled, on input, the lines endings '\n', '\r', or '\r\n' are translated to '\n' before being returned to the caller. Conversely, on output, '\n' is translated to the system - default line seperator, os.linesep. If newline is any other of its + default line separator, os.linesep. If newline is any other of its legal values, that newline becomes the newline when the file is read and it is returned untranslated. On output, '\n' is converted to the newline. diff --git a/Modules/_io/_iomodule.c b/Modules/_io/_iomodule.c --- a/Modules/_io/_iomodule.c +++ b/Modules/_io/_iomodule.c @@ -58,7 +58,7 @@ "\n" "At the top of the I/O hierarchy is the abstract base class IOBase. It\n" "defines the basic interface to a stream. Note, however, that there is no\n" -"seperation between reading and writing to streams; implementations are\n" +"separation between reading and writing to streams; implementations are\n" "allowed to throw an IOError if they do not support a given operation.\n" "\n" "Extending IOBase is RawIOBase which deals simply with the reading and\n" diff --git a/Modules/_io/textio.c b/Modules/_io/textio.c --- a/Modules/_io/textio.c +++ b/Modules/_io/textio.c @@ -627,7 +627,7 @@ "enabled. With this enabled, on input, the lines endings '\\n', '\\r',\n" "or '\\r\\n' are translated to '\\n' before being returned to the\n" "caller. Conversely, on output, '\\n' is translated to the system\n" - "default line seperator, os.linesep. If newline is any other of its\n" + "default line separator, os.linesep. If newline is any other of its\n" "legal values, that newline becomes the newline when the file is read\n" "and it is returned untranslated. On output, '\\n' is converted to the\n" "newline.\n" -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Feb 26 03:49:21 2012 From: python-checkins at python.org (eric.araujo) Date: Sun, 26 Feb 2012 03:49:21 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=282=2E7=29=3A_Synchronize_som?= =?utf8?q?e_distutils_tests_with_3=2E2=2E?= Message-ID: http://hg.python.org/cpython/rev/8214bdb48c52 changeset: 75277:8214bdb48c52 branch: 2.7 user: ?ric Araujo date: Sun Feb 26 01:53:53 2012 +0100 summary: Synchronize some distutils tests with 3.2. - Actually check the contents of the file created by bdist_dumb. - Don?t use ?RECORD? as filename for non-PEP 376 record file - Don?t start method name with ?_test?, it looks like a disabled test method instead of an helper method - Fix some idioms (assertIn, addCleanup) files: Lib/distutils/tests/test_bdist_dumb.py | 24 ++++++--- Lib/distutils/tests/test_install.py | 35 ++++++------- Lib/distutils/tests/test_sdist.py | 10 ++-- 3 files changed, 38 insertions(+), 31 deletions(-) diff --git a/Lib/distutils/tests/test_bdist_dumb.py b/Lib/distutils/tests/test_bdist_dumb.py --- a/Lib/distutils/tests/test_bdist_dumb.py +++ b/Lib/distutils/tests/test_bdist_dumb.py @@ -1,8 +1,10 @@ """Tests for distutils.command.bdist_dumb.""" +import os +import sys +import zipfile import unittest -import sys -import os +from test.test_support import run_unittest # zlib is not used here, but if it's not available # test_simple_built will fail @@ -11,8 +13,6 @@ except ImportError: zlib = None -from test.test_support import run_unittest - from distutils.core import Distribution from distutils.command.bdist_dumb import bdist_dumb from distutils.tests import support @@ -73,15 +73,23 @@ # see what we have dist_created = os.listdir(os.path.join(pkg_dir, 'dist')) - base = "%s.%s" % (dist.get_fullname(), cmd.plat_name) + base = "%s.%s.zip" % (dist.get_fullname(), cmd.plat_name) if os.name == 'os2': base = base.replace(':', '-') - wanted = ['%s.zip' % base] - self.assertEqual(dist_created, wanted) + self.assertEqual(dist_created, [base]) # now let's check what we have in the zip file - # XXX to be done + fp = zipfile.ZipFile(os.path.join('dist', base)) + try: + contents = fp.namelist() + finally: + fp.close() + + contents = sorted(os.path.basename(fn) for fn in contents) + wanted = ['foo-0.1-py%s.%s.egg-info' % sys.version_info[:2], + 'foo.py', 'foo.pyc'] + self.assertEqual(contents, sorted(wanted)) def test_finalize_options(self): pkg_dir, dist = self.create_dist() diff --git a/Lib/distutils/tests/test_install.py b/Lib/distutils/tests/test_install.py --- a/Lib/distutils/tests/test_install.py +++ b/Lib/distutils/tests/test_install.py @@ -86,19 +86,17 @@ self.old_expand = os.path.expanduser os.path.expanduser = _expanduser - try: - # this is the actual test - self._test_user_site() - finally: + def cleanup(): site.USER_BASE = self.old_user_base site.USER_SITE = self.old_user_site install_module.USER_BASE = self.old_user_base install_module.USER_SITE = self.old_user_site os.path.expanduser = self.old_expand - def _test_user_site(self): + self.addCleanup(cleanup) + for key in ('nt_user', 'unix_user', 'os2_home'): - self.assertTrue(key in INSTALL_SCHEMES) + self.assertIn(key, INSTALL_SCHEMES) dist = Distribution({'name': 'xx'}) cmd = install(dist) @@ -106,14 +104,14 @@ # making sure the user option is there options = [name for name, short, lable in cmd.user_options] - self.assertTrue('user' in options) + self.assertIn('user', options) # setting a value cmd.user = 1 # user base and site shouldn't be created yet - self.assertTrue(not os.path.exists(self.user_base)) - self.assertTrue(not os.path.exists(self.user_site)) + self.assertFalse(os.path.exists(self.user_base)) + self.assertFalse(os.path.exists(self.user_site)) # let's run finalize cmd.ensure_finalized() @@ -122,8 +120,8 @@ self.assertTrue(os.path.exists(self.user_base)) self.assertTrue(os.path.exists(self.user_site)) - self.assertTrue('userbase' in cmd.config_vars) - self.assertTrue('usersite' in cmd.config_vars) + self.assertIn('userbase', cmd.config_vars) + self.assertIn('usersite', cmd.config_vars) def test_handle_extra_path(self): dist = Distribution({'name': 'xx', 'extra_path': 'path,dirs'}) @@ -176,15 +174,16 @@ def test_record(self): install_dir = self.mkdtemp() - project_dir, dist = self.create_dist(scripts=['hello']) - self.addCleanup(os.chdir, os.getcwd()) + project_dir, dist = self.create_dist(py_modules=['hello'], + scripts=['sayhi']) os.chdir(project_dir) - self.write_file('hello', "print('o hai')") + self.write_file('hello.py', "def main(): print 'o hai'") + self.write_file('sayhi', 'from hello import main; main()') cmd = install(dist) dist.command_obj['install'] = cmd cmd.root = install_dir - cmd.record = os.path.join(project_dir, 'RECORD') + cmd.record = os.path.join(project_dir, 'filelist') cmd.ensure_finalized() cmd.run() @@ -195,7 +194,7 @@ f.close() found = [os.path.basename(line) for line in content.splitlines()] - expected = ['hello', + expected = ['hello.py', 'hello.pyc', 'sayhi', 'UNKNOWN-0.0.0-py%s.%s.egg-info' % sys.version_info[:2]] self.assertEqual(found, expected) @@ -203,7 +202,6 @@ install_dir = self.mkdtemp() project_dir, dist = self.create_dist(ext_modules=[ Extension('xx', ['xxmodule.c'])]) - self.addCleanup(os.chdir, os.getcwd()) os.chdir(project_dir) support.copy_xxmodule_c(project_dir) @@ -215,7 +213,7 @@ dist.command_obj['install'] = cmd dist.command_obj['build_ext'] = buildextcmd cmd.root = install_dir - cmd.record = os.path.join(project_dir, 'RECORD') + cmd.record = os.path.join(project_dir, 'filelist') cmd.ensure_finalized() cmd.run() @@ -241,6 +239,7 @@ install_module.DEBUG = False self.assertTrue(len(self.logs) > old_logs_len) + def test_suite(): return unittest.makeSuite(InstallTestCase) diff --git a/Lib/distutils/tests/test_sdist.py b/Lib/distutils/tests/test_sdist.py --- a/Lib/distutils/tests/test_sdist.py +++ b/Lib/distutils/tests/test_sdist.py @@ -6,6 +6,7 @@ import zipfile from os.path import join from textwrap import dedent +from test.test_support import captured_stdout, check_warnings, run_unittest # zlib is not used here, but if it's not available # the tests that use zipfile may fail @@ -21,7 +22,6 @@ except ImportError: UID_GID_SUPPORT = False -from test.test_support import captured_stdout, check_warnings, run_unittest from distutils.command.sdist import sdist, show_formats from distutils.core import Distribution @@ -375,7 +375,7 @@ # the following tests make sure there is a nice error message instead # of a traceback when parsing an invalid manifest template - def _test_template(self, content): + def _check_template(self, content): dist, cmd = self.get_cmd() os.chdir(self.tmp_dir) self.write_file('MANIFEST.in', content) @@ -386,17 +386,17 @@ self.assertEqual(len(warnings), 1) def test_invalid_template_unknown_command(self): - self._test_template('taunt knights *') + self._check_template('taunt knights *') def test_invalid_template_wrong_arguments(self): # this manifest command takes one argument - self._test_template('prune') + self._check_template('prune') @unittest.skipIf(os.name != 'nt', 'test relevant for Windows only') def test_invalid_template_wrong_path(self): # on Windows, trailing slashes are not allowed # this used to crash instead of raising a warning: #8286 - self._test_template('include examples/') + self._check_template('include examples/') @unittest.skipUnless(zlib, "requires zlib") def test_get_file_list(self): -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Feb 26 03:49:22 2012 From: python-checkins at python.org (eric.araujo) Date: Sun, 26 Feb 2012 03:49:22 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=282=2E7=29=3A_Fix_markup_erro?= =?utf8?q?rs?= Message-ID: http://hg.python.org/cpython/rev/ca6455c919e7 changeset: 75278:ca6455c919e7 branch: 2.7 user: ?ric Araujo date: Sun Feb 26 02:00:35 2012 +0100 summary: Fix markup errors files: Doc/library/sys.rst | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Doc/library/sys.rst b/Doc/library/sys.rst --- a/Doc/library/sys.rst +++ b/Doc/library/sys.rst @@ -208,7 +208,7 @@ be set at build time with the ``--exec-prefix`` argument to the :program:`configure` script. Specifically, all configuration files (e.g. the :file:`pyconfig.h` header file) are installed in the directory - :file:`{exec_prefix}/lib/python{X.Y}/config', and shared library modules are + :file:`{exec_prefix}/lib/python{X.Y}/config`, and shared library modules are installed in :file:`{exec_prefix}/lib/python{X.Y}/lib-dynload`, where *X.Y* is the version number of Python, for example ``2.7``. @@ -775,7 +775,7 @@ argument to the :program:`configure` script. The main collection of Python 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 + stored in :file:`{prefix}/include/python{X.Y}`, where *X.Y* is the version number of Python, for example ``2.7``. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Feb 26 03:49:22 2012 From: python-checkins at python.org (eric.araujo) Date: Sun, 26 Feb 2012 03:49:22 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=282=2E7=29=3A_Add_versionadde?= =?utf8?q?d_for_sys=2Eflags=2Ehash=5Frandomization_variable?= Message-ID: http://hg.python.org/cpython/rev/26a4cb0ff7c0 changeset: 75279:26a4cb0ff7c0 branch: 2.7 user: ?ric Araujo date: Sun Feb 26 02:03:39 2012 +0100 summary: Add versionadded for sys.flags.hash_randomization variable files: Doc/library/sys.rst | 3 ++- 1 files changed, 2 insertions(+), 1 deletions(-) diff --git a/Doc/library/sys.rst b/Doc/library/sys.rst --- a/Doc/library/sys.rst +++ b/Doc/library/sys.rst @@ -1,4 +1,3 @@ - :mod:`sys` --- System-specific parameters and functions ======================================================= @@ -291,6 +290,8 @@ .. versionadded:: 2.6 + .. versionadded:: 2.7.3 + The ``hash_randomization`` attribute. .. data:: float_info -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Feb 26 03:49:23 2012 From: python-checkins at python.org (eric.araujo) Date: Sun, 26 Feb 2012 03:49:23 +0100 Subject: [Python-checkins] =?utf8?b?Y3B5dGhvbiAobWVyZ2UgMi43IC0+IDIuNyk6?= =?utf8?q?_Branch_merge?= Message-ID: http://hg.python.org/cpython/rev/56f38775c59c changeset: 75280:56f38775c59c branch: 2.7 parent: 75263:5d4f2f994f75 parent: 75279:26a4cb0ff7c0 user: ?ric Araujo date: Sun Feb 26 03:48:36 2012 +0100 summary: Branch merge files: Doc/distutils/apiref.rst | 38 ++++--------- Doc/library/archiving.rst | 1 + Doc/library/bz2.rst | 3 - Doc/library/gzip.rst | 3 - Doc/library/logging.rst | 5 +- Doc/library/shutil.rst | 19 +++++- Doc/library/socket.rst | 14 ++-- Doc/library/sys.rst | 7 +- Doc/library/sysconfig.rst | 2 +- Doc/library/tarfile.rst | 3 +- Doc/library/zipfile.rst | 3 - Doc/library/zlib.rst | 4 +- Doc/using/cmdline.rst | 3 +- Lib/_pyio.py | 2 +- Lib/cookielib.py | 2 +- Lib/distutils/command/bdist_rpm.py | 12 ++++ Lib/distutils/tests/test_bdist_dumb.py | 24 +++++-- Lib/distutils/tests/test_bdist_rpm.py | 9 +++ Lib/distutils/tests/test_install.py | 35 ++++++------ Lib/distutils/tests/test_sdist.py | 10 +- Lib/httplib.py | 2 +- Lib/keyword.py | 2 +- Lib/locale.py | 3 +- Lib/numbers.py | 2 +- Lib/symbol.py | 2 +- Lib/token.py | 2 +- Misc/ACKS | 1 + Misc/NEWS | 2 + Misc/python.man | 2 +- Modules/_io/_iomodule.c | 2 +- Modules/_io/textio.c | 2 +- 31 files changed, 118 insertions(+), 103 deletions(-) diff --git a/Doc/distutils/apiref.rst b/Doc/distutils/apiref.rst --- a/Doc/distutils/apiref.rst +++ b/Doc/distutils/apiref.rst @@ -444,7 +444,9 @@ Define a preprocessor macro for all compilations driven by this compiler object. The optional parameter *value* should be a string; if it is not supplied, then the macro will be defined without an explicit value and the exact outcome - depends on the compiler used (XXX true? does ANSI say anything about this?) + depends on the compiler used. + + .. XXX true? does ANSI say anything about this? .. method:: CCompiler.undefine_macro(name) @@ -598,7 +600,9 @@ *output_libname* should be a library name, not a filename; the filename will be inferred from the library name. *output_dir* is the directory where the library - file will be put. XXX defaults to what? + file will be put. + + .. XXX defaults to what? *debug* is a boolean; if true, debugging information will be included in the library (note that on most platforms, it is the compile step where this matters: @@ -718,30 +722,29 @@ Invokes :func:`distutils.util.execute` This method invokes a Python function *func* with the given arguments *args*, after logging and taking into account - the *dry_run* flag. XXX see also. + the *dry_run* flag. .. method:: CCompiler.spawn(cmd) Invokes :func:`distutils.util.spawn`. This invokes an external process to run - the given command. XXX see also. + the given command. .. method:: CCompiler.mkpath(name[, mode=511]) Invokes :func:`distutils.dir_util.mkpath`. This creates a directory and any - missing ancestor directories. XXX see also. + missing ancestor directories. .. method:: CCompiler.move_file(src, dst) - Invokes :meth:`distutils.file_util.move_file`. Renames *src* to *dst*. XXX see - also. + Invokes :meth:`distutils.file_util.move_file`. Renames *src* to *dst*. .. method:: CCompiler.announce(msg[, level=1]) - Write a message using :func:`distutils.log.debug`. XXX see also. + Write a message using :func:`distutils.log.debug`. .. method:: CCompiler.warn(msg) @@ -869,8 +872,6 @@ prefix of all files and directories in the archive. *root_dir* and *base_dir* both default to the current directory. Returns the name of the archive file. - .. XXX This should be changed to support bz2 files. - .. function:: make_tarball(base_name, base_dir[, compress='gzip', verbose=0, dry_run=0]) @@ -882,8 +883,6 @@ possibly plus the appropriate compression extension (:file:`.gz`, :file:`.bz2` or :file:`.Z`). Return the output filename. - .. XXX This should be replaced with calls to the :mod:`tarfile` module. - .. function:: make_zipfile(base_name, base_dir[, verbose=0, dry_run=0]) @@ -995,8 +994,6 @@ errors are ignored (apart from being reported to ``sys.stdout`` if *verbose* is true). -.. XXX Some of this could be replaced with the shutil module? - :mod:`distutils.file_util` --- Single file operations ===================================================== @@ -1110,8 +1107,6 @@ * ``macosx-10.6-intel`` - .. % XXX isn't this also provided by some other non-distutils module? - .. function:: convert_path(pathname) @@ -1311,8 +1306,6 @@ the "negative alias" of :option:`--verbose`, then :option:`--quiet` on the command line sets *verbose* to false. -.. XXX Should be replaced with :mod:`optparse`. - .. function:: fancy_getopt(options, negative_opt, object, args) @@ -1329,8 +1322,6 @@ Wraps *text* to less than *width* wide. - .. XXX Should be replaced with :mod:`textwrap` (which is available in Python - 2.3 and later). .. class:: FancyGetopt([option_table=None]) @@ -1394,10 +1385,6 @@ :synopsis: A simple logging mechanism, 282-style -.. XXX Should be replaced with standard :mod:`logging` module. - - - :mod:`distutils.spawn` --- Spawn a sub-process ============================================== @@ -1894,9 +1881,6 @@ :synopsis: Build the .py/.pyc files of a package -.. % todo - - :mod:`distutils.command.build_scripts` --- Build the scripts of a package ========================================================================= diff --git a/Doc/library/archiving.rst b/Doc/library/archiving.rst --- a/Doc/library/archiving.rst +++ b/Doc/library/archiving.rst @@ -7,6 +7,7 @@ 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. .. toctree:: diff --git a/Doc/library/bz2.rst b/Doc/library/bz2.rst --- a/Doc/library/bz2.rst +++ b/Doc/library/bz2.rst @@ -14,9 +14,6 @@ It implements a complete file interface, one-shot (de)compression functions, and types for sequential (de)compression. -For other archive formats, see the :mod:`gzip`, :mod:`zipfile`, and -:mod:`tarfile` modules. - Here is a summary of the features offered by the bz2 module: * :class:`BZ2File` class implements a complete file interface, including diff --git a/Doc/library/gzip.rst b/Doc/library/gzip.rst --- a/Doc/library/gzip.rst +++ b/Doc/library/gzip.rst @@ -22,9 +22,6 @@ :program:`gzip` and :program:`gunzip` programs, such as those produced by :program:`compress` and :program:`pack`, are not supported by this module. -For other archive formats, see the :mod:`bz2`, :mod:`zipfile`, and -:mod:`tarfile` modules. - The module defines the following items: diff --git a/Doc/library/logging.rst b/Doc/library/logging.rst --- a/Doc/library/logging.rst +++ b/Doc/library/logging.rst @@ -915,12 +915,11 @@ If *capture* is ``True``, warnings issued by the :mod:`warnings` module will be redirected to the logging system. Specifically, a warning will be formatted using :func:`warnings.formatwarning` and the resulting string - logged to a logger named 'py.warnings' with a severity of `WARNING`. + logged to a logger named ``'py.warnings'`` with a severity of :const:`WARNING`. If *capture* is ``False``, the redirection of warnings to the logging system will stop, and warnings will be redirected to their original destinations - (i.e. those in effect before `captureWarnings(True)` was called). - + (i.e. those in effect before ``captureWarnings(True)`` was called). .. seealso:: diff --git a/Doc/library/shutil.rst b/Doc/library/shutil.rst --- a/Doc/library/shutil.rst +++ b/Doc/library/shutil.rst @@ -31,6 +31,8 @@ are not copied. +.. _file-operations: + Directory and files operations ------------------------------ @@ -185,7 +187,7 @@ .. versionadded:: 2.3 -.. _shutil-example: +.. _copytree-example: copytree example :::::::::::::::: @@ -254,8 +256,13 @@ copytree(source, destination, ignore=_logpath) -Archives operations -------------------- +.. _archiving-operations: + +Archiving operations +-------------------- + +High-level utilities to create and read compressed and archived files are also +provided. They rely on the :mod:`zipfile` and :mod:`tarfile` modules. .. function:: make_archive(base_name, format, [root_dir, [base_dir, [verbose, [dry_run, [owner, [group, [logger]]]]]]]) @@ -278,7 +285,8 @@ *owner* and *group* are used when creating a tar archive. By default, uses the current owner and group. - *logger* is an instance of :class:`logging.Logger`. + *logger* must be an object compatible with :pep:`282`, usually an instance of + :class:`logging.Logger`. .. versionadded:: 2.7 @@ -322,6 +330,8 @@ .. versionadded:: 2.7 +.. _archiving-example: + Archiving example ::::::::::::::::: @@ -346,5 +356,3 @@ -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 - - diff --git a/Doc/library/socket.rst b/Doc/library/socket.rst --- a/Doc/library/socket.rst +++ b/Doc/library/socket.rst @@ -72,17 +72,17 @@ tuple, and the fields depend on the address type. The general tuple form is ``(addr_type, v1, v2, v3 [, scope])``, where: - - *addr_type* is one of TIPC_ADDR_NAMESEQ, TIPC_ADDR_NAME, or - TIPC_ADDR_ID. - - *scope* is one of TIPC_ZONE_SCOPE, TIPC_CLUSTER_SCOPE, and - TIPC_NODE_SCOPE. - - If *addr_type* is TIPC_ADDR_NAME, then *v1* is the server type, *v2* is + - *addr_type* is one of :const;`TIPC_ADDR_NAMESEQ`, :const:`TIPC_ADDR_NAME`, + or :const:`TIPC_ADDR_ID`. + - *scope* is one of :const:`TIPC_ZONE_SCOPE`, :const:`TIPC_CLUSTER_SCOPE`, + and :const:`TIPC_NODE_SCOPE`. + - If *addr_type* is :const:`TIPC_ADDR_NAME`, then *v1* is the server type, *v2* is the port identifier, and *v3* should be 0. - If *addr_type* is TIPC_ADDR_NAMESEQ, then *v1* is the server type, *v2* + If *addr_type* is :const:`TIPC_ADDR_NAMESEQ`, then *v1* is the server type, *v2* is the lower port number, and *v3* is the upper port number. - If *addr_type* is TIPC_ADDR_ID, then *v1* is the node, *v2* is the + If *addr_type* is :const:`TIPC_ADDR_ID`, then *v1* is the node, *v2* is the reference, and *v3* should be set to 0. diff --git a/Doc/library/sys.rst b/Doc/library/sys.rst --- a/Doc/library/sys.rst +++ b/Doc/library/sys.rst @@ -1,4 +1,3 @@ - :mod:`sys` --- System-specific parameters and functions ======================================================= @@ -208,7 +207,7 @@ be set at build time with the ``--exec-prefix`` argument to the :program:`configure` script. Specifically, all configuration files (e.g. the :file:`pyconfig.h` header file) are installed in the directory - :file:`{exec_prefix}/lib/python{X.Y}/config', and shared library modules are + :file:`{exec_prefix}/lib/python{X.Y}/config`, and shared library modules are installed in :file:`{exec_prefix}/lib/python{X.Y}/lib-dynload`, where *X.Y* is the version number of Python, for example ``2.7``. @@ -291,6 +290,8 @@ .. versionadded:: 2.6 + .. versionadded:: 2.7.3 + The ``hash_randomization`` attribute. .. data:: float_info @@ -775,7 +776,7 @@ argument to the :program:`configure` script. The main collection of Python 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 + stored in :file:`{prefix}/include/python{X.Y}`, where *X.Y* is the version number of Python, for example ``2.7``. diff --git a/Doc/library/sysconfig.rst b/Doc/library/sysconfig.rst --- a/Doc/library/sysconfig.rst +++ b/Doc/library/sysconfig.rst @@ -129,7 +129,7 @@ one may call this function and get the default value. If *scheme* is provided, it must be a value from the list returned by - :func:`get_path_names`. Otherwise, the default scheme for the current + :func:`get_scheme_names`. Otherwise, the default scheme for the current platform is used. If *vars* is provided, it must be a dictionary of variables that will update diff --git a/Doc/library/tarfile.rst b/Doc/library/tarfile.rst --- a/Doc/library/tarfile.rst +++ b/Doc/library/tarfile.rst @@ -16,7 +16,8 @@ The :mod:`tarfile` module makes it possible to read and write tar archives, including those using gzip or bz2 compression. -(:file:`.zip` files can be read and written using the :mod:`zipfile` module.) +Use the :mod:`zipfile` module to read or write :file:`.zip` files, or the +higher-level functions in :ref:`shutil `. Some facts and figures: diff --git a/Doc/library/zipfile.rst b/Doc/library/zipfile.rst --- a/Doc/library/zipfile.rst +++ b/Doc/library/zipfile.rst @@ -25,9 +25,6 @@ create an encrypted file. Decryption is extremely slow as it is implemented in native Python rather than C. -For other archive formats, see the :mod:`bz2`, :mod:`gzip`, and -:mod:`tarfile` modules. - The module defines the following items: .. exception:: BadZipfile diff --git a/Doc/library/zlib.rst b/Doc/library/zlib.rst --- a/Doc/library/zlib.rst +++ b/Doc/library/zlib.rst @@ -19,9 +19,7 @@ consult the zlib manual at http://www.zlib.net/manual.html for authoritative information. -For reading and writing ``.gz`` files see the :mod:`gzip` module. For -other archive formats, see the :mod:`bz2`, :mod:`zipfile`, and -:mod:`tarfile` modules. +For reading and writing ``.gz`` files see the :mod:`gzip` module. The available exception and functions in this module are: diff --git a/Doc/using/cmdline.rst b/Doc/using/cmdline.rst --- a/Doc/using/cmdline.rst +++ b/Doc/using/cmdline.rst @@ -541,7 +541,8 @@ .. envvar:: PYTHONDONTWRITEBYTECODE If this is set, Python won't try to write ``.pyc`` or ``.pyo`` files on the - import of source modules. + import of source modules. This is equivalent to specifying the :option:`-B` + option. .. versionadded:: 2.6 diff --git a/Lib/_pyio.py b/Lib/_pyio.py --- a/Lib/_pyio.py +++ b/Lib/_pyio.py @@ -1451,7 +1451,7 @@ enabled. With this enabled, on input, the lines endings '\n', '\r', or '\r\n' are translated to '\n' before being returned to the caller. Conversely, on output, '\n' is translated to the system - default line seperator, os.linesep. If newline is any other of its + default line separator, os.linesep. If newline is any other of its legal values, that newline becomes the newline when the file is read and it is returned untranslated. On output, '\n' is converted to the newline. diff --git a/Lib/cookielib.py b/Lib/cookielib.py --- a/Lib/cookielib.py +++ b/Lib/cookielib.py @@ -1,4 +1,4 @@ -"""HTTP cookie handling for web clients. +r"""HTTP cookie handling for web clients. This module has (now fairly distant) origins in Gisle Aas' Perl module HTTP::Cookies, from the libwww-perl library. diff --git a/Lib/distutils/command/bdist_rpm.py b/Lib/distutils/command/bdist_rpm.py --- a/Lib/distutils/command/bdist_rpm.py +++ b/Lib/distutils/command/bdist_rpm.py @@ -379,16 +379,28 @@ self.spawn(rpm_cmd) if not self.dry_run: + if self.distribution.has_ext_modules(): + pyversion = get_python_version() + else: + pyversion = 'any' + if not self.binary_only: srpm = os.path.join(rpm_dir['SRPMS'], source_rpm) assert(os.path.exists(srpm)) self.move_file(srpm, self.dist_dir) + filename = os.path.join(self.dist_dir, source_rpm) + self.distribution.dist_files.append( + ('bdist_rpm', pyversion, filename)) if not self.source_only: for rpm in binary_rpms: rpm = os.path.join(rpm_dir['RPMS'], rpm) if os.path.exists(rpm): self.move_file(rpm, self.dist_dir) + filename = os.path.join(self.dist_dir, + os.path.basename(rpm)) + self.distribution.dist_files.append( + ('bdist_rpm', pyversion, filename)) # run() def _dist_path(self, path): diff --git a/Lib/distutils/tests/test_bdist_dumb.py b/Lib/distutils/tests/test_bdist_dumb.py --- a/Lib/distutils/tests/test_bdist_dumb.py +++ b/Lib/distutils/tests/test_bdist_dumb.py @@ -1,8 +1,10 @@ """Tests for distutils.command.bdist_dumb.""" +import os +import sys +import zipfile import unittest -import sys -import os +from test.test_support import run_unittest # zlib is not used here, but if it's not available # test_simple_built will fail @@ -11,8 +13,6 @@ except ImportError: zlib = None -from test.test_support import run_unittest - from distutils.core import Distribution from distutils.command.bdist_dumb import bdist_dumb from distutils.tests import support @@ -73,15 +73,23 @@ # see what we have dist_created = os.listdir(os.path.join(pkg_dir, 'dist')) - base = "%s.%s" % (dist.get_fullname(), cmd.plat_name) + base = "%s.%s.zip" % (dist.get_fullname(), cmd.plat_name) if os.name == 'os2': base = base.replace(':', '-') - wanted = ['%s.zip' % base] - self.assertEqual(dist_created, wanted) + self.assertEqual(dist_created, [base]) # now let's check what we have in the zip file - # XXX to be done + fp = zipfile.ZipFile(os.path.join('dist', base)) + try: + contents = fp.namelist() + finally: + fp.close() + + contents = sorted(os.path.basename(fn) for fn in contents) + wanted = ['foo-0.1-py%s.%s.egg-info' % sys.version_info[:2], + 'foo.py', 'foo.pyc'] + self.assertEqual(contents, sorted(wanted)) def test_finalize_options(self): pkg_dir, dist = self.create_dist() diff --git a/Lib/distutils/tests/test_bdist_rpm.py b/Lib/distutils/tests/test_bdist_rpm.py --- a/Lib/distutils/tests/test_bdist_rpm.py +++ b/Lib/distutils/tests/test_bdist_rpm.py @@ -79,6 +79,10 @@ dist_created = os.listdir(os.path.join(pkg_dir, 'dist')) self.assertTrue('foo-0.1-1.noarch.rpm' in dist_created) + # bug #2945: upload ignores bdist_rpm files + self.assertIn(('bdist_rpm', 'any', 'dist/foo-0.1-1.src.rpm'), dist.dist_files) + self.assertIn(('bdist_rpm', 'any', 'dist/foo-0.1-1.noarch.rpm'), dist.dist_files) + def test_no_optimize_flag(self): # XXX I am unable yet to make this test work without @@ -118,6 +122,11 @@ dist_created = os.listdir(os.path.join(pkg_dir, 'dist')) self.assertTrue('foo-0.1-1.noarch.rpm' in dist_created) + + # bug #2945: upload ignores bdist_rpm files + self.assertIn(('bdist_rpm', 'any', 'dist/foo-0.1-1.src.rpm'), dist.dist_files) + self.assertIn(('bdist_rpm', 'any', 'dist/foo-0.1-1.noarch.rpm'), dist.dist_files) + os.remove(os.path.join(pkg_dir, 'dist', 'foo-0.1-1.noarch.rpm')) def test_suite(): diff --git a/Lib/distutils/tests/test_install.py b/Lib/distutils/tests/test_install.py --- a/Lib/distutils/tests/test_install.py +++ b/Lib/distutils/tests/test_install.py @@ -86,19 +86,17 @@ self.old_expand = os.path.expanduser os.path.expanduser = _expanduser - try: - # this is the actual test - self._test_user_site() - finally: + def cleanup(): site.USER_BASE = self.old_user_base site.USER_SITE = self.old_user_site install_module.USER_BASE = self.old_user_base install_module.USER_SITE = self.old_user_site os.path.expanduser = self.old_expand - def _test_user_site(self): + self.addCleanup(cleanup) + for key in ('nt_user', 'unix_user', 'os2_home'): - self.assertTrue(key in INSTALL_SCHEMES) + self.assertIn(key, INSTALL_SCHEMES) dist = Distribution({'name': 'xx'}) cmd = install(dist) @@ -106,14 +104,14 @@ # making sure the user option is there options = [name for name, short, lable in cmd.user_options] - self.assertTrue('user' in options) + self.assertIn('user', options) # setting a value cmd.user = 1 # user base and site shouldn't be created yet - self.assertTrue(not os.path.exists(self.user_base)) - self.assertTrue(not os.path.exists(self.user_site)) + self.assertFalse(os.path.exists(self.user_base)) + self.assertFalse(os.path.exists(self.user_site)) # let's run finalize cmd.ensure_finalized() @@ -122,8 +120,8 @@ self.assertTrue(os.path.exists(self.user_base)) self.assertTrue(os.path.exists(self.user_site)) - self.assertTrue('userbase' in cmd.config_vars) - self.assertTrue('usersite' in cmd.config_vars) + self.assertIn('userbase', cmd.config_vars) + self.assertIn('usersite', cmd.config_vars) def test_handle_extra_path(self): dist = Distribution({'name': 'xx', 'extra_path': 'path,dirs'}) @@ -176,15 +174,16 @@ def test_record(self): install_dir = self.mkdtemp() - project_dir, dist = self.create_dist(scripts=['hello']) - self.addCleanup(os.chdir, os.getcwd()) + project_dir, dist = self.create_dist(py_modules=['hello'], + scripts=['sayhi']) os.chdir(project_dir) - self.write_file('hello', "print('o hai')") + self.write_file('hello.py', "def main(): print 'o hai'") + self.write_file('sayhi', 'from hello import main; main()') cmd = install(dist) dist.command_obj['install'] = cmd cmd.root = install_dir - cmd.record = os.path.join(project_dir, 'RECORD') + cmd.record = os.path.join(project_dir, 'filelist') cmd.ensure_finalized() cmd.run() @@ -195,7 +194,7 @@ f.close() found = [os.path.basename(line) for line in content.splitlines()] - expected = ['hello', + expected = ['hello.py', 'hello.pyc', 'sayhi', 'UNKNOWN-0.0.0-py%s.%s.egg-info' % sys.version_info[:2]] self.assertEqual(found, expected) @@ -203,7 +202,6 @@ install_dir = self.mkdtemp() project_dir, dist = self.create_dist(ext_modules=[ Extension('xx', ['xxmodule.c'])]) - self.addCleanup(os.chdir, os.getcwd()) os.chdir(project_dir) support.copy_xxmodule_c(project_dir) @@ -215,7 +213,7 @@ dist.command_obj['install'] = cmd dist.command_obj['build_ext'] = buildextcmd cmd.root = install_dir - cmd.record = os.path.join(project_dir, 'RECORD') + cmd.record = os.path.join(project_dir, 'filelist') cmd.ensure_finalized() cmd.run() @@ -241,6 +239,7 @@ install_module.DEBUG = False self.assertTrue(len(self.logs) > old_logs_len) + def test_suite(): return unittest.makeSuite(InstallTestCase) diff --git a/Lib/distutils/tests/test_sdist.py b/Lib/distutils/tests/test_sdist.py --- a/Lib/distutils/tests/test_sdist.py +++ b/Lib/distutils/tests/test_sdist.py @@ -6,6 +6,7 @@ import zipfile from os.path import join from textwrap import dedent +from test.test_support import captured_stdout, check_warnings, run_unittest # zlib is not used here, but if it's not available # the tests that use zipfile may fail @@ -21,7 +22,6 @@ except ImportError: UID_GID_SUPPORT = False -from test.test_support import captured_stdout, check_warnings, run_unittest from distutils.command.sdist import sdist, show_formats from distutils.core import Distribution @@ -375,7 +375,7 @@ # the following tests make sure there is a nice error message instead # of a traceback when parsing an invalid manifest template - def _test_template(self, content): + def _check_template(self, content): dist, cmd = self.get_cmd() os.chdir(self.tmp_dir) self.write_file('MANIFEST.in', content) @@ -386,17 +386,17 @@ self.assertEqual(len(warnings), 1) def test_invalid_template_unknown_command(self): - self._test_template('taunt knights *') + self._check_template('taunt knights *') def test_invalid_template_wrong_arguments(self): # this manifest command takes one argument - self._test_template('prune') + self._check_template('prune') @unittest.skipIf(os.name != 'nt', 'test relevant for Windows only') def test_invalid_template_wrong_path(self): # on Windows, trailing slashes are not allowed # this used to crash instead of raising a warning: #8286 - self._test_template('include examples/') + self._check_template('include examples/') @unittest.skipUnless(zlib, "requires zlib") def test_get_file_list(self): diff --git a/Lib/httplib.py b/Lib/httplib.py --- a/Lib/httplib.py +++ b/Lib/httplib.py @@ -1,4 +1,4 @@ -"""HTTP/1.1 client library +r"""HTTP/1.1 client library diff --git a/Lib/keyword.py b/Lib/keyword.py --- a/Lib/keyword.py +++ b/Lib/keyword.py @@ -7,7 +7,7 @@ To update the symbols in this file, 'cd' to the top directory of the python source tree after building the interpreter and run: - python Lib/keyword.py + ./python Lib/keyword.py """ __all__ = ["iskeyword", "kwlist"] diff --git a/Lib/locale.py b/Lib/locale.py --- a/Lib/locale.py +++ b/Lib/locale.py @@ -1581,8 +1581,7 @@ # to include every locale up to Windows Vista. # # NOTE: this mapping is incomplete. If your language is missing, please -# submit a bug report to Python bug manager, which you can find via: -# http://www.python.org/dev/ +# submit a bug report to the Python bug tracker at http://bugs.python.org/ # Make sure you include the missing language identifier and the suggested # locale code. # diff --git a/Lib/numbers.py b/Lib/numbers.py --- a/Lib/numbers.py +++ b/Lib/numbers.py @@ -303,7 +303,7 @@ raise NotImplementedError def __index__(self): - """index(self)""" + """Called whenever an index is needed, such as in slicing""" return long(self) @abstractmethod diff --git a/Lib/symbol.py b/Lib/symbol.py --- a/Lib/symbol.py +++ b/Lib/symbol.py @@ -7,7 +7,7 @@ # To update the symbols in this file, 'cd' to the top directory of # the python source tree after building the interpreter and run: # -# python Lib/symbol.py +# ./python Lib/symbol.py #--start constants-- single_input = 256 diff --git a/Lib/token.py b/Lib/token.py --- a/Lib/token.py +++ b/Lib/token.py @@ -7,7 +7,7 @@ # To update the symbols in this file, 'cd' to the top directory of # the python source tree after building the interpreter and run: # -# python Lib/token.py +# ./python Lib/token.py #--start constants-- ENDMARKER = 0 diff --git a/Misc/ACKS b/Misc/ACKS --- a/Misc/ACKS +++ b/Misc/ACKS @@ -709,6 +709,7 @@ Juan M. Bello Rivas Davide Rizzo Anthony Roach +Carl Robben Mark Roberts Jim Robinson Andy Robinson diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -98,6 +98,8 @@ Library ------- +- Issue #2945: Make the distutils upload command aware of bdist_rpm products. + - Issue #13447: Add a test file to host regression tests for bugs in the scripts found in the Tools directory. diff --git a/Misc/python.man b/Misc/python.man --- a/Misc/python.man +++ b/Misc/python.man @@ -459,7 +459,7 @@ .br Documentation: http://docs.python.org/ .br -Developer resources: http://www.python.org/dev/ +Developer resources: http://docs.python.org/devguide/ .br Downloads: http://python.org/download/ .br diff --git a/Modules/_io/_iomodule.c b/Modules/_io/_iomodule.c --- a/Modules/_io/_iomodule.c +++ b/Modules/_io/_iomodule.c @@ -58,7 +58,7 @@ "\n" "At the top of the I/O hierarchy is the abstract base class IOBase. It\n" "defines the basic interface to a stream. Note, however, that there is no\n" -"seperation between reading and writing to streams; implementations are\n" +"separation between reading and writing to streams; implementations are\n" "allowed to throw an IOError if they do not support a given operation.\n" "\n" "Extending IOBase is RawIOBase which deals simply with the reading and\n" diff --git a/Modules/_io/textio.c b/Modules/_io/textio.c --- a/Modules/_io/textio.c +++ b/Modules/_io/textio.c @@ -627,7 +627,7 @@ "enabled. With this enabled, on input, the lines endings '\\n', '\\r',\n" "or '\\r\\n' are translated to '\\n' before being returned to the\n" "caller. Conversely, on output, '\\n' is translated to the system\n" - "default line seperator, os.linesep. If newline is any other of its\n" + "default line separator, os.linesep. If newline is any other of its\n" "legal values, that newline becomes the newline when the file is read\n" "and it is returned untranslated. On output, '\\n' is converted to the\n" "newline.\n" -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Feb 26 03:49:59 2012 From: python-checkins at python.org (nick.coghlan) Date: Sun, 26 Feb 2012 03:49:59 +0100 Subject: [Python-checkins] =?utf8?q?peps=3A_Further_refinements_to_PEP_413?= =?utf8?q?=2C_save_state_before_changing_the_proposed_stdlib?= Message-ID: http://hg.python.org/peps/rev/a2ad67fa36f8 changeset: 4084:a2ad67fa36f8 user: Nick Coghlan date: Sun Feb 26 12:49:49 2012 +1000 summary: Further refinements to PEP 413, save state before changing the proposed stdlib versioning scheme files: pep-0413.txt | 241 +++++++++++++++++++++++++++----------- 1 files changed, 172 insertions(+), 69 deletions(-) diff --git a/pep-0413.txt b/pep-0413.txt --- a/pep-0413.txt +++ b/pep-0413.txt @@ -99,37 +99,67 @@ Proposal ======== -This PEP proposes the addition of a new ``sys.stdlib_info`` attribute that -records a date based standard library version above and beyond the underlying -interpreter version:: +This PEP proposes the introduction of a new kind of CPython release: +"standard library releases". As with PEP 407, this will give CPython 3 kinds +of release: - sys.stdlib_info(year=2012, month=8, micro=0, releaselevel='final', serial=0) +* Language release: "x.y.0" +* Maintenance release: "x.y.z" (where z > 0) +* Standard library release: "x.y (YY.MM)" -This information would also be included in the ``sys.version`` string:: +Under this scheme, an unqualified version reference (such as "3.3") would +always refer to the most recent corresponding language or maintenance +release. It will never be used without qualification to refer to a standard +library release (at least by python-dev - obviously, we can only set an +example, not force the rest of the Python ecosystem to go along with it). - Python 3.3.0 (12.08.0, default:c1a07c8092f7+, Feb 17 2012, 23:03:41) - [GCC 4.6.1] +Language releases will continue as they are now, as new versions of the +Python language definition, along with a new version of the CPython +interpreter and the Python standard library. Accordingly, a language +release may contain any and all of the following changes: + +* new language syntax +* new standard library changes (see below) +* new deprecation warnings +* removal of previously deprecated features +* changes to the emitted bytecode +* changes to the AST +* any other significant changes to the compilation toolchain +* changes to the core interpreter eval loop +* changes to the C ABI (although the PEP 384 stable ABI must be preserved) +* bug fixes + +Maintenance releases will also continue as they do today, being strictly +limited to bug fixes for the corresponding language release. No new features +or radical internal changes are permitted. + +The new standard library releases will occur in parallel with each +maintenance release and will be qualified with a date-based version +identifier documenting their *actual* release date. Standard library +releases may include the following changes: + +* new features in pure Python modules +* new features in C extension modules (subject to PEP 399 compatibility + requirements) +* new features in language builtins (provided the C ABI remains unaffected) +* bug fixes from the corresponding maintenance release + + +Release Cycle +------------- When maintenance releases are created, *two* new versions of Python would actually be published on python.org (using the first 3.3 maintenance release, planned for February 2013 as an example):: - 3.3.1 + 12.08.1 # Maintenance release - 3.3.1 + 13.02.0 # Standard library release - -A standard library release would just be the corresponding maintenance -release, with the following additional, backwards compatible changes: - -* new features in pure Python modules -* new features in C extension modules (subject to PEP 399 compatibility - requirements) -* new features in language builtins (provided the C ABI remains unaffected) + 3.3.1 # Maintenance release + 3.3 (13.02) # Standard library release A further 6 months later, the next 3.3 maintenance release would again be accompanied by a new standard library release:: - 3.3.2 + 12.08.2 # Maintenance release - 3.3.2 + 13.08.1 # Standard library release + 3.3.2 # Maintenance release + 3.3 (13.08) # Standard library release Again, the standard library release would be binary compatible with the previous language release, merely offering additional features at the @@ -138,30 +168,62 @@ Finally, 18 months after the release of 3.3, a new language release would be made around the same time as the final 3.3 maintenance release:: - 3.3.3 + 12.08.3 # Maintenance release - 3.4.0 + 14.02.0 # Language release + 3.3.3 # Maintenance release + 3.4.0 # Language release Language releases would then contain all the features that are not permitted in standard library releases: -* new language syntax -* new deprecation warnings -* removal of previously deprecated features -* changes to the emitted bytecode -* changes to the AST -* any other significant changes to the compilation toolchain -* changes to the core eval loop -* changes to the C ABI - The 3.4 release cycle would then follow a similar pattern to that for 3.3:: - 3.4.1 + 14.02.1 # Maintenance release - 3.4.1 + 14.08.0 # Standard library release - 3.4.2 + 14.02.2 # Maintenance release - 3.4.2 + 15.02.0 # Standard library release - 3.4.3 + 14.02.3 # Maintenance release - 3.5.0 + 15.08.0 # Language release + 3.4.1 # Maintenance release + 3.4 (14.08) # Standard library release + 3.4.2 # Maintenance release + 3.4 (15.02) # Standard library release + + 3.4.3 # Maintenance release + 3.5 # Language release + + +Programmatic Version Identification +----------------------------------- + +To expose the new release details programmatically, this PEP proposes the +addition of a new ``sys.stdlib_info`` attribute that records the date based +standard library version above and beyond the underlying interpreter +version. Using the initial Python 3.3 release as an example:: + + sys.stdlib_info(year=2012, month=8, micro=0, releaselevel='final', serial=0) + +This information would also be included in the ``sys.version`` string:: + + Python 3.3.0 (12.08.0, default, Feb 17 2012, 23:03:41) + [GCC 4.6.1] + + +Security Fixes and Other "Out of Cycle" Releases +------------------------------------------------ + +For maintenance releases the process of handling out-of-cycle releases (for +example, to fix a security issue or resolve a critical bug in a new release), +remains the same as it is now: the minor version number is incremented and a +new release is made incorporating the required bug fixes, as well as any +other bug fixes that have been committed since the previous release. + +For standard library releases, things are slightly more complicated, as the +corresponding source control branch may contain new features in addition to +bug fixes. If such features exist, then, to provide a comprehensible release, +it would be necessary to: + +1. Change the release version number to the date of the current month. +2. Update the What's New, NEWS and documentation to refer to the new release + number. +3. Make the new release. + +(Note: due to this problem with out-of-cycle releases, I'm considering an +alternate standard library version scheme that would use date independent +numbers like "33.1" and "33.2". See `Why a date-based versioning scheme?`_). User Scenarios ============== @@ -187,12 +249,12 @@ **Status quo:** must choose between 3.3 and 2.7 -**This PEP:** must choose between 3.3 (13.02), 3.3 (12.08) and 2.7. +**This PEP:** must choose between 3.3 (13.02), 3.3 and 2.7. **PEP 407:** must choose between 3.4, 3.3 (LTS) and 2.7. **Verdict:** explaining the meaning of a Long Term Support release is about as -complicated as explaining the meaning of the proposed standard library +complicated as explaining the meaning of the proposed standard library release version numbers. I call this a tie. @@ -555,12 +617,16 @@ associated maintenance and standard library releases). -Option: Slowing down the language release cycle -=============================================== +Other benefits of reduced version coupling +========================================== + +Slowing down the language release cycle +--------------------------------------- The current release cycle is a compromise between the desire for stability in the core language definition and C extension ABI, and the desire to get -new feature (most notably standard library updates) into users hands quickly. +new features (most notably standard library updates) into user's hands more +quickly. With the standard library release cycle decoupled (to some degree) from that of the core language definition, it provides an opportunity to actually @@ -574,34 +640,35 @@ as standard library releases become more frequent. As simple example, if a full two years was allowed between 3.3 and 3.4, -the 3.3 release cycle would be up looking like:: +the 3.3 release cycle would end up looking like:: - 3.2.4 # Maintenance release - 3.3.0 + 12.08.0 # Language release + 3.2.4 # Maintenance release + 3.3.0 # Language release - 3.3.1 + 12.08.1 # Maintenance release - 3.3.1 + 13.02.0 # Standard library release + 3.3.1 # Maintenance release + 3.3 (13.02) # Standard library release - 3.3.2 + 12.08.2 # Maintenance release - 3.3.2 + 13.08.1 # Standard library release + 3.3.2 # Maintenance release + 3.3 (13.08) # Standard library release - 3.3.3 + 12.08.3 # Maintenance release - 3.3.3 + 14.02.1 # Standard library release + 3.3.3 # Maintenance release + 3.3 (14.02) # Standard library release - 3.3.4 + 12.08.4 # Maintenance release - 3.4.0 + 14.08.0 # Language release + 3.3.4 # Maintenance release + 3.4.0 # Language release The elegance of the proposed NEWS entry layout is that this decision wouldn't need to be made until after the 13.08 standard library release. At that point, the ``3.3-compat`` branch could be kept open (thus adding another standard library release to the cycle), or else it could be closed, -committing to the next release being a full language release. The choice -between another standard library release or a full language release would -then be available every 6 months after that. +committing to the next release being a full language release. If the +compatibility branch was kept open, the choice between another standard +library release or a full language release would then be available every +6 months after that. -Future: Further increasing the pace of standard library development -=================================================================== +Further increasing the pace of standard library development +----------------------------------------------------------- A further benefit of the scheme proposed in this PEP is that it almost *fully* decouples the language release cycle from the standard library @@ -610,19 +677,55 @@ version numbering or the perceived stability of the core language. While that pace of development isn't practical as long as the binary -installer creation for Windows and Mac OS X involves several manual steps and -for as long as we don't have separate "-release" trees that only -receive versions that have been marked as good by the stable buildbots, -it's a useful criterion to keep in mind: what if we want to make standard -library releases even *faster* than every 6 months? +installer creation for Windows and Mac OS X involves several manual steps +(including manual testing) and for as long as we don't have separate +"-release" trees that only receive versions that have been marked as +good by the stable buildbots, it's a useful criterion to keep in mind when +considering proposed new versioning schemes: what if we eventually want +to make standard library releases even *faster* than every 6 months? If the practical issues were ever resolved, then the separate date-based versioning scheme in this PEP could handle it. The approach proposed in -PEP 407 could not. +PEP 407 could not (at least, not without a lot of user confusion). + + +Other Questions +=============== + +Why a date-based versioning scheme? +----------------------------------- + +While a date-based scheme does mean additional work in the case of an +out-of-cycle release, it's an easy way to come up with a numbering system +that is clearly orthogonal to the existing versioning scheme used for +language releases. + +Another possibility would just be ``major.minor`` versioning where: + +* major: xy from the corresponding language release (that is, "33" for 3.3) +* minor: release sequence number for the standard library releases + +Then the Python 3.3 release series would look like:: + + 3.3.0 # Language release + + 3.3.1 # Maintenance release + 3.3 (33.1) # Standard library release + + 3.3.2 # Maintenance release + 3.3 (33.2) # Standard library release + + 3.3.3 # Maintenance release + 3.4.0 # Language release + +Such a scheme would have the advantage of tolerating out-of-cycle releases +without needing to adjust the version numbering for the release, but would +lose the minor benefit of providing clearer age information within the +versioning scheme itself. Why isn't PEP 384 enough? -========================= +------------------------- PEP 384 introduced the notion of a "Stable ABI" for CPython, a limited subset of the full C ABI that is guaranteed to remain stable. Extensions @@ -639,14 +742,14 @@ Why not separate out the standard library entirely? -=================================================== +--------------------------------------------------- Because it's a lot of work for next to no pay-off. CPython without the standard library is useless (the build chain won't even run, let alone the -test suite). You can't create a standalone pure Python standard library, -because too many "modules" are actually tightly linked in to the internal -details of their respective interpreters (e.g. ``weakref``, ``gc``, ``sys``, -``inspect``, ``ast``). +test suite). You can't create a standalone pure Python standard library +either, because too many "modules" are actually tightly linked in to the +internal details of their respective interpreters (e.g. ``weakref``, ``gc``, +``sys``, ``inspect``, ``ast``). Creating a separate development branch that is kept compatible with the previous feature release, and making releases from that branch that are -- Repository URL: http://hg.python.org/peps From python-checkins at python.org Sun Feb 26 04:07:48 2012 From: python-checkins at python.org (eric.araujo) Date: Sun, 26 Feb 2012 04:07:48 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=283=2E2=29=3A_Add_test_file_f?= =?utf8?q?or_scripts_in_Tools_=28=2313447=29=2E?= Message-ID: http://hg.python.org/cpython/rev/2887f5a97075 changeset: 75281:2887f5a97075 branch: 3.2 parent: 75258:73aa4c9305b3 user: ?ric Araujo date: Sat Feb 25 16:57:04 2012 +0100 summary: Add test file for scripts in Tools (#13447). When people find bugs in scripts such as reindent.py, msgfmt.py or pygettext.py, we have to try to reproduce the bug manually, apply a fix and test manually again. The alternative is to only read the code and trust that it works. This test file is a way to stop that unsatisfactory state of things and write proper unit tests instead. files: Lib/test/test_tools.py | 39 ++++++++++++++++++++++++++++++ 1 files changed, 39 insertions(+), 0 deletions(-) diff --git a/Lib/test/test_tools.py b/Lib/test/test_tools.py new file mode 100644 --- /dev/null +++ b/Lib/test/test_tools.py @@ -0,0 +1,39 @@ +"""Tests for scripts in the Tools directory. + +This file contains regression tests for some of the scripts found in the +Tools directory of a Python checkout or tarball, such as reindent.py. +""" + +import os +import unittest +import sysconfig +from test import support +from test.script_helper import assert_python_ok + +if not sysconfig.is_python_build(): + # XXX some installers do contain the tools, should we detect that + # and run the tests in that case too? + raise unittest.SkipTest('test irrelevant for an installed Python') + +srcdir = sysconfig.get_config_var('projectbase') +basepath = os.path.join(os.getcwd(), srcdir, 'Tools') + + +class ReindentTests(unittest.TestCase): + script = os.path.join(basepath, 'scripts', 'reindent.py') + + def test_noargs(self): + assert_python_ok(self.script) + + def test_help(self): + rc, out, err = assert_python_ok(self.script, '-h') + self.assertEqual(out, b'') + self.assertGreater(err, b'') + + +def test_main(): + support.run_unittest(ReindentTests) + + +if __name__ == '__main__': + unittest.main() -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Feb 26 04:07:49 2012 From: python-checkins at python.org (eric.araujo) Date: Sun, 26 Feb 2012 04:07:49 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=283=2E2=29=3A_Add_news_entry_?= =?utf8?q?for_previous_commit?= Message-ID: http://hg.python.org/cpython/rev/ade06ef94fbe changeset: 75282:ade06ef94fbe branch: 3.2 user: ?ric Araujo date: Sat Feb 25 16:57:39 2012 +0100 summary: Add news entry for previous commit files: Misc/NEWS | 3 +++ 1 files changed, 3 insertions(+), 0 deletions(-) diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -124,6 +124,9 @@ Library ------- +- Issue #13447: Add a test file to host regression tests for bugs in the + scripts found in the Tools directory. + - Issue #6884: Fix long-standing bugs with MANIFEST.in parsing in distutils on Windows. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Feb 26 04:07:50 2012 From: python-checkins at python.org (eric.araujo) Date: Sun, 26 Feb 2012 04:07:50 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_3=2E2_-=3E_default=29?= =?utf8?q?=3A_Merge_from_3=2E2?= Message-ID: http://hg.python.org/cpython/rev/1892f4567b07 changeset: 75283:1892f4567b07 parent: 75259:e1740afa1a04 parent: 75282:ade06ef94fbe user: ?ric Araujo date: Sat Feb 25 17:26:44 2012 +0100 summary: Merge from 3.2 files: Lib/test/test_tools.py | 39 ++++++++++++++++++++++++++++++ Misc/NEWS | 3 ++ 2 files changed, 42 insertions(+), 0 deletions(-) diff --git a/Lib/test/test_tools.py b/Lib/test/test_tools.py new file mode 100644 --- /dev/null +++ b/Lib/test/test_tools.py @@ -0,0 +1,39 @@ +"""Tests for scripts in the Tools directory. + +This file contains regression tests for some of the scripts found in the +Tools directory of a Python checkout or tarball, such as reindent.py. +""" + +import os +import unittest +import sysconfig +from test import support +from test.script_helper import assert_python_ok + +if not sysconfig.is_python_build(): + # XXX some installers do contain the tools, should we detect that + # and run the tests in that case too? + raise unittest.SkipTest('test irrelevant for an installed Python') + +srcdir = sysconfig.get_config_var('projectbase') +basepath = os.path.join(os.getcwd(), srcdir, 'Tools') + + +class ReindentTests(unittest.TestCase): + script = os.path.join(basepath, 'scripts', 'reindent.py') + + def test_noargs(self): + assert_python_ok(self.script) + + def test_help(self): + rc, out, err = assert_python_ok(self.script, '-h') + self.assertEqual(out, b'') + self.assertGreater(err, b'') + + +def test_main(): + support.run_unittest(ReindentTests) + + +if __name__ == '__main__': + unittest.main() diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -498,6 +498,9 @@ Library ------- +- Issue #13447: Add a test file to host regression tests for bugs in the + scripts found in the Tools directory. + - Issue #6884: Fix long-standing bugs with MANIFEST.in parsing in distutils on Windows. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Feb 26 04:07:50 2012 From: python-checkins at python.org (eric.araujo) Date: Sun, 26 Feb 2012 04:07:50 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=283=2E2=29=3A_Use_const_marku?= =?utf8?q?p_instead_of_a_misleading_string_literal?= Message-ID: http://hg.python.org/cpython/rev/bf76fa256c5a changeset: 75284:bf76fa256c5a branch: 3.2 parent: 75282:ade06ef94fbe user: ?ric Araujo date: Sun Feb 26 02:13:30 2012 +0100 summary: Use const markup instead of a misleading string literal files: Doc/library/logging.rst | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Doc/library/logging.rst b/Doc/library/logging.rst --- a/Doc/library/logging.rst +++ b/Doc/library/logging.rst @@ -1077,7 +1077,7 @@ If *capture* is ``True``, warnings issued by the :mod:`warnings` module will be redirected to the logging system. Specifically, a warning will be formatted using :func:`warnings.formatwarning` and the resulting string - logged to a logger named ``'py.warnings'`` with a severity of ``'WARNING'``. + logged to a logger named ``'py.warnings'`` with a severity of :const:`WARNING`. If *capture* is ``False``, the redirection of warnings to the logging system will stop, and warnings will be redirected to their original destinations -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Feb 26 04:07:51 2012 From: python-checkins at python.org (eric.araujo) Date: Sun, 26 Feb 2012 04:07:51 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=283=2E2=29=3A_Fix_typo_in_?= =?utf8?b?4oCcc2VwZXJhdHtvcixpb2594oCd?= Message-ID: http://hg.python.org/cpython/rev/042061e98c02 changeset: 75285:042061e98c02 branch: 3.2 user: ?ric Araujo date: Sun Feb 26 02:14:08 2012 +0100 summary: Fix typo in ?seperat{or,ion}? files: Modules/_io/_iomodule.c | 2 +- Modules/_io/textio.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Modules/_io/_iomodule.c b/Modules/_io/_iomodule.c --- a/Modules/_io/_iomodule.c +++ b/Modules/_io/_iomodule.c @@ -58,7 +58,7 @@ "\n" "At the top of the I/O hierarchy is the abstract base class IOBase. It\n" "defines the basic interface to a stream. Note, however, that there is no\n" -"seperation between reading and writing to streams; implementations are\n" +"separation between reading and writing to streams; implementations are\n" "allowed to throw an IOError if they do not support a given operation.\n" "\n" "Extending IOBase is RawIOBase which deals simply with the reading and\n" diff --git a/Modules/_io/textio.c b/Modules/_io/textio.c --- a/Modules/_io/textio.c +++ b/Modules/_io/textio.c @@ -627,7 +627,7 @@ "enabled. With this enabled, on input, the lines endings '\\n', '\\r',\n" "or '\\r\\n' are translated to '\\n' before being returned to the\n" "caller. Conversely, on output, '\\n' is translated to the system\n" - "default line seperator, os.linesep. If newline is any other of its\n" + "default line separator, os.linesep. If newline is any other of its\n" "legal values, that newline becomes the newline when the file is read\n" "and it is returned untranslated. On output, '\\n' is converted to the\n" "newline.\n" -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Feb 26 04:07:52 2012 From: python-checkins at python.org (eric.araujo) Date: Sun, 26 Feb 2012 04:07:52 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=283=2E2=29=3A_Set_archive_for?= =?utf8?q?mat_explicitly_in_one_distutils_test?= Message-ID: http://hg.python.org/cpython/rev/e96777f6dc5c changeset: 75286:e96777f6dc5c branch: 3.2 user: ?ric Araujo date: Sun Feb 26 02:14:33 2012 +0100 summary: Set archive format explicitly in one distutils test files: Lib/distutils/tests/test_sdist.py | 3 ++- 1 files changed, 2 insertions(+), 1 deletions(-) diff --git a/Lib/distutils/tests/test_sdist.py b/Lib/distutils/tests/test_sdist.py --- a/Lib/distutils/tests/test_sdist.py +++ b/Lib/distutils/tests/test_sdist.py @@ -6,6 +6,7 @@ import zipfile from os.path import join from textwrap import dedent +from test.support import captured_stdout, check_warnings, run_unittest try: import zlib @@ -13,7 +14,6 @@ except ImportError: ZLIB_SUPPORT = False -from test.support import captured_stdout, check_warnings, run_unittest from distutils.command.sdist import sdist, show_formats from distutils.core import Distribution @@ -326,6 +326,7 @@ # filling data_files by pointing files in package_data dist.package_data = {'somecode': ['*.txt']} self.write_file((self.tmp_dir, 'somecode', 'doc.txt'), '#') + cmd.formats = ['gztar'] cmd.ensure_finalized() cmd.run() -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Feb 26 04:07:53 2012 From: python-checkins at python.org (eric.araujo) Date: Sun, 26 Feb 2012 04:07:53 +0100 Subject: [Python-checkins] =?utf8?q?cpython=3A_Port_the_=236884_fix_to_pac?= =?utf8?q?kaging?= Message-ID: http://hg.python.org/cpython/rev/937b1613d0e6 changeset: 75287:937b1613d0e6 parent: 75283:1892f4567b07 user: ?ric Araujo date: Sun Feb 26 04:01:34 2012 +0100 summary: Port the #6884 fix to packaging files: Lib/packaging/manifest.py | 20 +- Lib/packaging/tests/test_manifest.py | 138 +++++++++++--- Misc/NEWS | 2 +- 3 files changed, 117 insertions(+), 43 deletions(-) diff --git a/Lib/packaging/manifest.py b/Lib/packaging/manifest.py --- a/Lib/packaging/manifest.py +++ b/Lib/packaging/manifest.py @@ -272,6 +272,7 @@ Return True if files are found. """ + # XXX docstring lying about what the special chars are? files_found = False pattern_re = _translate_pattern(pattern, anchor, prefix, is_regex) @@ -335,11 +336,14 @@ # IMHO is wrong -- '?' and '*' aren't supposed to match slash in Unix, # and by extension they shouldn't match such "special characters" under # any OS. So change all non-escaped dots in the RE to match any - # character except the special characters. - # XXX currently the "special characters" are just slash -- i.e. this is - # Unix-only. - pattern_re = re.sub(r'((? http://hg.python.org/cpython/rev/d0c86cc5a8ba changeset: 75288:d0c86cc5a8ba branch: 3.2 parent: 75261:7f651187b25c parent: 75286:e96777f6dc5c user: ?ric Araujo date: Sun Feb 26 04:00:43 2012 +0100 summary: Branch merge files: Doc/library/logging.rst | 2 +- Lib/distutils/tests/test_sdist.py | 3 +- Lib/test/test_tools.py | 39 +++++++++++++++++++ Misc/NEWS | 3 + Modules/_io/_iomodule.c | 2 +- Modules/_io/textio.c | 2 +- 6 files changed, 47 insertions(+), 4 deletions(-) diff --git a/Doc/library/logging.rst b/Doc/library/logging.rst --- a/Doc/library/logging.rst +++ b/Doc/library/logging.rst @@ -1077,7 +1077,7 @@ If *capture* is ``True``, warnings issued by the :mod:`warnings` module will be redirected to the logging system. Specifically, a warning will be formatted using :func:`warnings.formatwarning` and the resulting string - logged to a logger named ``'py.warnings'`` with a severity of ``'WARNING'``. + logged to a logger named ``'py.warnings'`` with a severity of :const:`WARNING`. If *capture* is ``False``, the redirection of warnings to the logging system will stop, and warnings will be redirected to their original destinations diff --git a/Lib/distutils/tests/test_sdist.py b/Lib/distutils/tests/test_sdist.py --- a/Lib/distutils/tests/test_sdist.py +++ b/Lib/distutils/tests/test_sdist.py @@ -6,6 +6,7 @@ import zipfile from os.path import join from textwrap import dedent +from test.support import captured_stdout, check_warnings, run_unittest try: import zlib @@ -13,7 +14,6 @@ except ImportError: ZLIB_SUPPORT = False -from test.support import captured_stdout, check_warnings, run_unittest from distutils.command.sdist import sdist, show_formats from distutils.core import Distribution @@ -326,6 +326,7 @@ # filling data_files by pointing files in package_data dist.package_data = {'somecode': ['*.txt']} self.write_file((self.tmp_dir, 'somecode', 'doc.txt'), '#') + cmd.formats = ['gztar'] cmd.ensure_finalized() cmd.run() diff --git a/Lib/test/test_tools.py b/Lib/test/test_tools.py new file mode 100644 --- /dev/null +++ b/Lib/test/test_tools.py @@ -0,0 +1,39 @@ +"""Tests for scripts in the Tools directory. + +This file contains regression tests for some of the scripts found in the +Tools directory of a Python checkout or tarball, such as reindent.py. +""" + +import os +import unittest +import sysconfig +from test import support +from test.script_helper import assert_python_ok + +if not sysconfig.is_python_build(): + # XXX some installers do contain the tools, should we detect that + # and run the tests in that case too? + raise unittest.SkipTest('test irrelevant for an installed Python') + +srcdir = sysconfig.get_config_var('projectbase') +basepath = os.path.join(os.getcwd(), srcdir, 'Tools') + + +class ReindentTests(unittest.TestCase): + script = os.path.join(basepath, 'scripts', 'reindent.py') + + def test_noargs(self): + assert_python_ok(self.script) + + def test_help(self): + rc, out, err = assert_python_ok(self.script, '-h') + self.assertEqual(out, b'') + self.assertGreater(err, b'') + + +def test_main(): + support.run_unittest(ReindentTests) + + +if __name__ == '__main__': + unittest.main() diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -124,6 +124,9 @@ Library ------- +- Issue #13447: Add a test file to host regression tests for bugs in the + scripts found in the Tools directory. + - Issue #6884: Fix long-standing bugs with MANIFEST.in parsing in distutils on Windows. diff --git a/Modules/_io/_iomodule.c b/Modules/_io/_iomodule.c --- a/Modules/_io/_iomodule.c +++ b/Modules/_io/_iomodule.c @@ -58,7 +58,7 @@ "\n" "At the top of the I/O hierarchy is the abstract base class IOBase. It\n" "defines the basic interface to a stream. Note, however, that there is no\n" -"seperation between reading and writing to streams; implementations are\n" +"separation between reading and writing to streams; implementations are\n" "allowed to throw an IOError if they do not support a given operation.\n" "\n" "Extending IOBase is RawIOBase which deals simply with the reading and\n" diff --git a/Modules/_io/textio.c b/Modules/_io/textio.c --- a/Modules/_io/textio.c +++ b/Modules/_io/textio.c @@ -627,7 +627,7 @@ "enabled. With this enabled, on input, the lines endings '\\n', '\\r',\n" "or '\\r\\n' are translated to '\\n' before being returned to the\n" "caller. Conversely, on output, '\\n' is translated to the system\n" - "default line seperator, os.linesep. If newline is any other of its\n" + "default line separator, os.linesep. If newline is any other of its\n" "legal values, that newline becomes the newline when the file is read\n" "and it is returned untranslated. On output, '\\n' is converted to the\n" "newline.\n" -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Feb 26 04:07:54 2012 From: python-checkins at python.org (eric.araujo) Date: Sun, 26 Feb 2012 04:07:54 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_default_-=3E_default?= =?utf8?q?=29=3A_Branch_merge?= Message-ID: http://hg.python.org/cpython/rev/4ba743417053 changeset: 75289:4ba743417053 parent: 75287:937b1613d0e6 parent: 75262:39ddcc5c7fb9 user: ?ric Araujo date: Sun Feb 26 04:01:54 2012 +0100 summary: Branch merge files: Doc/tools/sphinxext/layout.html | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Doc/tools/sphinxext/layout.html b/Doc/tools/sphinxext/layout.html --- a/Doc/tools/sphinxext/layout.html +++ b/Doc/tools/sphinxext/layout.html @@ -6,7 +6,7 @@ {% endblock %} {% block extrahead %} - + {% if not embedded %}{% endif %} {{ super() }} {% endblock %} {% block footer %} -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Feb 26 04:07:55 2012 From: python-checkins at python.org (eric.araujo) Date: Sun, 26 Feb 2012 04:07:55 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_3=2E2_-=3E_default=29?= =?utf8?q?=3A_Merge_3=2E2?= Message-ID: http://hg.python.org/cpython/rev/be4ae700c877 changeset: 75290:be4ae700c877 parent: 75289:4ba743417053 parent: 75288:d0c86cc5a8ba user: ?ric Araujo date: Sun Feb 26 04:07:37 2012 +0100 summary: Merge 3.2 files: Doc/library/logging.rst | 2 +- Lib/distutils/tests/test_sdist.py | 3 ++- Modules/_io/_iomodule.c | 2 +- Modules/_io/textio.c | 2 +- 4 files changed, 5 insertions(+), 4 deletions(-) diff --git a/Doc/library/logging.rst b/Doc/library/logging.rst --- a/Doc/library/logging.rst +++ b/Doc/library/logging.rst @@ -1112,7 +1112,7 @@ If *capture* is ``True``, warnings issued by the :mod:`warnings` module will be redirected to the logging system. Specifically, a warning will be formatted using :func:`warnings.formatwarning` and the resulting string - logged to a logger named ``'py.warnings'`` with a severity of ``'WARNING'``. + logged to a logger named ``'py.warnings'`` with a severity of :const:`WARNING`. If *capture* is ``False``, the redirection of warnings to the logging system will stop, and warnings will be redirected to their original destinations diff --git a/Lib/distutils/tests/test_sdist.py b/Lib/distutils/tests/test_sdist.py --- a/Lib/distutils/tests/test_sdist.py +++ b/Lib/distutils/tests/test_sdist.py @@ -6,6 +6,7 @@ import zipfile from os.path import join from textwrap import dedent +from test.support import captured_stdout, check_warnings, run_unittest try: import zlib @@ -13,7 +14,6 @@ except ImportError: ZLIB_SUPPORT = False -from test.support import captured_stdout, check_warnings, run_unittest from distutils.command.sdist import sdist, show_formats from distutils.core import Distribution @@ -326,6 +326,7 @@ # filling data_files by pointing files in package_data dist.package_data = {'somecode': ['*.txt']} self.write_file((self.tmp_dir, 'somecode', 'doc.txt'), '#') + cmd.formats = ['gztar'] cmd.ensure_finalized() cmd.run() diff --git a/Modules/_io/_iomodule.c b/Modules/_io/_iomodule.c --- a/Modules/_io/_iomodule.c +++ b/Modules/_io/_iomodule.c @@ -59,7 +59,7 @@ "\n" "At the top of the I/O hierarchy is the abstract base class IOBase. It\n" "defines the basic interface to a stream. Note, however, that there is no\n" -"seperation between reading and writing to streams; implementations are\n" +"separation between reading and writing to streams; implementations are\n" "allowed to throw an IOError if they do not support a given operation.\n" "\n" "Extending IOBase is RawIOBase which deals simply with the reading and\n" diff --git a/Modules/_io/textio.c b/Modules/_io/textio.c --- a/Modules/_io/textio.c +++ b/Modules/_io/textio.c @@ -641,7 +641,7 @@ "enabled. With this enabled, on input, the lines endings '\\n', '\\r',\n" "or '\\r\\n' are translated to '\\n' before being returned to the\n" "caller. Conversely, on output, '\\n' is translated to the system\n" - "default line seperator, os.linesep. If newline is any other of its\n" + "default line separator, os.linesep. If newline is any other of its\n" "legal values, that newline becomes the newline when the file is read\n" "and it is returned untranslated. On output, '\\n' is converted to the\n" "newline.\n" -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Feb 26 05:53:16 2012 From: python-checkins at python.org (nick.coghlan) Date: Sun, 26 Feb 2012 05:53:16 +0100 Subject: [Python-checkins] =?utf8?q?peps=3A_Propose_a_simpler_sequential_v?= =?utf8?q?ersion_numbering_scheme_for_standard_library?= Message-ID: http://hg.python.org/peps/rev/f6c8d8af66d7 changeset: 4085:f6c8d8af66d7 user: Nick Coghlan date: Sun Feb 26 14:53:07 2012 +1000 summary: Propose a simpler sequential version numbering scheme for standard library releases files: pep-0413.txt | 453 ++++++++++++++++++++++---------------- 1 files changed, 259 insertions(+), 194 deletions(-) diff --git a/pep-0413.txt b/pep-0413.txt --- a/pep-0413.txt +++ b/pep-0413.txt @@ -14,8 +14,8 @@ Abstract ======== -This PEP proposes the adoption of a new date-based versioning scheme for -the standard library (distinct from, but coupled to, the existing language +This PEP proposes the adoption of a separate versioning scheme for the +standard library (distinct from, but coupled to, the existing language versioning scheme) that allows accelerated releases of the Python standard library, while maintaining (or even slowing down) the current rate of change in the core language definition. @@ -87,11 +87,11 @@ the lives of the CPython core developers a little easier at the expense of everyone else). -But, if we go back to the primary rationale for increasing the pace of change -(i.e. more timely support for web protocols and related technologies), we can -note that those only require *standard library* changes. That means many -(perhaps even most) of the negative effects on the wider community can be -avoided by explicitly limiting which parts of CPython are affected by the +However, if we go back to the primary rationale for increasing the pace of +change (i.e. more timely support for web protocols and related technologies), +we can note that those only require *standard library* changes. That means +many (perhaps even most) of the negative effects on the wider community can +be avoided by explicitly limiting which parts of CPython are affected by the new release cycle, and allowing other parts to evolve at their current, more sedate, pace. @@ -105,12 +105,12 @@ * Language release: "x.y.0" * Maintenance release: "x.y.z" (where z > 0) -* Standard library release: "x.y (YY.MM)" +* Standard library release: "x.y (xy.z)" (where z > 0) Under this scheme, an unqualified version reference (such as "3.3") would always refer to the most recent corresponding language or maintenance release. It will never be used without qualification to refer to a standard -library release (at least by python-dev - obviously, we can only set an +library release (at least, not by python-dev - obviously, we can only set an example, not force the rest of the Python ecosystem to go along with it). Language releases will continue as they are now, as new versions of the @@ -126,7 +126,8 @@ * changes to the AST * any other significant changes to the compilation toolchain * changes to the core interpreter eval loop -* changes to the C ABI (although the PEP 384 stable ABI must be preserved) +* binary incompatible changes to the C ABI (although the PEP 384 stable ABI + must still be preserved) * bug fixes Maintenance releases will also continue as they do today, being strictly @@ -134,9 +135,9 @@ or radical internal changes are permitted. The new standard library releases will occur in parallel with each -maintenance release and will be qualified with a date-based version -identifier documenting their *actual* release date. Standard library -releases may include the following changes: +maintenance release and will be qualified with a new version identifier +documenting the standard library version. Standard library releases may +include the following changes: * new features in pure Python modules * new features in C extension modules (subject to PEP 399 compatibility @@ -144,6 +145,11 @@ * new features in language builtins (provided the C ABI remains unaffected) * bug fixes from the corresponding maintenance release +Standard library version identifiers are constructed by combining the major +and minor version numbers for the Python language release into a single two +digit number and then appending a sequential standard library version +identifier. + Release Cycle ------------- @@ -152,53 +158,53 @@ actually be published on python.org (using the first 3.3 maintenance release, planned for February 2013 as an example):: - 3.3.1 # Maintenance release - 3.3 (13.02) # Standard library release + 3.3.1 # Maintenance release + 3.3 (33.1) # Standard library release A further 6 months later, the next 3.3 maintenance release would again be accompanied by a new standard library release:: - 3.3.2 # Maintenance release - 3.3 (13.08) # Standard library release + 3.3.2 # Maintenance release + 3.3 (33.2) # Standard library release Again, the standard library release would be binary compatible with the previous language release, merely offering additional features at the Python level. Finally, 18 months after the release of 3.3, a new language release would -be made around the same time as the final 3.3 maintenance release:: +be made around the same time as the final 3.3 maintenance and standard +library releases:: - 3.3.3 # Maintenance release - 3.4.0 # Language release - -Language releases would then contain all the features that are not -permitted in standard library releases: + 3.3.3 # Maintenance release + 3.3 (33.3) # Standard library release + 3.4.0 # Language release The 3.4 release cycle would then follow a similar pattern to that for 3.3:: - 3.4.1 # Maintenance release - 3.4 (14.08) # Standard library release + 3.4.1 # Maintenance release + 3.4 (34.1) # Standard library release - 3.4.2 # Maintenance release - 3.4 (15.02) # Standard library release + 3.4.2 # Maintenance release + 3.4 (34.2) # Standard library release - 3.4.3 # Maintenance release - 3.5 # Language release + 3.4.3 # Maintenance release + 3.4 (34.3) # Standard library release + 3.5.0 # Language release Programmatic Version Identification ----------------------------------- -To expose the new release details programmatically, this PEP proposes the -addition of a new ``sys.stdlib_info`` attribute that records the date based +To expose the new version details programmatically, this PEP proposes the +addition of a new ``sys.stdlib_info`` attribute that records the new standard library version above and beyond the underlying interpreter version. Using the initial Python 3.3 release as an example:: - sys.stdlib_info(year=2012, month=8, micro=0, releaselevel='final', serial=0) + sys.stdlib_info(python=33, version=0, releaselevel='final', serial=0) This information would also be included in the ``sys.version`` string:: - Python 3.3.0 (12.08.0, default, Feb 17 2012, 23:03:41) + Python 3.3.0 (33.0, default, Feb 17 2012, 23:03:41) [GCC 4.6.1] @@ -211,19 +217,11 @@ new release is made incorporating the required bug fixes, as well as any other bug fixes that have been committed since the previous release. -For standard library releases, things are slightly more complicated, as the -corresponding source control branch may contain new features in addition to -bug fixes. If such features exist, then, to provide a comprehensible release, -it would be necessary to: +For standard library releases, the process is essentially the same, but the +corresponding "What's New?" document may require some tidying up for the +release (as the standard library release may incorporate new features, +not just bug fixes). -1. Change the release version number to the date of the current month. -2. Update the What's New, NEWS and documentation to refer to the new release - number. -3. Make the new release. - -(Note: due to this problem with out-of-cycle releases, I'm considering an -alternate standard library version scheme that would use date independent -numbers like "33.1" and "33.2". See `Why a date-based versioning scheme?`_). User Scenarios ============== @@ -249,7 +247,7 @@ **Status quo:** must choose between 3.3 and 2.7 -**This PEP:** must choose between 3.3 (13.02), 3.3 and 2.7. +**This PEP:** must choose between 3.3 (33.1), 3.3 and 2.7. **PEP 407:** must choose between 3.4, 3.3 (LTS) and 2.7. @@ -264,16 +262,15 @@ **Status quo:** minor version differences indicate 18-24 months of language evolution -**This PEP:** same as status quo for language core, or just compare the -standard library version numbers to get a rough time in months. +**This PEP:** same as status quo for language core, standard library version +numbers indicate 6 months of standard library evolution. **PEP 407:** minor version differences indicate 18-24 months of language evolution up to 3.3, then 6 months of language evolution thereafter. -**Verdict:** date based numbering schemes with regular release cycles are -a *much* better way to give novices a rough handle on the currency of -information. Since keeping the minor version implications the same is a gain -for *current* Python users, I'm calling this a win twice over for the schemes +**Verdict:** Since language changes and deprecations can have a much bigger +effect on the accuracy of third party documentation than the addition of new +features to the standard library, I'm calling this a win for the scheme in this PEP. @@ -359,7 +356,7 @@ doesn't currently spell out a specific development strategy. Assuming a 3.3 compatibility branch is adopted (as proposed in this PEP), then the outcome would be much the same, but the version number signalling would be -slightly less clear (since you would have to look up to see if a particular +slightly less clear (since you would have to check to see if a particular release was an LTS release or not). **Verdict:** while not as clear cut as some previous scenarios, I'm still @@ -380,7 +377,7 @@ **This PEP:** look for "version added" or "version changed" markers in the documentation. If written as a bare Python version, such as "3.3", check against ``sys.version_info``. If qualified with a standard library version, -such as "3.3 (13.02)", check against ``sys.stdlib_info``. +such as "3.3 (33.1)", check against ``sys.stdlib_info``. **PEP 407:** same as status quo @@ -415,6 +412,26 @@ fault reports will already include it, and it is easy to request if needed. +CPython release managers, handling a security fix +------------------------------------------------- + +**Status quo:** create a new maintenance release incorporating the security +fix and any other bug fixes under source control. Also create source releases +for any branches open solely for security fixes. + +**This PEP:** same as the status quo for maintenance branches. Also create a +new standard library release (potentially incorporating new features along +with the security fix). For security branches, create source releases for +both the former maintenance branch and the standard library update branch. + +**PEP 407:** same as the status quo for maintenance and security branches, +but handling security fixes for non-LTS releases is currently an open +question. + +**Verdict:** until PEP 407 is updated to actually address this scenario, a +clear win for this PEP. + + Effects ======= @@ -427,10 +444,6 @@ worth of standard library changes, as well as any changes associated with new syntax. -If a release date slips by a month or two, the current proposal is to keep -the planned standard library version number rather than updating it to -reflect the actual release date. - Effect on workflow ------------------ @@ -451,14 +464,15 @@ The "version added" and "version changed" markers for any changes made on the ``3.3-compat`` branch would need to be flagged with both the language -version and the standard library version. For example: "3.3 (13.02)". +version and the standard library version. For example: "3.3 (33.1)". Any changes made directly on the ``default`` branch would just be flagged with "3.4" as usual. -The ``3.3-compat`` branch would be closed after the 3.3+13.08 release, as -the next release at that time will be a full language release and changes -(including standard library changes) should be marked accordingly. +The ``3.3-compat`` branch would be closed to normal development at the +same time as the ``3.3`` maintenance branch. The ``3.3-compat`` branch would +remain open for security fixes for the same period of time as the ``3.3`` +maintenance branch. Effect on bugfix cycle @@ -469,14 +483,14 @@ before the change reaches the ``default`` branch. If critical bugs are found in a maintenance release, then new maintenance and -standard library releases will be created to resolve the problem. The micro -release number will be incremented for both the language version and the -standard library version. +standard library releases will be created to resolve the problem. The final +part of the version number will be incremented for both the language version +and the standard library version. If critical bugs are found in a standard library release that do not affect the associated maintenance release, then only a new standard library release -will be created and only the standard library version's micro release number -will be incremented. +will be created and only the standard library's version number will be +incremented. Note that in these circumstances, the standard library release *may* include additional features, rather than just containing the bug fix. It is @@ -505,8 +519,8 @@ such opinions were justified or not). I believe isolating the increased pace of change to the standard library, -and clearly delineating it with a separate date-based version number will -greatly reassure the rest of the community that no, we're not suddenly +and clearly delineating it with a separate version number will greatly +reassure the rest of the community that no, we're not suddenly asking them to triple their own rate of development. Instead, we're merely going to ship standard library updates for the next language release in 6-monthly installments rather than delaying them all until the next language @@ -541,8 +555,9 @@ cycle, we would see: * What's New in Python 3.3? -* What's New in Python 3.3 (13.02)? -* What's New in Python 3.3 (13.08)? +* What's New in the Python Standard Library 33.1? +* What's New in the Python Standard Library 33.2? +* What's New in the Python Standard Library 33.3? And then finally, we would see the next language release: @@ -564,58 +579,59 @@ One suggestion from Barry Warsaw is to adopt a non-conflicting separate-files-per-change approach, similar to that used by Twisted [2_]. -For this PEP, one possible layout for such an approach (to be adopted -following the initial release of 3.3.0+12.8.0 that will use the current NEWS -process) might look like:: +Given that the current manually updated NEWS file will be used for the 3.3.0 +release, one possible layout for such an approach might look like:: Misc/ + NEWS # Now autogenerated from news_entries news_entries/ - 3.3.1/ # Maintenance branch changes + 3.3/ + NEWS # Original 3.3 NEWS file + maint.1/ # Maintenance branch changes + core/ + + builtins/ + + extensions/ + + library/ + + documentation/ + + tests/ + + compat.1/ # Compatibility branch changes + builtins/ + + extensions/ + + library/ + + documentation/ + + tests/ + + # Add maint.2, compat.2 etc as releases are made + 3.4/ + core/ + builtins/ - + extensions/ - + library/ - + documentation/ - + tests/ - - 3.4.0/ # default branch changes - language/ # Only exists for "x.y.0" - - builtins/ - - extensions/ - - library/ - - documentation/ - - tests/ - - 13.02.0/ # 3.3 compatibility branch changes - builtins/ - - extensions/ - - library/ - - documentation/ - - tests/ - - NEWS # Now autogenerated from news_entries + + # Add maint.1, compat.1 etc as releases are made Putting the version information in the directory heirarchy isn't strictly necessary (since the NEWS file generator could figure out from the version history), but does make it easier for *humans* to keep the different versions in order. -Other layouts are obviously also possible (for example, having separate "3.3" -and "3.4" directories to group entries for each language version and the -associated maintenance and standard library releases). - Other benefits of reduced version coupling ========================================== @@ -633,81 +649,17 @@ *slow down* the rate of change in the language definition. The language moratorium for Python 3.2 effectively slowed that cycle down to *more than 3 years* (3.1: June 2009, 3.3: August 2012) without causing any major -complaints. +problems or complaints. The NEWS file management scheme described above is actually designed to allow us the flexibility to slow down language releases at the same time as standard library releases become more frequent. -As simple example, if a full two years was allowed between 3.3 and 3.4, +As a simple example, if a full two years was allowed between 3.3 and 3.4, the 3.3 release cycle would end up looking like:: - 3.2.4 # Maintenance release - 3.3.0 # Language release - - 3.3.1 # Maintenance release - 3.3 (13.02) # Standard library release - - 3.3.2 # Maintenance release - 3.3 (13.08) # Standard library release - - 3.3.3 # Maintenance release - 3.3 (14.02) # Standard library release - - 3.3.4 # Maintenance release - 3.4.0 # Language release - -The elegance of the proposed NEWS entry layout is that this decision -wouldn't need to be made until after the 13.08 standard library release. At -that point, the ``3.3-compat`` branch could be kept open (thus adding -another standard library release to the cycle), or else it could be closed, -committing to the next release being a full language release. If the -compatibility branch was kept open, the choice between another standard -library release or a full language release would then be available every -6 months after that. - - -Further increasing the pace of standard library development ------------------------------------------------------------ - -A further benefit of the scheme proposed in this PEP is that it almost -*fully* decouples the language release cycle from the standard library -release cycle. The standard library could be updated every 3 months, or -even once a month, without having any flow on effects on the language -version numbering or the perceived stability of the core language. - -While that pace of development isn't practical as long as the binary -installer creation for Windows and Mac OS X involves several manual steps -(including manual testing) and for as long as we don't have separate -"-release" trees that only receive versions that have been marked as -good by the stable buildbots, it's a useful criterion to keep in mind when -considering proposed new versioning schemes: what if we eventually want -to make standard library releases even *faster* than every 6 months? - -If the practical issues were ever resolved, then the separate date-based -versioning scheme in this PEP could handle it. The approach proposed in -PEP 407 could not (at least, not without a lot of user confusion). - - -Other Questions -=============== - -Why a date-based versioning scheme? ------------------------------------ - -While a date-based scheme does mean additional work in the case of an -out-of-cycle release, it's an easy way to come up with a numbering system -that is clearly orthogonal to the existing versioning scheme used for -language releases. - -Another possibility would just be ``major.minor`` versioning where: - -* major: xy from the corresponding language release (that is, "33" for 3.3) -* minor: release sequence number for the standard library releases - -Then the Python 3.3 release series would look like:: - - 3.3.0 # Language release + 3.2.4 # Maintenance release + 3.3.0 # Language release 3.3.1 # Maintenance release 3.3 (33.1) # Standard library release @@ -715,13 +667,64 @@ 3.3.2 # Maintenance release 3.3 (33.2) # Standard library release - 3.3.3 # Maintenance release - 3.4.0 # Language release + 3.3.3 # Maintenance release + 3.3 (33.3) # Standard library release -Such a scheme would have the advantage of tolerating out-of-cycle releases -without needing to adjust the version numbering for the release, but would -lose the minor benefit of providing clearer age information within the -versioning scheme itself. + 3.3.4 # Maintenance release + 3.3 (33.4) # Standard library release + 3.4.0 # Language release + +The elegance of the proposed branch structure and NEWS entry layout is that +this decision wouldn't really need to be made until shortly before the planned +3.4 release date. At that point, the decision could be made to postpone the +3.4 release and keep the ``3.3`` and ``3.3-compat`` branches open after the +3.3.3 maintenance release and the 3.3 (33.3) standard library release, thus +adding another standard library release to the cycle. The choice between +another standard library release or a full language release would then be +available every 6 months after that. + + +Further increasing the pace of standard library development +----------------------------------------------------------- + +As noted in the previous section, one benefit of the scheme proposed in this +PEP is that it largely decouples the language release cycle from the +standard library release cycle. The standard library could be updated every +3 months, or even once a month, without having any flow on effects on the +language version numbering or the perceived stability of the core language. + +While that pace of development isn't practical as long as the binary +installer creation for Windows and Mac OS X involves several manual steps +(including manual testing) and for as long as we don't have separate +"-release" trees that only receive versions that have been marked as +good by the stable buildbots, it's still a useful criterion to keep in mind +when considering proposed new versioning schemes: what if we eventually want +to make standard library releases even *faster* than every 6 months? + +If the practical issues were ever resolved, then the separate standard +library versioning scheme in this PEP could handle it. The tagged version +number approach proposed in PEP 407 could not (at least, not without a lot +of user confusion and uncertainty). + + +Other Questions +=============== + +Why not a date-based versioning scheme? +--------------------------------------- + +Earlier versions of this PEP proposed a date-based versioning scheme for +the standard library. However, such a scheme made it very difficult to +handle out-of-cycle releases to fix security issues and other critical +bugs in standard library releases, as it required the following steps: + +1. Change the release version number to the date of the current month. +2. Update the What's New, NEWS and documentation to refer to the new release + number. +3. Make the new release. + +With the sequential scheme now proposed, such releases should at most require +a little tidying up of the What's New document before making the release. Why isn't PEP 384 enough? @@ -737,25 +740,85 @@ migrating to the stable ABI can involve quite a lot of work (especially for extension modules that define a lot of classes). With limited development resources available, any time spent on such a change is time that could -otherwise have been spent working on features that are offer more direct -benefits to end users. +otherwise have been spent working on features that offer more direct benefits +to end users. + +There are also other benefits to separate versioning (as described above) +that are not directly related to the question of binary compatibility with +third party C extensions. + + +Why no binary compatible additions to the C ABI in standard library releases? +----------------------------------------------------------------------------- + +There's a case to be made that *additions* to the CPython C ABI could +reasonably be permitted in standard library releases. This would give C +extension authors the same freedom as any other package or module author +to depend either on a particular language version or on a standard library +version. + +The PEP currently associates the interpreter version with the language +version, and therefore limits major interpreter changes (including C ABI +additions) to the language releases. + +An alternative, internally consistent, approach would be to link the +interpreter version with the standard library version, with only changes that +may affect backwards compatibility limited to language releases. + +Under such a scheme, the following changes would be acceptable in standard +library releases: + +* Standard library updates + + * new features in pure Python modules + * new features in C extension modules (subject to PEP 399 compatibility + requirements) + * new features in language builtins + +* Interpreter implementation updates + + * binary compatible additions to the C ABI + * changes to the compilation toolchain that do not affect the AST or alter + the bytecode magic number + * changes to the core interpreter eval loop + +* bug fixes from the corresponding maintenance release + +And the following changes would be acceptable in language releases: + +* new language syntax +* any updates acceptable in a standard library release +* new deprecation warnings +* removal of previously deprecated features +* changes to the AST +* changes to the emitted bytecode that require altering the magic number +* binary incompatible changes to the C ABI (although the PEP 384 stable ABI + must still be preserved) + +While such an approach could probably be made to work, there does not appear +to be a compelling justification for it, and the approach currently described +in the PEP is simpler and easier to explain. Why not separate out the standard library entirely? --------------------------------------------------- -Because it's a lot of work for next to no pay-off. CPython without the -standard library is useless (the build chain won't even run, let alone the -test suite). You can't create a standalone pure Python standard library -either, because too many "modules" are actually tightly linked in to the -internal details of their respective interpreters (e.g. ``weakref``, ``gc``, -``sys``, ``inspect``, ``ast``). +A concept that is occasionally discussed is the idea of making the standard +library truly independent from the CPython reference implementation. -Creating a separate development branch that is kept compatible with the -previous feature release, and making releases from that branch that are -flagged with a separate date-based version number should provide most of -the benefits of a separate standard library repository with only a fraction -of the pain. +My personal opinion is that actually making such a change would involve a +lot of work for next to no pay-off. CPython without the standard library is +useless (the build chain won't even run, let alone the test suite). You also +can't create a standalone pure Python standard library either, because too +many "standard library modules" are actually tightly linked in to the +internal details of their respective interpreters (for example, the builtins, +``weakref``, ``gc``, ``sys``, ``inspect``, ``ast``). + +Creating a separate CPython development branch that is kept compatible with +the previous language release, and making releases from that branch that are +identified with a separate standard library version number should provide +most of the benefits of a separate standard library repository with only a +fraction of the pain. Acknowledgements -- Repository URL: http://hg.python.org/peps From python-checkins at python.org Sun Feb 26 06:34:36 2012 From: python-checkins at python.org (nick.coghlan) Date: Sun, 26 Feb 2012 06:34:36 +0100 Subject: [Python-checkins] =?utf8?q?peps=3A_Describe_two_more_alternate_nu?= =?utf8?q?mbering_schemes?= Message-ID: http://hg.python.org/peps/rev/a2ad0f016166 changeset: 4086:a2ad0f016166 user: Nick Coghlan date: Sun Feb 26 15:33:31 2012 +1000 summary: Describe two more alternate numbering schemes files: pep-0413.txt | 68 +++++++++++++++++++++++++++++++++++++++- 1 files changed, 67 insertions(+), 1 deletions(-) diff --git a/pep-0413.txt b/pep-0413.txt --- a/pep-0413.txt +++ b/pep-0413.txt @@ -710,9 +710,75 @@ Other Questions =============== -Why not a date-based versioning scheme? +Why not use the major version number? +------------------------------------- + +The simplest and most logical solution would actually be to map the +major.minor.micro version numbers to the language version, stdlib version +and maintenance release version respectively. + +Instead of releasing Python 3.3.0, we would instead release Python 4.0.0 +and the release cycle would look like:: + + 4.0.0 # Language release + + 4.0.1 # Maintenance release + 4.1.0 # Standard library release + + 4.0.2 # Maintenance release + 4.2.0 # Standard library release + + 4.0.3 # Maintenance release + 4.3.0 # Standard library release + 5.0.0 # Language release + +However, the ongoing pain of the Python 2 -> Python 3 transition (and +associated workarounds like the ``python3`` and ``python2`` symlinks to +refer directly to the desired release series) means that this simple option +isn't viable for historical reasons. + +One way that this simple approach *could* be made to work is to merge the +current major and minor version numbers directly into a 2-digit major +version number:: + + 33.0.0 # Language release + + 33.0.1 # Maintenance release + 33.1.0 # Standard library release + + 33.0.2 # Maintenance release + 33.2.0 # Standard library release + + 33.0.3 # Maintenance release + 33.3.0 # Standard library release + 34.0.0 # Language release + + +Why not use a four part version number? --------------------------------------- +Another simple versioning scheme would just add a "standard library" version +into the existing versioning scheme:: + + 3.3.0.0 # Language release + + 3.3.0.1 # Maintenance release + 3.3.1.0 # Standard library release + + 3.3.0.2 # Maintenance release + 3.3.2.0 # Standard library release + + 3.3.0.3 # Maintenance release + 3.3.3.0 # Standard library release + 3.4.0.0 # Language release + +However, this scheme isn't viable due to backwards compatibility constraints +on the ``sys.version_info`` structure. + + +Why not use a date-based versioning scheme? +------------------------------------------- + Earlier versions of this PEP proposed a date-based versioning scheme for the standard library. However, such a scheme made it very difficult to handle out-of-cycle releases to fix security issues and other critical -- Repository URL: http://hg.python.org/peps From python-checkins at python.org Sun Feb 26 08:40:07 2012 From: python-checkins at python.org (ezio.melotti) Date: Sun, 26 Feb 2012 08:40:07 +0100 Subject: [Python-checkins] =?utf8?q?cpython=3A_=2314081=3A_The_sep_and_max?= =?utf8?q?split_parameter_to_str=2Esplit=2C_bytes=2Esplit=2C_and?= Message-ID: http://hg.python.org/cpython/rev/db968ac2b82c changeset: 75291:db968ac2b82c user: Ezio Melotti date: Sun Feb 26 09:39:55 2012 +0200 summary: #14081: The sep and maxsplit parameter to str.split, bytes.split, and bytearray.split may now be passed as keyword arguments. files: Doc/library/stdtypes.rst | 4 ++-- Lib/test/string_tests.py | 24 +++++++++++++++++++++++- Lib/test/test_bytes.py | 16 ++++++++++++++++ Misc/NEWS | 3 +++ Objects/bytearrayobject.c | 20 ++++++++++++-------- Objects/bytesobject.c | 20 ++++++++++++-------- Objects/unicodeobject.c | 24 ++++++++++++++---------- 7 files changed, 82 insertions(+), 29 deletions(-) diff --git a/Doc/library/stdtypes.rst b/Doc/library/stdtypes.rst --- a/Doc/library/stdtypes.rst +++ b/Doc/library/stdtypes.rst @@ -1301,7 +1301,7 @@ 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* @@ -1323,7 +1323,7 @@ '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, diff --git a/Lib/test/string_tests.py b/Lib/test/string_tests.py --- a/Lib/test/string_tests.py +++ b/Lib/test/string_tests.py @@ -56,7 +56,7 @@ result = self.fixtype(result) obj = self.fixtype(obj) args = self.fixtype(args) - kwargs = self.fixtype(kwargs) + kwargs = {k: self.fixtype(v) for k,v in kwargs.items()} realresult = getattr(obj, methodname)(*args, **kwargs) self.assertEqual( result, @@ -389,6 +389,17 @@ 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) @@ -446,6 +457,17 @@ 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) diff --git a/Lib/test/test_bytes.py b/Lib/test/test_bytes.py --- a/Lib/test/test_bytes.py +++ b/Lib/test/test_bytes.py @@ -435,6 +435,14 @@ 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', @@ -463,6 +471,14 @@ 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', diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -223,6 +223,9 @@ - PEP 393: flexible string representation. Thanks to Torsten Becker for the initial implementation, and Victor Stinner for various bug fixes. +- Issue #14081: The 'sep' and 'maxsplit' parameter to str.split, bytes.split, + and bytearray.split may now be passed as keyword arguments. + - 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. diff --git a/Objects/bytearrayobject.c b/Objects/bytearrayobject.c --- a/Objects/bytearrayobject.c +++ b/Objects/bytearrayobject.c @@ -2039,7 +2039,7 @@ } 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\ @@ -2047,15 +2047,17 @@ 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; @@ -2131,7 +2133,7 @@ } 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\ @@ -2140,15 +2142,17 @@ 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; @@ -2869,9 +2873,9 @@ {"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__}, + {"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 , diff --git a/Objects/bytesobject.c b/Objects/bytesobject.c --- a/Objects/bytesobject.c +++ b/Objects/bytesobject.c @@ -972,7 +972,7 @@ #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\ @@ -980,15 +980,17 @@ 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; @@ -1060,7 +1062,7 @@ } 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\ @@ -1070,15 +1072,17 @@ 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; @@ -2470,9 +2474,9 @@ {"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__}, + {"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, diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -12499,7 +12499,7 @@ } 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\ @@ -12508,12 +12508,14 @@ removed from the result."); static PyObject* -unicode_split(PyObject *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) @@ -12722,7 +12724,7 @@ } 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\ @@ -12731,12 +12733,14 @@ is a separator."); static PyObject* -unicode_rsplit(PyObject *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) @@ -13167,8 +13171,8 @@ {"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__}, -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Feb 26 09:02:59 2012 From: python-checkins at python.org (nick.coghlan) Date: Sun, 26 Feb 2012 09:02:59 +0100 Subject: [Python-checkins] =?utf8?q?cpython=3A_Close_issue_=236210=3A_Impl?= =?utf8?q?ement_PEP_409?= Message-ID: http://hg.python.org/cpython/rev/b299c4f31ff2 changeset: 75292:b299c4f31ff2 user: Nick Coghlan date: Sun Feb 26 17:49:52 2012 +1000 summary: Close issue #6210: Implement PEP 409 files: Doc/ACKS.txt | 1 + Doc/c-api/exceptions.rst | 19 +++- Doc/library/exceptions.rst | 18 +++++ Doc/library/stdtypes.rst | 9 +- Doc/whatsnew/3.3.rst | 64 +++++++++++++++++++ Include/pyerrors.h | 1 + Lib/test/test_exceptions.py | 29 +++++++- Lib/test/test_raise.py | 82 ++++++++++++++++++++++++- Lib/test/test_traceback.py | 15 ++++ Lib/traceback.py | 8 +- Misc/ACKS | 1 + Misc/NEWS | 4 + Objects/exceptions.c | 31 +++++--- Python/ceval.c | 19 +++-- Python/pythonrun.c | 6 +- 15 files changed, 264 insertions(+), 43 deletions(-) diff --git a/Doc/ACKS.txt b/Doc/ACKS.txt --- a/Doc/ACKS.txt +++ b/Doc/ACKS.txt @@ -62,6 +62,7 @@ * Stefan Franke * Jim Fulton * Peter Funk + * Ethan Furman * Lele Gaifax * Matthew Gallagher * Gabriel Genellina diff --git a/Doc/c-api/exceptions.rst b/Doc/c-api/exceptions.rst --- a/Doc/c-api/exceptions.rst +++ b/Doc/c-api/exceptions.rst @@ -421,17 +421,24 @@ .. 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__`. + + If there is no cause associated, this returns *NULL* (from Python + ``__cause__ is Ellipsis``). If the cause is :const:`None`, the default + exception display routines stop showing the context chain. .. 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*. + + If the cause is set to :const:`None` the default exception display + routines will not display this exception's context, and will not follow the + chain any further. .. _unicodeexceptions: diff --git a/Doc/library/exceptions.rst b/Doc/library/exceptions.rst --- a/Doc/library/exceptions.rst +++ b/Doc/library/exceptions.rst @@ -34,6 +34,24 @@ 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 :const:`None`, and it will bet set as :attr:`__cause__` on the +raised exception. If :attr:`__cause__` is an exception it will be displayed +instead of :attr:`__context__`; if :attr:`__cause__` is None, +:attr:`__context__` will not be displayed by the default exception handling +code. (Note: the default value for :attr:`__context__` is :const:`None`, +while the default value for :attr:`__cause__` is :const:`Ellipsis`.) + +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 ------------ diff --git a/Doc/library/stdtypes.rst b/Doc/library/stdtypes.rst --- a/Doc/library/stdtypes.rst +++ b/Doc/library/stdtypes.rst @@ -2985,10 +2985,11 @@ 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). ``type(Ellipsis)()`` produces the -:const:`Ellipsis` singleton. +This object is commonly used by slicing (see :ref:`slicings`), but may also +be used in other situations where a sentinel value other than :const:`None` +is needed. It supports no special operations. There is exactly one ellipsis +object, named :const:`Ellipsis` (a built-in name). ``type(Ellipsis)()`` +produces the :const:`Ellipsis` singleton. It is written as ``Ellipsis`` or ``...``. diff --git a/Doc/whatsnew/3.3.rst b/Doc/whatsnew/3.3.rst --- a/Doc/whatsnew/3.3.rst +++ b/Doc/whatsnew/3.3.rst @@ -254,6 +254,9 @@ PEP 380: Syntax for Delegating to a Subgenerator ================================================ +:pep:`380` - Syntax for Delegating to a Subgenerator + PEP written by Greg Ewing. + 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. @@ -267,6 +270,67 @@ Nick Coghlan) +PEP 409: Suppressing exception context +====================================== + +:pep:`409` - Suppressing exception context + PEP written by Ethan Furman, implemented by Ethan Furman and Nick Coghlan. + +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 "", line 1, in + File "", 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 "", line 6, in __getattr__ + KeyError: 'x' + + During handling of the above exception, another exception occurred: + + Traceback (most recent call last): + File "", line 1, in + File "", 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',) + + PEP 3155: Qualified name for classes and functions ================================================== diff --git a/Include/pyerrors.h b/Include/pyerrors.h --- a/Include/pyerrors.h +++ b/Include/pyerrors.h @@ -105,6 +105,7 @@ /* Cause manipulation (PEP 3134) */ PyAPI_FUNC(PyObject *) PyException_GetCause(PyObject *); PyAPI_FUNC(void) PyException_SetCause(PyObject *, PyObject *); +PyAPI_FUNC(int) _PyException_SetCauseChecked(PyObject *, PyObject *); /* Context manipulation (PEP 3134) */ PyAPI_FUNC(PyObject *) PyException_GetContext(PyObject *); diff --git a/Lib/test/test_exceptions.py b/Lib/test/test_exceptions.py --- a/Lib/test/test_exceptions.py +++ b/Lib/test/test_exceptions.py @@ -387,19 +387,36 @@ def testChainingAttrs(self): e = Exception() - self.assertEqual(e.__context__, None) - self.assertEqual(e.__cause__, None) + self.assertIsNone(e.__context__) + self.assertIs(e.__cause__, Ellipsis) e = TypeError() - self.assertEqual(e.__context__, None) - self.assertEqual(e.__cause__, None) + self.assertIsNone(e.__context__) + self.assertIs(e.__cause__, Ellipsis) class MyException(EnvironmentError): pass e = MyException() - self.assertEqual(e.__context__, None) - self.assertEqual(e.__cause__, None) + self.assertIsNone(e.__context__) + self.assertIs(e.__cause__, Ellipsis) + + def testChainingDescriptors(self): + try: + raise Exception() + except Exception as exc: + e = exc + + self.assertIsNone(e.__context__) + self.assertIs(e.__cause__, Ellipsis) + + e.__context__ = NameError() + e.__cause__ = None + self.assertIsInstance(e.__context__, NameError) + self.assertIsNone(e.__cause__) + + e.__cause__ = Ellipsis + self.assertIs(e.__cause__, Ellipsis) def testKeywordArgs(self): # test that builtin exception don't take keyword args, diff --git a/Lib/test/test_raise.py b/Lib/test/test_raise.py --- a/Lib/test/test_raise.py +++ b/Lib/test/test_raise.py @@ -3,12 +3,27 @@ """Tests for the raise statement.""" -from test import support +from test import support, script_helper +import re import sys import types import unittest +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 get_tb(): try: raise OSError() @@ -77,6 +92,16 @@ 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: @@ -139,6 +164,23 @@ 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__) + raise exc from Ellipsis + except ValueError as exc: + e = exc + + self.assertIs(e.__cause__, Ellipsis) + self.assertIsInstance(e.__context__, TypeError) + def test_invalid_cause(self): try: raise IndexError from 5 @@ -178,6 +220,44 @@ class TestTraceback(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. + """ + 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 test_traceback_verbiage(self): + code = """ +try: + raise ValueError +except: + raise NameError from None +""" + text, exitcode = self.get_output(code) + self.assertEqual(len(text), 3) + self.assertTrue(text[0].startswith('Traceback')) + self.assertTrue(text[1].startswith(' File ')) + self.assertTrue(text[2].startswith('NameError')) + def test_sets_traceback(self): try: raise IndexError() diff --git a/Lib/test/test_traceback.py b/Lib/test/test_traceback.py --- a/Lib/test/test_traceback.py +++ b/Lib/test/test_traceback.py @@ -246,6 +246,21 @@ 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/traceback.py b/Lib/traceback.py --- a/Lib/traceback.py +++ b/Lib/traceback.py @@ -120,14 +120,14 @@ seen.add(exc) its = [] cause = exc.__cause__ - if cause is not None and cause not in seen: - its.append(_iter_chain(cause, None, seen)) - its.append([(_cause_message, None)]) - else: + if cause is Ellipsis: 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 cause is not None and cause not in seen: + its.append(_iter_chain(cause, False, seen)) + its.append([(_cause_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/Misc/ACKS b/Misc/ACKS --- a/Misc/ACKS +++ b/Misc/ACKS @@ -338,6 +338,7 @@ Tadayoshi Funaba Gyro Funch Peter Funk +Ethan Furman Geoff Furnish Ulisses Furquim Hagen F?rstenau diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -10,6 +10,10 @@ Core and Builtins ----------------- +- 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 #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 diff --git a/Objects/exceptions.c b/Objects/exceptions.c --- a/Objects/exceptions.c +++ b/Objects/exceptions.c @@ -266,7 +266,24 @@ PyObject *res = PyException_GetCause(self); if (res) return res; /* new reference already returned above */ - Py_RETURN_NONE; + Py_INCREF(Py_Ellipsis); + return Py_Ellipsis; +} + +int +_PyException_SetCauseChecked(PyObject *self, PyObject *arg) { + if (arg == Py_Ellipsis) { + arg = NULL; + } else if (arg != Py_None && !PyExceptionInstance_Check(arg)) { + PyErr_SetString(PyExc_TypeError, "exception cause must be None, " + "Ellipsis or derive from BaseException"); + return -1; + } else { + /* PyException_SetCause steals a reference */ + Py_INCREF(arg); + } + PyException_SetCause(self, arg); + return 0; } static int @@ -274,18 +291,8 @@ if (arg == NULL) { PyErr_SetString(PyExc_TypeError, "__cause__ may not be deleted"); return -1; - } else if (arg == Py_None) { - arg = NULL; - } else if (!PyExceptionInstance_Check(arg)) { - PyErr_SetString(PyExc_TypeError, "exception cause must be None " - "or derive from BaseException"); - return -1; - } else { - /* PyException_SetCause steals this reference */ - Py_INCREF(arg); } - PyException_SetCause(self, arg); - return 0; + return _PyException_SetCauseChecked(self, arg); } diff --git a/Python/ceval.c b/Python/ceval.c --- a/Python/ceval.c +++ b/Python/ceval.c @@ -3567,22 +3567,23 @@ if (cause) { PyObject *fixed_cause; + int result; if (PyExceptionClass_Check(cause)) { fixed_cause = PyObject_CallObject(cause, NULL); if (fixed_cause == NULL) goto raise_error; - Py_DECREF(cause); + Py_CLEAR(cause); + } else { + /* Let "exc.__cause__ = cause" handle all further checks */ + fixed_cause = cause; + cause = NULL; /* Steal the reference */ } - else if (PyExceptionInstance_Check(cause)) { - fixed_cause = cause; - } - else { - PyErr_SetString(PyExc_TypeError, - "exception causes must derive from " - "BaseException"); + /* We retain ownership of the reference to fixed_cause */ + result = _PyException_SetCauseChecked(value, fixed_cause); + Py_DECREF(fixed_cause); + if (result < 0) { goto raise_error; } - PyException_SetCause(value, fixed_cause); } PyErr_SetObject(type, value); diff --git a/Python/pythonrun.c b/Python/pythonrun.c --- a/Python/pythonrun.c +++ b/Python/pythonrun.c @@ -1698,7 +1698,11 @@ else if (PyExceptionInstance_Check(value)) { cause = PyException_GetCause(value); context = PyException_GetContext(value); - if (cause) { + if (cause && cause == Py_None) { + /* print neither cause nor context */ + ; + } + else if (cause) { res = PySet_Contains(seen, cause); if (res == -1) PyErr_Clear(); -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Feb 26 10:08:41 2012 From: python-checkins at python.org (eli.bendersky) Date: Sun, 26 Feb 2012 10:08:41 +0100 Subject: [Python-checkins] =?utf8?q?devguide=3A_added_self_to_xml=2Eetree_?= =?utf8?q?maintainers?= Message-ID: http://hg.python.org/devguide/rev/bdae01d1f122 changeset: 492:bdae01d1f122 user: Eli Bendersky date: Sun Feb 26 11:08:36 2012 +0200 summary: added self to xml.etree maintainers files: experts.rst | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/experts.rst b/experts.rst --- a/experts.rst +++ b/experts.rst @@ -246,7 +246,7 @@ xml.dom xml.dom.minidom xml.dom.pulldom -xml.etree effbot (inactive) +xml.etree effbot (inactive), eli.bendersky xml.parsers.expat xml.sax xml.sax.handler -- Repository URL: http://hg.python.org/devguide From python-checkins at python.org Sun Feb 26 10:54:55 2012 From: python-checkins at python.org (gregory.p.smith) Date: Sun, 26 Feb 2012 10:54:55 +0100 Subject: [Python-checkins] =?utf8?b?Y3B5dGhvbiAoMy4yKTogSXNzdWUgIzE0MTIz?= =?utf8?q?=3A_Explicitly_mention_that_old_style_=25_string_formatting_has_?= =?utf8?q?caveats?= Message-ID: http://hg.python.org/cpython/rev/80069bbae26d changeset: 75293:80069bbae26d branch: 3.2 parent: 75288:d0c86cc5a8ba user: Gregory P. Smith date: Sun Feb 26 01:54:07 2012 -0800 summary: Issue #14123: Explicitly mention that old style % string formatting has caveats but is not going away any time soon. files: Doc/library/stdtypes.rst | 9 +++++++-- 1 files changed, 7 insertions(+), 2 deletions(-) diff --git a/Doc/library/stdtypes.rst b/Doc/library/stdtypes.rst --- a/Doc/library/stdtypes.rst +++ b/Doc/library/stdtypes.rst @@ -1437,8 +1437,13 @@ .. note:: - The formatting operations described here are obsolete and may go away in future - versions of Python. Use the new :ref:`string-formatting` in new code. + 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. String objects have one unique built-in operation: the ``%`` operator (modulo). This is also known as the string *formatting* or *interpolation* operator. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Feb 26 10:54:56 2012 From: python-checkins at python.org (gregory.p.smith) Date: Sun, 26 Feb 2012 10:54:56 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_3=2E2_-=3E_default=29?= =?utf8?q?=3A_Issue_=2314123=3A_Explicitly_mention_that_old_style_=25_stri?= =?utf8?q?ng_formatting_has_caveats?= Message-ID: http://hg.python.org/cpython/rev/98a1855ebfe1 changeset: 75294:98a1855ebfe1 parent: 75292:b299c4f31ff2 parent: 75293:80069bbae26d user: Gregory P. Smith date: Sun Feb 26 01:54:46 2012 -0800 summary: Issue #14123: Explicitly mention that old style % string formatting has caveats but is not going away any time soon. files: Doc/library/stdtypes.rst | 9 +++++++-- 1 files changed, 7 insertions(+), 2 deletions(-) diff --git a/Doc/library/stdtypes.rst b/Doc/library/stdtypes.rst --- a/Doc/library/stdtypes.rst +++ b/Doc/library/stdtypes.rst @@ -1466,8 +1466,13 @@ .. note:: - The formatting operations described here are obsolete and may go away in future - versions of Python. Use the new :ref:`string-formatting` in new code. + 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. String objects have one unique built-in operation: the ``%`` operator (modulo). This is also known as the string *formatting* or *interpolation* operator. -- Repository URL: http://hg.python.org/cpython From eliben at gmail.com Sun Feb 26 14:05:45 2012 From: eliben at gmail.com (Eli Bendersky) Date: Sun, 26 Feb 2012 15:05:45 +0200 Subject: [Python-checkins] cpython (3.2): Issue #14123: Explicitly mention that old style % string formatting has caveats In-Reply-To: References: Message-ID: > > - The formatting operations described here are obsolete and may go away > in future > - versions of Python. Use the new :ref:`string-formatting` in new code. > + 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. > Please consider just deleting the last sentence. Documentation is meant for users (often new users) and not core devs. As such, I just don't see what it adds. If the aim to to document this intent somewhere, a PEP would be a better place than the formal documentation. Eli -------------- next part -------------- An HTML attachment was scrubbed... URL: From python-checkins at python.org Sun Feb 26 17:28:37 2012 From: python-checkins at python.org (charles-francois.natali) Date: Sun, 26 Feb 2012 17:28:37 +0100 Subject: [Python-checkins] =?utf8?q?cpython=3A_Issue_=2314107=3A_test=3A_F?= =?utf8?q?ix_a_deadlock_involving_the_memory_watchdog_thread=2E?= Message-ID: http://hg.python.org/cpython/rev/52dc4fcd0d6f changeset: 75295:52dc4fcd0d6f user: Charles-Fran?ois Natali date: Sun Feb 26 17:27:32 2012 +0100 summary: Issue #14107: test: Fix a deadlock involving the memory watchdog thread. files: Lib/test/support.py | 10 ++++++++++ 1 files changed, 10 insertions(+), 0 deletions(-) diff --git a/Lib/test/support.py b/Lib/test/support.py --- a/Lib/test/support.py +++ b/Lib/test/support.py @@ -45,6 +45,11 @@ except ImportError: zlib = None +try: + import fcntl +except ImportError: + fcntl = None + __all__ = [ "Error", "TestFailed", "ResourceDenied", "import_module", "verbose", "use_resources", "max_memuse", "record_original_stdout", @@ -1184,6 +1189,11 @@ sys.stderr.flush() return pipe_fd, wfd = os.pipe() + # set the write end of the pipe non-blocking to avoid blocking the + # watchdog thread when the consumer doesn't drain the pipe fast enough + if fcntl: + flags = fcntl.fcntl(wfd, fcntl.F_GETFL) + fcntl.fcntl(wfd, fcntl.F_SETFL, flags|os.O_NONBLOCK) # _file_watchdog() doesn't take the GIL in its child thread, and # therefore collects statistics timely faulthandler._file_watchdog(rfd, wfd, 1.0) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Feb 26 18:13:31 2012 From: python-checkins at python.org (antoine.pitrou) Date: Sun, 26 Feb 2012 18:13:31 +0100 Subject: [Python-checkins] =?utf8?q?cpython=3A_Issue_=2314080=3A_fix_spora?= =?utf8?q?dic_test=5Fimp_failure=2E__Patch_by_Stefan_Krah=2E?= Message-ID: http://hg.python.org/cpython/rev/1d7472b015f0 changeset: 75296:1d7472b015f0 user: Antoine Pitrou date: Sun Feb 26 18:09:50 2012 +0100 summary: Issue #14080: fix sporadic test_imp failure. Patch by Stefan Krah. files: Lib/test/test_imp.py | 1 + 1 files changed, 1 insertions(+), 0 deletions(-) diff --git a/Lib/test/test_imp.py b/Lib/test/test_imp.py --- a/Lib/test/test_imp.py +++ b/Lib/test/test_imp.py @@ -325,6 +325,7 @@ self.addCleanup(cleanup) # Touch the __init__.py file. 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__)) -- Repository URL: http://hg.python.org/cpython From martin at v.loewis.de Sun Feb 26 19:50:10 2012 From: martin at v.loewis.de (martin at v.loewis.de) Date: Sun, 26 Feb 2012 19:50:10 +0100 Subject: [Python-checkins] cpython (3.2): Issue #14123: Explicitly mention that old style % string formatting has caveats In-Reply-To: References: Message-ID: <20120226195010.Horde.M75bFKGZi1VPSn7ineISvFA@webmail.df.eu> Zitat von Eli Bendersky : >> >> - The formatting operations described here are obsolete and may go away >> in future >> - versions of Python. Use the new :ref:`string-formatting` in new code. >> + 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. >> > > Please consider just deleting the last sentence. Documentation is meant for > users (often new users) and not core devs. As such, I just don't see what > it adds. If the aim to to document this intent somewhere, a PEP would be a > better place than the formal documentation. I'd rather leave the last sentence, and delete the penultimate sentence. The last sentence is useful information to the end user ("we will not deprecate printf-style formatting, so there is no need to change existing code"). I'd drop the penultimate sentence because there is no consensus that it is a useful recommendation (and it is certainly not a statement of fact). Regards, Martin From python-checkins at python.org Sun Feb 26 21:54:52 2012 From: python-checkins at python.org (benjamin.peterson) Date: Sun, 26 Feb 2012 21:54:52 +0100 Subject: [Python-checkins] =?utf8?q?cpython=3A_the_days_of_pre-standard_C_?= =?utf8?q?compilers_are_gone?= Message-ID: http://hg.python.org/cpython/rev/6322bf1647de changeset: 75297:6322bf1647de user: Benjamin Peterson date: Sun Feb 26 15:54:47 2012 -0500 summary: the days of pre-standard C compilers are gone files: Include/structmember.h | 10 ---------- 1 files changed, 0 insertions(+), 10 deletions(-) diff --git a/Include/structmember.h b/Include/structmember.h --- a/Include/structmember.h +++ b/Include/structmember.h @@ -9,16 +9,6 @@ #include /* 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 -- Repository URL: http://hg.python.org/cpython From brett at python.org Sun Feb 26 22:18:54 2012 From: brett at python.org (Brett Cannon) Date: Sun, 26 Feb 2012 16:18:54 -0500 Subject: [Python-checkins] cpython: Issue #14080: fix sporadic test_imp failure. Patch by Stefan Krah. In-Reply-To: References: Message-ID: On Sun, Feb 26, 2012 at 12:13, antoine.pitrou wrote: > http://hg.python.org/cpython/rev/1d7472b015f0 > changeset: 75296:1d7472b015f0 > user: Antoine Pitrou > date: Sun Feb 26 18:09:50 2012 +0100 > summary: > Issue #14080: fix sporadic test_imp failure. Patch by Stefan Krah. > > files: > Lib/test/test_imp.py | 1 + > 1 files changed, 1 insertions(+), 0 deletions(-) > > > diff --git a/Lib/test/test_imp.py b/Lib/test/test_imp.py > --- a/Lib/test/test_imp.py > +++ b/Lib/test/test_imp.py > @@ -325,6 +325,7 @@ > self.addCleanup(cleanup) > # Touch the __init__.py file. > 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__)) Should that just go into support.create_empty_file()? Since it's just a performance issue I don't see it causing unexpected test failures and it might help with any future issues. -------------- next part -------------- An HTML attachment was scrubbed... URL: From python-checkins at python.org Sun Feb 26 23:02:53 2012 From: python-checkins at python.org (georg.brandl) Date: Sun, 26 Feb 2012 23:02:53 +0100 Subject: [Python-checkins] =?utf8?q?cpython=3A_Remove_duplicate_label=2E?= Message-ID: http://hg.python.org/cpython/rev/a173d31cc653 changeset: 75298:a173d31cc653 user: Georg Brandl date: Sun Feb 26 23:02:53 2012 +0100 summary: Remove duplicate label. files: Doc/whatsnew/3.3.rst | 2 -- 1 files changed, 0 insertions(+), 2 deletions(-) diff --git a/Doc/whatsnew/3.3.rst b/Doc/whatsnew/3.3.rst --- a/Doc/whatsnew/3.3.rst +++ b/Doc/whatsnew/3.3.rst @@ -49,8 +49,6 @@ This article explains the new features in Python 3.3, compared to 3.2. -.. _pep-3118: - PEP 3118: New memoryview implementation and buffer protocol documentation ========================================================================= -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Feb 26 23:54:12 2012 From: python-checkins at python.org (nadeem.vawda) Date: Sun, 26 Feb 2012 23:54:12 +0100 Subject: [Python-checkins] =?utf8?b?Y3B5dGhvbiAoMy4yKTogSXNzdWUgIzEzODcz?= =?utf8?q?=3A_Fix_crash_in_test=5Fzlib_when_running_on_a_small_=28=3C4GB?= =?utf8?q?=29_tmpfs=2E?= Message-ID: http://hg.python.org/cpython/rev/fc43b051ae1c changeset: 75299:fc43b051ae1c branch: 3.2 parent: 75293:80069bbae26d user: Nadeem Vawda date: Mon Feb 27 00:42:58 2012 +0200 summary: Issue #13873: Fix crash in test_zlib when running on a small (<4GB) tmpfs. files: Lib/test/test_zlib.py | 23 +++++------------------ 1 files changed, 5 insertions(+), 18 deletions(-) diff --git a/Lib/test/test_zlib.py b/Lib/test/test_zlib.py --- a/Lib/test/test_zlib.py +++ b/Lib/test/test_zlib.py @@ -66,24 +66,11 @@ # Issue #10276 - check that inputs >=4GB are handled correctly. class ChecksumBigBufferTestCase(unittest.TestCase): - def setUp(self): - with open(support.TESTFN, "wb+") as f: - f.seek(_4G) - f.write(b"asdf") - f.flush() - self.mapping = mmap.mmap(f.fileno(), 0, access=mmap.ACCESS_READ) - - def tearDown(self): - self.mapping.close() - support.unlink(support.TESTFN) - - @unittest.skipUnless(mmap, "mmap() is not available.") - @unittest.skipUnless(sys.maxsize > _4G, "Can't run on a 32-bit system.") - @unittest.skipUnless(support.is_resource_enabled("largefile"), - "May use lots of disk space.") - def test_big_buffer(self): - self.assertEqual(zlib.crc32(self.mapping), 3058686908) - self.assertEqual(zlib.adler32(self.mapping), 82837919) + @bigmemtest(size=_4G + 4, memuse=1, dry_run=False) + def test_big_buffer(self, size): + data = b"nyan" * (_1G + 1) + self.assertEqual(zlib.crc32(data), 1044521549) + self.assertEqual(zlib.adler32(data), 2256789997) class ExceptionTestCase(unittest.TestCase): -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Sun Feb 26 23:54:13 2012 From: python-checkins at python.org (nadeem.vawda) Date: Sun, 26 Feb 2012 23:54:13 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_3=2E2_-=3E_default=29?= =?utf8?q?=3A_Null_merge=2E?= Message-ID: http://hg.python.org/cpython/rev/17562834a246 changeset: 75300:17562834a246 parent: 75298:a173d31cc653 parent: 75299:fc43b051ae1c user: Nadeem Vawda date: Mon Feb 27 00:53:50 2012 +0200 summary: Null merge. files: -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Feb 27 00:37:41 2012 From: python-checkins at python.org (guido.van.rossum) Date: Mon, 27 Feb 2012 00:37:41 +0100 Subject: [Python-checkins] =?utf8?q?peps=3A_Reject_PEP_410?= Message-ID: http://hg.python.org/peps/rev/3567da7b53d0 changeset: 4087:3567da7b53d0 user: Guido van Rossum date: Sun Feb 26 15:37:24 2012 -0800 summary: Reject PEP 410 files: pep-0410.txt | 9 ++++++++- 1 files changed, 8 insertions(+), 1 deletions(-) diff --git a/pep-0410.txt b/pep-0410.txt --- a/pep-0410.txt +++ b/pep-0410.txt @@ -3,13 +3,20 @@ Version: $Revision$ Last-Modified: $Date$ Author: Victor Stinner -Status: Draft +Status: Rejected Type: Standards Track Content-Type: text/x-rst Created: 01-February-2012 Python-Version: 3.3 +Rejection Notice +================ + +This PEP is rejected. +See http://mail.python.org/pipermail/python-dev/2012-February/116837.html. + + Abstract ======== -- Repository URL: http://hg.python.org/peps From python-checkins at python.org Mon Feb 27 00:48:57 2012 From: python-checkins at python.org (antoine.pitrou) Date: Mon, 27 Feb 2012 00:48:57 +0100 Subject: [Python-checkins] =?utf8?b?Y3B5dGhvbiAoMi43KTogSXNzdWUgIzEzNTIx?= =?utf8?q?=3A_dict=2Esetdefault=28=29_now_does_only_one_lookup_for_the_giv?= =?utf8?q?en_key=2C?= Message-ID: http://hg.python.org/cpython/rev/5c52e7c6d868 changeset: 75301:5c52e7c6d868 branch: 2.7 parent: 75280:56f38775c59c user: Antoine Pitrou date: Mon Feb 27 00:45:12 2012 +0100 summary: Issue #13521: dict.setdefault() now does only one lookup for the given key, making it "atomic" for many purposes. Patch by Filip Gruszczy?ski. files: Lib/test/test_dict.py | 20 +++++ Misc/NEWS | 3 + Objects/dictobject.c | 117 ++++++++++++++++++----------- 3 files changed, 94 insertions(+), 46 deletions(-) diff --git a/Lib/test/test_dict.py b/Lib/test/test_dict.py --- a/Lib/test/test_dict.py +++ b/Lib/test/test_dict.py @@ -299,6 +299,26 @@ x.fail = True self.assertRaises(Exc, d.setdefault, x, []) + def test_setdefault_atomic(self): + # Issue #13521: setdefault() calls __hash__ and __eq__ only once. + 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() + y = {hashed1: 5} + hashed2 = Hashed() + y.setdefault(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: diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -9,6 +9,9 @@ Core and Builtins ----------------- +- 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 #13020: Fix a reference leak when allocating a structsequence object fails. Patch by Suman Saha. diff --git a/Objects/dictobject.c b/Objects/dictobject.c --- a/Objects/dictobject.c +++ b/Objects/dictobject.c @@ -502,27 +502,16 @@ _PyObject_GC_UNTRACK(op); } - /* -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. +Internal routine to insert a new item into the table when you have entry object. +Used by insertdict. */ static int -insertdict(register PyDictObject *mp, PyObject *key, long hash, PyObject *value) +insertdict_by_entry(register PyDictObject *mp, PyObject *key, long hash, + PyDictEntry *ep, PyObject *value) { PyObject *old_value; - register PyDictEntry *ep; - typedef PyDictEntry *(*lookupfunc)(PyDictObject *, PyObject *, long); - - assert(mp->ma_lookup != NULL); - ep = mp->ma_lookup(mp, key, hash); - if (ep == NULL) { - Py_DECREF(key); - Py_DECREF(value); - return -1; - } + MAINTAIN_TRACKING(mp, key, value); if (ep->me_value != NULL) { old_value = ep->me_value; @@ -545,6 +534,28 @@ return 0; } + +/* +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, long hash, PyObject *value) +{ + register PyDictEntry *ep; + + assert(mp->ma_lookup != NULL); + ep = mp->ma_lookup(mp, key, hash); + if (ep == NULL) { + Py_DECREF(key); + Py_DECREF(value); + return -1; + } + return insertdict_by_entry(mp, key, hash, ep, value); +} + /* Internal routine used by dictresize() to insert an item which is known to be absent from the dict. This routine also assumes that @@ -738,42 +749,26 @@ return ep->me_value; } -/* CAUTION: PyDict_SetItem() must guarantee that it won't resize the - * dictionary if it's merely replacing the value for an existing key. - * This means that it's safe to loop over a dictionary with PyDict_Next() - * and occasionally replace a value -- but you can't insert new keys or - * remove them. - */ -int -PyDict_SetItem(register PyObject *op, PyObject *key, PyObject *value) +static int +dict_set_item_by_hash_or_entry(register PyObject *op, PyObject *key, + long hash, PyDictEntry *ep, PyObject *value) { register PyDictObject *mp; - register long hash; register Py_ssize_t n_used; - if (!PyDict_Check(op)) { - PyErr_BadInternalCall(); - return -1; - } - assert(key); - assert(value); mp = (PyDictObject *)op; - if (PyString_CheckExact(key)) { - hash = ((PyStringObject *)key)->ob_shash; - if (hash == -1) - hash = PyObject_Hash(key); - } - else { - hash = PyObject_Hash(key); - if (hash == -1) - return -1; - } assert(mp->ma_fill <= mp->ma_mask); /* at least one empty slot */ n_used = mp->ma_used; Py_INCREF(value); Py_INCREF(key); - if (insertdict(mp, key, hash, value) != 0) - return -1; + 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; + } /* 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 @@ -793,6 +788,36 @@ return dictresize(mp, (mp->ma_used > 50000 ? 2 : 4) * mp->ma_used); } +/* CAUTION: PyDict_SetItem() must guarantee that it won't resize the + * dictionary if it's merely replacing the value for an existing key. + * This means that it's safe to loop over a dictionary with PyDict_Next() + * and occasionally replace a value -- but you can't insert new keys or + * remove them. + */ +int +PyDict_SetItem(register PyObject *op, PyObject *key, PyObject *value) +{ + register long hash; + + if (!PyDict_Check(op)) { + PyErr_BadInternalCall(); + return -1; + } + assert(key); + assert(value); + if (PyString_CheckExact(key)) { + hash = ((PyStringObject *)key)->ob_shash; + if (hash == -1) + hash = PyObject_Hash(key); + } + else { + hash = PyObject_Hash(key); + if (hash == -1) + return -1; + } + return dict_set_item_by_hash_or_entry(op, key, hash, NULL, value); +} + int PyDict_DelItem(PyObject *op, PyObject *key) { @@ -1957,9 +1982,9 @@ return NULL; val = ep->me_value; if (val == NULL) { - val = failobj; - if (PyDict_SetItem((PyObject*)mp, key, failobj)) - val = NULL; + if (dict_set_item_by_hash_or_entry((PyObject*)mp, key, hash, ep, + failobj) == 0) + val = failobj; } Py_XINCREF(val); return val; -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Feb 27 01:05:44 2012 From: python-checkins at python.org (antoine.pitrou) Date: Mon, 27 Feb 2012 01:05:44 +0100 Subject: [Python-checkins] =?utf8?b?Y3B5dGhvbiAoMy4yKTogSXNzdWUgIzEzNTIx?= =?utf8?q?=3A_dict=2Esetdefault=28=29_now_does_only_one_lookup_for_the_giv?= =?utf8?q?en_key=2C?= Message-ID: http://hg.python.org/cpython/rev/90572ccda12c changeset: 75302:90572ccda12c branch: 3.2 parent: 75293:80069bbae26d user: Antoine Pitrou date: Mon Feb 27 00:45:12 2012 +0100 summary: Issue #13521: dict.setdefault() now does only one lookup for the given key, making it "atomic" for many purposes. Patch by Filip Gruszczy?ski. files: Lib/test/test_dict.py | 20 +++++ Misc/NEWS | 3 + Objects/dictobject.c | 112 ++++++++++++++++++----------- 3 files changed, 93 insertions(+), 42 deletions(-) diff --git a/Lib/test/test_dict.py b/Lib/test/test_dict.py --- a/Lib/test/test_dict.py +++ b/Lib/test/test_dict.py @@ -299,6 +299,26 @@ x.fail = True self.assertRaises(Exc, d.setdefault, x, []) + def test_setdefault_atomic(self): + # Issue #13521: setdefault() calls __hash__ and __eq__ only once. + 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() + y = {hashed1: 5} + hashed2 = Hashed() + y.setdefault(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: diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -10,6 +10,9 @@ Core and Builtins ----------------- +- 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 #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 diff --git a/Objects/dictobject.c b/Objects/dictobject.c --- a/Objects/dictobject.c +++ b/Objects/dictobject.c @@ -510,27 +510,16 @@ _PyObject_GC_UNTRACK(op); } - /* -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. +Internal routine to insert a new item into the table when you have entry object. +Used by insertdict. */ static int -insertdict(register PyDictObject *mp, PyObject *key, Py_hash_t hash, PyObject *value) +insertdict_by_entry(register PyDictObject *mp, PyObject *key, Py_hash_t hash, + PyDictEntry *ep, PyObject *value) { PyObject *old_value; - register PyDictEntry *ep; - typedef PyDictEntry *(*lookupfunc)(PyDictObject *, PyObject *, Py_hash_t); - assert(mp->ma_lookup != NULL); - ep = mp->ma_lookup(mp, key, hash); - if (ep == NULL) { - Py_DECREF(key); - Py_DECREF(value); - return -1; - } MAINTAIN_TRACKING(mp, key, value); if (ep->me_value != NULL) { old_value = ep->me_value; @@ -553,6 +542,28 @@ return 0; } + +/* +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) +{ + register PyDictEntry *ep; + + assert(mp->ma_lookup != NULL); + ep = mp->ma_lookup(mp, key, hash); + if (ep == NULL) { + Py_DECREF(key); + Py_DECREF(value); + return -1; + } + return insertdict_by_entry(mp, key, hash, ep, value); +} + /* Internal routine used by dictresize() to insert an item which is known to be absent from the dict. This routine also assumes that @@ -776,39 +787,26 @@ return ep->me_value; } -/* CAUTION: PyDict_SetItem() must guarantee that it won't resize the - * dictionary if it's merely replacing the value for an existing key. - * This means that it's safe to loop over a dictionary with PyDict_Next() - * and occasionally replace a value -- but you can't insert new keys or - * remove them. - */ -int -PyDict_SetItem(register PyObject *op, PyObject *key, PyObject *value) +static int +dict_set_item_by_hash_or_entry(register PyObject *op, PyObject *key, + Py_hash_t hash, PyDictEntry *ep, PyObject *value) { register PyDictObject *mp; - register Py_hash_t hash; register Py_ssize_t n_used; - if (!PyDict_Check(op)) { - PyErr_BadInternalCall(); - return -1; - } - assert(key); - assert(value); mp = (PyDictObject *)op; - if (!PyUnicode_CheckExact(key) || - (hash = ((PyUnicodeObject *) key)->hash) == -1) - { - hash = PyObject_Hash(key); - if (hash == -1) - return -1; - } assert(mp->ma_fill <= mp->ma_mask); /* at least one empty slot */ n_used = mp->ma_used; Py_INCREF(value); Py_INCREF(key); - if (insertdict(mp, key, hash, value) != 0) - return -1; + 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; + } /* 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 @@ -828,6 +826,36 @@ return dictresize(mp, (mp->ma_used > 50000 ? 2 : 4) * mp->ma_used); } +/* CAUTION: PyDict_SetItem() must guarantee that it won't resize the + * dictionary if it's merely replacing the value for an existing key. + * This means that it's safe to loop over a dictionary with PyDict_Next() + * and occasionally replace a value -- but you can't insert new keys or + * remove them. + */ +int +PyDict_SetItem(register PyObject *op, PyObject *key, PyObject *value) +{ + register 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 { + hash = PyObject_Hash(key); + if (hash == -1) + return -1; + } + return dict_set_item_by_hash_or_entry(op, key, hash, NULL, value); +} + int PyDict_DelItem(PyObject *op, PyObject *key) { @@ -1797,9 +1825,9 @@ return NULL; val = ep->me_value; if (val == NULL) { - val = failobj; - if (PyDict_SetItem((PyObject*)mp, key, failobj)) - val = NULL; + if (dict_set_item_by_hash_or_entry((PyObject*)mp, key, hash, ep, + failobj) == 0) + val = failobj; } Py_XINCREF(val); return val; -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Feb 27 01:05:45 2012 From: python-checkins at python.org (antoine.pitrou) Date: Mon, 27 Feb 2012 01:05:45 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_3=2E2_-=3E_default=29?= =?utf8?q?=3A_Issue_=2313521=3A_dict=2Esetdefault=28=29_now_does_only_one_?= =?utf8?q?lookup_for_the_given_key=2C?= Message-ID: http://hg.python.org/cpython/rev/3dfa98cf2e26 changeset: 75303:3dfa98cf2e26 parent: 75298:a173d31cc653 parent: 75302:90572ccda12c user: Antoine Pitrou date: Mon Feb 27 00:59:34 2012 +0100 summary: Issue #13521: dict.setdefault() now does only one lookup for the given key, making it "atomic" for many purposes. Patch by Filip Gruszczy?ski. files: Lib/test/test_dict.py | 20 +++++ Misc/NEWS | 3 + Objects/dictobject.c | 112 ++++++++++++++++++----------- 3 files changed, 93 insertions(+), 42 deletions(-) diff --git a/Lib/test/test_dict.py b/Lib/test/test_dict.py --- a/Lib/test/test_dict.py +++ b/Lib/test/test_dict.py @@ -299,6 +299,26 @@ x.fail = True self.assertRaises(Exc, d.setdefault, x, []) + def test_setdefault_atomic(self): + # Issue #13521: setdefault() calls __hash__ and __eq__ only once. + 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() + y = {hashed1: 5} + hashed2 = Hashed() + y.setdefault(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: diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -10,6 +10,9 @@ Core and Builtins ----------------- +- Issue #13521: dict.setdefault() now does only one lookup for the given key, + making it "atomic" for many purposes. Patch by Filip Gruszczy?ski. + - 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. diff --git a/Objects/dictobject.c b/Objects/dictobject.c --- a/Objects/dictobject.c +++ b/Objects/dictobject.c @@ -517,27 +517,16 @@ _PyObject_GC_UNTRACK(op); } - /* -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. +Internal routine to insert a new item into the table when you have entry object. +Used by insertdict. */ static int -insertdict(register PyDictObject *mp, PyObject *key, Py_hash_t hash, PyObject *value) +insertdict_by_entry(register PyDictObject *mp, PyObject *key, Py_hash_t hash, + PyDictEntry *ep, PyObject *value) { PyObject *old_value; - register PyDictEntry *ep; - typedef PyDictEntry *(*lookupfunc)(PyDictObject *, PyObject *, Py_hash_t); - assert(mp->ma_lookup != NULL); - ep = mp->ma_lookup(mp, key, hash); - if (ep == NULL) { - Py_DECREF(key); - Py_DECREF(value); - return -1; - } MAINTAIN_TRACKING(mp, key, value); if (ep->me_value != NULL) { old_value = ep->me_value; @@ -560,6 +549,28 @@ return 0; } + +/* +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) +{ + register PyDictEntry *ep; + + assert(mp->ma_lookup != NULL); + ep = mp->ma_lookup(mp, key, hash); + if (ep == NULL) { + Py_DECREF(key); + Py_DECREF(value); + return -1; + } + return insertdict_by_entry(mp, key, hash, ep, value); +} + /* Internal routine used by dictresize() to insert an item which is known to be absent from the dict. This routine also assumes that @@ -783,39 +794,26 @@ return ep->me_value; } -/* CAUTION: PyDict_SetItem() must guarantee that it won't resize the - * dictionary if it's merely replacing the value for an existing key. - * This means that it's safe to loop over a dictionary with PyDict_Next() - * and occasionally replace a value -- but you can't insert new keys or - * remove them. - */ -int -PyDict_SetItem(register PyObject *op, PyObject *key, PyObject *value) +static int +dict_set_item_by_hash_or_entry(register PyObject *op, PyObject *key, + Py_hash_t hash, PyDictEntry *ep, PyObject *value) { register PyDictObject *mp; - register Py_hash_t hash; register Py_ssize_t n_used; - if (!PyDict_Check(op)) { - PyErr_BadInternalCall(); - return -1; - } - assert(key); - assert(value); mp = (PyDictObject *)op; - if (!PyUnicode_CheckExact(key) || - (hash = ((PyASCIIObject *) key)->hash) == -1) - { - hash = PyObject_Hash(key); - if (hash == -1) - return -1; - } assert(mp->ma_fill <= mp->ma_mask); /* at least one empty slot */ n_used = mp->ma_used; Py_INCREF(value); Py_INCREF(key); - if (insertdict(mp, key, hash, value) != 0) - return -1; + 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; + } /* 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 @@ -835,6 +833,36 @@ return dictresize(mp, (mp->ma_used > 50000 ? 2 : 4) * mp->ma_used); } +/* CAUTION: PyDict_SetItem() must guarantee that it won't resize the + * dictionary if it's merely replacing the value for an existing key. + * This means that it's safe to loop over a dictionary with PyDict_Next() + * and occasionally replace a value -- but you can't insert new keys or + * remove them. + */ +int +PyDict_SetItem(register PyObject *op, PyObject *key, PyObject *value) +{ + register Py_hash_t hash; + + if (!PyDict_Check(op)) { + PyErr_BadInternalCall(); + return -1; + } + assert(key); + assert(value); + if (PyUnicode_CheckExact(key)) { + hash = ((PyASCIIObject *) key)->hash; + if (hash == -1) + hash = PyObject_Hash(key); + } + else { + hash = PyObject_Hash(key); + if (hash == -1) + return -1; + } + return dict_set_item_by_hash_or_entry(op, key, hash, NULL, value); +} + int PyDict_DelItem(PyObject *op, PyObject *key) { @@ -1803,9 +1831,9 @@ return NULL; val = ep->me_value; if (val == NULL) { - val = failobj; - if (PyDict_SetItem((PyObject*)mp, key, failobj)) - val = NULL; + if (dict_set_item_by_hash_or_entry((PyObject*)mp, key, hash, ep, + failobj) == 0) + val = failobj; } Py_XINCREF(val); return val; -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Feb 27 01:05:46 2012 From: python-checkins at python.org (antoine.pitrou) Date: Mon, 27 Feb 2012 01:05:46 +0100 Subject: [Python-checkins] =?utf8?b?Y3B5dGhvbiAobWVyZ2UgMy4yIC0+IDMuMik6?= =?utf8?q?_Merge?= Message-ID: http://hg.python.org/cpython/rev/dc8943e6c8f1 changeset: 75304:dc8943e6c8f1 branch: 3.2 parent: 75302:90572ccda12c parent: 75299:fc43b051ae1c user: Antoine Pitrou date: Mon Feb 27 01:01:44 2012 +0100 summary: Merge files: Lib/test/test_zlib.py | 23 +++++------------------ 1 files changed, 5 insertions(+), 18 deletions(-) diff --git a/Lib/test/test_zlib.py b/Lib/test/test_zlib.py --- a/Lib/test/test_zlib.py +++ b/Lib/test/test_zlib.py @@ -66,24 +66,11 @@ # Issue #10276 - check that inputs >=4GB are handled correctly. class ChecksumBigBufferTestCase(unittest.TestCase): - def setUp(self): - with open(support.TESTFN, "wb+") as f: - f.seek(_4G) - f.write(b"asdf") - f.flush() - self.mapping = mmap.mmap(f.fileno(), 0, access=mmap.ACCESS_READ) - - def tearDown(self): - self.mapping.close() - support.unlink(support.TESTFN) - - @unittest.skipUnless(mmap, "mmap() is not available.") - @unittest.skipUnless(sys.maxsize > _4G, "Can't run on a 32-bit system.") - @unittest.skipUnless(support.is_resource_enabled("largefile"), - "May use lots of disk space.") - def test_big_buffer(self): - self.assertEqual(zlib.crc32(self.mapping), 3058686908) - self.assertEqual(zlib.adler32(self.mapping), 82837919) + @bigmemtest(size=_4G + 4, memuse=1, dry_run=False) + def test_big_buffer(self, size): + data = b"nyan" * (_1G + 1) + self.assertEqual(zlib.crc32(data), 1044521549) + self.assertEqual(zlib.adler32(data), 2256789997) class ExceptionTestCase(unittest.TestCase): -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Feb 27 01:05:46 2012 From: python-checkins at python.org (antoine.pitrou) Date: Mon, 27 Feb 2012 01:05:46 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_3=2E2_-=3E_default=29?= =?utf8?q?=3A_Merge?= Message-ID: http://hg.python.org/cpython/rev/dc0682e0b0cf changeset: 75305:dc0682e0b0cf parent: 75303:3dfa98cf2e26 parent: 75304:dc8943e6c8f1 user: Antoine Pitrou date: Mon Feb 27 01:01:54 2012 +0100 summary: Merge files: -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Feb 27 01:05:47 2012 From: python-checkins at python.org (antoine.pitrou) Date: Mon, 27 Feb 2012 01:05:47 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_default_-=3E_default?= =?utf8?q?=29=3A_Merge?= Message-ID: http://hg.python.org/cpython/rev/f417aff64dcc changeset: 75306:f417aff64dcc parent: 75305:dc0682e0b0cf parent: 75300:17562834a246 user: Antoine Pitrou date: Mon Feb 27 01:01:58 2012 +0100 summary: Merge files: -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Feb 27 02:30:14 2012 From: python-checkins at python.org (benjamin.peterson) Date: Mon, 27 Feb 2012 02:30:14 +0100 Subject: [Python-checkins] =?utf8?q?peps=3A_pep_for_changing_pep_409_imple?= =?utf8?q?mentation?= Message-ID: http://hg.python.org/peps/rev/5fc4424d6cf6 changeset: 4088:5fc4424d6cf6 user: Benjamin Peterson date: Sun Feb 26 20:29:14 2012 -0500 summary: pep for changing pep 409 implementation files: pep-0415.txt | 78 ++++++++++++++++++++++++++++++++++++++++ 1 files changed, 78 insertions(+), 0 deletions(-) diff --git a/pep-0415.txt b/pep-0415.txt new file mode 100644 --- /dev/null +++ b/pep-0415.txt @@ -0,0 +1,78 @@ +PEP: 415 +Title: Implementing PEP 409 differently +Version: $Revision$ +Last-Modified: $Date$ +Author: Benjamin Peterson +Status: Draft +Type: Standards Track +Content-Type: text/x-rst +Created: 26-Feb-2012 +Post-History: 26-Feb-2012 + + +Abstract +======== + +PEP 409 allows PEP 3134 exception contexts and causes to be suppressed when the +exception is printed. This is done using the ``raise exc from None`` +syntax. This PEP proposes to implement context and cause suppression +differently. + +Rationale +========= + +PEP 409 changes ``__cause__`` to be ``Ellipsis`` by default. Then if +``__cause__`` is set to ``None`` by ``raise exc from None``, no context or cause +will be printed should the exception be uncaught. + +The main problem with this scheme is it complicates the role of +``__cause__``. ``__cause__`` should indicate the cause of the exception not +whether ``__context__`` should be printed or not. This use of ``__cause__`` is +also not easily extended in the future. For example, we may someday want to +allow the programmer to select which of ``__context__`` and ``__cause__`` will +be printed. The PEP 409 implementation is not amendable to this. + +The use of ``Ellipsis`` is a hack. Before PEP 409, ``Ellipsis`` was used +exclusively in extended slicing. Extended slicing has nothing to do with +exceptions, so it's not clear to someone inspecting an exception object why +``__cause__`` should be set to ``Ellipsis``. Using ``Ellipsis`` by default for +``__cause__`` makes it asymmetrical with ``__context__``. + +Proposal +======== + +A new attribute on ``BaseException``, ``__suppress_context__``, will be +introduced. The ``raise exc from None`` syntax will cause +``exc.__suppress_context__`` to be set to ``True``. Exception printing code will +check for the attribute to determine whether context and cause will be +printed. ``__cause__`` will return to its original purpose and values. + +There is precedence for ``__suppress_context__`` with the +``print_line_and_file`` exception attribute. + +Patches +======= + +There is a patch on `Issue 14133`_. + + +References +========== + +.. _issue 14133: + http://bugs.python.org/issue6210 + +Copyright +========= + +This document has been placed in the public domain. + + +.. + Local Variables: + mode: indented-text + indent-tabs-mode: nil + sentence-end-double-space: t + fill-column: 70 + coding: utf-8 + End: -- Repository URL: http://hg.python.org/peps From python-checkins at python.org Mon Feb 27 02:39:55 2012 From: python-checkins at python.org (benjamin.peterson) Date: Mon, 27 Feb 2012 02:39:55 +0100 Subject: [Python-checkins] =?utf8?q?peps=3A_kill_extra_letter?= Message-ID: http://hg.python.org/peps/rev/76ef60c943a9 changeset: 4089:76ef60c943a9 user: Benjamin Peterson date: Sun Feb 26 20:39:52 2012 -0500 summary: kill extra letter files: pep-0415.txt | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/pep-0415.txt b/pep-0415.txt --- a/pep-0415.txt +++ b/pep-0415.txt @@ -30,7 +30,7 @@ whether ``__context__`` should be printed or not. This use of ``__cause__`` is also not easily extended in the future. For example, we may someday want to allow the programmer to select which of ``__context__`` and ``__cause__`` will -be printed. The PEP 409 implementation is not amendable to this. +be printed. The PEP 409 implementation is not amenable to this. The use of ``Ellipsis`` is a hack. Before PEP 409, ``Ellipsis`` was used exclusively in extended slicing. Extended slicing has nothing to do with -- Repository URL: http://hg.python.org/peps From python-checkins at python.org Mon Feb 27 10:20:45 2012 From: python-checkins at python.org (stefan.krah) Date: Mon, 27 Feb 2012 10:20:45 +0100 Subject: [Python-checkins] =?utf8?q?cpython=3A_Issue_=2314113=3A_Fix_a_tes?= =?utf8?q?t=5Fstrptime_failure_caused_by_changes_to_LC=5FALL=2E?= Message-ID: http://hg.python.org/cpython/rev/1ea466240792 changeset: 75307:1ea466240792 user: Stefan Krah date: Mon Feb 27 10:18:51 2012 +0100 summary: Issue #14113: Fix a test_strptime failure caused by changes to LC_ALL. files: Lib/test/test_format.py | 3 ++- 1 files changed, 2 insertions(+), 1 deletions(-) diff --git a/Lib/test/test_format.py b/Lib/test/test_format.py --- a/Lib/test/test_format.py +++ b/Lib/test/test_format.py @@ -285,7 +285,8 @@ def test_locale(self): try: - oldloc = locale.setlocale(locale.LC_ALL, '') + oldloc = locale.setlocale(locale.LC_ALL) + locale.setlocale(locale.LC_ALL, '') except locale.Error as err: self.skipTest("Cannot set locale: {}".format(err)) try: -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Feb 27 11:47:50 2012 From: python-checkins at python.org (eric.araujo) Date: Mon, 27 Feb 2012 11:47:50 +0100 Subject: [Python-checkins] =?utf8?q?cpython=3A_Fix_comparison_bug_with_=27?= =?utf8?q?rc=27_versions_in_packaging=2Eversion_=28=2311841=29=2E?= Message-ID: http://hg.python.org/cpython/rev/32cb52bee738 changeset: 75308:32cb52bee738 user: ?ric Araujo date: Mon Feb 27 11:47:44 2012 +0100 summary: Fix comparison bug with 'rc' versions in packaging.version (#11841). I added some tests in 2105ab8553b7 and found no bug, but it turns out that the doctest is not actually run. While converting the doctest to unittest style, I stumbled upon this bug again and this time applied the code patch provided by Filip Gruszczy?ski. files: Lib/packaging/tests/test_version.py | 9 ++++++ Lib/packaging/version.py | 24 +++++++++------- Misc/NEWS | 3 ++ 3 files changed, 25 insertions(+), 11 deletions(-) diff --git a/Lib/packaging/tests/test_version.py b/Lib/packaging/tests/test_version.py --- a/Lib/packaging/tests/test_version.py +++ b/Lib/packaging/tests/test_version.py @@ -16,6 +16,7 @@ (V('1.2'), '1.2'), (V('1.2.3a4'), '1.2.3a4'), (V('1.2c4'), '1.2c4'), + (V('4.17rc2'), '4.17rc2'), (V('1.2.3.4'), '1.2.3.4'), (V('1.2.3.4.0b3'), '1.2.3.4b3'), (V('1.2.0.0.0'), '1.2'), @@ -146,6 +147,14 @@ """ doctest.script_from_examples(comparison_doctest_string) + # the doctest above is never run, so temporarily add real unit + # tests until the doctest is rewritten + self.assertLessEqual(V('1.2.0rc1'), V('1.2.0')) + self.assertGreater(V('1.0'), V('1.0c2')) + self.assertGreater(V('1.0'), V('1.0rc2')) + self.assertGreater(V('1.0rc2'), V('1.0rc1')) + self.assertGreater(V('1.0c4'), V('1.0c1')) + def test_suggest_normalized_version(self): self.assertEqual(suggest('1.0'), '1.0') diff --git a/Lib/packaging/version.py b/Lib/packaging/version.py --- a/Lib/packaging/version.py +++ b/Lib/packaging/version.py @@ -11,19 +11,20 @@ # A marker used in the second and third parts of the `parts` tuple, for # versions that don't have those segments, to sort properly. An example # of versions in sort order ('highest' last): -# 1.0b1 ((1,0), ('b',1), ('f',)) -# 1.0.dev345 ((1,0), ('f',), ('dev', 345)) -# 1.0 ((1,0), ('f',), ('f',)) -# 1.0.post256.dev345 ((1,0), ('f',), ('f', 'post', 256, 'dev', 345)) -# 1.0.post345 ((1,0), ('f',), ('f', 'post', 345, 'f')) +# 1.0b1 ((1,0), ('b',1), ('z',)) +# 1.0.dev345 ((1,0), ('z',), ('dev', 345)) +# 1.0 ((1,0), ('z',), ('z',)) +# 1.0.post256.dev345 ((1,0), ('z',), ('z', 'post', 256, 'dev', 345)) +# 1.0.post345 ((1,0), ('z',), ('z', 'post', 345, 'z')) # ^ ^ ^ -# 'b' < 'f' ---------------------/ | | +# 'b' < 'z' ---------------------/ | | # | | -# 'dev' < 'f' < 'post' -------------------/ | +# 'dev' < 'z' ----------------------------/ | # | -# 'dev' < 'f' ----------------------------------------------/ -# Other letters would do, but 'f' for 'final' is kind of nice. -_FINAL_MARKER = ('f',) +# 'dev' < 'z' ----------------------------------------------/ +# 'f' for 'final' would be kind of nice, but due to bugs in the support of +# 'rc' we must use 'z' +_FINAL_MARKER = ('z',) _VERSION_RE = re.compile(r''' ^ @@ -167,8 +168,9 @@ if prerel is not _FINAL_MARKER: s += prerel[0] s += '.'.join(str(v) for v in prerel[1:]) + # XXX clean up: postdev is always true; code is obscure if postdev and postdev is not _FINAL_MARKER: - if postdev[0] == 'f': + if postdev[0] == _FINAL_MARKER[0]: postdev = postdev[1:] i = 0 while i < len(postdev): diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -508,6 +508,9 @@ Library ------- +- Issue #11841: Fix comparison bug with 'rc' versions in packaging.version. + Patch by Filip Gruszczy?ski. + - Issue #13447: Add a test file to host regression tests for bugs in the scripts found in the Tools directory. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Feb 27 12:04:03 2012 From: python-checkins at python.org (vinay.sajip) Date: Mon, 27 Feb 2012 12:04:03 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=283=2E2=29=3A_Updated_logging?= =?utf8?q?_cookbook_with_info_on_alternative_format_styles=2E?= Message-ID: http://hg.python.org/cpython/rev/1b163c25d260 changeset: 75309:1b163c25d260 branch: 3.2 parent: 75304:dc8943e6c8f1 user: Vinay Sajip date: Mon Feb 27 11:02:45 2012 +0000 summary: Updated logging cookbook with info on alternative format styles. files: Doc/howto/logging-cookbook.rst | 136 ++++++++++++++++++++- 1 files changed, 132 insertions(+), 4 deletions(-) diff --git a/Doc/howto/logging-cookbook.rst b/Doc/howto/logging-cookbook.rst --- a/Doc/howto/logging-cookbook.rst +++ b/Doc/howto/logging-cookbook.rst @@ -268,12 +268,12 @@ .. currentmodule:: logging.handlers Sometimes you have to get your logging handlers to do their work without -blocking the thread you?re logging from. This is common in Web applications, +blocking the thread you're logging from. This is common in Web applications, though of course it also occurs in other scenarios. A common culprit which demonstrates sluggish behaviour is the :class:`SMTPHandler`: sending emails can take a long time, for a -number of reasons outside the developer?s control (for example, a poorly +number of reasons outside the developer's control (for example, a poorly performing mail or network infrastructure). But almost any network-based handler can block: Even a :class:`SocketHandler` operation may do a DNS query under the hood which is too slow (and this query can be deep in the @@ -292,7 +292,7 @@ The second part of the solution is :class:`QueueListener`, which has been designed as the counterpart to :class:`QueueHandler`. A -:class:`QueueListener` is very simple: it?s passed a queue and some handlers, +:class:`QueueListener` is very simple: it's passed a queue and some handlers, and it fires up an internal thread which listens to its queue for LogRecords sent from ``QueueHandlers`` (or any other source of ``LogRecords``, for that matter). The ``LogRecords`` are removed from the queue and passed to the @@ -745,7 +745,7 @@ raise except: import sys, traceback - print >> sys.stderr, 'Whoops! Problem:' + print('Whoops! Problem:', file=sys.stderr) traceback.print_exc(file=sys.stderr) # Arrays used for random selections in this demo @@ -964,6 +964,134 @@ Obviously this example sets the log length much too small as an extreme example. You would want to set *maxBytes* to an appropriate value. +.. _format-styles: + +Use of alternative formatting styles +------------------------------------ + +When logging was added to the Python standard library, the only way of +formatting messages with variable content was to use the %-formatting +method. Since then, Python has gained two new formatting approaches: +string.Template (added in Python 2.4) and str.format (added in Python 2.6). + +Logging now (as of 3.2) provides improved support for these two additional +formatting styles. The :class:`Formatter` class been enhanced for Python 3.2 to +take an additional, optional keyword parameter named ``style``. This defaults +to ``'%'``, but other possible values are ``'{'`` and ``'$'``, which correspond +to the other two formatting styles. Backwards compatibility is maintained by +default (as you would expect), but by explicitly specifying a style parameter, +you get the ability to specify format strings which work with +:meth:`str.format` or :class:`string.Template`. Here's an example console +session to show the possibilities: + +.. code-block:: pycon + + >>> import logging + >>> root = logging.getLogger() + >>> root.setLevel(logging.DEBUG) + >>> handler = logging.StreamHandler() + >>> bf = logging.Formatter('{asctime} {name} {levelname:8s} {message}', + ... style='{') + >>> handler.setFormatter(bf) + >>> root.addHandler(handler) + >>> logger = logging.getLogger('foo.bar') + >>> logger.debug('This is a DEBUG message') + 2010-10-28 15:11:55,341 foo.bar DEBUG This is a DEBUG message + >>> logger.critical('This is a CRITICAL message') + 2010-10-28 15:12:11,526 foo.bar CRITICAL This is a CRITICAL message + >>> df = logging.Formatter('$asctime $name ${levelname} $message', + ... style='$') + >>> handler.setFormatter(df) + >>> logger.debug('This is a DEBUG message') + 2010-10-28 15:13:06,924 foo.bar DEBUG This is a DEBUG message + >>> logger.critical('This is a CRITICAL message') + 2010-10-28 15:13:11,494 foo.bar CRITICAL This is a CRITICAL message + >>> + +Note that the formatting of logging messages for final output to logs is +completely independent of how an individual logging message is constructed. +That can still use %-formatting, as shown here:: + + >>> logger.error('This is an%s %s %s', 'other,', 'ERROR,', 'message') + 2010-10-28 15:19:29,833 foo.bar ERROR This is another, ERROR, message + >>> + +Logging calls (``logger.debug()``, ``logger.info()`` etc.) only take +positional parameters for the actual logging message itself, with keyword +parameters used only for determining options for how to handle the actual +logging call (e.g. the ``exc_info`` keyword parameter to indicate that +traceback information should be logged, or the ``extra`` keyword parameter +to indicate additional contextual information to be added to the log). So +you cannot directly make logging calls using :meth:`str.format` or +:class:`string.Template` syntax, because internally the logging package +uses %-formatting to merge the format string and the variable arguments. +There would no changing this while preserving backward compatibility, since +all logging calls which are out there in existing code will be using %-format +strings. + +There is, however, a way that you can use {}- and $- formatting to construct +your individual log messages. Recall that for a message you can use an +arbitrary object as a message format string, and that the logging package will +call ``str()`` on that object to get the actual format string. Consider the +following two classes:: + + class BraceMessage(object): + def __init__(self, fmt, *args, **kwargs): + self.fmt = fmt + self.args = args + self.kwargs = kwargs + + def __str__(self): + return self.fmt.format(*self.args, **self.kwargs) + + class DollarMessage(object): + def __init__(self, fmt, **kwargs): + self.fmt = fmt + self.kwargs = kwargs + + def __str__(self): + from string import Template + return Template(self.fmt).substitute(**self.kwargs) + +Either of these can be used in place of a format string, to allow {}- or +$-formatting to be used to build the actual "message" part which appears in the +formatted log output in place of "%(message)s" or "{message}" or "$message". +It's a little unwieldy to use the class names whenever you want to log +something, but it's quite palatable if you use an alias such as __ (double +underscore ? not to be confused with _, the single underscore used as a +synonym/alias for :func:`gettext.gettext` or its brethren). + +The above classes are not included in Python, though they're easy enough to +copy and paste into your own code. They can be used as follows (assuming that +they're declared in a module called ``wherever``): + +.. code-block:: pycon + + >>> from wherever import BraceMessage as __ + >>> print(__('Message with {0} {1}', 2, 'placeholders')) + Message with 2 placeholders + >>> class Point: pass + ... + >>> p = Point() + >>> p.x = 0.5 + >>> p.y = 0.5 + >>> print(__('Message with coordinates: ({point.x:.2f}, {point.y:.2f})', + ... point=p)) + Message with coordinates: (0.50, 0.50) + >>> from wherever import DollarMessage as __ + >>> print(__('Message with $num $what', num=2, what='placeholders')) + Message with 2 placeholders + >>> + +One thing to note is that you pay no significant performance penalty with this +approach: the actual formatting happens not when you make the logging call, but +when (and if) the logged message is actually about to be output to a log by a +handler. So the only slightly unusual thing which might trip you up is that the +parentheses go around the format string and the arguments, not just the format +string. That's because the __ notation is just syntax sugar for a constructor +call to one of the XXXMessage classes. + + .. _zeromq-handlers: Subclassing QueueHandler - a ZeroMQ example -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Feb 27 12:04:04 2012 From: python-checkins at python.org (vinay.sajip) Date: Mon, 27 Feb 2012 12:04:04 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_3=2E2_-=3E_default=29?= =?utf8?q?=3A_Merged_cookbook_update_from_3=2E2=2E?= Message-ID: http://hg.python.org/cpython/rev/9814ad149861 changeset: 75310:9814ad149861 parent: 75307:1ea466240792 parent: 75309:1b163c25d260 user: Vinay Sajip date: Mon Feb 27 11:03:26 2012 +0000 summary: Merged cookbook update from 3.2. files: Doc/howto/logging-cookbook.rst | 136 ++++++++++++++++++++- 1 files changed, 132 insertions(+), 4 deletions(-) diff --git a/Doc/howto/logging-cookbook.rst b/Doc/howto/logging-cookbook.rst --- a/Doc/howto/logging-cookbook.rst +++ b/Doc/howto/logging-cookbook.rst @@ -268,12 +268,12 @@ .. currentmodule:: logging.handlers Sometimes you have to get your logging handlers to do their work without -blocking the thread you?re logging from. This is common in Web applications, +blocking the thread you're logging from. This is common in Web applications, though of course it also occurs in other scenarios. A common culprit which demonstrates sluggish behaviour is the :class:`SMTPHandler`: sending emails can take a long time, for a -number of reasons outside the developer?s control (for example, a poorly +number of reasons outside the developer's control (for example, a poorly performing mail or network infrastructure). But almost any network-based handler can block: Even a :class:`SocketHandler` operation may do a DNS query under the hood which is too slow (and this query can be deep in the @@ -292,7 +292,7 @@ The second part of the solution is :class:`QueueListener`, which has been designed as the counterpart to :class:`QueueHandler`. A -:class:`QueueListener` is very simple: it?s passed a queue and some handlers, +:class:`QueueListener` is very simple: it's passed a queue and some handlers, and it fires up an internal thread which listens to its queue for LogRecords sent from ``QueueHandlers`` (or any other source of ``LogRecords``, for that matter). The ``LogRecords`` are removed from the queue and passed to the @@ -745,7 +745,7 @@ raise except: import sys, traceback - print >> sys.stderr, 'Whoops! Problem:' + print('Whoops! Problem:', file=sys.stderr) traceback.print_exc(file=sys.stderr) # Arrays used for random selections in this demo @@ -964,6 +964,134 @@ Obviously this example sets the log length much too small as an extreme example. You would want to set *maxBytes* to an appropriate value. +.. _format-styles: + +Use of alternative formatting styles +------------------------------------ + +When logging was added to the Python standard library, the only way of +formatting messages with variable content was to use the %-formatting +method. Since then, Python has gained two new formatting approaches: +string.Template (added in Python 2.4) and str.format (added in Python 2.6). + +Logging now (as of 3.2) provides improved support for these two additional +formatting styles. The :class:`Formatter` class been enhanced for Python 3.2 to +take an additional, optional keyword parameter named ``style``. This defaults +to ``'%'``, but other possible values are ``'{'`` and ``'$'``, which correspond +to the other two formatting styles. Backwards compatibility is maintained by +default (as you would expect), but by explicitly specifying a style parameter, +you get the ability to specify format strings which work with +:meth:`str.format` or :class:`string.Template`. Here's an example console +session to show the possibilities: + +.. code-block:: pycon + + >>> import logging + >>> root = logging.getLogger() + >>> root.setLevel(logging.DEBUG) + >>> handler = logging.StreamHandler() + >>> bf = logging.Formatter('{asctime} {name} {levelname:8s} {message}', + ... style='{') + >>> handler.setFormatter(bf) + >>> root.addHandler(handler) + >>> logger = logging.getLogger('foo.bar') + >>> logger.debug('This is a DEBUG message') + 2010-10-28 15:11:55,341 foo.bar DEBUG This is a DEBUG message + >>> logger.critical('This is a CRITICAL message') + 2010-10-28 15:12:11,526 foo.bar CRITICAL This is a CRITICAL message + >>> df = logging.Formatter('$asctime $name ${levelname} $message', + ... style='$') + >>> handler.setFormatter(df) + >>> logger.debug('This is a DEBUG message') + 2010-10-28 15:13:06,924 foo.bar DEBUG This is a DEBUG message + >>> logger.critical('This is a CRITICAL message') + 2010-10-28 15:13:11,494 foo.bar CRITICAL This is a CRITICAL message + >>> + +Note that the formatting of logging messages for final output to logs is +completely independent of how an individual logging message is constructed. +That can still use %-formatting, as shown here:: + + >>> logger.error('This is an%s %s %s', 'other,', 'ERROR,', 'message') + 2010-10-28 15:19:29,833 foo.bar ERROR This is another, ERROR, message + >>> + +Logging calls (``logger.debug()``, ``logger.info()`` etc.) only take +positional parameters for the actual logging message itself, with keyword +parameters used only for determining options for how to handle the actual +logging call (e.g. the ``exc_info`` keyword parameter to indicate that +traceback information should be logged, or the ``extra`` keyword parameter +to indicate additional contextual information to be added to the log). So +you cannot directly make logging calls using :meth:`str.format` or +:class:`string.Template` syntax, because internally the logging package +uses %-formatting to merge the format string and the variable arguments. +There would no changing this while preserving backward compatibility, since +all logging calls which are out there in existing code will be using %-format +strings. + +There is, however, a way that you can use {}- and $- formatting to construct +your individual log messages. Recall that for a message you can use an +arbitrary object as a message format string, and that the logging package will +call ``str()`` on that object to get the actual format string. Consider the +following two classes:: + + class BraceMessage(object): + def __init__(self, fmt, *args, **kwargs): + self.fmt = fmt + self.args = args + self.kwargs = kwargs + + def __str__(self): + return self.fmt.format(*self.args, **self.kwargs) + + class DollarMessage(object): + def __init__(self, fmt, **kwargs): + self.fmt = fmt + self.kwargs = kwargs + + def __str__(self): + from string import Template + return Template(self.fmt).substitute(**self.kwargs) + +Either of these can be used in place of a format string, to allow {}- or +$-formatting to be used to build the actual "message" part which appears in the +formatted log output in place of "%(message)s" or "{message}" or "$message". +It's a little unwieldy to use the class names whenever you want to log +something, but it's quite palatable if you use an alias such as __ (double +underscore ? not to be confused with _, the single underscore used as a +synonym/alias for :func:`gettext.gettext` or its brethren). + +The above classes are not included in Python, though they're easy enough to +copy and paste into your own code. They can be used as follows (assuming that +they're declared in a module called ``wherever``): + +.. code-block:: pycon + + >>> from wherever import BraceMessage as __ + >>> print(__('Message with {0} {1}', 2, 'placeholders')) + Message with 2 placeholders + >>> class Point: pass + ... + >>> p = Point() + >>> p.x = 0.5 + >>> p.y = 0.5 + >>> print(__('Message with coordinates: ({point.x:.2f}, {point.y:.2f})', + ... point=p)) + Message with coordinates: (0.50, 0.50) + >>> from wherever import DollarMessage as __ + >>> print(__('Message with $num $what', num=2, what='placeholders')) + Message with 2 placeholders + >>> + +One thing to note is that you pay no significant performance penalty with this +approach: the actual formatting happens not when you make the logging call, but +when (and if) the logged message is actually about to be output to a log by a +handler. So the only slightly unusual thing which might trip you up is that the +parentheses go around the format string and the arguments, not just the format +string. That's because the __ notation is just syntax sugar for a constructor +call to one of the XXXMessage classes. + + .. _zeromq-handlers: Subclassing QueueHandler - a ZeroMQ example -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Feb 27 12:04:06 2012 From: python-checkins at python.org (vinay.sajip) Date: Mon, 27 Feb 2012 12:04:06 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_default_-=3E_default?= =?utf8?q?=29=3A_Merged_upstream_changes=2E?= Message-ID: http://hg.python.org/cpython/rev/2aab57e694e4 changeset: 75311:2aab57e694e4 parent: 75310:9814ad149861 parent: 75308:32cb52bee738 user: Vinay Sajip date: Mon Feb 27 11:03:55 2012 +0000 summary: Merged upstream changes. files: Lib/packaging/tests/test_version.py | 9 ++++++ Lib/packaging/version.py | 24 +++++++++------- Misc/NEWS | 3 ++ 3 files changed, 25 insertions(+), 11 deletions(-) diff --git a/Lib/packaging/tests/test_version.py b/Lib/packaging/tests/test_version.py --- a/Lib/packaging/tests/test_version.py +++ b/Lib/packaging/tests/test_version.py @@ -16,6 +16,7 @@ (V('1.2'), '1.2'), (V('1.2.3a4'), '1.2.3a4'), (V('1.2c4'), '1.2c4'), + (V('4.17rc2'), '4.17rc2'), (V('1.2.3.4'), '1.2.3.4'), (V('1.2.3.4.0b3'), '1.2.3.4b3'), (V('1.2.0.0.0'), '1.2'), @@ -146,6 +147,14 @@ """ doctest.script_from_examples(comparison_doctest_string) + # the doctest above is never run, so temporarily add real unit + # tests until the doctest is rewritten + self.assertLessEqual(V('1.2.0rc1'), V('1.2.0')) + self.assertGreater(V('1.0'), V('1.0c2')) + self.assertGreater(V('1.0'), V('1.0rc2')) + self.assertGreater(V('1.0rc2'), V('1.0rc1')) + self.assertGreater(V('1.0c4'), V('1.0c1')) + def test_suggest_normalized_version(self): self.assertEqual(suggest('1.0'), '1.0') diff --git a/Lib/packaging/version.py b/Lib/packaging/version.py --- a/Lib/packaging/version.py +++ b/Lib/packaging/version.py @@ -11,19 +11,20 @@ # A marker used in the second and third parts of the `parts` tuple, for # versions that don't have those segments, to sort properly. An example # of versions in sort order ('highest' last): -# 1.0b1 ((1,0), ('b',1), ('f',)) -# 1.0.dev345 ((1,0), ('f',), ('dev', 345)) -# 1.0 ((1,0), ('f',), ('f',)) -# 1.0.post256.dev345 ((1,0), ('f',), ('f', 'post', 256, 'dev', 345)) -# 1.0.post345 ((1,0), ('f',), ('f', 'post', 345, 'f')) +# 1.0b1 ((1,0), ('b',1), ('z',)) +# 1.0.dev345 ((1,0), ('z',), ('dev', 345)) +# 1.0 ((1,0), ('z',), ('z',)) +# 1.0.post256.dev345 ((1,0), ('z',), ('z', 'post', 256, 'dev', 345)) +# 1.0.post345 ((1,0), ('z',), ('z', 'post', 345, 'z')) # ^ ^ ^ -# 'b' < 'f' ---------------------/ | | +# 'b' < 'z' ---------------------/ | | # | | -# 'dev' < 'f' < 'post' -------------------/ | +# 'dev' < 'z' ----------------------------/ | # | -# 'dev' < 'f' ----------------------------------------------/ -# Other letters would do, but 'f' for 'final' is kind of nice. -_FINAL_MARKER = ('f',) +# 'dev' < 'z' ----------------------------------------------/ +# 'f' for 'final' would be kind of nice, but due to bugs in the support of +# 'rc' we must use 'z' +_FINAL_MARKER = ('z',) _VERSION_RE = re.compile(r''' ^ @@ -167,8 +168,9 @@ if prerel is not _FINAL_MARKER: s += prerel[0] s += '.'.join(str(v) for v in prerel[1:]) + # XXX clean up: postdev is always true; code is obscure if postdev and postdev is not _FINAL_MARKER: - if postdev[0] == 'f': + if postdev[0] == _FINAL_MARKER[0]: postdev = postdev[1:] i = 0 while i < len(postdev): diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -508,6 +508,9 @@ Library ------- +- Issue #11841: Fix comparison bug with 'rc' versions in packaging.version. + Patch by Filip Gruszczy?ski. + - Issue #13447: Add a test file to host regression tests for bugs in the scripts found in the Tools directory. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Feb 27 12:29:44 2012 From: python-checkins at python.org (eric.araujo) Date: Mon, 27 Feb 2012 12:29:44 +0100 Subject: [Python-checkins] =?utf8?q?distutils2=3A_Fix_for_shared_builds?= Message-ID: http://hg.python.org/distutils2/rev/7824e3ca5e4b changeset: 1287:7824e3ca5e4b parent: 1285:60dd0041c9bc user: ?ric Araujo date: Wed Feb 15 18:16:47 2012 +0100 summary: Fix for shared builds files: distutils2/tests/test_command_build_ext.py | 3 ++- 1 files changed, 2 insertions(+), 1 deletions(-) diff --git a/distutils2/tests/test_command_build_ext.py b/distutils2/tests/test_command_build_ext.py --- a/distutils2/tests/test_command_build_ext.py +++ b/distutils2/tests/test_command_build_ext.py @@ -156,7 +156,8 @@ cmd = build_ext(dist) cmd.library_dirs = 'my_lib_dir%sother_lib_dir' % os.pathsep cmd.finalize_options() - self.assertEqual(cmd.library_dirs, ['my_lib_dir', 'other_lib_dir']) + self.assertIn('my_lib_dir', cmd.library_dirs) + self.assertIn('other_lib_dir', cmd.library_dirs) # make sure rpath is turned into a list # if it's a string -- Repository URL: http://hg.python.org/distutils2 From python-checkins at python.org Mon Feb 27 12:29:44 2012 From: python-checkins at python.org (eric.araujo) Date: Mon, 27 Feb 2012 12:29:44 +0100 Subject: [Python-checkins] =?utf8?q?distutils2=3A_Add_test_for_util=2Eset?= =?utf8?b?X3BsYXRmb3JtICgjMTM5NzQpLg==?= Message-ID: http://hg.python.org/distutils2/rev/fae9d7aa7fc9 changeset: 1288:fae9d7aa7fc9 user: ?ric Araujo date: Thu Feb 16 19:35:40 2012 +0100 summary: Add test for util.set_platform (#13974). Patch by Tshepang Lekhonkhobe. files: CHANGES.txt | 1 + distutils2/tests/test_util.py | 5 +++++ 2 files changed, 6 insertions(+), 0 deletions(-) diff --git a/CHANGES.txt b/CHANGES.txt --- a/CHANGES.txt +++ b/CHANGES.txt @@ -166,6 +166,7 @@ script with pysetup create [?ric] - #1326113: build_ext now correctly parses multiple values given to the --libraries option [?ric] +- #13974: add test for util.set_platform [tshepang] 1.0a3 - 2010-10-08 diff --git a/distutils2/tests/test_util.py b/distutils2/tests/test_util.py --- a/distutils2/tests/test_util.py +++ b/distutils2/tests/test_util.py @@ -172,6 +172,11 @@ sys.stdout = self.old_stdout sys.stderr = self.old_stderr + def test_set_platform(self): + self.addCleanup(util.set_platform, util.get_platform()) + util.set_platform("fake") + self.assertEqual("fake", util.get_platform()) + def test_convert_path(self): # linux/mac os.sep = '/' -- Repository URL: http://hg.python.org/distutils2 From python-checkins at python.org Mon Feb 27 12:29:44 2012 From: python-checkins at python.org (eric.araujo) Date: Mon, 27 Feb 2012 12:29:44 +0100 Subject: [Python-checkins] =?utf8?q?distutils2=3A_Fix_bugs_with_MANIFEST?= =?utf8?q?=2Ein_parsing_on_Windows_=28=236884=29=2E?= Message-ID: http://hg.python.org/distutils2/rev/4d6a9f287543 changeset: 1289:4d6a9f287543 user: ?ric Araujo date: Mon Feb 27 11:52:34 2012 +0100 summary: Fix bugs with MANIFEST.in parsing on Windows (#6884). These regex changes fix a number of issues on Windows: - #6884: impossible to include a file starting with 'build' - #9691 and #14004: sdist includes too many files - #13193: test_manifest failures Thanks to Nadeem Vawda for his help. files: CHANGES.txt | 1 + CONTRIBUTORS.txt | 1 + distutils2/manifest.py | 18 +- distutils2/tests/fixer/__init__.py | 1 + distutils2/tests/test_manifest.py | 138 ++++++++++++---- 5 files changed, 119 insertions(+), 40 deletions(-) diff --git a/CHANGES.txt b/CHANGES.txt --- a/CHANGES.txt +++ b/CHANGES.txt @@ -167,6 +167,7 @@ - #1326113: build_ext now correctly parses multiple values given to the --libraries option [?ric] - #13974: add test for util.set_platform [tshepang] +- #6884: Fix MANIFEST.in parsing bugs on Windows [?ric, nadeem] 1.0a3 - 2010-10-08 diff --git a/CONTRIBUTORS.txt b/CONTRIBUTORS.txt --- a/CONTRIBUTORS.txt +++ b/CONTRIBUTORS.txt @@ -69,3 +69,4 @@ - Vinay Sajip - Victor Stinner - Alexandre Vassalotti +- Nadeem Vawda diff --git a/distutils2/manifest.py b/distutils2/manifest.py --- a/distutils2/manifest.py +++ b/distutils2/manifest.py @@ -278,6 +278,7 @@ Return True if files are found. """ + # XXX docstring lying about what the special chars are? files_found = False pattern_re = _translate_pattern(pattern, anchor, prefix, is_regex) @@ -341,10 +342,14 @@ # IMHO is wrong -- '?' and '*' aren't supposed to match slash in Unix, # and by extension they shouldn't match such "special characters" under # any OS. So change all non-escaped dots in the RE to match any - # character except the special characters. - # XXX currently the "special characters" are just slash -- i.e. this is - # Unix-only. - pattern_re = re.sub(r'((? http://hg.python.org/distutils2/rev/c82c97b2eae1 changeset: 1290:c82c97b2eae1 user: ?ric Araujo date: Mon Feb 27 11:57:12 2012 +0100 summary: Fix comparison bug with 'rc' versions (#11841) files: CHANGES.txt | 1 + distutils2/tests/test_version.py | 9 +++++++ distutils2/version.py | 24 ++++++++++--------- 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/CHANGES.txt b/CHANGES.txt --- a/CHANGES.txt +++ b/CHANGES.txt @@ -168,6 +168,7 @@ --libraries option [?ric] - #13974: add test for util.set_platform [tshepang] - #6884: Fix MANIFEST.in parsing bugs on Windows [?ric, nadeem] +- #11841: Fix comparison bug with 'rc' versions [filip] 1.0a3 - 2010-10-08 diff --git a/distutils2/tests/test_version.py b/distutils2/tests/test_version.py --- a/distutils2/tests/test_version.py +++ b/distutils2/tests/test_version.py @@ -16,6 +16,7 @@ (V('1.2'), '1.2'), (V('1.2.3a4'), '1.2.3a4'), (V('1.2c4'), '1.2c4'), + (V('4.17rc2'), '4.17rc2'), (V('1.2.3.4'), '1.2.3.4'), (V('1.2.3.4.0b3'), '1.2.3.4b3'), (V('1.2.0.0.0'), '1.2'), @@ -146,6 +147,14 @@ """ doctest.script_from_examples(comparison_doctest_string) + # the doctest above is never run, so temporarily add real unit + # tests until the doctest is rewritten + self.assertLessEqual(V('1.2.0rc1'), V('1.2.0')) + self.assertGreater(V('1.0'), V('1.0c2')) + self.assertGreater(V('1.0'), V('1.0rc2')) + self.assertGreater(V('1.0rc2'), V('1.0rc1')) + self.assertGreater(V('1.0c4'), V('1.0c1')) + def test_suggest_normalized_version(self): self.assertEqual(suggest('1.0'), '1.0') diff --git a/distutils2/version.py b/distutils2/version.py --- a/distutils2/version.py +++ b/distutils2/version.py @@ -11,19 +11,20 @@ # A marker used in the second and third parts of the `parts` tuple, for # versions that don't have those segments, to sort properly. An example # of versions in sort order ('highest' last): -# 1.0b1 ((1,0), ('b',1), ('f',)) -# 1.0.dev345 ((1,0), ('f',), ('dev', 345)) -# 1.0 ((1,0), ('f',), ('f',)) -# 1.0.post256.dev345 ((1,0), ('f',), ('f', 'post', 256, 'dev', 345)) -# 1.0.post345 ((1,0), ('f',), ('f', 'post', 345, 'f')) +# 1.0b1 ((1,0), ('b',1), ('z',)) +# 1.0.dev345 ((1,0), ('z',), ('dev', 345)) +# 1.0 ((1,0), ('z',), ('z',)) +# 1.0.post256.dev345 ((1,0), ('z',), ('z', 'post', 256, 'dev', 345)) +# 1.0.post345 ((1,0), ('z',), ('z', 'post', 345, 'z')) # ^ ^ ^ -# 'b' < 'f' ---------------------/ | | +# 'b' < 'z' ---------------------/ | | # | | -# 'dev' < 'f' < 'post' -------------------/ | +# 'dev' < 'z' ----------------------------/ | # | -# 'dev' < 'f' ----------------------------------------------/ -# Other letters would do, but 'f' for 'final' is kind of nice. -_FINAL_MARKER = ('f',) +# 'dev' < 'z' ----------------------------------------------/ +# 'f' for 'final' would be kind of nice, but due to bugs in the support of +# 'rc' we must use 'z' +_FINAL_MARKER = ('z',) _VERSION_RE = re.compile(r''' ^ @@ -167,8 +168,9 @@ if prerel is not _FINAL_MARKER: s += prerel[0] s += '.'.join(str(v) for v in prerel[1:]) + # XXX clean up: postdev is always true; code is obscure if postdev and postdev is not _FINAL_MARKER: - if postdev[0] == 'f': + if postdev[0] == _FINAL_MARKER[0]: postdev = postdev[1:] i = 0 while i < len(postdev): -- Repository URL: http://hg.python.org/distutils2 From python-checkins at python.org Mon Feb 27 12:29:44 2012 From: python-checkins at python.org (eric.araujo) Date: Mon, 27 Feb 2012 12:29:44 +0100 Subject: [Python-checkins] =?utf8?q?distutils2_=28merge_default_-=3E_pytho?= =?utf8?q?n3=29=3A_Merge_fixes_for_=2313974=2C_=236884_and_=2311841_from_d?= =?utf8?q?efault?= Message-ID: http://hg.python.org/distutils2/rev/7d1a7251d771 changeset: 1291:7d1a7251d771 branch: python3 parent: 1286:158697fd8fa1 parent: 1290:c82c97b2eae1 user: ?ric Araujo date: Mon Feb 27 12:29:18 2012 +0100 summary: Merge fixes for #13974, #6884 and #11841 from default files: CHANGES.txt | 3 + CONTRIBUTORS.txt | 1 + distutils2/manifest.py | 19 +- distutils2/tests/fixer/__init__.py | 1 + distutils2/tests/test_command_build_ext.py | 3 +- distutils2/tests/test_manifest.py | 138 +++++++-- distutils2/tests/test_util.py | 5 + distutils2/tests/test_version.py | 9 + distutils2/version.py | 24 +- 9 files changed, 150 insertions(+), 53 deletions(-) diff --git a/CHANGES.txt b/CHANGES.txt --- a/CHANGES.txt +++ b/CHANGES.txt @@ -166,6 +166,9 @@ script with pysetup create [?ric] - #1326113: build_ext now correctly parses multiple values given to the --libraries option [?ric] +- #13974: add test for util.set_platform [tshepang] +- #6884: Fix MANIFEST.in parsing bugs on Windows [?ric, nadeem] +- #11841: Fix comparison bug with 'rc' versions [filip] 1.0a3 - 2010-10-08 diff --git a/CONTRIBUTORS.txt b/CONTRIBUTORS.txt --- a/CONTRIBUTORS.txt +++ b/CONTRIBUTORS.txt @@ -69,3 +69,4 @@ - Vinay Sajip - Victor Stinner - Alexandre Vassalotti +- Nadeem Vawda diff --git a/distutils2/manifest.py b/distutils2/manifest.py --- a/distutils2/manifest.py +++ b/distutils2/manifest.py @@ -272,6 +272,7 @@ Return True if files are found. """ + # XXX docstring lying about what the special chars are? files_found = False pattern_re = _translate_pattern(pattern, anchor, prefix, is_regex) @@ -335,11 +336,14 @@ # IMHO is wrong -- '?' and '*' aren't supposed to match slash in Unix, # and by extension they shouldn't match such "special characters" under # any OS. So change all non-escaped dots in the RE to match any - # character except the special characters. - # XXX currently the "special characters" are just slash -- i.e. this is - # Unix-only. - pattern_re = re.sub(r'((? http://hg.python.org/cpython/rev/b52fbbcdc8e6 changeset: 75312:b52fbbcdc8e6 branch: 3.2 parent: 75309:1b163c25d260 user: Vinay Sajip date: Mon Feb 27 11:56:29 2012 +0000 summary: Updated cookbook with information on customising LogRecords. files: Doc/howto/logging-cookbook.rst | 82 ++++++++++++++++++++++ 1 files changed, 82 insertions(+), 0 deletions(-) diff --git a/Doc/howto/logging-cookbook.rst b/Doc/howto/logging-cookbook.rst --- a/Doc/howto/logging-cookbook.rst +++ b/Doc/howto/logging-cookbook.rst @@ -1092,6 +1092,88 @@ call to one of the XXXMessage classes. +.. currentmodule:: logging + +.. custom-logrecord: + +Customising ``LogRecord`` +------------------------- + +Every logging event is represented by a :class:`LogRecord` instance. +When an event is logged and not filtered out by a logger's level, a +:class:`LogRecord` is created, populated with information about the event and +then passed to the handlers for that logger (and its ancestors, up to and +including the logger where further propagation up the hierarchy is disabled). +Before Python 3.2, there were only two places where this creation was done: + +* :meth:`Logger.makeRecord`, which is called in the normal process of + logging an event. This invoked :class:`LogRecord` directly to create an + instance. +* :func:`makeLogRecord`, which is called with a dictionary containing + attributes to be added to the LogRecord. This is typically invoked when a + suitable dictionary has been received over the network (e.g. in pickle form + via a :class:`~handlers.SocketHandler`, or in JSON form via an + :class:`~handlers.HTTPHandler`). + +This has usually meant that if you need to do anything special with a +:class:`LogRecord`, you've had to do one of the following. + +* Create your own :class:`Logger` subclass, which overrides + :meth:`Logger.makeRecord`, and set it using :func:`~logging.setLoggerClass` + before any loggers that you care about are instantiated. +* Add a :class:`Filter` to a logger or handler, which does the + necessary special manipulation you need when its + :meth:`~Filter.filter` method is called. + +The first approach would be a little unwieldy in the scenario where (say) +several different libraries wanted to do different things. Each would attempt +to set its own :class:`Logger` subclass, and the one which did this last would +win. + +The second approach works reasonably well for many cases, but does not allow +you to e.g. use a specialized subclass of :class:`LogRecord`. Library +developers can set a suitable filter on their loggers, but they would have to +remember to do this every time they introduced a new logger (which they would +do simply by adding new packages or modules and doing + +.. code-block:: python + + logger = logging.getLogger(__name__) + +at module level). It's probably one too many things to think about. Developers +could also add the filter to a :class:`~logging.NullHandler` attached to their +top-level logger, but this would not be invoked if an application developer +attached a handler to a lower-level library logger ? so output from that +handler would not reflect the intentions of the library developer. + +In Python 3.2 and later, :class:`~logging.LogRecord` creation is done through a +factory, which you can specify. The factory is just a callable you can set with +:func:`~logging.setLogRecordFactory`, and interrogate with +:func:`~logging.getLogRecordFactory`. The factory is invoked with the same +signature as the :class:`~logging.LogRecord` constructor, as :class:`LogRecord` +is the default setting for the factory. + +This approach allows a custom factory to control all aspects of LogRecord +creation. For example, you could return a subclass, or just add some additional +attributes to the record once created, using a pattern similar to this:: + + old_factory = logging.getLogRecordFactory() + + def record_factory(*args, **kwargs): + record = old_factory(*args, **kwargs) + record.custom_attribute = 0xdecafbad + return record + + logging.setLogRecordFactory(record_factory) + +This pattern allows different libraries to chain factories together, and as +long as they don't overwrite each other's attributes or unintentionally +overwrite the attributes provided as standard, there should be no surprises. +However, it should be borne in mind that each link in the chain adds run-time +overhead to all logging operations, and the technique should only be used when +the use of a :class:`Filter` does not provide the desired result. + + .. _zeromq-handlers: Subclassing QueueHandler - a ZeroMQ example -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Feb 27 12:57:32 2012 From: python-checkins at python.org (vinay.sajip) Date: Mon, 27 Feb 2012 12:57:32 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_3=2E2_-=3E_default=29?= =?utf8?q?=3A_Merged_cookbook_update_for_LogRecord_customisation=2E?= Message-ID: http://hg.python.org/cpython/rev/420cc96ce3bb changeset: 75313:420cc96ce3bb parent: 75311:2aab57e694e4 parent: 75312:b52fbbcdc8e6 user: Vinay Sajip date: Mon Feb 27 11:57:25 2012 +0000 summary: Merged cookbook update for LogRecord customisation. files: Doc/howto/logging-cookbook.rst | 82 ++++++++++++++++++++++ 1 files changed, 82 insertions(+), 0 deletions(-) diff --git a/Doc/howto/logging-cookbook.rst b/Doc/howto/logging-cookbook.rst --- a/Doc/howto/logging-cookbook.rst +++ b/Doc/howto/logging-cookbook.rst @@ -1092,6 +1092,88 @@ call to one of the XXXMessage classes. +.. currentmodule:: logging + +.. custom-logrecord: + +Customising ``LogRecord`` +------------------------- + +Every logging event is represented by a :class:`LogRecord` instance. +When an event is logged and not filtered out by a logger's level, a +:class:`LogRecord` is created, populated with information about the event and +then passed to the handlers for that logger (and its ancestors, up to and +including the logger where further propagation up the hierarchy is disabled). +Before Python 3.2, there were only two places where this creation was done: + +* :meth:`Logger.makeRecord`, which is called in the normal process of + logging an event. This invoked :class:`LogRecord` directly to create an + instance. +* :func:`makeLogRecord`, which is called with a dictionary containing + attributes to be added to the LogRecord. This is typically invoked when a + suitable dictionary has been received over the network (e.g. in pickle form + via a :class:`~handlers.SocketHandler`, or in JSON form via an + :class:`~handlers.HTTPHandler`). + +This has usually meant that if you need to do anything special with a +:class:`LogRecord`, you've had to do one of the following. + +* Create your own :class:`Logger` subclass, which overrides + :meth:`Logger.makeRecord`, and set it using :func:`~logging.setLoggerClass` + before any loggers that you care about are instantiated. +* Add a :class:`Filter` to a logger or handler, which does the + necessary special manipulation you need when its + :meth:`~Filter.filter` method is called. + +The first approach would be a little unwieldy in the scenario where (say) +several different libraries wanted to do different things. Each would attempt +to set its own :class:`Logger` subclass, and the one which did this last would +win. + +The second approach works reasonably well for many cases, but does not allow +you to e.g. use a specialized subclass of :class:`LogRecord`. Library +developers can set a suitable filter on their loggers, but they would have to +remember to do this every time they introduced a new logger (which they would +do simply by adding new packages or modules and doing + +.. code-block:: python + + logger = logging.getLogger(__name__) + +at module level). It's probably one too many things to think about. Developers +could also add the filter to a :class:`~logging.NullHandler` attached to their +top-level logger, but this would not be invoked if an application developer +attached a handler to a lower-level library logger ? so output from that +handler would not reflect the intentions of the library developer. + +In Python 3.2 and later, :class:`~logging.LogRecord` creation is done through a +factory, which you can specify. The factory is just a callable you can set with +:func:`~logging.setLogRecordFactory`, and interrogate with +:func:`~logging.getLogRecordFactory`. The factory is invoked with the same +signature as the :class:`~logging.LogRecord` constructor, as :class:`LogRecord` +is the default setting for the factory. + +This approach allows a custom factory to control all aspects of LogRecord +creation. For example, you could return a subclass, or just add some additional +attributes to the record once created, using a pattern similar to this:: + + old_factory = logging.getLogRecordFactory() + + def record_factory(*args, **kwargs): + record = old_factory(*args, **kwargs) + record.custom_attribute = 0xdecafbad + return record + + logging.setLogRecordFactory(record_factory) + +This pattern allows different libraries to chain factories together, and as +long as they don't overwrite each other's attributes or unintentionally +overwrite the attributes provided as standard, there should be no surprises. +However, it should be borne in mind that each link in the chain adds run-time +overhead to all logging operations, and the technique should only be used when +the use of a :class:`Filter` does not provide the desired result. + + .. _zeromq-handlers: Subclassing QueueHandler - a ZeroMQ example -- Repository URL: http://hg.python.org/cpython From ncoghlan at gmail.com Mon Feb 27 13:36:54 2012 From: ncoghlan at gmail.com (Nick Coghlan) Date: Mon, 27 Feb 2012 22:36:54 +1000 Subject: [Python-checkins] cpython (3.2): Updated logging cookbook with info on alternative format styles. In-Reply-To: References: Message-ID: On Mon, Feb 27, 2012 at 9:04 PM, vinay.sajip wrote: > +There is, however, a way that you can use {}- and $- formatting to construct > +your individual log messages. Recall that for a message you can use an > +arbitrary object as a message format string, and that the logging package will > +call ``str()`` on that object to get the actual format string. Consider the > +following two classes:: > + > + ? ?class BraceMessage(object): > + ? ? ? ?def __init__(self, fmt, *args, **kwargs): > + ? ? ? ? ? ?self.fmt = fmt > + ? ? ? ? ? ?self.args = args > + ? ? ? ? ? ?self.kwargs = kwargs > + > + ? ? ? ?def __str__(self): > + ? ? ? ? ? ?return self.fmt.format(*self.args, **self.kwargs) > + > + ? ?class DollarMessage(object): > + ? ? ? ?def __init__(self, fmt, **kwargs): > + ? ? ? ? ? ?self.fmt = fmt > + ? ? ? ? ? ?self.kwargs = kwargs > + > + ? ? ? ?def __str__(self): > + ? ? ? ? ? ?from string import Template > + ? ? ? ? ? ?return Template(self.fmt).substitute(**self.kwargs) > + > +Either of these can be used in place of a format string, to allow {}- or > +$-formatting to be used to build the actual "message" part which appears in the > +formatted log output in place of "%(message)s" or "{message}" or "$message". > +It's a little unwieldy to use the class names whenever you want to log > +something, but it's quite palatable if you use an alias such as __ (double > +underscore ? not to be confused with _, the single underscore used as a > +synonym/alias for :func:`gettext.gettext` or its brethren). This is the part I was thinking might be simplified by allowing a "style" parameter to be passed to getLogger(). Consider StrFormatLogger and StringTemplateLogger classes that were just wrappers around an ordinary Logger instance, and made the relevant conversions to StrFormatMessage or StringTemplateMessage on the caller's behalf. Then (assuming the current getLogger() is available as _getLogger()), you could just do something like: _LOGGER_STYLES = { "%": lambda x: x, "{": StrFormatLogger, "$": StringTemplateLogger, } def getLogger(name, style='%'): if style not in _STYLES: raise ValueError('Style must be one of: %s' % ','.join(_LOGGER_STYLES.keys())) return _LOGGER_STYLES[style](_getLogger()) Since each module should generally be doing its own getLogger() call (or else should be documenting that it accepts an ordinary logger instance as a parameter), it seems like this would allow fairly clean use of the alternate styles without complicating each individual logging operation. (The xyzStyle approach used by formatters here won't work, since we want different modules to be able to use different formatting styles. However, ordinary inheritance should allow StrFormatLogger and StringTemplateLogger to share most of their implementation) Cheers, Nick. -- Nick Coghlan?? |?? ncoghlan at gmail.com?? |?? Brisbane, Australia From python-checkins at python.org Mon Feb 27 13:57:24 2012 From: python-checkins at python.org (stefan.krah) Date: Mon, 27 Feb 2012 13:57:24 +0100 Subject: [Python-checkins] =?utf8?q?cpython=3A_Issue_=2314125=3A_Fix_multi?= =?utf8?q?processing_refleak_on_Windows=2E_Patch_by_sbt=2E?= Message-ID: http://hg.python.org/cpython/rev/ba51573fcf90 changeset: 75314:ba51573fcf90 user: Stefan Krah date: Mon Feb 27 13:51:02 2012 +0100 summary: Issue #14125: Fix multiprocessing refleak on Windows. Patch by sbt. files: Modules/_multiprocessing/win32_functions.c | 5 ++++- 1 files changed, 4 insertions(+), 1 deletions(-) diff --git a/Modules/_multiprocessing/win32_functions.c b/Modules/_multiprocessing/win32_functions.c --- a/Modules/_multiprocessing/win32_functions.c +++ b/Modules/_multiprocessing/win32_functions.c @@ -708,9 +708,12 @@ PyObject *v = PySequence_GetItem(handle_seq, i); if (v == NULL) return NULL; - if (!PyArg_Parse(v, F_HANDLE, &h)) + 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 */ -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Feb 27 16:33:30 2012 From: python-checkins at python.org (stefan.krah) Date: Mon, 27 Feb 2012 16:33:30 +0100 Subject: [Python-checkins] =?utf8?q?cpython=3A_Issue_=2314125=3A_Fix_refle?= =?utf8?q?ak_in_timemodule=2Ec_on_Windows=2E_Thanks_sbt_for_pointing?= Message-ID: http://hg.python.org/cpython/rev/d4adbf908983 changeset: 75315:d4adbf908983 user: Stefan Krah date: Mon Feb 27 16:30:26 2012 +0100 summary: Issue #14125: Fix refleak in timemodule.c on Windows. Thanks sbt for pointing out the location of the problem. MS_WINDOWS currently implies !HAVE_WCSFTIME, so the addition of !defined(HAVE_WCSFTIME) is for readability. files: Modules/timemodule.c | 5 +++-- 1 files changed, 3 insertions(+), 2 deletions(-) diff --git a/Modules/timemodule.c b/Modules/timemodule.c --- a/Modules/timemodule.c +++ b/Modules/timemodule.c @@ -540,7 +540,7 @@ fmt = PyBytes_AS_STRING(format); #endif -#if defined(MS_WINDOWS) +#if defined(MS_WINDOWS) && !defined(HAVE_WCSFTIME) /* check that the format string contains only valid directives */ for(outbuf = strchr(fmt, '%'); outbuf != NULL; @@ -552,7 +552,8 @@ !strchr("aAbBcdHIjmMpSUwWxXyYzZ%", outbuf[1])) { PyErr_SetString(PyExc_ValueError, "Invalid format string"); - return 0; + Py_DECREF(format); + return NULL; } } #endif -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Feb 27 16:51:14 2012 From: python-checkins at python.org (benjamin.peterson) Date: Mon, 27 Feb 2012 16:51:14 +0100 Subject: [Python-checkins] =?utf8?q?peps=3A_give_equivalent_code_for_raise?= =?utf8?q?_from?= Message-ID: http://hg.python.org/peps/rev/e83741848e9e changeset: 4090:e83741848e9e user: Benjamin Peterson date: Mon Feb 27 10:51:11 2012 -0500 summary: give equivalent code for raise from files: pep-0415.txt | 6 ++++++ 1 files changed, 6 insertions(+), 0 deletions(-) diff --git a/pep-0415.txt b/pep-0415.txt --- a/pep-0415.txt +++ b/pep-0415.txt @@ -50,6 +50,12 @@ There is precedence for ``__suppress_context__`` with the ``print_line_and_file`` exception attribute. +To summarize, ``raise exc from cause`` will be equivalent to:: + + exc.__cause__ = cause + exc.__suppress_context__ = cause is None + raise exc + Patches ======= -- Repository URL: http://hg.python.org/peps From python-checkins at python.org Mon Feb 27 16:59:20 2012 From: python-checkins at python.org (benjamin.peterson) Date: Mon, 27 Feb 2012 16:59:20 +0100 Subject: [Python-checkins] =?utf8?q?cpython=3A_typo?= Message-ID: http://hg.python.org/cpython/rev/fb1968ae0ce5 changeset: 75316:fb1968ae0ce5 user: Benjamin Peterson date: Mon Feb 27 10:59:10 2012 -0500 summary: typo files: Doc/library/exceptions.rst | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Doc/library/exceptions.rst b/Doc/library/exceptions.rst --- a/Doc/library/exceptions.rst +++ b/Doc/library/exceptions.rst @@ -41,7 +41,7 @@ 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 :const:`None`, and it will bet set as :attr:`__cause__` on the +exception or :const:`None`, and it will be set as :attr:`__cause__` on the raised exception. If :attr:`__cause__` is an exception it will be displayed instead of :attr:`__context__`; if :attr:`__cause__` is None, :attr:`__context__` will not be displayed by the default exception handling -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Feb 27 17:40:00 2012 From: python-checkins at python.org (stefan.krah) Date: Mon, 27 Feb 2012 17:40:00 +0100 Subject: [Python-checkins] =?utf8?b?Y3B5dGhvbiAoMy4yKTogSXNzdWUgIzE0MTI1?= =?utf8?q?=3A_backport_refleak_fix_=28d4adbf908983=29=2E?= Message-ID: http://hg.python.org/cpython/rev/b4321f93e3f2 changeset: 75317:b4321f93e3f2 branch: 3.2 parent: 75312:b52fbbcdc8e6 user: Stefan Krah date: Mon Feb 27 17:34:17 2012 +0100 summary: Issue #14125: backport refleak fix (d4adbf908983). files: Modules/timemodule.c | 5 +++-- 1 files changed, 3 insertions(+), 2 deletions(-) diff --git a/Modules/timemodule.c b/Modules/timemodule.c --- a/Modules/timemodule.c +++ b/Modules/timemodule.c @@ -504,7 +504,7 @@ fmt = PyBytes_AS_STRING(format); #endif -#if defined(MS_WINDOWS) +#if defined(MS_WINDOWS) && !defined(HAVE_WCSFTIME) /* check that the format string contains only valid directives */ for(outbuf = strchr(fmt, '%'); outbuf != NULL; @@ -516,7 +516,8 @@ !strchr("aAbBcdHIjmMpSUwWxXyYzZ%", outbuf[1])) { PyErr_SetString(PyExc_ValueError, "Invalid format string"); - return 0; + Py_DECREF(format); + return NULL; } } #endif -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Feb 27 17:40:01 2012 From: python-checkins at python.org (stefan.krah) Date: Mon, 27 Feb 2012 17:40:01 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_3=2E2_-=3E_default=29?= =?utf8?q?=3A_Null_merge_=28fix_is_already_in_3=2E3=29=2E?= Message-ID: http://hg.python.org/cpython/rev/da851aa6aa3a changeset: 75318:da851aa6aa3a parent: 75316:fb1968ae0ce5 parent: 75317:b4321f93e3f2 user: Stefan Krah date: Mon Feb 27 17:36:17 2012 +0100 summary: Null merge (fix is already in 3.3). files: -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Feb 27 18:19:10 2012 From: python-checkins at python.org (eli.bendersky) Date: Mon, 27 Feb 2012 18:19:10 +0100 Subject: [Python-checkins] =?utf8?q?cpython=3A_Some_corrections_for_the_Do?= =?utf8?q?c/extending_documentation=2E_Closes_=2314129?= Message-ID: http://hg.python.org/cpython/rev/6c737eb12c3e changeset: 75319:6c737eb12c3e user: Eli Bendersky date: Mon Feb 27 19:18:35 2012 +0200 summary: Some corrections for the Doc/extending documentation. Closes #14129 files: Doc/c-api/type.rst | 3 +- Doc/extending/extending.rst | 3 - Doc/extending/newtypes.rst | 62 ++++++++---------------- 3 files changed, 23 insertions(+), 45 deletions(-) diff --git a/Doc/c-api/type.rst b/Doc/c-api/type.rst --- a/Doc/c-api/type.rst +++ b/Doc/c-api/type.rst @@ -75,7 +75,8 @@ .. 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. Initialize + all instance variables to *NULL*. .. c:function:: int PyType_Ready(PyTypeObject *type) diff --git a/Doc/extending/extending.rst b/Doc/extending/extending.rst --- a/Doc/extending/extending.rst +++ b/Doc/extending/extending.rst @@ -384,9 +384,6 @@ 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 --- a/Doc/extending/newtypes.rst +++ b/Doc/extending/newtypes.rst @@ -26,11 +26,12 @@ ========== 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 @@ 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 @@ 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: @@ -325,8 +326,8 @@ 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. @@ -443,15 +444,6 @@ 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; @@ -462,20 +454,13 @@ 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:: @@ -1122,9 +1107,6 @@ 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:: @@ -1144,8 +1126,6 @@ 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. @@ -1370,7 +1350,7 @@ return result; } -XXX some fields need to be added here... :: +:: /* Iterators */ getiterfunc tp_iter; -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Feb 27 20:00:47 2012 From: python-checkins at python.org (antoine.pitrou) Date: Mon, 27 Feb 2012 20:00:47 +0100 Subject: [Python-checkins] =?utf8?b?Y3B5dGhvbiAoMy4yKTogSXNzdWUgIzEzMTI1?= =?utf8?q?=3A_Silence_spurious_test=5Flib2to3_output_when_in_non-verbose_m?= =?utf8?q?ode=2E?= Message-ID: http://hg.python.org/cpython/rev/2fd68efac05a changeset: 75320:2fd68efac05a branch: 3.2 parent: 75317:b4321f93e3f2 user: Antoine Pitrou date: Mon Feb 27 19:55:36 2012 +0100 summary: Issue #13125: Silence spurious test_lib2to3 output when in non-verbose mode. Patch by Mikhail Novikov. files: Lib/lib2to3/tests/test_parser.py | 13 ++++++++++--- Misc/ACKS | 1 + Misc/NEWS | 3 +++ 3 files changed, 14 insertions(+), 3 deletions(-) diff --git a/Lib/lib2to3/tests/test_parser.py b/Lib/lib2to3/tests/test_parser.py --- a/Lib/lib2to3/tests/test_parser.py +++ b/Lib/lib2to3/tests/test_parser.py @@ -11,10 +11,14 @@ # Testing imports from . import support from .support import driver, test_dir +from test.support import verbose # Python imports import os +import sys import unittest +import warnings +import subprocess # Local imports from lib2to3.pgen2 import tokenize @@ -171,10 +175,12 @@ try: tree = driver.parse_string(source) except ParseError as err: - print('ParseError on file', filepath, err) + if verbose > 0: + warnings.warn('ParseError on file %s (%s)' % (filepath, err)) continue new = str(tree) - if diff(filepath, new): + x = diff(filepath, new) + if x: self.fail("Idempotency failed: %s" % filepath) def test_extended_unpacking(self): @@ -183,6 +189,7 @@ driver.parse_string("(z, *y, w) = m\n") driver.parse_string("for *z, m in d: pass\n") + class TestLiterals(GrammarTest): def validate(self, s): @@ -221,7 +228,7 @@ with open('@', 'w') as f: f.write(str(result)) fn = fn.replace('"', '\\"') - return os.system('diff -u "%s" @' % fn) + return subprocess.call(['diff', '-u', fn, '@'], stdout=(subprocess.DEVNULL if verbose < 1 else None)) finally: try: os.remove("@") diff --git a/Misc/ACKS b/Misc/ACKS --- a/Misc/ACKS +++ b/Misc/ACKS @@ -665,6 +665,7 @@ Tim Northover Joe Norton Neal Norwitz +Mikhail Novikov Michal Nowikowski Steffen Daode Nurpmeso Nigel O'Brian diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -127,6 +127,9 @@ Library ------- +- 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. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Feb 27 20:00:48 2012 From: python-checkins at python.org (antoine.pitrou) Date: Mon, 27 Feb 2012 20:00:48 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_3=2E2_-=3E_default=29?= =?utf8?q?=3A_Issue_=2313125=3A_Silence_spurious_test=5Flib2to3_output_whe?= =?utf8?q?n_in_non-verbose_mode=2E?= Message-ID: http://hg.python.org/cpython/rev/e721b2b74b59 changeset: 75321:e721b2b74b59 parent: 75319:6c737eb12c3e parent: 75320:2fd68efac05a user: Antoine Pitrou date: Mon Feb 27 19:56:37 2012 +0100 summary: Issue #13125: Silence spurious test_lib2to3 output when in non-verbose mode. Patch by Mikhail Novikov. files: Lib/lib2to3/tests/test_parser.py | 13 ++++++++++--- Misc/ACKS | 1 + Misc/NEWS | 3 +++ 3 files changed, 14 insertions(+), 3 deletions(-) diff --git a/Lib/lib2to3/tests/test_parser.py b/Lib/lib2to3/tests/test_parser.py --- a/Lib/lib2to3/tests/test_parser.py +++ b/Lib/lib2to3/tests/test_parser.py @@ -11,10 +11,14 @@ # Testing imports from . import support from .support import driver, test_dir +from test.support import verbose # Python imports import os +import sys import unittest +import warnings +import subprocess # Local imports from lib2to3.pgen2 import tokenize @@ -171,10 +175,12 @@ try: tree = driver.parse_string(source) except ParseError as err: - print('ParseError on file', filepath, err) + if verbose > 0: + warnings.warn('ParseError on file %s (%s)' % (filepath, err)) continue new = str(tree) - if diff(filepath, new): + x = diff(filepath, new) + if x: self.fail("Idempotency failed: %s" % filepath) def test_extended_unpacking(self): @@ -183,6 +189,7 @@ driver.parse_string("(z, *y, w) = m\n") driver.parse_string("for *z, m in d: pass\n") + class TestLiterals(GrammarTest): def validate(self, s): @@ -221,7 +228,7 @@ with open('@', 'w') as f: f.write(str(result)) fn = fn.replace('"', '\\"') - return os.system('diff -u "%s" @' % fn) + return subprocess.call(['diff', '-u', fn, '@'], stdout=(subprocess.DEVNULL if verbose < 1 else None)) finally: try: os.remove("@") diff --git a/Misc/ACKS b/Misc/ACKS --- a/Misc/ACKS +++ b/Misc/ACKS @@ -725,6 +725,7 @@ Tim Northover Joe Norton Neal Norwitz +Mikhail Novikov Michal Nowikowski Steffen Daode Nurpmeso Nigel O'Brian diff --git a/Misc/NEWS b/Misc/NEWS --- a/Misc/NEWS +++ b/Misc/NEWS @@ -508,6 +508,9 @@ Library ------- +- Issue #13125: Silence spurious test_lib2to3 output when in non-verbose mode. + Patch by Mikhail Novikov. + - Issue #11841: Fix comparison bug with 'rc' versions in packaging.version. Patch by Filip Gruszczy?ski. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Feb 27 20:07:50 2012 From: python-checkins at python.org (antoine.pitrou) Date: Mon, 27 Feb 2012 20:07:50 +0100 Subject: [Python-checkins] =?utf8?q?cpython=3A_Improve_debugging_output_fo?= =?utf8?q?r_test_failure?= Message-ID: http://hg.python.org/cpython/rev/2f8f2ad0545f changeset: 75322:2f8f2ad0545f user: Antoine Pitrou date: Mon Feb 27 20:04:05 2012 +0100 summary: Improve debugging output for test failure files: Lib/test/test_imp.py | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Lib/test/test_imp.py b/Lib/test/test_imp.py --- a/Lib/test/test_imp.py +++ b/Lib/test/test_imp.py @@ -328,7 +328,7 @@ importlib.invalidate_caches() expected___file__ = os.sep.join(('.', 'pep3147', '__init__.py')) m = __import__('pep3147') - self.assertEqual(m.__file__, expected___file__, (m.__file__, m.__path__)) + self.assertEqual(m.__file__, expected___file__, (m.__file__, m.__path__, sys.path)) # Ensure we load the pyc file. support.unload('pep3147') m = __import__('pep3147') -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Mon Feb 27 22:05:10 2012 From: python-checkins at python.org (antoine.pitrou) Date: Mon, 27 Feb 2012 22:05:10 +0100 Subject: [Python-checkins] =?utf8?q?cpython=3A_More_debug_output?= Message-ID: http://hg.python.org/cpython/rev/586e29658020 changeset: 75323:586e29658020 user: Antoine Pitrou date: Mon Feb 27 22:01:25 2012 +0100 summary: More debug output files: Lib/test/test_imp.py | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Lib/test/test_imp.py b/Lib/test/test_imp.py --- a/Lib/test/test_imp.py +++ b/Lib/test/test_imp.py @@ -328,12 +328,12 @@ 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)) + self.assertEqual(m.__file__, expected___file__, (m.__file__, m.__path__, sys.path, sys.path_importer_cache)) # Ensure we load the pyc file. support.unload('pep3147') m = __import__('pep3147') support.unload('pep3147') - self.assertEqual(m.__file__, expected___file__, (m.__file__, m.__path__, sys.path)) + self.assertEqual(m.__file__, expected___file__, (m.__file__, m.__path__, sys.path, sys.path_importer_cache)) class NullImporterTests(unittest.TestCase): -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Feb 28 00:16:09 2012 From: python-checkins at python.org (brett.cannon) Date: Tue, 28 Feb 2012 00:16:09 +0100 Subject: [Python-checkins] =?utf8?q?cpython=3A_Update_importlib=2Einvalida?= =?utf8?q?te=5Fcaches=28=29_to_be_more_general=2E?= Message-ID: http://hg.python.org/cpython/rev/de125ee32897 changeset: 75324:de125ee32897 user: Brett Cannon date: Mon Feb 27 18:15:42 2012 -0500 summary: Update importlib.invalidate_caches() to be more general. files: Doc/library/importlib.rst | 15 ++++- Lib/importlib/__init__.py | 31 +++-------- Lib/importlib/_bootstrap.py | 19 +----- Lib/importlib/test/source/test_finder.py | 7 ++ Lib/importlib/test/test_api.py | 28 ++++++++++ 5 files changed, 62 insertions(+), 38 deletions(-) diff --git a/Doc/library/importlib.rst b/Doc/library/importlib.rst --- a/Doc/library/importlib.rst +++ b/Doc/library/importlib.rst @@ -88,9 +88,12 @@ .. function:: invalidate_caches() - Invalidate importlib's internal caches. Calling this function may be - needed if some modules are installed while your program is running and - you expect the program to notice the changes. + Invalidate the internal caches of the finders stored at + :data:`sys.path_importer_cache`. If a finder implements + :meth:`abc.Finder.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 @@ -119,6 +122,12 @@ 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:`invalidate_caches()` when + invalidating the caches of all cached finders. + .. class:: Loader diff --git a/Lib/importlib/__init__.py b/Lib/importlib/__init__.py --- a/Lib/importlib/__init__.py +++ b/Lib/importlib/__init__.py @@ -1,23 +1,4 @@ -"""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 - -""" +"""A pure Python implementation of import.""" __all__ = ['__import__', 'import_module', 'invalidate_caches'] from . import _bootstrap @@ -37,7 +18,15 @@ # Public API ######################################################### -from ._bootstrap import __import__, invalidate_caches +from ._bootstrap import __import__ + + +def invalidate_caches(): + """Call the invalidate_caches() method on all 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() def import_module(name, package=None): diff --git a/Lib/importlib/_bootstrap.py b/Lib/importlib/_bootstrap.py --- a/Lib/importlib/_bootstrap.py +++ b/Lib/importlib/_bootstrap.py @@ -160,17 +160,6 @@ # Finder/loader utility code ################################################## -_cache_refresh = 0 - -def invalidate_caches(): - """Invalidate importlib's internal caches. - - Calling this function may be needed if some modules are installed while - your program is running and you expect the program to notice the changes. - """ - global _cache_refresh - _cache_refresh += 1 - def set_package(fxn): """Set __package__ on the returned module.""" @@ -768,7 +757,10 @@ self._path_mtime = -1 self._path_cache = set() self._relaxed_path_cache = set() - self._cache_refresh = 0 + + def invalidate_caches(self): + """Invalidate the directory mtime.""" + self._path_mtime = -1 def find_module(self, fullname): """Try to find a loader for the specified module.""" @@ -777,10 +769,9 @@ mtime = _os.stat(self.path).st_mtime except OSError: mtime = -1 - if mtime != self._path_mtime or _cache_refresh != self._cache_refresh: + if mtime != self._path_mtime: self._fill_cache() self._path_mtime = mtime - self._cache_refresh = _cache_refresh # tail_module keeps the original casing, for __file__ and friends if _relax_case(): cache = self._relaxed_path_cache diff --git a/Lib/importlib/test/source/test_finder.py b/Lib/importlib/test/source/test_finder.py --- a/Lib/importlib/test/source/test_finder.py +++ b/Lib/importlib/test/source/test_finder.py @@ -143,6 +143,13 @@ finally: os.unlink('mod.py') + def test_invalidate_caches(self): + # invalidate_caches() should reset the mtime. + finder = _bootstrap._FileFinder('', _bootstrap._SourceFinderDetails()) + finder._path_mtime = 42 + finder.invalidate_caches() + self.assertEqual(finder._path_mtime, -1) + def test_main(): from test.support import run_unittest diff --git a/Lib/importlib/test/test_api.py b/Lib/importlib/test/test_api.py --- a/Lib/importlib/test/test_api.py +++ b/Lib/importlib/test/test_api.py @@ -84,6 +84,34 @@ importlib.import_module('a.b') self.assertEqual(b_load_count, 1) + +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' + ins = InvalidatingNullFinder() + sys.path_importer_cache[key] = ins + self.addCleanup(lambda: sys.path_importer_cache.__delitem__(key)) + importlib.invalidate_caches() + self.assertTrue(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. + + def test_main(): from test.support import run_unittest run_unittest(ImportModuleTests) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Feb 28 00:59:30 2012 From: python-checkins at python.org (benjamin.peterson) Date: Tue, 28 Feb 2012 00:59:30 +0100 Subject: [Python-checkins] =?utf8?q?peps=3A_I_understand_what_Nick_meant_n?= =?utf8?q?ow?= Message-ID: http://hg.python.org/peps/rev/38cd1efd3148 changeset: 4091:38cd1efd3148 user: Benjamin Peterson date: Mon Feb 27 18:59:27 2012 -0500 summary: I understand what Nick meant now files: pep-0415.txt | 13 +++++++------ 1 files changed, 7 insertions(+), 6 deletions(-) diff --git a/pep-0415.txt b/pep-0415.txt --- a/pep-0415.txt +++ b/pep-0415.txt @@ -41,11 +41,12 @@ Proposal ======== -A new attribute on ``BaseException``, ``__suppress_context__``, will be -introduced. The ``raise exc from None`` syntax will cause -``exc.__suppress_context__`` to be set to ``True``. Exception printing code will -check for the attribute to determine whether context and cause will be -printed. ``__cause__`` will return to its original purpose and values. +A new attribute on ``BaseException``, ``__suppress_context__``, will +be introduced. The ``raise exc from cause`` syntax will set +``exc.__suppress_context__`` to ``True``. Exception printing code will +check for that attribute to determine whether context and cause will +be printed. ``__cause__`` will return to its original purpose and +values. There is precedence for ``__suppress_context__`` with the ``print_line_and_file`` exception attribute. @@ -53,7 +54,7 @@ To summarize, ``raise exc from cause`` will be equivalent to:: exc.__cause__ = cause - exc.__suppress_context__ = cause is None + exc.__suppress_context__ = True raise exc Patches -- Repository URL: http://hg.python.org/peps From solipsis at pitrou.net Tue Feb 28 05:35:23 2012 From: solipsis at pitrou.net (solipsis at pitrou.net) Date: Tue, 28 Feb 2012 05:35:23 +0100 Subject: [Python-checkins] Daily reference leaks (de125ee32897): sum=0 Message-ID: results for de125ee32897 on branch "default" -------------------------------------------- Command line was: ['./python', '-m', 'test.regrtest', '-uall', '-R', '3:3:/home/antoine/cpython/refleaks/reflogJV2fi7', '-x'] From python-checkins at python.org Tue Feb 28 08:17:57 2012 From: python-checkins at python.org (georg.brandl) Date: Tue, 28 Feb 2012 08:17:57 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=283=2E2=29=3A_Fix_markup_erro?= =?utf8?b?cnMu?= Message-ID: http://hg.python.org/cpython/rev/e656738cb631 changeset: 75325:e656738cb631 branch: 3.2 parent: 75320:2fd68efac05a user: Georg Brandl date: Tue Feb 28 08:21:40 2012 +0100 summary: Fix markup errors. files: Doc/howto/logging-cookbook.rst | 6 ++---- 1 files changed, 2 insertions(+), 4 deletions(-) diff --git a/Doc/howto/logging-cookbook.rst b/Doc/howto/logging-cookbook.rst --- a/Doc/howto/logging-cookbook.rst +++ b/Doc/howto/logging-cookbook.rst @@ -1094,7 +1094,7 @@ .. currentmodule:: logging -.. custom-logrecord: +.. _custom-logrecord: Customising ``LogRecord`` ------------------------- @@ -1134,9 +1134,7 @@ you to e.g. use a specialized subclass of :class:`LogRecord`. Library developers can set a suitable filter on their loggers, but they would have to remember to do this every time they introduced a new logger (which they would -do simply by adding new packages or modules and doing - -.. code-block:: python +do simply by adding new packages or modules and doing :: logger = logging.getLogger(__name__) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Feb 28 08:17:58 2012 From: python-checkins at python.org (georg.brandl) Date: Tue, 28 Feb 2012 08:17:58 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_3=2E2_-=3E_default=29?= =?utf8?q?=3A_Merge_with_3=2E2=2E?= Message-ID: http://hg.python.org/cpython/rev/49ed56671274 changeset: 75326:49ed56671274 parent: 75324:de125ee32897 parent: 75325:e656738cb631 user: Georg Brandl date: Tue Feb 28 08:21:49 2012 +0100 summary: Merge with 3.2. files: Doc/howto/logging-cookbook.rst | 6 ++---- 1 files changed, 2 insertions(+), 4 deletions(-) diff --git a/Doc/howto/logging-cookbook.rst b/Doc/howto/logging-cookbook.rst --- a/Doc/howto/logging-cookbook.rst +++ b/Doc/howto/logging-cookbook.rst @@ -1094,7 +1094,7 @@ .. currentmodule:: logging -.. custom-logrecord: +.. _custom-logrecord: Customising ``LogRecord`` ------------------------- @@ -1134,9 +1134,7 @@ you to e.g. use a specialized subclass of :class:`LogRecord`. Library developers can set a suitable filter on their loggers, but they would have to remember to do this every time they introduced a new logger (which they would -do simply by adding new packages or modules and doing - -.. code-block:: python +do simply by adding new packages or modules and doing :: logger = logging.getLogger(__name__) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Feb 28 09:06:08 2012 From: python-checkins at python.org (vinay.sajip) Date: Tue, 28 Feb 2012 09:06:08 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=283=2E2=29=3A_Improved_loggin?= =?utf8?q?g_cookbook_example=2E?= Message-ID: http://hg.python.org/cpython/rev/514d602c3db5 changeset: 75327:514d602c3db5 branch: 3.2 parent: 75325:e656738cb631 user: Vinay Sajip date: Tue Feb 28 08:05:23 2012 +0000 summary: Improved logging cookbook example. files: Doc/howto/logging-cookbook.rst | 17 +++++++++++------ 1 files changed, 11 insertions(+), 6 deletions(-) diff --git a/Doc/howto/logging-cookbook.rst b/Doc/howto/logging-cookbook.rst --- a/Doc/howto/logging-cookbook.rst +++ b/Doc/howto/logging-cookbook.rst @@ -972,12 +972,13 @@ When logging was added to the Python standard library, the only way of formatting messages with variable content was to use the %-formatting method. Since then, Python has gained two new formatting approaches: -string.Template (added in Python 2.4) and str.format (added in Python 2.6). +:class:`string.Template` (added in Python 2.4) and :meth:`str.format` +(added in Python 2.6). -Logging now (as of 3.2) provides improved support for these two additional -formatting styles. The :class:`Formatter` class been enhanced for Python 3.2 to -take an additional, optional keyword parameter named ``style``. This defaults -to ``'%'``, but other possible values are ``'{'`` and ``'$'``, which correspond +Logging (as of 3.2) provides improved support for these two additional +formatting styles. The :class:`Formatter` class been enhanced to take an +additional, optional keyword parameter named ``style``. This defaults to +``'%'``, but other possible values are ``'{'`` and ``'$'``, which correspond to the other two formatting styles. Backwards compatibility is maintained by default (as you would expect), but by explicitly specifying a style parameter, you get the ability to specify format strings which work with @@ -1068,7 +1069,7 @@ .. code-block:: pycon >>> from wherever import BraceMessage as __ - >>> print(__('Message with {0} {1}', 2, 'placeholders')) + >>> print(__('Message with {0} {name}', 2, name='placeholders')) Message with 2 placeholders >>> class Point: pass ... @@ -1083,6 +1084,10 @@ Message with 2 placeholders >>> +While the above examples use ``print()`` to show how the formatting works, you +would of course use ``logger.debug()`` or similar to actually log using this +approach. + One thing to note is that you pay no significant performance penalty with this approach: the actual formatting happens not when you make the logging call, but when (and if) the logged message is actually about to be output to a log by a -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Feb 28 09:06:09 2012 From: python-checkins at python.org (vinay.sajip) Date: Tue, 28 Feb 2012 09:06:09 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_3=2E2_-=3E_default=29?= =?utf8?q?=3A_Merged_cookbook_improvement_from_3=2E2=2E?= Message-ID: http://hg.python.org/cpython/rev/3328e388cb28 changeset: 75328:3328e388cb28 parent: 75326:49ed56671274 parent: 75327:514d602c3db5 user: Vinay Sajip date: Tue Feb 28 08:06:01 2012 +0000 summary: Merged cookbook improvement from 3.2. files: Doc/howto/logging-cookbook.rst | 17 +++++++++++------ 1 files changed, 11 insertions(+), 6 deletions(-) diff --git a/Doc/howto/logging-cookbook.rst b/Doc/howto/logging-cookbook.rst --- a/Doc/howto/logging-cookbook.rst +++ b/Doc/howto/logging-cookbook.rst @@ -972,12 +972,13 @@ When logging was added to the Python standard library, the only way of formatting messages with variable content was to use the %-formatting method. Since then, Python has gained two new formatting approaches: -string.Template (added in Python 2.4) and str.format (added in Python 2.6). +:class:`string.Template` (added in Python 2.4) and :meth:`str.format` +(added in Python 2.6). -Logging now (as of 3.2) provides improved support for these two additional -formatting styles. The :class:`Formatter` class been enhanced for Python 3.2 to -take an additional, optional keyword parameter named ``style``. This defaults -to ``'%'``, but other possible values are ``'{'`` and ``'$'``, which correspond +Logging (as of 3.2) provides improved support for these two additional +formatting styles. The :class:`Formatter` class been enhanced to take an +additional, optional keyword parameter named ``style``. This defaults to +``'%'``, but other possible values are ``'{'`` and ``'$'``, which correspond to the other two formatting styles. Backwards compatibility is maintained by default (as you would expect), but by explicitly specifying a style parameter, you get the ability to specify format strings which work with @@ -1068,7 +1069,7 @@ .. code-block:: pycon >>> from wherever import BraceMessage as __ - >>> print(__('Message with {0} {1}', 2, 'placeholders')) + >>> print(__('Message with {0} {name}', 2, name='placeholders')) Message with 2 placeholders >>> class Point: pass ... @@ -1083,6 +1084,10 @@ Message with 2 placeholders >>> +While the above examples use ``print()`` to show how the formatting works, you +would of course use ``logger.debug()`` or similar to actually log using this +approach. + One thing to note is that you pay no significant performance penalty with this approach: the actual formatting happens not when you make the logging call, but when (and if) the logged message is actually about to be output to a log by a -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Feb 28 09:19:54 2012 From: python-checkins at python.org (armin.ronacher) Date: Tue, 28 Feb 2012 09:19:54 +0100 Subject: [Python-checkins] =?utf8?q?peps=3A_pep-0414_-=3E_accepted_and_add?= =?utf8?q?ed_two_things_brought_up_on_the_mailinglist?= Message-ID: http://hg.python.org/peps/rev/969346766784 changeset: 4092:969346766784 parent: 4083:606470f2d09a user: Armin Ronacher date: Tue Feb 28 08:18:52 2012 +0000 summary: pep-0414 -> accepted and added two things brought up on the mailinglist files: pep-0414.txt | 38 ++++++++++++++++++++++++-------------- 1 files changed, 24 insertions(+), 14 deletions(-) diff --git a/pep-0414.txt b/pep-0414.txt --- a/pep-0414.txt +++ b/pep-0414.txt @@ -3,10 +3,11 @@ Version: $Revision$ Last-Modified: $Date$ Author: Armin Ronacher -Status: Draft +Status: Accepted Type: Standards Track Content-Type: text/x-rst Created: 15-Feb-2012 +Post-History: 28-Feb-2012 Abstract @@ -18,6 +19,12 @@ without the need for an explicit 2to3 run. +BDFL Pronouncement +================== + +This PEP has been formally accepted for Python 3.3. + + Rationale and Goals =================== @@ -49,16 +56,19 @@ future imports ``b'foo'`` means bytestring, ``u'foo'`` declares a unicode string and ``'foo'`` a native string which in Python 2.x means bytes. With the ``unicode_literals`` import the native string type is no longer -available and has to be incorrectly labeled as bytestring. If such a -codebase is then used in Python 3, the interpreter will start using byte -objects in places where they are no longer accepted (such as identifiers). -This can be solved by a module that detects 2.x and 3.x and provides -wrapper functions that transcode literals at runtime. Unfortunately, this -has the side effect of slowing down the runtime performance of Python and -makes for less beautiful code. Considering that Python 2 and Python 3 -support for most libraries will have to continue side by side for several -more years to come, this means that such modules lose one of Python's key -properties: easily readable and understandable code. +available by syntax and has to be incorrectly labeled as bytestring. If +such a codebase is then used in Python 3, the interpreter will start using +byte objects in places where they are no longer accepted (such as +identifiers). This can be solved by a module that detects 2.x and 3.x and +provides wrapper functions that transcode literals at runtime (either by +having a ``u`` function that marks things as unicode without future +imports or the inverse by having a ``n`` function that marks strings as +native). Unfortunately, this has the side effect of slowing down the +runtime performance of Python and makes for less beautiful code. +Considering that Python 2 and Python 3 support for most libraries will +have to continue side by side for several more years to come, this means +that such modules lose one of Python's key properties: easily readable and +understandable code. Additionally, the vast majority of people who maintain Python 2.x codebases are more familiar with Python 2.x semantics, and a per-file @@ -126,9 +136,9 @@ In practice 2to3 currently suffers from a few problems which make it unnecessarily difficult and/or unpleasant to use: -- Bad overall performance. In many cases 2to3 runs one or two orders of - magnitude slower than the testsuite for the library or application - it's testing. +- Bad overall performance. In many cases 2to3 runs 20 times slower than + the testsuite for the library or application it's testing. (This for + instance is the case for the Jinja2 library). - Slightly different behaviour in 2to3 between different versions of Python cause different outcomes when paired with custom fixers. - Line numbers from error messages do not match up with the real source -- Repository URL: http://hg.python.org/peps From python-checkins at python.org Tue Feb 28 09:19:55 2012 From: python-checkins at python.org (armin.ronacher) Date: Tue, 28 Feb 2012 09:19:55 +0100 Subject: [Python-checkins] =?utf8?q?peps_=28merge_default_-=3E_default=29?= =?utf8?q?=3A_merged?= Message-ID: http://hg.python.org/peps/rev/247b2760b3b7 changeset: 4093:247b2760b3b7 parent: 4092:969346766784 parent: 4091:38cd1efd3148 user: Armin Ronacher date: Tue Feb 28 08:19:11 2012 +0000 summary: merged files: pep-0410.txt | 9 +- pep-0413.txt | 560 +++++++++++++++++++++++++++----------- pep-0415.txt | 85 +++++ 3 files changed, 489 insertions(+), 165 deletions(-) diff --git a/pep-0410.txt b/pep-0410.txt --- a/pep-0410.txt +++ b/pep-0410.txt @@ -3,13 +3,20 @@ Version: $Revision$ Last-Modified: $Date$ Author: Victor Stinner -Status: Draft +Status: Rejected Type: Standards Track Content-Type: text/x-rst Created: 01-February-2012 Python-Version: 3.3 +Rejection Notice +================ + +This PEP is rejected. +See http://mail.python.org/pipermail/python-dev/2012-February/116837.html. + + Abstract ======== diff --git a/pep-0413.txt b/pep-0413.txt --- a/pep-0413.txt +++ b/pep-0413.txt @@ -14,8 +14,8 @@ Abstract ======== -This PEP proposes the adoption of a new date-based versioning scheme for -the standard library (distinct from, but coupled to, the existing language +This PEP proposes the adoption of a separate versioning scheme for the +standard library (distinct from, but coupled to, the existing language versioning scheme) that allows accelerated releases of the Python standard library, while maintaining (or even slowing down) the current rate of change in the core language definition. @@ -87,11 +87,11 @@ the lives of the CPython core developers a little easier at the expense of everyone else). -But, if we go back to the primary rationale for increasing the pace of change -(i.e. more timely support for web protocols and related technologies), we can -note that those only require *standard library* changes. That means many -(perhaps even most) of the negative effects on the wider community can be -avoided by explicitly limiting which parts of CPython are affected by the +However, if we go back to the primary rationale for increasing the pace of +change (i.e. more timely support for web protocols and related technologies), +we can note that those only require *standard library* changes. That means +many (perhaps even most) of the negative effects on the wider community can +be avoided by explicitly limiting which parts of CPython are affected by the new release cycle, and allowing other parts to evolve at their current, more sedate, pace. @@ -99,68 +99,128 @@ Proposal ======== -This PEP proposes the addition of a new ``sys.stdlib_info`` attribute that -records a date based standard library version above and beyond the underlying -interpreter version:: +This PEP proposes the introduction of a new kind of CPython release: +"standard library releases". As with PEP 407, this will give CPython 3 kinds +of release: - sys.stdlib_info(year=2012, month=8, micro=0, releaselevel='final', serial=0) +* Language release: "x.y.0" +* Maintenance release: "x.y.z" (where z > 0) +* Standard library release: "x.y (xy.z)" (where z > 0) -This information would also be included in the ``sys.version`` string:: +Under this scheme, an unqualified version reference (such as "3.3") would +always refer to the most recent corresponding language or maintenance +release. It will never be used without qualification to refer to a standard +library release (at least, not by python-dev - obviously, we can only set an +example, not force the rest of the Python ecosystem to go along with it). - Python 3.3.0 (12.08.0, default:c1a07c8092f7+, Feb 17 2012, 23:03:41) - [GCC 4.6.1] +Language releases will continue as they are now, as new versions of the +Python language definition, along with a new version of the CPython +interpreter and the Python standard library. Accordingly, a language +release may contain any and all of the following changes: + +* new language syntax +* new standard library changes (see below) +* new deprecation warnings +* removal of previously deprecated features +* changes to the emitted bytecode +* changes to the AST +* any other significant changes to the compilation toolchain +* changes to the core interpreter eval loop +* binary incompatible changes to the C ABI (although the PEP 384 stable ABI + must still be preserved) +* bug fixes + +Maintenance releases will also continue as they do today, being strictly +limited to bug fixes for the corresponding language release. No new features +or radical internal changes are permitted. + +The new standard library releases will occur in parallel with each +maintenance release and will be qualified with a new version identifier +documenting the standard library version. Standard library releases may +include the following changes: + +* new features in pure Python modules +* new features in C extension modules (subject to PEP 399 compatibility + requirements) +* new features in language builtins (provided the C ABI remains unaffected) +* bug fixes from the corresponding maintenance release + +Standard library version identifiers are constructed by combining the major +and minor version numbers for the Python language release into a single two +digit number and then appending a sequential standard library version +identifier. + + +Release Cycle +------------- When maintenance releases are created, *two* new versions of Python would actually be published on python.org (using the first 3.3 maintenance release, planned for February 2013 as an example):: - 3.3.1 + 12.08.1 # Maintenance release - 3.3.1 + 13.02.0 # Standard library release - -A standard library release would just be the corresponding maintenance -release, with the following additional, backwards compatible changes: - -* new features in pure Python modules -* new features in C extension modules (subject to PEP 399 compatibility - requirements) -* new features in language builtins (provided the C ABI remains unaffected) + 3.3.1 # Maintenance release + 3.3 (33.1) # Standard library release A further 6 months later, the next 3.3 maintenance release would again be accompanied by a new standard library release:: - 3.3.2 + 12.08.2 # Maintenance release - 3.3.2 + 13.08.1 # Standard library release + 3.3.2 # Maintenance release + 3.3 (33.2) # Standard library release Again, the standard library release would be binary compatible with the previous language release, merely offering additional features at the Python level. Finally, 18 months after the release of 3.3, a new language release would -be made around the same time as the final 3.3 maintenance release:: +be made around the same time as the final 3.3 maintenance and standard +library releases:: - 3.3.3 + 12.08.3 # Maintenance release - 3.4.0 + 14.02.0 # Language release - -Language releases would then contain all the features that are not -permitted in standard library releases: - -* new language syntax -* new deprecation warnings -* removal of previously deprecated features -* changes to the emitted bytecode -* changes to the AST -* any other significant changes to the compilation toolchain -* changes to the core eval loop -* changes to the C ABI + 3.3.3 # Maintenance release + 3.3 (33.3) # Standard library release + 3.4.0 # Language release The 3.4 release cycle would then follow a similar pattern to that for 3.3:: - 3.4.1 + 14.02.1 # Maintenance release - 3.4.1 + 14.08.0 # Standard library release - 3.4.2 + 14.02.2 # Maintenance release - 3.4.2 + 15.02.0 # Standard library release - 3.4.3 + 14.02.3 # Maintenance release - 3.5.0 + 15.08.0 # Language release + 3.4.1 # Maintenance release + 3.4 (34.1) # Standard library release + + 3.4.2 # Maintenance release + 3.4 (34.2) # Standard library release + + 3.4.3 # Maintenance release + 3.4 (34.3) # Standard library release + 3.5.0 # Language release + + +Programmatic Version Identification +----------------------------------- + +To expose the new version details programmatically, this PEP proposes the +addition of a new ``sys.stdlib_info`` attribute that records the new +standard library version above and beyond the underlying interpreter +version. Using the initial Python 3.3 release as an example:: + + sys.stdlib_info(python=33, version=0, releaselevel='final', serial=0) + +This information would also be included in the ``sys.version`` string:: + + Python 3.3.0 (33.0, default, Feb 17 2012, 23:03:41) + [GCC 4.6.1] + + +Security Fixes and Other "Out of Cycle" Releases +------------------------------------------------ + +For maintenance releases the process of handling out-of-cycle releases (for +example, to fix a security issue or resolve a critical bug in a new release), +remains the same as it is now: the minor version number is incremented and a +new release is made incorporating the required bug fixes, as well as any +other bug fixes that have been committed since the previous release. + +For standard library releases, the process is essentially the same, but the +corresponding "What's New?" document may require some tidying up for the +release (as the standard library release may incorporate new features, +not just bug fixes). User Scenarios @@ -187,12 +247,12 @@ **Status quo:** must choose between 3.3 and 2.7 -**This PEP:** must choose between 3.3 (13.02), 3.3 (12.08) and 2.7. +**This PEP:** must choose between 3.3 (33.1), 3.3 and 2.7. **PEP 407:** must choose between 3.4, 3.3 (LTS) and 2.7. **Verdict:** explaining the meaning of a Long Term Support release is about as -complicated as explaining the meaning of the proposed standard library +complicated as explaining the meaning of the proposed standard library release version numbers. I call this a tie. @@ -202,16 +262,15 @@ **Status quo:** minor version differences indicate 18-24 months of language evolution -**This PEP:** same as status quo for language core, or just compare the -standard library version numbers to get a rough time in months. +**This PEP:** same as status quo for language core, standard library version +numbers indicate 6 months of standard library evolution. **PEP 407:** minor version differences indicate 18-24 months of language evolution up to 3.3, then 6 months of language evolution thereafter. -**Verdict:** date based numbering schemes with regular release cycles are -a *much* better way to give novices a rough handle on the currency of -information. Since keeping the minor version implications the same is a gain -for *current* Python users, I'm calling this a win twice over for the schemes +**Verdict:** Since language changes and deprecations can have a much bigger +effect on the accuracy of third party documentation than the addition of new +features to the standard library, I'm calling this a win for the scheme in this PEP. @@ -297,7 +356,7 @@ doesn't currently spell out a specific development strategy. Assuming a 3.3 compatibility branch is adopted (as proposed in this PEP), then the outcome would be much the same, but the version number signalling would be -slightly less clear (since you would have to look up to see if a particular +slightly less clear (since you would have to check to see if a particular release was an LTS release or not). **Verdict:** while not as clear cut as some previous scenarios, I'm still @@ -318,7 +377,7 @@ **This PEP:** look for "version added" or "version changed" markers in the documentation. If written as a bare Python version, such as "3.3", check against ``sys.version_info``. If qualified with a standard library version, -such as "3.3 (13.02)", check against ``sys.stdlib_info``. +such as "3.3 (33.1)", check against ``sys.stdlib_info``. **PEP 407:** same as status quo @@ -353,6 +412,26 @@ fault reports will already include it, and it is easy to request if needed. +CPython release managers, handling a security fix +------------------------------------------------- + +**Status quo:** create a new maintenance release incorporating the security +fix and any other bug fixes under source control. Also create source releases +for any branches open solely for security fixes. + +**This PEP:** same as the status quo for maintenance branches. Also create a +new standard library release (potentially incorporating new features along +with the security fix). For security branches, create source releases for +both the former maintenance branch and the standard library update branch. + +**PEP 407:** same as the status quo for maintenance and security branches, +but handling security fixes for non-LTS releases is currently an open +question. + +**Verdict:** until PEP 407 is updated to actually address this scenario, a +clear win for this PEP. + + Effects ======= @@ -365,10 +444,6 @@ worth of standard library changes, as well as any changes associated with new syntax. -If a release date slips by a month or two, the current proposal is to keep -the planned standard library version number rather than updating it to -reflect the actual release date. - Effect on workflow ------------------ @@ -389,14 +464,15 @@ The "version added" and "version changed" markers for any changes made on the ``3.3-compat`` branch would need to be flagged with both the language -version and the standard library version. For example: "3.3 (13.02)". +version and the standard library version. For example: "3.3 (33.1)". Any changes made directly on the ``default`` branch would just be flagged with "3.4" as usual. -The ``3.3-compat`` branch would be closed after the 3.3+13.08 release, as -the next release at that time will be a full language release and changes -(including standard library changes) should be marked accordingly. +The ``3.3-compat`` branch would be closed to normal development at the +same time as the ``3.3`` maintenance branch. The ``3.3-compat`` branch would +remain open for security fixes for the same period of time as the ``3.3`` +maintenance branch. Effect on bugfix cycle @@ -407,14 +483,14 @@ before the change reaches the ``default`` branch. If critical bugs are found in a maintenance release, then new maintenance and -standard library releases will be created to resolve the problem. The micro -release number will be incremented for both the language version and the -standard library version. +standard library releases will be created to resolve the problem. The final +part of the version number will be incremented for both the language version +and the standard library version. If critical bugs are found in a standard library release that do not affect the associated maintenance release, then only a new standard library release -will be created and only the standard library version's micro release number -will be incremented. +will be created and only the standard library's version number will be +incremented. Note that in these circumstances, the standard library release *may* include additional features, rather than just containing the bug fix. It is @@ -443,8 +519,8 @@ such opinions were justified or not). I believe isolating the increased pace of change to the standard library, -and clearly delineating it with a separate date-based version number will -greatly reassure the rest of the community that no, we're not suddenly +and clearly delineating it with a separate version number will greatly +reassure the rest of the community that no, we're not suddenly asking them to triple their own rate of development. Instead, we're merely going to ship standard library updates for the next language release in 6-monthly installments rather than delaying them all until the next language @@ -479,8 +555,9 @@ cycle, we would see: * What's New in Python 3.3? -* What's New in Python 3.3 (13.02)? -* What's New in Python 3.3 (13.08)? +* What's New in the Python Standard Library 33.1? +* What's New in the Python Standard Library 33.2? +* What's New in the Python Standard Library 33.3? And then finally, we would see the next language release: @@ -502,127 +579,222 @@ One suggestion from Barry Warsaw is to adopt a non-conflicting separate-files-per-change approach, similar to that used by Twisted [2_]. -For this PEP, one possible layout for such an approach (to be adopted -following the initial release of 3.3.0+12.8.0 that will use the current NEWS -process) might look like:: +Given that the current manually updated NEWS file will be used for the 3.3.0 +release, one possible layout for such an approach might look like:: Misc/ + NEWS # Now autogenerated from news_entries news_entries/ - 3.3.1/ # Maintenance branch changes + 3.3/ + NEWS # Original 3.3 NEWS file + maint.1/ # Maintenance branch changes + core/ + + builtins/ + + extensions/ + + library/ + + documentation/ + + tests/ + + compat.1/ # Compatibility branch changes + builtins/ + + extensions/ + + library/ + + documentation/ + + tests/ + + # Add maint.2, compat.2 etc as releases are made + 3.4/ + core/ + builtins/ - + extensions/ - + library/ - + documentation/ - + tests/ - - 3.4.0/ # default branch changes - language/ # Only exists for "x.y.0" - - builtins/ - - extensions/ - - library/ - - documentation/ - - tests/ - - 13.02.0/ # 3.3 compatibility branch changes - builtins/ - - extensions/ - - library/ - - documentation/ - - tests/ - - NEWS # Now autogenerated from news_entries + + # Add maint.1, compat.1 etc as releases are made Putting the version information in the directory heirarchy isn't strictly necessary (since the NEWS file generator could figure out from the version history), but does make it easier for *humans* to keep the different versions in order. -Other layouts are obviously also possible (for example, having separate "3.3" -and "3.4" directories to group entries for each language version and the -associated maintenance and standard library releases). +Other benefits of reduced version coupling +========================================== -Option: Slowing down the language release cycle -=============================================== +Slowing down the language release cycle +--------------------------------------- The current release cycle is a compromise between the desire for stability in the core language definition and C extension ABI, and the desire to get -new feature (most notably standard library updates) into users hands quickly. +new features (most notably standard library updates) into user's hands more +quickly. With the standard library release cycle decoupled (to some degree) from that of the core language definition, it provides an opportunity to actually *slow down* the rate of change in the language definition. The language moratorium for Python 3.2 effectively slowed that cycle down to *more than 3 years* (3.1: June 2009, 3.3: August 2012) without causing any major -complaints. +problems or complaints. The NEWS file management scheme described above is actually designed to allow us the flexibility to slow down language releases at the same time as standard library releases become more frequent. -As simple example, if a full two years was allowed between 3.3 and 3.4, -the 3.3 release cycle would be up looking like:: +As a simple example, if a full two years was allowed between 3.3 and 3.4, +the 3.3 release cycle would end up looking like:: - 3.2.4 # Maintenance release - 3.3.0 + 12.08.0 # Language release + 3.2.4 # Maintenance release + 3.3.0 # Language release - 3.3.1 + 12.08.1 # Maintenance release - 3.3.1 + 13.02.0 # Standard library release + 3.3.1 # Maintenance release + 3.3 (33.1) # Standard library release - 3.3.2 + 12.08.2 # Maintenance release - 3.3.2 + 13.08.1 # Standard library release + 3.3.2 # Maintenance release + 3.3 (33.2) # Standard library release - 3.3.3 + 12.08.3 # Maintenance release - 3.3.3 + 14.02.1 # Standard library release + 3.3.3 # Maintenance release + 3.3 (33.3) # Standard library release - 3.3.4 + 12.08.4 # Maintenance release - 3.4.0 + 14.08.0 # Language release + 3.3.4 # Maintenance release + 3.3 (33.4) # Standard library release + 3.4.0 # Language release -The elegance of the proposed NEWS entry layout is that this decision -wouldn't need to be made until after the 13.08 standard library release. At -that point, the ``3.3-compat`` branch could be kept open (thus adding -another standard library release to the cycle), or else it could be closed, -committing to the next release being a full language release. The choice -between another standard library release or a full language release would -then be available every 6 months after that. +The elegance of the proposed branch structure and NEWS entry layout is that +this decision wouldn't really need to be made until shortly before the planned +3.4 release date. At that point, the decision could be made to postpone the +3.4 release and keep the ``3.3`` and ``3.3-compat`` branches open after the +3.3.3 maintenance release and the 3.3 (33.3) standard library release, thus +adding another standard library release to the cycle. The choice between +another standard library release or a full language release would then be +available every 6 months after that. -Future: Further increasing the pace of standard library development -=================================================================== +Further increasing the pace of standard library development +----------------------------------------------------------- -A further benefit of the scheme proposed in this PEP is that it almost -*fully* decouples the language release cycle from the standard library -release cycle. The standard library could be updated every 3 months, or -even once a month, without having any flow on effects on the language -version numbering or the perceived stability of the core language. +As noted in the previous section, one benefit of the scheme proposed in this +PEP is that it largely decouples the language release cycle from the +standard library release cycle. The standard library could be updated every +3 months, or even once a month, without having any flow on effects on the +language version numbering or the perceived stability of the core language. While that pace of development isn't practical as long as the binary -installer creation for Windows and Mac OS X involves several manual steps and -for as long as we don't have separate "-release" trees that only -receive versions that have been marked as good by the stable buildbots, -it's a useful criterion to keep in mind: what if we want to make standard -library releases even *faster* than every 6 months? +installer creation for Windows and Mac OS X involves several manual steps +(including manual testing) and for as long as we don't have separate +"-release" trees that only receive versions that have been marked as +good by the stable buildbots, it's still a useful criterion to keep in mind +when considering proposed new versioning schemes: what if we eventually want +to make standard library releases even *faster* than every 6 months? -If the practical issues were ever resolved, then the separate date-based -versioning scheme in this PEP could handle it. The approach proposed in -PEP 407 could not. +If the practical issues were ever resolved, then the separate standard +library versioning scheme in this PEP could handle it. The tagged version +number approach proposed in PEP 407 could not (at least, not without a lot +of user confusion and uncertainty). + + +Other Questions +=============== + +Why not use the major version number? +------------------------------------- + +The simplest and most logical solution would actually be to map the +major.minor.micro version numbers to the language version, stdlib version +and maintenance release version respectively. + +Instead of releasing Python 3.3.0, we would instead release Python 4.0.0 +and the release cycle would look like:: + + 4.0.0 # Language release + + 4.0.1 # Maintenance release + 4.1.0 # Standard library release + + 4.0.2 # Maintenance release + 4.2.0 # Standard library release + + 4.0.3 # Maintenance release + 4.3.0 # Standard library release + 5.0.0 # Language release + +However, the ongoing pain of the Python 2 -> Python 3 transition (and +associated workarounds like the ``python3`` and ``python2`` symlinks to +refer directly to the desired release series) means that this simple option +isn't viable for historical reasons. + +One way that this simple approach *could* be made to work is to merge the +current major and minor version numbers directly into a 2-digit major +version number:: + + 33.0.0 # Language release + + 33.0.1 # Maintenance release + 33.1.0 # Standard library release + + 33.0.2 # Maintenance release + 33.2.0 # Standard library release + + 33.0.3 # Maintenance release + 33.3.0 # Standard library release + 34.0.0 # Language release + + +Why not use a four part version number? +--------------------------------------- + +Another simple versioning scheme would just add a "standard library" version +into the existing versioning scheme:: + + 3.3.0.0 # Language release + + 3.3.0.1 # Maintenance release + 3.3.1.0 # Standard library release + + 3.3.0.2 # Maintenance release + 3.3.2.0 # Standard library release + + 3.3.0.3 # Maintenance release + 3.3.3.0 # Standard library release + 3.4.0.0 # Language release + +However, this scheme isn't viable due to backwards compatibility constraints +on the ``sys.version_info`` structure. + + +Why not use a date-based versioning scheme? +------------------------------------------- + +Earlier versions of this PEP proposed a date-based versioning scheme for +the standard library. However, such a scheme made it very difficult to +handle out-of-cycle releases to fix security issues and other critical +bugs in standard library releases, as it required the following steps: + +1. Change the release version number to the date of the current month. +2. Update the What's New, NEWS and documentation to refer to the new release + number. +3. Make the new release. + +With the sequential scheme now proposed, such releases should at most require +a little tidying up of the What's New document before making the release. Why isn't PEP 384 enough? -========================= +------------------------- PEP 384 introduced the notion of a "Stable ABI" for CPython, a limited subset of the full C ABI that is guaranteed to remain stable. Extensions @@ -634,25 +806,85 @@ migrating to the stable ABI can involve quite a lot of work (especially for extension modules that define a lot of classes). With limited development resources available, any time spent on such a change is time that could -otherwise have been spent working on features that are offer more direct -benefits to end users. +otherwise have been spent working on features that offer more direct benefits +to end users. + +There are also other benefits to separate versioning (as described above) +that are not directly related to the question of binary compatibility with +third party C extensions. + + +Why no binary compatible additions to the C ABI in standard library releases? +----------------------------------------------------------------------------- + +There's a case to be made that *additions* to the CPython C ABI could +reasonably be permitted in standard library releases. This would give C +extension authors the same freedom as any other package or module author +to depend either on a particular language version or on a standard library +version. + +The PEP currently associates the interpreter version with the language +version, and therefore limits major interpreter changes (including C ABI +additions) to the language releases. + +An alternative, internally consistent, approach would be to link the +interpreter version with the standard library version, with only changes that +may affect backwards compatibility limited to language releases. + +Under such a scheme, the following changes would be acceptable in standard +library releases: + +* Standard library updates + + * new features in pure Python modules + * new features in C extension modules (subject to PEP 399 compatibility + requirements) + * new features in language builtins + +* Interpreter implementation updates + + * binary compatible additions to the C ABI + * changes to the compilation toolchain that do not affect the AST or alter + the bytecode magic number + * changes to the core interpreter eval loop + +* bug fixes from the corresponding maintenance release + +And the following changes would be acceptable in language releases: + +* new language syntax +* any updates acceptable in a standard library release +* new deprecation warnings +* removal of previously deprecated features +* changes to the AST +* changes to the emitted bytecode that require altering the magic number +* binary incompatible changes to the C ABI (although the PEP 384 stable ABI + must still be preserved) + +While such an approach could probably be made to work, there does not appear +to be a compelling justification for it, and the approach currently described +in the PEP is simpler and easier to explain. Why not separate out the standard library entirely? -=================================================== +--------------------------------------------------- -Because it's a lot of work for next to no pay-off. CPython without the -standard library is useless (the build chain won't even run, let alone the -test suite). You can't create a standalone pure Python standard library, -because too many "modules" are actually tightly linked in to the internal -details of their respective interpreters (e.g. ``weakref``, ``gc``, ``sys``, -``inspect``, ``ast``). +A concept that is occasionally discussed is the idea of making the standard +library truly independent from the CPython reference implementation. -Creating a separate development branch that is kept compatible with the -previous feature release, and making releases from that branch that are -flagged with a separate date-based version number should provide most of -the benefits of a separate standard library repository with only a fraction -of the pain. +My personal opinion is that actually making such a change would involve a +lot of work for next to no pay-off. CPython without the standard library is +useless (the build chain won't even run, let alone the test suite). You also +can't create a standalone pure Python standard library either, because too +many "standard library modules" are actually tightly linked in to the +internal details of their respective interpreters (for example, the builtins, +``weakref``, ``gc``, ``sys``, ``inspect``, ``ast``). + +Creating a separate CPython development branch that is kept compatible with +the previous language release, and making releases from that branch that are +identified with a separate standard library version number should provide +most of the benefits of a separate standard library repository with only a +fraction of the pain. Acknowledgements diff --git a/pep-0415.txt b/pep-0415.txt new file mode 100644 --- /dev/null +++ b/pep-0415.txt @@ -0,0 +1,85 @@ +PEP: 415 +Title: Implementing PEP 409 differently +Version: $Revision$ +Last-Modified: $Date$ +Author: Benjamin Peterson +Status: Draft +Type: Standards Track +Content-Type: text/x-rst +Created: 26-Feb-2012 +Post-History: 26-Feb-2012 + + +Abstract +======== + +PEP 409 allows PEP 3134 exception contexts and causes to be suppressed when the +exception is printed. This is done using the ``raise exc from None`` +syntax. This PEP proposes to implement context and cause suppression +differently. + +Rationale +========= + +PEP 409 changes ``__cause__`` to be ``Ellipsis`` by default. Then if +``__cause__`` is set to ``None`` by ``raise exc from None``, no context or cause +will be printed should the exception be uncaught. + +The main problem with this scheme is it complicates the role of +``__cause__``. ``__cause__`` should indicate the cause of the exception not +whether ``__context__`` should be printed or not. This use of ``__cause__`` is +also not easily extended in the future. For example, we may someday want to +allow the programmer to select which of ``__context__`` and ``__cause__`` will +be printed. The PEP 409 implementation is not amenable to this. + +The use of ``Ellipsis`` is a hack. Before PEP 409, ``Ellipsis`` was used +exclusively in extended slicing. Extended slicing has nothing to do with +exceptions, so it's not clear to someone inspecting an exception object why +``__cause__`` should be set to ``Ellipsis``. Using ``Ellipsis`` by default for +``__cause__`` makes it asymmetrical with ``__context__``. + +Proposal +======== + +A new attribute on ``BaseException``, ``__suppress_context__``, will +be introduced. The ``raise exc from cause`` syntax will set +``exc.__suppress_context__`` to ``True``. Exception printing code will +check for that attribute to determine whether context and cause will +be printed. ``__cause__`` will return to its original purpose and +values. + +There is precedence for ``__suppress_context__`` with the +``print_line_and_file`` exception attribute. + +To summarize, ``raise exc from cause`` will be equivalent to:: + + exc.__cause__ = cause + exc.__suppress_context__ = True + raise exc + +Patches +======= + +There is a patch on `Issue 14133`_. + + +References +========== + +.. _issue 14133: + http://bugs.python.org/issue6210 + +Copyright +========= + +This document has been placed in the public domain. + + +.. + Local Variables: + mode: indented-text + indent-tabs-mode: nil + sentence-end-double-space: t + fill-column: 70 + coding: utf-8 + End: -- Repository URL: http://hg.python.org/peps From python-checkins at python.org Tue Feb 28 09:31:54 2012 From: python-checkins at python.org (martin.v.loewis) Date: Tue, 28 Feb 2012 09:31:54 +0100 Subject: [Python-checkins] =?utf8?b?Y3B5dGhvbiAobWVyZ2UgMi42IC0+IDIuNyk6?= =?utf8?q?_null-merge_v2=2E6=2E8rc1_tag?= Message-ID: http://hg.python.org/cpython/rev/434cd2fedf81 changeset: 75329:434cd2fedf81 branch: 2.7 parent: 75301:5c52e7c6d868 parent: 75208:47e10d72358b user: Martin v. L?wis date: Tue Feb 28 09:31:41 2012 +0100 summary: null-merge v2.6.8rc1 tag files: -- Repository URL: http://hg.python.org/cpython From solipsis at pitrou.net Tue Feb 28 13:47:46 2012 From: solipsis at pitrou.net (solipsis at pitrou.net) Date: Tue, 28 Feb 2012 13:47:46 +0100 Subject: [Python-checkins] Daily reference leaks (aceedef02c63): sum=0 Message-ID: results for aceedef02c63 on branch "default" -------------------------------------------- Command line was: ['./python', '-m', 'test.regrtest', '-uall', '-R', '3:3:/home/antoine/cpython/refleaks/reflogdeACki', '-x'] From solipsis at pitrou.net Tue Feb 28 13:47:46 2012 From: solipsis at pitrou.net (solipsis at pitrou.net) Date: Tue, 28 Feb 2012 13:47:46 +0100 Subject: [Python-checkins] Daily reference leaks (b83ae75beaca): sum=0 Message-ID: results for b83ae75beaca on branch "default" -------------------------------------------- Command line was: ['./python', '-m', 'test.regrtest', '-uall', '-R', '3:3:/home/antoine/cpython/refleaks/reflogYEizwF', '-x'] From solipsis at pitrou.net Tue Feb 28 13:47:46 2012 From: solipsis at pitrou.net (solipsis at pitrou.net) Date: Tue, 28 Feb 2012 13:47:46 +0100 Subject: [Python-checkins] Daily reference leaks (f417aff64dcc): sum=0 Message-ID: results for f417aff64dcc on branch "default" -------------------------------------------- Command line was: ['./python', '-m', 'test.regrtest', '-uall', '-R', '3:3:/home/antoine/cpython/refleaks/reflogaIAJoI', '-x'] From python-checkins at python.org Tue Feb 28 16:03:42 2012 From: python-checkins at python.org (brett.cannon) Date: Tue, 28 Feb 2012 16:03:42 +0100 Subject: [Python-checkins] =?utf8?q?peps=3A_Update_from_Ethan_Furman=2E?= Message-ID: http://hg.python.org/peps/rev/eba3f84a5260 changeset: 4094:eba3f84a5260 user: Brett Cannon date: Tue Feb 28 10:02:09 2012 -0500 summary: Update from Ethan Furman. files: pep-0409.txt | 11 ++++++++--- 1 files changed, 8 insertions(+), 3 deletions(-) diff --git a/pep-0409.txt b/pep-0409.txt --- a/pep-0409.txt +++ b/pep-0409.txt @@ -153,12 +153,17 @@ In both of the latter cases the exception chain will stop being followed. -Because the default value for ``__cause__`` is now ``Ellipsis``:: +Because the default value for ``__cause__`` is now ``Ellipsis`` and ``raise +Exception from Cause`` is simply syntactic sugar for:: + + _exc = NewException() + _exc.__cause__ = Cause() + raise _exc + +``Ellipsis``, as well as ``None``, is now allowed as a cause:: raise Exception from Ellipsis -is allowed and will (re)set ``__cause__`` to ``Ellipsis``. - Patches ======= -- Repository URL: http://hg.python.org/peps From python-checkins at python.org Tue Feb 28 20:03:06 2012 From: python-checkins at python.org (vinay.sajip) Date: Tue, 28 Feb 2012 20:03:06 +0100 Subject: [Python-checkins] =?utf8?q?cpython=3A_Added_additional_diagnostic?= =?utf8?q?s_to_help_with_=2312151=2E?= Message-ID: http://hg.python.org/cpython/rev/ce0b9b1328d4 changeset: 75330:ce0b9b1328d4 parent: 75328:3328e388cb28 user: Vinay Sajip date: Tue Feb 28 19:02:43 2012 +0000 summary: Added additional diagnostics to help with #12151. files: Lib/test/test_logging.py | 4 ++++ 1 files changed, 4 insertions(+), 0 deletions(-) diff --git a/Lib/test/test_logging.py b/Lib/test/test_logging.py --- a/Lib/test/test_logging.py +++ b/Lib/test/test_logging.py @@ -3680,6 +3680,10 @@ 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) + with open(f, 'r') as tf: + print(tf.read()) self.assertTrue(found, msg=msg) def test_invalid(self): -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Feb 28 21:40:44 2012 From: python-checkins at python.org (martin.v.loewis) Date: Tue, 28 Feb 2012 21:40:44 +0100 Subject: [Python-checkins] =?utf8?q?peps=3A_Update_from_Mark_Shannon=2E?= Message-ID: http://hg.python.org/peps/rev/f10e37d9ba49 changeset: 4095:f10e37d9ba49 user: Martin v. L?wis date: Tue Feb 28 21:40:37 2012 +0100 summary: Update from Mark Shannon. files: pep-0412.txt | 19 +++++++++++++++++++ 1 files changed, 19 insertions(+), 0 deletions(-) diff --git a/pep-0412.txt b/pep-0412.txt --- a/pep-0412.txt +++ b/pep-0412.txt @@ -149,6 +149,25 @@ The iteration order of dictionaries was never defined and has always been arbitrary; it is different for Jython and PyPy. +Alternative Implementation +-------------------------- + +An alternative implementation for split tables, which could save even more +memory, is to store an index in the value field of the keys table (instead +of ignoring the value field). This index would explicitly state where in the +value array to look. The value array would then only require 1 field for each +usable slot in the key table, rather than each slot in the key table. + +This "indexed" version would reduce the size of value array by about +one third. The keys table would need an extra "values_size" field, increasing +the size of combined dicts by one word. +The extra indirection adds more complexity to the code, potentially reducing +performance a little. + +The "indexed" version will not be included in this implementation, +but should be considered deferred rather than rejected, +pending further experimentation. + References ========== -- Repository URL: http://hg.python.org/peps From python-checkins at python.org Tue Feb 28 22:35:32 2012 From: python-checkins at python.org (sandro.tosi) Date: Tue, 28 Feb 2012 22:35:32 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=283=2E2=29=3A_s/div/truediv/?= =?utf8?q?=3B_thanks_to_F=C3=A9lix-Antoine_Fortin_from_docs=40?= Message-ID: http://hg.python.org/cpython/rev/8de95f3b2404 changeset: 75331:8de95f3b2404 branch: 3.2 parent: 75327:514d602c3db5 user: Sandro Tosi date: Tue Feb 28 22:28:28 2012 +0100 summary: s/div/truediv/; thanks to F?lix-Antoine Fortin from docs@ files: Doc/library/operator.rst | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Doc/library/operator.rst b/Doc/library/operator.rst --- a/Doc/library/operator.rst +++ b/Doc/library/operator.rst @@ -340,7 +340,7 @@ +-----------------------+-------------------------+---------------------------------------+ | Containment Test | ``obj in seq`` | ``contains(seq, obj)`` | +-----------------------+-------------------------+---------------------------------------+ -| Division | ``a / b`` | ``div(a, b)`` | +| Division | ``a / b`` | ``truediv(a, b)`` | +-----------------------+-------------------------+---------------------------------------+ | Division | ``a // b`` | ``floordiv(a, b)`` | +-----------------------+-------------------------+---------------------------------------+ -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Feb 28 22:35:44 2012 From: python-checkins at python.org (sandro.tosi) Date: Tue, 28 Feb 2012 22:35:44 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_3=2E2_-=3E_default=29?= =?utf8?q?=3A_merge_with_3=2E2?= Message-ID: http://hg.python.org/cpython/rev/d4b17c478e49 changeset: 75332:d4b17c478e49 parent: 75330:ce0b9b1328d4 parent: 75331:8de95f3b2404 user: Sandro Tosi date: Tue Feb 28 22:29:08 2012 +0100 summary: merge with 3.2 files: Doc/library/operator.rst | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/Doc/library/operator.rst b/Doc/library/operator.rst --- a/Doc/library/operator.rst +++ b/Doc/library/operator.rst @@ -340,7 +340,7 @@ +-----------------------+-------------------------+---------------------------------------+ | Containment Test | ``obj in seq`` | ``contains(seq, obj)`` | +-----------------------+-------------------------+---------------------------------------+ -| Division | ``a / b`` | ``div(a, b)`` | +| Division | ``a / b`` | ``truediv(a, b)`` | +-----------------------+-------------------------+---------------------------------------+ | Division | ``a // b`` | ``floordiv(a, b)`` | +-----------------------+-------------------------+---------------------------------------+ -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Feb 28 23:26:09 2012 From: python-checkins at python.org (nadeem.vawda) Date: Tue, 28 Feb 2012 23:26:09 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=282=2E7=29=3A_Give_better_fai?= =?utf8?q?lure_messages_in_test=5Fstrptime_=28cf=2E_issue_=2314113=29=2E?= Message-ID: http://hg.python.org/cpython/rev/3ea8d0afe541 changeset: 75333:3ea8d0afe541 branch: 2.7 parent: 75329:434cd2fedf81 user: Nadeem Vawda date: Wed Feb 29 00:21:40 2012 +0200 summary: Give better failure messages in test_strptime (cf. issue #14113). files: Lib/test/test_strptime.py | 31 ++++++++++++-------------- 1 files changed, 14 insertions(+), 17 deletions(-) diff --git a/Lib/test/test_strptime.py b/Lib/test/test_strptime.py --- a/Lib/test/test_strptime.py +++ b/Lib/test/test_strptime.py @@ -38,9 +38,9 @@ comparison = testing[self.time_tuple[tuple_position]] self.assertIn(strftime_output, testing, "%s: not found in tuple" % error_msg) - self.assertTrue(comparison == strftime_output, - "%s: position within tuple incorrect; %s != %s" % - (error_msg, comparison, strftime_output)) + self.assertEqual(comparison, strftime_output, + "%s: position within tuple incorrect; %s != %s" % + (error_msg, comparison, strftime_output)) def test_weekday(self): # Make sure that full and abbreviated weekday names are correct in @@ -65,8 +65,8 @@ "AM/PM representation not in tuple") if self.time_tuple[3] < 12: position = 0 else: position = 1 - self.assertTrue(strftime_output == self.LT_ins.am_pm[position], - "AM/PM representation in the wrong position within the tuple") + self.assertEqual(self.LT_ins.am_pm[position], strftime_output, + "AM/PM representation in the wrong position within the tuple") def test_timezone(self): # Make sure timezone is correct @@ -86,17 +86,14 @@ # output. magic_date = (1999, 3, 17, 22, 44, 55, 2, 76, 0) strftime_output = time.strftime("%c", magic_date) - self.assertTrue(strftime_output == time.strftime(self.LT_ins.LC_date_time, - magic_date), - "LC_date_time incorrect") + self.assertEqual(time.strftime(self.LT_ins.LC_date_time, magic_date), + strftime_output, "LC_date_time incorrect") strftime_output = time.strftime("%x", magic_date) - self.assertTrue(strftime_output == time.strftime(self.LT_ins.LC_date, - magic_date), - "LC_date incorrect") + self.assertEqual(time.strftime(self.LT_ins.LC_date, magic_date), + strftime_output, "LC_date incorrect") strftime_output = time.strftime("%X", magic_date) - self.assertTrue(strftime_output == time.strftime(self.LT_ins.LC_time, - magic_date), - "LC_time incorrect") + self.assertEqual(time.strftime(self.LT_ins.LC_time, magic_date), + strftime_output, "LC_time incorrect") LT = _strptime.LocaleTime() LT.am_pm = ('', '') self.assertTrue(LT.LC_time, "LocaleTime's LC directives cannot handle " @@ -168,8 +165,8 @@ # Fixes bug #661354 test_locale = _strptime.LocaleTime() test_locale.timezone = (frozenset(), frozenset()) - self.assertTrue(_strptime.TimeRE(test_locale).pattern("%Z") == '', - "with timezone == ('',''), TimeRE().pattern('%Z') != ''") + self.assertEqual(_strptime.TimeRE(test_locale).pattern("%Z"), '', + "with timezone == ('',''), TimeRE().pattern('%Z') != ''") def test_matching_with_escapes(self): # Make sure a format that requires escaping of characters works @@ -195,7 +192,7 @@ # so as to not allow to subpatterns to end up next to each other and # "steal" characters from each other. pattern = self.time_re.pattern('%j %H') - self.assertTrue(not re.match(pattern, "180")) + self.assertFalse(re.match(pattern, "180")) self.assertTrue(re.match(pattern, "18 0")) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Feb 28 23:26:10 2012 From: python-checkins at python.org (nadeem.vawda) Date: Tue, 28 Feb 2012 23:26:10 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=283=2E2=29=3A_Give_better_fai?= =?utf8?q?lure_messages_in_test=5Fstrptime_=28cf=2E_issue_=2314113=29=2E?= Message-ID: http://hg.python.org/cpython/rev/8d2ffe1f25d3 changeset: 75334:8d2ffe1f25d3 branch: 3.2 parent: 75331:8de95f3b2404 user: Nadeem Vawda date: Wed Feb 29 00:22:09 2012 +0200 summary: Give better failure messages in test_strptime (cf. issue #14113). files: Lib/test/test_strptime.py | 31 ++++++++++++-------------- 1 files changed, 14 insertions(+), 17 deletions(-) diff --git a/Lib/test/test_strptime.py b/Lib/test/test_strptime.py --- a/Lib/test/test_strptime.py +++ b/Lib/test/test_strptime.py @@ -38,9 +38,9 @@ comparison = testing[self.time_tuple[tuple_position]] self.assertIn(strftime_output, testing, "%s: not found in tuple" % error_msg) - self.assertTrue(comparison == strftime_output, - "%s: position within tuple incorrect; %s != %s" % - (error_msg, comparison, strftime_output)) + self.assertEqual(comparison, strftime_output, + "%s: position within tuple incorrect; %s != %s" % + (error_msg, comparison, strftime_output)) def test_weekday(self): # Make sure that full and abbreviated weekday names are correct in @@ -65,8 +65,8 @@ "AM/PM representation not in tuple") if self.time_tuple[3] < 12: position = 0 else: position = 1 - self.assertTrue(strftime_output == self.LT_ins.am_pm[position], - "AM/PM representation in the wrong position within the tuple") + self.assertEqual(self.LT_ins.am_pm[position], strftime_output, + "AM/PM representation in the wrong position within the tuple") def test_timezone(self): # Make sure timezone is correct @@ -86,17 +86,14 @@ # output. magic_date = (1999, 3, 17, 22, 44, 55, 2, 76, 0) strftime_output = time.strftime("%c", magic_date) - self.assertTrue(strftime_output == time.strftime(self.LT_ins.LC_date_time, - magic_date), - "LC_date_time incorrect") + self.assertEqual(time.strftime(self.LT_ins.LC_date_time, magic_date), + strftime_output, "LC_date_time incorrect") strftime_output = time.strftime("%x", magic_date) - self.assertTrue(strftime_output == time.strftime(self.LT_ins.LC_date, - magic_date), - "LC_date incorrect") + self.assertEqual(time.strftime(self.LT_ins.LC_date, magic_date), + strftime_output, "LC_date incorrect") strftime_output = time.strftime("%X", magic_date) - self.assertTrue(strftime_output == time.strftime(self.LT_ins.LC_time, - magic_date), - "LC_time incorrect") + self.assertEqual(time.strftime(self.LT_ins.LC_time, magic_date), + strftime_output, "LC_time incorrect") LT = _strptime.LocaleTime() LT.am_pm = ('', '') self.assertTrue(LT.LC_time, "LocaleTime's LC directives cannot handle " @@ -168,8 +165,8 @@ # Fixes bug #661354 test_locale = _strptime.LocaleTime() test_locale.timezone = (frozenset(), frozenset()) - self.assertTrue(_strptime.TimeRE(test_locale).pattern("%Z") == '', - "with timezone == ('',''), TimeRE().pattern('%Z') != ''") + self.assertEqual(_strptime.TimeRE(test_locale).pattern("%Z"), '', + "with timezone == ('',''), TimeRE().pattern('%Z') != ''") def test_matching_with_escapes(self): # Make sure a format that requires escaping of characters works @@ -195,7 +192,7 @@ # so as to not allow to subpatterns to end up next to each other and # "steal" characters from each other. pattern = self.time_re.pattern('%j %H') - self.assertTrue(not re.match(pattern, "180")) + self.assertFalse(re.match(pattern, "180")) self.assertTrue(re.match(pattern, "18 0")) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Tue Feb 28 23:26:11 2012 From: python-checkins at python.org (nadeem.vawda) Date: Tue, 28 Feb 2012 23:26:11 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_3=2E2_-=3E_default=29?= =?utf8?q?=3A_Merge=3A_Give_better_failure_messages_in_test=5Fstrptime_=28?= =?utf8?b?Y2YuIGlzc3VlICMxNDExMyku?= Message-ID: http://hg.python.org/cpython/rev/46ab2d46337c changeset: 75335:46ab2d46337c parent: 75332:d4b17c478e49 parent: 75334:8d2ffe1f25d3 user: Nadeem Vawda date: Wed Feb 29 00:24:46 2012 +0200 summary: Merge: Give better failure messages in test_strptime (cf. issue #14113). files: Lib/test/test_strptime.py | 16 ++++++++-------- 1 files changed, 8 insertions(+), 8 deletions(-) diff --git a/Lib/test/test_strptime.py b/Lib/test/test_strptime.py --- a/Lib/test/test_strptime.py +++ b/Lib/test/test_strptime.py @@ -38,9 +38,9 @@ comparison = testing[self.time_tuple[tuple_position]] self.assertIn(strftime_output, testing, "%s: not found in tuple" % error_msg) - self.assertTrue(comparison == strftime_output, - "%s: position within tuple incorrect; %s != %s" % - (error_msg, comparison, strftime_output)) + self.assertEqual(comparison, strftime_output, + "%s: position within tuple incorrect; %s != %s" % + (error_msg, comparison, strftime_output)) def test_weekday(self): # Make sure that full and abbreviated weekday names are correct in @@ -65,8 +65,8 @@ "AM/PM representation not in tuple") if self.time_tuple[3] < 12: position = 0 else: position = 1 - self.assertTrue(strftime_output == self.LT_ins.am_pm[position], - "AM/PM representation in the wrong position within the tuple") + self.assertEqual(self.LT_ins.am_pm[position], strftime_output, + "AM/PM representation in the wrong position within the tuple") def test_timezone(self): # Make sure timezone is correct @@ -165,8 +165,8 @@ # Fixes bug #661354 test_locale = _strptime.LocaleTime() test_locale.timezone = (frozenset(), frozenset()) - self.assertTrue(_strptime.TimeRE(test_locale).pattern("%Z") == '', - "with timezone == ('',''), TimeRE().pattern('%Z') != ''") + self.assertEqual(_strptime.TimeRE(test_locale).pattern("%Z"), '', + "with timezone == ('',''), TimeRE().pattern('%Z') != ''") def test_matching_with_escapes(self): # Make sure a format that requires escaping of characters works @@ -192,7 +192,7 @@ # so as to not allow to subpatterns to end up next to each other and # "steal" characters from each other. pattern = self.time_re.pattern('%j %H') - self.assertTrue(not re.match(pattern, "180")) + self.assertFalse(re.match(pattern, "180")) self.assertTrue(re.match(pattern, "18 0")) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Feb 29 00:52:46 2012 From: python-checkins at python.org (larry.hastings) Date: Wed, 29 Feb 2012 00:52:46 +0100 Subject: [Python-checkins] =?utf8?b?Y3B5dGhvbiAoMi43KTogSXNzdWUgIzEzMDg2?= =?utf8?q?=3A_Update_howto/cporting=2Erst_to_discuss_=22Python_3=22_instea?= =?utf8?b?ZCBvZiAiMy4wIi4=?= Message-ID: http://hg.python.org/cpython/rev/eb88cc90cc56 changeset: 75336:eb88cc90cc56 branch: 2.7 parent: 75333:3ea8d0afe541 user: Larry Hastings date: Tue Feb 28 15:17:23 2012 -0800 summary: Issue #13086: Update howto/cporting.rst to discuss "Python 3" instead of "3.0". files: Doc/howto/cporting.rst | 73 ++++++++++++++++------------- 1 files changed, 40 insertions(+), 33 deletions(-) diff --git a/Doc/howto/cporting.rst b/Doc/howto/cporting.rst --- a/Doc/howto/cporting.rst +++ b/Doc/howto/cporting.rst @@ -2,27 +2,28 @@ .. _cporting-howto: -******************************** -Porting Extension Modules to 3.0 -******************************** +************************************* +Porting Extension Modules to Python 3 +************************************* :author: Benjamin Peterson .. topic:: Abstract - Although changing the C-API was not one of Python 3.0's objectives, the many - Python level changes made leaving 2.x's API intact impossible. In fact, some - changes such as :func:`int` and :func:`long` unification are more obvious on - the C level. This document endeavors to document incompatibilities and how - they can be worked around. + Although changing the C-API was not one of Python 3's objectives, + the many Python-level changes made leaving Python 2's API intact + impossible. In fact, some changes such as :func:`int` and + :func:`long` unification are more obvious on the C level. This + document endeavors to document incompatibilities and how they can + be worked around. Conditional compilation ======================= -The easiest way to compile only some code for 3.0 is to check if -:c:macro:`PY_MAJOR_VERSION` is greater than or equal to 3. :: +The easiest way to compile only some code for Python 3 is to check +if :c:macro:`PY_MAJOR_VERSION` is greater than or equal to 3. :: #if PY_MAJOR_VERSION >= 3 #define IS_PY3K @@ -35,7 +36,7 @@ Changes to Object APIs ====================== -Python 3.0 merged together some types with similar functions while cleanly +Python 3 merged together some types with similar functions while cleanly separating others. @@ -43,14 +44,14 @@ ----------------------- -Python 3.0's :func:`str` (``PyString_*`` functions in C) type is equivalent to -2.x's :func:`unicode` (``PyUnicode_*``). The old 8-bit string type has become -:func:`bytes`. Python 2.6 and later provide a compatibility header, +Python 3's :func:`str` (``PyString_*`` functions in C) type is equivalent to +Python 2's :func:`unicode` (``PyUnicode_*``). The old 8-bit string type has +become :func:`bytes`. Python 2.6 and later provide a compatibility header, :file:`bytesobject.h`, mapping ``PyBytes`` names to ``PyString`` ones. For best -compatibility with 3.0, :c:type:`PyUnicode` should be used for textual data and +compatibility with Python 3, :c:type:`PyUnicode` should be used for textual data and :c:type:`PyBytes` for binary data. It's also important to remember that -:c:type:`PyBytes` and :c:type:`PyUnicode` in 3.0 are not interchangeable like -:c:type:`PyString` and :c:type:`PyUnicode` are in 2.x. The following example +:c:type:`PyBytes` and :c:type:`PyUnicode` in Python 3 are not interchangeable like +:c:type:`PyString` and :c:type:`PyUnicode` are in Python 2. The following example shows best practices with regards to :c:type:`PyUnicode`, :c:type:`PyString`, and :c:type:`PyBytes`. :: @@ -94,10 +95,12 @@ long/int Unification -------------------- -In Python 3.0, there is only one integer type. It is called :func:`int` on the -Python level, but actually corresponds to 2.x's :func:`long` type. In the -C-API, ``PyInt_*`` functions are replaced by their ``PyLong_*`` neighbors. The -best course of action here is using the ``PyInt_*`` functions aliased to +Python 3 has only one integer type, :func:`int`. But it actually +corresponds to Python 2's :func:`long` type--the :func:`int` type +used in Python 2 was removed. In the C-API, ``PyInt_*`` functions +are replaced by their ``PyLong_*`` equivalents. + +The best course of action here is using the ``PyInt_*`` functions aliased to ``PyLong_*`` found in :file:`intobject.h`. The abstract ``PyNumber_*`` APIs can also be used in some cases. :: @@ -120,10 +123,11 @@ Module initialization and state =============================== -Python 3.0 has a revamped extension module initialization system. (See -:pep:`3121`.) Instead of storing module state in globals, they should be stored -in an interpreter specific structure. Creating modules that act correctly in -both 2.x and 3.0 is tricky. The following simple example demonstrates how. :: +Python 3 has a revamped extension module initialization system. (See +:pep:`3121`.) Instead of storing module state in globals, they should +be stored in an interpreter specific structure. Creating modules that +act correctly in both Python 2 and Python 3 is tricky. The following +simple example demonstrates how. :: #include "Python.h" @@ -223,15 +227,18 @@ you'll need to switch to Capsules. :c:type:`CObject` was deprecated in 3.1 and 2.7 and completely removed in Python 3.2. If you only support 2.7, or 3.1 and above, you -can simply switch to :c:type:`Capsule`. If you need to support 3.0 or -versions of Python earlier than 2.7 you'll have to support both CObjects -and Capsules. +can simply switch to :c:type:`Capsule`. If you need to support Python 3.0, +or versions of Python earlier than 2.7, +you'll have to support both CObjects and Capsules. +(Note that Python 3.0 is no longer supported, and it is not recommended +for production use.) The following example header file :file:`capsulethunk.h` may -solve the problem for you; -simply write your code against the :c:type:`Capsule` API, include -this header file after ``"Python.h"``, and you'll automatically use CObjects -in Python 3.0 or versions earlier than 2.7. +solve the problem for you. Simply write your code against the +:c:type:`Capsule` API and include this header file after +:file:`Python.h`. Your code will automatically use Capsules +in versions of Python with Capsules, and switch to CObjects +when Capsules are unavailable. :file:`capsulethunk.h` simulates Capsules using CObjects. However, :c:type:`CObject` provides no place to store the capsule's "name". As a @@ -266,5 +273,5 @@ If you are writing a new extension module, you might consider `Cython `_. It translates a Python-like language to C. The -extension modules it creates are compatible with Python 3.x and 2.x. +extension modules it creates are compatible with Python 3 and Python 2. -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Feb 29 01:24:08 2012 From: python-checkins at python.org (larry.hastings) Date: Wed, 29 Feb 2012 01:24:08 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=283=2E2=29=3A_Propagate_chang?= =?utf8?q?es_for_issues_=2313053_and_=2313086_from_2=2E7_to_3=2E2=2E__=28D?= =?utf8?b?b2Mgb25seS4p?= Message-ID: http://hg.python.org/cpython/rev/28849d00a41e changeset: 75337:28849d00a41e branch: 3.2 parent: 75334:8d2ffe1f25d3 user: Larry Hastings date: Tue Feb 28 16:21:47 2012 -0800 summary: Propagate changes for issues #13053 and #13086 from 2.7 to 3.2. (Doc only.) files: Doc/howto/cporting.rst | 111 +++++++++++++++---- Doc/includes/capsulethunk.h | 134 ++++++++++++++++++++++++ 2 files changed, 219 insertions(+), 26 deletions(-) diff --git a/Doc/howto/cporting.rst b/Doc/howto/cporting.rst --- a/Doc/howto/cporting.rst +++ b/Doc/howto/cporting.rst @@ -2,27 +2,28 @@ .. _cporting-howto: -******************************** -Porting Extension Modules to 3.0 -******************************** +************************************* +Porting Extension Modules to Python 3 +************************************* :author: Benjamin Peterson .. topic:: Abstract - Although changing the C-API was not one of Python 3.0's objectives, the many - Python level changes made leaving 2.x's API intact impossible. In fact, some - changes such as :func:`int` and :func:`long` unification are more obvious on - the C level. This document endeavors to document incompatibilities and how - they can be worked around. + Although changing the C-API was not one of Python 3's objectives, + the many Python-level changes made leaving Python 2's API intact + impossible. In fact, some changes such as :func:`int` and + :func:`long` unification are more obvious on the C level. This + document endeavors to document incompatibilities and how they can + be worked around. Conditional compilation ======================= -The easiest way to compile only some code for 3.0 is to check if -:c:macro:`PY_MAJOR_VERSION` is greater than or equal to 3. :: +The easiest way to compile only some code for Python 3 is to check +if :c:macro:`PY_MAJOR_VERSION` is greater than or equal to 3. :: #if PY_MAJOR_VERSION >= 3 #define IS_PY3K @@ -35,7 +36,7 @@ Changes to Object APIs ====================== -Python 3.0 merged together some types with similar functions while cleanly +Python 3 merged together some types with similar functions while cleanly separating others. @@ -43,14 +44,14 @@ ----------------------- -Python 3.0's :func:`str` (``PyString_*`` functions in C) type is equivalent to -2.x's :func:`unicode` (``PyUnicode_*``). The old 8-bit string type has become -:func:`bytes`. Python 2.6 and later provide a compatibility header, +Python 3's :func:`str` (``PyString_*`` functions in C) type is equivalent to +Python 2's :func:`unicode` (``PyUnicode_*``). The old 8-bit string type has +become :func:`bytes`. Python 2.6 and later provide a compatibility header, :file:`bytesobject.h`, mapping ``PyBytes`` names to ``PyString`` ones. For best -compatibility with 3.0, :c:type:`PyUnicode` should be used for textual data and +compatibility with Python 3, :c:type:`PyUnicode` should be used for textual data and :c:type:`PyBytes` for binary data. It's also important to remember that -:c:type:`PyBytes` and :c:type:`PyUnicode` in 3.0 are not interchangeable like -:c:type:`PyString` and :c:type:`PyUnicode` are in 2.x. The following example +:c:type:`PyBytes` and :c:type:`PyUnicode` in Python 3 are not interchangeable like +:c:type:`PyString` and :c:type:`PyUnicode` are in Python 2. The following example shows best practices with regards to :c:type:`PyUnicode`, :c:type:`PyString`, and :c:type:`PyBytes`. :: @@ -94,10 +95,12 @@ long/int Unification -------------------- -In Python 3.0, there is only one integer type. It is called :func:`int` on the -Python level, but actually corresponds to 2.x's :func:`long` type. In the -C-API, ``PyInt_*`` functions are replaced by their ``PyLong_*`` neighbors. The -best course of action here is using the ``PyInt_*`` functions aliased to +Python 3 has only one integer type, :func:`int`. But it actually +corresponds to Python 2's :func:`long` type--the :func:`int` type +used in Python 2 was removed. In the C-API, ``PyInt_*`` functions +are replaced by their ``PyLong_*`` equivalents. + +The best course of action here is using the ``PyInt_*`` functions aliased to ``PyLong_*`` found in :file:`intobject.h`. The abstract ``PyNumber_*`` APIs can also be used in some cases. :: @@ -120,10 +123,11 @@ Module initialization and state =============================== -Python 3.0 has a revamped extension module initialization system. (See -:pep:`3121`.) Instead of storing module state in globals, they should be stored -in an interpreter specific structure. Creating modules that act correctly in -both 2.x and 3.0 is tricky. The following simple example demonstrates how. :: +Python 3 has a revamped extension module initialization system. (See +:pep:`3121`.) Instead of storing module state in globals, they should +be stored in an interpreter specific structure. Creating modules that +act correctly in both Python 2 and Python 3 is tricky. The following +simple example demonstrates how. :: #include "Python.h" @@ -209,10 +213,65 @@ } +CObject replaced with Capsule +============================= + +The :c:type:`Capsule` object was introduced in Python 3.1 and 2.7 to replace +:c:type:`CObject`. CObjects were useful, +but the :c:type:`CObject` API was problematic: it didn't permit distinguishing +between valid CObjects, which allowed mismatched CObjects to crash the +interpreter, and some of its APIs relied on undefined behavior in C. +(For further reading on the rationale behind Capsules, please see :issue:`5630`.) + +If you're currently using CObjects, and you want to migrate to 3.1 or newer, +you'll need to switch to Capsules. +:c:type:`CObject` was deprecated in 3.1 and 2.7 and completely removed in +Python 3.2. If you only support 2.7, or 3.1 and above, you +can simply switch to :c:type:`Capsule`. If you need to support Python 3.0, +or versions of Python earlier than 2.7, +you'll have to support both CObjects and Capsules. +(Note that Python 3.0 is no longer supported, and it is not recommended +for production use.) + +The following example header file :file:`capsulethunk.h` may +solve the problem for you. Simply write your code against the +:c:type:`Capsule` API and include this header file after +:file:`Python.h`. Your code will automatically use Capsules +in versions of Python with Capsules, and switch to CObjects +when Capsules are unavailable. + +:file:`capsulethunk.h` simulates Capsules using CObjects. However, +:c:type:`CObject` provides no place to store the capsule's "name". As a +result the simulated :c:type:`Capsule` objects created by :file:`capsulethunk.h` +behave slightly differently from real Capsules. Specifically: + + * The name parameter passed in to :c:func:`PyCapsule_New` is ignored. + + * The name parameter passed in to :c:func:`PyCapsule_IsValid` and + :c:func:`PyCapsule_GetPointer` is ignored, and no error checking + of the name is performed. + + * :c:func:`PyCapsule_GetName` always returns NULL. + + * :c:func:`PyCapsule_SetName` always throws an exception and + returns failure. (Since there's no way to store a name + in a CObject, noisy failure of :c:func:`PyCapsule_SetName` + was deemed preferable to silent failure here. If this is + inconveient, feel free to modify your local + copy as you see fit.) + +You can find :file:`capsulethunk.h` in the Python source distribution +in the :file:`Doc/includes` directory. We also include it here for +your reference; here is :file:`capsulethunk.h`: + +.. literalinclude:: ../includes/capsulethunk.h + + + Other options ============= If you are writing a new extension module, you might consider `Cython `_. It translates a Python-like language to C. The -extension modules it creates are compatible with Python 3.x and 2.x. +extension modules it creates are compatible with Python 3 and Python 2. diff --git a/Doc/includes/capsulethunk.h b/Doc/includes/capsulethunk.h new file mode 100644 --- /dev/null +++ b/Doc/includes/capsulethunk.h @@ -0,0 +1,134 @@ +#ifndef __CAPSULETHUNK_H +#define __CAPSULETHUNK_H + +#if ( (PY_VERSION_HEX < 0x02070000) \ + || ((PY_VERSION_HEX >= 0x03000000) \ + && (PY_VERSION_HEX < 0x03010000)) ) + +#define __PyCapsule_GetField(capsule, field, default_value) \ + ( PyCapsule_CheckExact(capsule) \ + ? (((PyCObject *)capsule)->field) \ + : (default_value) \ + ) \ + +#define __PyCapsule_SetField(capsule, field, value) \ + ( PyCapsule_CheckExact(capsule) \ + ? (((PyCObject *)capsule)->field = value), 1 \ + : 0 \ + ) \ + + +#define PyCapsule_Type PyCObject_Type + +#define PyCapsule_CheckExact(capsule) (PyCObject_Check(capsule)) +#define PyCapsule_IsValid(capsule, name) (PyCObject_Check(capsule)) + + +#define PyCapsule_New(pointer, name, destructor) \ + (PyCObject_FromVoidPtr(pointer, destructor)) + + +#define PyCapsule_GetPointer(capsule, name) \ + (PyCObject_AsVoidPtr(capsule)) + +/* Don't call PyCObject_SetPointer here, it fails if there's a destructor */ +#define PyCapsule_SetPointer(capsule, pointer) \ + __PyCapsule_SetField(capsule, cobject, pointer) + + +#define PyCapsule_GetDestructor(capsule) \ + __PyCapsule_GetField(capsule, destructor) + +#define PyCapsule_SetDestructor(capsule, dtor) \ + __PyCapsule_SetField(capsule, destructor, dtor) + + +/* + * Sorry, there's simply no place + * to store a Capsule "name" in a CObject. + */ +#define PyCapsule_GetName(capsule) NULL + +static int +PyCapsule_SetName(PyObject *capsule, const char *unused) +{ + unused = unused; + PyErr_SetString(PyExc_NotImplementedError, + "can't use PyCapsule_SetName with CObjects"); + return 1; +} + + + +#define PyCapsule_GetContext(capsule) \ + __PyCapsule_GetField(capsule, descr) + +#define PyCapsule_SetContext(capsule, context) \ + __PyCapsule_SetField(capsule, descr, context) + + +static void * +PyCapsule_Import(const char *name, int no_block) +{ + PyObject *object = NULL; + void *return_value = NULL; + char *trace; + size_t name_length = (strlen(name) + 1) * sizeof(char); + char *name_dup = (char *)PyMem_MALLOC(name_length); + + if (!name_dup) { + return NULL; + } + + memcpy(name_dup, name, name_length); + + trace = name_dup; + while (trace) { + char *dot = strchr(trace, '.'); + if (dot) { + *dot++ = '\0'; + } + + if (object == NULL) { + if (no_block) { + object = PyImport_ImportModuleNoBlock(trace); + } else { + object = PyImport_ImportModule(trace); + if (!object) { + PyErr_Format(PyExc_ImportError, + "PyCapsule_Import could not " + "import module \"%s\"", trace); + } + } + } else { + PyObject *object2 = PyObject_GetAttrString(object, trace); + Py_DECREF(object); + object = object2; + } + if (!object) { + goto EXIT; + } + + trace = dot; + } + + if (PyCObject_Check(object)) { + PyCObject *cobject = (PyCObject *)object; + return_value = cobject->cobject; + } else { + PyErr_Format(PyExc_AttributeError, + "PyCapsule_Import \"%s\" is not valid", + name); + } + +EXIT: + Py_XDECREF(object); + if (name_dup) { + PyMem_FREE(name_dup); + } + return return_value; +} + +#endif /* #if PY_VERSION_HEX < 0x02070000 */ + +#endif /* __CAPSULETHUNK_H */ -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Feb 29 01:30:55 2012 From: python-checkins at python.org (larry.hastings) Date: Wed, 29 Feb 2012 01:30:55 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_3=2E2_-=3E_default=29?= =?utf8?q?=3A_Merge=3A_Propagate_changes_for_issues_=2313053_and_=2313086_?= =?utf8?q?from_2=2E7_to_3=2E2=2E?= Message-ID: http://hg.python.org/cpython/rev/c316e8a4a5e2 changeset: 75338:c316e8a4a5e2 parent: 75335:46ab2d46337c parent: 75337:28849d00a41e user: Larry Hastings date: Tue Feb 28 16:30:31 2012 -0800 summary: Merge: Propagate changes for issues #13053 and #13086 from 2.7 to 3.2. (Doc only.) files: Doc/howto/cporting.rst | 111 +++++++++++++++---- Doc/includes/capsulethunk.h | 134 ++++++++++++++++++++++++ 2 files changed, 219 insertions(+), 26 deletions(-) diff --git a/Doc/howto/cporting.rst b/Doc/howto/cporting.rst --- a/Doc/howto/cporting.rst +++ b/Doc/howto/cporting.rst @@ -2,27 +2,28 @@ .. _cporting-howto: -******************************** -Porting Extension Modules to 3.0 -******************************** +************************************* +Porting Extension Modules to Python 3 +************************************* :author: Benjamin Peterson .. topic:: Abstract - Although changing the C-API was not one of Python 3.0's objectives, the many - Python level changes made leaving 2.x's API intact impossible. In fact, some - changes such as :func:`int` and :func:`long` unification are more obvious on - the C level. This document endeavors to document incompatibilities and how - they can be worked around. + Although changing the C-API was not one of Python 3's objectives, + the many Python-level changes made leaving Python 2's API intact + impossible. In fact, some changes such as :func:`int` and + :func:`long` unification are more obvious on the C level. This + document endeavors to document incompatibilities and how they can + be worked around. Conditional compilation ======================= -The easiest way to compile only some code for 3.0 is to check if -:c:macro:`PY_MAJOR_VERSION` is greater than or equal to 3. :: +The easiest way to compile only some code for Python 3 is to check +if :c:macro:`PY_MAJOR_VERSION` is greater than or equal to 3. :: #if PY_MAJOR_VERSION >= 3 #define IS_PY3K @@ -35,7 +36,7 @@ Changes to Object APIs ====================== -Python 3.0 merged together some types with similar functions while cleanly +Python 3 merged together some types with similar functions while cleanly separating others. @@ -43,14 +44,14 @@ ----------------------- -Python 3.0's :func:`str` (``PyString_*`` functions in C) type is equivalent to -2.x's :func:`unicode` (``PyUnicode_*``). The old 8-bit string type has become -:func:`bytes`. Python 2.6 and later provide a compatibility header, +Python 3's :func:`str` (``PyString_*`` functions in C) type is equivalent to +Python 2's :func:`unicode` (``PyUnicode_*``). The old 8-bit string type has +become :func:`bytes`. Python 2.6 and later provide a compatibility header, :file:`bytesobject.h`, mapping ``PyBytes`` names to ``PyString`` ones. For best -compatibility with 3.0, :c:type:`PyUnicode` should be used for textual data and +compatibility with Python 3, :c:type:`PyUnicode` should be used for textual data and :c:type:`PyBytes` for binary data. It's also important to remember that -:c:type:`PyBytes` and :c:type:`PyUnicode` in 3.0 are not interchangeable like -:c:type:`PyString` and :c:type:`PyUnicode` are in 2.x. The following example +:c:type:`PyBytes` and :c:type:`PyUnicode` in Python 3 are not interchangeable like +:c:type:`PyString` and :c:type:`PyUnicode` are in Python 2. The following example shows best practices with regards to :c:type:`PyUnicode`, :c:type:`PyString`, and :c:type:`PyBytes`. :: @@ -94,10 +95,12 @@ long/int Unification -------------------- -In Python 3.0, there is only one integer type. It is called :func:`int` on the -Python level, but actually corresponds to 2.x's :func:`long` type. In the -C-API, ``PyInt_*`` functions are replaced by their ``PyLong_*`` neighbors. The -best course of action here is using the ``PyInt_*`` functions aliased to +Python 3 has only one integer type, :func:`int`. But it actually +corresponds to Python 2's :func:`long` type--the :func:`int` type +used in Python 2 was removed. In the C-API, ``PyInt_*`` functions +are replaced by their ``PyLong_*`` equivalents. + +The best course of action here is using the ``PyInt_*`` functions aliased to ``PyLong_*`` found in :file:`intobject.h`. The abstract ``PyNumber_*`` APIs can also be used in some cases. :: @@ -120,10 +123,11 @@ Module initialization and state =============================== -Python 3.0 has a revamped extension module initialization system. (See -:pep:`3121`.) Instead of storing module state in globals, they should be stored -in an interpreter specific structure. Creating modules that act correctly in -both 2.x and 3.0 is tricky. The following simple example demonstrates how. :: +Python 3 has a revamped extension module initialization system. (See +:pep:`3121`.) Instead of storing module state in globals, they should +be stored in an interpreter specific structure. Creating modules that +act correctly in both Python 2 and Python 3 is tricky. The following +simple example demonstrates how. :: #include "Python.h" @@ -209,10 +213,65 @@ } +CObject replaced with Capsule +============================= + +The :c:type:`Capsule` object was introduced in Python 3.1 and 2.7 to replace +:c:type:`CObject`. CObjects were useful, +but the :c:type:`CObject` API was problematic: it didn't permit distinguishing +between valid CObjects, which allowed mismatched CObjects to crash the +interpreter, and some of its APIs relied on undefined behavior in C. +(For further reading on the rationale behind Capsules, please see :issue:`5630`.) + +If you're currently using CObjects, and you want to migrate to 3.1 or newer, +you'll need to switch to Capsules. +:c:type:`CObject` was deprecated in 3.1 and 2.7 and completely removed in +Python 3.2. If you only support 2.7, or 3.1 and above, you +can simply switch to :c:type:`Capsule`. If you need to support Python 3.0, +or versions of Python earlier than 2.7, +you'll have to support both CObjects and Capsules. +(Note that Python 3.0 is no longer supported, and it is not recommended +for production use.) + +The following example header file :file:`capsulethunk.h` may +solve the problem for you. Simply write your code against the +:c:type:`Capsule` API and include this header file after +:file:`Python.h`. Your code will automatically use Capsules +in versions of Python with Capsules, and switch to CObjects +when Capsules are unavailable. + +:file:`capsulethunk.h` simulates Capsules using CObjects. However, +:c:type:`CObject` provides no place to store the capsule's "name". As a +result the simulated :c:type:`Capsule` objects created by :file:`capsulethunk.h` +behave slightly differently from real Capsules. Specifically: + + * The name parameter passed in to :c:func:`PyCapsule_New` is ignored. + + * The name parameter passed in to :c:func:`PyCapsule_IsValid` and + :c:func:`PyCapsule_GetPointer` is ignored, and no error checking + of the name is performed. + + * :c:func:`PyCapsule_GetName` always returns NULL. + + * :c:func:`PyCapsule_SetName` always throws an exception and + returns failure. (Since there's no way to store a name + in a CObject, noisy failure of :c:func:`PyCapsule_SetName` + was deemed preferable to silent failure here. If this is + inconveient, feel free to modify your local + copy as you see fit.) + +You can find :file:`capsulethunk.h` in the Python source distribution +in the :file:`Doc/includes` directory. We also include it here for +your reference; here is :file:`capsulethunk.h`: + +.. literalinclude:: ../includes/capsulethunk.h + + + Other options ============= If you are writing a new extension module, you might consider `Cython `_. It translates a Python-like language to C. The -extension modules it creates are compatible with Python 3.x and 2.x. +extension modules it creates are compatible with Python 3 and Python 2. diff --git a/Doc/includes/capsulethunk.h b/Doc/includes/capsulethunk.h new file mode 100644 --- /dev/null +++ b/Doc/includes/capsulethunk.h @@ -0,0 +1,134 @@ +#ifndef __CAPSULETHUNK_H +#define __CAPSULETHUNK_H + +#if ( (PY_VERSION_HEX < 0x02070000) \ + || ((PY_VERSION_HEX >= 0x03000000) \ + && (PY_VERSION_HEX < 0x03010000)) ) + +#define __PyCapsule_GetField(capsule, field, default_value) \ + ( PyCapsule_CheckExact(capsule) \ + ? (((PyCObject *)capsule)->field) \ + : (default_value) \ + ) \ + +#define __PyCapsule_SetField(capsule, field, value) \ + ( PyCapsule_CheckExact(capsule) \ + ? (((PyCObject *)capsule)->field = value), 1 \ + : 0 \ + ) \ + + +#define PyCapsule_Type PyCObject_Type + +#define PyCapsule_CheckExact(capsule) (PyCObject_Check(capsule)) +#define PyCapsule_IsValid(capsule, name) (PyCObject_Check(capsule)) + + +#define PyCapsule_New(pointer, name, destructor) \ + (PyCObject_FromVoidPtr(pointer, destructor)) + + +#define PyCapsule_GetPointer(capsule, name) \ + (PyCObject_AsVoidPtr(capsule)) + +/* Don't call PyCObject_SetPointer here, it fails if there's a destructor */ +#define PyCapsule_SetPointer(capsule, pointer) \ + __PyCapsule_SetField(capsule, cobject, pointer) + + +#define PyCapsule_GetDestructor(capsule) \ + __PyCapsule_GetField(capsule, destructor) + +#define PyCapsule_SetDestructor(capsule, dtor) \ + __PyCapsule_SetField(capsule, destructor, dtor) + + +/* + * Sorry, there's simply no place + * to store a Capsule "name" in a CObject. + */ +#define PyCapsule_GetName(capsule) NULL + +static int +PyCapsule_SetName(PyObject *capsule, const char *unused) +{ + unused = unused; + PyErr_SetString(PyExc_NotImplementedError, + "can't use PyCapsule_SetName with CObjects"); + return 1; +} + + + +#define PyCapsule_GetContext(capsule) \ + __PyCapsule_GetField(capsule, descr) + +#define PyCapsule_SetContext(capsule, context) \ + __PyCapsule_SetField(capsule, descr, context) + + +static void * +PyCapsule_Import(const char *name, int no_block) +{ + PyObject *object = NULL; + void *return_value = NULL; + char *trace; + size_t name_length = (strlen(name) + 1) * sizeof(char); + char *name_dup = (char *)PyMem_MALLOC(name_length); + + if (!name_dup) { + return NULL; + } + + memcpy(name_dup, name, name_length); + + trace = name_dup; + while (trace) { + char *dot = strchr(trace, '.'); + if (dot) { + *dot++ = '\0'; + } + + if (object == NULL) { + if (no_block) { + object = PyImport_ImportModuleNoBlock(trace); + } else { + object = PyImport_ImportModule(trace); + if (!object) { + PyErr_Format(PyExc_ImportError, + "PyCapsule_Import could not " + "import module \"%s\"", trace); + } + } + } else { + PyObject *object2 = PyObject_GetAttrString(object, trace); + Py_DECREF(object); + object = object2; + } + if (!object) { + goto EXIT; + } + + trace = dot; + } + + if (PyCObject_Check(object)) { + PyCObject *cobject = (PyCObject *)object; + return_value = cobject->cobject; + } else { + PyErr_Format(PyExc_AttributeError, + "PyCapsule_Import \"%s\" is not valid", + name); + } + +EXIT: + Py_XDECREF(object); + if (name_dup) { + PyMem_FREE(name_dup); + } + return return_value; +} + +#endif /* #if PY_VERSION_HEX < 0x02070000 */ + +#endif /* __CAPSULETHUNK_H */ -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Feb 29 01:59:44 2012 From: python-checkins at python.org (armin.ronacher) Date: Wed, 29 Feb 2012 01:59:44 +0100 Subject: [Python-checkins] =?utf8?q?peps=3A_Clarified_the_LTS_part=2E?= Message-ID: http://hg.python.org/peps/rev/34b15c939876 changeset: 4096:34b15c939876 parent: 4093:247b2760b3b7 user: Armin Ronacher date: Wed Feb 29 00:59:32 2012 +0000 summary: Clarified the LTS part. files: pep-0414.txt | 8 ++++---- 1 files changed, 4 insertions(+), 4 deletions(-) diff --git a/pep-0414.txt b/pep-0414.txt --- a/pep-0414.txt +++ b/pep-0414.txt @@ -95,10 +95,10 @@ An argument against this proposal was made on the Python-Dev mailinglist, mentioning that Ubuntu LTS will ship Python 3.2 and 2.7 for only 5 years. The counterargument is that Python 2.7 is currently the Python version of -choice for users who want LTS support. As it stands, Python 3 is -currently a bad choice for long-term investments, since the ecosystem is -not yet properly developed, and libraries are still fighting with their -API decisions for Python 3. +choice for users who want LTS support. As it stands, when chosing between +2.7 and Python 3.2, Python 3 is currently not the best choice for certain +long-term investments, since the ecosystem is not yet properly developed, +and libraries are still fighting with their API decisions for Python 3. A valid point is that this would encourage people to become dependent on Python 3.3 for their ports. Fortunately that is not a big problem since -- Repository URL: http://hg.python.org/peps From python-checkins at python.org Wed Feb 29 01:59:44 2012 From: python-checkins at python.org (armin.ronacher) Date: Wed, 29 Feb 2012 01:59:44 +0100 Subject: [Python-checkins] =?utf8?q?peps_=28merge_default_-=3E_default=29?= =?utf8?q?=3A_Merge?= Message-ID: http://hg.python.org/peps/rev/61cc962742be changeset: 4097:61cc962742be parent: 4096:34b15c939876 parent: 4095:f10e37d9ba49 user: Armin Ronacher date: Wed Feb 29 00:59:44 2012 +0000 summary: Merge files: pep-0409.txt | 11 ++++++++--- pep-0412.txt | 19 +++++++++++++++++++ 2 files changed, 27 insertions(+), 3 deletions(-) diff --git a/pep-0409.txt b/pep-0409.txt --- a/pep-0409.txt +++ b/pep-0409.txt @@ -153,12 +153,17 @@ In both of the latter cases the exception chain will stop being followed. -Because the default value for ``__cause__`` is now ``Ellipsis``:: +Because the default value for ``__cause__`` is now ``Ellipsis`` and ``raise +Exception from Cause`` is simply syntactic sugar for:: + + _exc = NewException() + _exc.__cause__ = Cause() + raise _exc + +``Ellipsis``, as well as ``None``, is now allowed as a cause:: raise Exception from Ellipsis -is allowed and will (re)set ``__cause__`` to ``Ellipsis``. - Patches ======= diff --git a/pep-0412.txt b/pep-0412.txt --- a/pep-0412.txt +++ b/pep-0412.txt @@ -149,6 +149,25 @@ The iteration order of dictionaries was never defined and has always been arbitrary; it is different for Jython and PyPy. +Alternative Implementation +-------------------------- + +An alternative implementation for split tables, which could save even more +memory, is to store an index in the value field of the keys table (instead +of ignoring the value field). This index would explicitly state where in the +value array to look. The value array would then only require 1 field for each +usable slot in the key table, rather than each slot in the key table. + +This "indexed" version would reduce the size of value array by about +one third. The keys table would need an extra "values_size" field, increasing +the size of combined dicts by one word. +The extra indirection adds more complexity to the code, potentially reducing +performance a little. + +The "indexed" version will not be included in this implementation, +but should be considered deferred rather than rejected, +pending further experimentation. + References ========== -- Repository URL: http://hg.python.org/peps From solipsis at pitrou.net Wed Feb 29 05:36:27 2012 From: solipsis at pitrou.net (solipsis at pitrou.net) Date: Wed, 29 Feb 2012 05:36:27 +0100 Subject: [Python-checkins] Daily reference leaks (c316e8a4a5e2): sum=0 Message-ID: results for c316e8a4a5e2 on branch "default" -------------------------------------------- Command line was: ['./python', '-m', 'test.regrtest', '-uall', '-R', '3:3:/home/antoine/cpython/refleaks/reflogi_OO5g', '-x'] From python-checkins at python.org Wed Feb 29 07:29:45 2012 From: python-checkins at python.org (eric.araujo) Date: Wed, 29 Feb 2012 07:29:45 +0100 Subject: [Python-checkins] =?utf8?q?peps=3A_Add_header_required_for_Standa?= =?utf8?q?rd_Tracks_PEPs?= Message-ID: http://hg.python.org/peps/rev/70bee9e3c5b9 changeset: 4098:70bee9e3c5b9 user: ?ric Araujo date: Wed Feb 29 07:28:24 2012 +0100 summary: Add header required for Standard Tracks PEPs files: pep-0410.txt | 1 + pep-0414.txt | 1 + 2 files changed, 2 insertions(+), 0 deletions(-) diff --git a/pep-0410.txt b/pep-0410.txt --- a/pep-0410.txt +++ b/pep-0410.txt @@ -8,6 +8,7 @@ Content-Type: text/x-rst Created: 01-February-2012 Python-Version: 3.3 +Resolution: http://mail.python.org/pipermail/python-dev/2012-February/116837.html Rejection Notice diff --git a/pep-0414.txt b/pep-0414.txt --- a/pep-0414.txt +++ b/pep-0414.txt @@ -8,6 +8,7 @@ Content-Type: text/x-rst Created: 15-Feb-2012 Post-History: 28-Feb-2012 +Resolution: http://mail.python.org/pipermail/python-dev/2012-February/116995.html Abstract -- Repository URL: http://hg.python.org/peps From python-checkins at python.org Wed Feb 29 07:30:16 2012 From: python-checkins at python.org (eric.araujo) Date: Wed, 29 Feb 2012 07:30:16 +0100 Subject: [Python-checkins] =?utf8?q?peps=3A_Remove_strange_wording=2E?= Message-ID: http://hg.python.org/peps/rev/1cba60d9977b changeset: 4099:1cba60d9977b user: ?ric Araujo date: Wed Feb 29 07:29:36 2012 +0100 summary: Remove strange wording. (?direct access? to the hg repo uses the same protocol than public browsing, so the distinction does not make sense anymore.) files: pep-0001.txt | 3 +-- 1 files changed, 1 insertions(+), 2 deletions(-) diff --git a/pep-0001.txt b/pep-0001.txt --- a/pep-0001.txt +++ b/pep-0001.txt @@ -461,8 +461,7 @@ ======================== .. [1] This historical record is available by the normal hg commands - for retrieving older revisions. For those without direct access to - the hg repo, you can browse the current and past PEP revisions here: + for retrieving older revisions, and can also be browsed via HTTP here: http://hg.python.org/peps/ .. [2] PEP 2, Procedure for Adding New Modules, Faassen -- Repository URL: http://hg.python.org/peps From python-checkins at python.org Wed Feb 29 10:50:08 2012 From: python-checkins at python.org (ezio.melotti) Date: Wed, 29 Feb 2012 10:50:08 +0100 Subject: [Python-checkins] =?utf8?b?Y3B5dGhvbiAoMi43KTogIzEwNzEzOiBJbXBy?= =?utf8?q?ove_documentation_for_=5Cb_and_=5CB_and_add_a_few_tests=2E__Init?= =?utf8?q?ial_patch?= Message-ID: http://hg.python.org/cpython/rev/fc89e09ca2fc changeset: 75339:fc89e09ca2fc branch: 2.7 parent: 75336:eb88cc90cc56 user: Ezio Melotti date: Wed Feb 29 11:40:00 2012 +0200 summary: #10713: Improve documentation for \b and \B and add a few tests. Initial patch and tests by Martin Pool. files: Doc/library/re.rst | 15 ++++++++++----- Lib/test/test_re.py | 26 ++++++++++++++++++++++++++ 2 files changed, 36 insertions(+), 5 deletions(-) diff --git a/Doc/library/re.rst b/Doc/library/re.rst --- a/Doc/library/re.rst +++ b/Doc/library/re.rst @@ -325,14 +325,19 @@ Matches the empty string, but only at the beginning or end of a word. A word is defined as a sequence of alphanumeric or underscore characters, so the end of a word is indicated by whitespace or a non-alphanumeric, non-underscore character. - Note that ``\b`` is defined as the boundary between ``\w`` and ``\W``, so the - precise set of characters deemed to be alphanumeric depends on the values of the - ``UNICODE`` and ``LOCALE`` flags. Inside a character range, ``\b`` represents - the backspace character, for compatibility with Python's string literals. + Note that formally, ``\b`` is defined as the boundary between a ``\w`` and + a ``\W`` character (or vice versa), or between ``\w`` and the beginning/end + of the string, so the precise set of characters deemed to be alphanumeric + depends on the values of the ``UNICODE`` and ``LOCALE`` flags. + For example, ``r'\bfoo\b'`` matches ``'foo'``, ``'foo.'``, ``'(foo)'``, + ``'bar foo baz'`` but not ``'foobar'`` or ``'foo3'``. + Inside a character range, ``\b`` represents the backspace character, for compatibility with Python's string literals. ``\B`` Matches the empty string, but only when it is *not* at the beginning or end of a - word. This is just the opposite of ``\b``, so is also subject to the settings + word. This means that ``r'py\B'`` matches ``'python'``, ``'py3'``, ``'py2'``, + but not ``'py'``, ``'py.'``, or ``'py!'``. + ``\B`` is just the opposite of ``\b``, so is also subject to the settings of ``LOCALE`` and ``UNICODE``. ``\d`` diff --git a/Lib/test/test_re.py b/Lib/test/test_re.py --- a/Lib/test/test_re.py +++ b/Lib/test/test_re.py @@ -373,6 +373,32 @@ self.assertEqual(re.search(r"\d\D\w\W\s\S", "1aa! a", re.UNICODE).group(0), "1aa! a") + def test_string_boundaries(self): + # See http://bugs.python.org/issue10713 + self.assertEqual(re.search(r"\b(abc)\b", "abc").group(1), + "abc") + # There's a word boundary at the start of a string. + self.assertTrue(re.match(r"\b", "abc")) + # A non-empty string includes a non-boundary zero-length match. + self.assertTrue(re.search(r"\B", "abc")) + # There is no non-boundary match at the start of a string. + self.assertFalse(re.match(r"\B", "abc")) + # However, an empty string contains no word boundaries, and also no + # non-boundaries. + self.assertEqual(re.search(r"\B", ""), None) + # This one is questionable and different from the perlre behaviour, + # but describes current behavior. + self.assertEqual(re.search(r"\b", ""), None) + # A single word-character string has two boundaries, but no + # non-boundary gaps. + self.assertEqual(len(re.findall(r"\b", "a")), 2) + self.assertEqual(len(re.findall(r"\B", "a")), 0) + # If there are no words, there are no boundaries + self.assertEqual(len(re.findall(r"\b", " ")), 0) + self.assertEqual(len(re.findall(r"\b", " ")), 0) + # Can match around the whitespace. + self.assertEqual(len(re.findall(r"\B", " ")), 2) + def test_bigcharset(self): self.assertEqual(re.match(u"([\u2222\u2223])", u"\u2222").group(1), u"\u2222") -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Feb 29 10:50:11 2012 From: python-checkins at python.org (ezio.melotti) Date: Wed, 29 Feb 2012 10:50:11 +0100 Subject: [Python-checkins] =?utf8?b?Y3B5dGhvbiAoMy4yKTogIzEwNzEzOiBJbXBy?= =?utf8?q?ove_documentation_for_=5Cb_and_=5CB_and_add_a_few_tests=2E__Init?= =?utf8?q?ial_patch?= Message-ID: http://hg.python.org/cpython/rev/cde7fa40b289 changeset: 75340:cde7fa40b289 branch: 3.2 parent: 75337:28849d00a41e user: Ezio Melotti date: Wed Feb 29 11:48:44 2012 +0200 summary: #10713: Improve documentation for \b and \B and add a few tests. Initial patch and tests by Martin Pool. files: Doc/library/re.rst | 22 ++++++++++++++-------- Lib/test/test_re.py | 26 ++++++++++++++++++++++++++ 2 files changed, 40 insertions(+), 8 deletions(-) diff --git a/Doc/library/re.rst b/Doc/library/re.rst --- a/Doc/library/re.rst +++ b/Doc/library/re.rst @@ -330,16 +330,22 @@ Matches the empty string, but only at the beginning or end of a word. A word is defined as a sequence of Unicode alphanumeric or underscore characters, so the end of a word is indicated by whitespace or a - non-alphanumeric, non-underscore Unicode character. Note that - formally, ``\b`` is defined as the boundary between a ``\w`` and a - ``\W`` character (or vice versa). By default Unicode alphanumerics - are the ones used, but this can be changed by using the :const:`ASCII` - flag. Inside a character range, ``\b`` represents the backspace - character, for compatibility with Python's string literals. + non-alphanumeric, non-underscore Unicode character. Note that formally, + ``\b`` is defined as the boundary between a ``\w`` and a ``\W`` character + (or vice versa), or between ``\w`` and the beginning/end of the string. + This means that ``r'\bfoo\b'`` matches ``'foo'``, ``'foo.'``, ``'(foo)'``, + ``'bar foo baz'`` but not ``'foobar'`` or ``'foo3'``. + + By default Unicode alphanumerics are the ones used, but this can be changed + by using the :const:`ASCII` flag. Inside a character range, ``\b`` + represents the backspace character, for compatibility with Python's string + literals. ``\B`` - Matches the empty string, but only when it is *not* at the beginning or end of a - word. This is just the opposite of ``\b``, so word characters are + Matches the empty string, but only when it is *not* at the beginning or end + of a word. This means that ``r'py\B'`` matches ``'python'``, ``'py3'``, + ``'py2'``, but not ``'py'``, ``'py.'``, or ``'py!'``. + ``\B`` is just the opposite of ``\b``, so word characters are Unicode alphanumerics or the underscore, although this can be changed by using the :const:`ASCII` flag. diff --git a/Lib/test/test_re.py b/Lib/test/test_re.py --- a/Lib/test/test_re.py +++ b/Lib/test/test_re.py @@ -355,6 +355,32 @@ self.assertEqual(re.search(r"\d\D\w\W\s\S", "1aa! a", re.UNICODE).group(0), "1aa! a") + def test_string_boundaries(self): + # See http://bugs.python.org/issue10713 + self.assertEqual(re.search(r"\b(abc)\b", "abc").group(1), + "abc") + # There's a word boundary at the start of a string. + self.assertTrue(re.match(r"\b", "abc")) + # A non-empty string includes a non-boundary zero-length match. + self.assertTrue(re.search(r"\B", "abc")) + # There is no non-boundary match at the start of a string. + self.assertFalse(re.match(r"\B", "abc")) + # However, an empty string contains no word boundaries, and also no + # non-boundaries. + self.assertEqual(re.search(r"\B", ""), None) + # This one is questionable and different from the perlre behaviour, + # but describes current behavior. + self.assertEqual(re.search(r"\b", ""), None) + # A single word-character string has two boundaries, but no + # non-boundary gaps. + self.assertEqual(len(re.findall(r"\b", "a")), 2) + self.assertEqual(len(re.findall(r"\B", "a")), 0) + # If there are no words, there are no boundaries + self.assertEqual(len(re.findall(r"\b", " ")), 0) + self.assertEqual(len(re.findall(r"\b", " ")), 0) + # Can match around the whitespace. + self.assertEqual(len(re.findall(r"\B", " ")), 2) + def test_bigcharset(self): self.assertEqual(re.match("([\u2222\u2223])", "\u2222").group(1), "\u2222") -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Feb 29 10:50:15 2012 From: python-checkins at python.org (ezio.melotti) Date: Wed, 29 Feb 2012 10:50:15 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_3=2E2_-=3E_default=29?= =?utf8?q?=3A_=2310713=3A_merge_with_3=2E2=2E?= Message-ID: http://hg.python.org/cpython/rev/b78ca038e468 changeset: 75341:b78ca038e468 parent: 75338:c316e8a4a5e2 parent: 75340:cde7fa40b289 user: Ezio Melotti date: Wed Feb 29 11:49:45 2012 +0200 summary: #10713: merge with 3.2. files: Doc/library/re.rst | 22 ++++++++++++++-------- Lib/test/test_re.py | 26 ++++++++++++++++++++++++++ 2 files changed, 40 insertions(+), 8 deletions(-) diff --git a/Doc/library/re.rst b/Doc/library/re.rst --- a/Doc/library/re.rst +++ b/Doc/library/re.rst @@ -330,16 +330,22 @@ Matches the empty string, but only at the beginning or end of a word. A word is defined as a sequence of Unicode alphanumeric or underscore characters, so the end of a word is indicated by whitespace or a - non-alphanumeric, non-underscore Unicode character. Note that - formally, ``\b`` is defined as the boundary between a ``\w`` and a - ``\W`` character (or vice versa). By default Unicode alphanumerics - are the ones used, but this can be changed by using the :const:`ASCII` - flag. Inside a character range, ``\b`` represents the backspace - character, for compatibility with Python's string literals. + non-alphanumeric, non-underscore Unicode character. Note that formally, + ``\b`` is defined as the boundary between a ``\w`` and a ``\W`` character + (or vice versa), or between ``\w`` and the beginning/end of the string. + This means that ``r'\bfoo\b'`` matches ``'foo'``, ``'foo.'``, ``'(foo)'``, + ``'bar foo baz'`` but not ``'foobar'`` or ``'foo3'``. + + By default Unicode alphanumerics are the ones used, but this can be changed + by using the :const:`ASCII` flag. Inside a character range, ``\b`` + represents the backspace character, for compatibility with Python's string + literals. ``\B`` - Matches the empty string, but only when it is *not* at the beginning or end of a - word. This is just the opposite of ``\b``, so word characters are + Matches the empty string, but only when it is *not* at the beginning or end + of a word. This means that ``r'py\B'`` matches ``'python'``, ``'py3'``, + ``'py2'``, but not ``'py'``, ``'py.'``, or ``'py!'``. + ``\B`` is just the opposite of ``\b``, so word characters are Unicode alphanumerics or the underscore, although this can be changed by using the :const:`ASCII` flag. diff --git a/Lib/test/test_re.py b/Lib/test/test_re.py --- a/Lib/test/test_re.py +++ b/Lib/test/test_re.py @@ -355,6 +355,32 @@ self.assertEqual(re.search(r"\d\D\w\W\s\S", "1aa! a", re.UNICODE).group(0), "1aa! a") + def test_string_boundaries(self): + # See http://bugs.python.org/issue10713 + self.assertEqual(re.search(r"\b(abc)\b", "abc").group(1), + "abc") + # There's a word boundary at the start of a string. + self.assertTrue(re.match(r"\b", "abc")) + # A non-empty string includes a non-boundary zero-length match. + self.assertTrue(re.search(r"\B", "abc")) + # There is no non-boundary match at the start of a string. + self.assertFalse(re.match(r"\B", "abc")) + # However, an empty string contains no word boundaries, and also no + # non-boundaries. + self.assertEqual(re.search(r"\B", ""), None) + # This one is questionable and different from the perlre behaviour, + # but describes current behavior. + self.assertEqual(re.search(r"\b", ""), None) + # A single word-character string has two boundaries, but no + # non-boundary gaps. + self.assertEqual(len(re.findall(r"\b", "a")), 2) + self.assertEqual(len(re.findall(r"\B", "a")), 0) + # If there are no words, there are no boundaries + self.assertEqual(len(re.findall(r"\b", " ")), 0) + self.assertEqual(len(re.findall(r"\b", " ")), 0) + # Can match around the whitespace. + self.assertEqual(len(re.findall(r"\B", " ")), 2) + def test_bigcharset(self): self.assertEqual(re.match("([\u2222\u2223])", "\u2222").group(1), "\u2222") -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Feb 29 12:40:31 2012 From: python-checkins at python.org (ezio.melotti) Date: Wed, 29 Feb 2012 12:40:31 +0100 Subject: [Python-checkins] =?utf8?b?Y3B5dGhvbiAoMi43KTogIzE0MTU1OiByZW1v?= =?utf8?q?ve_duplication_about_search_vs_match_in_re_doc=2E?= Message-ID: http://hg.python.org/cpython/rev/3958121a027f changeset: 75342:3958121a027f branch: 2.7 parent: 75339:fc89e09ca2fc user: Ezio Melotti date: Wed Feb 29 13:37:07 2012 +0200 summary: #14155: remove duplication about search vs match in re doc. files: Doc/library/re.rst | 81 ++++++++++++--------------------- 1 files changed, 29 insertions(+), 52 deletions(-) diff --git a/Doc/library/re.rst b/Doc/library/re.rst --- a/Doc/library/re.rst +++ b/Doc/library/re.rst @@ -400,31 +400,6 @@ three digits in length. -.. _matching-searching: - -Matching vs Searching ---------------------- - -.. sectionauthor:: Fred L. Drake, Jr. - - -Python offers two different primitive operations based on regular expressions: -**match** checks for a match only at the beginning of the string, while -**search** checks for a match anywhere in the string (this is what Perl does -by default). - -Note that match may differ from search even when using a regular expression -beginning with ``'^'``: ``'^'`` matches only at the start of the string, or in -:const:`MULTILINE` mode also immediately following a newline. The "match" -operation succeeds only if the pattern matches at the start of the string -regardless of mode, or at the starting position given by the optional *pos* -argument regardless of whether a newline precedes it. - - >>> re.match("c", "abcdef") # No match - >>> re.search("c", "abcdef") # Match - <_sre.SRE_Match object at ...> - - .. _contents-of-module-re: Module Contents @@ -547,10 +522,11 @@ Return ``None`` if the string does not match the pattern; note that this is different from a zero-length match. - .. note:: + Note that even in :const:`MULTILINE` mode, :func:`re.match` will only match + at the beginning of the string and not at the beginning of each line. - If you want to locate a match anywhere in *string*, use :func:`search` - instead. + If you want to locate a match anywhere in *string*, use :func:`search` + instead (see also :ref:`search-vs-match`). .. function:: split(pattern, string, maxsplit=0, flags=0) @@ -746,16 +722,14 @@ The optional *pos* and *endpos* parameters have the same meaning as for the :meth:`~RegexObject.search` method. - .. note:: - - If you want to locate a match anywhere in *string*, use - :meth:`~RegexObject.search` instead. - >>> pattern = re.compile("o") >>> pattern.match("dog") # No match as "o" is not at the start of "dog". >>> pattern.match("dog", 1) # Match as "o" is the 2nd character of "dog". <_sre.SRE_Match object at ...> + If you want to locate a match anywhere in *string*, use + :meth:`~RegexObject.search` instead (see also :ref:`search-vs-match`). + .. method:: RegexObject.split(string, maxsplit=0) @@ -1121,37 +1095,39 @@ being recast as ``Begin [a-zA-Z0-9_ ]*?end``. As a further benefit, such regular expressions will run faster than their recursive equivalents. +.. _search-vs-match: search() vs. match() ^^^^^^^^^^^^^^^^^^^^ -In a nutshell, :func:`match` only attempts to match a pattern at the beginning -of a string where :func:`search` will match a pattern anywhere in a string. -For example: +.. sectionauthor:: Fred L. Drake, Jr. - >>> re.match("o", "dog") # No match as "o" is not the first letter of "dog". - >>> re.search("o", "dog") # Match as search() looks everywhere in the string. +Python offers two different primitive operations based on regular expressions: +:func:`re.match` checks for a match only at the beginning of the string, while +:func:`re.search` checks for a match anywhere in the string (this is what Perl +does by default). + +For example:: + + >>> re.match("c", "abcdef") # No match + >>> re.search("c", "abcdef") # Match <_sre.SRE_Match object at ...> -.. note:: +Regular expressions beginning with ``'^'`` can be used with :func:`search` to +restrict the match at the beginning of the string:: - The following applies only to regular expression objects like those created - with ``re.compile("pattern")``, not the primitives ``re.match(pattern, - string)`` or ``re.search(pattern, string)``. + >>> re.match("c", "abcdef") # No match + >>> re.search("^c", "abcdef") # No match + >>> re.search("^a", "abcdef") # Match + <_sre.SRE_Match object at ...> -:func:`match` has an optional second parameter that gives an index in the string -where the search is to start:: +Note however that in :const:`MULTILINE` mode :func:`match` only matches at the +beginning of the string, whereas using :func:`search` with a regular expression +beginning with ``'^'`` will match at the beginning of each line. - >>> pattern = re.compile("o") - >>> pattern.match("dog") # No match as "o" is not at the start of "dog." - - # Equivalent to the above expression as 0 is the default starting index: - >>> pattern.match("dog", 0) - - # Match as "o" is the 2nd character of "dog" (index 0 is the first): - >>> pattern.match("dog", 1) + >>> re.match('X', 'A\nB\nX', re.MULTILINE) # No match + >>> re.search('^X', 'A\nB\nX', re.MULTILINE) # Match <_sre.SRE_Match object at ...> - >>> pattern.match("dog", 2) # No match as "o" is not the 3rd character of "dog." Making a Phonebook -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Feb 29 12:40:32 2012 From: python-checkins at python.org (ezio.melotti) Date: Wed, 29 Feb 2012 12:40:32 +0100 Subject: [Python-checkins] =?utf8?b?Y3B5dGhvbiAoMy4yKTogIzE0MTU1OiByZW1v?= =?utf8?q?ve_duplication_about_search_vs_match_in_re_doc=2E?= Message-ID: http://hg.python.org/cpython/rev/4114e816a71b changeset: 75343:4114e816a71b branch: 3.2 parent: 75340:cde7fa40b289 user: Ezio Melotti date: Wed Feb 29 13:39:05 2012 +0200 summary: #14155: remove duplication about search vs match in re doc. files: Doc/library/re.rst | 81 ++++++++++++--------------------- 1 files changed, 29 insertions(+), 52 deletions(-) diff --git a/Doc/library/re.rst b/Doc/library/re.rst --- a/Doc/library/re.rst +++ b/Doc/library/re.rst @@ -423,31 +423,6 @@ three digits in length. -.. _matching-searching: - -Matching vs. Searching ----------------------- - -.. sectionauthor:: Fred L. Drake, Jr. - - -Python offers two different primitive operations based on regular expressions: -**match** checks for a match only at the beginning of the string, while -**search** checks for a match anywhere in the string (this is what Perl does -by default). - -Note that match may differ from search even when using a regular expression -beginning with ``'^'``: ``'^'`` matches only at the start of the string, or in -:const:`MULTILINE` mode also immediately following a newline. The "match" -operation succeeds only if the pattern matches at the start of the string -regardless of mode, or at the starting position given by the optional *pos* -argument regardless of whether a newline precedes it. - - >>> re.match("c", "abcdef") # No match - >>> re.search("c", "abcdef") # Match - <_sre.SRE_Match object at ...> - - .. _contents-of-module-re: Module Contents @@ -581,10 +556,11 @@ `. Return ``None`` if the string does not match the pattern; note that this is different from a zero-length match. - .. note:: + Note that even in :const:`MULTILINE` mode, :func:`re.match` will only match + at the beginning of the string and not at the beginning of each line. - If you want to locate a match anywhere in *string*, use :func:`search` - instead. + If you want to locate a match anywhere in *string*, use :func:`search` + instead (see also :ref:`search-vs-match`). .. function:: split(pattern, string, maxsplit=0, flags=0) @@ -768,16 +744,14 @@ The optional *pos* and *endpos* parameters have the same meaning as for the :meth:`~regex.search` method. - .. note:: - - If you want to locate a match anywhere in *string*, use - :meth:`~regex.search` instead. - >>> pattern = re.compile("o") >>> pattern.match("dog") # No match as "o" is not at the start of "dog". >>> pattern.match("dog", 1) # Match as "o" is the 2nd character of "dog". <_sre.SRE_Match object at ...> + If you want to locate a match anywhere in *string*, use + :meth:`~regex.search` instead (see also :ref:`search-vs-match`). + .. method:: regex.split(string, maxsplit=0) @@ -1139,37 +1113,39 @@ [a-zA-Z0-9_ ]*?end``. As a further benefit, such regular expressions will run faster than their recursive equivalents. +.. _search-vs-match: search() vs. match() ^^^^^^^^^^^^^^^^^^^^ -In a nutshell, :func:`match` only attempts to match a pattern at the beginning -of a string where :func:`search` will match a pattern anywhere in a string. -For example: +.. sectionauthor:: Fred L. Drake, Jr. - >>> re.match("o", "dog") # No match as "o" is not the first letter of "dog". - >>> re.search("o", "dog") # Match as search() looks everywhere in the string. +Python offers two different primitive operations based on regular expressions: +:func:`re.match` checks for a match only at the beginning of the string, while +:func:`re.search` checks for a match anywhere in the string (this is what Perl +does by default). + +For example:: + + >>> re.match("c", "abcdef") # No match + >>> re.search("c", "abcdef") # Match <_sre.SRE_Match object at ...> -.. note:: +Regular expressions beginning with ``'^'`` can be used with :func:`search` to +restrict the match at the beginning of the string:: - The following applies only to regular expression objects like those created - with ``re.compile("pattern")``, not the primitives ``re.match(pattern, - string)`` or ``re.search(pattern, string)``. + >>> re.match("c", "abcdef") # No match + >>> re.search("^c", "abcdef") # No match + >>> re.search("^a", "abcdef") # Match + <_sre.SRE_Match object at ...> -:func:`match` has an optional second parameter that gives an index in the string -where the search is to start:: +Note however that in :const:`MULTILINE` mode :func:`match` only matches at the +beginning of the string, whereas using :func:`search` with a regular expression +beginning with ``'^'`` will match at the beginning of each line. - >>> pattern = re.compile("o") - >>> pattern.match("dog") # No match as "o" is not at the start of "dog." - - # Equivalent to the above expression as 0 is the default starting index: - >>> pattern.match("dog", 0) - - # Match as "o" is the 2nd character of "dog" (index 0 is the first): - >>> pattern.match("dog", 1) + >>> re.match('X', 'A\nB\nX', re.MULTILINE) # No match + >>> re.search('^X', 'A\nB\nX', re.MULTILINE) # Match <_sre.SRE_Match object at ...> - >>> pattern.match("dog", 2) # No match as "o" is not the 3rd character of "dog." Making a Phonebook -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Feb 29 12:40:36 2012 From: python-checkins at python.org (ezio.melotti) Date: Wed, 29 Feb 2012 12:40:36 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_3=2E2_-=3E_default=29?= =?utf8?q?=3A_=2314155=3A_merge_with_3=2E2=2E?= Message-ID: http://hg.python.org/cpython/rev/457c3c0cb0a0 changeset: 75344:457c3c0cb0a0 parent: 75341:b78ca038e468 parent: 75343:4114e816a71b user: Ezio Melotti date: Wed Feb 29 13:40:11 2012 +0200 summary: #14155: merge with 3.2. files: Doc/library/re.rst | 81 ++++++++++++--------------------- 1 files changed, 29 insertions(+), 52 deletions(-) diff --git a/Doc/library/re.rst b/Doc/library/re.rst --- a/Doc/library/re.rst +++ b/Doc/library/re.rst @@ -423,31 +423,6 @@ three digits in length. -.. _matching-searching: - -Matching vs. Searching ----------------------- - -.. sectionauthor:: Fred L. Drake, Jr. - - -Python offers two different primitive operations based on regular expressions: -**match** checks for a match only at the beginning of the string, while -**search** checks for a match anywhere in the string (this is what Perl does -by default). - -Note that match may differ from search even when using a regular expression -beginning with ``'^'``: ``'^'`` matches only at the start of the string, or in -:const:`MULTILINE` mode also immediately following a newline. The "match" -operation succeeds only if the pattern matches at the start of the string -regardless of mode, or at the starting position given by the optional *pos* -argument regardless of whether a newline precedes it. - - >>> re.match("c", "abcdef") # No match - >>> re.search("c", "abcdef") # Match - <_sre.SRE_Match object at ...> - - .. _contents-of-module-re: Module Contents @@ -581,10 +556,11 @@ `. Return ``None`` if the string does not match the pattern; note that this is different from a zero-length match. - .. note:: + Note that even in :const:`MULTILINE` mode, :func:`re.match` will only match + at the beginning of the string and not at the beginning of each line. - If you want to locate a match anywhere in *string*, use :func:`search` - instead. + If you want to locate a match anywhere in *string*, use :func:`search` + instead (see also :ref:`search-vs-match`). .. function:: split(pattern, string, maxsplit=0, flags=0) @@ -771,16 +747,14 @@ The optional *pos* and *endpos* parameters have the same meaning as for the :meth:`~regex.search` method. - .. note:: - - If you want to locate a match anywhere in *string*, use - :meth:`~regex.search` instead. - >>> pattern = re.compile("o") >>> pattern.match("dog") # No match as "o" is not at the start of "dog". >>> pattern.match("dog", 1) # Match as "o" is the 2nd character of "dog". <_sre.SRE_Match object at ...> + If you want to locate a match anywhere in *string*, use + :meth:`~regex.search` instead (see also :ref:`search-vs-match`). + .. method:: regex.split(string, maxsplit=0) @@ -1142,37 +1116,39 @@ [a-zA-Z0-9_ ]*?end``. As a further benefit, such regular expressions will run faster than their recursive equivalents. +.. _search-vs-match: search() vs. match() ^^^^^^^^^^^^^^^^^^^^ -In a nutshell, :func:`match` only attempts to match a pattern at the beginning -of a string where :func:`search` will match a pattern anywhere in a string. -For example: +.. sectionauthor:: Fred L. Drake, Jr. - >>> re.match("o", "dog") # No match as "o" is not the first letter of "dog". - >>> re.search("o", "dog") # Match as search() looks everywhere in the string. +Python offers two different primitive operations based on regular expressions: +:func:`re.match` checks for a match only at the beginning of the string, while +:func:`re.search` checks for a match anywhere in the string (this is what Perl +does by default). + +For example:: + + >>> re.match("c", "abcdef") # No match + >>> re.search("c", "abcdef") # Match <_sre.SRE_Match object at ...> -.. note:: +Regular expressions beginning with ``'^'`` can be used with :func:`search` to +restrict the match at the beginning of the string:: - The following applies only to regular expression objects like those created - with ``re.compile("pattern")``, not the primitives ``re.match(pattern, - string)`` or ``re.search(pattern, string)``. + >>> re.match("c", "abcdef") # No match + >>> re.search("^c", "abcdef") # No match + >>> re.search("^a", "abcdef") # Match + <_sre.SRE_Match object at ...> -:func:`match` has an optional second parameter that gives an index in the string -where the search is to start:: +Note however that in :const:`MULTILINE` mode :func:`match` only matches at the +beginning of the string, whereas using :func:`search` with a regular expression +beginning with ``'^'`` will match at the beginning of each line. - >>> pattern = re.compile("o") - >>> pattern.match("dog") # No match as "o" is not at the start of "dog." - - # Equivalent to the above expression as 0 is the default starting index: - >>> pattern.match("dog", 0) - - # Match as "o" is the 2nd character of "dog" (index 0 is the first): - >>> pattern.match("dog", 1) + >>> re.match('X', 'A\nB\nX', re.MULTILINE) # No match + >>> re.search('^X', 'A\nB\nX', re.MULTILINE) # Match <_sre.SRE_Match object at ...> - >>> pattern.match("dog", 2) # No match as "o" is not the 3rd character of "dog." Making a Phonebook -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Feb 29 13:07:11 2012 From: python-checkins at python.org (ezio.melotti) Date: Wed, 29 Feb 2012 13:07:11 +0100 Subject: [Python-checkins] =?utf8?b?Y3B5dGhvbiAoMi43KTogIzE0MDg5OiBpbmNy?= =?utf8?q?ease_coverage_of_the_fractions_module=2E__Patch_by_Oleg_Plakhotn?= =?utf8?q?yuk=2E?= Message-ID: http://hg.python.org/cpython/rev/8e00de3acb44 changeset: 75345:8e00de3acb44 branch: 2.7 parent: 75342:3958121a027f user: Ezio Melotti date: Wed Feb 29 14:04:02 2012 +0200 summary: #14089: increase coverage of the fractions module. Patch by Oleg Plakhotnyuk. files: Lib/test/test_fractions.py | 20 +++++++++++++++++++- 1 files changed, 19 insertions(+), 1 deletions(-) diff --git a/Lib/test/test_fractions.py b/Lib/test/test_fractions.py --- a/Lib/test/test_fractions.py +++ b/Lib/test/test_fractions.py @@ -6,6 +6,7 @@ import numbers import operator import fractions +import sys import unittest from copy import copy, deepcopy from cPickle import dumps, loads @@ -88,6 +89,9 @@ __hash__ = None +class DummyFraction(fractions.Fraction): + """Dummy Fraction subclass for copy and deepcopy testing.""" + class GcdTest(unittest.TestCase): def testMisc(self): @@ -301,11 +305,15 @@ self.assertEqual(F(201, 200).limit_denominator(100), F(1)) self.assertEqual(F(201, 200).limit_denominator(101), F(102, 101)) self.assertEqual(F(0).limit_denominator(10000), F(0)) + for i in (0, -1): + self.assertRaisesMessage( + ValueError, "max_denominator should be at least 1", + F(1).limit_denominator, i) def testConversions(self): self.assertTypedEquals(-1, math.trunc(F(-11, 10))) self.assertTypedEquals(-1, int(F(-11, 10))) - + self.assertTypedEquals(1, math.trunc(F(11, 10))) self.assertEqual(False, bool(F(0, 1))) self.assertEqual(True, bool(F(3, 2))) self.assertTypedEquals(0.1, float(F(1, 10))) @@ -330,6 +338,7 @@ self.assertEqual(F(8, 27), F(2, 3) ** F(3)) self.assertEqual(F(27, 8), F(2, 3) ** F(-3)) self.assertTypedEquals(2.0, F(4) ** F(1, 2)) + self.assertEqual(F(1, 1), +F(1, 1)) # Will return 1j in 3.0: self.assertRaises(ValueError, pow, F(-1), F(1, 2)) @@ -394,6 +403,10 @@ 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.assertNotEqual(F(5, 2), Decimal('2.5')) def testComparisons(self): @@ -571,9 +584,14 @@ def test_copy_deepcopy_pickle(self): r = F(13, 7) + dr = DummyFraction(13, 7) self.assertEqual(r, loads(dumps(r))) self.assertEqual(id(r), id(copy(r))) self.assertEqual(id(r), id(deepcopy(r))) + self.assertNotEqual(id(dr), id(copy(dr))) + self.assertNotEqual(id(dr), id(deepcopy(dr))) + self.assertTypedEquals(dr, copy(dr)) + self.assertTypedEquals(dr, deepcopy(dr)) def test_slots(self): # Issue 4998 -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Feb 29 13:07:11 2012 From: python-checkins at python.org (ezio.melotti) Date: Wed, 29 Feb 2012 13:07:11 +0100 Subject: [Python-checkins] =?utf8?b?Y3B5dGhvbiAoMy4yKTogIzE0MDg5OiBpbmNy?= =?utf8?q?ease_coverage_of_the_fractions_module=2E__Patch_by_Oleg_Plakhotn?= =?utf8?q?yuk=2E?= Message-ID: http://hg.python.org/cpython/rev/0bbc2549e1ee changeset: 75346:0bbc2549e1ee branch: 3.2 parent: 75343:4114e816a71b user: Ezio Melotti date: Wed Feb 29 14:05:53 2012 +0200 summary: #14089: increase coverage of the fractions module. Patch by Oleg Plakhotnyuk. files: Lib/test/test_fractions.py | 22 ++++++++++++++++++++++ 1 files changed, 22 insertions(+), 0 deletions(-) diff --git a/Lib/test/test_fractions.py b/Lib/test/test_fractions.py --- a/Lib/test/test_fractions.py +++ b/Lib/test/test_fractions.py @@ -6,6 +6,7 @@ import numbers import operator import fractions +import sys import unittest from copy import copy, deepcopy from pickle import dumps, loads @@ -76,6 +77,9 @@ def __float__(self): assert False, "__float__ should not be invoked" +class DummyFraction(fractions.Fraction): + """Dummy Fraction subclass for copy and deepcopy testing.""" + class GcdTest(unittest.TestCase): def testMisc(self): @@ -286,9 +290,14 @@ self.assertEqual(F(201, 200).limit_denominator(100), F(1)) self.assertEqual(F(201, 200).limit_denominator(101), F(102, 101)) self.assertEqual(F(0).limit_denominator(10000), F(0)) + for i in (0, -1): + self.assertRaisesMessage( + ValueError, "max_denominator should be at least 1", + F(1).limit_denominator, i) def testConversions(self): self.assertTypedEquals(-1, math.trunc(F(-11, 10))) + self.assertTypedEquals(1, math.trunc(F(11, 10))) self.assertTypedEquals(-2, math.floor(F(-11, 10))) self.assertTypedEquals(-1, math.ceil(F(-11, 10))) self.assertTypedEquals(-1, math.ceil(F(-10, 10))) @@ -329,6 +338,7 @@ self.assertEqual(F(8, 27), F(2, 3) ** F(3)) self.assertEqual(F(27, 8), F(2, 3) ** F(-3)) self.assertTypedEquals(2.0, F(4) ** F(1, 2)) + self.assertEqual(F(1, 1), +F(1, 1)) z = pow(F(-1), F(1, 2)) self.assertAlmostEqual(z.real, 0) self.assertEqual(z.imag, 1) @@ -395,6 +405,10 @@ 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)) def testComparisons(self): self.assertTrue(F(1, 2) < F(2, 3)) @@ -538,9 +552,12 @@ self.assertEqual("7", str(F(7, 1))) def testHash(self): + hmod = sys.hash_info.modulus + hinf = sys.hash_info.inf self.assertEqual(hash(2.5), hash(F(5, 2))) self.assertEqual(hash(10**50), hash(F(10**50))) self.assertNotEqual(hash(float(10**23)), hash(F(10**23))) + self.assertEqual(hinf, hash(F(1, hmod))) # Check that __hash__ produces the same value as hash(), for # consistency with int and Decimal. (See issue #10356.) self.assertEqual(hash(F(-1)), F(-1).__hash__()) @@ -574,9 +591,14 @@ def test_copy_deepcopy_pickle(self): r = F(13, 7) + dr = DummyFraction(13, 7) self.assertEqual(r, loads(dumps(r))) self.assertEqual(id(r), id(copy(r))) self.assertEqual(id(r), id(deepcopy(r))) + self.assertNotEqual(id(dr), id(copy(dr))) + self.assertNotEqual(id(dr), id(deepcopy(dr))) + self.assertTypedEquals(dr, copy(dr)) + self.assertTypedEquals(dr, deepcopy(dr)) def test_slots(self): # Issue 4998 -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Feb 29 13:07:12 2012 From: python-checkins at python.org (ezio.melotti) Date: Wed, 29 Feb 2012 13:07:12 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_3=2E2_-=3E_default=29?= =?utf8?q?=3A_=2314089=3A_merge_with_3=2E2=2E?= Message-ID: http://hg.python.org/cpython/rev/90f459e986c8 changeset: 75347:90f459e986c8 parent: 75344:457c3c0cb0a0 parent: 75346:0bbc2549e1ee user: Ezio Melotti date: Wed Feb 29 14:06:56 2012 +0200 summary: #14089: merge with 3.2. files: Lib/test/test_fractions.py | 22 ++++++++++++++++++++++ 1 files changed, 22 insertions(+), 0 deletions(-) diff --git a/Lib/test/test_fractions.py b/Lib/test/test_fractions.py --- a/Lib/test/test_fractions.py +++ b/Lib/test/test_fractions.py @@ -6,6 +6,7 @@ import numbers import operator import fractions +import sys import unittest from copy import copy, deepcopy from pickle import dumps, loads @@ -76,6 +77,9 @@ def __float__(self): assert False, "__float__ should not be invoked" +class DummyFraction(fractions.Fraction): + """Dummy Fraction subclass for copy and deepcopy testing.""" + class GcdTest(unittest.TestCase): def testMisc(self): @@ -286,9 +290,14 @@ self.assertEqual(F(201, 200).limit_denominator(100), F(1)) self.assertEqual(F(201, 200).limit_denominator(101), F(102, 101)) self.assertEqual(F(0).limit_denominator(10000), F(0)) + for i in (0, -1): + self.assertRaisesMessage( + ValueError, "max_denominator should be at least 1", + F(1).limit_denominator, i) def testConversions(self): self.assertTypedEquals(-1, math.trunc(F(-11, 10))) + self.assertTypedEquals(1, math.trunc(F(11, 10))) self.assertTypedEquals(-2, math.floor(F(-11, 10))) self.assertTypedEquals(-1, math.ceil(F(-11, 10))) self.assertTypedEquals(-1, math.ceil(F(-10, 10))) @@ -329,6 +338,7 @@ self.assertEqual(F(8, 27), F(2, 3) ** F(3)) self.assertEqual(F(27, 8), F(2, 3) ** F(-3)) self.assertTypedEquals(2.0, F(4) ** F(1, 2)) + self.assertEqual(F(1, 1), +F(1, 1)) z = pow(F(-1), F(1, 2)) self.assertAlmostEqual(z.real, 0) self.assertEqual(z.imag, 1) @@ -395,6 +405,10 @@ 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)) def testComparisons(self): self.assertTrue(F(1, 2) < F(2, 3)) @@ -538,9 +552,12 @@ self.assertEqual("7", str(F(7, 1))) def testHash(self): + hmod = sys.hash_info.modulus + hinf = sys.hash_info.inf self.assertEqual(hash(2.5), hash(F(5, 2))) self.assertEqual(hash(10**50), hash(F(10**50))) self.assertNotEqual(hash(float(10**23)), hash(F(10**23))) + self.assertEqual(hinf, hash(F(1, hmod))) # Check that __hash__ produces the same value as hash(), for # consistency with int and Decimal. (See issue #10356.) self.assertEqual(hash(F(-1)), F(-1).__hash__()) @@ -574,9 +591,14 @@ def test_copy_deepcopy_pickle(self): r = F(13, 7) + dr = DummyFraction(13, 7) self.assertEqual(r, loads(dumps(r))) self.assertEqual(id(r), id(copy(r))) self.assertEqual(id(r), id(deepcopy(r))) + self.assertNotEqual(id(dr), id(copy(dr))) + self.assertNotEqual(id(dr), id(deepcopy(dr))) + self.assertTypedEquals(dr, copy(dr)) + self.assertTypedEquals(dr, deepcopy(dr)) def test_slots(self): # Issue 4998 -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Feb 29 14:18:24 2012 From: python-checkins at python.org (stefan.krah) Date: Wed, 29 Feb 2012 14:18:24 +0100 Subject: [Python-checkins] =?utf8?b?Y3B5dGhvbiAoMy4yKTogSXNzdWUgIzE0MTUy?= =?utf8?q?=3A_Restore_the_Include/*=2Eh_dependencies_for_extension_builds?= =?utf8?q?=2E?= Message-ID: http://hg.python.org/cpython/rev/1c77eadba9dc changeset: 75348:1c77eadba9dc branch: 3.2 parent: 75346:0bbc2549e1ee user: Stefan Krah date: Wed Feb 29 14:10:53 2012 +0100 summary: Issue #14152: Restore the Include/*.h dependencies for extension builds. files: setup.py | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/setup.py b/setup.py --- a/setup.py +++ b/setup.py @@ -197,7 +197,7 @@ # Python header files headers = [sysconfig.get_config_h_filename()] - headers += glob(os.path.join(sysconfig.get_path('platinclude'), "*.h")) + headers += glob(os.path.join(sysconfig.get_path('include'), "*.h")) for ext in self.extensions[:]: ext.sources = [ find_module_file(filename, moddirlist) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Feb 29 14:18:25 2012 From: python-checkins at python.org (stefan.krah) Date: Wed, 29 Feb 2012 14:18:25 +0100 Subject: [Python-checkins] =?utf8?q?cpython_=28merge_3=2E2_-=3E_default=29?= =?utf8?q?=3A_Issue_=2314152=3A_Merge_fix_from_3=2E2=2E?= Message-ID: http://hg.python.org/cpython/rev/c85812b0e97d changeset: 75349:c85812b0e97d parent: 75347:90f459e986c8 parent: 75348:1c77eadba9dc user: Stefan Krah date: Wed Feb 29 14:14:00 2012 +0100 summary: Issue #14152: Merge fix from 3.2. files: setup.py | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/setup.py b/setup.py --- a/setup.py +++ b/setup.py @@ -195,7 +195,7 @@ # Python header files headers = [sysconfig.get_config_h_filename()] - headers += glob(os.path.join(sysconfig.get_path('platinclude'), "*.h")) + headers += glob(os.path.join(sysconfig.get_path('include'), "*.h")) for ext in self.extensions[:]: ext.sources = [ find_module_file(filename, moddirlist) -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Feb 29 14:18:25 2012 From: python-checkins at python.org (stefan.krah) Date: Wed, 29 Feb 2012 14:18:25 +0100 Subject: [Python-checkins] =?utf8?b?Y3B5dGhvbiAoMi43KTogSXNzdWUgIzE0MTUy?= =?utf8?q?=3A_backport_fix=2E?= Message-ID: http://hg.python.org/cpython/rev/3e2c230f4664 changeset: 75350:3e2c230f4664 branch: 2.7 parent: 75345:8e00de3acb44 user: Stefan Krah date: Wed Feb 29 14:17:18 2012 +0100 summary: Issue #14152: backport fix. files: setup.py | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/setup.py b/setup.py --- a/setup.py +++ b/setup.py @@ -186,7 +186,7 @@ # Python header files headers = [sysconfig.get_config_h_filename()] - headers += glob(os.path.join(sysconfig.get_path('platinclude'), "*.h")) + headers += glob(os.path.join(sysconfig.get_path('include'), "*.h")) for ext in self.extensions[:]: ext.sources = [ find_module_file(filename, moddirlist) for filename in ext.sources ] -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Feb 29 17:54:29 2012 From: python-checkins at python.org (stefan.krah) Date: Wed, 29 Feb 2012 17:54:29 +0100 Subject: [Python-checkins] =?utf8?q?cpython=3A_Add_PyMemoryView=5FFromMemo?= =?utf8?b?cnkoKSB0byB3aGF0c25ldy8zLjMu?= Message-ID: http://hg.python.org/cpython/rev/09e9560d649b changeset: 75351:09e9560d649b parent: 75349:c85812b0e97d user: Stefan Krah date: Wed Feb 29 17:27:21 2012 +0100 summary: Add PyMemoryView_FromMemory() to whatsnew/3.3. files: Doc/c-api/memoryview.rst | 2 ++ Doc/whatsnew/3.3.rst | 4 ++++ 2 files changed, 6 insertions(+), 0 deletions(-) diff --git a/Doc/c-api/memoryview.rst b/Doc/c-api/memoryview.rst --- a/Doc/c-api/memoryview.rst +++ b/Doc/c-api/memoryview.rst @@ -25,6 +25,8 @@ 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*. diff --git a/Doc/whatsnew/3.3.rst b/Doc/whatsnew/3.3.rst --- a/Doc/whatsnew/3.3.rst +++ b/Doc/whatsnew/3.3.rst @@ -906,6 +906,10 @@ Changes to Python's build process and to the C API include: +* New :pep:`3118` related function: + + * :c:func:`PyMemoryView_FromMemory` + * The :pep:`393` added new Unicode types, macros and functions: * High-level API: -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Feb 29 17:54:30 2012 From: python-checkins at python.org (stefan.krah) Date: Wed, 29 Feb 2012 17:54:30 +0100 Subject: [Python-checkins] =?utf8?q?cpython=3A_Issue_=2310181=3A_Add_warni?= =?utf8?q?ng_that_structure_layouts_in_memoryobject=2Eh_and?= Message-ID: http://hg.python.org/cpython/rev/9d3c7dd55c7f changeset: 75352:9d3c7dd55c7f user: Stefan Krah date: Wed Feb 29 17:47:21 2012 +0100 summary: Issue #10181: Add warning that structure layouts in memoryobject.h and object.h have changed. files: Doc/whatsnew/3.3.rst | 9 +++++++++ 1 files changed, 9 insertions(+), 0 deletions(-) diff --git a/Doc/whatsnew/3.3.rst b/Doc/whatsnew/3.3.rst --- a/Doc/whatsnew/3.3.rst +++ b/Doc/whatsnew/3.3.rst @@ -102,6 +102,7 @@ now returns an integer (in accordance with the struct module syntax). For returning a bytes object the view must be cast to 'c' first. +* For further changes see `Build and C API Changes`_ and `Porting C code`_ . .. _pep-393: @@ -1049,6 +1050,14 @@ 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 `, 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 -- Repository URL: http://hg.python.org/cpython From python-checkins at python.org Wed Feb 29 18:58:51 2012 From: python-checkins at python.org (victor.stinner) Date: Wed, 29 Feb 2012 18:58:51 +0100 Subject: [Python-checkins] =?utf8?q?peps=3A_Add_the_PEP_416=3A_Add_a_froze?= =?utf8?q?ndict_builtin_type?= Message-ID: http://hg.python.org/peps/rev/369cd3f69cd2 changeset: 4100:369cd3f69cd2 user: Victor Stinner date: Wed Feb 29 18:58:50 2012 +0100 summary: Add the PEP 416: Add a frozendict builtin type files: pep-0400.txt | 2 +- pep-0410.txt | 2 +- pep-0416.txt | 112 +++++++++++++++++++++++++++++++++++++++ 3 files changed, 114 insertions(+), 2 deletions(-) diff --git a/pep-0400.txt b/pep-0400.txt --- a/pep-0400.txt +++ b/pep-0400.txt @@ -2,7 +2,7 @@ Title: Deprecate codecs.StreamReader and codecs.StreamWriter Version: $Revision$ Last-Modified: $Date$ -Author: Victor Stinner +Author: Victor Stinner Status: Draft Type: Standards Track Content-Type: text/x-rst diff --git a/pep-0410.txt b/pep-0410.txt --- a/pep-0410.txt +++ b/pep-0410.txt @@ -2,7 +2,7 @@ Title: Use decimal.Decimal type for timestamps Version: $Revision$ Last-Modified: $Date$ -Author: Victor Stinner +Author: Victor Stinner Status: Rejected Type: Standards Track Content-Type: text/x-rst diff --git a/pep-0416.txt b/pep-0416.txt new file mode 100644 --- /dev/null +++ b/pep-0416.txt @@ -0,0 +1,112 @@ +PEP: 416 +Title: Add a frozendict builtin type +Version: $Revision$ +Last-Modified: $Date$ +Author: Victor Stinner +Status: Draft +Type: Standards Track +Content-Type: text/x-rst +Created: 29-February-2012 +Python-Version: 3.3 + + +Abstract +======== + +Add a new frozendict builtin type. + + +Rationale +========= + +A frozendict mapping cannot be changed, but its values can be mutable (not +hashable). A frozendict is hashable and so immutable if all values are hashable +(immutable). + +Use cases of frozendict: + + * hashable frozendict can be used as a key of a mapping or as a member of set + * frozendict helps optimization because the mapping is constant + * frozendict avoids the need of a lock when the frozendict is shared + by multiple threads or processes, especially hashable frozendict + + +Constraints +=========== + + * frozendict has to implement the Mapping abstract base class + * frozendict keys and values can be unorderable + * a frozendict is hashable if all keys and values are hashable + * frozendict hash does not depend on the items creation order + + +Implementation +============== + + * Add a PyFrozenDictObject structure based on PyDictObject with an extra + "Py_hash_t hash;" field + * frozendict.__hash__() is implemented using hash(frozenset(self.items())) and + caches the result in its private hash attribute + * Register frozendict has a collections.abc.Mapping + * frozendict can be used with PyDict_GetItem(), but PyDict_SetItem() and + PyDict_DelItem() raise a TypeError + + +Recipe: immutable dict +====================== + +An immutable mapping can be implemented using frozendict:: + + import itertools + + class immutabledict(frozendict): + def __new__(cls, *args, **kw): + # ensure that all values are immutable + for key, value in itertools.chain(args, kw.items()): + if not isinstance(value, (int, float, complex, str, bytes)): + hash(value) + # frozendict ensures that all keys are immutable + return frozendict.__new__(cls, *args, **kw) + + def __repr__(self): + return 'immutabledict' + frozendict.__repr__(self)[10:] + + +Objections +========== + +*namedtuple may fit the requiements of a frozendict.* + +A namedtuple is not a mapping, it does not implement the Mapping abstract base +class. + +*frozendict can be implemented in Python using descriptors" and "frozendict +just need to be practically constant.* + +If frozendict is used to harden Python (security purpose), it must be +implemented in C. A type implemented in C is also faster. + +*The PEP 351 was rejected.* + +The PEP 351 tries to freeze an object and so may convert a mutable object to an +immutable object (using a different type). frozendict doesn't convert anything: +hash(frozendict) raises a TypeError if a value is not hashable. Freezing an +object is not the purpose of this PEP. + + +Links +===== + + * PEP 412: Key-Sharing Dictionary + (`issue #13903 `_) + * PEP 351: The freeze protocol + * `The case for immutable dictionaries; and the central misunderstanding of PEP 351 `_ + * `Frozen dictionaries (Python recipe 414283) `_ + by Oren Tirosh + + +Copyright +========= + +This document has been placed in the public domain. + -- Repository URL: http://hg.python.org/peps From python-checkins at python.org Wed Feb 29 20:45:05 2012 From: python-checkins at python.org (eli.bendersky) Date: Wed, 29 Feb 2012 20:45:05 +0100 Subject: [Python-checkins] =?utf8?q?peps=3A_PEP_411=3A_incorporated_commen?= =?utf8?q?ts_from_pydev_discussions?= Message-ID: http://hg.python.org/peps/rev/78b0a17b50ac changeset: 4101:78b0a17b50ac user: Eli Bendersky date: Wed Feb 29 21:44:39 2012 +0200 summary: PEP 411: incorporated comments from pydev discussions files: pep-0411.txt | 44 ++++++++++++++++++++++++++++----------- 1 files changed, 31 insertions(+), 13 deletions(-) diff --git a/pep-0411.txt b/pep-0411.txt --- a/pep-0411.txt +++ b/pep-0411.txt @@ -39,10 +39,10 @@ "provisional". In the next minor release, the package may either be "graduated" into a normal -"stable" state in the standard library, or be rejected and removed entirely -from the Python source tree. If the package ends up graduating into the -stable state after being provisional for a minor release, its API may be -changed according to accumulated feedback. The core development team +"stable" state in the standard library, remain in provisional state, or be +rejected and removed entirely from the Python source tree. If the package ends +up graduating into the stable state after being provisional, its API may +be changed according to accumulated feedback. The core development team explicitly makes no guarantees about API stability and backward compatibility of provisional packages. @@ -50,19 +50,37 @@ Marking a package provisional ----------------------------- -A package will be marked provisional by including the following paragraph as -a note at the top of its documentation page: +A package will be marked provisional by a notice in its documentation page and +its docstring. The following paragraph will be added as a note at the top of +the documentation page: The package has been included in the standard library on a - provisional basis. While major changes are not anticipated, as long as - this notice remains in place, backwards incompatible changes are - permitted if deemed necessary by the standard library developers. Such - changes will not be made gratuitously - they will occur only if - serious API flaws are uncovered that were missed prior to inclusion of - the package. + provisional basis. Backwards incompatible changes (up to and including + removal of the package) may occur if deemed necessary by the core + developers. + +The phrase "provisional basis" will then be a link to the glossary term +"provisional package", defined as: + + A provisional package is one which has been deliberately excluded from the + standard library's normal 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. + +The following will be added to the start of the packages's docstring: + + The API of this package is currently provisional. Refer to the + documentation for details. Moving a package from the provisional to the stable state simply implies -removing this note from its documentation page. +removing these notes from its documentation page and docstring. Which packages should go through the provisional state -- Repository URL: http://hg.python.org/peps From pje at telecommunity.com Tue Feb 21 00:03:11 2012 From: pje at telecommunity.com (PJ Eby) Date: Mon, 20 Feb 2012 23:03:11 -0000 Subject: [Python-checkins] [Python-Dev] cpython: Issue #14043: Speed up importlib's _FileFinder by at least 8x, and add a new In-Reply-To: References: Message-ID: On Mon, Feb 20, 2012 at 1:20 PM, Brett Cannon wrote: > On Sun, Feb 19, 2012 at 22:15, Nick Coghlan wrote: > >> However, "very cool" on adding the caching in the default importers :) > > > Thanks to PJE for bringing the idea up again and Antoine discovering the > approach *independently* from PJE and myself and actually writing the code. > Where is the code, btw? (I looked at your sandbox and didn't see it.) -------------- next part -------------- An HTML attachment was scrubbed... URL: