From 5dcc06f6e0d7b5d6589085692b86c63e35e2325e Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Thu, 21 Nov 2019 08:51:59 +0100 Subject: [PATCH 001/115] bpo-38858: Allocate small integers on the heap (GH-17301) Allocate small Python integers (small_ints of longobject.c) on the heap, rather than using static objects. --- Objects/longobject.c | 53 +++++++++++++++----------------------------- 1 file changed, 18 insertions(+), 35 deletions(-) diff --git a/Objects/longobject.c b/Objects/longobject.c index 2b57ea18666..294308e3e12 100644 --- a/Objects/longobject.c +++ b/Objects/longobject.c @@ -40,7 +40,7 @@ PyObject *_PyLong_One = NULL; The integers that are preallocated are those in the range -NSMALLNEGINTS (inclusive) to NSMALLPOSINTS (not inclusive). */ -static PyLongObject small_ints[NSMALLNEGINTS + NSMALLPOSINTS]; +static PyLongObject* small_ints[NSMALLNEGINTS + NSMALLPOSINTS] = {0}; #define IS_SMALL_INT(ival) (-NSMALLNEGINTS <= (ival) && (ival) < NSMALLPOSINTS) #define IS_SMALL_UINT(ival) ((ival) < NSMALLPOSINTS) @@ -52,9 +52,8 @@ Py_ssize_t _Py_quick_int_allocs, _Py_quick_neg_int_allocs; static PyObject * get_small_int(sdigit ival) { - PyObject *v; assert(IS_SMALL_INT(ival)); - v = (PyObject *)&small_ints[ival + NSMALLNEGINTS]; + PyObject *v = (PyObject*)small_ints[ival + NSMALLNEGINTS]; Py_INCREF(v); #ifdef COUNT_ALLOCS if (ival >= 0) @@ -5784,40 +5783,30 @@ int _PyLong_Init(void) { #if NSMALLNEGINTS + NSMALLPOSINTS > 0 - int ival, size; - PyLongObject *v = small_ints; + for (Py_ssize_t i=0; i < NSMALLNEGINTS + NSMALLPOSINTS; i++) { + sdigit ival = (sdigit)i - NSMALLNEGINTS; + int size = (ival < 0) ? -1 : ((ival == 0) ? 0 : 1); - for (ival = -NSMALLNEGINTS; ival < NSMALLPOSINTS; ival++, v++) { - size = (ival < 0) ? -1 : ((ival == 0) ? 0 : 1); - if (Py_TYPE(v) == &PyLong_Type) { - /* The element is already initialized, most likely - * the Python interpreter was initialized before. - */ - Py_ssize_t refcnt; - PyObject* op = (PyObject*)v; + PyLongObject *v = _PyLong_New(1); + if (!v) { + return -1; + } - refcnt = Py_REFCNT(op) < 0 ? 0 : Py_REFCNT(op); - _Py_NewReference(op); - /* _Py_NewReference sets the ref count to 1 but - * the ref count might be larger. Set the refcnt - * to the original refcnt + 1 */ - Py_REFCNT(op) = refcnt + 1; - assert(Py_SIZE(op) == size); - assert(v->ob_digit[0] == (digit)abs(ival)); - } - else { - (void)PyObject_INIT(v, &PyLong_Type); - } Py_SIZE(v) = size; v->ob_digit[0] = (digit)abs(ival); + + small_ints[i] = v; } #endif _PyLong_Zero = PyLong_FromLong(0); - if (_PyLong_Zero == NULL) + if (_PyLong_Zero == NULL) { return 0; + } + _PyLong_One = PyLong_FromLong(1); - if (_PyLong_One == NULL) + if (_PyLong_One == NULL) { return 0; + } /* initialize int_info */ if (Int_InfoType.tp_name == NULL) { @@ -5832,17 +5821,11 @@ _PyLong_Init(void) void _PyLong_Fini(void) { - /* Integers are currently statically allocated. Py_DECREF is not - needed, but Python must forget about the reference or multiple - reinitializations will fail. */ Py_CLEAR(_PyLong_One); Py_CLEAR(_PyLong_Zero); #if NSMALLNEGINTS + NSMALLPOSINTS > 0 - int i; - PyLongObject *v = small_ints; - for (i = 0; i < NSMALLNEGINTS + NSMALLPOSINTS; i++, v++) { - _Py_DEC_REFTOTAL; - _Py_ForgetReference((PyObject*)v); + for (Py_ssize_t i = 0; i < NSMALLNEGINTS + NSMALLPOSINTS; i++) { + Py_CLEAR(small_ints[i]); } #endif } From fee552669f21ca294f57fe0df826945edc779090 Mon Sep 17 00:00:00 2001 From: Mark Shannon Date: Thu, 21 Nov 2019 09:11:43 +0000 Subject: [PATCH 002/115] Produce cleaner bytecode for 'with' and 'async with' by generating separate code for normal and exceptional paths. (#6641) Remove BEGIN_FINALLY, END_FINALLY, CALL_FINALLY and POP_FINALLY bytecodes. Implement finally blocks by code duplication. Reimplement frame.lineno setter using line numbers rather than bytecode offsets. --- Doc/library/dis.rst | 85 +- Include/opcode.h | 8 +- Lib/importlib/_bootstrap_external.py | 4 +- Lib/opcode.py | 11 +- Lib/test/test_dis.py | 85 +- Lib/test/test_sys_settrace.py | 2 +- .../2018-03-13-14-46-03.bpo-32949.v821M7.rst | 5 + Objects/frameobject.c | 558 +- Python/ceval.c | 222 +- Python/compile.c | 448 +- Python/importlib.h | 2165 ++++---- Python/importlib_external.h | 4937 +++++++++-------- Python/importlib_zipimport.h | 985 ++-- Python/opcode_targets.h | 16 +- Python/peephole.c | 12 +- 15 files changed, 4789 insertions(+), 4754 deletions(-) create mode 100644 Misc/NEWS.d/next/Core and Builtins/2018-03-13-14-46-03.bpo-32949.v821M7.rst diff --git a/Doc/library/dis.rst b/Doc/library/dis.rst index b5243d0f364..2b55486f3a2 100644 --- a/Doc/library/dis.rst +++ b/Doc/library/dis.rst @@ -706,50 +706,21 @@ iterations of the loop. popped values are used to restore the exception state. -.. opcode:: POP_FINALLY (preserve_tos) +.. opcode:: RERAISE - Cleans up the value stack and the block stack. If *preserve_tos* is not - ``0`` TOS first is popped from the stack and pushed on the stack after - performing other stack operations: + Re-raises the exception currently on top of the stack. - * If TOS is ``NULL`` or an integer (pushed by :opcode:`BEGIN_FINALLY` - or :opcode:`CALL_FINALLY`) it is popped from the stack. - * If TOS is an exception type (pushed when an exception has been raised) - 6 values are popped from the stack, the last three popped values are - used to restore the exception state. An exception handler block is - removed from the block stack. - - It is similar to :opcode:`END_FINALLY`, but doesn't change the bytecode - counter nor raise an exception. Used for implementing :keyword:`break`, - :keyword:`continue` and :keyword:`return` in the :keyword:`finally` block. - - .. versionadded:: 3.8 + .. versionadded:: 3.8 -.. opcode:: BEGIN_FINALLY +.. opcode:: WITH_EXCEPT_START - Pushes ``NULL`` onto the stack for using it in :opcode:`END_FINALLY`, - :opcode:`POP_FINALLY`, :opcode:`WITH_CLEANUP_START` and - :opcode:`WITH_CLEANUP_FINISH`. Starts the :keyword:`finally` block. + Calls the function in position 7 on the stack with the top three + items on the stack as arguments. + Used to implement the call ``context_manager.__exit__(*exc_info())`` when an exception + has occurred in a :keyword:`with` statement. - .. versionadded:: 3.8 - - -.. opcode:: END_FINALLY - - Terminates a :keyword:`finally` clause. The interpreter recalls whether the - exception has to be re-raised or execution has to be continued depending on - the value of TOS. - - * If TOS is ``NULL`` (pushed by :opcode:`BEGIN_FINALLY`) continue from - the next instruction. TOS is popped. - * If TOS is an integer (pushed by :opcode:`CALL_FINALLY`), sets the - bytecode counter to TOS. TOS is popped. - * If TOS is an exception type (pushed when an exception has been raised) - 6 values are popped from the stack, the first three popped values are - used to re-raise the exception and the last three popped values are used - to restore the exception state. An exception handler block is removed - from the block stack. + .. versionadded:: 3.8 .. opcode:: LOAD_ASSERTION_ERROR @@ -780,35 +751,6 @@ iterations of the loop. .. versionadded:: 3.2 -.. opcode:: WITH_CLEANUP_START - - Starts cleaning up the stack when a :keyword:`with` statement block exits. - - At the top of the stack are either ``NULL`` (pushed by - :opcode:`BEGIN_FINALLY`) or 6 values pushed if an exception has been - raised in the with block. Below is the context manager's - :meth:`~object.__exit__` or :meth:`~object.__aexit__` bound method. - - If TOS is ``NULL``, calls ``SECOND(None, None, None)``, - removes the function from the stack, leaving TOS, and pushes ``None`` - to the stack. Otherwise calls ``SEVENTH(TOP, SECOND, THIRD)``, - shifts the bottom 3 values of the stack down, replaces the empty spot - with ``NULL`` and pushes TOS. Finally pushes the result of the call. - - -.. opcode:: WITH_CLEANUP_FINISH - - Finishes cleaning up the stack when a :keyword:`with` statement block exits. - - TOS is result of ``__exit__()`` or ``__aexit__()`` function call pushed - by :opcode:`WITH_CLEANUP_START`. SECOND is ``None`` or an exception type - (pushed when an exception has been raised). - - Pops two values from the stack. If SECOND is not None and TOS is true - unwinds the EXCEPT_HANDLER block which was created when the exception - was caught and pushes ``NULL`` to the stack. - - All of the following opcodes use their arguments. .. opcode:: STORE_NAME (namei) @@ -1060,15 +1002,6 @@ All of the following opcodes use their arguments. stack. *delta* points to the finally block or the first except block. -.. opcode:: CALL_FINALLY (delta) - - Pushes the address of the next instruction onto the stack and increments - bytecode counter by *delta*. Used for calling the finally block as a - "subroutine". - - .. versionadded:: 3.8 - - .. opcode:: LOAD_FAST (var_num) Pushes a reference to the local ``co_varnames[var_num]`` onto the stack. diff --git a/Include/opcode.h b/Include/opcode.h index 95d56014860..712664224dc 100644 --- a/Include/opcode.h +++ b/Include/opcode.h @@ -30,10 +30,11 @@ extern "C" { #define BINARY_TRUE_DIVIDE 27 #define INPLACE_FLOOR_DIVIDE 28 #define INPLACE_TRUE_DIVIDE 29 +#define RERAISE 48 +#define WITH_EXCEPT_START 49 #define GET_AITER 50 #define GET_ANEXT 51 #define BEFORE_ASYNC_WITH 52 -#define BEGIN_FINALLY 53 #define END_ASYNC_FOR 54 #define INPLACE_ADD 55 #define INPLACE_SUBTRACT 56 @@ -59,14 +60,11 @@ extern "C" { #define INPLACE_AND 77 #define INPLACE_XOR 78 #define INPLACE_OR 79 -#define WITH_CLEANUP_START 81 -#define WITH_CLEANUP_FINISH 82 #define RETURN_VALUE 83 #define IMPORT_STAR 84 #define SETUP_ANNOTATIONS 85 #define YIELD_VALUE 86 #define POP_BLOCK 87 -#define END_FINALLY 88 #define POP_EXCEPT 89 #define HAVE_ARGUMENT 90 #define STORE_NAME 90 @@ -127,8 +125,6 @@ extern "C" { #define BUILD_TUPLE_UNPACK_WITH_CALL 158 #define LOAD_METHOD 160 #define CALL_METHOD 161 -#define CALL_FINALLY 162 -#define POP_FINALLY 163 /* EXCEPT_HANDLER is a special, implicit block type which is created when entering an except handler. It is not an opcode but we define it here diff --git a/Lib/importlib/_bootstrap_external.py b/Lib/importlib/_bootstrap_external.py index 825ed77c3d4..d62c6cb77cd 100644 --- a/Lib/importlib/_bootstrap_external.py +++ b/Lib/importlib/_bootstrap_external.py @@ -272,6 +272,8 @@ _code_type = type(_write_atomic.__code__) # only args in ast.arguments #37593) # Python 3.8b4 3413 (Fix "break" and "continue" in "finally" #37830) # Python 3.9a0 3420 (add LOAD_ASSERTION_ERROR #34880) +# Python 3.9a0 3421 (simplified bytecode for with blocks #32949) +# Python 3.9a0 3422 (remove BEGIN_FINALLY, END_FINALLY, CALL_FINALLY, POP_FINALLY bytecodes #33387) # # MAGIC must change whenever the bytecode emitted by the compiler may no # longer be understood by older implementations of the eval loop (usually @@ -280,7 +282,7 @@ _code_type = type(_write_atomic.__code__) # Whenever MAGIC_NUMBER is changed, the ranges in the magic_values array # in PC/launcher.c must also be updated. -MAGIC_NUMBER = (3420).to_bytes(2, 'little') + b'\r\n' +MAGIC_NUMBER = (3422).to_bytes(2, 'little') + b'\r\n' _RAW_MAGIC_NUMBER = int.from_bytes(MAGIC_NUMBER, 'little') # For import.c _PYCACHE = '__pycache__' diff --git a/Lib/opcode.py b/Lib/opcode.py index 0ae0068f2f2..1898a38abbb 100644 --- a/Lib/opcode.py +++ b/Lib/opcode.py @@ -84,10 +84,12 @@ def_op('BINARY_TRUE_DIVIDE', 27) def_op('INPLACE_FLOOR_DIVIDE', 28) def_op('INPLACE_TRUE_DIVIDE', 29) +def_op('RERAISE', 48) +def_op('WITH_EXCEPT_START', 49) def_op('GET_AITER', 50) def_op('GET_ANEXT', 51) def_op('BEFORE_ASYNC_WITH', 52) -def_op('BEGIN_FINALLY', 53) + def_op('END_ASYNC_FOR', 54) def_op('INPLACE_ADD', 55) def_op('INPLACE_SUBTRACT', 56) @@ -115,14 +117,13 @@ def_op('INPLACE_RSHIFT', 76) def_op('INPLACE_AND', 77) def_op('INPLACE_XOR', 78) def_op('INPLACE_OR', 79) -def_op('WITH_CLEANUP_START', 81) -def_op('WITH_CLEANUP_FINISH', 82) + def_op('RETURN_VALUE', 83) def_op('IMPORT_STAR', 84) def_op('SETUP_ANNOTATIONS', 85) def_op('YIELD_VALUE', 86) def_op('POP_BLOCK', 87) -def_op('END_FINALLY', 88) + def_op('POP_EXCEPT', 89) HAVE_ARGUMENT = 90 # Opcodes from here have an argument: @@ -210,7 +211,5 @@ def_op('BUILD_TUPLE_UNPACK_WITH_CALL', 158) name_op('LOAD_METHOD', 160) def_op('CALL_METHOD', 161) -jrel_op('CALL_FINALLY', 162) -def_op('POP_FINALLY', 163) del def_op, name_op, jrel_op, jabs_op diff --git a/Lib/test/test_dis.py b/Lib/test/test_dis.py index fecf203cc9b..5c1595268c5 100644 --- a/Lib/test/test_dis.py +++ b/Lib/test/test_dis.py @@ -278,32 +278,34 @@ dis_traceback = """\ --> 6 BINARY_TRUE_DIVIDE 8 POP_TOP 10 POP_BLOCK - 12 JUMP_FORWARD 40 (to 54) + 12 JUMP_FORWARD 44 (to 58) %3d >> 14 DUP_TOP 16 LOAD_GLOBAL 0 (Exception) 18 COMPARE_OP 10 (exception match) - 20 POP_JUMP_IF_FALSE 52 + 20 POP_JUMP_IF_FALSE 56 22 POP_TOP 24 STORE_FAST 0 (e) 26 POP_TOP - 28 SETUP_FINALLY 10 (to 40) + 28 SETUP_FINALLY 18 (to 48) %3d 30 LOAD_FAST 0 (e) 32 LOAD_ATTR 1 (__traceback__) 34 STORE_FAST 1 (tb) 36 POP_BLOCK - 38 BEGIN_FINALLY - >> 40 LOAD_CONST 0 (None) + 38 POP_EXCEPT + 40 LOAD_CONST 0 (None) 42 STORE_FAST 0 (e) 44 DELETE_FAST 0 (e) - 46 END_FINALLY - 48 POP_EXCEPT - 50 JUMP_FORWARD 2 (to 54) - >> 52 END_FINALLY + 46 JUMP_FORWARD 10 (to 58) + >> 48 LOAD_CONST 0 (None) + 50 STORE_FAST 0 (e) + 52 DELETE_FAST 0 (e) + 54 RERAISE + >> 56 RERAISE -%3d >> 54 LOAD_FAST 1 (tb) - 56 RETURN_VALUE +%3d >> 58 LOAD_FAST 1 (tb) + 60 RETURN_VALUE """ % (TRACEBACK_CODE.co_firstlineno + 1, TRACEBACK_CODE.co_firstlineno + 2, TRACEBACK_CODE.co_firstlineno + 3, @@ -752,7 +754,7 @@ Argument count: 0 Positional-only arguments: 0 Kw-only arguments: 0 Number of locals: 2 -Stack size: 10 +Stack size: 9 Flags: OPTIMIZED, NEWLOCALS, NOFREE, COROUTINE Constants: 0: None @@ -977,10 +979,10 @@ expected_opinfo_jumpy = [ Instruction(opname='LOAD_CONST', opcode=100, arg=6, argval='Who let lolcatz into this test suite?', argrepr="'Who let lolcatz into this test suite?'", offset=96, starts_line=None, is_jump_target=False), Instruction(opname='CALL_FUNCTION', opcode=131, arg=1, argval=1, argrepr='', offset=98, starts_line=None, is_jump_target=False), Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=100, starts_line=None, is_jump_target=False), - Instruction(opname='SETUP_FINALLY', opcode=122, arg=70, argval=174, argrepr='to 174', offset=102, starts_line=20, is_jump_target=True), + Instruction(opname='SETUP_FINALLY', opcode=122, arg=98, argval=202, argrepr='to 202', offset=102, starts_line=20, is_jump_target=True), Instruction(opname='SETUP_FINALLY', opcode=122, arg=12, argval=118, argrepr='to 118', offset=104, starts_line=None, is_jump_target=False), Instruction(opname='LOAD_CONST', opcode=100, arg=5, argval=1, argrepr='1', offset=106, starts_line=21, is_jump_target=False), - Instruction(opname='LOAD_CONST', opcode=100, arg=8, argval=0, argrepr='0', offset=108, starts_line=None, is_jump_target=False), + Instruction(opname='LOAD_CONST', opcode=100, arg=7, argval=0, argrepr='0', offset=108, starts_line=None, is_jump_target=False), Instruction(opname='BINARY_TRUE_DIVIDE', opcode=27, arg=None, argval=None, argrepr='', offset=110, starts_line=None, is_jump_target=False), Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=112, starts_line=None, is_jump_target=False), Instruction(opname='POP_BLOCK', opcode=87, arg=None, argval=None, argrepr='', offset=114, starts_line=None, is_jump_target=False), @@ -993,33 +995,47 @@ expected_opinfo_jumpy = [ Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=128, starts_line=None, is_jump_target=False), Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=130, starts_line=None, is_jump_target=False), Instruction(opname='LOAD_GLOBAL', opcode=116, arg=1, argval='print', argrepr='print', offset=132, starts_line=23, is_jump_target=False), - Instruction(opname='LOAD_CONST', opcode=100, arg=9, argval='Here we go, here we go, here we go...', argrepr="'Here we go, here we go, here we go...'", offset=134, starts_line=None, is_jump_target=False), + Instruction(opname='LOAD_CONST', opcode=100, arg=8, argval='Here we go, here we go, here we go...', argrepr="'Here we go, here we go, here we go...'", offset=134, starts_line=None, is_jump_target=False), Instruction(opname='CALL_FUNCTION', opcode=131, arg=1, argval=1, argrepr='', offset=136, starts_line=None, is_jump_target=False), Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=138, starts_line=None, is_jump_target=False), Instruction(opname='POP_EXCEPT', opcode=89, arg=None, argval=None, argrepr='', offset=140, starts_line=None, is_jump_target=False), - Instruction(opname='JUMP_FORWARD', opcode=110, arg=26, argval=170, argrepr='to 170', offset=142, starts_line=None, is_jump_target=False), - Instruction(opname='END_FINALLY', opcode=88, arg=None, argval=None, argrepr='', offset=144, starts_line=None, is_jump_target=True), + Instruction(opname='JUMP_FORWARD', opcode=110, arg=46, argval=190, argrepr='to 190', offset=142, starts_line=None, is_jump_target=False), + Instruction(opname='RERAISE', opcode=48, arg=None, argval=None, argrepr='', offset=144, starts_line=None, is_jump_target=True), Instruction(opname='LOAD_FAST', opcode=124, arg=0, argval='i', argrepr='i', offset=146, starts_line=25, is_jump_target=True), - Instruction(opname='SETUP_WITH', opcode=143, arg=14, argval=164, argrepr='to 164', offset=148, starts_line=None, is_jump_target=False), + Instruction(opname='SETUP_WITH', opcode=143, arg=24, argval=174, argrepr='to 174', offset=148, starts_line=None, is_jump_target=False), Instruction(opname='STORE_FAST', opcode=125, arg=1, argval='dodgy', argrepr='dodgy', offset=150, starts_line=None, is_jump_target=False), Instruction(opname='LOAD_GLOBAL', opcode=116, arg=1, argval='print', argrepr='print', offset=152, starts_line=26, is_jump_target=False), - Instruction(opname='LOAD_CONST', opcode=100, arg=10, argval='Never reach this', argrepr="'Never reach this'", offset=154, starts_line=None, is_jump_target=False), + Instruction(opname='LOAD_CONST', opcode=100, arg=9, argval='Never reach this', argrepr="'Never reach this'", offset=154, starts_line=None, is_jump_target=False), Instruction(opname='CALL_FUNCTION', opcode=131, arg=1, argval=1, argrepr='', offset=156, starts_line=None, is_jump_target=False), Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=158, starts_line=None, is_jump_target=False), Instruction(opname='POP_BLOCK', opcode=87, arg=None, argval=None, argrepr='', offset=160, starts_line=None, is_jump_target=False), - Instruction(opname='BEGIN_FINALLY', opcode=53, arg=None, argval=None, argrepr='', offset=162, starts_line=None, is_jump_target=False), - Instruction(opname='WITH_CLEANUP_START', opcode=81, arg=None, argval=None, argrepr='', offset=164, starts_line=None, is_jump_target=True), - Instruction(opname='WITH_CLEANUP_FINISH', opcode=82, arg=None, argval=None, argrepr='', offset=166, starts_line=None, is_jump_target=False), - Instruction(opname='END_FINALLY', opcode=88, arg=None, argval=None, argrepr='', offset=168, starts_line=None, is_jump_target=False), - Instruction(opname='POP_BLOCK', opcode=87, arg=None, argval=None, argrepr='', offset=170, starts_line=None, is_jump_target=True), - Instruction(opname='BEGIN_FINALLY', opcode=53, arg=None, argval=None, argrepr='', offset=172, starts_line=None, is_jump_target=False), - Instruction(opname='LOAD_GLOBAL', opcode=116, arg=1, argval='print', argrepr='print', offset=174, starts_line=28, is_jump_target=True), - Instruction(opname='LOAD_CONST', opcode=100, arg=7, argval="OK, now we're done", argrepr='"OK, now we\'re done"', offset=176, starts_line=None, is_jump_target=False), - Instruction(opname='CALL_FUNCTION', opcode=131, arg=1, argval=1, argrepr='', offset=178, starts_line=None, is_jump_target=False), - Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=180, starts_line=None, is_jump_target=False), - Instruction(opname='END_FINALLY', opcode=88, arg=None, argval=None, argrepr='', offset=182, starts_line=None, is_jump_target=False), - Instruction(opname='LOAD_CONST', opcode=100, arg=0, argval=None, argrepr='None', offset=184, starts_line=None, is_jump_target=False), - Instruction(opname='RETURN_VALUE', opcode=83, arg=None, argval=None, argrepr='', offset=186, starts_line=None, is_jump_target=False), + Instruction(opname='LOAD_CONST', opcode=100, arg=0, argval=None, argrepr='None', offset=162, starts_line=None, is_jump_target=False), + Instruction(opname='DUP_TOP', opcode=4, arg=None, argval=None, argrepr='', offset=164, starts_line=None, is_jump_target=False), + Instruction(opname='DUP_TOP', opcode=4, arg=None, argval=None, argrepr='', offset=166, starts_line=None, is_jump_target=False), + Instruction(opname='CALL_FUNCTION', opcode=131, arg=3, argval=3, argrepr='', offset=168, starts_line=None, is_jump_target=False), + Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=170, starts_line=None, is_jump_target=False), + Instruction(opname='JUMP_FORWARD', opcode=110, arg=16, argval=190, argrepr='to 190', offset=172, starts_line=None, is_jump_target=False), + Instruction(opname='WITH_EXCEPT_START', opcode=49, arg=None, argval=None, argrepr='', offset=174, starts_line=None, is_jump_target=True), + Instruction(opname='POP_JUMP_IF_TRUE', opcode=115, arg=180, argval=180, argrepr='', offset=176, starts_line=None, is_jump_target=False), + Instruction(opname='RERAISE', opcode=48, arg=None, argval=None, argrepr='', offset=178, starts_line=None, is_jump_target=False), + Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=180, starts_line=None, is_jump_target=True), + Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=182, starts_line=None, is_jump_target=False), + Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=184, starts_line=None, is_jump_target=False), + Instruction(opname='POP_EXCEPT', opcode=89, arg=None, argval=None, argrepr='', offset=186, starts_line=None, is_jump_target=False), + Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=188, starts_line=None, is_jump_target=False), + Instruction(opname='POP_BLOCK', opcode=87, arg=None, argval=None, argrepr='', offset=190, starts_line=None, is_jump_target=True), + Instruction(opname='LOAD_GLOBAL', opcode=116, arg=1, argval='print', argrepr='print', offset=192, starts_line=28, is_jump_target=False), + Instruction(opname='LOAD_CONST', opcode=100, arg=10, argval="OK, now we're done", argrepr='"OK, now we\'re done"', offset=194, starts_line=None, is_jump_target=False), + Instruction(opname='CALL_FUNCTION', opcode=131, arg=1, argval=1, argrepr='', offset=196, starts_line=None, is_jump_target=False), + Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=198, starts_line=None, is_jump_target=False), + Instruction(opname='JUMP_FORWARD', opcode=110, arg=10, argval=212, argrepr='to 212', offset=200, starts_line=None, is_jump_target=False), + Instruction(opname='LOAD_GLOBAL', opcode=116, arg=1, argval='print', argrepr='print', offset=202, starts_line=None, is_jump_target=True), + Instruction(opname='LOAD_CONST', opcode=100, arg=10, argval="OK, now we're done", argrepr='"OK, now we\'re done"', offset=204, starts_line=None, is_jump_target=False), + Instruction(opname='CALL_FUNCTION', opcode=131, arg=1, argval=1, argrepr='', offset=206, starts_line=None, is_jump_target=False), + Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=208, starts_line=None, is_jump_target=False), + Instruction(opname='RERAISE', opcode=48, arg=None, argval=None, argrepr='', offset=210, starts_line=None, is_jump_target=False), + Instruction(opname='LOAD_CONST', opcode=100, arg=0, argval=None, argrepr='None', offset=212, starts_line=None, is_jump_target=True), + Instruction(opname='RETURN_VALUE', opcode=83, arg=None, argval=None, argrepr='', offset=214, starts_line=None, is_jump_target=False) ] # One last piece of inspect fodder to check the default line number handling @@ -1032,6 +1048,10 @@ expected_opinfo_simple = [ class InstructionTests(BytecodeTestCase): + def __init__(self, *args): + super().__init__(*args) + self.maxDiff = None + def test_default_first_line(self): actual = dis.get_instructions(simple) self.assertEqual(list(actual), expected_opinfo_simple) @@ -1063,6 +1083,7 @@ class InstructionTests(BytecodeTestCase): # get_instructions has its own tests above, so can rely on it to validate # the object oriented API class BytecodeTests(unittest.TestCase): + def test_instantiation(self): # Test with function, method, code string and code object for obj in [_f, _C(1).__init__, "a=1", _f.__code__]: diff --git a/Lib/test/test_sys_settrace.py b/Lib/test/test_sys_settrace.py index d4e1ac2c83e..0af015aa56b 100644 --- a/Lib/test/test_sys_settrace.py +++ b/Lib/test/test_sys_settrace.py @@ -1431,7 +1431,7 @@ output.append(4) 1 / 0 @jump_test(3, 2, [2], event='return', error=(ValueError, - "can't jump from a yield statement")) + "can't jump from a 'yield' statement")) def test_no_jump_from_yield(output): def gen(): output.append(2) diff --git a/Misc/NEWS.d/next/Core and Builtins/2018-03-13-14-46-03.bpo-32949.v821M7.rst b/Misc/NEWS.d/next/Core and Builtins/2018-03-13-14-46-03.bpo-32949.v821M7.rst new file mode 100644 index 00000000000..16b3058ee68 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2018-03-13-14-46-03.bpo-32949.v821M7.rst @@ -0,0 +1,5 @@ +Removed WITH_CLEANUP_START, WITH_CLEANUP_FINISH, BEGIN_FINALLY, END_FINALLY, CALL_FINALLY and POP_FINALLY bytecodes. +Replaced with RERAISE and WITH_EXCEPT_FINISH bytecodes. +The compiler now generates different code for exceptional and non-exceptional branches for 'with' and 'try-except' +statements. For 'try-finally' statements the 'finally' block is replicated for each exit from the 'try' body. + diff --git a/Objects/frameobject.c b/Objects/frameobject.c index 27ef9ff2590..d7acb41f7a3 100644 --- a/Objects/frameobject.c +++ b/Objects/frameobject.c @@ -66,6 +66,285 @@ get_arg(const _Py_CODEUNIT *codestr, Py_ssize_t i) return oparg; } +typedef struct _codetracker { + unsigned char *code; + Py_ssize_t code_len; + unsigned char *lnotab; + Py_ssize_t lnotab_len; + int start_line; + int offset; + int line; + int addr; + int line_addr; +} codetracker; + +/* Reset the mutable parts of the tracker */ +static void +reset(codetracker *tracker) +{ + tracker->offset = 0; + tracker->addr = 0; + tracker->line_addr = 0; + tracker->line = tracker->start_line; +} + +/* Initialise the tracker */ +static void +init_codetracker(codetracker *tracker, PyCodeObject *code_obj) +{ + PyBytes_AsStringAndSize(code_obj->co_code, + (char **)&tracker->code, &tracker->code_len); + PyBytes_AsStringAndSize(code_obj->co_lnotab, + (char **)&tracker->lnotab, &tracker->lnotab_len); + tracker->start_line = code_obj->co_firstlineno; + reset(tracker); +} + +static void +advance_tracker(codetracker *tracker) +{ + tracker->addr += sizeof(_Py_CODEUNIT); + if (tracker->offset >= tracker->lnotab_len) { + return; + } + while (tracker->offset < tracker->lnotab_len && + tracker->addr >= tracker->line_addr + tracker->lnotab[tracker->offset]) { + tracker->line_addr += tracker->lnotab[tracker->offset]; + tracker->line += (signed char)tracker->lnotab[tracker->offset+1]; + tracker->offset += 2; + } +} + + +static void +retreat_tracker(codetracker *tracker) +{ + tracker->addr -= sizeof(_Py_CODEUNIT); + while (tracker->addr < tracker->line_addr) { + tracker->offset -= 2; + tracker->line_addr -= tracker->lnotab[tracker->offset]; + tracker->line -= (signed char)tracker->lnotab[tracker->offset+1]; + } +} + +static int +move_to_addr(codetracker *tracker, int addr) +{ + while (addr > tracker->addr) { + advance_tracker(tracker); + if (tracker->addr >= tracker->code_len) { + return -1; + } + } + while (addr < tracker->addr) { + retreat_tracker(tracker); + if (tracker->addr < 0) { + return -1; + } + } + return 0; +} + +static int +first_line_not_before(codetracker *tracker, int line) +{ + int result = INT_MAX; + reset(tracker); + while (tracker->addr < tracker->code_len) { + if (tracker->line == line) { + return line; + } + if (tracker->line > line && tracker->line < result) { + result = tracker->line; + } + advance_tracker(tracker); + } + if (result == INT_MAX) { + return -1; + } + return result; +} + +static int +move_to_nearest_start_of_line(codetracker *tracker, int line) +{ + if (line > tracker->line) { + while (line != tracker->line) { + advance_tracker(tracker); + if (tracker->addr >= tracker->code_len) { + return -1; + } + } + } + else { + while (line != tracker->line) { + retreat_tracker(tracker); + if (tracker->addr < 0) { + return -1; + } + } + while (tracker->addr > tracker->line_addr) { + retreat_tracker(tracker); + } + } + return 0; +} + +typedef struct _blockitem +{ + unsigned char kind; + int end_addr; + int start_line; +} blockitem; + +typedef struct _blockstack +{ + blockitem stack[CO_MAXBLOCKS]; + int depth; +} blockstack; + + +static void +init_blockstack(blockstack *blocks) +{ + blocks->depth = 0; +} + +static void +push_block(blockstack *blocks, unsigned char kind, + int end_addr, int start_line) +{ + assert(blocks->depth < CO_MAXBLOCKS); + blocks->stack[blocks->depth].kind = kind; + blocks->stack[blocks->depth].end_addr = end_addr; + blocks->stack[blocks->depth].start_line = start_line; + blocks->depth++; +} + +static unsigned char +pop_block(blockstack *blocks) +{ + assert(blocks->depth > 0); + blocks->depth--; + return blocks->stack[blocks->depth].kind; +} + +static blockitem * +top_block(blockstack *blocks) +{ + assert(blocks->depth > 0); + return &blocks->stack[blocks->depth-1]; +} + +static inline int +is_try_except(unsigned char op, int target_op) +{ + return op == SETUP_FINALLY && (target_op == DUP_TOP || target_op == POP_TOP); +} + +static inline int +is_async_for(unsigned char op, int target_op) +{ + return op == SETUP_FINALLY && target_op == END_ASYNC_FOR; +} + +static inline int +is_try_finally(unsigned char op, int target_op) +{ + return op == SETUP_FINALLY && !is_try_except(op, target_op) && !is_async_for(op, target_op); +} + +/* Kind for finding except blocks in the jump to line code */ +#define TRY_EXCEPT 250 + +static int +block_stack_for_line(codetracker *tracker, int line, blockstack *blocks) +{ + if (line < tracker->start_line) { + return -1; + } + init_blockstack(blocks); + reset(tracker); + while (tracker->addr < tracker->code_len) { + if (tracker->line == line) { + return 0; + } + if (blocks->depth > 0 && tracker->addr == top_block(blocks)->end_addr) { + unsigned char kind = pop_block(blocks); + assert(kind != SETUP_FINALLY); + if (kind == TRY_EXCEPT) { + push_block(blocks, POP_EXCEPT, -1, tracker->line); + } + if (kind == SETUP_WITH || kind == SETUP_ASYNC_WITH) { + push_block(blocks, WITH_EXCEPT_START, -1, tracker->line); + } + } + unsigned char op = tracker->code[tracker->addr]; + if (op == SETUP_FINALLY || op == SETUP_ASYNC_WITH || op == SETUP_WITH || op == FOR_ITER) { + unsigned int oparg = get_arg((const _Py_CODEUNIT *)tracker->code, + tracker->addr / sizeof(_Py_CODEUNIT)); + int target_addr = tracker->addr + oparg + sizeof(_Py_CODEUNIT); + int target_op = tracker->code[target_addr]; + if (is_async_for(op, target_op)) { + push_block(blocks, FOR_ITER, target_addr, tracker->line); + } + else if (op == FOR_ITER) { + push_block(blocks, FOR_ITER, target_addr-sizeof(_Py_CODEUNIT), tracker->line); + } + else if (is_try_except(op, target_op)) { + push_block(blocks, TRY_EXCEPT, target_addr-sizeof(_Py_CODEUNIT), tracker->line); + } + else if (is_try_finally(op, target_op)) { + int addr = tracker->addr; + // Skip over duplicate 'finally' blocks if line is after body. + move_to_addr(tracker, target_addr); + if (tracker->line > line) { + // Target is in body, rewind to start. + move_to_addr(tracker, addr); + push_block(blocks, op, target_addr, tracker->line); + } + else { + // Now in finally block. + push_block(blocks, RERAISE, -1, tracker->line); + } + } + else { + push_block(blocks, op, target_addr, tracker->line); + } + } + else if (op == RERAISE) { + assert(blocks->depth > 0); + unsigned char kind = top_block(blocks)->kind; + if (kind == RERAISE || kind == WITH_EXCEPT_START || kind == POP_EXCEPT) { + pop_block(blocks); + } + + } + advance_tracker(tracker); + } + return -1; +} + +static void +frame_stack_pop(PyFrameObject *f) +{ + PyObject *v = (*--f->f_stacktop); + Py_DECREF(v); +} + +static void +frame_block_unwind(PyFrameObject *f) +{ + assert(f->f_iblock > 0); + f->f_iblock--; + PyTryBlock *b = &f->f_blockstack[f->f_iblock]; + int delta = (f->f_stacktop - f->f_valuestack) - b->b_level; + while (delta > 0) { + frame_stack_pop(f); + delta--; + } +} + /* Setter for f_lineno - you can set f_lineno from within a trace function in * order to jump to a given line of code, subject to some restrictions. Most @@ -77,7 +356,8 @@ get_arg(const _Py_CODEUNIT *codestr, Py_ssize_t i) * o Lines with an 'except' statement on them can't be jumped to, because * they expect an exception to be on the top of the stack. * o Lines that live in a 'finally' block can't be jumped from or to, since - * the END_FINALLY expects to clean up the stack after the 'try' block. + * we cannot be sure which state the interpreter was in or would be in + * during execution of the finally block. * o 'try', 'with' and 'async with' blocks can't be jumped into because * the blockstack needs to be set up before their code runs. * o 'for' and 'async for' loops can't be jumped into because the @@ -89,22 +369,6 @@ get_arg(const _Py_CODEUNIT *codestr, Py_ssize_t i) static int frame_setlineno(PyFrameObject *f, PyObject* p_new_lineno, void *Py_UNUSED(ignored)) { - int new_lineno = 0; /* The new value of f_lineno */ - long l_new_lineno; - int overflow; - int new_lasti = 0; /* The new value of f_lasti */ - unsigned char *code = NULL; /* The bytecode for the frame... */ - Py_ssize_t code_len = 0; /* ...and its length */ - unsigned char *lnotab = NULL; /* Iterating over co_lnotab */ - Py_ssize_t lnotab_len = 0; /* (ditto) */ - int offset = 0; /* (ditto) */ - int line = 0; /* (ditto) */ - int addr = 0; /* (ditto) */ - int delta_iblock = 0; /* Scanning the SETUPs and POPs */ - int delta = 0; - int blockstack[CO_MAXBLOCKS]; /* Walking the 'finally' blocks */ - int blockstack_top = 0; /* (ditto) */ - if (p_new_lineno == NULL) { PyErr_SetString(PyExc_AttributeError, "cannot delete attribute"); return -1; @@ -145,189 +409,131 @@ frame_setlineno(PyFrameObject *f, PyObject* p_new_lineno, void *Py_UNUSED(ignore return -1; } - /* Fail if the line comes before the start of the code block. */ - l_new_lineno = PyLong_AsLongAndOverflow(p_new_lineno, &overflow); - if (overflow -#if SIZEOF_LONG > SIZEOF_INT - || l_new_lineno > INT_MAX - || l_new_lineno < INT_MIN -#endif - ) { - PyErr_SetString(PyExc_ValueError, - "lineno out of range"); - return -1; - } - new_lineno = (int)l_new_lineno; - if (new_lineno < f->f_code->co_firstlineno) { - PyErr_Format(PyExc_ValueError, - "line %d comes before the current code block", - new_lineno); - return -1; - } - else if (new_lineno == f->f_code->co_firstlineno) { - new_lasti = 0; - new_lineno = f->f_code->co_firstlineno; - } - else { - /* Find the bytecode offset for the start of the given - * line, or the first code-owning line after it. */ - char *tmp; - PyBytes_AsStringAndSize(f->f_code->co_lnotab, - &tmp, &lnotab_len); - lnotab = (unsigned char *) tmp; - addr = 0; - line = f->f_code->co_firstlineno; - new_lasti = -1; - for (offset = 0; offset < lnotab_len; offset += 2) { - addr += lnotab[offset]; - line += (signed char)lnotab[offset+1]; - if (line >= new_lineno) { - new_lasti = addr; - new_lineno = line; - break; - } + codetracker tracker; + init_codetracker(&tracker, f->f_code); + move_to_addr(&tracker, f->f_lasti); + int current_line = tracker.line; + assert(current_line >= 0); + int new_lineno; + + { + /* Fail if the line falls outside the code block and + select first line with actual code. */ + int overflow; + long l_new_lineno = PyLong_AsLongAndOverflow(p_new_lineno, &overflow); + if (overflow +#if SIZEOF_LONG > SIZEOF_INT + || l_new_lineno > INT_MAX + || l_new_lineno < INT_MIN +#endif + ) { + PyErr_SetString(PyExc_ValueError, + "lineno out of range"); + return -1; + } + new_lineno = (int)l_new_lineno; + + if (new_lineno < f->f_code->co_firstlineno) { + PyErr_Format(PyExc_ValueError, + "line %d comes before the current code block", + new_lineno); + return -1; + } + + new_lineno = first_line_not_before(&tracker, new_lineno); + if (new_lineno < 0) { + PyErr_Format(PyExc_ValueError, + "line %d comes after the current code block", + (int)l_new_lineno); + return -1; } } - /* If we didn't reach the requested line, return an error. */ - if (new_lasti == -1) { - PyErr_Format(PyExc_ValueError, - "line %d comes after the current code block", - new_lineno); + if (tracker.code[f->f_lasti] == YIELD_VALUE || tracker.code[f->f_lasti] == YIELD_FROM) { + PyErr_SetString(PyExc_ValueError, + "can't jump from a 'yield' statement"); return -1; } - /* We're now ready to look at the bytecode. */ - PyBytes_AsStringAndSize(f->f_code->co_code, (char **)&code, &code_len); + /* Find block stack for current line and target line. */ + blockstack current_stack, new_stack; + block_stack_for_line(&tracker, new_lineno, &new_stack); + block_stack_for_line(&tracker, current_line, ¤t_stack); /* The trace function is called with a 'return' trace event after the * execution of a yield statement. */ - assert(f->f_lasti != -1); - if (code[f->f_lasti] == YIELD_VALUE || code[f->f_lasti] == YIELD_FROM) { - PyErr_SetString(PyExc_ValueError, - "can't jump from a yield statement"); - return -1; - } - - /* You can't jump onto a line with an 'except' statement on it - - * they expect to have an exception on the top of the stack, which - * won't be true if you jump to them. They always start with code - * that either pops the exception using POP_TOP (plain 'except:' - * lines do this) or duplicates the exception on the stack using - * DUP_TOP (if there's an exception type specified). See compile.c, - * 'com_try_except' for the full details. There aren't any other - * cases (AFAIK) where a line's code can start with DUP_TOP or - * POP_TOP, but if any ever appear, they'll be subject to the same - * restriction (but with a different error message). */ - if (code[new_lasti] == DUP_TOP || code[new_lasti] == POP_TOP) { + if (tracker.code[tracker.addr] == DUP_TOP || tracker.code[tracker.addr] == POP_TOP) { PyErr_SetString(PyExc_ValueError, "can't jump to 'except' line as there's no exception"); return -1; } - /* You can't jump into or out of a 'finally' block because the 'try' - * block leaves something on the stack for the END_FINALLY to clean up. - * So we walk the bytecode, maintaining a simulated blockstack. - * 'blockstack' is a stack of the bytecode addresses of the starts of - * the 'finally' blocks. */ - memset(blockstack, '\0', sizeof(blockstack)); - blockstack_top = 0; - unsigned char prevop = NOP; - for (addr = 0; addr < code_len; addr += sizeof(_Py_CODEUNIT)) { - unsigned char op = code[addr]; - switch (op) { + /* Validate change of block stack. */ + if (new_stack.depth > 0) { + blockitem *current_block_at_new_depth = &(current_stack.stack[new_stack.depth-1]); + if (new_stack.depth > current_stack.depth || + top_block(&new_stack)->start_line != current_block_at_new_depth->start_line) { + unsigned char target_kind = top_block(&new_stack)->kind; + char *msg; + if (target_kind == POP_EXCEPT) { + msg = "can't jump into an 'except' block as there's no exception"; + } + else if (target_kind == RERAISE) { + msg = "can't jump into a 'finally' block"; + } + else { + msg = "can't jump into the middle of a block"; + } + PyErr_SetString(PyExc_ValueError, msg); + return -1; + } + } + + /* Check for illegal jumps out of finally or except blocks. */ + for (int depth = new_stack.depth; depth < current_stack.depth; depth++) { + switch(current_stack.stack[depth].kind) { + case RERAISE: + PyErr_SetString(PyExc_ValueError, + "can't jump out of a 'finally' block"); + return -1; + case POP_EXCEPT: + PyErr_SetString(PyExc_ValueError, + "can't jump out of an 'except' block"); + return -1; + } + } + + /* Unwind block stack. */ + while (current_stack.depth > new_stack.depth) { + unsigned char kind = pop_block(¤t_stack); + switch(kind) { + case FOR_ITER: + frame_stack_pop(f); + break; case SETUP_FINALLY: + case TRY_EXCEPT: + frame_block_unwind(f); + break; case SETUP_WITH: case SETUP_ASYNC_WITH: - case FOR_ITER: { - unsigned int oparg = get_arg((const _Py_CODEUNIT *)code, - addr / sizeof(_Py_CODEUNIT)); - int target_addr = addr + oparg + sizeof(_Py_CODEUNIT); - assert(target_addr < code_len); - /* Police block-jumping (you can't jump into the middle of a block) - * and ensure that the blockstack finishes up in a sensible state (by - * popping any blocks we're jumping out of). We look at all the - * blockstack operations between the current position and the new - * one, and keep track of how many blocks we drop out of on the way. - * By also keeping track of the lowest blockstack position we see, we - * can tell whether the jump goes into any blocks without coming out - * again - in that case we raise an exception below. */ - int first_in = addr < f->f_lasti && f->f_lasti < target_addr; - int second_in = addr < new_lasti && new_lasti < target_addr; - if (!first_in && second_in) { - PyErr_SetString(PyExc_ValueError, - "can't jump into the middle of a block"); - return -1; - } - int in_for_loop = op == FOR_ITER || code[target_addr] == END_ASYNC_FOR; - if (first_in && !second_in) { - if (!delta_iblock) { - if (in_for_loop) { - /* Pop the iterators of any 'for' and 'async for' loop - * we're jumping out of. */ - delta++; - } - else if (prevop == LOAD_CONST) { - /* Pops None pushed before SETUP_FINALLY. */ - delta++; - } - } - if (!in_for_loop) { - delta_iblock++; - } - } - if (!in_for_loop) { - blockstack[blockstack_top++] = target_addr; - } + frame_block_unwind(f); + // Pop the exit function + frame_stack_pop(f); break; - } - - case END_FINALLY: { - assert(blockstack_top > 0); - int target_addr = blockstack[--blockstack_top]; - assert(target_addr <= addr); - int first_in = target_addr <= f->f_lasti && f->f_lasti <= addr; - int second_in = target_addr <= new_lasti && new_lasti <= addr; - if (first_in != second_in) { - op = code[target_addr]; - PyErr_Format(PyExc_ValueError, - "can't jump %s %s block", - second_in ? "into" : "out of", - (op == DUP_TOP || op == POP_TOP) ? - "an 'except'" : "a 'finally'"); - return -1; - } - break; - } - } - prevop = op; - } - - /* Verify that the blockstack tracking code didn't get lost. */ - assert(blockstack_top == 0); - - /* Pop any blocks that we're jumping out of. */ - if (delta_iblock > 0) { - f->f_iblock -= delta_iblock; - PyTryBlock *b = &f->f_blockstack[f->f_iblock]; - delta += (int)(f->f_stacktop - f->f_valuestack) - b->b_level; - if (b->b_type == SETUP_FINALLY && - code[b->b_handler] == WITH_CLEANUP_START) - { - /* Pop the exit function. */ - delta++; + default: + PyErr_SetString(PyExc_SystemError, + "unexpected block kind"); + return -1; } } - while (delta > 0) { - PyObject *v = (*--f->f_stacktop); - Py_DECREF(v); - delta--; - } + + move_to_addr(&tracker, f->f_lasti); + move_to_nearest_start_of_line(&tracker, new_lineno); /* Finally set the new f_lineno and f_lasti and return OK. */ f->f_lineno = new_lineno; - f->f_lasti = new_lasti; + f->f_lasti = tracker.addr; return 0; } diff --git a/Python/ceval.c b/Python/ceval.c index ee13fd1ad70..96ed329b0d9 100644 --- a/Python/ceval.c +++ b/Python/ceval.c @@ -79,7 +79,7 @@ static PyObject * unicode_concatenate(PyThreadState *, PyObject *, PyObject *, static PyObject * special_lookup(PyThreadState *, PyObject *, _Py_Identifier *); static int check_args_iterable(PyThreadState *, PyObject *func, PyObject *vararg); static void format_kwargs_error(PyThreadState *, PyObject *func, PyObject *kwargs); -static void format_awaitable_error(PyThreadState *, PyTypeObject *, int); +static void format_awaitable_error(PyThreadState *, PyTypeObject *, int, int); #define NAME_ERROR_MSG \ "name '%.200s' is not defined" @@ -2017,7 +2017,12 @@ main_loop: PyObject *iter = _PyCoro_GetAwaitableIter(iterable); if (iter == NULL) { + int opcode_at_minus_3 = 0; + if ((next_instr - first_instr) > 2) { + opcode_at_minus_3 = _Py_OPCODE(next_instr[-3]); + } format_awaitable_error(tstate, Py_TYPE(iterable), + opcode_at_minus_3, _Py_OPCODE(next_instr[-2])); } @@ -2128,104 +2133,13 @@ main_loop: DISPATCH(); } - case TARGET(POP_FINALLY): { - /* If oparg is 0 at the top of the stack are 1 or 6 values: - Either: - - TOP = NULL or an integer - or: - - (TOP, SECOND, THIRD) = exc_info() - - (FOURTH, FITH, SIXTH) = previous exception for EXCEPT_HANDLER - - If oparg is 1 the value for 'return' was additionally pushed - at the top of the stack. - */ - PyObject *res = NULL; - if (oparg) { - res = POP(); - } + case TARGET(RERAISE): { PyObject *exc = POP(); - if (exc == NULL || PyLong_CheckExact(exc)) { - Py_XDECREF(exc); - } - else { - Py_DECREF(exc); - Py_DECREF(POP()); - Py_DECREF(POP()); - - PyObject *type, *value, *traceback; - _PyErr_StackItem *exc_info; - PyTryBlock *b = PyFrame_BlockPop(f); - if (b->b_type != EXCEPT_HANDLER) { - _PyErr_SetString(tstate, PyExc_SystemError, - "popped block is not an except handler"); - Py_XDECREF(res); - goto error; - } - assert(STACK_LEVEL() == (b)->b_level + 3); - exc_info = tstate->exc_info; - type = exc_info->exc_type; - value = exc_info->exc_value; - traceback = exc_info->exc_traceback; - exc_info->exc_type = POP(); - exc_info->exc_value = POP(); - exc_info->exc_traceback = POP(); - Py_XDECREF(type); - Py_XDECREF(value); - Py_XDECREF(traceback); - } - if (oparg) { - PUSH(res); - } - DISPATCH(); - } - - case TARGET(CALL_FINALLY): { - PyObject *ret = PyLong_FromLong(INSTR_OFFSET()); - if (ret == NULL) { - goto error; - } - PUSH(ret); - JUMPBY(oparg); - FAST_DISPATCH(); - } - - case TARGET(BEGIN_FINALLY): { - /* Push NULL onto the stack for using it in END_FINALLY, - POP_FINALLY, WITH_CLEANUP_START and WITH_CLEANUP_FINISH. - */ - PUSH(NULL); - FAST_DISPATCH(); - } - - case TARGET(END_FINALLY): { - PREDICTED(END_FINALLY); - /* At the top of the stack are 1 or 6 values: - Either: - - TOP = NULL or an integer - or: - - (TOP, SECOND, THIRD) = exc_info() - - (FOURTH, FITH, SIXTH) = previous exception for EXCEPT_HANDLER - */ - PyObject *exc = POP(); - if (exc == NULL) { - FAST_DISPATCH(); - } - else if (PyLong_CheckExact(exc)) { - int ret = _PyLong_AsInt(exc); - Py_DECREF(exc); - if (ret == -1 && _PyErr_Occurred(tstate)) { - goto error; - } - JUMPTO(ret); - FAST_DISPATCH(); - } - else { - assert(PyExceptionClass_Check(exc)); - PyObject *val = POP(); - PyObject *tb = POP(); - _PyErr_Restore(tstate, exc, val, tb); - goto exception_unwind; - } + PyObject *val = POP(); + PyObject *tb = POP(); + assert(PyExceptionClass_Check(exc)); + PyErr_Restore(exc, val, tb); + goto exception_unwind; } case TARGET(END_ASYNC_FOR): { @@ -3302,111 +3216,31 @@ main_loop: DISPATCH(); } - case TARGET(WITH_CLEANUP_START): { - /* At the top of the stack are 1 or 6 values indicating - how/why we entered the finally clause: - - TOP = NULL + case TARGET(WITH_EXCEPT_START): { + /* At the top of the stack are 7 values: - (TOP, SECOND, THIRD) = exc_info() - (FOURTH, FITH, SIXTH) = previous exception for EXCEPT_HANDLER - Below them is EXIT, the context.__exit__ or context.__aexit__ - bound method. - In the first case, we must call - EXIT(None, None, None) - otherwise we must call - EXIT(TOP, SECOND, THIRD) - - In the first case, we remove EXIT from the - stack, leaving TOP, and push TOP on the stack. - Otherwise we shift the bottom 3 values of the - stack down, replace the empty spot with NULL, and push - None on the stack. - - Finally we push the result of the call. + - (FOURTH, FIFTH, SIXTH) = previous exception for EXCEPT_HANDLER + - SEVENTH: the context.__exit__ bound method + We call SEVENTH(TOP, SECOND, THIRD). + Then we push again the TOP exception and the __exit__ + return value. */ PyObject *exit_func; PyObject *exc, *val, *tb, *res; - val = tb = Py_None; exc = TOP(); - if (exc == NULL) { - STACK_SHRINK(1); - exit_func = TOP(); - SET_TOP(exc); - exc = Py_None; - } - else { - assert(PyExceptionClass_Check(exc)); - PyObject *tp2, *exc2, *tb2; - PyTryBlock *block; - val = SECOND(); - tb = THIRD(); - tp2 = FOURTH(); - exc2 = PEEK(5); - tb2 = PEEK(6); - exit_func = PEEK(7); - SET_VALUE(7, tb2); - SET_VALUE(6, exc2); - SET_VALUE(5, tp2); - /* UNWIND_EXCEPT_HANDLER will pop this off. */ - SET_FOURTH(NULL); - /* We just shifted the stack down, so we have - to tell the except handler block that the - values are lower than it expects. */ - assert(f->f_iblock > 0); - block = &f->f_blockstack[f->f_iblock - 1]; - assert(block->b_type == EXCEPT_HANDLER); - assert(block->b_level > 0); - block->b_level--; - } - + val = SECOND(); + tb = THIRD(); + assert(exc != Py_None); + assert(!PyLong_Check(exc)); + exit_func = PEEK(7); PyObject *stack[4] = {NULL, exc, val, tb}; res = _PyObject_Vectorcall(exit_func, stack + 1, 3 | PY_VECTORCALL_ARGUMENTS_OFFSET, NULL); - Py_DECREF(exit_func); if (res == NULL) goto error; - Py_INCREF(exc); /* Duplicating the exception on the stack */ - PUSH(exc); PUSH(res); - PREDICT(WITH_CLEANUP_FINISH); - DISPATCH(); - } - - case TARGET(WITH_CLEANUP_FINISH): { - PREDICTED(WITH_CLEANUP_FINISH); - /* TOP = the result of calling the context.__exit__ bound method - SECOND = either None or exception type - - If SECOND is None below is NULL or the return address, - otherwise below are 7 values representing an exception. - */ - PyObject *res = POP(); - PyObject *exc = POP(); - int err; - - if (exc != Py_None) - err = PyObject_IsTrue(res); - else - err = 0; - - Py_DECREF(res); - Py_DECREF(exc); - - if (err < 0) - goto error; - else if (err > 0) { - /* There was an exception and a True return. - * We must manually unwind the EXCEPT_HANDLER block - * which was created when the exception was caught, - * otherwise the stack will be in an inconsistent state. - */ - PyTryBlock *b = PyFrame_BlockPop(f); - assert(b->b_type == EXCEPT_HANDLER); - UNWIND_EXCEPT_HANDLER(b); - PUSH(NULL); - } - PREDICT(END_FINALLY); DISPATCH(); } @@ -3776,6 +3610,10 @@ exception_unwind: PUSH(val); PUSH(exc); JUMPTO(handler); + if (_Py_TracingPossible(ceval)) { + /* Make sure that we trace line after exception */ + instr_prev = INT_MAX; + } /* Resume normal execution */ goto main_loop; } @@ -5477,7 +5315,7 @@ format_exc_unbound(PyThreadState *tstate, PyCodeObject *co, int oparg) } static void -format_awaitable_error(PyThreadState *tstate, PyTypeObject *type, int prevopcode) +format_awaitable_error(PyThreadState *tstate, PyTypeObject *type, int prevprevopcode, int prevopcode) { if (type->tp_as_async == NULL || type->tp_as_async->am_await == NULL) { if (prevopcode == BEFORE_ASYNC_WITH) { @@ -5486,7 +5324,7 @@ format_awaitable_error(PyThreadState *tstate, PyTypeObject *type, int prevopcode "that does not implement __await__: %.100s", type->tp_name); } - else if (prevopcode == WITH_CLEANUP_START) { + else if (prevopcode == WITH_EXCEPT_START || (prevopcode == CALL_FUNCTION && prevprevopcode == DUP_TOP)) { _PyErr_Format(tstate, PyExc_TypeError, "'async with' received an object from __aexit__ " "that does not implement __await__: %.100s", diff --git a/Python/compile.c b/Python/compile.c index f26ad3c7752..f56c015fb96 100644 --- a/Python/compile.c +++ b/Python/compile.c @@ -81,14 +81,16 @@ It's called a frame block to distinguish it from a basic block in the compiler IR. */ -enum fblocktype { WHILE_LOOP, FOR_LOOP, EXCEPT, FINALLY_TRY, FINALLY_TRY2, FINALLY_END, - WITH, ASYNC_WITH, HANDLER_CLEANUP }; +enum fblocktype { WHILE_LOOP, FOR_LOOP, EXCEPT, FINALLY_TRY, FINALLY_END, + WITH, ASYNC_WITH, HANDLER_CLEANUP, POP_VALUE }; struct fblockinfo { enum fblocktype fb_type; basicblock *fb_block; /* (optional) type-specific exit or cleanup block */ basicblock *fb_exit; + /* (optional) additional information required for unwinding */ + void *fb_datum; }; enum { @@ -960,12 +962,6 @@ stack_effect(int opcode, int oparg, int jump) * Restore the stack position and push 6 values before jumping to * the handler if an exception be raised. */ return jump ? 6 : 1; - case WITH_CLEANUP_START: - return 2; /* or 1, depending on TOS */ - case WITH_CLEANUP_FINISH: - /* Pop a variable number of values pushed by WITH_CLEANUP_START - * + __exit__ or __aexit__. */ - return -3; case RETURN_VALUE: return -1; case IMPORT_STAR: @@ -980,10 +976,6 @@ stack_effect(int opcode, int oparg, int jump) return 0; case POP_EXCEPT: return -3; - case END_FINALLY: - case POP_FINALLY: - /* Pop 6 values when an exception was raised. */ - return -6; case STORE_NAME: return -1; @@ -1056,14 +1048,11 @@ stack_effect(int opcode, int oparg, int jump) * Restore the stack position and push 6 values before jumping to * the handler if an exception be raised. */ return jump ? 6 : 0; - case BEGIN_FINALLY: - /* Actually pushes 1 value, but count 6 for balancing with - * END_FINALLY and POP_FINALLY. - * This is the main reason of using this opcode instead of - * "LOAD_CONST None". */ - return 6; - case CALL_FINALLY: - return jump ? 1 : 0; + case RERAISE: + return -3; + + case WITH_EXCEPT_START: + return 1; case LOAD_FAST: return 1; @@ -1629,7 +1618,7 @@ find_ann(asdl_seq *stmts) static int compiler_push_fblock(struct compiler *c, enum fblocktype t, basicblock *b, - basicblock *exit) + basicblock *exit, void *datum) { struct fblockinfo *f; if (c->u->u_nfblocks >= CO_MAXBLOCKS) { @@ -1641,6 +1630,7 @@ compiler_push_fblock(struct compiler *c, enum fblocktype t, basicblock *b, f->fb_type = t; f->fb_block = b; f->fb_exit = exit; + f->fb_datum = datum; return 1; } @@ -1654,8 +1644,19 @@ compiler_pop_fblock(struct compiler *c, enum fblocktype t, basicblock *b) assert(u->u_fblock[u->u_nfblocks].fb_block == b); } +static int +compiler_call_exit_with_nones(struct compiler *c) { + ADDOP_O(c, LOAD_CONST, Py_None, consts); + ADDOP(c, DUP_TOP); + ADDOP(c, DUP_TOP); + ADDOP_I(c, CALL_FUNCTION, 3); + return 1; +} + /* Unwind a frame block. If preserve_tos is true, the TOS before - * popping the blocks will be restored afterwards. + * popping the blocks will be restored afterwards, unless another + * return, break or continue is found. In which case, the TOS will + * be popped. */ static int compiler_unwind_fblock(struct compiler *c, struct fblockinfo *info, @@ -1665,15 +1666,6 @@ compiler_unwind_fblock(struct compiler *c, struct fblockinfo *info, case WHILE_LOOP: return 1; - case FINALLY_END: - info->fb_exit = NULL; - ADDOP_I(c, POP_FINALLY, preserve_tos); - if (preserve_tos) { - ADDOP(c, ROT_TWO); - } - ADDOP(c, POP_TOP); - return 1; - case FOR_LOOP: /* Pop the iterator */ if (preserve_tos) { @@ -1687,22 +1679,30 @@ compiler_unwind_fblock(struct compiler *c, struct fblockinfo *info, return 1; case FINALLY_TRY: - ADDOP(c, POP_BLOCK); - ADDOP_JREL(c, CALL_FINALLY, info->fb_exit); - return 1; - - case FINALLY_TRY2: ADDOP(c, POP_BLOCK); if (preserve_tos) { - ADDOP(c, ROT_TWO); - ADDOP(c, POP_TOP); - ADDOP_JREL(c, CALL_FINALLY, info->fb_exit); + if (!compiler_push_fblock(c, POP_VALUE, NULL, NULL, NULL)) { + return 0; + } } - else { - ADDOP_JREL(c, CALL_FINALLY, info->fb_exit); - ADDOP(c, POP_TOP); + VISIT_SEQ(c, stmt, info->fb_datum); + if (preserve_tos) { + compiler_pop_fblock(c, POP_VALUE, NULL); } return 1; + + case FINALLY_END: + if (preserve_tos) { + ADDOP(c, ROT_FOUR); + } + ADDOP(c, POP_TOP); + ADDOP(c, POP_TOP); + ADDOP(c, POP_TOP); + if (preserve_tos) { + ADDOP(c, ROT_FOUR); + } + ADDOP(c, POP_EXCEPT); + return 1; case WITH: case ASYNC_WITH: @@ -1710,34 +1710,66 @@ compiler_unwind_fblock(struct compiler *c, struct fblockinfo *info, if (preserve_tos) { ADDOP(c, ROT_TWO); } - ADDOP(c, BEGIN_FINALLY); - ADDOP(c, WITH_CLEANUP_START); + if(!compiler_call_exit_with_nones(c)) { + return 0; + } if (info->fb_type == ASYNC_WITH) { ADDOP(c, GET_AWAITABLE); ADDOP_LOAD_CONST(c, Py_None); ADDOP(c, YIELD_FROM); } - ADDOP(c, WITH_CLEANUP_FINISH); - ADDOP_I(c, POP_FINALLY, 0); + ADDOP(c, POP_TOP); return 1; case HANDLER_CLEANUP: + if (info->fb_datum) { + ADDOP(c, POP_BLOCK); + } if (preserve_tos) { ADDOP(c, ROT_FOUR); } - if (info->fb_exit) { - ADDOP(c, POP_BLOCK); - ADDOP(c, POP_EXCEPT); - ADDOP_JREL(c, CALL_FINALLY, info->fb_exit); + ADDOP(c, POP_EXCEPT); + if (info->fb_datum) { + ADDOP_LOAD_CONST(c, Py_None); + compiler_nameop(c, info->fb_datum, Store); + compiler_nameop(c, info->fb_datum, Del); } - else { - ADDOP(c, POP_EXCEPT); + return 1; + + case POP_VALUE: + if (preserve_tos) { + ADDOP(c, ROT_TWO); } + ADDOP(c, POP_TOP); return 1; } Py_UNREACHABLE(); } +/** Unwind block stack. If loop is not NULL, then stop when the first loop is encountered. */ +static int +compiler_unwind_fblock_stack(struct compiler *c, int preserve_tos, struct fblockinfo **loop) { + if (c->u->u_nfblocks == 0) { + return 1; + } + struct fblockinfo *top = &c->u->u_fblock[c->u->u_nfblocks-1]; + if (loop != NULL && (top->fb_type == WHILE_LOOP || top->fb_type == FOR_LOOP)) { + *loop = top; + return 1; + } + struct fblockinfo copy = *top; + c->u->u_nfblocks--; + if (!compiler_unwind_fblock(c, ©, preserve_tos)) { + return 0; + } + if (!compiler_unwind_fblock_stack(c, preserve_tos, loop)) { + return 0; + } + c->u->u_fblock[c->u->u_nfblocks] = copy; + c->u->u_nfblocks++; + return 1; +} + /* Compile a sequence of statements, checking for a docstring and for annotations. */ @@ -2634,10 +2666,12 @@ compiler_if(struct compiler *c, stmt_ty s) if (next == NULL) return 0; } - else + else { next = end; - if (!compiler_jump_if(c, s->v.If.test, next, 0)) + } + if (!compiler_jump_if(c, s->v.If.test, next, 0)) { return 0; + } VISIT_SEQ(c, stmt, s->v.If.body); if (asdl_seq_LEN(s->v.If.orelse)) { ADDOP_JREL(c, JUMP_FORWARD, end); @@ -2657,12 +2691,12 @@ compiler_for(struct compiler *c, stmt_ty s) start = compiler_new_block(c); cleanup = compiler_new_block(c); end = compiler_new_block(c); - if (start == NULL || end == NULL || cleanup == NULL) + if (start == NULL || end == NULL || cleanup == NULL) { return 0; - - if (!compiler_push_fblock(c, FOR_LOOP, start, end)) + } + if (!compiler_push_fblock(c, FOR_LOOP, start, end, NULL)) { return 0; - + } VISIT(c, expr, s->v.For.iter); ADDOP(c, GET_ITER); compiler_use_next_block(c, start); @@ -2694,16 +2728,16 @@ compiler_async_for(struct compiler *c, stmt_ty s) except = compiler_new_block(c); end = compiler_new_block(c); - if (start == NULL || except == NULL || end == NULL) + if (start == NULL || except == NULL || end == NULL) { return 0; - + } VISIT(c, expr, s->v.AsyncFor.iter); ADDOP(c, GET_AITER); compiler_use_next_block(c, start); - if (!compiler_push_fblock(c, FOR_LOOP, start, end)) + if (!compiler_push_fblock(c, FOR_LOOP, start, end, NULL)) { return 0; - + } /* SETUP_FINALLY to guard the __anext__ call */ ADDOP_JREL(c, SETUP_FINALLY, except); ADDOP(c, GET_ANEXT); @@ -2741,7 +2775,7 @@ compiler_while(struct compiler *c, stmt_ty s) // Push a dummy block so the VISIT_SEQ knows that we are // inside a while loop so it can correctly evaluate syntax // errors. - if (!compiler_push_fblock(c, WHILE_LOOP, NULL, NULL)) { + if (!compiler_push_fblock(c, WHILE_LOOP, NULL, NULL, NULL)) { return 0; } VISIT_SEQ(c, stmt, s->v.While.body); @@ -2771,7 +2805,7 @@ compiler_while(struct compiler *c, stmt_ty s) orelse = NULL; compiler_use_next_block(c, loop); - if (!compiler_push_fblock(c, WHILE_LOOP, loop, end)) + if (!compiler_push_fblock(c, WHILE_LOOP, loop, end, NULL)) return 0; if (constant == -1) { if (!compiler_jump_if(c, s->v.While.test, anchor, 0)) @@ -2811,12 +2845,8 @@ compiler_return(struct compiler *c, stmt_ty s) if (preserve_tos) { VISIT(c, expr, s->v.Return.value); } - for (int depth = c->u->u_nfblocks; depth--;) { - struct fblockinfo *info = &c->u->u_fblock[depth]; - - if (!compiler_unwind_fblock(c, info, preserve_tos)) - return 0; - } + if (!compiler_unwind_fblock_stack(c, preserve_tos, NULL)) + return 0; if (s->v.Return.value == NULL) { ADDOP_LOAD_CONST(c, Py_None); } @@ -2831,33 +2861,32 @@ compiler_return(struct compiler *c, stmt_ty s) static int compiler_break(struct compiler *c) { - for (int depth = c->u->u_nfblocks; depth--;) { - struct fblockinfo *info = &c->u->u_fblock[depth]; - - if (!compiler_unwind_fblock(c, info, 0)) - return 0; - if (info->fb_type == WHILE_LOOP || info->fb_type == FOR_LOOP) { - ADDOP_JABS(c, JUMP_ABSOLUTE, info->fb_exit); - return 1; - } + struct fblockinfo *loop = NULL; + if (!compiler_unwind_fblock_stack(c, 0, &loop)) { + return 0; } - return compiler_error(c, "'break' outside loop"); + if (loop == NULL) { + return compiler_error(c, "'break' outside loop"); + } + if (!compiler_unwind_fblock(c, loop, 0)) { + return 0; + } + ADDOP_JABS(c, JUMP_ABSOLUTE, loop->fb_exit); + return 1; } static int compiler_continue(struct compiler *c) { - for (int depth = c->u->u_nfblocks; depth--;) { - struct fblockinfo *info = &c->u->u_fblock[depth]; - - if (info->fb_type == WHILE_LOOP || info->fb_type == FOR_LOOP) { - ADDOP_JABS(c, JUMP_ABSOLUTE, info->fb_block); - return 1; - } - if (!compiler_unwind_fblock(c, info, 0)) - return 0; + struct fblockinfo *loop = NULL; + if (!compiler_unwind_fblock_stack(c, 0, &loop)) { + return 0; } - return compiler_error(c, "'continue' not properly in loop"); + if (loop == NULL) { + return compiler_error(c, "'continue' not properly in loop"); + } + ADDOP_JABS(c, JUMP_ABSOLUTE, loop->fb_block); + return 1; } @@ -2866,10 +2895,11 @@ compiler_continue(struct compiler *c) SETUP_FINALLY L POP_BLOCK - BEGIN_FINALLY + + JUMP E L: - END_FINALLY + E: The special instructions use the block stack. Each block stack entry contains the instruction that created it (here @@ -2881,11 +2911,6 @@ compiler_continue(struct compiler *c) onto the block stack. POP_BLOCK: Pops en entry from the block stack. - BEGIN_FINALLY - Pushes NULL onto the value stack. - END_FINALLY: - Pops 1 (NULL or int) or 6 entries from the *value* stack and restore - the raised and the caught exceptions they specify. The block stack is unwound when an exception is raised: when a SETUP_FINALLY entry is found, the raised and the caught @@ -2897,47 +2922,18 @@ compiler_continue(struct compiler *c) static int compiler_try_finally(struct compiler *c, stmt_ty s) { - basicblock *start, *newcurblock, *body, *end; - int break_finally = 1; + basicblock *body, *end, *exit; body = compiler_new_block(c); end = compiler_new_block(c); - if (body == NULL || end == NULL) + exit = compiler_new_block(c); + if (body == NULL || end == NULL || exit == NULL) return 0; - start = c->u->u_curblock; - - /* `finally` block. Compile it first to determine if any of "break", - "continue" or "return" are used in it. */ - compiler_use_next_block(c, end); - if (!compiler_push_fblock(c, FINALLY_END, end, end)) - return 0; - VISIT_SEQ(c, stmt, s->v.Try.finalbody); - ADDOP(c, END_FINALLY); - break_finally = (c->u->u_fblock[c->u->u_nfblocks - 1].fb_exit == NULL); - if (break_finally) { - /* Pops a placeholder. See below */ - ADDOP(c, POP_TOP); - } - compiler_pop_fblock(c, FINALLY_END, end); - - newcurblock = c->u->u_curblock; - c->u->u_curblock = start; - start->b_next = NULL; - /* `try` block */ - c->u->u_lineno_set = 0; - c->u->u_lineno = s->lineno; - c->u->u_col_offset = s->col_offset; - if (break_finally) { - /* Pushes a placeholder for the value of "return" in the "try" block - to balance the stack for "break", "continue" and "return" in - the "finally" block. */ - ADDOP_LOAD_CONST(c, Py_None); - } ADDOP_JREL(c, SETUP_FINALLY, end); compiler_use_next_block(c, body); - if (!compiler_push_fblock(c, break_finally ? FINALLY_TRY2 : FINALLY_TRY, body, end)) + if (!compiler_push_fblock(c, FINALLY_TRY, body, end, s->v.Try.finalbody)) return 0; if (s->v.Try.handlers && asdl_seq_LEN(s->v.Try.handlers)) { if (!compiler_try_except(c, s)) @@ -2947,12 +2943,17 @@ compiler_try_finally(struct compiler *c, stmt_ty s) VISIT_SEQ(c, stmt, s->v.Try.body); } ADDOP(c, POP_BLOCK); - ADDOP(c, BEGIN_FINALLY); - compiler_pop_fblock(c, break_finally ? FINALLY_TRY2 : FINALLY_TRY, body); - - c->u->u_curblock->b_next = end; - c->u->u_curblock = newcurblock; - + compiler_pop_fblock(c, FINALLY_TRY, body); + VISIT_SEQ(c, stmt, s->v.Try.finalbody); + ADDOP_JREL(c, JUMP_FORWARD, exit); + /* `finally` block */ + compiler_use_next_block(c, end); + if (!compiler_push_fblock(c, FINALLY_END, end, NULL, NULL)) + return 0; + VISIT_SEQ(c, stmt, s->v.Try.finalbody); + compiler_pop_fblock(c, FINALLY_END, end); + ADDOP(c, RERAISE); + compiler_use_next_block(c, exit); return 1; } @@ -2981,7 +2982,7 @@ compiler_try_finally(struct compiler *c, stmt_ty s) [tb, val, exc] L2: DUP .............................etc....................... - [tb, val, exc] Ln+1: END_FINALLY # re-raise exception + [tb, val, exc] Ln+1: RERAISE # re-raise exception [] L0: @@ -3001,7 +3002,7 @@ compiler_try_except(struct compiler *c, stmt_ty s) return 0; ADDOP_JREL(c, SETUP_FINALLY, except); compiler_use_next_block(c, body); - if (!compiler_push_fblock(c, EXCEPT, body, NULL)) + if (!compiler_push_fblock(c, EXCEPT, body, NULL, NULL)) return 0; VISIT_SEQ(c, stmt, s->v.Try.body); ADDOP(c, POP_BLOCK); @@ -3053,28 +3054,29 @@ compiler_try_except(struct compiler *c, stmt_ty s) /* second try: */ ADDOP_JREL(c, SETUP_FINALLY, cleanup_end); compiler_use_next_block(c, cleanup_body); - if (!compiler_push_fblock(c, HANDLER_CLEANUP, cleanup_body, cleanup_end)) + if (!compiler_push_fblock(c, HANDLER_CLEANUP, cleanup_body, NULL, handler->v.ExceptHandler.name)) return 0; /* second # body */ VISIT_SEQ(c, stmt, handler->v.ExceptHandler.body); - ADDOP(c, POP_BLOCK); - ADDOP(c, BEGIN_FINALLY); compiler_pop_fblock(c, HANDLER_CLEANUP, cleanup_body); + ADDOP(c, POP_BLOCK); + ADDOP(c, POP_EXCEPT); + /* name = None; del name */ + ADDOP_LOAD_CONST(c, Py_None); + compiler_nameop(c, handler->v.ExceptHandler.name, Store); + compiler_nameop(c, handler->v.ExceptHandler.name, Del); + ADDOP_JREL(c, JUMP_FORWARD, end); - /* finally: */ + /* except: */ compiler_use_next_block(c, cleanup_end); - if (!compiler_push_fblock(c, FINALLY_END, cleanup_end, NULL)) - return 0; /* name = None; del name */ ADDOP_LOAD_CONST(c, Py_None); compiler_nameop(c, handler->v.ExceptHandler.name, Store); compiler_nameop(c, handler->v.ExceptHandler.name, Del); - ADDOP(c, END_FINALLY); - ADDOP(c, POP_EXCEPT); - compiler_pop_fblock(c, FINALLY_END, cleanup_end); + ADDOP(c, RERAISE); } else { basicblock *cleanup_body; @@ -3086,16 +3088,16 @@ compiler_try_except(struct compiler *c, stmt_ty s) ADDOP(c, POP_TOP); ADDOP(c, POP_TOP); compiler_use_next_block(c, cleanup_body); - if (!compiler_push_fblock(c, HANDLER_CLEANUP, cleanup_body, NULL)) + if (!compiler_push_fblock(c, HANDLER_CLEANUP, cleanup_body, NULL, NULL)) return 0; VISIT_SEQ(c, stmt, handler->v.ExceptHandler.body); - ADDOP(c, POP_EXCEPT); compiler_pop_fblock(c, HANDLER_CLEANUP, cleanup_body); + ADDOP(c, POP_EXCEPT); + ADDOP_JREL(c, JUMP_FORWARD, end); } - ADDOP_JREL(c, JUMP_FORWARD, end); compiler_use_next_block(c, except); } - ADDOP(c, END_FINALLY); + ADDOP(c, RERAISE); compiler_use_next_block(c, orelse); VISIT_SEQ(c, stmt, s->v.Try.orelse); compiler_use_next_block(c, end); @@ -4630,6 +4632,22 @@ expr_constant(expr_ty e) return -1; } +static int +compiler_with_except_finish(struct compiler *c) { + basicblock *exit; + exit = compiler_new_block(c); + if (exit == NULL) + return 0; + ADDOP_JABS(c, POP_JUMP_IF_TRUE, exit); + ADDOP(c, RERAISE); + compiler_use_next_block(c, exit); + ADDOP(c, POP_TOP); + ADDOP(c, POP_TOP); + ADDOP(c, POP_TOP); + ADDOP(c, POP_EXCEPT); + ADDOP(c, POP_TOP); + return 1; +} /* Implements the async with statement. @@ -4658,7 +4676,7 @@ expr_constant(expr_ty e) static int compiler_async_with(struct compiler *c, stmt_ty s, int pos) { - basicblock *block, *finally; + basicblock *block, *final, *exit; withitem_ty item = asdl_seq_GET(s->v.AsyncWith.items, pos); assert(s->kind == AsyncWith_kind); @@ -4669,8 +4687,9 @@ compiler_async_with(struct compiler *c, stmt_ty s, int pos) } block = compiler_new_block(c); - finally = compiler_new_block(c); - if (!block || !finally) + final = compiler_new_block(c); + exit = compiler_new_block(c); + if (!block || !final || !exit) return 0; /* Evaluate EXPR */ @@ -4681,11 +4700,11 @@ compiler_async_with(struct compiler *c, stmt_ty s, int pos) ADDOP_LOAD_CONST(c, Py_None); ADDOP(c, YIELD_FROM); - ADDOP_JREL(c, SETUP_ASYNC_WITH, finally); + ADDOP_JREL(c, SETUP_ASYNC_WITH, final); /* SETUP_ASYNC_WITH pushes a finally block. */ compiler_use_next_block(c, block); - if (!compiler_push_fblock(c, ASYNC_WITH, block, finally)) { + if (!compiler_push_fblock(c, ASYNC_WITH, block, final, NULL)) { return 0; } @@ -4704,76 +4723,80 @@ compiler_async_with(struct compiler *c, stmt_ty s, int pos) else if (!compiler_async_with(c, s, pos)) return 0; - /* End of try block; start the finally block */ - ADDOP(c, POP_BLOCK); - ADDOP(c, BEGIN_FINALLY); compiler_pop_fblock(c, ASYNC_WITH, block); + ADDOP(c, POP_BLOCK); + /* End of body; start the cleanup */ - compiler_use_next_block(c, finally); - if (!compiler_push_fblock(c, FINALLY_END, finally, NULL)) + /* For successful outcome: + * call __exit__(None, None, None) + */ + if(!compiler_call_exit_with_nones(c)) return 0; + ADDOP(c, GET_AWAITABLE); + ADDOP_O(c, LOAD_CONST, Py_None, consts); + ADDOP(c, YIELD_FROM); - /* Finally block starts; context.__exit__ is on the stack under - the exception or return information. Just issue our magic - opcode. */ - ADDOP(c, WITH_CLEANUP_START); + ADDOP(c, POP_TOP); + ADDOP_JABS(c, JUMP_ABSOLUTE, exit); + + /* For exceptional outcome: */ + compiler_use_next_block(c, final); + + ADDOP(c, WITH_EXCEPT_START); ADDOP(c, GET_AWAITABLE); ADDOP_LOAD_CONST(c, Py_None); ADDOP(c, YIELD_FROM); + compiler_with_except_finish(c); - ADDOP(c, WITH_CLEANUP_FINISH); - - /* Finally block ends. */ - ADDOP(c, END_FINALLY); - compiler_pop_fblock(c, FINALLY_END, finally); +compiler_use_next_block(c, exit); return 1; } /* Implements the with statement from PEP 343. - - The semantics outlined in that PEP are as follows: - with EXPR as VAR: BLOCK - - It is implemented roughly as: - - context = EXPR - exit = context.__exit__ # not calling it - value = context.__enter__() - try: - VAR = value # if VAR present in the syntax - BLOCK - finally: - if an exception was raised: - exc = copy of (exception, instance, traceback) - else: - exc = (None, None, None) - exit(*exc) + is implemented as: + + SETUP_WITH E + or POP_TOP + + LOAD_CONST (None, None, None) + CALL_FUNCTION_EX 0 + JUMP_FORWARD EXIT + E: WITH_EXCEPT_START (calls EXPR.__exit__) + POP_JUMP_IF_TRUE T: + RERAISE + T: POP_TOP * 3 (remove exception from stack) + POP_EXCEPT + POP_TOP + EXIT: */ + static int compiler_with(struct compiler *c, stmt_ty s, int pos) { - basicblock *block, *finally; + basicblock *block, *final, *exit; withitem_ty item = asdl_seq_GET(s->v.With.items, pos); assert(s->kind == With_kind); block = compiler_new_block(c); - finally = compiler_new_block(c); - if (!block || !finally) + final = compiler_new_block(c); + exit = compiler_new_block(c); + if (!block || !final || !exit) return 0; /* Evaluate EXPR */ VISIT(c, expr, item->context_expr); - ADDOP_JREL(c, SETUP_WITH, finally); + /* Will push bound __exit__ */ + ADDOP_JREL(c, SETUP_WITH, final); /* SETUP_WITH pushes a finally block. */ compiler_use_next_block(c, block); - if (!compiler_push_fblock(c, WITH, block, finally)) { + if (!compiler_push_fblock(c, WITH, block, final, NULL)) { return 0; } @@ -4792,24 +4815,26 @@ compiler_with(struct compiler *c, stmt_ty s, int pos) else if (!compiler_with(c, s, pos)) return 0; - /* End of try block; start the finally block */ ADDOP(c, POP_BLOCK); - ADDOP(c, BEGIN_FINALLY); compiler_pop_fblock(c, WITH, block); - - compiler_use_next_block(c, finally); - if (!compiler_push_fblock(c, FINALLY_END, finally, NULL)) + + /* End of body; start the cleanup. */ + + /* For successful outcome: + * call __exit__(None, None, None) + */ + if (!compiler_call_exit_with_nones(c)) return 0; + ADDOP(c, POP_TOP); + ADDOP_JREL(c, JUMP_FORWARD, exit); - /* Finally block starts; context.__exit__ is on the stack under - the exception or return information. Just issue our magic - opcode. */ - ADDOP(c, WITH_CLEANUP_START); - ADDOP(c, WITH_CLEANUP_FINISH); + /* For exceptional outcome: */ + compiler_use_next_block(c, final); - /* Finally block ends. */ - ADDOP(c, END_FINALLY); - compiler_pop_fblock(c, FINALLY_END, finally); + ADDOP(c, WITH_EXCEPT_START); + compiler_with_except_finish(c); + + compiler_use_next_block(c, exit); return 1; } @@ -5427,7 +5452,7 @@ Py_LOCAL_INLINE(void) stackdepth_push(basicblock ***sp, basicblock *b, int depth) { assert(b->b_startdepth < 0 || b->b_startdepth == depth); - if (b->b_startdepth < depth) { + if (b->b_startdepth < depth && b->b_startdepth < 100) { assert(b->b_startdepth < 0); b->b_startdepth = depth; *(*sp)++ = b; @@ -5483,19 +5508,14 @@ stackdepth(struct compiler *c) maxdepth = target_depth; } assert(target_depth >= 0); /* invalid code or bug in stackdepth() */ - if (instr->i_opcode == CALL_FINALLY) { - assert(instr->i_target->b_startdepth >= 0); - assert(instr->i_target->b_startdepth >= target_depth); - depth = new_depth; - continue; - } stackdepth_push(&sp, instr->i_target, target_depth); } depth = new_depth; if (instr->i_opcode == JUMP_ABSOLUTE || instr->i_opcode == JUMP_FORWARD || instr->i_opcode == RETURN_VALUE || - instr->i_opcode == RAISE_VARARGS) + instr->i_opcode == RAISE_VARARGS || + instr->i_opcode == RERAISE) { /* remaining code is dead */ next = NULL; diff --git a/Python/importlib.h b/Python/importlib.h index 67c820cd036..d837bdd9d4c 100644 --- a/Python/importlib.h +++ b/Python/importlib.h @@ -133,19 +133,21 @@ const unsigned char _Py_M__importlib_bootstrap[] = { 2,8,1,6,2,10,1,8,1,4,1,6,1,8,1,122, 24,95,77,111,100,117,108,101,76,111,99,107,46,104,97,115, 95,100,101,97,100,108,111,99,107,99,1,0,0,0,0,0, - 0,0,0,0,0,0,2,0,0,0,9,0,0,0,67,0, - 0,0,115,178,0,0,0,116,0,160,1,161,0,125,1,124, - 0,116,2,124,1,60,0,122,148,124,0,106,3,143,110,1, + 0,0,0,0,0,0,2,0,0,0,8,0,0,0,67,0, + 0,0,115,210,0,0,0,116,0,160,1,161,0,125,1,124, + 0,116,2,124,1,60,0,122,180,124,0,106,3,143,126,1, 0,124,0,106,4,100,1,107,2,115,46,124,0,106,5,124, - 1,107,2,114,84,124,1,124,0,95,5,124,0,4,0,106, - 4,100,2,55,0,2,0,95,4,87,0,53,0,81,0,82, - 0,163,0,87,0,162,86,100,3,83,0,124,0,160,6,161, - 0,114,104,116,7,100,4,124,0,22,0,131,1,130,1,124, - 0,106,8,160,9,100,5,161,1,114,130,124,0,4,0,106, - 10,100,2,55,0,2,0,95,10,87,0,53,0,81,0,82, - 0,88,0,124,0,106,8,160,9,161,0,1,0,124,0,106, - 8,160,11,161,0,1,0,113,18,87,0,53,0,116,2,124, - 1,61,0,88,0,100,6,83,0,41,7,122,185,10,32,32, + 1,107,2,114,90,124,1,124,0,95,5,124,0,4,0,106, + 4,100,2,55,0,2,0,95,4,87,0,100,3,4,0,4, + 0,131,3,1,0,87,0,116,2,124,1,61,0,100,4,83, + 0,124,0,160,6,161,0,114,110,116,7,100,5,124,0,22, + 0,131,1,130,1,124,0,106,8,160,9,100,6,161,1,114, + 136,124,0,4,0,106,10,100,2,55,0,2,0,95,10,87, + 0,100,3,4,0,4,0,131,3,1,0,110,16,49,0,115, + 156,48,0,1,0,1,0,1,0,89,0,1,0,124,0,106, + 8,160,9,161,0,1,0,124,0,106,8,160,11,161,0,1, + 0,113,18,87,0,116,2,124,1,61,0,110,8,116,2,124, + 1,61,0,48,0,100,3,83,0,41,7,122,185,10,32,32, 32,32,32,32,32,32,65,99,113,117,105,114,101,32,116,104, 101,32,109,111,100,117,108,101,32,108,111,99,107,46,32,32, 73,102,32,97,32,112,111,116,101,110,116,105,97,108,32,100, @@ -158,193 +160,196 @@ const unsigned char _Py_M__importlib_bootstrap[] = { 99,113,117,105,114,101,100,32,97,110,100,32,84,114,117,101, 32,105,115,32,114,101,116,117,114,110,101,100,46,10,32,32, 32,32,32,32,32,32,114,22,0,0,0,233,1,0,0,0, - 84,122,23,100,101,97,100,108,111,99,107,32,100,101,116,101, - 99,116,101,100,32,98,121,32,37,114,70,78,41,12,114,23, + 78,84,122,23,100,101,97,100,108,111,99,107,32,100,101,116, + 101,99,116,101,100,32,98,121,32,37,114,70,41,12,114,23, 0,0,0,114,32,0,0,0,114,33,0,0,0,114,24,0, 0,0,114,27,0,0,0,114,26,0,0,0,114,36,0,0, 0,114,19,0,0,0,114,25,0,0,0,218,7,97,99,113, 117,105,114,101,114,28,0,0,0,218,7,114,101,108,101,97, 115,101,169,2,114,30,0,0,0,114,35,0,0,0,114,10, 0,0,0,114,10,0,0,0,114,11,0,0,0,114,38,0, - 0,0,78,0,0,0,115,30,0,0,0,0,6,8,1,8, - 1,2,2,8,1,20,1,6,1,14,1,18,1,8,1,12, - 1,12,1,24,2,10,1,16,2,122,19,95,77,111,100,117, - 108,101,76,111,99,107,46,97,99,113,117,105,114,101,99,1, - 0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,9, - 0,0,0,67,0,0,0,115,122,0,0,0,116,0,160,1, - 161,0,125,1,124,0,106,2,143,98,1,0,124,0,106,3, - 124,1,107,3,114,34,116,4,100,1,131,1,130,1,124,0, - 106,5,100,2,107,4,115,48,74,0,130,1,124,0,4,0, - 106,5,100,3,56,0,2,0,95,5,124,0,106,5,100,2, - 107,2,114,108,100,0,124,0,95,3,124,0,106,6,114,108, - 124,0,4,0,106,6,100,3,56,0,2,0,95,6,124,0, - 106,7,160,8,161,0,1,0,87,0,53,0,81,0,82,0, - 88,0,100,0,83,0,41,4,78,250,31,99,97,110,110,111, - 116,32,114,101,108,101,97,115,101,32,117,110,45,97,99,113, - 117,105,114,101,100,32,108,111,99,107,114,22,0,0,0,114, - 37,0,0,0,41,9,114,23,0,0,0,114,32,0,0,0, - 114,24,0,0,0,114,26,0,0,0,218,12,82,117,110,116, - 105,109,101,69,114,114,111,114,114,27,0,0,0,114,28,0, - 0,0,114,25,0,0,0,114,39,0,0,0,114,40,0,0, - 0,114,10,0,0,0,114,10,0,0,0,114,11,0,0,0, - 114,39,0,0,0,103,0,0,0,115,22,0,0,0,0,1, - 8,1,8,1,10,1,8,1,14,1,14,1,10,1,6,1, - 6,1,14,1,122,19,95,77,111,100,117,108,101,76,111,99, - 107,46,114,101,108,101,97,115,101,99,1,0,0,0,0,0, - 0,0,0,0,0,0,1,0,0,0,5,0,0,0,67,0, - 0,0,115,18,0,0,0,100,1,160,0,124,0,106,1,116, - 2,124,0,131,1,161,2,83,0,41,2,78,122,23,95,77, - 111,100,117,108,101,76,111,99,107,40,123,33,114,125,41,32, - 97,116,32,123,125,169,3,218,6,102,111,114,109,97,116,114, - 17,0,0,0,218,2,105,100,169,1,114,30,0,0,0,114, - 10,0,0,0,114,10,0,0,0,114,11,0,0,0,218,8, - 95,95,114,101,112,114,95,95,116,0,0,0,115,2,0,0, - 0,0,1,122,20,95,77,111,100,117,108,101,76,111,99,107, - 46,95,95,114,101,112,114,95,95,78,41,9,114,1,0,0, - 0,114,0,0,0,0,114,2,0,0,0,114,3,0,0,0, - 114,31,0,0,0,114,36,0,0,0,114,38,0,0,0,114, - 39,0,0,0,114,47,0,0,0,114,10,0,0,0,114,10, - 0,0,0,114,10,0,0,0,114,11,0,0,0,114,20,0, - 0,0,52,0,0,0,115,12,0,0,0,8,1,4,5,8, - 8,8,12,8,25,8,13,114,20,0,0,0,99,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0, - 0,64,0,0,0,115,48,0,0,0,101,0,90,1,100,0, - 90,2,100,1,90,3,100,2,100,3,132,0,90,4,100,4, - 100,5,132,0,90,5,100,6,100,7,132,0,90,6,100,8, - 100,9,132,0,90,7,100,10,83,0,41,11,218,16,95,68, - 117,109,109,121,77,111,100,117,108,101,76,111,99,107,122,86, - 65,32,115,105,109,112,108,101,32,95,77,111,100,117,108,101, - 76,111,99,107,32,101,113,117,105,118,97,108,101,110,116,32, - 102,111,114,32,80,121,116,104,111,110,32,98,117,105,108,100, - 115,32,119,105,116,104,111,117,116,10,32,32,32,32,109,117, - 108,116,105,45,116,104,114,101,97,100,105,110,103,32,115,117, - 112,112,111,114,116,46,99,2,0,0,0,0,0,0,0,0, - 0,0,0,2,0,0,0,2,0,0,0,67,0,0,0,115, - 16,0,0,0,124,1,124,0,95,0,100,1,124,0,95,1, - 100,0,83,0,114,21,0,0,0,41,2,114,17,0,0,0, - 114,27,0,0,0,114,29,0,0,0,114,10,0,0,0,114, - 10,0,0,0,114,11,0,0,0,114,31,0,0,0,124,0, - 0,0,115,4,0,0,0,0,1,6,1,122,25,95,68,117, - 109,109,121,77,111,100,117,108,101,76,111,99,107,46,95,95, - 105,110,105,116,95,95,99,1,0,0,0,0,0,0,0,0, - 0,0,0,1,0,0,0,3,0,0,0,67,0,0,0,115, - 18,0,0,0,124,0,4,0,106,0,100,1,55,0,2,0, - 95,0,100,2,83,0,41,3,78,114,37,0,0,0,84,41, - 1,114,27,0,0,0,114,46,0,0,0,114,10,0,0,0, - 114,10,0,0,0,114,11,0,0,0,114,38,0,0,0,128, - 0,0,0,115,4,0,0,0,0,1,14,1,122,24,95,68, - 117,109,109,121,77,111,100,117,108,101,76,111,99,107,46,97, + 0,0,78,0,0,0,115,38,0,0,0,0,6,8,1,8, + 1,2,2,8,1,20,1,6,1,14,1,14,9,6,247,2, + 9,2,248,8,1,12,1,12,1,44,2,10,1,14,2,8, + 0,122,19,95,77,111,100,117,108,101,76,111,99,107,46,97, 99,113,117,105,114,101,99,1,0,0,0,0,0,0,0,0, - 0,0,0,1,0,0,0,3,0,0,0,67,0,0,0,115, - 36,0,0,0,124,0,106,0,100,1,107,2,114,18,116,1, - 100,2,131,1,130,1,124,0,4,0,106,0,100,3,56,0, - 2,0,95,0,100,0,83,0,41,4,78,114,22,0,0,0, - 114,41,0,0,0,114,37,0,0,0,41,2,114,27,0,0, - 0,114,42,0,0,0,114,46,0,0,0,114,10,0,0,0, - 114,10,0,0,0,114,11,0,0,0,114,39,0,0,0,132, - 0,0,0,115,6,0,0,0,0,1,10,1,8,1,122,24, + 0,0,0,2,0,0,0,8,0,0,0,67,0,0,0,115, + 142,0,0,0,116,0,160,1,161,0,125,1,124,0,106,2, + 143,108,1,0,124,0,106,3,124,1,107,3,114,34,116,4, + 100,1,131,1,130,1,124,0,106,5,100,2,107,4,115,48, + 74,0,130,1,124,0,4,0,106,5,100,3,56,0,2,0, + 95,5,124,0,106,5,100,2,107,2,114,108,100,0,124,0, + 95,3,124,0,106,6,114,108,124,0,4,0,106,6,100,3, + 56,0,2,0,95,6,124,0,106,7,160,8,161,0,1,0, + 87,0,100,0,4,0,4,0,131,3,1,0,110,16,49,0, + 115,128,48,0,1,0,1,0,1,0,89,0,1,0,100,0, + 83,0,41,4,78,250,31,99,97,110,110,111,116,32,114,101, + 108,101,97,115,101,32,117,110,45,97,99,113,117,105,114,101, + 100,32,108,111,99,107,114,22,0,0,0,114,37,0,0,0, + 41,9,114,23,0,0,0,114,32,0,0,0,114,24,0,0, + 0,114,26,0,0,0,218,12,82,117,110,116,105,109,101,69, + 114,114,111,114,114,27,0,0,0,114,28,0,0,0,114,25, + 0,0,0,114,39,0,0,0,114,40,0,0,0,114,10,0, + 0,0,114,10,0,0,0,114,11,0,0,0,114,39,0,0, + 0,103,0,0,0,115,22,0,0,0,0,1,8,1,8,1, + 10,1,8,1,14,1,14,1,10,1,6,1,6,1,14,1, + 122,19,95,77,111,100,117,108,101,76,111,99,107,46,114,101, + 108,101,97,115,101,99,1,0,0,0,0,0,0,0,0,0, + 0,0,1,0,0,0,5,0,0,0,67,0,0,0,115,18, + 0,0,0,100,1,160,0,124,0,106,1,116,2,124,0,131, + 1,161,2,83,0,41,2,78,122,23,95,77,111,100,117,108, + 101,76,111,99,107,40,123,33,114,125,41,32,97,116,32,123, + 125,169,3,218,6,102,111,114,109,97,116,114,17,0,0,0, + 218,2,105,100,169,1,114,30,0,0,0,114,10,0,0,0, + 114,10,0,0,0,114,11,0,0,0,218,8,95,95,114,101, + 112,114,95,95,116,0,0,0,115,2,0,0,0,0,1,122, + 20,95,77,111,100,117,108,101,76,111,99,107,46,95,95,114, + 101,112,114,95,95,78,41,9,114,1,0,0,0,114,0,0, + 0,0,114,2,0,0,0,114,3,0,0,0,114,31,0,0, + 0,114,36,0,0,0,114,38,0,0,0,114,39,0,0,0, + 114,47,0,0,0,114,10,0,0,0,114,10,0,0,0,114, + 10,0,0,0,114,11,0,0,0,114,20,0,0,0,52,0, + 0,0,115,12,0,0,0,8,1,4,5,8,8,8,12,8, + 25,8,13,114,20,0,0,0,99,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,2,0,0,0,64,0,0, + 0,115,48,0,0,0,101,0,90,1,100,0,90,2,100,1, + 90,3,100,2,100,3,132,0,90,4,100,4,100,5,132,0, + 90,5,100,6,100,7,132,0,90,6,100,8,100,9,132,0, + 90,7,100,10,83,0,41,11,218,16,95,68,117,109,109,121, + 77,111,100,117,108,101,76,111,99,107,122,86,65,32,115,105, + 109,112,108,101,32,95,77,111,100,117,108,101,76,111,99,107, + 32,101,113,117,105,118,97,108,101,110,116,32,102,111,114,32, + 80,121,116,104,111,110,32,98,117,105,108,100,115,32,119,105, + 116,104,111,117,116,10,32,32,32,32,109,117,108,116,105,45, + 116,104,114,101,97,100,105,110,103,32,115,117,112,112,111,114, + 116,46,99,2,0,0,0,0,0,0,0,0,0,0,0,2, + 0,0,0,2,0,0,0,67,0,0,0,115,16,0,0,0, + 124,1,124,0,95,0,100,1,124,0,95,1,100,0,83,0, + 114,21,0,0,0,41,2,114,17,0,0,0,114,27,0,0, + 0,114,29,0,0,0,114,10,0,0,0,114,10,0,0,0, + 114,11,0,0,0,114,31,0,0,0,124,0,0,0,115,4, + 0,0,0,0,1,6,1,122,25,95,68,117,109,109,121,77, + 111,100,117,108,101,76,111,99,107,46,95,95,105,110,105,116, + 95,95,99,1,0,0,0,0,0,0,0,0,0,0,0,1, + 0,0,0,3,0,0,0,67,0,0,0,115,18,0,0,0, + 124,0,4,0,106,0,100,1,55,0,2,0,95,0,100,2, + 83,0,41,3,78,114,37,0,0,0,84,41,1,114,27,0, + 0,0,114,46,0,0,0,114,10,0,0,0,114,10,0,0, + 0,114,11,0,0,0,114,38,0,0,0,128,0,0,0,115, + 4,0,0,0,0,1,14,1,122,24,95,68,117,109,109,121, + 77,111,100,117,108,101,76,111,99,107,46,97,99,113,117,105, + 114,101,99,1,0,0,0,0,0,0,0,0,0,0,0,1, + 0,0,0,3,0,0,0,67,0,0,0,115,36,0,0,0, + 124,0,106,0,100,1,107,2,114,18,116,1,100,2,131,1, + 130,1,124,0,4,0,106,0,100,3,56,0,2,0,95,0, + 100,0,83,0,41,4,78,114,22,0,0,0,114,41,0,0, + 0,114,37,0,0,0,41,2,114,27,0,0,0,114,42,0, + 0,0,114,46,0,0,0,114,10,0,0,0,114,10,0,0, + 0,114,11,0,0,0,114,39,0,0,0,132,0,0,0,115, + 6,0,0,0,0,1,10,1,8,1,122,24,95,68,117,109, + 109,121,77,111,100,117,108,101,76,111,99,107,46,114,101,108, + 101,97,115,101,99,1,0,0,0,0,0,0,0,0,0,0, + 0,1,0,0,0,5,0,0,0,67,0,0,0,115,18,0, + 0,0,100,1,160,0,124,0,106,1,116,2,124,0,131,1, + 161,2,83,0,41,2,78,122,28,95,68,117,109,109,121,77, + 111,100,117,108,101,76,111,99,107,40,123,33,114,125,41,32, + 97,116,32,123,125,114,43,0,0,0,114,46,0,0,0,114, + 10,0,0,0,114,10,0,0,0,114,11,0,0,0,114,47, + 0,0,0,137,0,0,0,115,2,0,0,0,0,1,122,25, 95,68,117,109,109,121,77,111,100,117,108,101,76,111,99,107, - 46,114,101,108,101,97,115,101,99,1,0,0,0,0,0,0, - 0,0,0,0,0,1,0,0,0,5,0,0,0,67,0,0, - 0,115,18,0,0,0,100,1,160,0,124,0,106,1,116,2, - 124,0,131,1,161,2,83,0,41,2,78,122,28,95,68,117, - 109,109,121,77,111,100,117,108,101,76,111,99,107,40,123,33, - 114,125,41,32,97,116,32,123,125,114,43,0,0,0,114,46, - 0,0,0,114,10,0,0,0,114,10,0,0,0,114,11,0, - 0,0,114,47,0,0,0,137,0,0,0,115,2,0,0,0, - 0,1,122,25,95,68,117,109,109,121,77,111,100,117,108,101, - 76,111,99,107,46,95,95,114,101,112,114,95,95,78,41,8, - 114,1,0,0,0,114,0,0,0,0,114,2,0,0,0,114, - 3,0,0,0,114,31,0,0,0,114,38,0,0,0,114,39, - 0,0,0,114,47,0,0,0,114,10,0,0,0,114,10,0, - 0,0,114,10,0,0,0,114,11,0,0,0,114,48,0,0, - 0,120,0,0,0,115,10,0,0,0,8,1,4,3,8,4, - 8,4,8,5,114,48,0,0,0,99,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,2,0,0,0,64,0, - 0,0,115,36,0,0,0,101,0,90,1,100,0,90,2,100, - 1,100,2,132,0,90,3,100,3,100,4,132,0,90,4,100, - 5,100,6,132,0,90,5,100,7,83,0,41,8,218,18,95, - 77,111,100,117,108,101,76,111,99,107,77,97,110,97,103,101, - 114,99,2,0,0,0,0,0,0,0,0,0,0,0,2,0, - 0,0,2,0,0,0,67,0,0,0,115,16,0,0,0,124, - 1,124,0,95,0,100,0,124,0,95,1,100,0,83,0,114, - 13,0,0,0,41,2,218,5,95,110,97,109,101,218,5,95, - 108,111,99,107,114,29,0,0,0,114,10,0,0,0,114,10, - 0,0,0,114,11,0,0,0,114,31,0,0,0,143,0,0, - 0,115,4,0,0,0,0,1,6,1,122,27,95,77,111,100, - 117,108,101,76,111,99,107,77,97,110,97,103,101,114,46,95, - 95,105,110,105,116,95,95,99,1,0,0,0,0,0,0,0, - 0,0,0,0,1,0,0,0,2,0,0,0,67,0,0,0, - 115,26,0,0,0,116,0,124,0,106,1,131,1,124,0,95, - 2,124,0,106,2,160,3,161,0,1,0,100,0,83,0,114, - 13,0,0,0,41,4,218,16,95,103,101,116,95,109,111,100, - 117,108,101,95,108,111,99,107,114,50,0,0,0,114,51,0, - 0,0,114,38,0,0,0,114,46,0,0,0,114,10,0,0, - 0,114,10,0,0,0,114,11,0,0,0,218,9,95,95,101, - 110,116,101,114,95,95,147,0,0,0,115,4,0,0,0,0, - 1,12,1,122,28,95,77,111,100,117,108,101,76,111,99,107, - 77,97,110,97,103,101,114,46,95,95,101,110,116,101,114,95, - 95,99,1,0,0,0,0,0,0,0,0,0,0,0,3,0, - 0,0,2,0,0,0,79,0,0,0,115,14,0,0,0,124, - 0,106,0,160,1,161,0,1,0,100,0,83,0,114,13,0, - 0,0,41,2,114,51,0,0,0,114,39,0,0,0,41,3, - 114,30,0,0,0,218,4,97,114,103,115,90,6,107,119,97, - 114,103,115,114,10,0,0,0,114,10,0,0,0,114,11,0, - 0,0,218,8,95,95,101,120,105,116,95,95,151,0,0,0, - 115,2,0,0,0,0,1,122,27,95,77,111,100,117,108,101, - 76,111,99,107,77,97,110,97,103,101,114,46,95,95,101,120, - 105,116,95,95,78,41,6,114,1,0,0,0,114,0,0,0, - 0,114,2,0,0,0,114,31,0,0,0,114,53,0,0,0, - 114,55,0,0,0,114,10,0,0,0,114,10,0,0,0,114, - 10,0,0,0,114,11,0,0,0,114,49,0,0,0,141,0, - 0,0,115,6,0,0,0,8,2,8,4,8,4,114,49,0, - 0,0,99,1,0,0,0,0,0,0,0,0,0,0,0,3, - 0,0,0,8,0,0,0,67,0,0,0,115,130,0,0,0, - 116,0,160,1,161,0,1,0,122,106,122,14,116,3,124,0, - 25,0,131,0,125,1,87,0,110,24,4,0,116,4,107,10, - 114,48,1,0,1,0,1,0,100,1,125,1,89,0,110,2, - 88,0,124,1,100,1,107,8,114,112,116,5,100,1,107,8, - 114,76,116,6,124,0,131,1,125,1,110,8,116,7,124,0, - 131,1,125,1,124,0,102,1,100,2,100,3,132,1,125,2, - 116,8,160,9,124,1,124,2,161,2,116,3,124,0,60,0, - 87,0,53,0,116,0,160,2,161,0,1,0,88,0,124,1, - 83,0,41,4,122,139,71,101,116,32,111,114,32,99,114,101, - 97,116,101,32,116,104,101,32,109,111,100,117,108,101,32,108, - 111,99,107,32,102,111,114,32,97,32,103,105,118,101,110,32, - 109,111,100,117,108,101,32,110,97,109,101,46,10,10,32,32, - 32,32,65,99,113,117,105,114,101,47,114,101,108,101,97,115, - 101,32,105,110,116,101,114,110,97,108,108,121,32,116,104,101, - 32,103,108,111,98,97,108,32,105,109,112,111,114,116,32,108, - 111,99,107,32,116,111,32,112,114,111,116,101,99,116,10,32, - 32,32,32,95,109,111,100,117,108,101,95,108,111,99,107,115, - 46,78,99,2,0,0,0,0,0,0,0,0,0,0,0,2, - 0,0,0,8,0,0,0,83,0,0,0,115,48,0,0,0, - 116,0,160,1,161,0,1,0,122,24,116,3,160,4,124,1, - 161,1,124,0,107,8,114,30,116,3,124,1,61,0,87,0, - 53,0,116,0,160,2,161,0,1,0,88,0,100,0,83,0, - 114,13,0,0,0,41,5,218,4,95,105,109,112,218,12,97, - 99,113,117,105,114,101,95,108,111,99,107,218,12,114,101,108, - 101,97,115,101,95,108,111,99,107,218,13,95,109,111,100,117, - 108,101,95,108,111,99,107,115,114,34,0,0,0,41,2,218, - 3,114,101,102,114,17,0,0,0,114,10,0,0,0,114,10, - 0,0,0,114,11,0,0,0,218,2,99,98,176,0,0,0, - 115,10,0,0,0,0,1,8,1,2,4,14,1,10,2,122, - 28,95,103,101,116,95,109,111,100,117,108,101,95,108,111,99, - 107,46,60,108,111,99,97,108,115,62,46,99,98,41,10,114, - 56,0,0,0,114,57,0,0,0,114,58,0,0,0,114,59, - 0,0,0,218,8,75,101,121,69,114,114,111,114,114,23,0, - 0,0,114,48,0,0,0,114,20,0,0,0,218,8,95,119, - 101,97,107,114,101,102,114,60,0,0,0,41,3,114,17,0, - 0,0,114,24,0,0,0,114,61,0,0,0,114,10,0,0, - 0,114,10,0,0,0,114,11,0,0,0,114,52,0,0,0, - 157,0,0,0,115,28,0,0,0,0,6,8,1,2,1,2, - 1,14,1,14,1,10,2,8,1,8,1,10,2,8,2,12, - 11,20,2,10,2,114,52,0,0,0,99,1,0,0,0,0, + 46,95,95,114,101,112,114,95,95,78,41,8,114,1,0,0, + 0,114,0,0,0,0,114,2,0,0,0,114,3,0,0,0, + 114,31,0,0,0,114,38,0,0,0,114,39,0,0,0,114, + 47,0,0,0,114,10,0,0,0,114,10,0,0,0,114,10, + 0,0,0,114,11,0,0,0,114,48,0,0,0,120,0,0, + 0,115,10,0,0,0,8,1,4,3,8,4,8,4,8,5, + 114,48,0,0,0,99,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,2,0,0,0,64,0,0,0,115,36, + 0,0,0,101,0,90,1,100,0,90,2,100,1,100,2,132, + 0,90,3,100,3,100,4,132,0,90,4,100,5,100,6,132, + 0,90,5,100,7,83,0,41,8,218,18,95,77,111,100,117, + 108,101,76,111,99,107,77,97,110,97,103,101,114,99,2,0, + 0,0,0,0,0,0,0,0,0,0,2,0,0,0,2,0, + 0,0,67,0,0,0,115,16,0,0,0,124,1,124,0,95, + 0,100,0,124,0,95,1,100,0,83,0,114,13,0,0,0, + 41,2,218,5,95,110,97,109,101,218,5,95,108,111,99,107, + 114,29,0,0,0,114,10,0,0,0,114,10,0,0,0,114, + 11,0,0,0,114,31,0,0,0,143,0,0,0,115,4,0, + 0,0,0,1,6,1,122,27,95,77,111,100,117,108,101,76, + 111,99,107,77,97,110,97,103,101,114,46,95,95,105,110,105, + 116,95,95,99,1,0,0,0,0,0,0,0,0,0,0,0, + 1,0,0,0,2,0,0,0,67,0,0,0,115,26,0,0, + 0,116,0,124,0,106,1,131,1,124,0,95,2,124,0,106, + 2,160,3,161,0,1,0,100,0,83,0,114,13,0,0,0, + 41,4,218,16,95,103,101,116,95,109,111,100,117,108,101,95, + 108,111,99,107,114,50,0,0,0,114,51,0,0,0,114,38, + 0,0,0,114,46,0,0,0,114,10,0,0,0,114,10,0, + 0,0,114,11,0,0,0,218,9,95,95,101,110,116,101,114, + 95,95,147,0,0,0,115,4,0,0,0,0,1,12,1,122, + 28,95,77,111,100,117,108,101,76,111,99,107,77,97,110,97, + 103,101,114,46,95,95,101,110,116,101,114,95,95,99,1,0, + 0,0,0,0,0,0,0,0,0,0,3,0,0,0,2,0, + 0,0,79,0,0,0,115,14,0,0,0,124,0,106,0,160, + 1,161,0,1,0,100,0,83,0,114,13,0,0,0,41,2, + 114,51,0,0,0,114,39,0,0,0,41,3,114,30,0,0, + 0,218,4,97,114,103,115,90,6,107,119,97,114,103,115,114, + 10,0,0,0,114,10,0,0,0,114,11,0,0,0,218,8, + 95,95,101,120,105,116,95,95,151,0,0,0,115,2,0,0, + 0,0,1,122,27,95,77,111,100,117,108,101,76,111,99,107, + 77,97,110,97,103,101,114,46,95,95,101,120,105,116,95,95, + 78,41,6,114,1,0,0,0,114,0,0,0,0,114,2,0, + 0,0,114,31,0,0,0,114,53,0,0,0,114,55,0,0, + 0,114,10,0,0,0,114,10,0,0,0,114,10,0,0,0, + 114,11,0,0,0,114,49,0,0,0,141,0,0,0,115,6, + 0,0,0,8,2,8,4,8,4,114,49,0,0,0,99,1, + 0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,8, + 0,0,0,67,0,0,0,115,138,0,0,0,116,0,160,1, + 161,0,1,0,122,114,122,14,116,2,124,0,25,0,131,0, + 125,1,87,0,110,24,4,0,116,3,107,10,114,48,1,0, + 1,0,1,0,100,1,125,1,89,0,110,2,48,0,124,1, + 100,1,107,8,114,112,116,4,100,1,107,8,114,76,116,5, + 124,0,131,1,125,1,110,8,116,6,124,0,131,1,125,1, + 124,0,102,1,100,2,100,3,132,1,125,2,116,7,160,8, + 124,1,124,2,161,2,116,2,124,0,60,0,87,0,116,0, + 160,9,161,0,1,0,110,10,116,0,160,9,161,0,1,0, + 48,0,124,1,83,0,41,4,122,139,71,101,116,32,111,114, + 32,99,114,101,97,116,101,32,116,104,101,32,109,111,100,117, + 108,101,32,108,111,99,107,32,102,111,114,32,97,32,103,105, + 118,101,110,32,109,111,100,117,108,101,32,110,97,109,101,46, + 10,10,32,32,32,32,65,99,113,117,105,114,101,47,114,101, + 108,101,97,115,101,32,105,110,116,101,114,110,97,108,108,121, + 32,116,104,101,32,103,108,111,98,97,108,32,105,109,112,111, + 114,116,32,108,111,99,107,32,116,111,32,112,114,111,116,101, + 99,116,10,32,32,32,32,95,109,111,100,117,108,101,95,108, + 111,99,107,115,46,78,99,2,0,0,0,0,0,0,0,0, + 0,0,0,2,0,0,0,8,0,0,0,83,0,0,0,115, + 56,0,0,0,116,0,160,1,161,0,1,0,122,32,116,2, + 160,3,124,1,161,1,124,0,107,8,114,30,116,2,124,1, + 61,0,87,0,116,0,160,4,161,0,1,0,110,10,116,0, + 160,4,161,0,1,0,48,0,100,0,83,0,114,13,0,0, + 0,41,5,218,4,95,105,109,112,218,12,97,99,113,117,105, + 114,101,95,108,111,99,107,218,13,95,109,111,100,117,108,101, + 95,108,111,99,107,115,114,34,0,0,0,218,12,114,101,108, + 101,97,115,101,95,108,111,99,107,41,2,218,3,114,101,102, + 114,17,0,0,0,114,10,0,0,0,114,10,0,0,0,114, + 11,0,0,0,218,2,99,98,176,0,0,0,115,12,0,0, + 0,0,1,8,1,2,4,14,1,8,2,10,0,122,28,95, + 103,101,116,95,109,111,100,117,108,101,95,108,111,99,107,46, + 60,108,111,99,97,108,115,62,46,99,98,41,10,114,56,0, + 0,0,114,57,0,0,0,114,58,0,0,0,218,8,75,101, + 121,69,114,114,111,114,114,23,0,0,0,114,48,0,0,0, + 114,20,0,0,0,218,8,95,119,101,97,107,114,101,102,114, + 60,0,0,0,114,59,0,0,0,41,3,114,17,0,0,0, + 114,24,0,0,0,114,61,0,0,0,114,10,0,0,0,114, + 10,0,0,0,114,11,0,0,0,114,52,0,0,0,157,0, + 0,0,115,30,0,0,0,0,6,8,1,2,1,2,1,14, + 1,14,1,10,2,8,1,8,1,10,2,8,2,12,11,18, + 2,10,0,10,2,114,52,0,0,0,99,1,0,0,0,0, 0,0,0,0,0,0,0,2,0,0,0,8,0,0,0,67, 0,0,0,115,54,0,0,0,116,0,124,0,131,1,125,1, 122,12,124,1,160,1,161,0,1,0,87,0,110,20,4,0, 116,2,107,10,114,40,1,0,1,0,1,0,89,0,110,10, - 88,0,124,1,160,3,161,0,1,0,100,1,83,0,41,2, + 48,0,124,1,160,3,161,0,1,0,100,1,83,0,41,2, 122,189,65,99,113,117,105,114,101,115,32,116,104,101,110,32, 114,101,108,101,97,115,101,115,32,116,104,101,32,109,111,100, 117,108,101,32,108,111,99,107,32,102,111,114,32,97,32,103, @@ -493,17 +498,17 @@ const unsigned char _Py_M__importlib_bootstrap[] = { 0,0,115,226,0,0,0,116,0,124,0,100,1,100,0,131, 3,125,1,116,1,124,1,100,2,131,2,114,56,122,12,124, 1,160,2,124,0,161,1,87,0,83,0,4,0,116,3,107, - 10,114,54,1,0,1,0,1,0,89,0,110,2,88,0,122, + 10,114,54,1,0,1,0,1,0,89,0,110,2,48,0,122, 10,124,0,106,4,125,2,87,0,110,20,4,0,116,5,107, - 10,114,86,1,0,1,0,1,0,89,0,110,18,88,0,124, + 10,114,86,1,0,1,0,1,0,89,0,110,18,48,0,124, 2,100,0,107,9,114,104,116,6,124,2,131,1,83,0,122, 10,124,0,106,7,125,3,87,0,110,24,4,0,116,5,107, 10,114,138,1,0,1,0,1,0,100,3,125,3,89,0,110, - 2,88,0,122,10,124,0,106,8,125,4,87,0,110,58,4, + 2,48,0,122,10,124,0,106,8,125,4,87,0,110,58,4, 0,116,5,107,10,114,208,1,0,1,0,1,0,124,1,100, 0,107,8,114,188,100,4,160,9,124,3,161,1,6,0,89, 0,83,0,100,5,160,9,124,3,124,1,161,2,6,0,89, - 0,83,0,89,0,110,14,88,0,100,6,160,9,124,3,124, + 0,83,0,89,0,110,14,48,0,100,6,160,9,124,3,124, 4,161,2,83,0,100,0,83,0,41,7,78,218,10,95,95, 108,111,97,100,101,114,95,95,218,11,109,111,100,117,108,101, 95,114,101,112,114,250,1,63,250,13,60,109,111,100,117,108, @@ -676,7 +681,7 @@ const unsigned char _Py_M__importlib_bootstrap[] = { 107,2,111,76,124,0,106,4,124,1,106,4,107,2,111,76, 124,0,106,5,124,1,106,5,107,2,87,0,83,0,4,0, 116,6,107,10,114,102,1,0,1,0,1,0,116,7,6,0, - 89,0,83,0,88,0,100,0,83,0,114,13,0,0,0,41, + 89,0,83,0,48,0,100,0,83,0,114,13,0,0,0,41, 8,114,115,0,0,0,114,17,0,0,0,114,108,0,0,0, 114,112,0,0,0,218,6,99,97,99,104,101,100,218,12,104, 97,115,95,108,111,99,97,116,105,111,110,114,105,0,0,0, @@ -753,7 +758,7 @@ const unsigned char _Py_M__importlib_bootstrap[] = { 116,0,124,1,100,5,131,2,114,134,122,14,124,1,160,4, 124,0,161,1,125,3,87,0,113,138,4,0,116,5,107,10, 114,130,1,0,1,0,1,0,100,2,125,3,89,0,113,138, - 88,0,110,4,100,6,125,3,116,6,124,0,124,1,124,2, + 48,0,110,4,100,6,125,3,116,6,124,0,124,1,124,2, 124,3,100,7,141,4,83,0,41,8,122,53,82,101,116,117, 114,110,32,97,32,109,111,100,117,108,101,32,115,112,101,99, 32,98,97,115,101,100,32,111,110,32,118,97,114,105,111,117, @@ -774,22 +779,22 @@ const unsigned char _Py_M__importlib_bootstrap[] = { 99,3,0,0,0,0,0,0,0,0,0,0,0,8,0,0, 0,8,0,0,0,67,0,0,0,115,56,1,0,0,122,10, 124,0,106,0,125,3,87,0,110,20,4,0,116,1,107,10, - 114,30,1,0,1,0,1,0,89,0,110,14,88,0,124,3, + 114,30,1,0,1,0,1,0,89,0,110,14,48,0,124,3, 100,0,107,9,114,44,124,3,83,0,124,0,106,2,125,4, 124,1,100,0,107,8,114,90,122,10,124,0,106,3,125,1, 87,0,110,20,4,0,116,1,107,10,114,88,1,0,1,0, - 1,0,89,0,110,2,88,0,122,10,124,0,106,4,125,5, + 1,0,89,0,110,2,48,0,122,10,124,0,106,4,125,5, 87,0,110,24,4,0,116,1,107,10,114,124,1,0,1,0, - 1,0,100,0,125,5,89,0,110,2,88,0,124,2,100,0, + 1,0,100,0,125,5,89,0,110,2,48,0,124,2,100,0, 107,8,114,184,124,5,100,0,107,8,114,180,122,10,124,1, 106,5,125,2,87,0,113,184,4,0,116,1,107,10,114,176, - 1,0,1,0,1,0,100,0,125,2,89,0,113,184,88,0, + 1,0,1,0,1,0,100,0,125,2,89,0,113,184,48,0, 110,4,124,5,125,2,122,10,124,0,106,6,125,6,87,0, 110,24,4,0,116,1,107,10,114,218,1,0,1,0,1,0, - 100,0,125,6,89,0,110,2,88,0,122,14,116,7,124,0, + 100,0,125,6,89,0,110,2,48,0,122,14,116,7,124,0, 106,8,131,1,125,7,87,0,110,26,4,0,116,1,107,10, 144,1,114,4,1,0,1,0,1,0,100,0,125,7,89,0, - 110,2,88,0,116,9,124,4,124,1,124,2,100,1,141,3, + 110,2,48,0,116,9,124,4,124,1,124,2,100,1,141,3, 125,3,124,5,100,0,107,8,144,1,114,34,100,2,110,2, 100,3,124,3,95,10,124,6,124,3,95,11,124,7,124,3, 95,12,124,3,83,0,41,4,78,169,1,114,112,0,0,0, @@ -814,7 +819,7 @@ const unsigned char _Py_M__importlib_bootstrap[] = { 0,0,0,115,226,1,0,0,124,2,115,20,116,0,124,1, 100,1,100,0,131,3,100,0,107,8,114,54,122,12,124,0, 106,1,124,1,95,2,87,0,110,20,4,0,116,3,107,10, - 114,52,1,0,1,0,1,0,89,0,110,2,88,0,124,2, + 114,52,1,0,1,0,1,0,89,0,110,2,48,0,124,2, 115,74,116,0,124,1,100,2,100,0,131,3,100,0,107,8, 114,178,124,0,106,4,125,3,124,3,100,0,107,8,114,146, 124,0,106,5,100,0,107,9,114,146,116,6,100,0,107,8, @@ -822,26 +827,26 @@ const unsigned char _Py_M__importlib_bootstrap[] = { 124,4,161,1,125,3,124,0,106,5,124,3,95,10,124,3, 124,0,95,4,100,0,124,1,95,11,122,10,124,3,124,1, 95,12,87,0,110,20,4,0,116,3,107,10,114,176,1,0, - 1,0,1,0,89,0,110,2,88,0,124,2,115,198,116,0, + 1,0,1,0,89,0,110,2,48,0,124,2,115,198,116,0, 124,1,100,3,100,0,131,3,100,0,107,8,114,232,122,12, 124,0,106,13,124,1,95,14,87,0,110,20,4,0,116,3, - 107,10,114,230,1,0,1,0,1,0,89,0,110,2,88,0, + 107,10,114,230,1,0,1,0,1,0,89,0,110,2,48,0, 122,10,124,0,124,1,95,15,87,0,110,22,4,0,116,3, 107,10,144,1,114,8,1,0,1,0,1,0,89,0,110,2, - 88,0,124,2,144,1,115,34,116,0,124,1,100,4,100,0, + 48,0,124,2,144,1,115,34,116,0,124,1,100,4,100,0, 131,3,100,0,107,8,144,1,114,82,124,0,106,5,100,0, 107,9,144,1,114,82,122,12,124,0,106,5,124,1,95,16, 87,0,110,22,4,0,116,3,107,10,144,1,114,80,1,0, - 1,0,1,0,89,0,110,2,88,0,124,0,106,17,144,1, + 1,0,1,0,89,0,110,2,48,0,124,0,106,17,144,1, 114,222,124,2,144,1,115,114,116,0,124,1,100,5,100,0, 131,3,100,0,107,8,144,1,114,150,122,12,124,0,106,18, 124,1,95,11,87,0,110,22,4,0,116,3,107,10,144,1, - 114,148,1,0,1,0,1,0,89,0,110,2,88,0,124,2, + 114,148,1,0,1,0,1,0,89,0,110,2,48,0,124,2, 144,1,115,174,116,0,124,1,100,6,100,0,131,3,100,0, 107,8,144,1,114,222,124,0,106,19,100,0,107,9,144,1, 114,222,122,12,124,0,106,19,124,1,95,20,87,0,110,22, 4,0,116,3,107,10,144,1,114,220,1,0,1,0,1,0, - 89,0,110,2,88,0,124,1,83,0,41,7,78,114,1,0, + 89,0,110,2,48,0,124,1,83,0,41,7,78,114,1,0, 0,0,114,97,0,0,0,218,11,95,95,112,97,99,107,97, 103,101,95,95,114,140,0,0,0,114,107,0,0,0,114,138, 0,0,0,41,21,114,6,0,0,0,114,17,0,0,0,114, @@ -906,886 +911,894 @@ const unsigned char _Py_M__importlib_bootstrap[] = { 114,106,0,0,0,54,2,0,0,115,16,0,0,0,0,3, 20,1,10,1,10,1,10,2,16,2,6,1,14,2,114,106, 0,0,0,99,2,0,0,0,0,0,0,0,0,0,0,0, - 4,0,0,0,10,0,0,0,67,0,0,0,115,204,0,0, - 0,124,0,106,0,125,2,116,1,124,2,131,1,143,180,1, + 4,0,0,0,10,0,0,0,67,0,0,0,115,250,0,0, + 0,124,0,106,0,125,2,116,1,124,2,131,1,143,216,1, 0,116,2,106,3,160,4,124,2,161,1,124,1,107,9,114, 54,100,1,160,5,124,2,161,1,125,3,116,6,124,3,124, - 2,100,2,141,2,130,1,122,106,124,0,106,8,100,3,107, - 8,114,106,124,0,106,9,100,3,107,8,114,90,116,6,100, - 4,124,0,106,0,100,2,141,2,130,1,116,10,124,0,124, - 1,100,5,100,6,141,3,1,0,110,52,116,10,124,0,124, - 1,100,5,100,6,141,3,1,0,116,11,124,0,106,8,100, - 7,131,2,115,146,124,0,106,8,160,12,124,2,161,1,1, - 0,110,12,124,0,106,8,160,13,124,1,161,1,1,0,87, - 0,53,0,116,2,106,3,160,7,124,0,106,0,161,1,125, - 1,124,1,116,2,106,3,124,0,106,0,60,0,88,0,87, - 0,53,0,81,0,82,0,88,0,124,1,83,0,41,8,122, - 70,69,120,101,99,117,116,101,32,116,104,101,32,115,112,101, - 99,39,115,32,115,112,101,99,105,102,105,101,100,32,109,111, - 100,117,108,101,32,105,110,32,97,110,32,101,120,105,115,116, - 105,110,103,32,109,111,100,117,108,101,39,115,32,110,97,109, - 101,115,112,97,99,101,46,122,30,109,111,100,117,108,101,32, - 123,33,114,125,32,110,111,116,32,105,110,32,115,121,115,46, - 109,111,100,117,108,101,115,114,16,0,0,0,78,250,14,109, - 105,115,115,105,110,103,32,108,111,97,100,101,114,84,114,142, - 0,0,0,114,149,0,0,0,41,14,114,17,0,0,0,114, - 49,0,0,0,114,15,0,0,0,114,91,0,0,0,114,34, - 0,0,0,114,44,0,0,0,114,78,0,0,0,218,3,112, - 111,112,114,108,0,0,0,114,115,0,0,0,114,147,0,0, - 0,114,4,0,0,0,218,11,108,111,97,100,95,109,111,100, - 117,108,101,114,149,0,0,0,41,4,114,94,0,0,0,114, - 95,0,0,0,114,17,0,0,0,218,3,109,115,103,114,10, - 0,0,0,114,10,0,0,0,114,11,0,0,0,114,92,0, - 0,0,71,2,0,0,115,34,0,0,0,0,2,6,1,10, - 1,16,1,10,1,12,1,2,1,10,1,10,1,14,2,16, - 2,14,1,12,4,14,2,16,4,14,1,24,1,114,92,0, - 0,0,99,1,0,0,0,0,0,0,0,0,0,0,0,2, - 0,0,0,8,0,0,0,67,0,0,0,115,26,1,0,0, - 122,18,124,0,106,0,160,1,124,0,106,2,161,1,1,0, - 87,0,110,52,1,0,1,0,1,0,124,0,106,2,116,3, - 106,4,107,6,114,64,116,3,106,4,160,5,124,0,106,2, - 161,1,125,1,124,1,116,3,106,4,124,0,106,2,60,0, - 130,0,89,0,110,2,88,0,116,3,106,4,160,5,124,0, + 2,100,2,141,2,130,1,122,132,124,0,106,7,100,3,107, + 8,114,106,124,0,106,8,100,3,107,8,114,90,116,6,100, + 4,124,0,106,0,100,2,141,2,130,1,116,9,124,0,124, + 1,100,5,100,6,141,3,1,0,110,52,116,9,124,0,124, + 1,100,5,100,6,141,3,1,0,116,10,124,0,106,7,100, + 7,131,2,115,146,124,0,106,7,160,11,124,2,161,1,1, + 0,110,12,124,0,106,7,160,12,124,1,161,1,1,0,87, + 0,116,2,106,3,160,13,124,0,106,0,161,1,125,1,124, + 1,116,2,106,3,124,0,106,0,60,0,110,28,116,2,106, + 3,160,13,124,0,106,0,161,1,125,1,124,1,116,2,106, + 3,124,0,106,0,60,0,48,0,87,0,100,3,4,0,4, + 0,131,3,1,0,110,16,49,0,115,236,48,0,1,0,1, + 0,1,0,89,0,1,0,124,1,83,0,41,8,122,70,69, + 120,101,99,117,116,101,32,116,104,101,32,115,112,101,99,39, + 115,32,115,112,101,99,105,102,105,101,100,32,109,111,100,117, + 108,101,32,105,110,32,97,110,32,101,120,105,115,116,105,110, + 103,32,109,111,100,117,108,101,39,115,32,110,97,109,101,115, + 112,97,99,101,46,122,30,109,111,100,117,108,101,32,123,33, + 114,125,32,110,111,116,32,105,110,32,115,121,115,46,109,111, + 100,117,108,101,115,114,16,0,0,0,78,250,14,109,105,115, + 115,105,110,103,32,108,111,97,100,101,114,84,114,142,0,0, + 0,114,149,0,0,0,41,14,114,17,0,0,0,114,49,0, + 0,0,114,15,0,0,0,114,91,0,0,0,114,34,0,0, + 0,114,44,0,0,0,114,78,0,0,0,114,108,0,0,0, + 114,115,0,0,0,114,147,0,0,0,114,4,0,0,0,218, + 11,108,111,97,100,95,109,111,100,117,108,101,114,149,0,0, + 0,218,3,112,111,112,41,4,114,94,0,0,0,114,95,0, + 0,0,114,17,0,0,0,218,3,109,115,103,114,10,0,0, + 0,114,10,0,0,0,114,11,0,0,0,114,92,0,0,0, + 71,2,0,0,115,38,0,0,0,0,2,6,1,10,1,16, + 1,10,1,12,1,2,1,10,1,10,1,14,2,16,2,14, + 1,12,4,14,2,14,4,14,1,14,255,14,1,44,1,114, + 92,0,0,0,99,1,0,0,0,0,0,0,0,0,0,0, + 0,2,0,0,0,8,0,0,0,67,0,0,0,115,26,1, + 0,0,122,18,124,0,106,0,160,1,124,0,106,2,161,1, + 1,0,87,0,110,52,1,0,1,0,1,0,124,0,106,2, + 116,3,106,4,107,6,114,64,116,3,106,4,160,5,124,0, 106,2,161,1,125,1,124,1,116,3,106,4,124,0,106,2, - 60,0,116,6,124,1,100,1,100,0,131,3,100,0,107,8, - 114,148,122,12,124,0,106,0,124,1,95,7,87,0,110,20, - 4,0,116,8,107,10,114,146,1,0,1,0,1,0,89,0, - 110,2,88,0,116,6,124,1,100,2,100,0,131,3,100,0, - 107,8,114,226,122,40,124,1,106,9,124,1,95,10,116,11, - 124,1,100,3,131,2,115,202,124,0,106,2,160,12,100,4, - 161,1,100,5,25,0,124,1,95,10,87,0,110,20,4,0, - 116,8,107,10,114,224,1,0,1,0,1,0,89,0,110,2, - 88,0,116,6,124,1,100,6,100,0,131,3,100,0,107,8, - 144,1,114,22,122,10,124,0,124,1,95,13,87,0,110,22, - 4,0,116,8,107,10,144,1,114,20,1,0,1,0,1,0, - 89,0,110,2,88,0,124,1,83,0,41,7,78,114,97,0, - 0,0,114,144,0,0,0,114,140,0,0,0,114,127,0,0, - 0,114,22,0,0,0,114,104,0,0,0,41,14,114,108,0, - 0,0,114,155,0,0,0,114,17,0,0,0,114,15,0,0, - 0,114,91,0,0,0,114,154,0,0,0,114,6,0,0,0, - 114,97,0,0,0,114,105,0,0,0,114,1,0,0,0,114, - 144,0,0,0,114,4,0,0,0,114,128,0,0,0,114,104, - 0,0,0,114,150,0,0,0,114,10,0,0,0,114,10,0, - 0,0,114,11,0,0,0,218,25,95,108,111,97,100,95,98, - 97,99,107,119,97,114,100,95,99,111,109,112,97,116,105,98, - 108,101,101,2,0,0,115,54,0,0,0,0,4,2,1,18, - 1,6,1,12,1,14,1,12,1,8,3,14,1,12,1,16, - 1,2,1,12,1,14,1,6,1,16,1,2,4,8,1,10, - 1,22,1,14,1,6,1,18,1,2,1,10,1,16,1,6, - 1,114,157,0,0,0,99,1,0,0,0,0,0,0,0,0, - 0,0,0,2,0,0,0,11,0,0,0,67,0,0,0,115, - 220,0,0,0,124,0,106,0,100,0,107,9,114,30,116,1, - 124,0,106,0,100,1,131,2,115,30,116,2,124,0,131,1, - 83,0,116,3,124,0,131,1,125,1,100,2,124,0,95,4, - 122,162,124,1,116,5,106,6,124,0,106,7,60,0,122,52, - 124,0,106,0,100,0,107,8,114,96,124,0,106,8,100,0, - 107,8,114,108,116,9,100,4,124,0,106,7,100,5,141,2, - 130,1,110,12,124,0,106,0,160,10,124,1,161,1,1,0, - 87,0,110,50,1,0,1,0,1,0,122,14,116,5,106,6, - 124,0,106,7,61,0,87,0,110,20,4,0,116,11,107,10, - 114,152,1,0,1,0,1,0,89,0,110,2,88,0,130,0, - 89,0,110,2,88,0,116,5,106,6,160,12,124,0,106,7, - 161,1,125,1,124,1,116,5,106,6,124,0,106,7,60,0, - 116,13,100,6,124,0,106,7,124,0,106,0,131,3,1,0, - 87,0,53,0,100,3,124,0,95,4,88,0,124,1,83,0, - 41,7,78,114,149,0,0,0,84,70,114,153,0,0,0,114, - 16,0,0,0,122,18,105,109,112,111,114,116,32,123,33,114, - 125,32,35,32,123,33,114,125,41,14,114,108,0,0,0,114, - 4,0,0,0,114,157,0,0,0,114,151,0,0,0,90,13, - 95,105,110,105,116,105,97,108,105,122,105,110,103,114,15,0, - 0,0,114,91,0,0,0,114,17,0,0,0,114,115,0,0, - 0,114,78,0,0,0,114,149,0,0,0,114,62,0,0,0, - 114,154,0,0,0,114,75,0,0,0,114,150,0,0,0,114, - 10,0,0,0,114,10,0,0,0,114,11,0,0,0,218,14, - 95,108,111,97,100,95,117,110,108,111,99,107,101,100,138,2, - 0,0,115,46,0,0,0,0,2,10,2,12,1,8,2,8, - 5,6,1,2,1,12,1,2,1,10,1,10,1,16,3,16, - 1,6,1,2,1,14,1,14,1,6,1,8,5,14,1,12, - 1,20,2,8,2,114,158,0,0,0,99,1,0,0,0,0, - 0,0,0,0,0,0,0,1,0,0,0,10,0,0,0,67, - 0,0,0,115,42,0,0,0,116,0,124,0,106,1,131,1, - 143,22,1,0,116,2,124,0,131,1,87,0,2,0,53,0, - 81,0,82,0,163,0,83,0,81,0,82,0,88,0,100,1, - 83,0,41,2,122,191,82,101,116,117,114,110,32,97,32,110, - 101,119,32,109,111,100,117,108,101,32,111,98,106,101,99,116, - 44,32,108,111,97,100,101,100,32,98,121,32,116,104,101,32, - 115,112,101,99,39,115,32,108,111,97,100,101,114,46,10,10, - 32,32,32,32,84,104,101,32,109,111,100,117,108,101,32,105, - 115,32,110,111,116,32,97,100,100,101,100,32,116,111,32,105, - 116,115,32,112,97,114,101,110,116,46,10,10,32,32,32,32, - 73,102,32,97,32,109,111,100,117,108,101,32,105,115,32,97, - 108,114,101,97,100,121,32,105,110,32,115,121,115,46,109,111, - 100,117,108,101,115,44,32,116,104,97,116,32,101,120,105,115, - 116,105,110,103,32,109,111,100,117,108,101,32,103,101,116,115, - 10,32,32,32,32,99,108,111,98,98,101,114,101,100,46,10, - 10,32,32,32,32,78,41,3,114,49,0,0,0,114,17,0, - 0,0,114,158,0,0,0,41,1,114,94,0,0,0,114,10, - 0,0,0,114,10,0,0,0,114,11,0,0,0,114,93,0, - 0,0,180,2,0,0,115,4,0,0,0,0,9,12,1,114, - 93,0,0,0,99,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,4,0,0,0,64,0,0,0,115,140,0, - 0,0,101,0,90,1,100,0,90,2,100,1,90,3,100,2, - 90,4,101,5,100,3,100,4,132,0,131,1,90,6,101,7, - 100,20,100,6,100,7,132,1,131,1,90,8,101,7,100,21, - 100,8,100,9,132,1,131,1,90,9,101,7,100,10,100,11, - 132,0,131,1,90,10,101,7,100,12,100,13,132,0,131,1, - 90,11,101,7,101,12,100,14,100,15,132,0,131,1,131,1, - 90,13,101,7,101,12,100,16,100,17,132,0,131,1,131,1, - 90,14,101,7,101,12,100,18,100,19,132,0,131,1,131,1, - 90,15,101,7,101,16,131,1,90,17,100,5,83,0,41,22, - 218,15,66,117,105,108,116,105,110,73,109,112,111,114,116,101, - 114,122,144,77,101,116,97,32,112,97,116,104,32,105,109,112, - 111,114,116,32,102,111,114,32,98,117,105,108,116,45,105,110, - 32,109,111,100,117,108,101,115,46,10,10,32,32,32,32,65, - 108,108,32,109,101,116,104,111,100,115,32,97,114,101,32,101, - 105,116,104,101,114,32,99,108,97,115,115,32,111,114,32,115, - 116,97,116,105,99,32,109,101,116,104,111,100,115,32,116,111, - 32,97,118,111,105,100,32,116,104,101,32,110,101,101,100,32, - 116,111,10,32,32,32,32,105,110,115,116,97,110,116,105,97, - 116,101,32,116,104,101,32,99,108,97,115,115,46,10,10,32, - 32,32,32,122,8,98,117,105,108,116,45,105,110,99,1,0, - 0,0,0,0,0,0,0,0,0,0,1,0,0,0,5,0, - 0,0,67,0,0,0,115,22,0,0,0,100,1,124,0,106, - 0,155,2,100,2,116,1,106,2,155,0,100,3,157,5,83, - 0,41,4,250,115,82,101,116,117,114,110,32,114,101,112,114, - 32,102,111,114,32,116,104,101,32,109,111,100,117,108,101,46, - 10,10,32,32,32,32,32,32,32,32,84,104,101,32,109,101, - 116,104,111,100,32,105,115,32,100,101,112,114,101,99,97,116, - 101,100,46,32,32,84,104,101,32,105,109,112,111,114,116,32, - 109,97,99,104,105,110,101,114,121,32,100,111,101,115,32,116, - 104,101,32,106,111,98,32,105,116,115,101,108,102,46,10,10, - 32,32,32,32,32,32,32,32,122,8,60,109,111,100,117,108, - 101,32,122,2,32,40,122,2,41,62,41,3,114,1,0,0, - 0,114,159,0,0,0,114,137,0,0,0,41,1,114,95,0, - 0,0,114,10,0,0,0,114,10,0,0,0,114,11,0,0, - 0,114,98,0,0,0,206,2,0,0,115,2,0,0,0,0, - 7,122,27,66,117,105,108,116,105,110,73,109,112,111,114,116, - 101,114,46,109,111,100,117,108,101,95,114,101,112,114,78,99, - 4,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0, - 5,0,0,0,67,0,0,0,115,46,0,0,0,124,2,100, - 0,107,9,114,12,100,0,83,0,116,0,160,1,124,1,161, - 1,114,38,116,2,124,1,124,0,124,0,106,3,100,1,141, - 3,83,0,100,0,83,0,100,0,83,0,169,2,78,114,136, - 0,0,0,41,4,114,56,0,0,0,90,10,105,115,95,98, - 117,105,108,116,105,110,114,90,0,0,0,114,137,0,0,0, - 169,4,218,3,99,108,115,114,80,0,0,0,218,4,112,97, - 116,104,218,6,116,97,114,103,101,116,114,10,0,0,0,114, - 10,0,0,0,114,11,0,0,0,218,9,102,105,110,100,95, - 115,112,101,99,215,2,0,0,115,10,0,0,0,0,2,8, - 1,4,1,10,1,16,2,122,25,66,117,105,108,116,105,110, - 73,109,112,111,114,116,101,114,46,102,105,110,100,95,115,112, - 101,99,99,3,0,0,0,0,0,0,0,0,0,0,0,4, - 0,0,0,4,0,0,0,67,0,0,0,115,30,0,0,0, - 124,0,160,0,124,1,124,2,161,2,125,3,124,3,100,1, - 107,9,114,26,124,3,106,1,83,0,100,1,83,0,41,2, - 122,175,70,105,110,100,32,116,104,101,32,98,117,105,108,116, - 45,105,110,32,109,111,100,117,108,101,46,10,10,32,32,32, - 32,32,32,32,32,73,102,32,39,112,97,116,104,39,32,105, - 115,32,101,118,101,114,32,115,112,101,99,105,102,105,101,100, - 32,116,104,101,110,32,116,104,101,32,115,101,97,114,99,104, - 32,105,115,32,99,111,110,115,105,100,101,114,101,100,32,97, - 32,102,97,105,108,117,114,101,46,10,10,32,32,32,32,32, - 32,32,32,84,104,105,115,32,109,101,116,104,111,100,32,105, - 115,32,100,101,112,114,101,99,97,116,101,100,46,32,32,85, - 115,101,32,102,105,110,100,95,115,112,101,99,40,41,32,105, - 110,115,116,101,97,100,46,10,10,32,32,32,32,32,32,32, - 32,78,41,2,114,166,0,0,0,114,108,0,0,0,41,4, - 114,163,0,0,0,114,80,0,0,0,114,164,0,0,0,114, + 60,0,130,0,89,0,110,2,48,0,116,3,106,4,160,5, + 124,0,106,2,161,1,125,1,124,1,116,3,106,4,124,0, + 106,2,60,0,116,6,124,1,100,1,100,0,131,3,100,0, + 107,8,114,148,122,12,124,0,106,0,124,1,95,7,87,0, + 110,20,4,0,116,8,107,10,114,146,1,0,1,0,1,0, + 89,0,110,2,48,0,116,6,124,1,100,2,100,0,131,3, + 100,0,107,8,114,226,122,40,124,1,106,9,124,1,95,10, + 116,11,124,1,100,3,131,2,115,202,124,0,106,2,160,12, + 100,4,161,1,100,5,25,0,124,1,95,10,87,0,110,20, + 4,0,116,8,107,10,114,224,1,0,1,0,1,0,89,0, + 110,2,48,0,116,6,124,1,100,6,100,0,131,3,100,0, + 107,8,144,1,114,22,122,10,124,0,124,1,95,13,87,0, + 110,22,4,0,116,8,107,10,144,1,114,20,1,0,1,0, + 1,0,89,0,110,2,48,0,124,1,83,0,41,7,78,114, + 97,0,0,0,114,144,0,0,0,114,140,0,0,0,114,127, + 0,0,0,114,22,0,0,0,114,104,0,0,0,41,14,114, + 108,0,0,0,114,154,0,0,0,114,17,0,0,0,114,15, + 0,0,0,114,91,0,0,0,114,155,0,0,0,114,6,0, + 0,0,114,97,0,0,0,114,105,0,0,0,114,1,0,0, + 0,114,144,0,0,0,114,4,0,0,0,114,128,0,0,0, + 114,104,0,0,0,114,150,0,0,0,114,10,0,0,0,114, + 10,0,0,0,114,11,0,0,0,218,25,95,108,111,97,100, + 95,98,97,99,107,119,97,114,100,95,99,111,109,112,97,116, + 105,98,108,101,101,2,0,0,115,54,0,0,0,0,4,2, + 1,18,1,6,1,12,1,14,1,12,1,8,3,14,1,12, + 1,16,1,2,1,12,1,14,1,6,1,16,1,2,4,8, + 1,10,1,22,1,14,1,6,1,18,1,2,1,10,1,16, + 1,6,1,114,157,0,0,0,99,1,0,0,0,0,0,0, + 0,0,0,0,0,2,0,0,0,11,0,0,0,67,0,0, + 0,115,226,0,0,0,124,0,106,0,100,0,107,9,114,30, + 116,1,124,0,106,0,100,1,131,2,115,30,116,2,124,0, + 131,1,83,0,116,3,124,0,131,1,125,1,100,2,124,0, + 95,4,122,168,124,1,116,5,106,6,124,0,106,7,60,0, + 122,52,124,0,106,0,100,0,107,8,114,96,124,0,106,8, + 100,0,107,8,114,108,116,9,100,3,124,0,106,7,100,4, + 141,2,130,1,110,12,124,0,106,0,160,10,124,1,161,1, + 1,0,87,0,110,50,1,0,1,0,1,0,122,14,116,5, + 106,6,124,0,106,7,61,0,87,0,110,20,4,0,116,11, + 107,10,114,152,1,0,1,0,1,0,89,0,110,2,48,0, + 130,0,89,0,110,2,48,0,116,5,106,6,160,12,124,0, + 106,7,161,1,125,1,124,1,116,5,106,6,124,0,106,7, + 60,0,116,13,100,5,124,0,106,7,124,0,106,0,131,3, + 1,0,87,0,100,6,124,0,95,4,110,8,100,6,124,0, + 95,4,48,0,124,1,83,0,41,7,78,114,149,0,0,0, + 84,114,153,0,0,0,114,16,0,0,0,122,18,105,109,112, + 111,114,116,32,123,33,114,125,32,35,32,123,33,114,125,70, + 41,14,114,108,0,0,0,114,4,0,0,0,114,157,0,0, + 0,114,151,0,0,0,90,13,95,105,110,105,116,105,97,108, + 105,122,105,110,103,114,15,0,0,0,114,91,0,0,0,114, + 17,0,0,0,114,115,0,0,0,114,78,0,0,0,114,149, + 0,0,0,114,62,0,0,0,114,155,0,0,0,114,75,0, + 0,0,114,150,0,0,0,114,10,0,0,0,114,10,0,0, + 0,114,11,0,0,0,218,14,95,108,111,97,100,95,117,110, + 108,111,99,107,101,100,138,2,0,0,115,48,0,0,0,0, + 2,10,2,12,1,8,2,8,5,6,1,2,1,12,1,2, + 1,10,1,10,1,16,3,16,1,6,1,2,1,14,1,14, + 1,6,1,8,5,14,1,12,1,18,2,8,0,8,2,114, + 158,0,0,0,99,1,0,0,0,0,0,0,0,0,0,0, + 0,1,0,0,0,8,0,0,0,67,0,0,0,115,54,0, + 0,0,116,0,124,0,106,1,131,1,143,24,1,0,116,2, + 124,0,131,1,87,0,2,0,100,1,4,0,4,0,131,3, + 1,0,83,0,49,0,115,40,48,0,1,0,1,0,1,0, + 89,0,1,0,100,1,83,0,41,2,122,191,82,101,116,117, + 114,110,32,97,32,110,101,119,32,109,111,100,117,108,101,32, + 111,98,106,101,99,116,44,32,108,111,97,100,101,100,32,98, + 121,32,116,104,101,32,115,112,101,99,39,115,32,108,111,97, + 100,101,114,46,10,10,32,32,32,32,84,104,101,32,109,111, + 100,117,108,101,32,105,115,32,110,111,116,32,97,100,100,101, + 100,32,116,111,32,105,116,115,32,112,97,114,101,110,116,46, + 10,10,32,32,32,32,73,102,32,97,32,109,111,100,117,108, + 101,32,105,115,32,97,108,114,101,97,100,121,32,105,110,32, + 115,121,115,46,109,111,100,117,108,101,115,44,32,116,104,97, + 116,32,101,120,105,115,116,105,110,103,32,109,111,100,117,108, + 101,32,103,101,116,115,10,32,32,32,32,99,108,111,98,98, + 101,114,101,100,46,10,10,32,32,32,32,78,41,3,114,49, + 0,0,0,114,17,0,0,0,114,158,0,0,0,41,1,114, 94,0,0,0,114,10,0,0,0,114,10,0,0,0,114,11, - 0,0,0,218,11,102,105,110,100,95,109,111,100,117,108,101, - 224,2,0,0,115,4,0,0,0,0,9,12,1,122,27,66, + 0,0,0,114,93,0,0,0,180,2,0,0,115,4,0,0, + 0,0,9,12,1,114,93,0,0,0,99,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,64, + 0,0,0,115,140,0,0,0,101,0,90,1,100,0,90,2, + 100,1,90,3,100,2,90,4,101,5,100,3,100,4,132,0, + 131,1,90,6,101,7,100,20,100,6,100,7,132,1,131,1, + 90,8,101,7,100,21,100,8,100,9,132,1,131,1,90,9, + 101,7,100,10,100,11,132,0,131,1,90,10,101,7,100,12, + 100,13,132,0,131,1,90,11,101,7,101,12,100,14,100,15, + 132,0,131,1,131,1,90,13,101,7,101,12,100,16,100,17, + 132,0,131,1,131,1,90,14,101,7,101,12,100,18,100,19, + 132,0,131,1,131,1,90,15,101,7,101,16,131,1,90,17, + 100,5,83,0,41,22,218,15,66,117,105,108,116,105,110,73, + 109,112,111,114,116,101,114,122,144,77,101,116,97,32,112,97, + 116,104,32,105,109,112,111,114,116,32,102,111,114,32,98,117, + 105,108,116,45,105,110,32,109,111,100,117,108,101,115,46,10, + 10,32,32,32,32,65,108,108,32,109,101,116,104,111,100,115, + 32,97,114,101,32,101,105,116,104,101,114,32,99,108,97,115, + 115,32,111,114,32,115,116,97,116,105,99,32,109,101,116,104, + 111,100,115,32,116,111,32,97,118,111,105,100,32,116,104,101, + 32,110,101,101,100,32,116,111,10,32,32,32,32,105,110,115, + 116,97,110,116,105,97,116,101,32,116,104,101,32,99,108,97, + 115,115,46,10,10,32,32,32,32,122,8,98,117,105,108,116, + 45,105,110,99,1,0,0,0,0,0,0,0,0,0,0,0, + 1,0,0,0,5,0,0,0,67,0,0,0,115,22,0,0, + 0,100,1,124,0,106,0,155,2,100,2,116,1,106,2,155, + 0,100,3,157,5,83,0,41,4,250,115,82,101,116,117,114, + 110,32,114,101,112,114,32,102,111,114,32,116,104,101,32,109, + 111,100,117,108,101,46,10,10,32,32,32,32,32,32,32,32, + 84,104,101,32,109,101,116,104,111,100,32,105,115,32,100,101, + 112,114,101,99,97,116,101,100,46,32,32,84,104,101,32,105, + 109,112,111,114,116,32,109,97,99,104,105,110,101,114,121,32, + 100,111,101,115,32,116,104,101,32,106,111,98,32,105,116,115, + 101,108,102,46,10,10,32,32,32,32,32,32,32,32,122,8, + 60,109,111,100,117,108,101,32,122,2,32,40,122,2,41,62, + 41,3,114,1,0,0,0,114,159,0,0,0,114,137,0,0, + 0,41,1,114,95,0,0,0,114,10,0,0,0,114,10,0, + 0,0,114,11,0,0,0,114,98,0,0,0,206,2,0,0, + 115,2,0,0,0,0,7,122,27,66,117,105,108,116,105,110, + 73,109,112,111,114,116,101,114,46,109,111,100,117,108,101,95, + 114,101,112,114,78,99,4,0,0,0,0,0,0,0,0,0, + 0,0,4,0,0,0,5,0,0,0,67,0,0,0,115,46, + 0,0,0,124,2,100,0,107,9,114,12,100,0,83,0,116, + 0,160,1,124,1,161,1,114,38,116,2,124,1,124,0,124, + 0,106,3,100,1,141,3,83,0,100,0,83,0,100,0,83, + 0,169,2,78,114,136,0,0,0,41,4,114,56,0,0,0, + 90,10,105,115,95,98,117,105,108,116,105,110,114,90,0,0, + 0,114,137,0,0,0,169,4,218,3,99,108,115,114,80,0, + 0,0,218,4,112,97,116,104,218,6,116,97,114,103,101,116, + 114,10,0,0,0,114,10,0,0,0,114,11,0,0,0,218, + 9,102,105,110,100,95,115,112,101,99,215,2,0,0,115,10, + 0,0,0,0,2,8,1,4,1,10,1,16,2,122,25,66, 117,105,108,116,105,110,73,109,112,111,114,116,101,114,46,102, - 105,110,100,95,109,111,100,117,108,101,99,2,0,0,0,0, - 0,0,0,0,0,0,0,2,0,0,0,4,0,0,0,67, - 0,0,0,115,46,0,0,0,124,1,106,0,116,1,106,2, - 107,7,114,34,116,3,100,1,160,4,124,1,106,0,161,1, - 124,1,106,0,100,2,141,2,130,1,116,5,116,6,106,7, - 124,1,131,2,83,0,41,3,122,24,67,114,101,97,116,101, - 32,97,32,98,117,105,108,116,45,105,110,32,109,111,100,117, - 108,101,114,76,0,0,0,114,16,0,0,0,41,8,114,17, - 0,0,0,114,15,0,0,0,114,77,0,0,0,114,78,0, - 0,0,114,44,0,0,0,114,66,0,0,0,114,56,0,0, - 0,90,14,99,114,101,97,116,101,95,98,117,105,108,116,105, - 110,41,2,114,30,0,0,0,114,94,0,0,0,114,10,0, - 0,0,114,10,0,0,0,114,11,0,0,0,114,148,0,0, - 0,236,2,0,0,115,10,0,0,0,0,3,12,1,12,1, - 4,255,6,2,122,29,66,117,105,108,116,105,110,73,109,112, - 111,114,116,101,114,46,99,114,101,97,116,101,95,109,111,100, - 117,108,101,99,2,0,0,0,0,0,0,0,0,0,0,0, - 2,0,0,0,3,0,0,0,67,0,0,0,115,16,0,0, - 0,116,0,116,1,106,2,124,1,131,2,1,0,100,1,83, - 0,41,2,122,22,69,120,101,99,32,97,32,98,117,105,108, - 116,45,105,110,32,109,111,100,117,108,101,78,41,3,114,66, - 0,0,0,114,56,0,0,0,90,12,101,120,101,99,95,98, - 117,105,108,116,105,110,41,2,114,30,0,0,0,114,95,0, - 0,0,114,10,0,0,0,114,10,0,0,0,114,11,0,0, - 0,114,149,0,0,0,244,2,0,0,115,2,0,0,0,0, - 3,122,27,66,117,105,108,116,105,110,73,109,112,111,114,116, - 101,114,46,101,120,101,99,95,109,111,100,117,108,101,99,2, + 105,110,100,95,115,112,101,99,99,3,0,0,0,0,0,0, + 0,0,0,0,0,4,0,0,0,4,0,0,0,67,0,0, + 0,115,30,0,0,0,124,0,160,0,124,1,124,2,161,2, + 125,3,124,3,100,1,107,9,114,26,124,3,106,1,83,0, + 100,1,83,0,41,2,122,175,70,105,110,100,32,116,104,101, + 32,98,117,105,108,116,45,105,110,32,109,111,100,117,108,101, + 46,10,10,32,32,32,32,32,32,32,32,73,102,32,39,112, + 97,116,104,39,32,105,115,32,101,118,101,114,32,115,112,101, + 99,105,102,105,101,100,32,116,104,101,110,32,116,104,101,32, + 115,101,97,114,99,104,32,105,115,32,99,111,110,115,105,100, + 101,114,101,100,32,97,32,102,97,105,108,117,114,101,46,10, + 10,32,32,32,32,32,32,32,32,84,104,105,115,32,109,101, + 116,104,111,100,32,105,115,32,100,101,112,114,101,99,97,116, + 101,100,46,32,32,85,115,101,32,102,105,110,100,95,115,112, + 101,99,40,41,32,105,110,115,116,101,97,100,46,10,10,32, + 32,32,32,32,32,32,32,78,41,2,114,166,0,0,0,114, + 108,0,0,0,41,4,114,163,0,0,0,114,80,0,0,0, + 114,164,0,0,0,114,94,0,0,0,114,10,0,0,0,114, + 10,0,0,0,114,11,0,0,0,218,11,102,105,110,100,95, + 109,111,100,117,108,101,224,2,0,0,115,4,0,0,0,0, + 9,12,1,122,27,66,117,105,108,116,105,110,73,109,112,111, + 114,116,101,114,46,102,105,110,100,95,109,111,100,117,108,101, + 99,2,0,0,0,0,0,0,0,0,0,0,0,2,0,0, + 0,4,0,0,0,67,0,0,0,115,46,0,0,0,124,1, + 106,0,116,1,106,2,107,7,114,34,116,3,100,1,160,4, + 124,1,106,0,161,1,124,1,106,0,100,2,141,2,130,1, + 116,5,116,6,106,7,124,1,131,2,83,0,41,3,122,24, + 67,114,101,97,116,101,32,97,32,98,117,105,108,116,45,105, + 110,32,109,111,100,117,108,101,114,76,0,0,0,114,16,0, + 0,0,41,8,114,17,0,0,0,114,15,0,0,0,114,77, + 0,0,0,114,78,0,0,0,114,44,0,0,0,114,66,0, + 0,0,114,56,0,0,0,90,14,99,114,101,97,116,101,95, + 98,117,105,108,116,105,110,41,2,114,30,0,0,0,114,94, + 0,0,0,114,10,0,0,0,114,10,0,0,0,114,11,0, + 0,0,114,148,0,0,0,236,2,0,0,115,10,0,0,0, + 0,3,12,1,12,1,4,255,6,2,122,29,66,117,105,108, + 116,105,110,73,109,112,111,114,116,101,114,46,99,114,101,97, + 116,101,95,109,111,100,117,108,101,99,2,0,0,0,0,0, + 0,0,0,0,0,0,2,0,0,0,3,0,0,0,67,0, + 0,0,115,16,0,0,0,116,0,116,1,106,2,124,1,131, + 2,1,0,100,1,83,0,41,2,122,22,69,120,101,99,32, + 97,32,98,117,105,108,116,45,105,110,32,109,111,100,117,108, + 101,78,41,3,114,66,0,0,0,114,56,0,0,0,90,12, + 101,120,101,99,95,98,117,105,108,116,105,110,41,2,114,30, + 0,0,0,114,95,0,0,0,114,10,0,0,0,114,10,0, + 0,0,114,11,0,0,0,114,149,0,0,0,244,2,0,0, + 115,2,0,0,0,0,3,122,27,66,117,105,108,116,105,110, + 73,109,112,111,114,116,101,114,46,101,120,101,99,95,109,111, + 100,117,108,101,99,2,0,0,0,0,0,0,0,0,0,0, + 0,2,0,0,0,1,0,0,0,67,0,0,0,115,4,0, + 0,0,100,1,83,0,41,2,122,57,82,101,116,117,114,110, + 32,78,111,110,101,32,97,115,32,98,117,105,108,116,45,105, + 110,32,109,111,100,117,108,101,115,32,100,111,32,110,111,116, + 32,104,97,118,101,32,99,111,100,101,32,111,98,106,101,99, + 116,115,46,78,114,10,0,0,0,169,2,114,163,0,0,0, + 114,80,0,0,0,114,10,0,0,0,114,10,0,0,0,114, + 11,0,0,0,218,8,103,101,116,95,99,111,100,101,249,2, + 0,0,115,2,0,0,0,0,4,122,24,66,117,105,108,116, + 105,110,73,109,112,111,114,116,101,114,46,103,101,116,95,99, + 111,100,101,99,2,0,0,0,0,0,0,0,0,0,0,0, + 2,0,0,0,1,0,0,0,67,0,0,0,115,4,0,0, + 0,100,1,83,0,41,2,122,56,82,101,116,117,114,110,32, + 78,111,110,101,32,97,115,32,98,117,105,108,116,45,105,110, + 32,109,111,100,117,108,101,115,32,100,111,32,110,111,116,32, + 104,97,118,101,32,115,111,117,114,99,101,32,99,111,100,101, + 46,78,114,10,0,0,0,114,168,0,0,0,114,10,0,0, + 0,114,10,0,0,0,114,11,0,0,0,218,10,103,101,116, + 95,115,111,117,114,99,101,255,2,0,0,115,2,0,0,0, + 0,4,122,26,66,117,105,108,116,105,110,73,109,112,111,114, + 116,101,114,46,103,101,116,95,115,111,117,114,99,101,99,2, 0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,1, 0,0,0,67,0,0,0,115,4,0,0,0,100,1,83,0, - 41,2,122,57,82,101,116,117,114,110,32,78,111,110,101,32, - 97,115,32,98,117,105,108,116,45,105,110,32,109,111,100,117, - 108,101,115,32,100,111,32,110,111,116,32,104,97,118,101,32, - 99,111,100,101,32,111,98,106,101,99,116,115,46,78,114,10, - 0,0,0,169,2,114,163,0,0,0,114,80,0,0,0,114, - 10,0,0,0,114,10,0,0,0,114,11,0,0,0,218,8, - 103,101,116,95,99,111,100,101,249,2,0,0,115,2,0,0, - 0,0,4,122,24,66,117,105,108,116,105,110,73,109,112,111, - 114,116,101,114,46,103,101,116,95,99,111,100,101,99,2,0, - 0,0,0,0,0,0,0,0,0,0,2,0,0,0,1,0, - 0,0,67,0,0,0,115,4,0,0,0,100,1,83,0,41, - 2,122,56,82,101,116,117,114,110,32,78,111,110,101,32,97, - 115,32,98,117,105,108,116,45,105,110,32,109,111,100,117,108, - 101,115,32,100,111,32,110,111,116,32,104,97,118,101,32,115, - 111,117,114,99,101,32,99,111,100,101,46,78,114,10,0,0, - 0,114,168,0,0,0,114,10,0,0,0,114,10,0,0,0, - 114,11,0,0,0,218,10,103,101,116,95,115,111,117,114,99, - 101,255,2,0,0,115,2,0,0,0,0,4,122,26,66,117, - 105,108,116,105,110,73,109,112,111,114,116,101,114,46,103,101, + 41,2,122,52,82,101,116,117,114,110,32,70,97,108,115,101, + 32,97,115,32,98,117,105,108,116,45,105,110,32,109,111,100, + 117,108,101,115,32,97,114,101,32,110,101,118,101,114,32,112, + 97,99,107,97,103,101,115,46,70,114,10,0,0,0,114,168, + 0,0,0,114,10,0,0,0,114,10,0,0,0,114,11,0, + 0,0,114,114,0,0,0,5,3,0,0,115,2,0,0,0, + 0,4,122,26,66,117,105,108,116,105,110,73,109,112,111,114, + 116,101,114,46,105,115,95,112,97,99,107,97,103,101,41,2, + 78,78,41,1,78,41,18,114,1,0,0,0,114,0,0,0, + 0,114,2,0,0,0,114,3,0,0,0,114,137,0,0,0, + 218,12,115,116,97,116,105,99,109,101,116,104,111,100,114,98, + 0,0,0,218,11,99,108,97,115,115,109,101,116,104,111,100, + 114,166,0,0,0,114,167,0,0,0,114,148,0,0,0,114, + 149,0,0,0,114,85,0,0,0,114,169,0,0,0,114,170, + 0,0,0,114,114,0,0,0,114,96,0,0,0,114,154,0, + 0,0,114,10,0,0,0,114,10,0,0,0,114,10,0,0, + 0,114,11,0,0,0,114,159,0,0,0,195,2,0,0,115, + 44,0,0,0,8,2,4,7,4,2,2,1,10,8,2,1, + 12,8,2,1,12,11,2,1,10,7,2,1,10,4,2,1, + 2,1,12,4,2,1,2,1,12,4,2,1,2,1,12,4, + 114,159,0,0,0,99,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,4,0,0,0,64,0,0,0,115,144, + 0,0,0,101,0,90,1,100,0,90,2,100,1,90,3,100, + 2,90,4,101,5,100,3,100,4,132,0,131,1,90,6,101, + 7,100,22,100,6,100,7,132,1,131,1,90,8,101,7,100, + 23,100,8,100,9,132,1,131,1,90,9,101,7,100,10,100, + 11,132,0,131,1,90,10,101,5,100,12,100,13,132,0,131, + 1,90,11,101,7,100,14,100,15,132,0,131,1,90,12,101, + 7,101,13,100,16,100,17,132,0,131,1,131,1,90,14,101, + 7,101,13,100,18,100,19,132,0,131,1,131,1,90,15,101, + 7,101,13,100,20,100,21,132,0,131,1,131,1,90,16,100, + 5,83,0,41,24,218,14,70,114,111,122,101,110,73,109,112, + 111,114,116,101,114,122,142,77,101,116,97,32,112,97,116,104, + 32,105,109,112,111,114,116,32,102,111,114,32,102,114,111,122, + 101,110,32,109,111,100,117,108,101,115,46,10,10,32,32,32, + 32,65,108,108,32,109,101,116,104,111,100,115,32,97,114,101, + 32,101,105,116,104,101,114,32,99,108,97,115,115,32,111,114, + 32,115,116,97,116,105,99,32,109,101,116,104,111,100,115,32, + 116,111,32,97,118,111,105,100,32,116,104,101,32,110,101,101, + 100,32,116,111,10,32,32,32,32,105,110,115,116,97,110,116, + 105,97,116,101,32,116,104,101,32,99,108,97,115,115,46,10, + 10,32,32,32,32,90,6,102,114,111,122,101,110,99,1,0, + 0,0,0,0,0,0,0,0,0,0,1,0,0,0,4,0, + 0,0,67,0,0,0,115,16,0,0,0,100,1,160,0,124, + 0,106,1,116,2,106,3,161,2,83,0,41,2,114,160,0, + 0,0,114,152,0,0,0,41,4,114,44,0,0,0,114,1, + 0,0,0,114,173,0,0,0,114,137,0,0,0,41,1,218, + 1,109,114,10,0,0,0,114,10,0,0,0,114,11,0,0, + 0,114,98,0,0,0,25,3,0,0,115,2,0,0,0,0, + 7,122,26,70,114,111,122,101,110,73,109,112,111,114,116,101, + 114,46,109,111,100,117,108,101,95,114,101,112,114,78,99,4, + 0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,5, + 0,0,0,67,0,0,0,115,34,0,0,0,116,0,160,1, + 124,1,161,1,114,26,116,2,124,1,124,0,124,0,106,3, + 100,1,141,3,83,0,100,0,83,0,100,0,83,0,114,161, + 0,0,0,41,4,114,56,0,0,0,114,87,0,0,0,114, + 90,0,0,0,114,137,0,0,0,114,162,0,0,0,114,10, + 0,0,0,114,10,0,0,0,114,11,0,0,0,114,166,0, + 0,0,34,3,0,0,115,6,0,0,0,0,2,10,1,16, + 2,122,24,70,114,111,122,101,110,73,109,112,111,114,116,101, + 114,46,102,105,110,100,95,115,112,101,99,99,3,0,0,0, + 0,0,0,0,0,0,0,0,3,0,0,0,3,0,0,0, + 67,0,0,0,115,18,0,0,0,116,0,160,1,124,1,161, + 1,114,14,124,0,83,0,100,1,83,0,41,2,122,93,70, + 105,110,100,32,97,32,102,114,111,122,101,110,32,109,111,100, + 117,108,101,46,10,10,32,32,32,32,32,32,32,32,84,104, + 105,115,32,109,101,116,104,111,100,32,105,115,32,100,101,112, + 114,101,99,97,116,101,100,46,32,32,85,115,101,32,102,105, + 110,100,95,115,112,101,99,40,41,32,105,110,115,116,101,97, + 100,46,10,10,32,32,32,32,32,32,32,32,78,41,2,114, + 56,0,0,0,114,87,0,0,0,41,3,114,163,0,0,0, + 114,80,0,0,0,114,164,0,0,0,114,10,0,0,0,114, + 10,0,0,0,114,11,0,0,0,114,167,0,0,0,41,3, + 0,0,115,2,0,0,0,0,7,122,26,70,114,111,122,101, + 110,73,109,112,111,114,116,101,114,46,102,105,110,100,95,109, + 111,100,117,108,101,99,2,0,0,0,0,0,0,0,0,0, + 0,0,2,0,0,0,1,0,0,0,67,0,0,0,115,4, + 0,0,0,100,1,83,0,41,2,122,42,85,115,101,32,100, + 101,102,97,117,108,116,32,115,101,109,97,110,116,105,99,115, + 32,102,111,114,32,109,111,100,117,108,101,32,99,114,101,97, + 116,105,111,110,46,78,114,10,0,0,0,41,2,114,163,0, + 0,0,114,94,0,0,0,114,10,0,0,0,114,10,0,0, + 0,114,11,0,0,0,114,148,0,0,0,50,3,0,0,115, + 2,0,0,0,0,2,122,28,70,114,111,122,101,110,73,109, + 112,111,114,116,101,114,46,99,114,101,97,116,101,95,109,111, + 100,117,108,101,99,1,0,0,0,0,0,0,0,0,0,0, + 0,3,0,0,0,4,0,0,0,67,0,0,0,115,64,0, + 0,0,124,0,106,0,106,1,125,1,116,2,160,3,124,1, + 161,1,115,36,116,4,100,1,160,5,124,1,161,1,124,1, + 100,2,141,2,130,1,116,6,116,2,106,7,124,1,131,2, + 125,2,116,8,124,2,124,0,106,9,131,2,1,0,100,0, + 83,0,114,86,0,0,0,41,10,114,104,0,0,0,114,17, + 0,0,0,114,56,0,0,0,114,87,0,0,0,114,78,0, + 0,0,114,44,0,0,0,114,66,0,0,0,218,17,103,101, + 116,95,102,114,111,122,101,110,95,111,98,106,101,99,116,218, + 4,101,120,101,99,114,7,0,0,0,41,3,114,95,0,0, + 0,114,17,0,0,0,218,4,99,111,100,101,114,10,0,0, + 0,114,10,0,0,0,114,11,0,0,0,114,149,0,0,0, + 54,3,0,0,115,14,0,0,0,0,2,8,1,10,1,10, + 1,2,255,6,2,12,1,122,26,70,114,111,122,101,110,73, + 109,112,111,114,116,101,114,46,101,120,101,99,95,109,111,100, + 117,108,101,99,2,0,0,0,0,0,0,0,0,0,0,0, + 2,0,0,0,3,0,0,0,67,0,0,0,115,10,0,0, + 0,116,0,124,0,124,1,131,2,83,0,41,1,122,95,76, + 111,97,100,32,97,32,102,114,111,122,101,110,32,109,111,100, + 117,108,101,46,10,10,32,32,32,32,32,32,32,32,84,104, + 105,115,32,109,101,116,104,111,100,32,105,115,32,100,101,112, + 114,101,99,97,116,101,100,46,32,32,85,115,101,32,101,120, + 101,99,95,109,111,100,117,108,101,40,41,32,105,110,115,116, + 101,97,100,46,10,10,32,32,32,32,32,32,32,32,41,1, + 114,96,0,0,0,114,168,0,0,0,114,10,0,0,0,114, + 10,0,0,0,114,11,0,0,0,114,154,0,0,0,63,3, + 0,0,115,2,0,0,0,0,7,122,26,70,114,111,122,101, + 110,73,109,112,111,114,116,101,114,46,108,111,97,100,95,109, + 111,100,117,108,101,99,2,0,0,0,0,0,0,0,0,0, + 0,0,2,0,0,0,3,0,0,0,67,0,0,0,115,10, + 0,0,0,116,0,160,1,124,1,161,1,83,0,41,1,122, + 45,82,101,116,117,114,110,32,116,104,101,32,99,111,100,101, + 32,111,98,106,101,99,116,32,102,111,114,32,116,104,101,32, + 102,114,111,122,101,110,32,109,111,100,117,108,101,46,41,2, + 114,56,0,0,0,114,175,0,0,0,114,168,0,0,0,114, + 10,0,0,0,114,10,0,0,0,114,11,0,0,0,114,169, + 0,0,0,72,3,0,0,115,2,0,0,0,0,4,122,23, + 70,114,111,122,101,110,73,109,112,111,114,116,101,114,46,103, + 101,116,95,99,111,100,101,99,2,0,0,0,0,0,0,0, + 0,0,0,0,2,0,0,0,1,0,0,0,67,0,0,0, + 115,4,0,0,0,100,1,83,0,41,2,122,54,82,101,116, + 117,114,110,32,78,111,110,101,32,97,115,32,102,114,111,122, + 101,110,32,109,111,100,117,108,101,115,32,100,111,32,110,111, + 116,32,104,97,118,101,32,115,111,117,114,99,101,32,99,111, + 100,101,46,78,114,10,0,0,0,114,168,0,0,0,114,10, + 0,0,0,114,10,0,0,0,114,11,0,0,0,114,170,0, + 0,0,78,3,0,0,115,2,0,0,0,0,4,122,25,70, + 114,111,122,101,110,73,109,112,111,114,116,101,114,46,103,101, 116,95,115,111,117,114,99,101,99,2,0,0,0,0,0,0, - 0,0,0,0,0,2,0,0,0,1,0,0,0,67,0,0, - 0,115,4,0,0,0,100,1,83,0,41,2,122,52,82,101, - 116,117,114,110,32,70,97,108,115,101,32,97,115,32,98,117, - 105,108,116,45,105,110,32,109,111,100,117,108,101,115,32,97, - 114,101,32,110,101,118,101,114,32,112,97,99,107,97,103,101, - 115,46,70,114,10,0,0,0,114,168,0,0,0,114,10,0, - 0,0,114,10,0,0,0,114,11,0,0,0,114,114,0,0, - 0,5,3,0,0,115,2,0,0,0,0,4,122,26,66,117, - 105,108,116,105,110,73,109,112,111,114,116,101,114,46,105,115, - 95,112,97,99,107,97,103,101,41,2,78,78,41,1,78,41, - 18,114,1,0,0,0,114,0,0,0,0,114,2,0,0,0, - 114,3,0,0,0,114,137,0,0,0,218,12,115,116,97,116, - 105,99,109,101,116,104,111,100,114,98,0,0,0,218,11,99, - 108,97,115,115,109,101,116,104,111,100,114,166,0,0,0,114, - 167,0,0,0,114,148,0,0,0,114,149,0,0,0,114,85, - 0,0,0,114,169,0,0,0,114,170,0,0,0,114,114,0, - 0,0,114,96,0,0,0,114,155,0,0,0,114,10,0,0, + 0,0,0,0,0,2,0,0,0,3,0,0,0,67,0,0, + 0,115,10,0,0,0,116,0,160,1,124,1,161,1,83,0, + 41,1,122,46,82,101,116,117,114,110,32,84,114,117,101,32, + 105,102,32,116,104,101,32,102,114,111,122,101,110,32,109,111, + 100,117,108,101,32,105,115,32,97,32,112,97,99,107,97,103, + 101,46,41,2,114,56,0,0,0,90,17,105,115,95,102,114, + 111,122,101,110,95,112,97,99,107,97,103,101,114,168,0,0, 0,114,10,0,0,0,114,10,0,0,0,114,11,0,0,0, - 114,159,0,0,0,195,2,0,0,115,44,0,0,0,8,2, - 4,7,4,2,2,1,10,8,2,1,12,8,2,1,12,11, - 2,1,10,7,2,1,10,4,2,1,2,1,12,4,2,1, - 2,1,12,4,2,1,2,1,12,4,114,159,0,0,0,99, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 4,0,0,0,64,0,0,0,115,144,0,0,0,101,0,90, - 1,100,0,90,2,100,1,90,3,100,2,90,4,101,5,100, - 3,100,4,132,0,131,1,90,6,101,7,100,22,100,6,100, - 7,132,1,131,1,90,8,101,7,100,23,100,8,100,9,132, - 1,131,1,90,9,101,7,100,10,100,11,132,0,131,1,90, - 10,101,5,100,12,100,13,132,0,131,1,90,11,101,7,100, - 14,100,15,132,0,131,1,90,12,101,7,101,13,100,16,100, - 17,132,0,131,1,131,1,90,14,101,7,101,13,100,18,100, - 19,132,0,131,1,131,1,90,15,101,7,101,13,100,20,100, - 21,132,0,131,1,131,1,90,16,100,5,83,0,41,24,218, - 14,70,114,111,122,101,110,73,109,112,111,114,116,101,114,122, - 142,77,101,116,97,32,112,97,116,104,32,105,109,112,111,114, - 116,32,102,111,114,32,102,114,111,122,101,110,32,109,111,100, - 117,108,101,115,46,10,10,32,32,32,32,65,108,108,32,109, - 101,116,104,111,100,115,32,97,114,101,32,101,105,116,104,101, - 114,32,99,108,97,115,115,32,111,114,32,115,116,97,116,105, - 99,32,109,101,116,104,111,100,115,32,116,111,32,97,118,111, - 105,100,32,116,104,101,32,110,101,101,100,32,116,111,10,32, - 32,32,32,105,110,115,116,97,110,116,105,97,116,101,32,116, - 104,101,32,99,108,97,115,115,46,10,10,32,32,32,32,90, - 6,102,114,111,122,101,110,99,1,0,0,0,0,0,0,0, - 0,0,0,0,1,0,0,0,4,0,0,0,67,0,0,0, - 115,16,0,0,0,100,1,160,0,124,0,106,1,116,2,106, - 3,161,2,83,0,41,2,114,160,0,0,0,114,152,0,0, - 0,41,4,114,44,0,0,0,114,1,0,0,0,114,173,0, - 0,0,114,137,0,0,0,41,1,218,1,109,114,10,0,0, - 0,114,10,0,0,0,114,11,0,0,0,114,98,0,0,0, - 25,3,0,0,115,2,0,0,0,0,7,122,26,70,114,111, - 122,101,110,73,109,112,111,114,116,101,114,46,109,111,100,117, - 108,101,95,114,101,112,114,78,99,4,0,0,0,0,0,0, - 0,0,0,0,0,4,0,0,0,5,0,0,0,67,0,0, - 0,115,34,0,0,0,116,0,160,1,124,1,161,1,114,26, - 116,2,124,1,124,0,124,0,106,3,100,1,141,3,83,0, - 100,0,83,0,100,0,83,0,114,161,0,0,0,41,4,114, - 56,0,0,0,114,87,0,0,0,114,90,0,0,0,114,137, - 0,0,0,114,162,0,0,0,114,10,0,0,0,114,10,0, - 0,0,114,11,0,0,0,114,166,0,0,0,34,3,0,0, - 115,6,0,0,0,0,2,10,1,16,2,122,24,70,114,111, - 122,101,110,73,109,112,111,114,116,101,114,46,102,105,110,100, - 95,115,112,101,99,99,3,0,0,0,0,0,0,0,0,0, - 0,0,3,0,0,0,3,0,0,0,67,0,0,0,115,18, - 0,0,0,116,0,160,1,124,1,161,1,114,14,124,0,83, - 0,100,1,83,0,41,2,122,93,70,105,110,100,32,97,32, - 102,114,111,122,101,110,32,109,111,100,117,108,101,46,10,10, - 32,32,32,32,32,32,32,32,84,104,105,115,32,109,101,116, - 104,111,100,32,105,115,32,100,101,112,114,101,99,97,116,101, - 100,46,32,32,85,115,101,32,102,105,110,100,95,115,112,101, - 99,40,41,32,105,110,115,116,101,97,100,46,10,10,32,32, - 32,32,32,32,32,32,78,41,2,114,56,0,0,0,114,87, - 0,0,0,41,3,114,163,0,0,0,114,80,0,0,0,114, - 164,0,0,0,114,10,0,0,0,114,10,0,0,0,114,11, - 0,0,0,114,167,0,0,0,41,3,0,0,115,2,0,0, - 0,0,7,122,26,70,114,111,122,101,110,73,109,112,111,114, - 116,101,114,46,102,105,110,100,95,109,111,100,117,108,101,99, - 2,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0, - 1,0,0,0,67,0,0,0,115,4,0,0,0,100,1,83, - 0,41,2,122,42,85,115,101,32,100,101,102,97,117,108,116, - 32,115,101,109,97,110,116,105,99,115,32,102,111,114,32,109, - 111,100,117,108,101,32,99,114,101,97,116,105,111,110,46,78, - 114,10,0,0,0,41,2,114,163,0,0,0,114,94,0,0, - 0,114,10,0,0,0,114,10,0,0,0,114,11,0,0,0, - 114,148,0,0,0,50,3,0,0,115,2,0,0,0,0,2, - 122,28,70,114,111,122,101,110,73,109,112,111,114,116,101,114, - 46,99,114,101,97,116,101,95,109,111,100,117,108,101,99,1, - 0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,4, - 0,0,0,67,0,0,0,115,64,0,0,0,124,0,106,0, - 106,1,125,1,116,2,160,3,124,1,161,1,115,36,116,4, - 100,1,160,5,124,1,161,1,124,1,100,2,141,2,130,1, - 116,6,116,2,106,7,124,1,131,2,125,2,116,8,124,2, - 124,0,106,9,131,2,1,0,100,0,83,0,114,86,0,0, - 0,41,10,114,104,0,0,0,114,17,0,0,0,114,56,0, - 0,0,114,87,0,0,0,114,78,0,0,0,114,44,0,0, - 0,114,66,0,0,0,218,17,103,101,116,95,102,114,111,122, - 101,110,95,111,98,106,101,99,116,218,4,101,120,101,99,114, - 7,0,0,0,41,3,114,95,0,0,0,114,17,0,0,0, - 218,4,99,111,100,101,114,10,0,0,0,114,10,0,0,0, - 114,11,0,0,0,114,149,0,0,0,54,3,0,0,115,14, - 0,0,0,0,2,8,1,10,1,10,1,2,255,6,2,12, - 1,122,26,70,114,111,122,101,110,73,109,112,111,114,116,101, - 114,46,101,120,101,99,95,109,111,100,117,108,101,99,2,0, - 0,0,0,0,0,0,0,0,0,0,2,0,0,0,3,0, - 0,0,67,0,0,0,115,10,0,0,0,116,0,124,0,124, - 1,131,2,83,0,41,1,122,95,76,111,97,100,32,97,32, - 102,114,111,122,101,110,32,109,111,100,117,108,101,46,10,10, - 32,32,32,32,32,32,32,32,84,104,105,115,32,109,101,116, - 104,111,100,32,105,115,32,100,101,112,114,101,99,97,116,101, - 100,46,32,32,85,115,101,32,101,120,101,99,95,109,111,100, - 117,108,101,40,41,32,105,110,115,116,101,97,100,46,10,10, - 32,32,32,32,32,32,32,32,41,1,114,96,0,0,0,114, - 168,0,0,0,114,10,0,0,0,114,10,0,0,0,114,11, - 0,0,0,114,155,0,0,0,63,3,0,0,115,2,0,0, - 0,0,7,122,26,70,114,111,122,101,110,73,109,112,111,114, - 116,101,114,46,108,111,97,100,95,109,111,100,117,108,101,99, - 2,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0, - 3,0,0,0,67,0,0,0,115,10,0,0,0,116,0,160, - 1,124,1,161,1,83,0,41,1,122,45,82,101,116,117,114, - 110,32,116,104,101,32,99,111,100,101,32,111,98,106,101,99, - 116,32,102,111,114,32,116,104,101,32,102,114,111,122,101,110, - 32,109,111,100,117,108,101,46,41,2,114,56,0,0,0,114, - 175,0,0,0,114,168,0,0,0,114,10,0,0,0,114,10, - 0,0,0,114,11,0,0,0,114,169,0,0,0,72,3,0, - 0,115,2,0,0,0,0,4,122,23,70,114,111,122,101,110, - 73,109,112,111,114,116,101,114,46,103,101,116,95,99,111,100, - 101,99,2,0,0,0,0,0,0,0,0,0,0,0,2,0, - 0,0,1,0,0,0,67,0,0,0,115,4,0,0,0,100, - 1,83,0,41,2,122,54,82,101,116,117,114,110,32,78,111, - 110,101,32,97,115,32,102,114,111,122,101,110,32,109,111,100, - 117,108,101,115,32,100,111,32,110,111,116,32,104,97,118,101, - 32,115,111,117,114,99,101,32,99,111,100,101,46,78,114,10, - 0,0,0,114,168,0,0,0,114,10,0,0,0,114,10,0, - 0,0,114,11,0,0,0,114,170,0,0,0,78,3,0,0, - 115,2,0,0,0,0,4,122,25,70,114,111,122,101,110,73, - 109,112,111,114,116,101,114,46,103,101,116,95,115,111,117,114, - 99,101,99,2,0,0,0,0,0,0,0,0,0,0,0,2, - 0,0,0,3,0,0,0,67,0,0,0,115,10,0,0,0, - 116,0,160,1,124,1,161,1,83,0,41,1,122,46,82,101, - 116,117,114,110,32,84,114,117,101,32,105,102,32,116,104,101, - 32,102,114,111,122,101,110,32,109,111,100,117,108,101,32,105, - 115,32,97,32,112,97,99,107,97,103,101,46,41,2,114,56, - 0,0,0,90,17,105,115,95,102,114,111,122,101,110,95,112, - 97,99,107,97,103,101,114,168,0,0,0,114,10,0,0,0, - 114,10,0,0,0,114,11,0,0,0,114,114,0,0,0,84, - 3,0,0,115,2,0,0,0,0,4,122,25,70,114,111,122, - 101,110,73,109,112,111,114,116,101,114,46,105,115,95,112,97, - 99,107,97,103,101,41,2,78,78,41,1,78,41,17,114,1, + 114,114,0,0,0,84,3,0,0,115,2,0,0,0,0,4, + 122,25,70,114,111,122,101,110,73,109,112,111,114,116,101,114, + 46,105,115,95,112,97,99,107,97,103,101,41,2,78,78,41, + 1,78,41,17,114,1,0,0,0,114,0,0,0,0,114,2, + 0,0,0,114,3,0,0,0,114,137,0,0,0,114,171,0, + 0,0,114,98,0,0,0,114,172,0,0,0,114,166,0,0, + 0,114,167,0,0,0,114,148,0,0,0,114,149,0,0,0, + 114,154,0,0,0,114,89,0,0,0,114,169,0,0,0,114, + 170,0,0,0,114,114,0,0,0,114,10,0,0,0,114,10, + 0,0,0,114,10,0,0,0,114,11,0,0,0,114,173,0, + 0,0,14,3,0,0,115,46,0,0,0,8,2,4,7,4, + 2,2,1,10,8,2,1,12,6,2,1,12,8,2,1,10, + 3,2,1,10,8,2,1,10,8,2,1,2,1,12,4,2, + 1,2,1,12,4,2,1,2,1,114,173,0,0,0,99,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2, + 0,0,0,64,0,0,0,115,32,0,0,0,101,0,90,1, + 100,0,90,2,100,1,90,3,100,2,100,3,132,0,90,4, + 100,4,100,5,132,0,90,5,100,6,83,0,41,7,218,18, + 95,73,109,112,111,114,116,76,111,99,107,67,111,110,116,101, + 120,116,122,36,67,111,110,116,101,120,116,32,109,97,110,97, + 103,101,114,32,102,111,114,32,116,104,101,32,105,109,112,111, + 114,116,32,108,111,99,107,46,99,1,0,0,0,0,0,0, + 0,0,0,0,0,1,0,0,0,2,0,0,0,67,0,0, + 0,115,12,0,0,0,116,0,160,1,161,0,1,0,100,1, + 83,0,41,2,122,24,65,99,113,117,105,114,101,32,116,104, + 101,32,105,109,112,111,114,116,32,108,111,99,107,46,78,41, + 2,114,56,0,0,0,114,57,0,0,0,114,46,0,0,0, + 114,10,0,0,0,114,10,0,0,0,114,11,0,0,0,114, + 53,0,0,0,97,3,0,0,115,2,0,0,0,0,2,122, + 28,95,73,109,112,111,114,116,76,111,99,107,67,111,110,116, + 101,120,116,46,95,95,101,110,116,101,114,95,95,99,4,0, + 0,0,0,0,0,0,0,0,0,0,4,0,0,0,2,0, + 0,0,67,0,0,0,115,12,0,0,0,116,0,160,1,161, + 0,1,0,100,1,83,0,41,2,122,60,82,101,108,101,97, + 115,101,32,116,104,101,32,105,109,112,111,114,116,32,108,111, + 99,107,32,114,101,103,97,114,100,108,101,115,115,32,111,102, + 32,97,110,121,32,114,97,105,115,101,100,32,101,120,99,101, + 112,116,105,111,110,115,46,78,41,2,114,56,0,0,0,114, + 59,0,0,0,41,4,114,30,0,0,0,218,8,101,120,99, + 95,116,121,112,101,218,9,101,120,99,95,118,97,108,117,101, + 218,13,101,120,99,95,116,114,97,99,101,98,97,99,107,114, + 10,0,0,0,114,10,0,0,0,114,11,0,0,0,114,55, + 0,0,0,101,3,0,0,115,2,0,0,0,0,2,122,27, + 95,73,109,112,111,114,116,76,111,99,107,67,111,110,116,101, + 120,116,46,95,95,101,120,105,116,95,95,78,41,6,114,1, 0,0,0,114,0,0,0,0,114,2,0,0,0,114,3,0, - 0,0,114,137,0,0,0,114,171,0,0,0,114,98,0,0, - 0,114,172,0,0,0,114,166,0,0,0,114,167,0,0,0, - 114,148,0,0,0,114,149,0,0,0,114,155,0,0,0,114, - 89,0,0,0,114,169,0,0,0,114,170,0,0,0,114,114, - 0,0,0,114,10,0,0,0,114,10,0,0,0,114,10,0, - 0,0,114,11,0,0,0,114,173,0,0,0,14,3,0,0, - 115,46,0,0,0,8,2,4,7,4,2,2,1,10,8,2, - 1,12,6,2,1,12,8,2,1,10,3,2,1,10,8,2, - 1,10,8,2,1,2,1,12,4,2,1,2,1,12,4,2, - 1,2,1,114,173,0,0,0,99,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,2,0,0,0,64,0,0, - 0,115,32,0,0,0,101,0,90,1,100,0,90,2,100,1, - 90,3,100,2,100,3,132,0,90,4,100,4,100,5,132,0, - 90,5,100,6,83,0,41,7,218,18,95,73,109,112,111,114, - 116,76,111,99,107,67,111,110,116,101,120,116,122,36,67,111, - 110,116,101,120,116,32,109,97,110,97,103,101,114,32,102,111, - 114,32,116,104,101,32,105,109,112,111,114,116,32,108,111,99, - 107,46,99,1,0,0,0,0,0,0,0,0,0,0,0,1, - 0,0,0,2,0,0,0,67,0,0,0,115,12,0,0,0, - 116,0,160,1,161,0,1,0,100,1,83,0,41,2,122,24, - 65,99,113,117,105,114,101,32,116,104,101,32,105,109,112,111, - 114,116,32,108,111,99,107,46,78,41,2,114,56,0,0,0, - 114,57,0,0,0,114,46,0,0,0,114,10,0,0,0,114, - 10,0,0,0,114,11,0,0,0,114,53,0,0,0,97,3, - 0,0,115,2,0,0,0,0,2,122,28,95,73,109,112,111, - 114,116,76,111,99,107,67,111,110,116,101,120,116,46,95,95, - 101,110,116,101,114,95,95,99,4,0,0,0,0,0,0,0, - 0,0,0,0,4,0,0,0,2,0,0,0,67,0,0,0, - 115,12,0,0,0,116,0,160,1,161,0,1,0,100,1,83, - 0,41,2,122,60,82,101,108,101,97,115,101,32,116,104,101, - 32,105,109,112,111,114,116,32,108,111,99,107,32,114,101,103, - 97,114,100,108,101,115,115,32,111,102,32,97,110,121,32,114, - 97,105,115,101,100,32,101,120,99,101,112,116,105,111,110,115, - 46,78,41,2,114,56,0,0,0,114,58,0,0,0,41,4, - 114,30,0,0,0,218,8,101,120,99,95,116,121,112,101,218, - 9,101,120,99,95,118,97,108,117,101,218,13,101,120,99,95, - 116,114,97,99,101,98,97,99,107,114,10,0,0,0,114,10, - 0,0,0,114,11,0,0,0,114,55,0,0,0,101,3,0, - 0,115,2,0,0,0,0,2,122,27,95,73,109,112,111,114, - 116,76,111,99,107,67,111,110,116,101,120,116,46,95,95,101, - 120,105,116,95,95,78,41,6,114,1,0,0,0,114,0,0, - 0,0,114,2,0,0,0,114,3,0,0,0,114,53,0,0, - 0,114,55,0,0,0,114,10,0,0,0,114,10,0,0,0, - 114,10,0,0,0,114,11,0,0,0,114,178,0,0,0,93, - 3,0,0,115,6,0,0,0,8,2,4,2,8,4,114,178, - 0,0,0,99,3,0,0,0,0,0,0,0,0,0,0,0, - 5,0,0,0,5,0,0,0,67,0,0,0,115,64,0,0, - 0,124,1,160,0,100,1,124,2,100,2,24,0,161,2,125, - 3,116,1,124,3,131,1,124,2,107,0,114,36,116,2,100, - 3,131,1,130,1,124,3,100,4,25,0,125,4,124,0,114, - 60,100,5,160,3,124,4,124,0,161,2,83,0,124,4,83, - 0,41,6,122,50,82,101,115,111,108,118,101,32,97,32,114, - 101,108,97,116,105,118,101,32,109,111,100,117,108,101,32,110, - 97,109,101,32,116,111,32,97,110,32,97,98,115,111,108,117, - 116,101,32,111,110,101,46,114,127,0,0,0,114,37,0,0, - 0,122,50,97,116,116,101,109,112,116,101,100,32,114,101,108, - 97,116,105,118,101,32,105,109,112,111,114,116,32,98,101,121, - 111,110,100,32,116,111,112,45,108,101,118,101,108,32,112,97, - 99,107,97,103,101,114,22,0,0,0,250,5,123,125,46,123, - 125,41,4,218,6,114,115,112,108,105,116,218,3,108,101,110, - 114,78,0,0,0,114,44,0,0,0,41,5,114,17,0,0, - 0,218,7,112,97,99,107,97,103,101,218,5,108,101,118,101, - 108,90,4,98,105,116,115,90,4,98,97,115,101,114,10,0, - 0,0,114,10,0,0,0,114,11,0,0,0,218,13,95,114, - 101,115,111,108,118,101,95,110,97,109,101,106,3,0,0,115, - 10,0,0,0,0,2,16,1,12,1,8,1,8,1,114,187, - 0,0,0,99,3,0,0,0,0,0,0,0,0,0,0,0, - 4,0,0,0,4,0,0,0,67,0,0,0,115,34,0,0, - 0,124,0,160,0,124,1,124,2,161,2,125,3,124,3,100, - 0,107,8,114,24,100,0,83,0,116,1,124,1,124,3,131, - 2,83,0,114,13,0,0,0,41,2,114,167,0,0,0,114, - 90,0,0,0,41,4,218,6,102,105,110,100,101,114,114,17, - 0,0,0,114,164,0,0,0,114,108,0,0,0,114,10,0, - 0,0,114,10,0,0,0,114,11,0,0,0,218,17,95,102, - 105,110,100,95,115,112,101,99,95,108,101,103,97,99,121,115, - 3,0,0,115,8,0,0,0,0,3,12,1,8,1,4,1, - 114,189,0,0,0,99,3,0,0,0,0,0,0,0,0,0, - 0,0,10,0,0,0,10,0,0,0,67,0,0,0,115,12, - 1,0,0,116,0,106,1,125,3,124,3,100,1,107,8,114, - 22,116,2,100,2,131,1,130,1,124,3,115,38,116,3,160, - 4,100,3,116,5,161,2,1,0,124,0,116,0,106,6,107, - 6,125,4,124,3,68,0,93,210,125,5,116,7,131,0,143, - 84,1,0,122,10,124,5,106,8,125,6,87,0,110,54,4, - 0,116,9,107,10,114,128,1,0,1,0,1,0,116,10,124, - 5,124,0,124,1,131,3,125,7,124,7,100,1,107,8,114, - 124,89,0,87,0,53,0,81,0,82,0,163,0,113,52,89, - 0,110,14,88,0,124,6,124,0,124,1,124,2,131,3,125, - 7,87,0,53,0,81,0,82,0,88,0,124,7,100,1,107, - 9,114,52,124,4,144,0,115,254,124,0,116,0,106,6,107, - 6,144,0,114,254,116,0,106,6,124,0,25,0,125,8,122, - 10,124,8,106,11,125,9,87,0,110,28,4,0,116,9,107, - 10,114,226,1,0,1,0,1,0,124,7,6,0,89,0,2, - 0,1,0,83,0,88,0,124,9,100,1,107,8,114,244,124, - 7,2,0,1,0,83,0,124,9,2,0,1,0,83,0,113, - 52,124,7,2,0,1,0,83,0,113,52,100,1,83,0,41, - 4,122,21,70,105,110,100,32,97,32,109,111,100,117,108,101, - 39,115,32,115,112,101,99,46,78,122,53,115,121,115,46,109, - 101,116,97,95,112,97,116,104,32,105,115,32,78,111,110,101, - 44,32,80,121,116,104,111,110,32,105,115,32,108,105,107,101, - 108,121,32,115,104,117,116,116,105,110,103,32,100,111,119,110, - 122,22,115,121,115,46,109,101,116,97,95,112,97,116,104,32, - 105,115,32,101,109,112,116,121,41,12,114,15,0,0,0,218, - 9,109,101,116,97,95,112,97,116,104,114,78,0,0,0,218, - 9,95,119,97,114,110,105,110,103,115,218,4,119,97,114,110, - 218,13,73,109,112,111,114,116,87,97,114,110,105,110,103,114, - 91,0,0,0,114,178,0,0,0,114,166,0,0,0,114,105, - 0,0,0,114,189,0,0,0,114,104,0,0,0,41,10,114, - 17,0,0,0,114,164,0,0,0,114,165,0,0,0,114,190, - 0,0,0,90,9,105,115,95,114,101,108,111,97,100,114,188, - 0,0,0,114,166,0,0,0,114,94,0,0,0,114,95,0, - 0,0,114,104,0,0,0,114,10,0,0,0,114,10,0,0, - 0,114,11,0,0,0,218,10,95,102,105,110,100,95,115,112, - 101,99,124,3,0,0,115,54,0,0,0,0,2,6,1,8, - 2,8,3,4,1,12,5,10,1,8,1,8,1,2,1,10, - 1,14,1,12,1,8,1,20,2,22,1,8,2,18,1,10, - 1,2,1,10,1,14,4,14,2,8,1,8,2,10,2,10, - 2,114,194,0,0,0,99,3,0,0,0,0,0,0,0,0, - 0,0,0,3,0,0,0,5,0,0,0,67,0,0,0,115, - 108,0,0,0,116,0,124,0,116,1,131,2,115,28,116,2, - 100,1,160,3,116,4,124,0,131,1,161,1,131,1,130,1, - 124,2,100,2,107,0,114,44,116,5,100,3,131,1,130,1, - 124,2,100,2,107,4,114,84,116,0,124,1,116,1,131,2, - 115,72,116,2,100,4,131,1,130,1,110,12,124,1,115,84, - 116,6,100,5,131,1,130,1,124,0,115,104,124,2,100,2, - 107,2,114,104,116,5,100,6,131,1,130,1,100,7,83,0, - 41,8,122,28,86,101,114,105,102,121,32,97,114,103,117,109, - 101,110,116,115,32,97,114,101,32,34,115,97,110,101,34,46, - 122,31,109,111,100,117,108,101,32,110,97,109,101,32,109,117, - 115,116,32,98,101,32,115,116,114,44,32,110,111,116,32,123, - 125,114,22,0,0,0,122,18,108,101,118,101,108,32,109,117, - 115,116,32,98,101,32,62,61,32,48,122,31,95,95,112,97, - 99,107,97,103,101,95,95,32,110,111,116,32,115,101,116,32, - 116,111,32,97,32,115,116,114,105,110,103,122,54,97,116,116, - 101,109,112,116,101,100,32,114,101,108,97,116,105,118,101,32, - 105,109,112,111,114,116,32,119,105,116,104,32,110,111,32,107, - 110,111,119,110,32,112,97,114,101,110,116,32,112,97,99,107, - 97,103,101,122,17,69,109,112,116,121,32,109,111,100,117,108, - 101,32,110,97,109,101,78,41,7,218,10,105,115,105,110,115, - 116,97,110,99,101,218,3,115,116,114,218,9,84,121,112,101, - 69,114,114,111,114,114,44,0,0,0,114,14,0,0,0,218, - 10,86,97,108,117,101,69,114,114,111,114,114,78,0,0,0, - 169,3,114,17,0,0,0,114,185,0,0,0,114,186,0,0, + 0,0,114,53,0,0,0,114,55,0,0,0,114,10,0,0, 0,114,10,0,0,0,114,10,0,0,0,114,11,0,0,0, - 218,13,95,115,97,110,105,116,121,95,99,104,101,99,107,171, - 3,0,0,115,22,0,0,0,0,2,10,1,18,1,8,1, - 8,1,8,1,10,1,10,1,4,1,8,2,12,1,114,200, - 0,0,0,122,16,78,111,32,109,111,100,117,108,101,32,110, - 97,109,101,100,32,122,4,123,33,114,125,99,2,0,0,0, - 0,0,0,0,0,0,0,0,8,0,0,0,8,0,0,0, - 67,0,0,0,115,220,0,0,0,100,0,125,2,124,0,160, - 0,100,1,161,1,100,2,25,0,125,3,124,3,114,134,124, - 3,116,1,106,2,107,7,114,42,116,3,124,1,124,3,131, - 2,1,0,124,0,116,1,106,2,107,6,114,62,116,1,106, - 2,124,0,25,0,83,0,116,1,106,2,124,3,25,0,125, - 4,122,10,124,4,106,4,125,2,87,0,110,50,4,0,116, - 5,107,10,114,132,1,0,1,0,1,0,116,6,100,3,23, - 0,160,7,124,0,124,3,161,2,125,5,116,8,124,5,124, - 0,100,4,141,2,100,0,130,2,89,0,110,2,88,0,116, - 9,124,0,124,2,131,2,125,6,124,6,100,0,107,8,114, - 172,116,8,116,6,160,7,124,0,161,1,124,0,100,4,141, - 2,130,1,110,8,116,10,124,6,131,1,125,7,124,3,114, - 216,116,1,106,2,124,3,25,0,125,4,116,11,124,4,124, - 0,160,0,100,1,161,1,100,5,25,0,124,7,131,3,1, - 0,124,7,83,0,41,6,78,114,127,0,0,0,114,22,0, - 0,0,122,23,59,32,123,33,114,125,32,105,115,32,110,111, - 116,32,97,32,112,97,99,107,97,103,101,114,16,0,0,0, - 233,2,0,0,0,41,12,114,128,0,0,0,114,15,0,0, - 0,114,91,0,0,0,114,66,0,0,0,114,140,0,0,0, - 114,105,0,0,0,218,8,95,69,82,82,95,77,83,71,114, - 44,0,0,0,218,19,77,111,100,117,108,101,78,111,116,70, - 111,117,110,100,69,114,114,111,114,114,194,0,0,0,114,158, - 0,0,0,114,5,0,0,0,41,8,114,17,0,0,0,218, - 7,105,109,112,111,114,116,95,114,164,0,0,0,114,129,0, - 0,0,90,13,112,97,114,101,110,116,95,109,111,100,117,108, - 101,114,156,0,0,0,114,94,0,0,0,114,95,0,0,0, - 114,10,0,0,0,114,10,0,0,0,114,11,0,0,0,218, - 23,95,102,105,110,100,95,97,110,100,95,108,111,97,100,95, - 117,110,108,111,99,107,101,100,190,3,0,0,115,42,0,0, - 0,0,1,4,1,14,1,4,1,10,1,10,2,10,1,10, - 1,10,1,2,1,10,1,14,1,16,1,20,1,10,1,8, - 1,20,2,8,1,4,2,10,1,22,1,114,205,0,0,0, - 99,2,0,0,0,0,0,0,0,0,0,0,0,4,0,0, - 0,10,0,0,0,67,0,0,0,115,106,0,0,0,116,0, - 124,0,131,1,143,50,1,0,116,1,106,2,160,3,124,0, - 116,4,161,2,125,2,124,2,116,4,107,8,114,54,116,5, - 124,0,124,1,131,2,87,0,2,0,53,0,81,0,82,0, - 163,0,83,0,87,0,53,0,81,0,82,0,88,0,124,2, - 100,1,107,8,114,94,100,2,160,6,124,0,161,1,125,3, - 116,7,124,3,124,0,100,3,141,2,130,1,116,8,124,0, - 131,1,1,0,124,2,83,0,41,4,122,25,70,105,110,100, - 32,97,110,100,32,108,111,97,100,32,116,104,101,32,109,111, - 100,117,108,101,46,78,122,40,105,109,112,111,114,116,32,111, - 102,32,123,125,32,104,97,108,116,101,100,59,32,78,111,110, - 101,32,105,110,32,115,121,115,46,109,111,100,117,108,101,115, - 114,16,0,0,0,41,9,114,49,0,0,0,114,15,0,0, - 0,114,91,0,0,0,114,34,0,0,0,218,14,95,78,69, - 69,68,83,95,76,79,65,68,73,78,71,114,205,0,0,0, - 114,44,0,0,0,114,203,0,0,0,114,64,0,0,0,41, - 4,114,17,0,0,0,114,204,0,0,0,114,95,0,0,0, - 114,74,0,0,0,114,10,0,0,0,114,10,0,0,0,114, - 11,0,0,0,218,14,95,102,105,110,100,95,97,110,100,95, - 108,111,97,100,220,3,0,0,115,22,0,0,0,0,2,10, - 1,14,1,8,1,32,2,8,1,4,1,2,255,4,2,12, - 2,8,1,114,207,0,0,0,114,22,0,0,0,99,3,0, - 0,0,0,0,0,0,0,0,0,0,3,0,0,0,4,0, - 0,0,67,0,0,0,115,42,0,0,0,116,0,124,0,124, - 1,124,2,131,3,1,0,124,2,100,1,107,4,114,32,116, - 1,124,0,124,1,124,2,131,3,125,0,116,2,124,0,116, - 3,131,2,83,0,41,2,97,50,1,0,0,73,109,112,111, - 114,116,32,97,110,100,32,114,101,116,117,114,110,32,116,104, - 101,32,109,111,100,117,108,101,32,98,97,115,101,100,32,111, - 110,32,105,116,115,32,110,97,109,101,44,32,116,104,101,32, - 112,97,99,107,97,103,101,32,116,104,101,32,99,97,108,108, - 32,105,115,10,32,32,32,32,98,101,105,110,103,32,109,97, - 100,101,32,102,114,111,109,44,32,97,110,100,32,116,104,101, - 32,108,101,118,101,108,32,97,100,106,117,115,116,109,101,110, - 116,46,10,10,32,32,32,32,84,104,105,115,32,102,117,110, - 99,116,105,111,110,32,114,101,112,114,101,115,101,110,116,115, - 32,116,104,101,32,103,114,101,97,116,101,115,116,32,99,111, - 109,109,111,110,32,100,101,110,111,109,105,110,97,116,111,114, - 32,111,102,32,102,117,110,99,116,105,111,110,97,108,105,116, - 121,10,32,32,32,32,98,101,116,119,101,101,110,32,105,109, - 112,111,114,116,95,109,111,100,117,108,101,32,97,110,100,32, - 95,95,105,109,112,111,114,116,95,95,46,32,84,104,105,115, - 32,105,110,99,108,117,100,101,115,32,115,101,116,116,105,110, - 103,32,95,95,112,97,99,107,97,103,101,95,95,32,105,102, - 10,32,32,32,32,116,104,101,32,108,111,97,100,101,114,32, - 100,105,100,32,110,111,116,46,10,10,32,32,32,32,114,22, - 0,0,0,41,4,114,200,0,0,0,114,187,0,0,0,114, - 207,0,0,0,218,11,95,103,99,100,95,105,109,112,111,114, - 116,114,199,0,0,0,114,10,0,0,0,114,10,0,0,0, - 114,11,0,0,0,114,208,0,0,0,236,3,0,0,115,8, - 0,0,0,0,9,12,1,8,1,12,1,114,208,0,0,0, - 169,1,218,9,114,101,99,117,114,115,105,118,101,99,3,0, - 0,0,0,0,0,0,1,0,0,0,8,0,0,0,11,0, - 0,0,67,0,0,0,115,226,0,0,0,124,1,68,0,93, - 216,125,4,116,0,124,4,116,1,131,2,115,66,124,3,114, - 34,124,0,106,2,100,1,23,0,125,5,110,4,100,2,125, - 5,116,3,100,3,124,5,155,0,100,4,116,4,124,4,131, - 1,106,2,155,0,157,4,131,1,130,1,113,4,124,4,100, - 5,107,2,114,108,124,3,115,220,116,5,124,0,100,6,131, - 2,114,220,116,6,124,0,124,0,106,7,124,2,100,7,100, - 8,141,4,1,0,113,4,116,5,124,0,124,4,131,2,115, - 4,100,9,160,8,124,0,106,2,124,4,161,2,125,6,122, - 14,116,9,124,2,124,6,131,2,1,0,87,0,113,4,4, - 0,116,10,107,10,114,218,1,0,125,7,1,0,122,42,124, - 7,106,11,124,6,107,2,114,200,116,12,106,13,160,14,124, - 6,116,15,161,2,100,10,107,9,114,200,87,0,89,0,162, - 8,113,4,130,0,87,0,53,0,100,10,125,7,126,7,88, - 0,89,0,113,4,88,0,113,4,124,0,83,0,41,11,122, - 238,70,105,103,117,114,101,32,111,117,116,32,119,104,97,116, - 32,95,95,105,109,112,111,114,116,95,95,32,115,104,111,117, - 108,100,32,114,101,116,117,114,110,46,10,10,32,32,32,32, - 84,104,101,32,105,109,112,111,114,116,95,32,112,97,114,97, - 109,101,116,101,114,32,105,115,32,97,32,99,97,108,108,97, - 98,108,101,32,119,104,105,99,104,32,116,97,107,101,115,32, - 116,104,101,32,110,97,109,101,32,111,102,32,109,111,100,117, - 108,101,32,116,111,10,32,32,32,32,105,109,112,111,114,116, - 46,32,73,116,32,105,115,32,114,101,113,117,105,114,101,100, - 32,116,111,32,100,101,99,111,117,112,108,101,32,116,104,101, - 32,102,117,110,99,116,105,111,110,32,102,114,111,109,32,97, - 115,115,117,109,105,110,103,32,105,109,112,111,114,116,108,105, - 98,39,115,10,32,32,32,32,105,109,112,111,114,116,32,105, - 109,112,108,101,109,101,110,116,97,116,105,111,110,32,105,115, - 32,100,101,115,105,114,101,100,46,10,10,32,32,32,32,122, - 8,46,95,95,97,108,108,95,95,122,13,96,96,102,114,111, - 109,32,108,105,115,116,39,39,122,8,73,116,101,109,32,105, - 110,32,122,18,32,109,117,115,116,32,98,101,32,115,116,114, - 44,32,110,111,116,32,250,1,42,218,7,95,95,97,108,108, - 95,95,84,114,209,0,0,0,114,182,0,0,0,78,41,16, - 114,195,0,0,0,114,196,0,0,0,114,1,0,0,0,114, - 197,0,0,0,114,14,0,0,0,114,4,0,0,0,218,16, - 95,104,97,110,100,108,101,95,102,114,111,109,108,105,115,116, - 114,212,0,0,0,114,44,0,0,0,114,66,0,0,0,114, - 203,0,0,0,114,17,0,0,0,114,15,0,0,0,114,91, - 0,0,0,114,34,0,0,0,114,206,0,0,0,41,8,114, - 95,0,0,0,218,8,102,114,111,109,108,105,115,116,114,204, - 0,0,0,114,210,0,0,0,218,1,120,90,5,119,104,101, - 114,101,90,9,102,114,111,109,95,110,97,109,101,90,3,101, - 120,99,114,10,0,0,0,114,10,0,0,0,114,11,0,0, - 0,114,213,0,0,0,251,3,0,0,115,44,0,0,0,0, - 10,8,1,10,1,4,1,12,2,4,1,28,2,8,1,14, - 1,10,1,2,255,8,2,10,1,14,1,2,1,14,1,16, - 4,10,1,16,255,2,2,8,1,22,1,114,213,0,0,0, - 99,1,0,0,0,0,0,0,0,0,0,0,0,3,0,0, - 0,6,0,0,0,67,0,0,0,115,146,0,0,0,124,0, - 160,0,100,1,161,1,125,1,124,0,160,0,100,2,161,1, - 125,2,124,1,100,3,107,9,114,82,124,2,100,3,107,9, - 114,78,124,1,124,2,106,1,107,3,114,78,116,2,106,3, - 100,4,124,1,155,2,100,5,124,2,106,1,155,2,100,6, - 157,5,116,4,100,7,100,8,141,3,1,0,124,1,83,0, - 124,2,100,3,107,9,114,96,124,2,106,1,83,0,116,2, - 106,3,100,9,116,4,100,7,100,8,141,3,1,0,124,0, - 100,10,25,0,125,1,100,11,124,0,107,7,114,142,124,1, - 160,5,100,12,161,1,100,13,25,0,125,1,124,1,83,0, - 41,14,122,167,67,97,108,99,117,108,97,116,101,32,119,104, - 97,116,32,95,95,112,97,99,107,97,103,101,95,95,32,115, - 104,111,117,108,100,32,98,101,46,10,10,32,32,32,32,95, - 95,112,97,99,107,97,103,101,95,95,32,105,115,32,110,111, - 116,32,103,117,97,114,97,110,116,101,101,100,32,116,111,32, - 98,101,32,100,101,102,105,110,101,100,32,111,114,32,99,111, - 117,108,100,32,98,101,32,115,101,116,32,116,111,32,78,111, - 110,101,10,32,32,32,32,116,111,32,114,101,112,114,101,115, - 101,110,116,32,116,104,97,116,32,105,116,115,32,112,114,111, - 112,101,114,32,118,97,108,117,101,32,105,115,32,117,110,107, - 110,111,119,110,46,10,10,32,32,32,32,114,144,0,0,0, - 114,104,0,0,0,78,122,32,95,95,112,97,99,107,97,103, - 101,95,95,32,33,61,32,95,95,115,112,101,99,95,95,46, - 112,97,114,101,110,116,32,40,122,4,32,33,61,32,250,1, - 41,233,3,0,0,0,41,1,90,10,115,116,97,99,107,108, - 101,118,101,108,122,89,99,97,110,39,116,32,114,101,115,111, - 108,118,101,32,112,97,99,107,97,103,101,32,102,114,111,109, - 32,95,95,115,112,101,99,95,95,32,111,114,32,95,95,112, - 97,99,107,97,103,101,95,95,44,32,102,97,108,108,105,110, - 103,32,98,97,99,107,32,111,110,32,95,95,110,97,109,101, - 95,95,32,97,110,100,32,95,95,112,97,116,104,95,95,114, - 1,0,0,0,114,140,0,0,0,114,127,0,0,0,114,22, - 0,0,0,41,6,114,34,0,0,0,114,129,0,0,0,114, - 191,0,0,0,114,192,0,0,0,114,193,0,0,0,114,128, - 0,0,0,41,3,218,7,103,108,111,98,97,108,115,114,185, - 0,0,0,114,94,0,0,0,114,10,0,0,0,114,10,0, - 0,0,114,11,0,0,0,218,17,95,99,97,108,99,95,95, - 95,112,97,99,107,97,103,101,95,95,32,4,0,0,115,38, - 0,0,0,0,7,10,1,10,1,8,1,18,1,22,2,2, - 0,2,254,6,3,4,1,8,1,6,2,6,2,2,0,2, - 254,6,3,8,1,8,1,14,1,114,219,0,0,0,114,10, - 0,0,0,99,5,0,0,0,0,0,0,0,0,0,0,0, - 9,0,0,0,5,0,0,0,67,0,0,0,115,180,0,0, - 0,124,4,100,1,107,2,114,18,116,0,124,0,131,1,125, - 5,110,36,124,1,100,2,107,9,114,30,124,1,110,2,105, - 0,125,6,116,1,124,6,131,1,125,7,116,0,124,0,124, - 7,124,4,131,3,125,5,124,3,115,150,124,4,100,1,107, - 2,114,84,116,0,124,0,160,2,100,3,161,1,100,1,25, - 0,131,1,83,0,124,0,115,92,124,5,83,0,116,3,124, - 0,131,1,116,3,124,0,160,2,100,3,161,1,100,1,25, - 0,131,1,24,0,125,8,116,4,106,5,124,5,106,6,100, - 2,116,3,124,5,106,6,131,1,124,8,24,0,133,2,25, - 0,25,0,83,0,110,26,116,7,124,5,100,4,131,2,114, - 172,116,8,124,5,124,3,116,0,131,3,83,0,124,5,83, - 0,100,2,83,0,41,5,97,215,1,0,0,73,109,112,111, - 114,116,32,97,32,109,111,100,117,108,101,46,10,10,32,32, - 32,32,84,104,101,32,39,103,108,111,98,97,108,115,39,32, - 97,114,103,117,109,101,110,116,32,105,115,32,117,115,101,100, - 32,116,111,32,105,110,102,101,114,32,119,104,101,114,101,32, - 116,104,101,32,105,109,112,111,114,116,32,105,115,32,111,99, - 99,117,114,114,105,110,103,32,102,114,111,109,10,32,32,32, - 32,116,111,32,104,97,110,100,108,101,32,114,101,108,97,116, - 105,118,101,32,105,109,112,111,114,116,115,46,32,84,104,101, - 32,39,108,111,99,97,108,115,39,32,97,114,103,117,109,101, - 110,116,32,105,115,32,105,103,110,111,114,101,100,46,32,84, - 104,101,10,32,32,32,32,39,102,114,111,109,108,105,115,116, - 39,32,97,114,103,117,109,101,110,116,32,115,112,101,99,105, - 102,105,101,115,32,119,104,97,116,32,115,104,111,117,108,100, - 32,101,120,105,115,116,32,97,115,32,97,116,116,114,105,98, - 117,116,101,115,32,111,110,32,116,104,101,32,109,111,100,117, - 108,101,10,32,32,32,32,98,101,105,110,103,32,105,109,112, - 111,114,116,101,100,32,40,101,46,103,46,32,96,96,102,114, - 111,109,32,109,111,100,117,108,101,32,105,109,112,111,114,116, - 32,60,102,114,111,109,108,105,115,116,62,96,96,41,46,32, - 32,84,104,101,32,39,108,101,118,101,108,39,10,32,32,32, - 32,97,114,103,117,109,101,110,116,32,114,101,112,114,101,115, - 101,110,116,115,32,116,104,101,32,112,97,99,107,97,103,101, - 32,108,111,99,97,116,105,111,110,32,116,111,32,105,109,112, - 111,114,116,32,102,114,111,109,32,105,110,32,97,32,114,101, - 108,97,116,105,118,101,10,32,32,32,32,105,109,112,111,114, - 116,32,40,101,46,103,46,32,96,96,102,114,111,109,32,46, - 46,112,107,103,32,105,109,112,111,114,116,32,109,111,100,96, - 96,32,119,111,117,108,100,32,104,97,118,101,32,97,32,39, - 108,101,118,101,108,39,32,111,102,32,50,41,46,10,10,32, - 32,32,32,114,22,0,0,0,78,114,127,0,0,0,114,140, - 0,0,0,41,9,114,208,0,0,0,114,219,0,0,0,218, - 9,112,97,114,116,105,116,105,111,110,114,184,0,0,0,114, - 15,0,0,0,114,91,0,0,0,114,1,0,0,0,114,4, - 0,0,0,114,213,0,0,0,41,9,114,17,0,0,0,114, - 218,0,0,0,218,6,108,111,99,97,108,115,114,214,0,0, - 0,114,186,0,0,0,114,95,0,0,0,90,8,103,108,111, - 98,97,108,115,95,114,185,0,0,0,90,7,99,117,116,95, - 111,102,102,114,10,0,0,0,114,10,0,0,0,114,11,0, - 0,0,218,10,95,95,105,109,112,111,114,116,95,95,59,4, - 0,0,115,30,0,0,0,0,11,8,1,10,2,16,1,8, - 1,12,1,4,3,8,1,18,1,4,1,4,4,26,3,32, - 1,10,1,12,2,114,222,0,0,0,99,1,0,0,0,0, - 0,0,0,0,0,0,0,2,0,0,0,3,0,0,0,67, - 0,0,0,115,38,0,0,0,116,0,160,1,124,0,161,1, - 125,1,124,1,100,0,107,8,114,30,116,2,100,1,124,0, - 23,0,131,1,130,1,116,3,124,1,131,1,83,0,41,2, - 78,122,25,110,111,32,98,117,105,108,116,45,105,110,32,109, - 111,100,117,108,101,32,110,97,109,101,100,32,41,4,114,159, - 0,0,0,114,166,0,0,0,114,78,0,0,0,114,158,0, - 0,0,41,2,114,17,0,0,0,114,94,0,0,0,114,10, - 0,0,0,114,10,0,0,0,114,11,0,0,0,218,18,95, - 98,117,105,108,116,105,110,95,102,114,111,109,95,110,97,109, - 101,96,4,0,0,115,8,0,0,0,0,1,10,1,8,1, - 12,1,114,223,0,0,0,99,2,0,0,0,0,0,0,0, - 0,0,0,0,10,0,0,0,5,0,0,0,67,0,0,0, - 115,166,0,0,0,124,1,97,0,124,0,97,1,116,2,116, - 1,131,1,125,2,116,1,106,3,160,4,161,0,68,0,93, - 72,92,2,125,3,125,4,116,5,124,4,124,2,131,2,114, - 26,124,3,116,1,106,6,107,6,114,60,116,7,125,5,110, - 18,116,0,160,8,124,3,161,1,114,26,116,9,125,5,110, - 2,113,26,116,10,124,4,124,5,131,2,125,6,116,11,124, - 6,124,4,131,2,1,0,113,26,116,1,106,3,116,12,25, - 0,125,7,100,1,68,0,93,46,125,8,124,8,116,1,106, - 3,107,7,114,138,116,13,124,8,131,1,125,9,110,10,116, - 1,106,3,124,8,25,0,125,9,116,14,124,7,124,8,124, - 9,131,3,1,0,113,114,100,2,83,0,41,3,122,250,83, - 101,116,117,112,32,105,109,112,111,114,116,108,105,98,32,98, - 121,32,105,109,112,111,114,116,105,110,103,32,110,101,101,100, - 101,100,32,98,117,105,108,116,45,105,110,32,109,111,100,117, - 108,101,115,32,97,110,100,32,105,110,106,101,99,116,105,110, - 103,32,116,104,101,109,10,32,32,32,32,105,110,116,111,32, - 116,104,101,32,103,108,111,98,97,108,32,110,97,109,101,115, - 112,97,99,101,46,10,10,32,32,32,32,65,115,32,115,121, - 115,32,105,115,32,110,101,101,100,101,100,32,102,111,114,32, - 115,121,115,46,109,111,100,117,108,101,115,32,97,99,99,101, - 115,115,32,97,110,100,32,95,105,109,112,32,105,115,32,110, - 101,101,100,101,100,32,116,111,32,108,111,97,100,32,98,117, - 105,108,116,45,105,110,10,32,32,32,32,109,111,100,117,108, - 101,115,44,32,116,104,111,115,101,32,116,119,111,32,109,111, - 100,117,108,101,115,32,109,117,115,116,32,98,101,32,101,120, - 112,108,105,99,105,116,108,121,32,112,97,115,115,101,100,32, - 105,110,46,10,10,32,32,32,32,41,3,114,23,0,0,0, - 114,191,0,0,0,114,63,0,0,0,78,41,15,114,56,0, - 0,0,114,15,0,0,0,114,14,0,0,0,114,91,0,0, - 0,218,5,105,116,101,109,115,114,195,0,0,0,114,77,0, - 0,0,114,159,0,0,0,114,87,0,0,0,114,173,0,0, - 0,114,141,0,0,0,114,147,0,0,0,114,1,0,0,0, - 114,223,0,0,0,114,5,0,0,0,41,10,218,10,115,121, - 115,95,109,111,100,117,108,101,218,11,95,105,109,112,95,109, - 111,100,117,108,101,90,11,109,111,100,117,108,101,95,116,121, - 112,101,114,17,0,0,0,114,95,0,0,0,114,108,0,0, - 0,114,94,0,0,0,90,11,115,101,108,102,95,109,111,100, - 117,108,101,90,12,98,117,105,108,116,105,110,95,110,97,109, - 101,90,14,98,117,105,108,116,105,110,95,109,111,100,117,108, - 101,114,10,0,0,0,114,10,0,0,0,114,11,0,0,0, - 218,6,95,115,101,116,117,112,103,4,0,0,115,36,0,0, - 0,0,9,4,1,4,3,8,1,18,1,10,1,10,1,6, - 1,10,1,6,2,2,1,10,1,12,3,10,1,8,1,10, - 1,10,2,10,1,114,227,0,0,0,99,2,0,0,0,0, - 0,0,0,0,0,0,0,2,0,0,0,3,0,0,0,67, - 0,0,0,115,38,0,0,0,116,0,124,0,124,1,131,2, - 1,0,116,1,106,2,160,3,116,4,161,1,1,0,116,1, - 106,2,160,3,116,5,161,1,1,0,100,1,83,0,41,2, - 122,48,73,110,115,116,97,108,108,32,105,109,112,111,114,116, - 101,114,115,32,102,111,114,32,98,117,105,108,116,105,110,32, - 97,110,100,32,102,114,111,122,101,110,32,109,111,100,117,108, - 101,115,78,41,6,114,227,0,0,0,114,15,0,0,0,114, - 190,0,0,0,114,118,0,0,0,114,159,0,0,0,114,173, - 0,0,0,41,2,114,225,0,0,0,114,226,0,0,0,114, - 10,0,0,0,114,10,0,0,0,114,11,0,0,0,218,8, - 95,105,110,115,116,97,108,108,138,4,0,0,115,6,0,0, - 0,0,2,10,2,12,1,114,228,0,0,0,99,0,0,0, - 0,0,0,0,0,0,0,0,0,1,0,0,0,4,0,0, - 0,67,0,0,0,115,32,0,0,0,100,1,100,2,108,0, - 125,0,124,0,97,1,124,0,160,2,116,3,106,4,116,5, - 25,0,161,1,1,0,100,2,83,0,41,3,122,57,73,110, + 114,178,0,0,0,93,3,0,0,115,6,0,0,0,8,2, + 4,2,8,4,114,178,0,0,0,99,3,0,0,0,0,0, + 0,0,0,0,0,0,5,0,0,0,5,0,0,0,67,0, + 0,0,115,64,0,0,0,124,1,160,0,100,1,124,2,100, + 2,24,0,161,2,125,3,116,1,124,3,131,1,124,2,107, + 0,114,36,116,2,100,3,131,1,130,1,124,3,100,4,25, + 0,125,4,124,0,114,60,100,5,160,3,124,4,124,0,161, + 2,83,0,124,4,83,0,41,6,122,50,82,101,115,111,108, + 118,101,32,97,32,114,101,108,97,116,105,118,101,32,109,111, + 100,117,108,101,32,110,97,109,101,32,116,111,32,97,110,32, + 97,98,115,111,108,117,116,101,32,111,110,101,46,114,127,0, + 0,0,114,37,0,0,0,122,50,97,116,116,101,109,112,116, + 101,100,32,114,101,108,97,116,105,118,101,32,105,109,112,111, + 114,116,32,98,101,121,111,110,100,32,116,111,112,45,108,101, + 118,101,108,32,112,97,99,107,97,103,101,114,22,0,0,0, + 250,5,123,125,46,123,125,41,4,218,6,114,115,112,108,105, + 116,218,3,108,101,110,114,78,0,0,0,114,44,0,0,0, + 41,5,114,17,0,0,0,218,7,112,97,99,107,97,103,101, + 218,5,108,101,118,101,108,90,4,98,105,116,115,90,4,98, + 97,115,101,114,10,0,0,0,114,10,0,0,0,114,11,0, + 0,0,218,13,95,114,101,115,111,108,118,101,95,110,97,109, + 101,106,3,0,0,115,10,0,0,0,0,2,16,1,12,1, + 8,1,8,1,114,187,0,0,0,99,3,0,0,0,0,0, + 0,0,0,0,0,0,4,0,0,0,4,0,0,0,67,0, + 0,0,115,34,0,0,0,124,0,160,0,124,1,124,2,161, + 2,125,3,124,3,100,0,107,8,114,24,100,0,83,0,116, + 1,124,1,124,3,131,2,83,0,114,13,0,0,0,41,2, + 114,167,0,0,0,114,90,0,0,0,41,4,218,6,102,105, + 110,100,101,114,114,17,0,0,0,114,164,0,0,0,114,108, + 0,0,0,114,10,0,0,0,114,10,0,0,0,114,11,0, + 0,0,218,17,95,102,105,110,100,95,115,112,101,99,95,108, + 101,103,97,99,121,115,3,0,0,115,8,0,0,0,0,3, + 12,1,8,1,4,1,114,189,0,0,0,99,3,0,0,0, + 0,0,0,0,0,0,0,0,10,0,0,0,10,0,0,0, + 67,0,0,0,115,36,1,0,0,116,0,106,1,125,3,124, + 3,100,1,107,8,114,22,116,2,100,2,131,1,130,1,124, + 3,115,38,116,3,160,4,100,3,116,5,161,2,1,0,124, + 0,116,0,106,6,107,6,125,4,124,3,68,0,93,234,125, + 5,116,7,131,0,143,96,1,0,122,10,124,5,106,8,125, + 6,87,0,110,56,4,0,116,9,107,10,114,130,1,0,1, + 0,1,0,116,10,124,5,124,0,124,1,131,3,125,7,124, + 7,100,1,107,8,114,126,89,0,87,0,100,1,4,0,4, + 0,131,3,1,0,113,52,89,0,110,14,48,0,124,6,124, + 0,124,1,124,2,131,3,125,7,87,0,100,1,4,0,4, + 0,131,3,1,0,110,16,49,0,115,164,48,0,1,0,1, + 0,1,0,89,0,1,0,124,7,100,1,107,9,114,52,124, + 4,144,1,115,22,124,0,116,0,106,6,107,6,144,1,114, + 22,116,0,106,6,124,0,25,0,125,8,122,10,124,8,106, + 11,125,9,87,0,110,28,4,0,116,9,107,10,114,248,1, + 0,1,0,1,0,124,7,6,0,89,0,2,0,1,0,83, + 0,48,0,124,9,100,1,107,8,144,1,114,12,124,7,2, + 0,1,0,83,0,124,9,2,0,1,0,83,0,113,52,124, + 7,2,0,1,0,83,0,113,52,100,1,83,0,41,4,122, + 21,70,105,110,100,32,97,32,109,111,100,117,108,101,39,115, + 32,115,112,101,99,46,78,122,53,115,121,115,46,109,101,116, + 97,95,112,97,116,104,32,105,115,32,78,111,110,101,44,32, + 80,121,116,104,111,110,32,105,115,32,108,105,107,101,108,121, + 32,115,104,117,116,116,105,110,103,32,100,111,119,110,122,22, + 115,121,115,46,109,101,116,97,95,112,97,116,104,32,105,115, + 32,101,109,112,116,121,41,12,114,15,0,0,0,218,9,109, + 101,116,97,95,112,97,116,104,114,78,0,0,0,218,9,95, + 119,97,114,110,105,110,103,115,218,4,119,97,114,110,218,13, + 73,109,112,111,114,116,87,97,114,110,105,110,103,114,91,0, + 0,0,114,178,0,0,0,114,166,0,0,0,114,105,0,0, + 0,114,189,0,0,0,114,104,0,0,0,41,10,114,17,0, + 0,0,114,164,0,0,0,114,165,0,0,0,114,190,0,0, + 0,90,9,105,115,95,114,101,108,111,97,100,114,188,0,0, + 0,114,166,0,0,0,114,94,0,0,0,114,95,0,0,0, + 114,104,0,0,0,114,10,0,0,0,114,10,0,0,0,114, + 11,0,0,0,218,10,95,102,105,110,100,95,115,112,101,99, + 124,3,0,0,115,54,0,0,0,0,2,6,1,8,2,8, + 3,4,1,12,5,10,1,8,1,8,1,2,1,10,1,14, + 1,12,1,8,1,22,2,42,1,8,2,18,1,10,1,2, + 1,10,1,14,4,14,2,10,1,8,2,10,2,10,2,114, + 194,0,0,0,99,3,0,0,0,0,0,0,0,0,0,0, + 0,3,0,0,0,5,0,0,0,67,0,0,0,115,108,0, + 0,0,116,0,124,0,116,1,131,2,115,28,116,2,100,1, + 160,3,116,4,124,0,131,1,161,1,131,1,130,1,124,2, + 100,2,107,0,114,44,116,5,100,3,131,1,130,1,124,2, + 100,2,107,4,114,84,116,0,124,1,116,1,131,2,115,72, + 116,2,100,4,131,1,130,1,110,12,124,1,115,84,116,6, + 100,5,131,1,130,1,124,0,115,104,124,2,100,2,107,2, + 114,104,116,5,100,6,131,1,130,1,100,7,83,0,41,8, + 122,28,86,101,114,105,102,121,32,97,114,103,117,109,101,110, + 116,115,32,97,114,101,32,34,115,97,110,101,34,46,122,31, + 109,111,100,117,108,101,32,110,97,109,101,32,109,117,115,116, + 32,98,101,32,115,116,114,44,32,110,111,116,32,123,125,114, + 22,0,0,0,122,18,108,101,118,101,108,32,109,117,115,116, + 32,98,101,32,62,61,32,48,122,31,95,95,112,97,99,107, + 97,103,101,95,95,32,110,111,116,32,115,101,116,32,116,111, + 32,97,32,115,116,114,105,110,103,122,54,97,116,116,101,109, + 112,116,101,100,32,114,101,108,97,116,105,118,101,32,105,109, + 112,111,114,116,32,119,105,116,104,32,110,111,32,107,110,111, + 119,110,32,112,97,114,101,110,116,32,112,97,99,107,97,103, + 101,122,17,69,109,112,116,121,32,109,111,100,117,108,101,32, + 110,97,109,101,78,41,7,218,10,105,115,105,110,115,116,97, + 110,99,101,218,3,115,116,114,218,9,84,121,112,101,69,114, + 114,111,114,114,44,0,0,0,114,14,0,0,0,218,10,86, + 97,108,117,101,69,114,114,111,114,114,78,0,0,0,169,3, + 114,17,0,0,0,114,185,0,0,0,114,186,0,0,0,114, + 10,0,0,0,114,10,0,0,0,114,11,0,0,0,218,13, + 95,115,97,110,105,116,121,95,99,104,101,99,107,171,3,0, + 0,115,22,0,0,0,0,2,10,1,18,1,8,1,8,1, + 8,1,10,1,10,1,4,1,8,2,12,1,114,200,0,0, + 0,122,16,78,111,32,109,111,100,117,108,101,32,110,97,109, + 101,100,32,122,4,123,33,114,125,99,2,0,0,0,0,0, + 0,0,0,0,0,0,8,0,0,0,8,0,0,0,67,0, + 0,0,115,220,0,0,0,100,0,125,2,124,0,160,0,100, + 1,161,1,100,2,25,0,125,3,124,3,114,134,124,3,116, + 1,106,2,107,7,114,42,116,3,124,1,124,3,131,2,1, + 0,124,0,116,1,106,2,107,6,114,62,116,1,106,2,124, + 0,25,0,83,0,116,1,106,2,124,3,25,0,125,4,122, + 10,124,4,106,4,125,2,87,0,110,50,4,0,116,5,107, + 10,114,132,1,0,1,0,1,0,116,6,100,3,23,0,160, + 7,124,0,124,3,161,2,125,5,116,8,124,5,124,0,100, + 4,141,2,100,0,130,2,89,0,110,2,48,0,116,9,124, + 0,124,2,131,2,125,6,124,6,100,0,107,8,114,172,116, + 8,116,6,160,7,124,0,161,1,124,0,100,4,141,2,130, + 1,110,8,116,10,124,6,131,1,125,7,124,3,114,216,116, + 1,106,2,124,3,25,0,125,4,116,11,124,4,124,0,160, + 0,100,1,161,1,100,5,25,0,124,7,131,3,1,0,124, + 7,83,0,41,6,78,114,127,0,0,0,114,22,0,0,0, + 122,23,59,32,123,33,114,125,32,105,115,32,110,111,116,32, + 97,32,112,97,99,107,97,103,101,114,16,0,0,0,233,2, + 0,0,0,41,12,114,128,0,0,0,114,15,0,0,0,114, + 91,0,0,0,114,66,0,0,0,114,140,0,0,0,114,105, + 0,0,0,218,8,95,69,82,82,95,77,83,71,114,44,0, + 0,0,218,19,77,111,100,117,108,101,78,111,116,70,111,117, + 110,100,69,114,114,111,114,114,194,0,0,0,114,158,0,0, + 0,114,5,0,0,0,41,8,114,17,0,0,0,218,7,105, + 109,112,111,114,116,95,114,164,0,0,0,114,129,0,0,0, + 90,13,112,97,114,101,110,116,95,109,111,100,117,108,101,114, + 156,0,0,0,114,94,0,0,0,114,95,0,0,0,114,10, + 0,0,0,114,10,0,0,0,114,11,0,0,0,218,23,95, + 102,105,110,100,95,97,110,100,95,108,111,97,100,95,117,110, + 108,111,99,107,101,100,190,3,0,0,115,42,0,0,0,0, + 1,4,1,14,1,4,1,10,1,10,2,10,1,10,1,10, + 1,2,1,10,1,14,1,16,1,20,1,10,1,8,1,20, + 2,8,1,4,2,10,1,22,1,114,205,0,0,0,99,2, + 0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,8, + 0,0,0,67,0,0,0,115,128,0,0,0,116,0,124,0, + 131,1,143,62,1,0,116,1,106,2,160,3,124,0,116,4, + 161,2,125,2,124,2,116,4,107,8,114,56,116,5,124,0, + 124,1,131,2,87,0,2,0,100,1,4,0,4,0,131,3, + 1,0,83,0,87,0,100,1,4,0,4,0,131,3,1,0, + 110,16,49,0,115,76,48,0,1,0,1,0,1,0,89,0, + 1,0,124,2,100,1,107,8,114,116,100,2,160,6,124,0, + 161,1,125,3,116,7,124,3,124,0,100,3,141,2,130,1, + 116,8,124,0,131,1,1,0,124,2,83,0,41,4,122,25, + 70,105,110,100,32,97,110,100,32,108,111,97,100,32,116,104, + 101,32,109,111,100,117,108,101,46,78,122,40,105,109,112,111, + 114,116,32,111,102,32,123,125,32,104,97,108,116,101,100,59, + 32,78,111,110,101,32,105,110,32,115,121,115,46,109,111,100, + 117,108,101,115,114,16,0,0,0,41,9,114,49,0,0,0, + 114,15,0,0,0,114,91,0,0,0,114,34,0,0,0,218, + 14,95,78,69,69,68,83,95,76,79,65,68,73,78,71,114, + 205,0,0,0,114,44,0,0,0,114,203,0,0,0,114,64, + 0,0,0,41,4,114,17,0,0,0,114,204,0,0,0,114, + 95,0,0,0,114,74,0,0,0,114,10,0,0,0,114,10, + 0,0,0,114,11,0,0,0,218,14,95,102,105,110,100,95, + 97,110,100,95,108,111,97,100,220,3,0,0,115,22,0,0, + 0,0,2,10,1,14,1,8,1,54,2,8,1,4,1,2, + 255,4,2,12,2,8,1,114,207,0,0,0,114,22,0,0, + 0,99,3,0,0,0,0,0,0,0,0,0,0,0,3,0, + 0,0,4,0,0,0,67,0,0,0,115,42,0,0,0,116, + 0,124,0,124,1,124,2,131,3,1,0,124,2,100,1,107, + 4,114,32,116,1,124,0,124,1,124,2,131,3,125,0,116, + 2,124,0,116,3,131,2,83,0,41,2,97,50,1,0,0, + 73,109,112,111,114,116,32,97,110,100,32,114,101,116,117,114, + 110,32,116,104,101,32,109,111,100,117,108,101,32,98,97,115, + 101,100,32,111,110,32,105,116,115,32,110,97,109,101,44,32, + 116,104,101,32,112,97,99,107,97,103,101,32,116,104,101,32, + 99,97,108,108,32,105,115,10,32,32,32,32,98,101,105,110, + 103,32,109,97,100,101,32,102,114,111,109,44,32,97,110,100, + 32,116,104,101,32,108,101,118,101,108,32,97,100,106,117,115, + 116,109,101,110,116,46,10,10,32,32,32,32,84,104,105,115, + 32,102,117,110,99,116,105,111,110,32,114,101,112,114,101,115, + 101,110,116,115,32,116,104,101,32,103,114,101,97,116,101,115, + 116,32,99,111,109,109,111,110,32,100,101,110,111,109,105,110, + 97,116,111,114,32,111,102,32,102,117,110,99,116,105,111,110, + 97,108,105,116,121,10,32,32,32,32,98,101,116,119,101,101, + 110,32,105,109,112,111,114,116,95,109,111,100,117,108,101,32, + 97,110,100,32,95,95,105,109,112,111,114,116,95,95,46,32, + 84,104,105,115,32,105,110,99,108,117,100,101,115,32,115,101, + 116,116,105,110,103,32,95,95,112,97,99,107,97,103,101,95, + 95,32,105,102,10,32,32,32,32,116,104,101,32,108,111,97, + 100,101,114,32,100,105,100,32,110,111,116,46,10,10,32,32, + 32,32,114,22,0,0,0,41,4,114,200,0,0,0,114,187, + 0,0,0,114,207,0,0,0,218,11,95,103,99,100,95,105, + 109,112,111,114,116,114,199,0,0,0,114,10,0,0,0,114, + 10,0,0,0,114,11,0,0,0,114,208,0,0,0,236,3, + 0,0,115,8,0,0,0,0,9,12,1,8,1,12,1,114, + 208,0,0,0,169,1,218,9,114,101,99,117,114,115,105,118, + 101,99,3,0,0,0,0,0,0,0,1,0,0,0,8,0, + 0,0,11,0,0,0,67,0,0,0,115,234,0,0,0,124, + 1,68,0,93,224,125,4,116,0,124,4,116,1,131,2,115, + 66,124,3,114,34,124,0,106,2,100,1,23,0,125,5,110, + 4,100,2,125,5,116,3,100,3,124,5,155,0,100,4,116, + 4,124,4,131,1,106,2,155,0,157,4,131,1,130,1,113, + 4,124,4,100,5,107,2,114,108,124,3,115,228,116,5,124, + 0,100,6,131,2,114,228,116,6,124,0,124,0,106,7,124, + 2,100,7,100,8,141,4,1,0,113,4,116,5,124,0,124, + 4,131,2,115,4,100,9,160,8,124,0,106,2,124,4,161, + 2,125,6,122,14,116,9,124,2,124,6,131,2,1,0,87, + 0,113,4,4,0,116,10,107,10,114,226,1,0,125,7,1, + 0,122,54,124,7,106,11,124,6,107,2,114,204,116,12,106, + 13,160,14,124,6,116,15,161,2,100,10,107,9,114,204,87, + 0,89,0,100,10,125,7,126,7,113,4,130,0,87,0,89, + 0,100,10,125,7,126,7,113,4,100,10,125,7,126,7,48, + 0,48,0,113,4,124,0,83,0,41,11,122,238,70,105,103, + 117,114,101,32,111,117,116,32,119,104,97,116,32,95,95,105, + 109,112,111,114,116,95,95,32,115,104,111,117,108,100,32,114, + 101,116,117,114,110,46,10,10,32,32,32,32,84,104,101,32, + 105,109,112,111,114,116,95,32,112,97,114,97,109,101,116,101, + 114,32,105,115,32,97,32,99,97,108,108,97,98,108,101,32, + 119,104,105,99,104,32,116,97,107,101,115,32,116,104,101,32, + 110,97,109,101,32,111,102,32,109,111,100,117,108,101,32,116, + 111,10,32,32,32,32,105,109,112,111,114,116,46,32,73,116, + 32,105,115,32,114,101,113,117,105,114,101,100,32,116,111,32, + 100,101,99,111,117,112,108,101,32,116,104,101,32,102,117,110, + 99,116,105,111,110,32,102,114,111,109,32,97,115,115,117,109, + 105,110,103,32,105,109,112,111,114,116,108,105,98,39,115,10, + 32,32,32,32,105,109,112,111,114,116,32,105,109,112,108,101, + 109,101,110,116,97,116,105,111,110,32,105,115,32,100,101,115, + 105,114,101,100,46,10,10,32,32,32,32,122,8,46,95,95, + 97,108,108,95,95,122,13,96,96,102,114,111,109,32,108,105, + 115,116,39,39,122,8,73,116,101,109,32,105,110,32,122,18, + 32,109,117,115,116,32,98,101,32,115,116,114,44,32,110,111, + 116,32,250,1,42,218,7,95,95,97,108,108,95,95,84,114, + 209,0,0,0,114,182,0,0,0,78,41,16,114,195,0,0, + 0,114,196,0,0,0,114,1,0,0,0,114,197,0,0,0, + 114,14,0,0,0,114,4,0,0,0,218,16,95,104,97,110, + 100,108,101,95,102,114,111,109,108,105,115,116,114,212,0,0, + 0,114,44,0,0,0,114,66,0,0,0,114,203,0,0,0, + 114,17,0,0,0,114,15,0,0,0,114,91,0,0,0,114, + 34,0,0,0,114,206,0,0,0,41,8,114,95,0,0,0, + 218,8,102,114,111,109,108,105,115,116,114,204,0,0,0,114, + 210,0,0,0,218,1,120,90,5,119,104,101,114,101,90,9, + 102,114,111,109,95,110,97,109,101,90,3,101,120,99,114,10, + 0,0,0,114,10,0,0,0,114,11,0,0,0,114,213,0, + 0,0,251,3,0,0,115,44,0,0,0,0,10,8,1,10, + 1,4,1,12,2,4,1,28,2,8,1,14,1,10,1,2, + 255,8,2,10,1,14,1,2,1,14,1,16,4,10,1,16, + 255,2,2,12,1,26,1,114,213,0,0,0,99,1,0,0, + 0,0,0,0,0,0,0,0,0,3,0,0,0,6,0,0, + 0,67,0,0,0,115,146,0,0,0,124,0,160,0,100,1, + 161,1,125,1,124,0,160,0,100,2,161,1,125,2,124,1, + 100,3,107,9,114,82,124,2,100,3,107,9,114,78,124,1, + 124,2,106,1,107,3,114,78,116,2,106,3,100,4,124,1, + 155,2,100,5,124,2,106,1,155,2,100,6,157,5,116,4, + 100,7,100,8,141,3,1,0,124,1,83,0,124,2,100,3, + 107,9,114,96,124,2,106,1,83,0,116,2,106,3,100,9, + 116,4,100,7,100,8,141,3,1,0,124,0,100,10,25,0, + 125,1,100,11,124,0,107,7,114,142,124,1,160,5,100,12, + 161,1,100,13,25,0,125,1,124,1,83,0,41,14,122,167, + 67,97,108,99,117,108,97,116,101,32,119,104,97,116,32,95, + 95,112,97,99,107,97,103,101,95,95,32,115,104,111,117,108, + 100,32,98,101,46,10,10,32,32,32,32,95,95,112,97,99, + 107,97,103,101,95,95,32,105,115,32,110,111,116,32,103,117, + 97,114,97,110,116,101,101,100,32,116,111,32,98,101,32,100, + 101,102,105,110,101,100,32,111,114,32,99,111,117,108,100,32, + 98,101,32,115,101,116,32,116,111,32,78,111,110,101,10,32, + 32,32,32,116,111,32,114,101,112,114,101,115,101,110,116,32, + 116,104,97,116,32,105,116,115,32,112,114,111,112,101,114,32, + 118,97,108,117,101,32,105,115,32,117,110,107,110,111,119,110, + 46,10,10,32,32,32,32,114,144,0,0,0,114,104,0,0, + 0,78,122,32,95,95,112,97,99,107,97,103,101,95,95,32, + 33,61,32,95,95,115,112,101,99,95,95,46,112,97,114,101, + 110,116,32,40,122,4,32,33,61,32,250,1,41,233,3,0, + 0,0,41,1,90,10,115,116,97,99,107,108,101,118,101,108, + 122,89,99,97,110,39,116,32,114,101,115,111,108,118,101,32, + 112,97,99,107,97,103,101,32,102,114,111,109,32,95,95,115, + 112,101,99,95,95,32,111,114,32,95,95,112,97,99,107,97, + 103,101,95,95,44,32,102,97,108,108,105,110,103,32,98,97, + 99,107,32,111,110,32,95,95,110,97,109,101,95,95,32,97, + 110,100,32,95,95,112,97,116,104,95,95,114,1,0,0,0, + 114,140,0,0,0,114,127,0,0,0,114,22,0,0,0,41, + 6,114,34,0,0,0,114,129,0,0,0,114,191,0,0,0, + 114,192,0,0,0,114,193,0,0,0,114,128,0,0,0,41, + 3,218,7,103,108,111,98,97,108,115,114,185,0,0,0,114, + 94,0,0,0,114,10,0,0,0,114,10,0,0,0,114,11, + 0,0,0,218,17,95,99,97,108,99,95,95,95,112,97,99, + 107,97,103,101,95,95,32,4,0,0,115,38,0,0,0,0, + 7,10,1,10,1,8,1,18,1,22,2,2,0,2,254,6, + 3,4,1,8,1,6,2,6,2,2,0,2,254,6,3,8, + 1,8,1,14,1,114,219,0,0,0,114,10,0,0,0,99, + 5,0,0,0,0,0,0,0,0,0,0,0,9,0,0,0, + 5,0,0,0,67,0,0,0,115,180,0,0,0,124,4,100, + 1,107,2,114,18,116,0,124,0,131,1,125,5,110,36,124, + 1,100,2,107,9,114,30,124,1,110,2,105,0,125,6,116, + 1,124,6,131,1,125,7,116,0,124,0,124,7,124,4,131, + 3,125,5,124,3,115,150,124,4,100,1,107,2,114,84,116, + 0,124,0,160,2,100,3,161,1,100,1,25,0,131,1,83, + 0,124,0,115,92,124,5,83,0,116,3,124,0,131,1,116, + 3,124,0,160,2,100,3,161,1,100,1,25,0,131,1,24, + 0,125,8,116,4,106,5,124,5,106,6,100,2,116,3,124, + 5,106,6,131,1,124,8,24,0,133,2,25,0,25,0,83, + 0,110,26,116,7,124,5,100,4,131,2,114,172,116,8,124, + 5,124,3,116,0,131,3,83,0,124,5,83,0,100,2,83, + 0,41,5,97,215,1,0,0,73,109,112,111,114,116,32,97, + 32,109,111,100,117,108,101,46,10,10,32,32,32,32,84,104, + 101,32,39,103,108,111,98,97,108,115,39,32,97,114,103,117, + 109,101,110,116,32,105,115,32,117,115,101,100,32,116,111,32, + 105,110,102,101,114,32,119,104,101,114,101,32,116,104,101,32, + 105,109,112,111,114,116,32,105,115,32,111,99,99,117,114,114, + 105,110,103,32,102,114,111,109,10,32,32,32,32,116,111,32, + 104,97,110,100,108,101,32,114,101,108,97,116,105,118,101,32, + 105,109,112,111,114,116,115,46,32,84,104,101,32,39,108,111, + 99,97,108,115,39,32,97,114,103,117,109,101,110,116,32,105, + 115,32,105,103,110,111,114,101,100,46,32,84,104,101,10,32, + 32,32,32,39,102,114,111,109,108,105,115,116,39,32,97,114, + 103,117,109,101,110,116,32,115,112,101,99,105,102,105,101,115, + 32,119,104,97,116,32,115,104,111,117,108,100,32,101,120,105, + 115,116,32,97,115,32,97,116,116,114,105,98,117,116,101,115, + 32,111,110,32,116,104,101,32,109,111,100,117,108,101,10,32, + 32,32,32,98,101,105,110,103,32,105,109,112,111,114,116,101, + 100,32,40,101,46,103,46,32,96,96,102,114,111,109,32,109, + 111,100,117,108,101,32,105,109,112,111,114,116,32,60,102,114, + 111,109,108,105,115,116,62,96,96,41,46,32,32,84,104,101, + 32,39,108,101,118,101,108,39,10,32,32,32,32,97,114,103, + 117,109,101,110,116,32,114,101,112,114,101,115,101,110,116,115, + 32,116,104,101,32,112,97,99,107,97,103,101,32,108,111,99, + 97,116,105,111,110,32,116,111,32,105,109,112,111,114,116,32, + 102,114,111,109,32,105,110,32,97,32,114,101,108,97,116,105, + 118,101,10,32,32,32,32,105,109,112,111,114,116,32,40,101, + 46,103,46,32,96,96,102,114,111,109,32,46,46,112,107,103, + 32,105,109,112,111,114,116,32,109,111,100,96,96,32,119,111, + 117,108,100,32,104,97,118,101,32,97,32,39,108,101,118,101, + 108,39,32,111,102,32,50,41,46,10,10,32,32,32,32,114, + 22,0,0,0,78,114,127,0,0,0,114,140,0,0,0,41, + 9,114,208,0,0,0,114,219,0,0,0,218,9,112,97,114, + 116,105,116,105,111,110,114,184,0,0,0,114,15,0,0,0, + 114,91,0,0,0,114,1,0,0,0,114,4,0,0,0,114, + 213,0,0,0,41,9,114,17,0,0,0,114,218,0,0,0, + 218,6,108,111,99,97,108,115,114,214,0,0,0,114,186,0, + 0,0,114,95,0,0,0,90,8,103,108,111,98,97,108,115, + 95,114,185,0,0,0,90,7,99,117,116,95,111,102,102,114, + 10,0,0,0,114,10,0,0,0,114,11,0,0,0,218,10, + 95,95,105,109,112,111,114,116,95,95,59,4,0,0,115,30, + 0,0,0,0,11,8,1,10,2,16,1,8,1,12,1,4, + 3,8,1,18,1,4,1,4,4,26,3,32,1,10,1,12, + 2,114,222,0,0,0,99,1,0,0,0,0,0,0,0,0, + 0,0,0,2,0,0,0,3,0,0,0,67,0,0,0,115, + 38,0,0,0,116,0,160,1,124,0,161,1,125,1,124,1, + 100,0,107,8,114,30,116,2,100,1,124,0,23,0,131,1, + 130,1,116,3,124,1,131,1,83,0,41,2,78,122,25,110, + 111,32,98,117,105,108,116,45,105,110,32,109,111,100,117,108, + 101,32,110,97,109,101,100,32,41,4,114,159,0,0,0,114, + 166,0,0,0,114,78,0,0,0,114,158,0,0,0,41,2, + 114,17,0,0,0,114,94,0,0,0,114,10,0,0,0,114, + 10,0,0,0,114,11,0,0,0,218,18,95,98,117,105,108, + 116,105,110,95,102,114,111,109,95,110,97,109,101,96,4,0, + 0,115,8,0,0,0,0,1,10,1,8,1,12,1,114,223, + 0,0,0,99,2,0,0,0,0,0,0,0,0,0,0,0, + 10,0,0,0,5,0,0,0,67,0,0,0,115,166,0,0, + 0,124,1,97,0,124,0,97,1,116,2,116,1,131,1,125, + 2,116,1,106,3,160,4,161,0,68,0,93,72,92,2,125, + 3,125,4,116,5,124,4,124,2,131,2,114,26,124,3,116, + 1,106,6,107,6,114,60,116,7,125,5,110,18,116,0,160, + 8,124,3,161,1,114,26,116,9,125,5,110,2,113,26,116, + 10,124,4,124,5,131,2,125,6,116,11,124,6,124,4,131, + 2,1,0,113,26,116,1,106,3,116,12,25,0,125,7,100, + 1,68,0,93,46,125,8,124,8,116,1,106,3,107,7,114, + 138,116,13,124,8,131,1,125,9,110,10,116,1,106,3,124, + 8,25,0,125,9,116,14,124,7,124,8,124,9,131,3,1, + 0,113,114,100,2,83,0,41,3,122,250,83,101,116,117,112, + 32,105,109,112,111,114,116,108,105,98,32,98,121,32,105,109, + 112,111,114,116,105,110,103,32,110,101,101,100,101,100,32,98, + 117,105,108,116,45,105,110,32,109,111,100,117,108,101,115,32, + 97,110,100,32,105,110,106,101,99,116,105,110,103,32,116,104, + 101,109,10,32,32,32,32,105,110,116,111,32,116,104,101,32, + 103,108,111,98,97,108,32,110,97,109,101,115,112,97,99,101, + 46,10,10,32,32,32,32,65,115,32,115,121,115,32,105,115, + 32,110,101,101,100,101,100,32,102,111,114,32,115,121,115,46, + 109,111,100,117,108,101,115,32,97,99,99,101,115,115,32,97, + 110,100,32,95,105,109,112,32,105,115,32,110,101,101,100,101, + 100,32,116,111,32,108,111,97,100,32,98,117,105,108,116,45, + 105,110,10,32,32,32,32,109,111,100,117,108,101,115,44,32, + 116,104,111,115,101,32,116,119,111,32,109,111,100,117,108,101, + 115,32,109,117,115,116,32,98,101,32,101,120,112,108,105,99, + 105,116,108,121,32,112,97,115,115,101,100,32,105,110,46,10, + 10,32,32,32,32,41,3,114,23,0,0,0,114,191,0,0, + 0,114,63,0,0,0,78,41,15,114,56,0,0,0,114,15, + 0,0,0,114,14,0,0,0,114,91,0,0,0,218,5,105, + 116,101,109,115,114,195,0,0,0,114,77,0,0,0,114,159, + 0,0,0,114,87,0,0,0,114,173,0,0,0,114,141,0, + 0,0,114,147,0,0,0,114,1,0,0,0,114,223,0,0, + 0,114,5,0,0,0,41,10,218,10,115,121,115,95,109,111, + 100,117,108,101,218,11,95,105,109,112,95,109,111,100,117,108, + 101,90,11,109,111,100,117,108,101,95,116,121,112,101,114,17, + 0,0,0,114,95,0,0,0,114,108,0,0,0,114,94,0, + 0,0,90,11,115,101,108,102,95,109,111,100,117,108,101,90, + 12,98,117,105,108,116,105,110,95,110,97,109,101,90,14,98, + 117,105,108,116,105,110,95,109,111,100,117,108,101,114,10,0, + 0,0,114,10,0,0,0,114,11,0,0,0,218,6,95,115, + 101,116,117,112,103,4,0,0,115,36,0,0,0,0,9,4, + 1,4,3,8,1,18,1,10,1,10,1,6,1,10,1,6, + 2,2,1,10,1,12,3,10,1,8,1,10,1,10,2,10, + 1,114,227,0,0,0,99,2,0,0,0,0,0,0,0,0, + 0,0,0,2,0,0,0,3,0,0,0,67,0,0,0,115, + 38,0,0,0,116,0,124,0,124,1,131,2,1,0,116,1, + 106,2,160,3,116,4,161,1,1,0,116,1,106,2,160,3, + 116,5,161,1,1,0,100,1,83,0,41,2,122,48,73,110, 115,116,97,108,108,32,105,109,112,111,114,116,101,114,115,32, - 116,104,97,116,32,114,101,113,117,105,114,101,32,101,120,116, - 101,114,110,97,108,32,102,105,108,101,115,121,115,116,101,109, - 32,97,99,99,101,115,115,114,22,0,0,0,78,41,6,218, - 26,95,102,114,111,122,101,110,95,105,109,112,111,114,116,108, - 105,98,95,101,120,116,101,114,110,97,108,114,125,0,0,0, - 114,228,0,0,0,114,15,0,0,0,114,91,0,0,0,114, - 1,0,0,0,41,1,114,229,0,0,0,114,10,0,0,0, - 114,10,0,0,0,114,11,0,0,0,218,27,95,105,110,115, - 116,97,108,108,95,101,120,116,101,114,110,97,108,95,105,109, - 112,111,114,116,101,114,115,146,4,0,0,115,6,0,0,0, - 0,3,8,1,4,1,114,230,0,0,0,41,2,78,78,41, - 1,78,41,2,78,114,22,0,0,0,41,4,78,78,114,10, - 0,0,0,114,22,0,0,0,41,50,114,3,0,0,0,114, - 125,0,0,0,114,12,0,0,0,114,18,0,0,0,114,59, - 0,0,0,114,33,0,0,0,114,42,0,0,0,114,19,0, - 0,0,114,20,0,0,0,114,48,0,0,0,114,49,0,0, - 0,114,52,0,0,0,114,64,0,0,0,114,66,0,0,0, - 114,75,0,0,0,114,85,0,0,0,114,89,0,0,0,114, - 96,0,0,0,114,110,0,0,0,114,111,0,0,0,114,90, - 0,0,0,114,141,0,0,0,114,147,0,0,0,114,151,0, - 0,0,114,106,0,0,0,114,92,0,0,0,114,157,0,0, - 0,114,158,0,0,0,114,93,0,0,0,114,159,0,0,0, - 114,173,0,0,0,114,178,0,0,0,114,187,0,0,0,114, - 189,0,0,0,114,194,0,0,0,114,200,0,0,0,90,15, - 95,69,82,82,95,77,83,71,95,80,82,69,70,73,88,114, - 202,0,0,0,114,205,0,0,0,218,6,111,98,106,101,99, - 116,114,206,0,0,0,114,207,0,0,0,114,208,0,0,0, - 114,213,0,0,0,114,219,0,0,0,114,222,0,0,0,114, - 223,0,0,0,114,227,0,0,0,114,228,0,0,0,114,230, - 0,0,0,114,10,0,0,0,114,10,0,0,0,114,10,0, - 0,0,114,11,0,0,0,218,8,60,109,111,100,117,108,101, - 62,1,0,0,0,115,94,0,0,0,4,24,4,2,8,8, - 8,8,4,2,4,3,16,4,14,68,14,21,14,16,8,37, - 8,17,8,11,14,8,8,11,8,12,8,16,8,36,14,101, - 16,26,10,45,14,72,8,17,8,17,8,30,8,37,8,42, - 8,15,14,75,14,79,14,13,8,9,8,9,10,47,8,16, - 4,1,8,2,8,27,6,3,8,16,10,15,14,37,8,27, - 10,37,8,7,8,35,8,8, + 102,111,114,32,98,117,105,108,116,105,110,32,97,110,100,32, + 102,114,111,122,101,110,32,109,111,100,117,108,101,115,78,41, + 6,114,227,0,0,0,114,15,0,0,0,114,190,0,0,0, + 114,118,0,0,0,114,159,0,0,0,114,173,0,0,0,41, + 2,114,225,0,0,0,114,226,0,0,0,114,10,0,0,0, + 114,10,0,0,0,114,11,0,0,0,218,8,95,105,110,115, + 116,97,108,108,138,4,0,0,115,6,0,0,0,0,2,10, + 2,12,1,114,228,0,0,0,99,0,0,0,0,0,0,0, + 0,0,0,0,0,1,0,0,0,4,0,0,0,67,0,0, + 0,115,32,0,0,0,100,1,100,2,108,0,125,0,124,0, + 97,1,124,0,160,2,116,3,106,4,116,5,25,0,161,1, + 1,0,100,2,83,0,41,3,122,57,73,110,115,116,97,108, + 108,32,105,109,112,111,114,116,101,114,115,32,116,104,97,116, + 32,114,101,113,117,105,114,101,32,101,120,116,101,114,110,97, + 108,32,102,105,108,101,115,121,115,116,101,109,32,97,99,99, + 101,115,115,114,22,0,0,0,78,41,6,218,26,95,102,114, + 111,122,101,110,95,105,109,112,111,114,116,108,105,98,95,101, + 120,116,101,114,110,97,108,114,125,0,0,0,114,228,0,0, + 0,114,15,0,0,0,114,91,0,0,0,114,1,0,0,0, + 41,1,114,229,0,0,0,114,10,0,0,0,114,10,0,0, + 0,114,11,0,0,0,218,27,95,105,110,115,116,97,108,108, + 95,101,120,116,101,114,110,97,108,95,105,109,112,111,114,116, + 101,114,115,146,4,0,0,115,6,0,0,0,0,3,8,1, + 4,1,114,230,0,0,0,41,2,78,78,41,1,78,41,2, + 78,114,22,0,0,0,41,4,78,78,114,10,0,0,0,114, + 22,0,0,0,41,50,114,3,0,0,0,114,125,0,0,0, + 114,12,0,0,0,114,18,0,0,0,114,58,0,0,0,114, + 33,0,0,0,114,42,0,0,0,114,19,0,0,0,114,20, + 0,0,0,114,48,0,0,0,114,49,0,0,0,114,52,0, + 0,0,114,64,0,0,0,114,66,0,0,0,114,75,0,0, + 0,114,85,0,0,0,114,89,0,0,0,114,96,0,0,0, + 114,110,0,0,0,114,111,0,0,0,114,90,0,0,0,114, + 141,0,0,0,114,147,0,0,0,114,151,0,0,0,114,106, + 0,0,0,114,92,0,0,0,114,157,0,0,0,114,158,0, + 0,0,114,93,0,0,0,114,159,0,0,0,114,173,0,0, + 0,114,178,0,0,0,114,187,0,0,0,114,189,0,0,0, + 114,194,0,0,0,114,200,0,0,0,90,15,95,69,82,82, + 95,77,83,71,95,80,82,69,70,73,88,114,202,0,0,0, + 114,205,0,0,0,218,6,111,98,106,101,99,116,114,206,0, + 0,0,114,207,0,0,0,114,208,0,0,0,114,213,0,0, + 0,114,219,0,0,0,114,222,0,0,0,114,223,0,0,0, + 114,227,0,0,0,114,228,0,0,0,114,230,0,0,0,114, + 10,0,0,0,114,10,0,0,0,114,10,0,0,0,114,11, + 0,0,0,218,8,60,109,111,100,117,108,101,62,1,0,0, + 0,115,94,0,0,0,4,24,4,2,8,8,8,8,4,2, + 4,3,16,4,14,68,14,21,14,16,8,37,8,17,8,11, + 14,8,8,11,8,12,8,16,8,36,14,101,16,26,10,45, + 14,72,8,17,8,17,8,30,8,37,8,42,8,15,14,75, + 14,79,14,13,8,9,8,9,10,47,8,16,4,1,8,2, + 8,27,6,3,8,16,10,15,14,37,8,27,10,37,8,7, + 8,35,8,8, }; diff --git a/Python/importlib_external.h b/Python/importlib_external.h index 054fc846845..8c1fa3cac8f 100644 --- a/Python/importlib_external.h +++ b/Python/importlib_external.h @@ -191,7 +191,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 2,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0, 8,0,0,0,67,0,0,0,115,50,0,0,0,122,12,116, 0,124,0,131,1,125,2,87,0,110,22,4,0,116,1,107, - 10,114,34,1,0,1,0,1,0,89,0,100,1,83,0,88, + 10,114,34,1,0,1,0,1,0,89,0,100,1,83,0,48, 0,124,2,106,2,100,2,64,0,124,1,107,2,83,0,41, 3,122,49,84,101,115,116,32,119,104,101,116,104,101,114,32, 116,104,101,32,112,97,116,104,32,105,115,32,116,104,101,32, @@ -242,2491 +242,2496 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = { 112,97,116,104,95,105,115,97,98,115,111,0,0,0,115,2, 0,0,0,0,6,114,58,0,0,0,233,182,1,0,0,99, 3,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0, - 11,0,0,0,67,0,0,0,115,162,0,0,0,100,1,160, + 11,0,0,0,67,0,0,0,115,182,0,0,0,100,1,160, 0,124,0,116,1,124,0,131,1,161,2,125,3,116,2,160, 3,124,3,116,2,106,4,116,2,106,5,66,0,116,2,106, - 6,66,0,124,2,100,2,64,0,161,3,125,4,122,50,116, - 7,160,8,124,4,100,3,161,2,143,16,125,5,124,5,160, - 9,124,1,161,1,1,0,87,0,53,0,81,0,82,0,88, - 0,116,2,160,10,124,3,124,0,161,2,1,0,87,0,110, - 58,4,0,116,11,107,10,114,156,1,0,1,0,1,0,122, - 14,116,2,160,12,124,3,161,1,1,0,87,0,110,20,4, - 0,116,11,107,10,114,148,1,0,1,0,1,0,89,0,110, - 2,88,0,130,0,89,0,110,2,88,0,100,4,83,0,41, - 5,122,162,66,101,115,116,45,101,102,102,111,114,116,32,102, - 117,110,99,116,105,111,110,32,116,111,32,119,114,105,116,101, - 32,100,97,116,97,32,116,111,32,97,32,112,97,116,104,32, - 97,116,111,109,105,99,97,108,108,121,46,10,32,32,32,32, - 66,101,32,112,114,101,112,97,114,101,100,32,116,111,32,104, - 97,110,100,108,101,32,97,32,70,105,108,101,69,120,105,115, - 116,115,69,114,114,111,114,32,105,102,32,99,111,110,99,117, - 114,114,101,110,116,32,119,114,105,116,105,110,103,32,111,102, - 32,116,104,101,10,32,32,32,32,116,101,109,112,111,114,97, - 114,121,32,102,105,108,101,32,105,115,32,97,116,116,101,109, - 112,116,101,100,46,250,5,123,125,46,123,125,114,59,0,0, - 0,90,2,119,98,78,41,13,218,6,102,111,114,109,97,116, - 218,2,105,100,114,2,0,0,0,90,4,111,112,101,110,90, - 6,79,95,69,88,67,76,90,7,79,95,67,82,69,65,84, - 90,8,79,95,87,82,79,78,76,89,218,3,95,105,111,218, - 6,70,105,108,101,73,79,218,5,119,114,105,116,101,218,7, - 114,101,112,108,97,99,101,114,49,0,0,0,90,6,117,110, - 108,105,110,107,41,6,114,43,0,0,0,114,25,0,0,0, - 114,51,0,0,0,90,8,112,97,116,104,95,116,109,112,90, - 2,102,100,218,4,102,105,108,101,114,3,0,0,0,114,3, - 0,0,0,114,6,0,0,0,218,13,95,119,114,105,116,101, - 95,97,116,111,109,105,99,120,0,0,0,115,30,0,0,0, - 0,5,16,1,6,1,16,0,6,255,4,2,2,3,14,1, - 20,1,16,1,14,1,2,1,14,1,14,1,6,1,114,68, - 0,0,0,105,92,13,0,0,114,27,0,0,0,114,16,0, - 0,0,115,2,0,0,0,13,10,90,11,95,95,112,121,99, - 97,99,104,101,95,95,122,4,111,112,116,45,122,3,46,112, - 121,122,4,46,112,121,99,78,41,1,218,12,111,112,116,105, - 109,105,122,97,116,105,111,110,99,2,0,0,0,0,0,0, - 0,1,0,0,0,12,0,0,0,5,0,0,0,67,0,0, - 0,115,88,1,0,0,124,1,100,1,107,9,114,52,116,0, - 160,1,100,2,116,2,161,2,1,0,124,2,100,1,107,9, - 114,40,100,3,125,3,116,3,124,3,131,1,130,1,124,1, - 114,48,100,4,110,2,100,5,125,2,116,4,160,5,124,0, - 161,1,125,0,116,6,124,0,131,1,92,2,125,4,125,5, - 124,5,160,7,100,6,161,1,92,3,125,6,125,7,125,8, - 116,8,106,9,106,10,125,9,124,9,100,1,107,8,114,114, - 116,11,100,7,131,1,130,1,100,4,160,12,124,6,114,126, - 124,6,110,2,124,8,124,7,124,9,103,3,161,1,125,10, - 124,2,100,1,107,8,114,172,116,8,106,13,106,14,100,8, - 107,2,114,164,100,4,125,2,110,8,116,8,106,13,106,14, - 125,2,116,15,124,2,131,1,125,2,124,2,100,4,107,3, - 114,224,124,2,160,16,161,0,115,210,116,17,100,9,160,18, - 124,2,161,1,131,1,130,1,100,10,160,18,124,10,116,19, - 124,2,161,3,125,10,124,10,116,20,100,8,25,0,23,0, - 125,11,116,8,106,21,100,1,107,9,144,1,114,76,116,22, - 124,4,131,1,144,1,115,16,116,23,116,4,160,24,161,0, - 124,4,131,2,125,4,124,4,100,5,25,0,100,11,107,2, - 144,1,114,56,124,4,100,8,25,0,116,25,107,7,144,1, - 114,56,124,4,100,12,100,1,133,2,25,0,125,4,116,23, - 116,8,106,21,124,4,160,26,116,25,161,1,124,11,131,3, - 83,0,116,23,124,4,116,27,124,11,131,3,83,0,41,13, - 97,254,2,0,0,71,105,118,101,110,32,116,104,101,32,112, - 97,116,104,32,116,111,32,97,32,46,112,121,32,102,105,108, - 101,44,32,114,101,116,117,114,110,32,116,104,101,32,112,97, - 116,104,32,116,111,32,105,116,115,32,46,112,121,99,32,102, - 105,108,101,46,10,10,32,32,32,32,84,104,101,32,46,112, - 121,32,102,105,108,101,32,100,111,101,115,32,110,111,116,32, - 110,101,101,100,32,116,111,32,101,120,105,115,116,59,32,116, - 104,105,115,32,115,105,109,112,108,121,32,114,101,116,117,114, - 110,115,32,116,104,101,32,112,97,116,104,32,116,111,32,116, - 104,101,10,32,32,32,32,46,112,121,99,32,102,105,108,101, - 32,99,97,108,99,117,108,97,116,101,100,32,97,115,32,105, - 102,32,116,104,101,32,46,112,121,32,102,105,108,101,32,119, - 101,114,101,32,105,109,112,111,114,116,101,100,46,10,10,32, - 32,32,32,84,104,101,32,39,111,112,116,105,109,105,122,97, - 116,105,111,110,39,32,112,97,114,97,109,101,116,101,114,32, - 99,111,110,116,114,111,108,115,32,116,104,101,32,112,114,101, - 115,117,109,101,100,32,111,112,116,105,109,105,122,97,116,105, - 111,110,32,108,101,118,101,108,32,111,102,10,32,32,32,32, - 116,104,101,32,98,121,116,101,99,111,100,101,32,102,105,108, - 101,46,32,73,102,32,39,111,112,116,105,109,105,122,97,116, - 105,111,110,39,32,105,115,32,110,111,116,32,78,111,110,101, - 44,32,116,104,101,32,115,116,114,105,110,103,32,114,101,112, - 114,101,115,101,110,116,97,116,105,111,110,10,32,32,32,32, - 111,102,32,116,104,101,32,97,114,103,117,109,101,110,116,32, - 105,115,32,116,97,107,101,110,32,97,110,100,32,118,101,114, - 105,102,105,101,100,32,116,111,32,98,101,32,97,108,112,104, - 97,110,117,109,101,114,105,99,32,40,101,108,115,101,32,86, - 97,108,117,101,69,114,114,111,114,10,32,32,32,32,105,115, - 32,114,97,105,115,101,100,41,46,10,10,32,32,32,32,84, - 104,101,32,100,101,98,117,103,95,111,118,101,114,114,105,100, - 101,32,112,97,114,97,109,101,116,101,114,32,105,115,32,100, - 101,112,114,101,99,97,116,101,100,46,32,73,102,32,100,101, - 98,117,103,95,111,118,101,114,114,105,100,101,32,105,115,32, - 110,111,116,32,78,111,110,101,44,10,32,32,32,32,97,32, - 84,114,117,101,32,118,97,108,117,101,32,105,115,32,116,104, - 101,32,115,97,109,101,32,97,115,32,115,101,116,116,105,110, - 103,32,39,111,112,116,105,109,105,122,97,116,105,111,110,39, - 32,116,111,32,116,104,101,32,101,109,112,116,121,32,115,116, - 114,105,110,103,10,32,32,32,32,119,104,105,108,101,32,97, - 32,70,97,108,115,101,32,118,97,108,117,101,32,105,115,32, - 101,113,117,105,118,97,108,101,110,116,32,116,111,32,115,101, + 6,66,0,124,2,100,2,64,0,161,3,125,4,122,70,116, + 7,160,8,124,4,100,3,161,2,143,26,125,5,124,5,160, + 9,124,1,161,1,1,0,87,0,100,4,4,0,4,0,131, + 3,1,0,110,16,49,0,115,94,48,0,1,0,1,0,1, + 0,89,0,1,0,116,2,160,10,124,3,124,0,161,2,1, + 0,87,0,110,58,4,0,116,11,107,10,114,176,1,0,1, + 0,1,0,122,14,116,2,160,12,124,3,161,1,1,0,87, + 0,110,20,4,0,116,11,107,10,114,168,1,0,1,0,1, + 0,89,0,110,2,48,0,130,0,89,0,110,2,48,0,100, + 4,83,0,41,5,122,162,66,101,115,116,45,101,102,102,111, + 114,116,32,102,117,110,99,116,105,111,110,32,116,111,32,119, + 114,105,116,101,32,100,97,116,97,32,116,111,32,97,32,112, + 97,116,104,32,97,116,111,109,105,99,97,108,108,121,46,10, + 32,32,32,32,66,101,32,112,114,101,112,97,114,101,100,32, + 116,111,32,104,97,110,100,108,101,32,97,32,70,105,108,101, + 69,120,105,115,116,115,69,114,114,111,114,32,105,102,32,99, + 111,110,99,117,114,114,101,110,116,32,119,114,105,116,105,110, + 103,32,111,102,32,116,104,101,10,32,32,32,32,116,101,109, + 112,111,114,97,114,121,32,102,105,108,101,32,105,115,32,97, + 116,116,101,109,112,116,101,100,46,250,5,123,125,46,123,125, + 114,59,0,0,0,90,2,119,98,78,41,13,218,6,102,111, + 114,109,97,116,218,2,105,100,114,2,0,0,0,90,4,111, + 112,101,110,90,6,79,95,69,88,67,76,90,7,79,95,67, + 82,69,65,84,90,8,79,95,87,82,79,78,76,89,218,3, + 95,105,111,218,6,70,105,108,101,73,79,218,5,119,114,105, + 116,101,218,7,114,101,112,108,97,99,101,114,49,0,0,0, + 90,6,117,110,108,105,110,107,41,6,114,43,0,0,0,114, + 25,0,0,0,114,51,0,0,0,90,8,112,97,116,104,95, + 116,109,112,90,2,102,100,218,4,102,105,108,101,114,3,0, + 0,0,114,3,0,0,0,114,6,0,0,0,218,13,95,119, + 114,105,116,101,95,97,116,111,109,105,99,120,0,0,0,115, + 30,0,0,0,0,5,16,1,6,1,16,0,6,255,4,2, + 2,3,14,1,40,1,16,1,14,1,2,1,14,1,14,1, + 6,1,114,68,0,0,0,105,94,13,0,0,114,27,0,0, + 0,114,16,0,0,0,115,2,0,0,0,13,10,90,11,95, + 95,112,121,99,97,99,104,101,95,95,122,4,111,112,116,45, + 122,3,46,112,121,122,4,46,112,121,99,78,41,1,218,12, + 111,112,116,105,109,105,122,97,116,105,111,110,99,2,0,0, + 0,0,0,0,0,1,0,0,0,12,0,0,0,5,0,0, + 0,67,0,0,0,115,88,1,0,0,124,1,100,1,107,9, + 114,52,116,0,160,1,100,2,116,2,161,2,1,0,124,2, + 100,1,107,9,114,40,100,3,125,3,116,3,124,3,131,1, + 130,1,124,1,114,48,100,4,110,2,100,5,125,2,116,4, + 160,5,124,0,161,1,125,0,116,6,124,0,131,1,92,2, + 125,4,125,5,124,5,160,7,100,6,161,1,92,3,125,6, + 125,7,125,8,116,8,106,9,106,10,125,9,124,9,100,1, + 107,8,114,114,116,11,100,7,131,1,130,1,100,4,160,12, + 124,6,114,126,124,6,110,2,124,8,124,7,124,9,103,3, + 161,1,125,10,124,2,100,1,107,8,114,172,116,8,106,13, + 106,14,100,8,107,2,114,164,100,4,125,2,110,8,116,8, + 106,13,106,14,125,2,116,15,124,2,131,1,125,2,124,2, + 100,4,107,3,114,224,124,2,160,16,161,0,115,210,116,17, + 100,9,160,18,124,2,161,1,131,1,130,1,100,10,160,18, + 124,10,116,19,124,2,161,3,125,10,124,10,116,20,100,8, + 25,0,23,0,125,11,116,8,106,21,100,1,107,9,144,1, + 114,76,116,22,124,4,131,1,144,1,115,16,116,23,116,4, + 160,24,161,0,124,4,131,2,125,4,124,4,100,5,25,0, + 100,11,107,2,144,1,114,56,124,4,100,8,25,0,116,25, + 107,7,144,1,114,56,124,4,100,12,100,1,133,2,25,0, + 125,4,116,23,116,8,106,21,124,4,160,26,116,25,161,1, + 124,11,131,3,83,0,116,23,124,4,116,27,124,11,131,3, + 83,0,41,13,97,254,2,0,0,71,105,118,101,110,32,116, + 104,101,32,112,97,116,104,32,116,111,32,97,32,46,112,121, + 32,102,105,108,101,44,32,114,101,116,117,114,110,32,116,104, + 101,32,112,97,116,104,32,116,111,32,105,116,115,32,46,112, + 121,99,32,102,105,108,101,46,10,10,32,32,32,32,84,104, + 101,32,46,112,121,32,102,105,108,101,32,100,111,101,115,32, + 110,111,116,32,110,101,101,100,32,116,111,32,101,120,105,115, + 116,59,32,116,104,105,115,32,115,105,109,112,108,121,32,114, + 101,116,117,114,110,115,32,116,104,101,32,112,97,116,104,32, + 116,111,32,116,104,101,10,32,32,32,32,46,112,121,99,32, + 102,105,108,101,32,99,97,108,99,117,108,97,116,101,100,32, + 97,115,32,105,102,32,116,104,101,32,46,112,121,32,102,105, + 108,101,32,119,101,114,101,32,105,109,112,111,114,116,101,100, + 46,10,10,32,32,32,32,84,104,101,32,39,111,112,116,105, + 109,105,122,97,116,105,111,110,39,32,112,97,114,97,109,101, + 116,101,114,32,99,111,110,116,114,111,108,115,32,116,104,101, + 32,112,114,101,115,117,109,101,100,32,111,112,116,105,109,105, + 122,97,116,105,111,110,32,108,101,118,101,108,32,111,102,10, + 32,32,32,32,116,104,101,32,98,121,116,101,99,111,100,101, + 32,102,105,108,101,46,32,73,102,32,39,111,112,116,105,109, + 105,122,97,116,105,111,110,39,32,105,115,32,110,111,116,32, + 78,111,110,101,44,32,116,104,101,32,115,116,114,105,110,103, + 32,114,101,112,114,101,115,101,110,116,97,116,105,111,110,10, + 32,32,32,32,111,102,32,116,104,101,32,97,114,103,117,109, + 101,110,116,32,105,115,32,116,97,107,101,110,32,97,110,100, + 32,118,101,114,105,102,105,101,100,32,116,111,32,98,101,32, + 97,108,112,104,97,110,117,109,101,114,105,99,32,40,101,108, + 115,101,32,86,97,108,117,101,69,114,114,111,114,10,32,32, + 32,32,105,115,32,114,97,105,115,101,100,41,46,10,10,32, + 32,32,32,84,104,101,32,100,101,98,117,103,95,111,118,101, + 114,114,105,100,101,32,112,97,114,97,109,101,116,101,114,32, + 105,115,32,100,101,112,114,101,99,97,116,101,100,46,32,73, + 102,32,100,101,98,117,103,95,111,118,101,114,114,105,100,101, + 32,105,115,32,110,111,116,32,78,111,110,101,44,10,32,32, + 32,32,97,32,84,114,117,101,32,118,97,108,117,101,32,105, + 115,32,116,104,101,32,115,97,109,101,32,97,115,32,115,101, 116,116,105,110,103,32,39,111,112,116,105,109,105,122,97,116, - 105,111,110,39,32,116,111,32,39,49,39,46,10,10,32,32, - 32,32,73,102,32,115,121,115,46,105,109,112,108,101,109,101, + 105,111,110,39,32,116,111,32,116,104,101,32,101,109,112,116, + 121,32,115,116,114,105,110,103,10,32,32,32,32,119,104,105, + 108,101,32,97,32,70,97,108,115,101,32,118,97,108,117,101, + 32,105,115,32,101,113,117,105,118,97,108,101,110,116,32,116, + 111,32,115,101,116,116,105,110,103,32,39,111,112,116,105,109, + 105,122,97,116,105,111,110,39,32,116,111,32,39,49,39,46, + 10,10,32,32,32,32,73,102,32,115,121,115,46,105,109,112, + 108,101,109,101,110,116,97,116,105,111,110,46,99,97,99,104, + 101,95,116,97,103,32,105,115,32,78,111,110,101,32,116,104, + 101,110,32,78,111,116,73,109,112,108,101,109,101,110,116,101, + 100,69,114,114,111,114,32,105,115,32,114,97,105,115,101,100, + 46,10,10,32,32,32,32,78,122,70,116,104,101,32,100,101, + 98,117,103,95,111,118,101,114,114,105,100,101,32,112,97,114, + 97,109,101,116,101,114,32,105,115,32,100,101,112,114,101,99, + 97,116,101,100,59,32,117,115,101,32,39,111,112,116,105,109, + 105,122,97,116,105,111,110,39,32,105,110,115,116,101,97,100, + 122,50,100,101,98,117,103,95,111,118,101,114,114,105,100,101, + 32,111,114,32,111,112,116,105,109,105,122,97,116,105,111,110, + 32,109,117,115,116,32,98,101,32,115,101,116,32,116,111,32, + 78,111,110,101,114,39,0,0,0,114,38,0,0,0,218,1, + 46,250,36,115,121,115,46,105,109,112,108,101,109,101,110,116, + 97,116,105,111,110,46,99,97,99,104,101,95,116,97,103,32, + 105,115,32,78,111,110,101,233,0,0,0,0,122,24,123,33, + 114,125,32,105,115,32,110,111,116,32,97,108,112,104,97,110, + 117,109,101,114,105,99,122,7,123,125,46,123,125,123,125,250, + 1,58,114,27,0,0,0,41,28,218,9,95,119,97,114,110, + 105,110,103,115,218,4,119,97,114,110,218,18,68,101,112,114, + 101,99,97,116,105,111,110,87,97,114,110,105,110,103,218,9, + 84,121,112,101,69,114,114,111,114,114,2,0,0,0,218,6, + 102,115,112,97,116,104,114,46,0,0,0,114,40,0,0,0, + 114,8,0,0,0,218,14,105,109,112,108,101,109,101,110,116, + 97,116,105,111,110,218,9,99,97,99,104,101,95,116,97,103, + 218,19,78,111,116,73,109,112,108,101,109,101,110,116,101,100, + 69,114,114,111,114,114,35,0,0,0,218,5,102,108,97,103, + 115,218,8,111,112,116,105,109,105,122,101,218,3,115,116,114, + 218,7,105,115,97,108,110,117,109,218,10,86,97,108,117,101, + 69,114,114,111,114,114,61,0,0,0,218,4,95,79,80,84, + 218,17,66,89,84,69,67,79,68,69,95,83,85,70,70,73, + 88,69,83,218,14,112,121,99,97,99,104,101,95,112,114,101, + 102,105,120,114,58,0,0,0,114,37,0,0,0,114,54,0, + 0,0,114,30,0,0,0,218,6,108,115,116,114,105,112,218, + 8,95,80,89,67,65,67,72,69,41,12,114,43,0,0,0, + 90,14,100,101,98,117,103,95,111,118,101,114,114,105,100,101, + 114,69,0,0,0,218,7,109,101,115,115,97,103,101,218,4, + 104,101,97,100,114,45,0,0,0,90,4,98,97,115,101,218, + 3,115,101,112,218,4,114,101,115,116,90,3,116,97,103,90, + 15,97,108,109,111,115,116,95,102,105,108,101,110,97,109,101, + 218,8,102,105,108,101,110,97,109,101,114,3,0,0,0,114, + 3,0,0,0,114,6,0,0,0,218,17,99,97,99,104,101, + 95,102,114,111,109,95,115,111,117,114,99,101,41,1,0,0, + 115,72,0,0,0,0,18,8,1,6,1,2,255,4,2,8, + 1,4,1,8,1,12,1,10,1,12,1,16,1,8,1,8, + 1,8,1,24,1,8,1,12,1,6,2,8,1,8,1,8, + 1,8,1,14,1,14,1,12,1,12,9,10,1,14,5,28, + 1,12,4,2,1,4,1,8,1,2,253,4,5,114,97,0, + 0,0,99,1,0,0,0,0,0,0,0,0,0,0,0,10, + 0,0,0,5,0,0,0,67,0,0,0,115,46,1,0,0, + 116,0,106,1,106,2,100,1,107,8,114,20,116,3,100,2, + 131,1,130,1,116,4,160,5,124,0,161,1,125,0,116,6, + 124,0,131,1,92,2,125,1,125,2,100,3,125,3,116,0, + 106,7,100,1,107,9,114,102,116,0,106,7,160,8,116,9, + 161,1,125,4,124,1,160,10,124,4,116,11,23,0,161,1, + 114,102,124,1,116,12,124,4,131,1,100,1,133,2,25,0, + 125,1,100,4,125,3,124,3,115,144,116,6,124,1,131,1, + 92,2,125,1,125,5,124,5,116,13,107,3,114,144,116,14, + 116,13,155,0,100,5,124,0,155,2,157,3,131,1,130,1, + 124,2,160,15,100,6,161,1,125,6,124,6,100,7,107,7, + 114,178,116,14,100,8,124,2,155,2,157,2,131,1,130,1, + 110,92,124,6,100,9,107,2,144,1,114,14,124,2,160,16, + 100,6,100,10,161,2,100,11,25,0,125,7,124,7,160,10, + 116,17,161,1,115,228,116,14,100,12,116,17,155,2,157,2, + 131,1,130,1,124,7,116,12,116,17,131,1,100,1,133,2, + 25,0,125,8,124,8,160,18,161,0,144,1,115,14,116,14, + 100,13,124,7,155,2,100,14,157,3,131,1,130,1,124,2, + 160,19,100,6,161,1,100,15,25,0,125,9,116,20,124,1, + 124,9,116,21,100,15,25,0,23,0,131,2,83,0,41,16, + 97,110,1,0,0,71,105,118,101,110,32,116,104,101,32,112, + 97,116,104,32,116,111,32,97,32,46,112,121,99,46,32,102, + 105,108,101,44,32,114,101,116,117,114,110,32,116,104,101,32, + 112,97,116,104,32,116,111,32,105,116,115,32,46,112,121,32, + 102,105,108,101,46,10,10,32,32,32,32,84,104,101,32,46, + 112,121,99,32,102,105,108,101,32,100,111,101,115,32,110,111, + 116,32,110,101,101,100,32,116,111,32,101,120,105,115,116,59, + 32,116,104,105,115,32,115,105,109,112,108,121,32,114,101,116, + 117,114,110,115,32,116,104,101,32,112,97,116,104,32,116,111, + 10,32,32,32,32,116,104,101,32,46,112,121,32,102,105,108, + 101,32,99,97,108,99,117,108,97,116,101,100,32,116,111,32, + 99,111,114,114,101,115,112,111,110,100,32,116,111,32,116,104, + 101,32,46,112,121,99,32,102,105,108,101,46,32,32,73,102, + 32,112,97,116,104,32,100,111,101,115,10,32,32,32,32,110, + 111,116,32,99,111,110,102,111,114,109,32,116,111,32,80,69, + 80,32,51,49,52,55,47,52,56,56,32,102,111,114,109,97, + 116,44,32,86,97,108,117,101,69,114,114,111,114,32,119,105, + 108,108,32,98,101,32,114,97,105,115,101,100,46,32,73,102, + 10,32,32,32,32,115,121,115,46,105,109,112,108,101,109,101, 110,116,97,116,105,111,110,46,99,97,99,104,101,95,116,97, 103,32,105,115,32,78,111,110,101,32,116,104,101,110,32,78, 111,116,73,109,112,108,101,109,101,110,116,101,100,69,114,114, 111,114,32,105,115,32,114,97,105,115,101,100,46,10,10,32, - 32,32,32,78,122,70,116,104,101,32,100,101,98,117,103,95, - 111,118,101,114,114,105,100,101,32,112,97,114,97,109,101,116, - 101,114,32,105,115,32,100,101,112,114,101,99,97,116,101,100, - 59,32,117,115,101,32,39,111,112,116,105,109,105,122,97,116, - 105,111,110,39,32,105,110,115,116,101,97,100,122,50,100,101, - 98,117,103,95,111,118,101,114,114,105,100,101,32,111,114,32, - 111,112,116,105,109,105,122,97,116,105,111,110,32,109,117,115, - 116,32,98,101,32,115,101,116,32,116,111,32,78,111,110,101, - 114,39,0,0,0,114,38,0,0,0,218,1,46,250,36,115, - 121,115,46,105,109,112,108,101,109,101,110,116,97,116,105,111, - 110,46,99,97,99,104,101,95,116,97,103,32,105,115,32,78, - 111,110,101,233,0,0,0,0,122,24,123,33,114,125,32,105, - 115,32,110,111,116,32,97,108,112,104,97,110,117,109,101,114, - 105,99,122,7,123,125,46,123,125,123,125,250,1,58,114,27, - 0,0,0,41,28,218,9,95,119,97,114,110,105,110,103,115, - 218,4,119,97,114,110,218,18,68,101,112,114,101,99,97,116, - 105,111,110,87,97,114,110,105,110,103,218,9,84,121,112,101, - 69,114,114,111,114,114,2,0,0,0,218,6,102,115,112,97, - 116,104,114,46,0,0,0,114,40,0,0,0,114,8,0,0, - 0,218,14,105,109,112,108,101,109,101,110,116,97,116,105,111, - 110,218,9,99,97,99,104,101,95,116,97,103,218,19,78,111, - 116,73,109,112,108,101,109,101,110,116,101,100,69,114,114,111, - 114,114,35,0,0,0,218,5,102,108,97,103,115,218,8,111, - 112,116,105,109,105,122,101,218,3,115,116,114,218,7,105,115, - 97,108,110,117,109,218,10,86,97,108,117,101,69,114,114,111, - 114,114,61,0,0,0,218,4,95,79,80,84,218,17,66,89, - 84,69,67,79,68,69,95,83,85,70,70,73,88,69,83,218, - 14,112,121,99,97,99,104,101,95,112,114,101,102,105,120,114, - 58,0,0,0,114,37,0,0,0,114,54,0,0,0,114,30, - 0,0,0,218,6,108,115,116,114,105,112,218,8,95,80,89, - 67,65,67,72,69,41,12,114,43,0,0,0,90,14,100,101, - 98,117,103,95,111,118,101,114,114,105,100,101,114,69,0,0, - 0,218,7,109,101,115,115,97,103,101,218,4,104,101,97,100, - 114,45,0,0,0,90,4,98,97,115,101,218,3,115,101,112, - 218,4,114,101,115,116,90,3,116,97,103,90,15,97,108,109, - 111,115,116,95,102,105,108,101,110,97,109,101,218,8,102,105, - 108,101,110,97,109,101,114,3,0,0,0,114,3,0,0,0, - 114,6,0,0,0,218,17,99,97,99,104,101,95,102,114,111, - 109,95,115,111,117,114,99,101,39,1,0,0,115,72,0,0, - 0,0,18,8,1,6,1,2,255,4,2,8,1,4,1,8, - 1,12,1,10,1,12,1,16,1,8,1,8,1,8,1,24, - 1,8,1,12,1,6,2,8,1,8,1,8,1,8,1,14, - 1,14,1,12,1,12,9,10,1,14,5,28,1,12,4,2, - 1,4,1,8,1,2,253,4,5,114,97,0,0,0,99,1, - 0,0,0,0,0,0,0,0,0,0,0,10,0,0,0,5, - 0,0,0,67,0,0,0,115,46,1,0,0,116,0,106,1, - 106,2,100,1,107,8,114,20,116,3,100,2,131,1,130,1, - 116,4,160,5,124,0,161,1,125,0,116,6,124,0,131,1, - 92,2,125,1,125,2,100,3,125,3,116,0,106,7,100,1, - 107,9,114,102,116,0,106,7,160,8,116,9,161,1,125,4, - 124,1,160,10,124,4,116,11,23,0,161,1,114,102,124,1, - 116,12,124,4,131,1,100,1,133,2,25,0,125,1,100,4, - 125,3,124,3,115,144,116,6,124,1,131,1,92,2,125,1, - 125,5,124,5,116,13,107,3,114,144,116,14,116,13,155,0, - 100,5,124,0,155,2,157,3,131,1,130,1,124,2,160,15, - 100,6,161,1,125,6,124,6,100,7,107,7,114,178,116,14, - 100,8,124,2,155,2,157,2,131,1,130,1,110,92,124,6, - 100,9,107,2,144,1,114,14,124,2,160,16,100,6,100,10, - 161,2,100,11,25,0,125,7,124,7,160,10,116,17,161,1, - 115,228,116,14,100,12,116,17,155,2,157,2,131,1,130,1, - 124,7,116,12,116,17,131,1,100,1,133,2,25,0,125,8, - 124,8,160,18,161,0,144,1,115,14,116,14,100,13,124,7, - 155,2,100,14,157,3,131,1,130,1,124,2,160,19,100,6, - 161,1,100,15,25,0,125,9,116,20,124,1,124,9,116,21, - 100,15,25,0,23,0,131,2,83,0,41,16,97,110,1,0, - 0,71,105,118,101,110,32,116,104,101,32,112,97,116,104,32, - 116,111,32,97,32,46,112,121,99,46,32,102,105,108,101,44, - 32,114,101,116,117,114,110,32,116,104,101,32,112,97,116,104, - 32,116,111,32,105,116,115,32,46,112,121,32,102,105,108,101, - 46,10,10,32,32,32,32,84,104,101,32,46,112,121,99,32, - 102,105,108,101,32,100,111,101,115,32,110,111,116,32,110,101, - 101,100,32,116,111,32,101,120,105,115,116,59,32,116,104,105, - 115,32,115,105,109,112,108,121,32,114,101,116,117,114,110,115, - 32,116,104,101,32,112,97,116,104,32,116,111,10,32,32,32, - 32,116,104,101,32,46,112,121,32,102,105,108,101,32,99,97, - 108,99,117,108,97,116,101,100,32,116,111,32,99,111,114,114, - 101,115,112,111,110,100,32,116,111,32,116,104,101,32,46,112, - 121,99,32,102,105,108,101,46,32,32,73,102,32,112,97,116, - 104,32,100,111,101,115,10,32,32,32,32,110,111,116,32,99, - 111,110,102,111,114,109,32,116,111,32,80,69,80,32,51,49, - 52,55,47,52,56,56,32,102,111,114,109,97,116,44,32,86, - 97,108,117,101,69,114,114,111,114,32,119,105,108,108,32,98, - 101,32,114,97,105,115,101,100,46,32,73,102,10,32,32,32, - 32,115,121,115,46,105,109,112,108,101,109,101,110,116,97,116, - 105,111,110,46,99,97,99,104,101,95,116,97,103,32,105,115, - 32,78,111,110,101,32,116,104,101,110,32,78,111,116,73,109, - 112,108,101,109,101,110,116,101,100,69,114,114,111,114,32,105, - 115,32,114,97,105,115,101,100,46,10,10,32,32,32,32,78, - 114,71,0,0,0,70,84,122,31,32,110,111,116,32,98,111, - 116,116,111,109,45,108,101,118,101,108,32,100,105,114,101,99, - 116,111,114,121,32,105,110,32,114,70,0,0,0,62,2,0, - 0,0,114,27,0,0,0,114,56,0,0,0,122,29,101,120, - 112,101,99,116,101,100,32,111,110,108,121,32,50,32,111,114, - 32,51,32,100,111,116,115,32,105,110,32,114,56,0,0,0, - 114,27,0,0,0,233,254,255,255,255,122,53,111,112,116,105, - 109,105,122,97,116,105,111,110,32,112,111,114,116,105,111,110, - 32,111,102,32,102,105,108,101,110,97,109,101,32,100,111,101, - 115,32,110,111,116,32,115,116,97,114,116,32,119,105,116,104, - 32,122,19,111,112,116,105,109,105,122,97,116,105,111,110,32, - 108,101,118,101,108,32,122,29,32,105,115,32,110,111,116,32, - 97,110,32,97,108,112,104,97,110,117,109,101,114,105,99,32, - 118,97,108,117,101,114,72,0,0,0,41,22,114,8,0,0, - 0,114,79,0,0,0,114,80,0,0,0,114,81,0,0,0, - 114,2,0,0,0,114,78,0,0,0,114,46,0,0,0,114, - 89,0,0,0,114,29,0,0,0,114,30,0,0,0,114,10, - 0,0,0,114,34,0,0,0,114,22,0,0,0,114,91,0, - 0,0,114,86,0,0,0,218,5,99,111,117,110,116,114,42, - 0,0,0,114,87,0,0,0,114,85,0,0,0,218,9,112, - 97,114,116,105,116,105,111,110,114,37,0,0,0,218,15,83, - 79,85,82,67,69,95,83,85,70,70,73,88,69,83,41,10, - 114,43,0,0,0,114,93,0,0,0,90,16,112,121,99,97, - 99,104,101,95,102,105,108,101,110,97,109,101,90,23,102,111, - 117,110,100,95,105,110,95,112,121,99,97,99,104,101,95,112, - 114,101,102,105,120,90,13,115,116,114,105,112,112,101,100,95, - 112,97,116,104,90,7,112,121,99,97,99,104,101,90,9,100, - 111,116,95,99,111,117,110,116,114,69,0,0,0,90,9,111, - 112,116,95,108,101,118,101,108,90,13,98,97,115,101,95,102, - 105,108,101,110,97,109,101,114,3,0,0,0,114,3,0,0, - 0,114,6,0,0,0,218,17,115,111,117,114,99,101,95,102, - 114,111,109,95,99,97,99,104,101,110,1,0,0,115,52,0, - 0,0,0,9,12,1,8,1,10,1,12,1,4,1,10,1, - 12,1,14,1,16,1,4,1,4,1,12,1,8,1,18,2, - 10,1,8,1,16,1,10,1,16,1,10,1,14,2,16,1, - 10,1,16,2,14,1,114,102,0,0,0,99,1,0,0,0, - 0,0,0,0,0,0,0,0,5,0,0,0,9,0,0,0, - 67,0,0,0,115,126,0,0,0,116,0,124,0,131,1,100, - 1,107,2,114,16,100,2,83,0,124,0,160,1,100,3,161, - 1,92,3,125,1,125,2,125,3,124,1,114,56,124,3,160, - 2,161,0,100,4,100,5,133,2,25,0,100,6,107,3,114, - 60,124,0,83,0,122,12,116,3,124,0,131,1,125,4,87, - 0,110,36,4,0,116,4,116,5,102,2,107,10,114,108,1, - 0,1,0,1,0,124,0,100,2,100,5,133,2,25,0,125, - 4,89,0,110,2,88,0,116,6,124,4,131,1,114,122,124, - 4,83,0,124,0,83,0,41,7,122,188,67,111,110,118,101, - 114,116,32,97,32,98,121,116,101,99,111,100,101,32,102,105, - 108,101,32,112,97,116,104,32,116,111,32,97,32,115,111,117, - 114,99,101,32,112,97,116,104,32,40,105,102,32,112,111,115, - 115,105,98,108,101,41,46,10,10,32,32,32,32,84,104,105, - 115,32,102,117,110,99,116,105,111,110,32,101,120,105,115,116, - 115,32,112,117,114,101,108,121,32,102,111,114,32,98,97,99, - 107,119,97,114,100,115,45,99,111,109,112,97,116,105,98,105, - 108,105,116,121,32,102,111,114,10,32,32,32,32,80,121,73, - 109,112,111,114,116,95,69,120,101,99,67,111,100,101,77,111, - 100,117,108,101,87,105,116,104,70,105,108,101,110,97,109,101, - 115,40,41,32,105,110,32,116,104,101,32,67,32,65,80,73, - 46,10,10,32,32,32,32,114,72,0,0,0,78,114,70,0, - 0,0,233,253,255,255,255,233,255,255,255,255,90,2,112,121, - 41,7,114,22,0,0,0,114,40,0,0,0,218,5,108,111, - 119,101,114,114,102,0,0,0,114,81,0,0,0,114,86,0, - 0,0,114,53,0,0,0,41,5,218,13,98,121,116,101,99, - 111,100,101,95,112,97,116,104,114,95,0,0,0,114,44,0, - 0,0,90,9,101,120,116,101,110,115,105,111,110,218,11,115, - 111,117,114,99,101,95,112,97,116,104,114,3,0,0,0,114, - 3,0,0,0,114,6,0,0,0,218,15,95,103,101,116,95, - 115,111,117,114,99,101,102,105,108,101,150,1,0,0,115,20, - 0,0,0,0,7,12,1,4,1,16,1,24,1,4,1,2, - 1,12,1,18,1,18,1,114,108,0,0,0,99,1,0,0, - 0,0,0,0,0,0,0,0,0,1,0,0,0,8,0,0, - 0,67,0,0,0,115,74,0,0,0,124,0,160,0,116,1, - 116,2,131,1,161,1,114,48,122,10,116,3,124,0,131,1, - 87,0,83,0,4,0,116,4,107,10,114,44,1,0,1,0, - 1,0,89,0,113,70,88,0,110,22,124,0,160,0,116,1, - 116,5,131,1,161,1,114,66,124,0,83,0,100,0,83,0, - 100,0,83,0,169,1,78,41,6,218,8,101,110,100,115,119, - 105,116,104,218,5,116,117,112,108,101,114,101,0,0,0,114, - 97,0,0,0,114,81,0,0,0,114,88,0,0,0,41,1, - 114,96,0,0,0,114,3,0,0,0,114,3,0,0,0,114, - 6,0,0,0,218,11,95,103,101,116,95,99,97,99,104,101, - 100,169,1,0,0,115,16,0,0,0,0,1,14,1,2,1, - 10,1,14,1,8,1,14,1,4,2,114,112,0,0,0,99, - 1,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0, - 8,0,0,0,67,0,0,0,115,52,0,0,0,122,14,116, - 0,124,0,131,1,106,1,125,1,87,0,110,24,4,0,116, - 2,107,10,114,38,1,0,1,0,1,0,100,1,125,1,89, - 0,110,2,88,0,124,1,100,2,79,0,125,1,124,1,83, - 0,41,3,122,51,67,97,108,99,117,108,97,116,101,32,116, - 104,101,32,109,111,100,101,32,112,101,114,109,105,115,115,105, - 111,110,115,32,102,111,114,32,97,32,98,121,116,101,99,111, - 100,101,32,102,105,108,101,46,114,59,0,0,0,233,128,0, - 0,0,41,3,114,48,0,0,0,114,50,0,0,0,114,49, - 0,0,0,41,2,114,43,0,0,0,114,51,0,0,0,114, - 3,0,0,0,114,3,0,0,0,114,6,0,0,0,218,10, - 95,99,97,108,99,95,109,111,100,101,181,1,0,0,115,12, - 0,0,0,0,2,2,1,14,1,14,1,10,3,8,1,114, - 114,0,0,0,99,1,0,0,0,0,0,0,0,0,0,0, - 0,3,0,0,0,8,0,0,0,3,0,0,0,115,68,0, - 0,0,100,6,135,0,102,1,100,2,100,3,132,9,125,1, - 122,10,116,0,106,1,125,2,87,0,110,28,4,0,116,2, - 107,10,114,52,1,0,1,0,1,0,100,4,100,5,132,0, - 125,2,89,0,110,2,88,0,124,2,124,1,136,0,131,2, - 1,0,124,1,83,0,41,7,122,252,68,101,99,111,114,97, - 116,111,114,32,116,111,32,118,101,114,105,102,121,32,116,104, - 97,116,32,116,104,101,32,109,111,100,117,108,101,32,98,101, - 105,110,103,32,114,101,113,117,101,115,116,101,100,32,109,97, - 116,99,104,101,115,32,116,104,101,32,111,110,101,32,116,104, - 101,10,32,32,32,32,108,111,97,100,101,114,32,99,97,110, - 32,104,97,110,100,108,101,46,10,10,32,32,32,32,84,104, - 101,32,102,105,114,115,116,32,97,114,103,117,109,101,110,116, - 32,40,115,101,108,102,41,32,109,117,115,116,32,100,101,102, - 105,110,101,32,95,110,97,109,101,32,119,104,105,99,104,32, - 116,104,101,32,115,101,99,111,110,100,32,97,114,103,117,109, - 101,110,116,32,105,115,10,32,32,32,32,99,111,109,112,97, - 114,101,100,32,97,103,97,105,110,115,116,46,32,73,102,32, - 116,104,101,32,99,111,109,112,97,114,105,115,111,110,32,102, - 97,105,108,115,32,116,104,101,110,32,73,109,112,111,114,116, - 69,114,114,111,114,32,105,115,32,114,97,105,115,101,100,46, - 10,10,32,32,32,32,78,99,2,0,0,0,0,0,0,0, - 0,0,0,0,4,0,0,0,4,0,0,0,31,0,0,0, - 115,66,0,0,0,124,1,100,0,107,8,114,16,124,0,106, - 0,125,1,110,32,124,0,106,0,124,1,107,3,114,48,116, - 1,100,1,124,0,106,0,124,1,102,2,22,0,124,1,100, - 2,141,2,130,1,136,0,124,0,124,1,102,2,124,2,158, - 2,124,3,142,1,83,0,41,3,78,122,30,108,111,97,100, - 101,114,32,102,111,114,32,37,115,32,99,97,110,110,111,116, - 32,104,97,110,100,108,101,32,37,115,169,1,218,4,110,97, - 109,101,41,2,114,116,0,0,0,218,11,73,109,112,111,114, - 116,69,114,114,111,114,41,4,218,4,115,101,108,102,114,116, - 0,0,0,218,4,97,114,103,115,218,6,107,119,97,114,103, - 115,169,1,218,6,109,101,116,104,111,100,114,3,0,0,0, - 114,6,0,0,0,218,19,95,99,104,101,99,107,95,110,97, - 109,101,95,119,114,97,112,112,101,114,201,1,0,0,115,18, - 0,0,0,0,1,8,1,8,1,10,1,4,1,8,255,2, - 1,2,255,6,2,122,40,95,99,104,101,99,107,95,110,97, - 109,101,46,60,108,111,99,97,108,115,62,46,95,99,104,101, - 99,107,95,110,97,109,101,95,119,114,97,112,112,101,114,99, - 2,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0, - 7,0,0,0,83,0,0,0,115,56,0,0,0,100,1,68, - 0,93,32,125,2,116,0,124,1,124,2,131,2,114,4,116, - 1,124,0,124,2,116,2,124,1,124,2,131,2,131,3,1, - 0,113,4,124,0,106,3,160,4,124,1,106,3,161,1,1, - 0,100,0,83,0,41,2,78,41,4,218,10,95,95,109,111, - 100,117,108,101,95,95,218,8,95,95,110,97,109,101,95,95, - 218,12,95,95,113,117,97,108,110,97,109,101,95,95,218,7, - 95,95,100,111,99,95,95,41,5,218,7,104,97,115,97,116, - 116,114,218,7,115,101,116,97,116,116,114,218,7,103,101,116, - 97,116,116,114,218,8,95,95,100,105,99,116,95,95,218,6, - 117,112,100,97,116,101,41,3,90,3,110,101,119,90,3,111, - 108,100,114,66,0,0,0,114,3,0,0,0,114,3,0,0, - 0,114,6,0,0,0,218,5,95,119,114,97,112,212,1,0, - 0,115,8,0,0,0,0,1,8,1,10,1,20,1,122,26, - 95,99,104,101,99,107,95,110,97,109,101,46,60,108,111,99, - 97,108,115,62,46,95,119,114,97,112,41,1,78,41,3,218, - 10,95,98,111,111,116,115,116,114,97,112,114,133,0,0,0, - 218,9,78,97,109,101,69,114,114,111,114,41,3,114,122,0, - 0,0,114,123,0,0,0,114,133,0,0,0,114,3,0,0, - 0,114,121,0,0,0,114,6,0,0,0,218,11,95,99,104, - 101,99,107,95,110,97,109,101,193,1,0,0,115,14,0,0, - 0,0,8,14,7,2,1,10,1,14,2,14,5,10,1,114, - 136,0,0,0,99,2,0,0,0,0,0,0,0,0,0,0, - 0,5,0,0,0,6,0,0,0,67,0,0,0,115,60,0, - 0,0,124,0,160,0,124,1,161,1,92,2,125,2,125,3, - 124,2,100,1,107,8,114,56,116,1,124,3,131,1,114,56, - 100,2,125,4,116,2,160,3,124,4,160,4,124,3,100,3, - 25,0,161,1,116,5,161,2,1,0,124,2,83,0,41,4, - 122,155,84,114,121,32,116,111,32,102,105,110,100,32,97,32, - 108,111,97,100,101,114,32,102,111,114,32,116,104,101,32,115, - 112,101,99,105,102,105,101,100,32,109,111,100,117,108,101,32, - 98,121,32,100,101,108,101,103,97,116,105,110,103,32,116,111, - 10,32,32,32,32,115,101,108,102,46,102,105,110,100,95,108, - 111,97,100,101,114,40,41,46,10,10,32,32,32,32,84,104, - 105,115,32,109,101,116,104,111,100,32,105,115,32,100,101,112, - 114,101,99,97,116,101,100,32,105,110,32,102,97,118,111,114, - 32,111,102,32,102,105,110,100,101,114,46,102,105,110,100,95, - 115,112,101,99,40,41,46,10,10,32,32,32,32,78,122,44, - 78,111,116,32,105,109,112,111,114,116,105,110,103,32,100,105, - 114,101,99,116,111,114,121,32,123,125,58,32,109,105,115,115, - 105,110,103,32,95,95,105,110,105,116,95,95,114,72,0,0, - 0,41,6,218,11,102,105,110,100,95,108,111,97,100,101,114, - 114,22,0,0,0,114,74,0,0,0,114,75,0,0,0,114, - 61,0,0,0,218,13,73,109,112,111,114,116,87,97,114,110, - 105,110,103,41,5,114,118,0,0,0,218,8,102,117,108,108, - 110,97,109,101,218,6,108,111,97,100,101,114,218,8,112,111, - 114,116,105,111,110,115,218,3,109,115,103,114,3,0,0,0, - 114,3,0,0,0,114,6,0,0,0,218,17,95,102,105,110, - 100,95,109,111,100,117,108,101,95,115,104,105,109,221,1,0, - 0,115,10,0,0,0,0,10,14,1,16,1,4,1,22,1, - 114,143,0,0,0,99,3,0,0,0,0,0,0,0,0,0, - 0,0,6,0,0,0,4,0,0,0,67,0,0,0,115,158, - 0,0,0,124,0,100,1,100,2,133,2,25,0,125,3,124, - 3,116,0,107,3,114,60,100,3,124,1,155,2,100,4,124, - 3,155,2,157,4,125,4,116,1,160,2,100,5,124,4,161, - 2,1,0,116,3,124,4,102,1,124,2,142,1,130,1,116, - 4,124,0,131,1,100,6,107,0,114,102,100,7,124,1,155, - 2,157,2,125,4,116,1,160,2,100,5,124,4,161,2,1, - 0,116,5,124,4,131,1,130,1,116,6,124,0,100,2,100, - 8,133,2,25,0,131,1,125,5,124,5,100,9,64,0,114, - 154,100,10,124,5,155,2,100,11,124,1,155,2,157,4,125, - 4,116,3,124,4,102,1,124,2,142,1,130,1,124,5,83, - 0,41,12,97,84,2,0,0,80,101,114,102,111,114,109,32, - 98,97,115,105,99,32,118,97,108,105,100,105,116,121,32,99, - 104,101,99,107,105,110,103,32,111,102,32,97,32,112,121,99, - 32,104,101,97,100,101,114,32,97,110,100,32,114,101,116,117, - 114,110,32,116,104,101,32,102,108,97,103,115,32,102,105,101, - 108,100,44,10,32,32,32,32,119,104,105,99,104,32,100,101, - 116,101,114,109,105,110,101,115,32,104,111,119,32,116,104,101, - 32,112,121,99,32,115,104,111,117,108,100,32,98,101,32,102, - 117,114,116,104,101,114,32,118,97,108,105,100,97,116,101,100, - 32,97,103,97,105,110,115,116,32,116,104,101,32,115,111,117, - 114,99,101,46,10,10,32,32,32,32,42,100,97,116,97,42, - 32,105,115,32,116,104,101,32,99,111,110,116,101,110,116,115, - 32,111,102,32,116,104,101,32,112,121,99,32,102,105,108,101, - 46,32,40,79,110,108,121,32,116,104,101,32,102,105,114,115, - 116,32,49,54,32,98,121,116,101,115,32,97,114,101,10,32, - 32,32,32,114,101,113,117,105,114,101,100,44,32,116,104,111, - 117,103,104,46,41,10,10,32,32,32,32,42,110,97,109,101, - 42,32,105,115,32,116,104,101,32,110,97,109,101,32,111,102, - 32,116,104,101,32,109,111,100,117,108,101,32,98,101,105,110, - 103,32,105,109,112,111,114,116,101,100,46,32,73,116,32,105, - 115,32,117,115,101,100,32,102,111,114,32,108,111,103,103,105, - 110,103,46,10,10,32,32,32,32,42,101,120,99,95,100,101, - 116,97,105,108,115,42,32,105,115,32,97,32,100,105,99,116, - 105,111,110,97,114,121,32,112,97,115,115,101,100,32,116,111, - 32,73,109,112,111,114,116,69,114,114,111,114,32,105,102,32, - 105,116,32,114,97,105,115,101,100,32,102,111,114,10,32,32, - 32,32,105,109,112,114,111,118,101,100,32,100,101,98,117,103, - 103,105,110,103,46,10,10,32,32,32,32,73,109,112,111,114, - 116,69,114,114,111,114,32,105,115,32,114,97,105,115,101,100, - 32,119,104,101,110,32,116,104,101,32,109,97,103,105,99,32, - 110,117,109,98,101,114,32,105,115,32,105,110,99,111,114,114, - 101,99,116,32,111,114,32,119,104,101,110,32,116,104,101,32, - 102,108,97,103,115,10,32,32,32,32,102,105,101,108,100,32, - 105,115,32,105,110,118,97,108,105,100,46,32,69,79,70,69, - 114,114,111,114,32,105,115,32,114,97,105,115,101,100,32,119, - 104,101,110,32,116,104,101,32,100,97,116,97,32,105,115,32, - 102,111,117,110,100,32,116,111,32,98,101,32,116,114,117,110, - 99,97,116,101,100,46,10,10,32,32,32,32,78,114,15,0, - 0,0,122,20,98,97,100,32,109,97,103,105,99,32,110,117, - 109,98,101,114,32,105,110,32,122,2,58,32,250,2,123,125, - 233,16,0,0,0,122,40,114,101,97,99,104,101,100,32,69, - 79,70,32,119,104,105,108,101,32,114,101,97,100,105,110,103, - 32,112,121,99,32,104,101,97,100,101,114,32,111,102,32,233, - 8,0,0,0,233,252,255,255,255,122,14,105,110,118,97,108, - 105,100,32,102,108,97,103,115,32,122,4,32,105,110,32,41, - 7,218,12,77,65,71,73,67,95,78,85,77,66,69,82,114, - 134,0,0,0,218,16,95,118,101,114,98,111,115,101,95,109, - 101,115,115,97,103,101,114,117,0,0,0,114,22,0,0,0, - 218,8,69,79,70,69,114,114,111,114,114,26,0,0,0,41, - 6,114,25,0,0,0,114,116,0,0,0,218,11,101,120,99, - 95,100,101,116,97,105,108,115,90,5,109,97,103,105,99,114, - 92,0,0,0,114,82,0,0,0,114,3,0,0,0,114,3, - 0,0,0,114,6,0,0,0,218,13,95,99,108,97,115,115, - 105,102,121,95,112,121,99,238,1,0,0,115,28,0,0,0, - 0,16,12,1,8,1,16,1,12,1,12,1,12,1,10,1, - 12,1,8,1,16,2,8,1,16,1,12,1,114,152,0,0, - 0,99,5,0,0,0,0,0,0,0,0,0,0,0,6,0, - 0,0,4,0,0,0,67,0,0,0,115,112,0,0,0,116, - 0,124,0,100,1,100,2,133,2,25,0,131,1,124,1,100, - 3,64,0,107,3,114,58,100,4,124,3,155,2,157,2,125, - 5,116,1,160,2,100,5,124,5,161,2,1,0,116,3,124, - 5,102,1,124,4,142,1,130,1,124,2,100,6,107,9,114, - 108,116,0,124,0,100,2,100,7,133,2,25,0,131,1,124, - 2,100,3,64,0,107,3,114,108,116,3,100,4,124,3,155, - 2,157,2,102,1,124,4,142,1,130,1,100,6,83,0,41, - 8,97,7,2,0,0,86,97,108,105,100,97,116,101,32,97, - 32,112,121,99,32,97,103,97,105,110,115,116,32,116,104,101, - 32,115,111,117,114,99,101,32,108,97,115,116,45,109,111,100, - 105,102,105,101,100,32,116,105,109,101,46,10,10,32,32,32, - 32,42,100,97,116,97,42,32,105,115,32,116,104,101,32,99, - 111,110,116,101,110,116,115,32,111,102,32,116,104,101,32,112, - 121,99,32,102,105,108,101,46,32,40,79,110,108,121,32,116, - 104,101,32,102,105,114,115,116,32,49,54,32,98,121,116,101, - 115,32,97,114,101,10,32,32,32,32,114,101,113,117,105,114, - 101,100,46,41,10,10,32,32,32,32,42,115,111,117,114,99, - 101,95,109,116,105,109,101,42,32,105,115,32,116,104,101,32, - 108,97,115,116,32,109,111,100,105,102,105,101,100,32,116,105, - 109,101,115,116,97,109,112,32,111,102,32,116,104,101,32,115, - 111,117,114,99,101,32,102,105,108,101,46,10,10,32,32,32, - 32,42,115,111,117,114,99,101,95,115,105,122,101,42,32,105, - 115,32,78,111,110,101,32,111,114,32,116,104,101,32,115,105, - 122,101,32,111,102,32,116,104,101,32,115,111,117,114,99,101, - 32,102,105,108,101,32,105,110,32,98,121,116,101,115,46,10, - 10,32,32,32,32,42,110,97,109,101,42,32,105,115,32,116, - 104,101,32,110,97,109,101,32,111,102,32,116,104,101,32,109, - 111,100,117,108,101,32,98,101,105,110,103,32,105,109,112,111, - 114,116,101,100,46,32,73,116,32,105,115,32,117,115,101,100, - 32,102,111,114,32,108,111,103,103,105,110,103,46,10,10,32, - 32,32,32,42,101,120,99,95,100,101,116,97,105,108,115,42, - 32,105,115,32,97,32,100,105,99,116,105,111,110,97,114,121, - 32,112,97,115,115,101,100,32,116,111,32,73,109,112,111,114, - 116,69,114,114,111,114,32,105,102,32,105,116,32,114,97,105, - 115,101,100,32,102,111,114,10,32,32,32,32,105,109,112,114, - 111,118,101,100,32,100,101,98,117,103,103,105,110,103,46,10, - 10,32,32,32,32,65,110,32,73,109,112,111,114,116,69,114, - 114,111,114,32,105,115,32,114,97,105,115,101,100,32,105,102, - 32,116,104,101,32,98,121,116,101,99,111,100,101,32,105,115, - 32,115,116,97,108,101,46,10,10,32,32,32,32,114,146,0, - 0,0,233,12,0,0,0,114,14,0,0,0,122,22,98,121, - 116,101,99,111,100,101,32,105,115,32,115,116,97,108,101,32, - 102,111,114,32,114,144,0,0,0,78,114,145,0,0,0,41, - 4,114,26,0,0,0,114,134,0,0,0,114,149,0,0,0, - 114,117,0,0,0,41,6,114,25,0,0,0,218,12,115,111, - 117,114,99,101,95,109,116,105,109,101,218,11,115,111,117,114, - 99,101,95,115,105,122,101,114,116,0,0,0,114,151,0,0, - 0,114,92,0,0,0,114,3,0,0,0,114,3,0,0,0, - 114,6,0,0,0,218,23,95,118,97,108,105,100,97,116,101, - 95,116,105,109,101,115,116,97,109,112,95,112,121,99,15,2, - 0,0,115,16,0,0,0,0,19,24,1,10,1,12,1,12, - 1,8,1,22,255,2,2,114,156,0,0,0,99,4,0,0, - 0,0,0,0,0,0,0,0,0,4,0,0,0,3,0,0, - 0,67,0,0,0,115,38,0,0,0,124,0,100,1,100,2, - 133,2,25,0,124,1,107,3,114,34,116,0,100,3,124,2, - 155,2,157,2,102,1,124,3,142,1,130,1,100,4,83,0, - 41,5,97,243,1,0,0,86,97,108,105,100,97,116,101,32, - 97,32,104,97,115,104,45,98,97,115,101,100,32,112,121,99, - 32,98,121,32,99,104,101,99,107,105,110,103,32,116,104,101, - 32,114,101,97,108,32,115,111,117,114,99,101,32,104,97,115, - 104,32,97,103,97,105,110,115,116,32,116,104,101,32,111,110, - 101,32,105,110,10,32,32,32,32,116,104,101,32,112,121,99, - 32,104,101,97,100,101,114,46,10,10,32,32,32,32,42,100, + 32,32,32,78,114,71,0,0,0,70,84,122,31,32,110,111, + 116,32,98,111,116,116,111,109,45,108,101,118,101,108,32,100, + 105,114,101,99,116,111,114,121,32,105,110,32,114,70,0,0, + 0,62,2,0,0,0,114,27,0,0,0,114,56,0,0,0, + 122,29,101,120,112,101,99,116,101,100,32,111,110,108,121,32, + 50,32,111,114,32,51,32,100,111,116,115,32,105,110,32,114, + 56,0,0,0,114,27,0,0,0,233,254,255,255,255,122,53, + 111,112,116,105,109,105,122,97,116,105,111,110,32,112,111,114, + 116,105,111,110,32,111,102,32,102,105,108,101,110,97,109,101, + 32,100,111,101,115,32,110,111,116,32,115,116,97,114,116,32, + 119,105,116,104,32,122,19,111,112,116,105,109,105,122,97,116, + 105,111,110,32,108,101,118,101,108,32,122,29,32,105,115,32, + 110,111,116,32,97,110,32,97,108,112,104,97,110,117,109,101, + 114,105,99,32,118,97,108,117,101,114,72,0,0,0,41,22, + 114,8,0,0,0,114,79,0,0,0,114,80,0,0,0,114, + 81,0,0,0,114,2,0,0,0,114,78,0,0,0,114,46, + 0,0,0,114,89,0,0,0,114,29,0,0,0,114,30,0, + 0,0,114,10,0,0,0,114,34,0,0,0,114,22,0,0, + 0,114,91,0,0,0,114,86,0,0,0,218,5,99,111,117, + 110,116,114,42,0,0,0,114,87,0,0,0,114,85,0,0, + 0,218,9,112,97,114,116,105,116,105,111,110,114,37,0,0, + 0,218,15,83,79,85,82,67,69,95,83,85,70,70,73,88, + 69,83,41,10,114,43,0,0,0,114,93,0,0,0,90,16, + 112,121,99,97,99,104,101,95,102,105,108,101,110,97,109,101, + 90,23,102,111,117,110,100,95,105,110,95,112,121,99,97,99, + 104,101,95,112,114,101,102,105,120,90,13,115,116,114,105,112, + 112,101,100,95,112,97,116,104,90,7,112,121,99,97,99,104, + 101,90,9,100,111,116,95,99,111,117,110,116,114,69,0,0, + 0,90,9,111,112,116,95,108,101,118,101,108,90,13,98,97, + 115,101,95,102,105,108,101,110,97,109,101,114,3,0,0,0, + 114,3,0,0,0,114,6,0,0,0,218,17,115,111,117,114, + 99,101,95,102,114,111,109,95,99,97,99,104,101,112,1,0, + 0,115,52,0,0,0,0,9,12,1,8,1,10,1,12,1, + 4,1,10,1,12,1,14,1,16,1,4,1,4,1,12,1, + 8,1,18,2,10,1,8,1,16,1,10,1,16,1,10,1, + 14,2,16,1,10,1,16,2,14,1,114,102,0,0,0,99, + 1,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0, + 9,0,0,0,67,0,0,0,115,126,0,0,0,116,0,124, + 0,131,1,100,1,107,2,114,16,100,2,83,0,124,0,160, + 1,100,3,161,1,92,3,125,1,125,2,125,3,124,1,114, + 56,124,3,160,2,161,0,100,4,100,5,133,2,25,0,100, + 6,107,3,114,60,124,0,83,0,122,12,116,3,124,0,131, + 1,125,4,87,0,110,36,4,0,116,4,116,5,102,2,107, + 10,114,108,1,0,1,0,1,0,124,0,100,2,100,5,133, + 2,25,0,125,4,89,0,110,2,48,0,116,6,124,4,131, + 1,114,122,124,4,83,0,124,0,83,0,41,7,122,188,67, + 111,110,118,101,114,116,32,97,32,98,121,116,101,99,111,100, + 101,32,102,105,108,101,32,112,97,116,104,32,116,111,32,97, + 32,115,111,117,114,99,101,32,112,97,116,104,32,40,105,102, + 32,112,111,115,115,105,98,108,101,41,46,10,10,32,32,32, + 32,84,104,105,115,32,102,117,110,99,116,105,111,110,32,101, + 120,105,115,116,115,32,112,117,114,101,108,121,32,102,111,114, + 32,98,97,99,107,119,97,114,100,115,45,99,111,109,112,97, + 116,105,98,105,108,105,116,121,32,102,111,114,10,32,32,32, + 32,80,121,73,109,112,111,114,116,95,69,120,101,99,67,111, + 100,101,77,111,100,117,108,101,87,105,116,104,70,105,108,101, + 110,97,109,101,115,40,41,32,105,110,32,116,104,101,32,67, + 32,65,80,73,46,10,10,32,32,32,32,114,72,0,0,0, + 78,114,70,0,0,0,233,253,255,255,255,233,255,255,255,255, + 90,2,112,121,41,7,114,22,0,0,0,114,40,0,0,0, + 218,5,108,111,119,101,114,114,102,0,0,0,114,81,0,0, + 0,114,86,0,0,0,114,53,0,0,0,41,5,218,13,98, + 121,116,101,99,111,100,101,95,112,97,116,104,114,95,0,0, + 0,114,44,0,0,0,90,9,101,120,116,101,110,115,105,111, + 110,218,11,115,111,117,114,99,101,95,112,97,116,104,114,3, + 0,0,0,114,3,0,0,0,114,6,0,0,0,218,15,95, + 103,101,116,95,115,111,117,114,99,101,102,105,108,101,152,1, + 0,0,115,20,0,0,0,0,7,12,1,4,1,16,1,24, + 1,4,1,2,1,12,1,18,1,18,1,114,108,0,0,0, + 99,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0, + 0,8,0,0,0,67,0,0,0,115,74,0,0,0,124,0, + 160,0,116,1,116,2,131,1,161,1,114,48,122,10,116,3, + 124,0,131,1,87,0,83,0,4,0,116,4,107,10,114,44, + 1,0,1,0,1,0,89,0,113,70,48,0,110,22,124,0, + 160,0,116,1,116,5,131,1,161,1,114,66,124,0,83,0, + 100,0,83,0,100,0,83,0,169,1,78,41,6,218,8,101, + 110,100,115,119,105,116,104,218,5,116,117,112,108,101,114,101, + 0,0,0,114,97,0,0,0,114,81,0,0,0,114,88,0, + 0,0,41,1,114,96,0,0,0,114,3,0,0,0,114,3, + 0,0,0,114,6,0,0,0,218,11,95,103,101,116,95,99, + 97,99,104,101,100,171,1,0,0,115,16,0,0,0,0,1, + 14,1,2,1,10,1,14,1,8,1,14,1,4,2,114,112, + 0,0,0,99,1,0,0,0,0,0,0,0,0,0,0,0, + 2,0,0,0,8,0,0,0,67,0,0,0,115,52,0,0, + 0,122,14,116,0,124,0,131,1,106,1,125,1,87,0,110, + 24,4,0,116,2,107,10,114,38,1,0,1,0,1,0,100, + 1,125,1,89,0,110,2,48,0,124,1,100,2,79,0,125, + 1,124,1,83,0,41,3,122,51,67,97,108,99,117,108,97, + 116,101,32,116,104,101,32,109,111,100,101,32,112,101,114,109, + 105,115,115,105,111,110,115,32,102,111,114,32,97,32,98,121, + 116,101,99,111,100,101,32,102,105,108,101,46,114,59,0,0, + 0,233,128,0,0,0,41,3,114,48,0,0,0,114,50,0, + 0,0,114,49,0,0,0,41,2,114,43,0,0,0,114,51, + 0,0,0,114,3,0,0,0,114,3,0,0,0,114,6,0, + 0,0,218,10,95,99,97,108,99,95,109,111,100,101,183,1, + 0,0,115,12,0,0,0,0,2,2,1,14,1,14,1,10, + 3,8,1,114,114,0,0,0,99,1,0,0,0,0,0,0, + 0,0,0,0,0,3,0,0,0,8,0,0,0,3,0,0, + 0,115,68,0,0,0,100,6,135,0,102,1,100,2,100,3, + 132,9,125,1,122,10,116,0,106,1,125,2,87,0,110,28, + 4,0,116,2,107,10,114,52,1,0,1,0,1,0,100,4, + 100,5,132,0,125,2,89,0,110,2,48,0,124,2,124,1, + 136,0,131,2,1,0,124,1,83,0,41,7,122,252,68,101, + 99,111,114,97,116,111,114,32,116,111,32,118,101,114,105,102, + 121,32,116,104,97,116,32,116,104,101,32,109,111,100,117,108, + 101,32,98,101,105,110,103,32,114,101,113,117,101,115,116,101, + 100,32,109,97,116,99,104,101,115,32,116,104,101,32,111,110, + 101,32,116,104,101,10,32,32,32,32,108,111,97,100,101,114, + 32,99,97,110,32,104,97,110,100,108,101,46,10,10,32,32, + 32,32,84,104,101,32,102,105,114,115,116,32,97,114,103,117, + 109,101,110,116,32,40,115,101,108,102,41,32,109,117,115,116, + 32,100,101,102,105,110,101,32,95,110,97,109,101,32,119,104, + 105,99,104,32,116,104,101,32,115,101,99,111,110,100,32,97, + 114,103,117,109,101,110,116,32,105,115,10,32,32,32,32,99, + 111,109,112,97,114,101,100,32,97,103,97,105,110,115,116,46, + 32,73,102,32,116,104,101,32,99,111,109,112,97,114,105,115, + 111,110,32,102,97,105,108,115,32,116,104,101,110,32,73,109, + 112,111,114,116,69,114,114,111,114,32,105,115,32,114,97,105, + 115,101,100,46,10,10,32,32,32,32,78,99,2,0,0,0, + 0,0,0,0,0,0,0,0,4,0,0,0,4,0,0,0, + 31,0,0,0,115,66,0,0,0,124,1,100,0,107,8,114, + 16,124,0,106,0,125,1,110,32,124,0,106,0,124,1,107, + 3,114,48,116,1,100,1,124,0,106,0,124,1,102,2,22, + 0,124,1,100,2,141,2,130,1,136,0,124,0,124,1,102, + 2,124,2,158,2,124,3,142,1,83,0,41,3,78,122,30, + 108,111,97,100,101,114,32,102,111,114,32,37,115,32,99,97, + 110,110,111,116,32,104,97,110,100,108,101,32,37,115,169,1, + 218,4,110,97,109,101,41,2,114,116,0,0,0,218,11,73, + 109,112,111,114,116,69,114,114,111,114,41,4,218,4,115,101, + 108,102,114,116,0,0,0,218,4,97,114,103,115,218,6,107, + 119,97,114,103,115,169,1,218,6,109,101,116,104,111,100,114, + 3,0,0,0,114,6,0,0,0,218,19,95,99,104,101,99, + 107,95,110,97,109,101,95,119,114,97,112,112,101,114,203,1, + 0,0,115,18,0,0,0,0,1,8,1,8,1,10,1,4, + 1,8,255,2,1,2,255,6,2,122,40,95,99,104,101,99, + 107,95,110,97,109,101,46,60,108,111,99,97,108,115,62,46, + 95,99,104,101,99,107,95,110,97,109,101,95,119,114,97,112, + 112,101,114,99,2,0,0,0,0,0,0,0,0,0,0,0, + 3,0,0,0,7,0,0,0,83,0,0,0,115,56,0,0, + 0,100,1,68,0,93,32,125,2,116,0,124,1,124,2,131, + 2,114,4,116,1,124,0,124,2,116,2,124,1,124,2,131, + 2,131,3,1,0,113,4,124,0,106,3,160,4,124,1,106, + 3,161,1,1,0,100,0,83,0,41,2,78,41,4,218,10, + 95,95,109,111,100,117,108,101,95,95,218,8,95,95,110,97, + 109,101,95,95,218,12,95,95,113,117,97,108,110,97,109,101, + 95,95,218,7,95,95,100,111,99,95,95,41,5,218,7,104, + 97,115,97,116,116,114,218,7,115,101,116,97,116,116,114,218, + 7,103,101,116,97,116,116,114,218,8,95,95,100,105,99,116, + 95,95,218,6,117,112,100,97,116,101,41,3,90,3,110,101, + 119,90,3,111,108,100,114,66,0,0,0,114,3,0,0,0, + 114,3,0,0,0,114,6,0,0,0,218,5,95,119,114,97, + 112,214,1,0,0,115,8,0,0,0,0,1,8,1,10,1, + 20,1,122,26,95,99,104,101,99,107,95,110,97,109,101,46, + 60,108,111,99,97,108,115,62,46,95,119,114,97,112,41,1, + 78,41,3,218,10,95,98,111,111,116,115,116,114,97,112,114, + 133,0,0,0,218,9,78,97,109,101,69,114,114,111,114,41, + 3,114,122,0,0,0,114,123,0,0,0,114,133,0,0,0, + 114,3,0,0,0,114,121,0,0,0,114,6,0,0,0,218, + 11,95,99,104,101,99,107,95,110,97,109,101,195,1,0,0, + 115,14,0,0,0,0,8,14,7,2,1,10,1,14,2,14, + 5,10,1,114,136,0,0,0,99,2,0,0,0,0,0,0, + 0,0,0,0,0,5,0,0,0,6,0,0,0,67,0,0, + 0,115,60,0,0,0,124,0,160,0,124,1,161,1,92,2, + 125,2,125,3,124,2,100,1,107,8,114,56,116,1,124,3, + 131,1,114,56,100,2,125,4,116,2,160,3,124,4,160,4, + 124,3,100,3,25,0,161,1,116,5,161,2,1,0,124,2, + 83,0,41,4,122,155,84,114,121,32,116,111,32,102,105,110, + 100,32,97,32,108,111,97,100,101,114,32,102,111,114,32,116, + 104,101,32,115,112,101,99,105,102,105,101,100,32,109,111,100, + 117,108,101,32,98,121,32,100,101,108,101,103,97,116,105,110, + 103,32,116,111,10,32,32,32,32,115,101,108,102,46,102,105, + 110,100,95,108,111,97,100,101,114,40,41,46,10,10,32,32, + 32,32,84,104,105,115,32,109,101,116,104,111,100,32,105,115, + 32,100,101,112,114,101,99,97,116,101,100,32,105,110,32,102, + 97,118,111,114,32,111,102,32,102,105,110,100,101,114,46,102, + 105,110,100,95,115,112,101,99,40,41,46,10,10,32,32,32, + 32,78,122,44,78,111,116,32,105,109,112,111,114,116,105,110, + 103,32,100,105,114,101,99,116,111,114,121,32,123,125,58,32, + 109,105,115,115,105,110,103,32,95,95,105,110,105,116,95,95, + 114,72,0,0,0,41,6,218,11,102,105,110,100,95,108,111, + 97,100,101,114,114,22,0,0,0,114,74,0,0,0,114,75, + 0,0,0,114,61,0,0,0,218,13,73,109,112,111,114,116, + 87,97,114,110,105,110,103,41,5,114,118,0,0,0,218,8, + 102,117,108,108,110,97,109,101,218,6,108,111,97,100,101,114, + 218,8,112,111,114,116,105,111,110,115,218,3,109,115,103,114, + 3,0,0,0,114,3,0,0,0,114,6,0,0,0,218,17, + 95,102,105,110,100,95,109,111,100,117,108,101,95,115,104,105, + 109,223,1,0,0,115,10,0,0,0,0,10,14,1,16,1, + 4,1,22,1,114,143,0,0,0,99,3,0,0,0,0,0, + 0,0,0,0,0,0,6,0,0,0,4,0,0,0,67,0, + 0,0,115,158,0,0,0,124,0,100,1,100,2,133,2,25, + 0,125,3,124,3,116,0,107,3,114,60,100,3,124,1,155, + 2,100,4,124,3,155,2,157,4,125,4,116,1,160,2,100, + 5,124,4,161,2,1,0,116,3,124,4,102,1,124,2,142, + 1,130,1,116,4,124,0,131,1,100,6,107,0,114,102,100, + 7,124,1,155,2,157,2,125,4,116,1,160,2,100,5,124, + 4,161,2,1,0,116,5,124,4,131,1,130,1,116,6,124, + 0,100,2,100,8,133,2,25,0,131,1,125,5,124,5,100, + 9,64,0,114,154,100,10,124,5,155,2,100,11,124,1,155, + 2,157,4,125,4,116,3,124,4,102,1,124,2,142,1,130, + 1,124,5,83,0,41,12,97,84,2,0,0,80,101,114,102, + 111,114,109,32,98,97,115,105,99,32,118,97,108,105,100,105, + 116,121,32,99,104,101,99,107,105,110,103,32,111,102,32,97, + 32,112,121,99,32,104,101,97,100,101,114,32,97,110,100,32, + 114,101,116,117,114,110,32,116,104,101,32,102,108,97,103,115, + 32,102,105,101,108,100,44,10,32,32,32,32,119,104,105,99, + 104,32,100,101,116,101,114,109,105,110,101,115,32,104,111,119, + 32,116,104,101,32,112,121,99,32,115,104,111,117,108,100,32, + 98,101,32,102,117,114,116,104,101,114,32,118,97,108,105,100, + 97,116,101,100,32,97,103,97,105,110,115,116,32,116,104,101, + 32,115,111,117,114,99,101,46,10,10,32,32,32,32,42,100, 97,116,97,42,32,105,115,32,116,104,101,32,99,111,110,116, 101,110,116,115,32,111,102,32,116,104,101,32,112,121,99,32, 102,105,108,101,46,32,40,79,110,108,121,32,116,104,101,32, 102,105,114,115,116,32,49,54,32,98,121,116,101,115,32,97, - 114,101,10,32,32,32,32,114,101,113,117,105,114,101,100,46, - 41,10,10,32,32,32,32,42,115,111,117,114,99,101,95,104, - 97,115,104,42,32,105,115,32,116,104,101,32,105,109,112,111, - 114,116,108,105,98,46,117,116,105,108,46,115,111,117,114,99, - 101,95,104,97,115,104,40,41,32,111,102,32,116,104,101,32, - 115,111,117,114,99,101,32,102,105,108,101,46,10,10,32,32, - 32,32,42,110,97,109,101,42,32,105,115,32,116,104,101,32, - 110,97,109,101,32,111,102,32,116,104,101,32,109,111,100,117, - 108,101,32,98,101,105,110,103,32,105,109,112,111,114,116,101, - 100,46,32,73,116,32,105,115,32,117,115,101,100,32,102,111, - 114,32,108,111,103,103,105,110,103,46,10,10,32,32,32,32, - 42,101,120,99,95,100,101,116,97,105,108,115,42,32,105,115, - 32,97,32,100,105,99,116,105,111,110,97,114,121,32,112,97, - 115,115,101,100,32,116,111,32,73,109,112,111,114,116,69,114, - 114,111,114,32,105,102,32,105,116,32,114,97,105,115,101,100, - 32,102,111,114,10,32,32,32,32,105,109,112,114,111,118,101, - 100,32,100,101,98,117,103,103,105,110,103,46,10,10,32,32, - 32,32,65,110,32,73,109,112,111,114,116,69,114,114,111,114, - 32,105,115,32,114,97,105,115,101,100,32,105,102,32,116,104, - 101,32,98,121,116,101,99,111,100,101,32,105,115,32,115,116, - 97,108,101,46,10,10,32,32,32,32,114,146,0,0,0,114, - 145,0,0,0,122,46,104,97,115,104,32,105,110,32,98,121, - 116,101,99,111,100,101,32,100,111,101,115,110,39,116,32,109, - 97,116,99,104,32,104,97,115,104,32,111,102,32,115,111,117, - 114,99,101,32,78,41,1,114,117,0,0,0,41,4,114,25, - 0,0,0,218,11,115,111,117,114,99,101,95,104,97,115,104, - 114,116,0,0,0,114,151,0,0,0,114,3,0,0,0,114, - 3,0,0,0,114,6,0,0,0,218,18,95,118,97,108,105, - 100,97,116,101,95,104,97,115,104,95,112,121,99,43,2,0, - 0,115,12,0,0,0,0,17,16,1,2,1,8,255,2,2, - 2,254,114,158,0,0,0,99,4,0,0,0,0,0,0,0, - 0,0,0,0,5,0,0,0,5,0,0,0,67,0,0,0, - 115,80,0,0,0,116,0,160,1,124,0,161,1,125,4,116, - 2,124,4,116,3,131,2,114,56,116,4,160,5,100,1,124, - 2,161,2,1,0,124,3,100,2,107,9,114,52,116,6,160, - 7,124,4,124,3,161,2,1,0,124,4,83,0,116,8,100, - 3,160,9,124,2,161,1,124,1,124,2,100,4,141,3,130, - 1,100,2,83,0,41,5,122,35,67,111,109,112,105,108,101, - 32,98,121,116,101,99,111,100,101,32,97,115,32,102,111,117, - 110,100,32,105,110,32,97,32,112,121,99,46,122,21,99,111, - 100,101,32,111,98,106,101,99,116,32,102,114,111,109,32,123, - 33,114,125,78,122,23,78,111,110,45,99,111,100,101,32,111, - 98,106,101,99,116,32,105,110,32,123,33,114,125,169,2,114, - 116,0,0,0,114,43,0,0,0,41,10,218,7,109,97,114, - 115,104,97,108,90,5,108,111,97,100,115,218,10,105,115,105, - 110,115,116,97,110,99,101,218,10,95,99,111,100,101,95,116, - 121,112,101,114,134,0,0,0,114,149,0,0,0,218,4,95, - 105,109,112,90,16,95,102,105,120,95,99,111,95,102,105,108, - 101,110,97,109,101,114,117,0,0,0,114,61,0,0,0,41, - 5,114,25,0,0,0,114,116,0,0,0,114,106,0,0,0, - 114,107,0,0,0,218,4,99,111,100,101,114,3,0,0,0, - 114,3,0,0,0,114,6,0,0,0,218,17,95,99,111,109, - 112,105,108,101,95,98,121,116,101,99,111,100,101,67,2,0, - 0,115,20,0,0,0,0,2,10,1,10,1,12,1,8,1, - 12,1,4,2,10,1,2,0,2,255,114,165,0,0,0,114, - 72,0,0,0,99,3,0,0,0,0,0,0,0,0,0,0, - 0,4,0,0,0,5,0,0,0,67,0,0,0,115,70,0, - 0,0,116,0,116,1,131,1,125,3,124,3,160,2,116,3, - 100,1,131,1,161,1,1,0,124,3,160,2,116,3,124,1, - 131,1,161,1,1,0,124,3,160,2,116,3,124,2,131,1, - 161,1,1,0,124,3,160,2,116,4,160,5,124,0,161,1, - 161,1,1,0,124,3,83,0,41,2,122,43,80,114,111,100, - 117,99,101,32,116,104,101,32,100,97,116,97,32,102,111,114, - 32,97,32,116,105,109,101,115,116,97,109,112,45,98,97,115, - 101,100,32,112,121,99,46,114,72,0,0,0,41,6,218,9, - 98,121,116,101,97,114,114,97,121,114,148,0,0,0,218,6, - 101,120,116,101,110,100,114,20,0,0,0,114,160,0,0,0, - 218,5,100,117,109,112,115,41,4,114,164,0,0,0,218,5, - 109,116,105,109,101,114,155,0,0,0,114,25,0,0,0,114, - 3,0,0,0,114,3,0,0,0,114,6,0,0,0,218,22, - 95,99,111,100,101,95,116,111,95,116,105,109,101,115,116,97, - 109,112,95,112,121,99,80,2,0,0,115,12,0,0,0,0, - 2,8,1,14,1,14,1,14,1,16,1,114,170,0,0,0, - 84,99,3,0,0,0,0,0,0,0,0,0,0,0,5,0, - 0,0,5,0,0,0,67,0,0,0,115,80,0,0,0,116, - 0,116,1,131,1,125,3,100,1,124,2,100,1,62,0,66, - 0,125,4,124,3,160,2,116,3,124,4,131,1,161,1,1, - 0,116,4,124,1,131,1,100,2,107,2,115,50,74,0,130, - 1,124,3,160,2,124,1,161,1,1,0,124,3,160,2,116, - 5,160,6,124,0,161,1,161,1,1,0,124,3,83,0,41, - 3,122,38,80,114,111,100,117,99,101,32,116,104,101,32,100, - 97,116,97,32,102,111,114,32,97,32,104,97,115,104,45,98, - 97,115,101,100,32,112,121,99,46,114,38,0,0,0,114,146, - 0,0,0,41,7,114,166,0,0,0,114,148,0,0,0,114, - 167,0,0,0,114,20,0,0,0,114,22,0,0,0,114,160, - 0,0,0,114,168,0,0,0,41,5,114,164,0,0,0,114, - 157,0,0,0,90,7,99,104,101,99,107,101,100,114,25,0, - 0,0,114,82,0,0,0,114,3,0,0,0,114,3,0,0, - 0,114,6,0,0,0,218,17,95,99,111,100,101,95,116,111, - 95,104,97,115,104,95,112,121,99,90,2,0,0,115,14,0, - 0,0,0,2,8,1,12,1,14,1,16,1,10,1,16,1, - 114,171,0,0,0,99,1,0,0,0,0,0,0,0,0,0, - 0,0,5,0,0,0,6,0,0,0,67,0,0,0,115,62, - 0,0,0,100,1,100,2,108,0,125,1,116,1,160,2,124, - 0,161,1,106,3,125,2,124,1,160,4,124,2,161,1,125, - 3,116,1,160,5,100,2,100,3,161,2,125,4,124,4,160, - 6,124,0,160,6,124,3,100,1,25,0,161,1,161,1,83, - 0,41,4,122,121,68,101,99,111,100,101,32,98,121,116,101, - 115,32,114,101,112,114,101,115,101,110,116,105,110,103,32,115, - 111,117,114,99,101,32,99,111,100,101,32,97,110,100,32,114, - 101,116,117,114,110,32,116,104,101,32,115,116,114,105,110,103, - 46,10,10,32,32,32,32,85,110,105,118,101,114,115,97,108, - 32,110,101,119,108,105,110,101,32,115,117,112,112,111,114,116, - 32,105,115,32,117,115,101,100,32,105,110,32,116,104,101,32, - 100,101,99,111,100,105,110,103,46,10,32,32,32,32,114,72, - 0,0,0,78,84,41,7,218,8,116,111,107,101,110,105,122, - 101,114,63,0,0,0,90,7,66,121,116,101,115,73,79,90, - 8,114,101,97,100,108,105,110,101,90,15,100,101,116,101,99, - 116,95,101,110,99,111,100,105,110,103,90,25,73,110,99,114, - 101,109,101,110,116,97,108,78,101,119,108,105,110,101,68,101, - 99,111,100,101,114,218,6,100,101,99,111,100,101,41,5,218, - 12,115,111,117,114,99,101,95,98,121,116,101,115,114,172,0, - 0,0,90,21,115,111,117,114,99,101,95,98,121,116,101,115, - 95,114,101,97,100,108,105,110,101,218,8,101,110,99,111,100, - 105,110,103,90,15,110,101,119,108,105,110,101,95,100,101,99, - 111,100,101,114,114,3,0,0,0,114,3,0,0,0,114,6, - 0,0,0,218,13,100,101,99,111,100,101,95,115,111,117,114, - 99,101,101,2,0,0,115,10,0,0,0,0,5,8,1,12, - 1,10,1,12,1,114,176,0,0,0,169,2,114,140,0,0, - 0,218,26,115,117,98,109,111,100,117,108,101,95,115,101,97, - 114,99,104,95,108,111,99,97,116,105,111,110,115,99,2,0, - 0,0,0,0,0,0,2,0,0,0,9,0,0,0,8,0, - 0,0,67,0,0,0,115,16,1,0,0,124,1,100,1,107, - 8,114,60,100,2,125,1,116,0,124,2,100,3,131,2,114, - 70,122,14,124,2,160,1,124,0,161,1,125,1,87,0,113, - 70,4,0,116,2,107,10,114,56,1,0,1,0,1,0,89, - 0,113,70,88,0,110,10,116,3,160,4,124,1,161,1,125, - 1,116,5,106,6,124,0,124,2,124,1,100,4,141,3,125, - 4,100,5,124,4,95,7,124,2,100,1,107,8,114,154,116, - 8,131,0,68,0,93,42,92,2,125,5,125,6,124,1,160, - 9,116,10,124,6,131,1,161,1,114,106,124,5,124,0,124, - 1,131,2,125,2,124,2,124,4,95,11,1,0,113,154,113, - 106,100,1,83,0,124,3,116,12,107,8,114,220,116,0,124, - 2,100,6,131,2,114,226,122,14,124,2,160,13,124,0,161, - 1,125,7,87,0,110,20,4,0,116,2,107,10,114,206,1, - 0,1,0,1,0,89,0,113,226,88,0,124,7,114,226,103, - 0,124,4,95,14,110,6,124,3,124,4,95,14,124,4,106, - 14,103,0,107,2,144,1,114,12,124,1,144,1,114,12,116, - 15,124,1,131,1,100,7,25,0,125,8,124,4,106,14,160, - 16,124,8,161,1,1,0,124,4,83,0,41,8,97,61,1, - 0,0,82,101,116,117,114,110,32,97,32,109,111,100,117,108, - 101,32,115,112,101,99,32,98,97,115,101,100,32,111,110,32, - 97,32,102,105,108,101,32,108,111,99,97,116,105,111,110,46, - 10,10,32,32,32,32,84,111,32,105,110,100,105,99,97,116, - 101,32,116,104,97,116,32,116,104,101,32,109,111,100,117,108, - 101,32,105,115,32,97,32,112,97,99,107,97,103,101,44,32, - 115,101,116,10,32,32,32,32,115,117,98,109,111,100,117,108, - 101,95,115,101,97,114,99,104,95,108,111,99,97,116,105,111, - 110,115,32,116,111,32,97,32,108,105,115,116,32,111,102,32, - 100,105,114,101,99,116,111,114,121,32,112,97,116,104,115,46, - 32,32,65,110,10,32,32,32,32,101,109,112,116,121,32,108, - 105,115,116,32,105,115,32,115,117,102,102,105,99,105,101,110, - 116,44,32,116,104,111,117,103,104,32,105,116,115,32,110,111, - 116,32,111,116,104,101,114,119,105,115,101,32,117,115,101,102, - 117,108,32,116,111,32,116,104,101,10,32,32,32,32,105,109, - 112,111,114,116,32,115,121,115,116,101,109,46,10,10,32,32, - 32,32,84,104,101,32,108,111,97,100,101,114,32,109,117,115, - 116,32,116,97,107,101,32,97,32,115,112,101,99,32,97,115, - 32,105,116,115,32,111,110,108,121,32,95,95,105,110,105,116, - 95,95,40,41,32,97,114,103,46,10,10,32,32,32,32,78, - 122,9,60,117,110,107,110,111,119,110,62,218,12,103,101,116, - 95,102,105,108,101,110,97,109,101,169,1,218,6,111,114,105, - 103,105,110,84,218,10,105,115,95,112,97,99,107,97,103,101, - 114,72,0,0,0,41,17,114,128,0,0,0,114,179,0,0, - 0,114,117,0,0,0,114,2,0,0,0,114,78,0,0,0, - 114,134,0,0,0,218,10,77,111,100,117,108,101,83,112,101, - 99,90,13,95,115,101,116,95,102,105,108,101,97,116,116,114, - 218,27,95,103,101,116,95,115,117,112,112,111,114,116,101,100, - 95,102,105,108,101,95,108,111,97,100,101,114,115,114,110,0, - 0,0,114,111,0,0,0,114,140,0,0,0,218,9,95,80, - 79,80,85,76,65,84,69,114,182,0,0,0,114,178,0,0, - 0,114,46,0,0,0,218,6,97,112,112,101,110,100,41,9, - 114,116,0,0,0,90,8,108,111,99,97,116,105,111,110,114, - 140,0,0,0,114,178,0,0,0,218,4,115,112,101,99,218, - 12,108,111,97,100,101,114,95,99,108,97,115,115,218,8,115, - 117,102,102,105,120,101,115,114,182,0,0,0,90,7,100,105, - 114,110,97,109,101,114,3,0,0,0,114,3,0,0,0,114, - 6,0,0,0,218,23,115,112,101,99,95,102,114,111,109,95, - 102,105,108,101,95,108,111,99,97,116,105,111,110,118,2,0, - 0,115,62,0,0,0,0,12,8,4,4,1,10,2,2,1, - 14,1,14,1,8,2,10,8,16,1,6,3,8,1,14,1, - 14,1,10,1,6,1,6,2,4,3,8,2,10,1,2,1, - 14,1,14,1,6,2,4,1,8,2,6,1,12,1,6,1, - 12,1,12,2,114,190,0,0,0,99,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,4,0,0,0,64,0, - 0,0,115,80,0,0,0,101,0,90,1,100,0,90,2,100, - 1,90,3,100,2,90,4,100,3,90,5,100,4,90,6,101, - 7,100,5,100,6,132,0,131,1,90,8,101,7,100,7,100, - 8,132,0,131,1,90,9,101,7,100,14,100,10,100,11,132, - 1,131,1,90,10,101,7,100,15,100,12,100,13,132,1,131, - 1,90,11,100,9,83,0,41,16,218,21,87,105,110,100,111, - 119,115,82,101,103,105,115,116,114,121,70,105,110,100,101,114, - 122,62,77,101,116,97,32,112,97,116,104,32,102,105,110,100, - 101,114,32,102,111,114,32,109,111,100,117,108,101,115,32,100, - 101,99,108,97,114,101,100,32,105,110,32,116,104,101,32,87, - 105,110,100,111,119,115,32,114,101,103,105,115,116,114,121,46, - 122,59,83,111,102,116,119,97,114,101,92,80,121,116,104,111, - 110,92,80,121,116,104,111,110,67,111,114,101,92,123,115,121, - 115,95,118,101,114,115,105,111,110,125,92,77,111,100,117,108, - 101,115,92,123,102,117,108,108,110,97,109,101,125,122,65,83, - 111,102,116,119,97,114,101,92,80,121,116,104,111,110,92,80, - 121,116,104,111,110,67,111,114,101,92,123,115,121,115,95,118, - 101,114,115,105,111,110,125,92,77,111,100,117,108,101,115,92, - 123,102,117,108,108,110,97,109,101,125,92,68,101,98,117,103, - 70,99,2,0,0,0,0,0,0,0,0,0,0,0,2,0, - 0,0,8,0,0,0,67,0,0,0,115,56,0,0,0,122, - 16,116,0,160,1,116,0,106,2,124,1,161,2,87,0,83, - 0,4,0,116,3,107,10,114,50,1,0,1,0,1,0,116, - 0,160,1,116,0,106,4,124,1,161,2,6,0,89,0,83, - 0,88,0,100,0,83,0,114,109,0,0,0,41,5,218,7, - 95,119,105,110,114,101,103,90,7,79,112,101,110,75,101,121, - 90,17,72,75,69,89,95,67,85,82,82,69,78,84,95,85, - 83,69,82,114,49,0,0,0,90,18,72,75,69,89,95,76, - 79,67,65,76,95,77,65,67,72,73,78,69,41,2,218,3, - 99,108,115,114,5,0,0,0,114,3,0,0,0,114,3,0, - 0,0,114,6,0,0,0,218,14,95,111,112,101,110,95,114, - 101,103,105,115,116,114,121,198,2,0,0,115,8,0,0,0, - 0,2,2,1,16,1,14,1,122,36,87,105,110,100,111,119, - 115,82,101,103,105,115,116,114,121,70,105,110,100,101,114,46, - 95,111,112,101,110,95,114,101,103,105,115,116,114,121,99,2, - 0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,9, - 0,0,0,67,0,0,0,115,114,0,0,0,124,0,106,0, - 114,14,124,0,106,1,125,2,110,6,124,0,106,2,125,2, - 124,2,106,3,124,1,100,1,116,4,106,5,100,0,100,2, - 133,2,25,0,22,0,100,3,141,2,125,3,122,38,124,0, - 160,6,124,3,161,1,143,18,125,4,116,7,160,8,124,4, - 100,4,161,2,125,5,87,0,53,0,81,0,82,0,88,0, - 87,0,110,22,4,0,116,9,107,10,114,108,1,0,1,0, - 1,0,89,0,100,0,83,0,88,0,124,5,83,0,41,5, - 78,122,5,37,100,46,37,100,114,27,0,0,0,41,2,114, - 139,0,0,0,90,11,115,121,115,95,118,101,114,115,105,111, - 110,114,39,0,0,0,41,10,218,11,68,69,66,85,71,95, - 66,85,73,76,68,218,18,82,69,71,73,83,84,82,89,95, - 75,69,89,95,68,69,66,85,71,218,12,82,69,71,73,83, - 84,82,89,95,75,69,89,114,61,0,0,0,114,8,0,0, - 0,218,12,118,101,114,115,105,111,110,95,105,110,102,111,114, - 194,0,0,0,114,192,0,0,0,90,10,81,117,101,114,121, - 86,97,108,117,101,114,49,0,0,0,41,6,114,193,0,0, - 0,114,139,0,0,0,90,12,114,101,103,105,115,116,114,121, - 95,107,101,121,114,5,0,0,0,90,4,104,107,101,121,218, - 8,102,105,108,101,112,97,116,104,114,3,0,0,0,114,3, - 0,0,0,114,6,0,0,0,218,16,95,115,101,97,114,99, - 104,95,114,101,103,105,115,116,114,121,205,2,0,0,115,24, - 0,0,0,0,2,6,1,8,2,6,1,6,1,16,255,6, - 2,2,1,12,1,26,1,14,1,8,1,122,38,87,105,110, - 100,111,119,115,82,101,103,105,115,116,114,121,70,105,110,100, - 101,114,46,95,115,101,97,114,99,104,95,114,101,103,105,115, - 116,114,121,78,99,4,0,0,0,0,0,0,0,0,0,0, - 0,8,0,0,0,8,0,0,0,67,0,0,0,115,122,0, - 0,0,124,0,160,0,124,1,161,1,125,4,124,4,100,0, - 107,8,114,22,100,0,83,0,122,12,116,1,124,4,131,1, - 1,0,87,0,110,22,4,0,116,2,107,10,114,56,1,0, - 1,0,1,0,89,0,100,0,83,0,88,0,116,3,131,0, - 68,0,93,52,92,2,125,5,125,6,124,4,160,4,116,5, - 124,6,131,1,161,1,114,64,116,6,106,7,124,1,124,5, - 124,1,124,4,131,2,124,4,100,1,141,3,125,7,124,7, - 2,0,1,0,83,0,113,64,100,0,83,0,41,2,78,114, - 180,0,0,0,41,8,114,200,0,0,0,114,48,0,0,0, - 114,49,0,0,0,114,184,0,0,0,114,110,0,0,0,114, - 111,0,0,0,114,134,0,0,0,218,16,115,112,101,99,95, - 102,114,111,109,95,108,111,97,100,101,114,41,8,114,193,0, - 0,0,114,139,0,0,0,114,43,0,0,0,218,6,116,97, - 114,103,101,116,114,199,0,0,0,114,140,0,0,0,114,189, - 0,0,0,114,187,0,0,0,114,3,0,0,0,114,3,0, - 0,0,114,6,0,0,0,218,9,102,105,110,100,95,115,112, - 101,99,220,2,0,0,115,28,0,0,0,0,2,10,1,8, - 1,4,1,2,1,12,1,14,1,8,1,14,1,14,1,6, - 1,8,1,2,254,6,3,122,31,87,105,110,100,111,119,115, - 82,101,103,105,115,116,114,121,70,105,110,100,101,114,46,102, - 105,110,100,95,115,112,101,99,99,3,0,0,0,0,0,0, - 0,0,0,0,0,4,0,0,0,4,0,0,0,67,0,0, - 0,115,34,0,0,0,124,0,160,0,124,1,124,2,161,2, - 125,3,124,3,100,1,107,9,114,26,124,3,106,1,83,0, - 100,1,83,0,100,1,83,0,41,2,122,108,70,105,110,100, - 32,109,111,100,117,108,101,32,110,97,109,101,100,32,105,110, - 32,116,104,101,32,114,101,103,105,115,116,114,121,46,10,10, - 32,32,32,32,32,32,32,32,84,104,105,115,32,109,101,116, - 104,111,100,32,105,115,32,100,101,112,114,101,99,97,116,101, - 100,46,32,32,85,115,101,32,101,120,101,99,95,109,111,100, - 117,108,101,40,41,32,105,110,115,116,101,97,100,46,10,10, - 32,32,32,32,32,32,32,32,78,169,2,114,203,0,0,0, - 114,140,0,0,0,169,4,114,193,0,0,0,114,139,0,0, - 0,114,43,0,0,0,114,187,0,0,0,114,3,0,0,0, - 114,3,0,0,0,114,6,0,0,0,218,11,102,105,110,100, - 95,109,111,100,117,108,101,236,2,0,0,115,8,0,0,0, - 0,7,12,1,8,1,6,2,122,33,87,105,110,100,111,119, - 115,82,101,103,105,115,116,114,121,70,105,110,100,101,114,46, - 102,105,110,100,95,109,111,100,117,108,101,41,2,78,78,41, - 1,78,41,12,114,125,0,0,0,114,124,0,0,0,114,126, - 0,0,0,114,127,0,0,0,114,197,0,0,0,114,196,0, - 0,0,114,195,0,0,0,218,11,99,108,97,115,115,109,101, - 116,104,111,100,114,194,0,0,0,114,200,0,0,0,114,203, - 0,0,0,114,206,0,0,0,114,3,0,0,0,114,3,0, - 0,0,114,3,0,0,0,114,6,0,0,0,114,191,0,0, - 0,186,2,0,0,115,28,0,0,0,8,2,4,3,2,255, - 2,4,2,255,2,3,4,2,2,1,10,6,2,1,10,14, - 2,1,12,15,2,1,114,191,0,0,0,99,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0, - 64,0,0,0,115,48,0,0,0,101,0,90,1,100,0,90, - 2,100,1,90,3,100,2,100,3,132,0,90,4,100,4,100, - 5,132,0,90,5,100,6,100,7,132,0,90,6,100,8,100, - 9,132,0,90,7,100,10,83,0,41,11,218,13,95,76,111, - 97,100,101,114,66,97,115,105,99,115,122,83,66,97,115,101, - 32,99,108,97,115,115,32,111,102,32,99,111,109,109,111,110, - 32,99,111,100,101,32,110,101,101,100,101,100,32,98,121,32, - 98,111,116,104,32,83,111,117,114,99,101,76,111,97,100,101, - 114,32,97,110,100,10,32,32,32,32,83,111,117,114,99,101, - 108,101,115,115,70,105,108,101,76,111,97,100,101,114,46,99, - 2,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0, - 4,0,0,0,67,0,0,0,115,64,0,0,0,116,0,124, - 0,160,1,124,1,161,1,131,1,100,1,25,0,125,2,124, - 2,160,2,100,2,100,1,161,2,100,3,25,0,125,3,124, - 1,160,3,100,2,161,1,100,4,25,0,125,4,124,3,100, - 5,107,2,111,62,124,4,100,5,107,3,83,0,41,6,122, - 141,67,111,110,99,114,101,116,101,32,105,109,112,108,101,109, - 101,110,116,97,116,105,111,110,32,111,102,32,73,110,115,112, - 101,99,116,76,111,97,100,101,114,46,105,115,95,112,97,99, - 107,97,103,101,32,98,121,32,99,104,101,99,107,105,110,103, - 32,105,102,10,32,32,32,32,32,32,32,32,116,104,101,32, - 112,97,116,104,32,114,101,116,117,114,110,101,100,32,98,121, - 32,103,101,116,95,102,105,108,101,110,97,109,101,32,104,97, - 115,32,97,32,102,105,108,101,110,97,109,101,32,111,102,32, - 39,95,95,105,110,105,116,95,95,46,112,121,39,46,114,38, - 0,0,0,114,70,0,0,0,114,72,0,0,0,114,27,0, - 0,0,218,8,95,95,105,110,105,116,95,95,41,4,114,46, - 0,0,0,114,179,0,0,0,114,42,0,0,0,114,40,0, - 0,0,41,5,114,118,0,0,0,114,139,0,0,0,114,96, - 0,0,0,90,13,102,105,108,101,110,97,109,101,95,98,97, - 115,101,90,9,116,97,105,108,95,110,97,109,101,114,3,0, - 0,0,114,3,0,0,0,114,6,0,0,0,114,182,0,0, - 0,255,2,0,0,115,8,0,0,0,0,3,18,1,16,1, - 14,1,122,24,95,76,111,97,100,101,114,66,97,115,105,99, - 115,46,105,115,95,112,97,99,107,97,103,101,99,2,0,0, - 0,0,0,0,0,0,0,0,0,2,0,0,0,1,0,0, - 0,67,0,0,0,115,4,0,0,0,100,1,83,0,169,2, - 122,42,85,115,101,32,100,101,102,97,117,108,116,32,115,101, - 109,97,110,116,105,99,115,32,102,111,114,32,109,111,100,117, - 108,101,32,99,114,101,97,116,105,111,110,46,78,114,3,0, - 0,0,169,2,114,118,0,0,0,114,187,0,0,0,114,3, - 0,0,0,114,3,0,0,0,114,6,0,0,0,218,13,99, - 114,101,97,116,101,95,109,111,100,117,108,101,7,3,0,0, - 115,2,0,0,0,0,1,122,27,95,76,111,97,100,101,114, - 66,97,115,105,99,115,46,99,114,101,97,116,101,95,109,111, - 100,117,108,101,99,2,0,0,0,0,0,0,0,0,0,0, - 0,3,0,0,0,5,0,0,0,67,0,0,0,115,56,0, - 0,0,124,0,160,0,124,1,106,1,161,1,125,2,124,2, - 100,1,107,8,114,36,116,2,100,2,160,3,124,1,106,1, - 161,1,131,1,130,1,116,4,160,5,116,6,124,2,124,1, - 106,7,161,3,1,0,100,1,83,0,41,3,122,19,69,120, - 101,99,117,116,101,32,116,104,101,32,109,111,100,117,108,101, - 46,78,122,52,99,97,110,110,111,116,32,108,111,97,100,32, - 109,111,100,117,108,101,32,123,33,114,125,32,119,104,101,110, - 32,103,101,116,95,99,111,100,101,40,41,32,114,101,116,117, - 114,110,115,32,78,111,110,101,41,8,218,8,103,101,116,95, - 99,111,100,101,114,125,0,0,0,114,117,0,0,0,114,61, - 0,0,0,114,134,0,0,0,218,25,95,99,97,108,108,95, - 119,105,116,104,95,102,114,97,109,101,115,95,114,101,109,111, - 118,101,100,218,4,101,120,101,99,114,131,0,0,0,41,3, - 114,118,0,0,0,218,6,109,111,100,117,108,101,114,164,0, - 0,0,114,3,0,0,0,114,3,0,0,0,114,6,0,0, - 0,218,11,101,120,101,99,95,109,111,100,117,108,101,10,3, - 0,0,115,12,0,0,0,0,2,12,1,8,1,6,1,4, - 255,6,2,122,25,95,76,111,97,100,101,114,66,97,115,105, - 99,115,46,101,120,101,99,95,109,111,100,117,108,101,99,2, - 0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,4, - 0,0,0,67,0,0,0,115,12,0,0,0,116,0,160,1, - 124,0,124,1,161,2,83,0,41,1,122,26,84,104,105,115, - 32,109,111,100,117,108,101,32,105,115,32,100,101,112,114,101, - 99,97,116,101,100,46,41,2,114,134,0,0,0,218,17,95, - 108,111,97,100,95,109,111,100,117,108,101,95,115,104,105,109, - 169,2,114,118,0,0,0,114,139,0,0,0,114,3,0,0, - 0,114,3,0,0,0,114,6,0,0,0,218,11,108,111,97, - 100,95,109,111,100,117,108,101,18,3,0,0,115,2,0,0, - 0,0,2,122,25,95,76,111,97,100,101,114,66,97,115,105, - 99,115,46,108,111,97,100,95,109,111,100,117,108,101,78,41, - 8,114,125,0,0,0,114,124,0,0,0,114,126,0,0,0, - 114,127,0,0,0,114,182,0,0,0,114,212,0,0,0,114, - 217,0,0,0,114,220,0,0,0,114,3,0,0,0,114,3, - 0,0,0,114,3,0,0,0,114,6,0,0,0,114,208,0, - 0,0,250,2,0,0,115,10,0,0,0,8,2,4,3,8, - 8,8,3,8,8,114,208,0,0,0,99,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,64, - 0,0,0,115,74,0,0,0,101,0,90,1,100,0,90,2, - 100,1,100,2,132,0,90,3,100,3,100,4,132,0,90,4, - 100,5,100,6,132,0,90,5,100,7,100,8,132,0,90,6, - 100,9,100,10,132,0,90,7,100,11,100,12,156,1,100,13, - 100,14,132,2,90,8,100,15,100,16,132,0,90,9,100,17, - 83,0,41,18,218,12,83,111,117,114,99,101,76,111,97,100, - 101,114,99,2,0,0,0,0,0,0,0,0,0,0,0,2, - 0,0,0,1,0,0,0,67,0,0,0,115,8,0,0,0, - 116,0,130,1,100,1,83,0,41,2,122,165,79,112,116,105, - 111,110,97,108,32,109,101,116,104,111,100,32,116,104,97,116, - 32,114,101,116,117,114,110,115,32,116,104,101,32,109,111,100, - 105,102,105,99,97,116,105,111,110,32,116,105,109,101,32,40, - 97,110,32,105,110,116,41,32,102,111,114,32,116,104,101,10, - 32,32,32,32,32,32,32,32,115,112,101,99,105,102,105,101, - 100,32,112,97,116,104,32,40,97,32,115,116,114,41,46,10, - 10,32,32,32,32,32,32,32,32,82,97,105,115,101,115,32, - 79,83,69,114,114,111,114,32,119,104,101,110,32,116,104,101, - 32,112,97,116,104,32,99,97,110,110,111,116,32,98,101,32, - 104,97,110,100,108,101,100,46,10,32,32,32,32,32,32,32, - 32,78,41,1,114,49,0,0,0,169,2,114,118,0,0,0, - 114,43,0,0,0,114,3,0,0,0,114,3,0,0,0,114, - 6,0,0,0,218,10,112,97,116,104,95,109,116,105,109,101, - 25,3,0,0,115,2,0,0,0,0,6,122,23,83,111,117, - 114,99,101,76,111,97,100,101,114,46,112,97,116,104,95,109, - 116,105,109,101,99,2,0,0,0,0,0,0,0,0,0,0, - 0,2,0,0,0,4,0,0,0,67,0,0,0,115,14,0, - 0,0,100,1,124,0,160,0,124,1,161,1,105,1,83,0, - 41,2,97,158,1,0,0,79,112,116,105,111,110,97,108,32, - 109,101,116,104,111,100,32,114,101,116,117,114,110,105,110,103, - 32,97,32,109,101,116,97,100,97,116,97,32,100,105,99,116, - 32,102,111,114,32,116,104,101,32,115,112,101,99,105,102,105, - 101,100,10,32,32,32,32,32,32,32,32,112,97,116,104,32, - 40,97,32,115,116,114,41,46,10,10,32,32,32,32,32,32, - 32,32,80,111,115,115,105,98,108,101,32,107,101,121,115,58, - 10,32,32,32,32,32,32,32,32,45,32,39,109,116,105,109, - 101,39,32,40,109,97,110,100,97,116,111,114,121,41,32,105, - 115,32,116,104,101,32,110,117,109,101,114,105,99,32,116,105, - 109,101,115,116,97,109,112,32,111,102,32,108,97,115,116,32, - 115,111,117,114,99,101,10,32,32,32,32,32,32,32,32,32, - 32,99,111,100,101,32,109,111,100,105,102,105,99,97,116,105, - 111,110,59,10,32,32,32,32,32,32,32,32,45,32,39,115, - 105,122,101,39,32,40,111,112,116,105,111,110,97,108,41,32, - 105,115,32,116,104,101,32,115,105,122,101,32,105,110,32,98, - 121,116,101,115,32,111,102,32,116,104,101,32,115,111,117,114, - 99,101,32,99,111,100,101,46,10,10,32,32,32,32,32,32, - 32,32,73,109,112,108,101,109,101,110,116,105,110,103,32,116, - 104,105,115,32,109,101,116,104,111,100,32,97,108,108,111,119, - 115,32,116,104,101,32,108,111,97,100,101,114,32,116,111,32, - 114,101,97,100,32,98,121,116,101,99,111,100,101,32,102,105, - 108,101,115,46,10,32,32,32,32,32,32,32,32,82,97,105, - 115,101,115,32,79,83,69,114,114,111,114,32,119,104,101,110, - 32,116,104,101,32,112,97,116,104,32,99,97,110,110,111,116, - 32,98,101,32,104,97,110,100,108,101,100,46,10,32,32,32, - 32,32,32,32,32,114,169,0,0,0,41,1,114,223,0,0, - 0,114,222,0,0,0,114,3,0,0,0,114,3,0,0,0, - 114,6,0,0,0,218,10,112,97,116,104,95,115,116,97,116, - 115,33,3,0,0,115,2,0,0,0,0,12,122,23,83,111, - 117,114,99,101,76,111,97,100,101,114,46,112,97,116,104,95, - 115,116,97,116,115,99,4,0,0,0,0,0,0,0,0,0, - 0,0,4,0,0,0,4,0,0,0,67,0,0,0,115,12, - 0,0,0,124,0,160,0,124,2,124,3,161,2,83,0,41, - 1,122,228,79,112,116,105,111,110,97,108,32,109,101,116,104, - 111,100,32,119,104,105,99,104,32,119,114,105,116,101,115,32, - 100,97,116,97,32,40,98,121,116,101,115,41,32,116,111,32, - 97,32,102,105,108,101,32,112,97,116,104,32,40,97,32,115, - 116,114,41,46,10,10,32,32,32,32,32,32,32,32,73,109, - 112,108,101,109,101,110,116,105,110,103,32,116,104,105,115,32, - 109,101,116,104,111,100,32,97,108,108,111,119,115,32,102,111, - 114,32,116,104,101,32,119,114,105,116,105,110,103,32,111,102, - 32,98,121,116,101,99,111,100,101,32,102,105,108,101,115,46, - 10,10,32,32,32,32,32,32,32,32,84,104,101,32,115,111, - 117,114,99,101,32,112,97,116,104,32,105,115,32,110,101,101, - 100,101,100,32,105,110,32,111,114,100,101,114,32,116,111,32, - 99,111,114,114,101,99,116,108,121,32,116,114,97,110,115,102, - 101,114,32,112,101,114,109,105,115,115,105,111,110,115,10,32, - 32,32,32,32,32,32,32,41,1,218,8,115,101,116,95,100, - 97,116,97,41,4,114,118,0,0,0,114,107,0,0,0,90, - 10,99,97,99,104,101,95,112,97,116,104,114,25,0,0,0, + 114,101,10,32,32,32,32,114,101,113,117,105,114,101,100,44, + 32,116,104,111,117,103,104,46,41,10,10,32,32,32,32,42, + 110,97,109,101,42,32,105,115,32,116,104,101,32,110,97,109, + 101,32,111,102,32,116,104,101,32,109,111,100,117,108,101,32, + 98,101,105,110,103,32,105,109,112,111,114,116,101,100,46,32, + 73,116,32,105,115,32,117,115,101,100,32,102,111,114,32,108, + 111,103,103,105,110,103,46,10,10,32,32,32,32,42,101,120, + 99,95,100,101,116,97,105,108,115,42,32,105,115,32,97,32, + 100,105,99,116,105,111,110,97,114,121,32,112,97,115,115,101, + 100,32,116,111,32,73,109,112,111,114,116,69,114,114,111,114, + 32,105,102,32,105,116,32,114,97,105,115,101,100,32,102,111, + 114,10,32,32,32,32,105,109,112,114,111,118,101,100,32,100, + 101,98,117,103,103,105,110,103,46,10,10,32,32,32,32,73, + 109,112,111,114,116,69,114,114,111,114,32,105,115,32,114,97, + 105,115,101,100,32,119,104,101,110,32,116,104,101,32,109,97, + 103,105,99,32,110,117,109,98,101,114,32,105,115,32,105,110, + 99,111,114,114,101,99,116,32,111,114,32,119,104,101,110,32, + 116,104,101,32,102,108,97,103,115,10,32,32,32,32,102,105, + 101,108,100,32,105,115,32,105,110,118,97,108,105,100,46,32, + 69,79,70,69,114,114,111,114,32,105,115,32,114,97,105,115, + 101,100,32,119,104,101,110,32,116,104,101,32,100,97,116,97, + 32,105,115,32,102,111,117,110,100,32,116,111,32,98,101,32, + 116,114,117,110,99,97,116,101,100,46,10,10,32,32,32,32, + 78,114,15,0,0,0,122,20,98,97,100,32,109,97,103,105, + 99,32,110,117,109,98,101,114,32,105,110,32,122,2,58,32, + 250,2,123,125,233,16,0,0,0,122,40,114,101,97,99,104, + 101,100,32,69,79,70,32,119,104,105,108,101,32,114,101,97, + 100,105,110,103,32,112,121,99,32,104,101,97,100,101,114,32, + 111,102,32,233,8,0,0,0,233,252,255,255,255,122,14,105, + 110,118,97,108,105,100,32,102,108,97,103,115,32,122,4,32, + 105,110,32,41,7,218,12,77,65,71,73,67,95,78,85,77, + 66,69,82,114,134,0,0,0,218,16,95,118,101,114,98,111, + 115,101,95,109,101,115,115,97,103,101,114,117,0,0,0,114, + 22,0,0,0,218,8,69,79,70,69,114,114,111,114,114,26, + 0,0,0,41,6,114,25,0,0,0,114,116,0,0,0,218, + 11,101,120,99,95,100,101,116,97,105,108,115,90,5,109,97, + 103,105,99,114,92,0,0,0,114,82,0,0,0,114,3,0, + 0,0,114,3,0,0,0,114,6,0,0,0,218,13,95,99, + 108,97,115,115,105,102,121,95,112,121,99,240,1,0,0,115, + 28,0,0,0,0,16,12,1,8,1,16,1,12,1,12,1, + 12,1,10,1,12,1,8,1,16,2,8,1,16,1,12,1, + 114,152,0,0,0,99,5,0,0,0,0,0,0,0,0,0, + 0,0,6,0,0,0,4,0,0,0,67,0,0,0,115,112, + 0,0,0,116,0,124,0,100,1,100,2,133,2,25,0,131, + 1,124,1,100,3,64,0,107,3,114,58,100,4,124,3,155, + 2,157,2,125,5,116,1,160,2,100,5,124,5,161,2,1, + 0,116,3,124,5,102,1,124,4,142,1,130,1,124,2,100, + 6,107,9,114,108,116,0,124,0,100,2,100,7,133,2,25, + 0,131,1,124,2,100,3,64,0,107,3,114,108,116,3,100, + 4,124,3,155,2,157,2,102,1,124,4,142,1,130,1,100, + 6,83,0,41,8,97,7,2,0,0,86,97,108,105,100,97, + 116,101,32,97,32,112,121,99,32,97,103,97,105,110,115,116, + 32,116,104,101,32,115,111,117,114,99,101,32,108,97,115,116, + 45,109,111,100,105,102,105,101,100,32,116,105,109,101,46,10, + 10,32,32,32,32,42,100,97,116,97,42,32,105,115,32,116, + 104,101,32,99,111,110,116,101,110,116,115,32,111,102,32,116, + 104,101,32,112,121,99,32,102,105,108,101,46,32,40,79,110, + 108,121,32,116,104,101,32,102,105,114,115,116,32,49,54,32, + 98,121,116,101,115,32,97,114,101,10,32,32,32,32,114,101, + 113,117,105,114,101,100,46,41,10,10,32,32,32,32,42,115, + 111,117,114,99,101,95,109,116,105,109,101,42,32,105,115,32, + 116,104,101,32,108,97,115,116,32,109,111,100,105,102,105,101, + 100,32,116,105,109,101,115,116,97,109,112,32,111,102,32,116, + 104,101,32,115,111,117,114,99,101,32,102,105,108,101,46,10, + 10,32,32,32,32,42,115,111,117,114,99,101,95,115,105,122, + 101,42,32,105,115,32,78,111,110,101,32,111,114,32,116,104, + 101,32,115,105,122,101,32,111,102,32,116,104,101,32,115,111, + 117,114,99,101,32,102,105,108,101,32,105,110,32,98,121,116, + 101,115,46,10,10,32,32,32,32,42,110,97,109,101,42,32, + 105,115,32,116,104,101,32,110,97,109,101,32,111,102,32,116, + 104,101,32,109,111,100,117,108,101,32,98,101,105,110,103,32, + 105,109,112,111,114,116,101,100,46,32,73,116,32,105,115,32, + 117,115,101,100,32,102,111,114,32,108,111,103,103,105,110,103, + 46,10,10,32,32,32,32,42,101,120,99,95,100,101,116,97, + 105,108,115,42,32,105,115,32,97,32,100,105,99,116,105,111, + 110,97,114,121,32,112,97,115,115,101,100,32,116,111,32,73, + 109,112,111,114,116,69,114,114,111,114,32,105,102,32,105,116, + 32,114,97,105,115,101,100,32,102,111,114,10,32,32,32,32, + 105,109,112,114,111,118,101,100,32,100,101,98,117,103,103,105, + 110,103,46,10,10,32,32,32,32,65,110,32,73,109,112,111, + 114,116,69,114,114,111,114,32,105,115,32,114,97,105,115,101, + 100,32,105,102,32,116,104,101,32,98,121,116,101,99,111,100, + 101,32,105,115,32,115,116,97,108,101,46,10,10,32,32,32, + 32,114,146,0,0,0,233,12,0,0,0,114,14,0,0,0, + 122,22,98,121,116,101,99,111,100,101,32,105,115,32,115,116, + 97,108,101,32,102,111,114,32,114,144,0,0,0,78,114,145, + 0,0,0,41,4,114,26,0,0,0,114,134,0,0,0,114, + 149,0,0,0,114,117,0,0,0,41,6,114,25,0,0,0, + 218,12,115,111,117,114,99,101,95,109,116,105,109,101,218,11, + 115,111,117,114,99,101,95,115,105,122,101,114,116,0,0,0, + 114,151,0,0,0,114,92,0,0,0,114,3,0,0,0,114, + 3,0,0,0,114,6,0,0,0,218,23,95,118,97,108,105, + 100,97,116,101,95,116,105,109,101,115,116,97,109,112,95,112, + 121,99,17,2,0,0,115,16,0,0,0,0,19,24,1,10, + 1,12,1,12,1,8,1,22,255,2,2,114,156,0,0,0, + 99,4,0,0,0,0,0,0,0,0,0,0,0,4,0,0, + 0,3,0,0,0,67,0,0,0,115,38,0,0,0,124,0, + 100,1,100,2,133,2,25,0,124,1,107,3,114,34,116,0, + 100,3,124,2,155,2,157,2,102,1,124,3,142,1,130,1, + 100,4,83,0,41,5,97,243,1,0,0,86,97,108,105,100, + 97,116,101,32,97,32,104,97,115,104,45,98,97,115,101,100, + 32,112,121,99,32,98,121,32,99,104,101,99,107,105,110,103, + 32,116,104,101,32,114,101,97,108,32,115,111,117,114,99,101, + 32,104,97,115,104,32,97,103,97,105,110,115,116,32,116,104, + 101,32,111,110,101,32,105,110,10,32,32,32,32,116,104,101, + 32,112,121,99,32,104,101,97,100,101,114,46,10,10,32,32, + 32,32,42,100,97,116,97,42,32,105,115,32,116,104,101,32, + 99,111,110,116,101,110,116,115,32,111,102,32,116,104,101,32, + 112,121,99,32,102,105,108,101,46,32,40,79,110,108,121,32, + 116,104,101,32,102,105,114,115,116,32,49,54,32,98,121,116, + 101,115,32,97,114,101,10,32,32,32,32,114,101,113,117,105, + 114,101,100,46,41,10,10,32,32,32,32,42,115,111,117,114, + 99,101,95,104,97,115,104,42,32,105,115,32,116,104,101,32, + 105,109,112,111,114,116,108,105,98,46,117,116,105,108,46,115, + 111,117,114,99,101,95,104,97,115,104,40,41,32,111,102,32, + 116,104,101,32,115,111,117,114,99,101,32,102,105,108,101,46, + 10,10,32,32,32,32,42,110,97,109,101,42,32,105,115,32, + 116,104,101,32,110,97,109,101,32,111,102,32,116,104,101,32, + 109,111,100,117,108,101,32,98,101,105,110,103,32,105,109,112, + 111,114,116,101,100,46,32,73,116,32,105,115,32,117,115,101, + 100,32,102,111,114,32,108,111,103,103,105,110,103,46,10,10, + 32,32,32,32,42,101,120,99,95,100,101,116,97,105,108,115, + 42,32,105,115,32,97,32,100,105,99,116,105,111,110,97,114, + 121,32,112,97,115,115,101,100,32,116,111,32,73,109,112,111, + 114,116,69,114,114,111,114,32,105,102,32,105,116,32,114,97, + 105,115,101,100,32,102,111,114,10,32,32,32,32,105,109,112, + 114,111,118,101,100,32,100,101,98,117,103,103,105,110,103,46, + 10,10,32,32,32,32,65,110,32,73,109,112,111,114,116,69, + 114,114,111,114,32,105,115,32,114,97,105,115,101,100,32,105, + 102,32,116,104,101,32,98,121,116,101,99,111,100,101,32,105, + 115,32,115,116,97,108,101,46,10,10,32,32,32,32,114,146, + 0,0,0,114,145,0,0,0,122,46,104,97,115,104,32,105, + 110,32,98,121,116,101,99,111,100,101,32,100,111,101,115,110, + 39,116,32,109,97,116,99,104,32,104,97,115,104,32,111,102, + 32,115,111,117,114,99,101,32,78,41,1,114,117,0,0,0, + 41,4,114,25,0,0,0,218,11,115,111,117,114,99,101,95, + 104,97,115,104,114,116,0,0,0,114,151,0,0,0,114,3, + 0,0,0,114,3,0,0,0,114,6,0,0,0,218,18,95, + 118,97,108,105,100,97,116,101,95,104,97,115,104,95,112,121, + 99,45,2,0,0,115,12,0,0,0,0,17,16,1,2,1, + 8,255,2,2,2,254,114,158,0,0,0,99,4,0,0,0, + 0,0,0,0,0,0,0,0,5,0,0,0,5,0,0,0, + 67,0,0,0,115,80,0,0,0,116,0,160,1,124,0,161, + 1,125,4,116,2,124,4,116,3,131,2,114,56,116,4,160, + 5,100,1,124,2,161,2,1,0,124,3,100,2,107,9,114, + 52,116,6,160,7,124,4,124,3,161,2,1,0,124,4,83, + 0,116,8,100,3,160,9,124,2,161,1,124,1,124,2,100, + 4,141,3,130,1,100,2,83,0,41,5,122,35,67,111,109, + 112,105,108,101,32,98,121,116,101,99,111,100,101,32,97,115, + 32,102,111,117,110,100,32,105,110,32,97,32,112,121,99,46, + 122,21,99,111,100,101,32,111,98,106,101,99,116,32,102,114, + 111,109,32,123,33,114,125,78,122,23,78,111,110,45,99,111, + 100,101,32,111,98,106,101,99,116,32,105,110,32,123,33,114, + 125,169,2,114,116,0,0,0,114,43,0,0,0,41,10,218, + 7,109,97,114,115,104,97,108,90,5,108,111,97,100,115,218, + 10,105,115,105,110,115,116,97,110,99,101,218,10,95,99,111, + 100,101,95,116,121,112,101,114,134,0,0,0,114,149,0,0, + 0,218,4,95,105,109,112,90,16,95,102,105,120,95,99,111, + 95,102,105,108,101,110,97,109,101,114,117,0,0,0,114,61, + 0,0,0,41,5,114,25,0,0,0,114,116,0,0,0,114, + 106,0,0,0,114,107,0,0,0,218,4,99,111,100,101,114, + 3,0,0,0,114,3,0,0,0,114,6,0,0,0,218,17, + 95,99,111,109,112,105,108,101,95,98,121,116,101,99,111,100, + 101,69,2,0,0,115,20,0,0,0,0,2,10,1,10,1, + 12,1,8,1,12,1,4,2,10,1,2,0,2,255,114,165, + 0,0,0,114,72,0,0,0,99,3,0,0,0,0,0,0, + 0,0,0,0,0,4,0,0,0,5,0,0,0,67,0,0, + 0,115,70,0,0,0,116,0,116,1,131,1,125,3,124,3, + 160,2,116,3,100,1,131,1,161,1,1,0,124,3,160,2, + 116,3,124,1,131,1,161,1,1,0,124,3,160,2,116,3, + 124,2,131,1,161,1,1,0,124,3,160,2,116,4,160,5, + 124,0,161,1,161,1,1,0,124,3,83,0,41,2,122,43, + 80,114,111,100,117,99,101,32,116,104,101,32,100,97,116,97, + 32,102,111,114,32,97,32,116,105,109,101,115,116,97,109,112, + 45,98,97,115,101,100,32,112,121,99,46,114,72,0,0,0, + 41,6,218,9,98,121,116,101,97,114,114,97,121,114,148,0, + 0,0,218,6,101,120,116,101,110,100,114,20,0,0,0,114, + 160,0,0,0,218,5,100,117,109,112,115,41,4,114,164,0, + 0,0,218,5,109,116,105,109,101,114,155,0,0,0,114,25, + 0,0,0,114,3,0,0,0,114,3,0,0,0,114,6,0, + 0,0,218,22,95,99,111,100,101,95,116,111,95,116,105,109, + 101,115,116,97,109,112,95,112,121,99,82,2,0,0,115,12, + 0,0,0,0,2,8,1,14,1,14,1,14,1,16,1,114, + 170,0,0,0,84,99,3,0,0,0,0,0,0,0,0,0, + 0,0,5,0,0,0,5,0,0,0,67,0,0,0,115,80, + 0,0,0,116,0,116,1,131,1,125,3,100,1,124,2,100, + 1,62,0,66,0,125,4,124,3,160,2,116,3,124,4,131, + 1,161,1,1,0,116,4,124,1,131,1,100,2,107,2,115, + 50,74,0,130,1,124,3,160,2,124,1,161,1,1,0,124, + 3,160,2,116,5,160,6,124,0,161,1,161,1,1,0,124, + 3,83,0,41,3,122,38,80,114,111,100,117,99,101,32,116, + 104,101,32,100,97,116,97,32,102,111,114,32,97,32,104,97, + 115,104,45,98,97,115,101,100,32,112,121,99,46,114,38,0, + 0,0,114,146,0,0,0,41,7,114,166,0,0,0,114,148, + 0,0,0,114,167,0,0,0,114,20,0,0,0,114,22,0, + 0,0,114,160,0,0,0,114,168,0,0,0,41,5,114,164, + 0,0,0,114,157,0,0,0,90,7,99,104,101,99,107,101, + 100,114,25,0,0,0,114,82,0,0,0,114,3,0,0,0, + 114,3,0,0,0,114,6,0,0,0,218,17,95,99,111,100, + 101,95,116,111,95,104,97,115,104,95,112,121,99,92,2,0, + 0,115,14,0,0,0,0,2,8,1,12,1,14,1,16,1, + 10,1,16,1,114,171,0,0,0,99,1,0,0,0,0,0, + 0,0,0,0,0,0,5,0,0,0,6,0,0,0,67,0, + 0,0,115,62,0,0,0,100,1,100,2,108,0,125,1,116, + 1,160,2,124,0,161,1,106,3,125,2,124,1,160,4,124, + 2,161,1,125,3,116,1,160,5,100,2,100,3,161,2,125, + 4,124,4,160,6,124,0,160,6,124,3,100,1,25,0,161, + 1,161,1,83,0,41,4,122,121,68,101,99,111,100,101,32, + 98,121,116,101,115,32,114,101,112,114,101,115,101,110,116,105, + 110,103,32,115,111,117,114,99,101,32,99,111,100,101,32,97, + 110,100,32,114,101,116,117,114,110,32,116,104,101,32,115,116, + 114,105,110,103,46,10,10,32,32,32,32,85,110,105,118,101, + 114,115,97,108,32,110,101,119,108,105,110,101,32,115,117,112, + 112,111,114,116,32,105,115,32,117,115,101,100,32,105,110,32, + 116,104,101,32,100,101,99,111,100,105,110,103,46,10,32,32, + 32,32,114,72,0,0,0,78,84,41,7,218,8,116,111,107, + 101,110,105,122,101,114,63,0,0,0,90,7,66,121,116,101, + 115,73,79,90,8,114,101,97,100,108,105,110,101,90,15,100, + 101,116,101,99,116,95,101,110,99,111,100,105,110,103,90,25, + 73,110,99,114,101,109,101,110,116,97,108,78,101,119,108,105, + 110,101,68,101,99,111,100,101,114,218,6,100,101,99,111,100, + 101,41,5,218,12,115,111,117,114,99,101,95,98,121,116,101, + 115,114,172,0,0,0,90,21,115,111,117,114,99,101,95,98, + 121,116,101,115,95,114,101,97,100,108,105,110,101,218,8,101, + 110,99,111,100,105,110,103,90,15,110,101,119,108,105,110,101, + 95,100,101,99,111,100,101,114,114,3,0,0,0,114,3,0, + 0,0,114,6,0,0,0,218,13,100,101,99,111,100,101,95, + 115,111,117,114,99,101,103,2,0,0,115,10,0,0,0,0, + 5,8,1,12,1,10,1,12,1,114,176,0,0,0,169,2, + 114,140,0,0,0,218,26,115,117,98,109,111,100,117,108,101, + 95,115,101,97,114,99,104,95,108,111,99,97,116,105,111,110, + 115,99,2,0,0,0,0,0,0,0,2,0,0,0,9,0, + 0,0,8,0,0,0,67,0,0,0,115,16,1,0,0,124, + 1,100,1,107,8,114,60,100,2,125,1,116,0,124,2,100, + 3,131,2,114,70,122,14,124,2,160,1,124,0,161,1,125, + 1,87,0,113,70,4,0,116,2,107,10,114,56,1,0,1, + 0,1,0,89,0,113,70,48,0,110,10,116,3,160,4,124, + 1,161,1,125,1,116,5,106,6,124,0,124,2,124,1,100, + 4,141,3,125,4,100,5,124,4,95,7,124,2,100,1,107, + 8,114,154,116,8,131,0,68,0,93,42,92,2,125,5,125, + 6,124,1,160,9,116,10,124,6,131,1,161,1,114,106,124, + 5,124,0,124,1,131,2,125,2,124,2,124,4,95,11,1, + 0,113,154,113,106,100,1,83,0,124,3,116,12,107,8,114, + 220,116,0,124,2,100,6,131,2,114,226,122,14,124,2,160, + 13,124,0,161,1,125,7,87,0,110,20,4,0,116,2,107, + 10,114,206,1,0,1,0,1,0,89,0,113,226,48,0,124, + 7,114,226,103,0,124,4,95,14,110,6,124,3,124,4,95, + 14,124,4,106,14,103,0,107,2,144,1,114,12,124,1,144, + 1,114,12,116,15,124,1,131,1,100,7,25,0,125,8,124, + 4,106,14,160,16,124,8,161,1,1,0,124,4,83,0,41, + 8,97,61,1,0,0,82,101,116,117,114,110,32,97,32,109, + 111,100,117,108,101,32,115,112,101,99,32,98,97,115,101,100, + 32,111,110,32,97,32,102,105,108,101,32,108,111,99,97,116, + 105,111,110,46,10,10,32,32,32,32,84,111,32,105,110,100, + 105,99,97,116,101,32,116,104,97,116,32,116,104,101,32,109, + 111,100,117,108,101,32,105,115,32,97,32,112,97,99,107,97, + 103,101,44,32,115,101,116,10,32,32,32,32,115,117,98,109, + 111,100,117,108,101,95,115,101,97,114,99,104,95,108,111,99, + 97,116,105,111,110,115,32,116,111,32,97,32,108,105,115,116, + 32,111,102,32,100,105,114,101,99,116,111,114,121,32,112,97, + 116,104,115,46,32,32,65,110,10,32,32,32,32,101,109,112, + 116,121,32,108,105,115,116,32,105,115,32,115,117,102,102,105, + 99,105,101,110,116,44,32,116,104,111,117,103,104,32,105,116, + 115,32,110,111,116,32,111,116,104,101,114,119,105,115,101,32, + 117,115,101,102,117,108,32,116,111,32,116,104,101,10,32,32, + 32,32,105,109,112,111,114,116,32,115,121,115,116,101,109,46, + 10,10,32,32,32,32,84,104,101,32,108,111,97,100,101,114, + 32,109,117,115,116,32,116,97,107,101,32,97,32,115,112,101, + 99,32,97,115,32,105,116,115,32,111,110,108,121,32,95,95, + 105,110,105,116,95,95,40,41,32,97,114,103,46,10,10,32, + 32,32,32,78,122,9,60,117,110,107,110,111,119,110,62,218, + 12,103,101,116,95,102,105,108,101,110,97,109,101,169,1,218, + 6,111,114,105,103,105,110,84,218,10,105,115,95,112,97,99, + 107,97,103,101,114,72,0,0,0,41,17,114,128,0,0,0, + 114,179,0,0,0,114,117,0,0,0,114,2,0,0,0,114, + 78,0,0,0,114,134,0,0,0,218,10,77,111,100,117,108, + 101,83,112,101,99,90,13,95,115,101,116,95,102,105,108,101, + 97,116,116,114,218,27,95,103,101,116,95,115,117,112,112,111, + 114,116,101,100,95,102,105,108,101,95,108,111,97,100,101,114, + 115,114,110,0,0,0,114,111,0,0,0,114,140,0,0,0, + 218,9,95,80,79,80,85,76,65,84,69,114,182,0,0,0, + 114,178,0,0,0,114,46,0,0,0,218,6,97,112,112,101, + 110,100,41,9,114,116,0,0,0,90,8,108,111,99,97,116, + 105,111,110,114,140,0,0,0,114,178,0,0,0,218,4,115, + 112,101,99,218,12,108,111,97,100,101,114,95,99,108,97,115, + 115,218,8,115,117,102,102,105,120,101,115,114,182,0,0,0, + 90,7,100,105,114,110,97,109,101,114,3,0,0,0,114,3, + 0,0,0,114,6,0,0,0,218,23,115,112,101,99,95,102, + 114,111,109,95,102,105,108,101,95,108,111,99,97,116,105,111, + 110,120,2,0,0,115,62,0,0,0,0,12,8,4,4,1, + 10,2,2,1,14,1,14,1,8,2,10,8,16,1,6,3, + 8,1,14,1,14,1,10,1,6,1,6,2,4,3,8,2, + 10,1,2,1,14,1,14,1,6,2,4,1,8,2,6,1, + 12,1,6,1,12,1,12,2,114,190,0,0,0,99,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0, + 0,0,64,0,0,0,115,80,0,0,0,101,0,90,1,100, + 0,90,2,100,1,90,3,100,2,90,4,100,3,90,5,100, + 4,90,6,101,7,100,5,100,6,132,0,131,1,90,8,101, + 7,100,7,100,8,132,0,131,1,90,9,101,7,100,14,100, + 10,100,11,132,1,131,1,90,10,101,7,100,15,100,12,100, + 13,132,1,131,1,90,11,100,9,83,0,41,16,218,21,87, + 105,110,100,111,119,115,82,101,103,105,115,116,114,121,70,105, + 110,100,101,114,122,62,77,101,116,97,32,112,97,116,104,32, + 102,105,110,100,101,114,32,102,111,114,32,109,111,100,117,108, + 101,115,32,100,101,99,108,97,114,101,100,32,105,110,32,116, + 104,101,32,87,105,110,100,111,119,115,32,114,101,103,105,115, + 116,114,121,46,122,59,83,111,102,116,119,97,114,101,92,80, + 121,116,104,111,110,92,80,121,116,104,111,110,67,111,114,101, + 92,123,115,121,115,95,118,101,114,115,105,111,110,125,92,77, + 111,100,117,108,101,115,92,123,102,117,108,108,110,97,109,101, + 125,122,65,83,111,102,116,119,97,114,101,92,80,121,116,104, + 111,110,92,80,121,116,104,111,110,67,111,114,101,92,123,115, + 121,115,95,118,101,114,115,105,111,110,125,92,77,111,100,117, + 108,101,115,92,123,102,117,108,108,110,97,109,101,125,92,68, + 101,98,117,103,70,99,2,0,0,0,0,0,0,0,0,0, + 0,0,2,0,0,0,8,0,0,0,67,0,0,0,115,56, + 0,0,0,122,16,116,0,160,1,116,0,106,2,124,1,161, + 2,87,0,83,0,4,0,116,3,107,10,114,50,1,0,1, + 0,1,0,116,0,160,1,116,0,106,4,124,1,161,2,6, + 0,89,0,83,0,48,0,100,0,83,0,114,109,0,0,0, + 41,5,218,7,95,119,105,110,114,101,103,90,7,79,112,101, + 110,75,101,121,90,17,72,75,69,89,95,67,85,82,82,69, + 78,84,95,85,83,69,82,114,49,0,0,0,90,18,72,75, + 69,89,95,76,79,67,65,76,95,77,65,67,72,73,78,69, + 41,2,218,3,99,108,115,114,5,0,0,0,114,3,0,0, + 0,114,3,0,0,0,114,6,0,0,0,218,14,95,111,112, + 101,110,95,114,101,103,105,115,116,114,121,200,2,0,0,115, + 8,0,0,0,0,2,2,1,16,1,14,1,122,36,87,105, + 110,100,111,119,115,82,101,103,105,115,116,114,121,70,105,110, + 100,101,114,46,95,111,112,101,110,95,114,101,103,105,115,116, + 114,121,99,2,0,0,0,0,0,0,0,0,0,0,0,6, + 0,0,0,8,0,0,0,67,0,0,0,115,134,0,0,0, + 124,0,106,0,114,14,124,0,106,1,125,2,110,6,124,0, + 106,2,125,2,124,2,106,3,124,1,100,1,116,4,106,5, + 100,0,100,2,133,2,25,0,22,0,100,3,141,2,125,3, + 122,58,124,0,160,6,124,3,161,1,143,28,125,4,116,7, + 160,8,124,4,100,4,161,2,125,5,87,0,100,0,4,0, + 4,0,131,3,1,0,110,16,49,0,115,94,48,0,1,0, + 1,0,1,0,89,0,1,0,87,0,110,22,4,0,116,9, + 107,10,114,128,1,0,1,0,1,0,89,0,100,0,83,0, + 48,0,124,5,83,0,41,5,78,122,5,37,100,46,37,100, + 114,27,0,0,0,41,2,114,139,0,0,0,90,11,115,121, + 115,95,118,101,114,115,105,111,110,114,39,0,0,0,41,10, + 218,11,68,69,66,85,71,95,66,85,73,76,68,218,18,82, + 69,71,73,83,84,82,89,95,75,69,89,95,68,69,66,85, + 71,218,12,82,69,71,73,83,84,82,89,95,75,69,89,114, + 61,0,0,0,114,8,0,0,0,218,12,118,101,114,115,105, + 111,110,95,105,110,102,111,114,194,0,0,0,114,192,0,0, + 0,90,10,81,117,101,114,121,86,97,108,117,101,114,49,0, + 0,0,41,6,114,193,0,0,0,114,139,0,0,0,90,12, + 114,101,103,105,115,116,114,121,95,107,101,121,114,5,0,0, + 0,90,4,104,107,101,121,218,8,102,105,108,101,112,97,116, + 104,114,3,0,0,0,114,3,0,0,0,114,6,0,0,0, + 218,16,95,115,101,97,114,99,104,95,114,101,103,105,115,116, + 114,121,207,2,0,0,115,24,0,0,0,0,2,6,1,8, + 2,6,1,6,1,16,255,6,2,2,1,12,1,46,1,14, + 1,8,1,122,38,87,105,110,100,111,119,115,82,101,103,105, + 115,116,114,121,70,105,110,100,101,114,46,95,115,101,97,114, + 99,104,95,114,101,103,105,115,116,114,121,78,99,4,0,0, + 0,0,0,0,0,0,0,0,0,8,0,0,0,8,0,0, + 0,67,0,0,0,115,122,0,0,0,124,0,160,0,124,1, + 161,1,125,4,124,4,100,0,107,8,114,22,100,0,83,0, + 122,12,116,1,124,4,131,1,1,0,87,0,110,22,4,0, + 116,2,107,10,114,56,1,0,1,0,1,0,89,0,100,0, + 83,0,48,0,116,3,131,0,68,0,93,52,92,2,125,5, + 125,6,124,4,160,4,116,5,124,6,131,1,161,1,114,64, + 116,6,106,7,124,1,124,5,124,1,124,4,131,2,124,4, + 100,1,141,3,125,7,124,7,2,0,1,0,83,0,113,64, + 100,0,83,0,41,2,78,114,180,0,0,0,41,8,114,200, + 0,0,0,114,48,0,0,0,114,49,0,0,0,114,184,0, + 0,0,114,110,0,0,0,114,111,0,0,0,114,134,0,0, + 0,218,16,115,112,101,99,95,102,114,111,109,95,108,111,97, + 100,101,114,41,8,114,193,0,0,0,114,139,0,0,0,114, + 43,0,0,0,218,6,116,97,114,103,101,116,114,199,0,0, + 0,114,140,0,0,0,114,189,0,0,0,114,187,0,0,0, 114,3,0,0,0,114,3,0,0,0,114,6,0,0,0,218, - 15,95,99,97,99,104,101,95,98,121,116,101,99,111,100,101, - 47,3,0,0,115,2,0,0,0,0,8,122,28,83,111,117, - 114,99,101,76,111,97,100,101,114,46,95,99,97,99,104,101, - 95,98,121,116,101,99,111,100,101,99,3,0,0,0,0,0, - 0,0,0,0,0,0,3,0,0,0,1,0,0,0,67,0, - 0,0,115,4,0,0,0,100,1,83,0,41,2,122,150,79, - 112,116,105,111,110,97,108,32,109,101,116,104,111,100,32,119, - 104,105,99,104,32,119,114,105,116,101,115,32,100,97,116,97, - 32,40,98,121,116,101,115,41,32,116,111,32,97,32,102,105, - 108,101,32,112,97,116,104,32,40,97,32,115,116,114,41,46, - 10,10,32,32,32,32,32,32,32,32,73,109,112,108,101,109, - 101,110,116,105,110,103,32,116,104,105,115,32,109,101,116,104, - 111,100,32,97,108,108,111,119,115,32,102,111,114,32,116,104, - 101,32,119,114,105,116,105,110,103,32,111,102,32,98,121,116, - 101,99,111,100,101,32,102,105,108,101,115,46,10,32,32,32, - 32,32,32,32,32,78,114,3,0,0,0,41,3,114,118,0, - 0,0,114,43,0,0,0,114,25,0,0,0,114,3,0,0, - 0,114,3,0,0,0,114,6,0,0,0,114,225,0,0,0, - 57,3,0,0,115,2,0,0,0,0,1,122,21,83,111,117, - 114,99,101,76,111,97,100,101,114,46,115,101,116,95,100,97, - 116,97,99,2,0,0,0,0,0,0,0,0,0,0,0,5, - 0,0,0,10,0,0,0,67,0,0,0,115,82,0,0,0, - 124,0,160,0,124,1,161,1,125,2,122,14,124,0,160,1, - 124,2,161,1,125,3,87,0,110,48,4,0,116,2,107,10, - 114,72,1,0,125,4,1,0,122,18,116,3,100,1,124,1, - 100,2,141,2,124,4,130,2,87,0,53,0,100,3,125,4, - 126,4,88,0,89,0,110,2,88,0,116,4,124,3,131,1, - 83,0,41,4,122,52,67,111,110,99,114,101,116,101,32,105, - 109,112,108,101,109,101,110,116,97,116,105,111,110,32,111,102, - 32,73,110,115,112,101,99,116,76,111,97,100,101,114,46,103, - 101,116,95,115,111,117,114,99,101,46,122,39,115,111,117,114, - 99,101,32,110,111,116,32,97,118,97,105,108,97,98,108,101, - 32,116,104,114,111,117,103,104,32,103,101,116,95,100,97,116, - 97,40,41,114,115,0,0,0,78,41,5,114,179,0,0,0, - 218,8,103,101,116,95,100,97,116,97,114,49,0,0,0,114, - 117,0,0,0,114,176,0,0,0,41,5,114,118,0,0,0, - 114,139,0,0,0,114,43,0,0,0,114,174,0,0,0,218, - 3,101,120,99,114,3,0,0,0,114,3,0,0,0,114,6, - 0,0,0,218,10,103,101,116,95,115,111,117,114,99,101,64, - 3,0,0,115,20,0,0,0,0,2,10,1,2,1,14,1, - 16,1,4,1,2,255,4,1,2,255,20,2,122,23,83,111, - 117,114,99,101,76,111,97,100,101,114,46,103,101,116,95,115, - 111,117,114,99,101,114,104,0,0,0,41,1,218,9,95,111, - 112,116,105,109,105,122,101,99,3,0,0,0,0,0,0,0, - 1,0,0,0,4,0,0,0,8,0,0,0,67,0,0,0, - 115,22,0,0,0,116,0,106,1,116,2,124,1,124,2,100, - 1,100,2,124,3,100,3,141,6,83,0,41,4,122,130,82, - 101,116,117,114,110,32,116,104,101,32,99,111,100,101,32,111, - 98,106,101,99,116,32,99,111,109,112,105,108,101,100,32,102, - 114,111,109,32,115,111,117,114,99,101,46,10,10,32,32,32, - 32,32,32,32,32,84,104,101,32,39,100,97,116,97,39,32, - 97,114,103,117,109,101,110,116,32,99,97,110,32,98,101,32, - 97,110,121,32,111,98,106,101,99,116,32,116,121,112,101,32, - 116,104,97,116,32,99,111,109,112,105,108,101,40,41,32,115, - 117,112,112,111,114,116,115,46,10,32,32,32,32,32,32,32, - 32,114,215,0,0,0,84,41,2,218,12,100,111,110,116,95, - 105,110,104,101,114,105,116,114,83,0,0,0,41,3,114,134, - 0,0,0,114,214,0,0,0,218,7,99,111,109,112,105,108, - 101,41,4,114,118,0,0,0,114,25,0,0,0,114,43,0, - 0,0,114,230,0,0,0,114,3,0,0,0,114,3,0,0, - 0,114,6,0,0,0,218,14,115,111,117,114,99,101,95,116, - 111,95,99,111,100,101,74,3,0,0,115,8,0,0,0,0, - 5,12,1,2,0,2,255,122,27,83,111,117,114,99,101,76, - 111,97,100,101,114,46,115,111,117,114,99,101,95,116,111,95, - 99,111,100,101,99,2,0,0,0,0,0,0,0,0,0,0, - 0,15,0,0,0,9,0,0,0,67,0,0,0,115,34,2, - 0,0,124,0,160,0,124,1,161,1,125,2,100,1,125,3, - 100,1,125,4,100,1,125,5,100,2,125,6,100,3,125,7, - 122,12,116,1,124,2,131,1,125,8,87,0,110,26,4,0, - 116,2,107,10,114,68,1,0,1,0,1,0,100,1,125,8, - 89,0,144,1,110,48,88,0,122,14,124,0,160,3,124,2, - 161,1,125,9,87,0,110,22,4,0,116,4,107,10,114,106, - 1,0,1,0,1,0,89,0,144,1,110,10,88,0,116,5, - 124,9,100,4,25,0,131,1,125,3,122,14,124,0,160,6, - 124,8,161,1,125,10,87,0,110,20,4,0,116,4,107,10, - 114,154,1,0,1,0,1,0,89,0,110,218,88,0,124,1, - 124,8,100,5,156,2,125,11,122,148,116,7,124,10,124,1, - 124,11,131,3,125,12,116,8,124,10,131,1,100,6,100,1, - 133,2,25,0,125,13,124,12,100,7,64,0,100,8,107,3, - 125,6,124,6,144,1,114,36,124,12,100,9,64,0,100,8, - 107,3,125,7,116,9,106,10,100,10,107,3,144,1,114,56, - 124,7,115,254,116,9,106,10,100,11,107,2,144,1,114,56, - 124,0,160,6,124,2,161,1,125,4,116,9,160,11,116,12, - 124,4,161,2,125,5,116,13,124,10,124,5,124,1,124,11, - 131,4,1,0,110,20,116,14,124,10,124,3,124,9,100,12, - 25,0,124,1,124,11,131,5,1,0,87,0,110,26,4,0, - 116,15,116,16,102,2,107,10,144,1,114,84,1,0,1,0, - 1,0,89,0,110,32,88,0,116,17,160,18,100,13,124,8, - 124,2,161,3,1,0,116,19,124,13,124,1,124,8,124,2, - 100,14,141,4,83,0,124,4,100,1,107,8,144,1,114,136, - 124,0,160,6,124,2,161,1,125,4,124,0,160,20,124,4, - 124,2,161,2,125,14,116,17,160,18,100,15,124,2,161,2, - 1,0,116,21,106,22,144,2,115,30,124,8,100,1,107,9, - 144,2,114,30,124,3,100,1,107,9,144,2,114,30,124,6, - 144,1,114,228,124,5,100,1,107,8,144,1,114,214,116,9, - 160,11,124,4,161,1,125,5,116,23,124,14,124,5,124,7, - 131,3,125,10,110,16,116,24,124,14,124,3,116,25,124,4, - 131,1,131,3,125,10,122,18,124,0,160,26,124,2,124,8, - 124,10,161,3,1,0,87,0,110,22,4,0,116,2,107,10, - 144,2,114,28,1,0,1,0,1,0,89,0,110,2,88,0, - 124,14,83,0,41,16,122,190,67,111,110,99,114,101,116,101, - 32,105,109,112,108,101,109,101,110,116,97,116,105,111,110,32, - 111,102,32,73,110,115,112,101,99,116,76,111,97,100,101,114, - 46,103,101,116,95,99,111,100,101,46,10,10,32,32,32,32, - 32,32,32,32,82,101,97,100,105,110,103,32,111,102,32,98, - 121,116,101,99,111,100,101,32,114,101,113,117,105,114,101,115, - 32,112,97,116,104,95,115,116,97,116,115,32,116,111,32,98, - 101,32,105,109,112,108,101,109,101,110,116,101,100,46,32,84, - 111,32,119,114,105,116,101,10,32,32,32,32,32,32,32,32, - 98,121,116,101,99,111,100,101,44,32,115,101,116,95,100,97, - 116,97,32,109,117,115,116,32,97,108,115,111,32,98,101,32, - 105,109,112,108,101,109,101,110,116,101,100,46,10,10,32,32, - 32,32,32,32,32,32,78,70,84,114,169,0,0,0,114,159, - 0,0,0,114,145,0,0,0,114,38,0,0,0,114,72,0, - 0,0,114,27,0,0,0,90,5,110,101,118,101,114,90,6, - 97,108,119,97,121,115,218,4,115,105,122,101,122,13,123,125, - 32,109,97,116,99,104,101,115,32,123,125,41,3,114,116,0, - 0,0,114,106,0,0,0,114,107,0,0,0,122,19,99,111, - 100,101,32,111,98,106,101,99,116,32,102,114,111,109,32,123, - 125,41,27,114,179,0,0,0,114,97,0,0,0,114,81,0, - 0,0,114,224,0,0,0,114,49,0,0,0,114,17,0,0, - 0,114,227,0,0,0,114,152,0,0,0,218,10,109,101,109, - 111,114,121,118,105,101,119,114,163,0,0,0,90,21,99,104, - 101,99,107,95,104,97,115,104,95,98,97,115,101,100,95,112, - 121,99,115,114,157,0,0,0,218,17,95,82,65,87,95,77, - 65,71,73,67,95,78,85,77,66,69,82,114,158,0,0,0, - 114,156,0,0,0,114,117,0,0,0,114,150,0,0,0,114, - 134,0,0,0,114,149,0,0,0,114,165,0,0,0,114,233, - 0,0,0,114,8,0,0,0,218,19,100,111,110,116,95,119, - 114,105,116,101,95,98,121,116,101,99,111,100,101,114,171,0, - 0,0,114,170,0,0,0,114,22,0,0,0,114,226,0,0, - 0,41,15,114,118,0,0,0,114,139,0,0,0,114,107,0, - 0,0,114,154,0,0,0,114,174,0,0,0,114,157,0,0, - 0,90,10,104,97,115,104,95,98,97,115,101,100,90,12,99, - 104,101,99,107,95,115,111,117,114,99,101,114,106,0,0,0, - 218,2,115,116,114,25,0,0,0,114,151,0,0,0,114,82, - 0,0,0,90,10,98,121,116,101,115,95,100,97,116,97,90, - 11,99,111,100,101,95,111,98,106,101,99,116,114,3,0,0, - 0,114,3,0,0,0,114,6,0,0,0,114,213,0,0,0, - 82,3,0,0,115,152,0,0,0,0,7,10,1,4,1,4, - 1,4,1,4,1,4,1,2,1,12,1,14,1,12,2,2, - 1,14,1,14,1,8,2,12,1,2,1,14,1,14,1,6, - 3,2,1,2,254,6,4,2,1,12,1,16,1,12,1,6, - 1,12,1,12,1,2,255,2,2,8,254,4,3,10,1,4, - 1,2,1,2,254,4,4,8,1,2,255,6,3,2,1,2, - 1,2,1,6,1,2,1,2,251,8,7,20,1,6,2,8, - 1,2,255,4,2,6,1,2,1,2,254,6,3,10,1,10, - 1,12,1,12,1,18,1,6,255,4,2,6,1,10,1,10, - 1,14,2,6,1,6,255,4,2,2,1,18,1,16,1,6, - 1,122,21,83,111,117,114,99,101,76,111,97,100,101,114,46, - 103,101,116,95,99,111,100,101,78,41,10,114,125,0,0,0, - 114,124,0,0,0,114,126,0,0,0,114,223,0,0,0,114, - 224,0,0,0,114,226,0,0,0,114,225,0,0,0,114,229, - 0,0,0,114,233,0,0,0,114,213,0,0,0,114,3,0, - 0,0,114,3,0,0,0,114,3,0,0,0,114,6,0,0, - 0,114,221,0,0,0,23,3,0,0,115,14,0,0,0,8, - 2,8,8,8,14,8,10,8,7,8,10,14,8,114,221,0, - 0,0,99,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,4,0,0,0,0,0,0,0,115,124,0,0,0, - 101,0,90,1,100,0,90,2,100,1,90,3,100,2,100,3, - 132,0,90,4,100,4,100,5,132,0,90,5,100,6,100,7, - 132,0,90,6,101,7,135,0,102,1,100,8,100,9,132,8, - 131,1,90,8,101,7,100,10,100,11,132,0,131,1,90,9, - 100,12,100,13,132,0,90,10,101,7,100,14,100,15,132,0, - 131,1,90,11,100,16,100,17,132,0,90,12,100,18,100,19, - 132,0,90,13,100,20,100,21,132,0,90,14,100,22,100,23, - 132,0,90,15,135,0,4,0,90,16,83,0,41,24,218,10, - 70,105,108,101,76,111,97,100,101,114,122,103,66,97,115,101, - 32,102,105,108,101,32,108,111,97,100,101,114,32,99,108,97, - 115,115,32,119,104,105,99,104,32,105,109,112,108,101,109,101, - 110,116,115,32,116,104,101,32,108,111,97,100,101,114,32,112, - 114,111,116,111,99,111,108,32,109,101,116,104,111,100,115,32, - 116,104,97,116,10,32,32,32,32,114,101,113,117,105,114,101, - 32,102,105,108,101,32,115,121,115,116,101,109,32,117,115,97, - 103,101,46,99,3,0,0,0,0,0,0,0,0,0,0,0, - 3,0,0,0,2,0,0,0,67,0,0,0,115,16,0,0, - 0,124,1,124,0,95,0,124,2,124,0,95,1,100,1,83, - 0,41,2,122,75,67,97,99,104,101,32,116,104,101,32,109, - 111,100,117,108,101,32,110,97,109,101,32,97,110,100,32,116, - 104,101,32,112,97,116,104,32,116,111,32,116,104,101,32,102, - 105,108,101,32,102,111,117,110,100,32,98,121,32,116,104,101, - 10,32,32,32,32,32,32,32,32,102,105,110,100,101,114,46, - 78,114,159,0,0,0,41,3,114,118,0,0,0,114,139,0, - 0,0,114,43,0,0,0,114,3,0,0,0,114,3,0,0, - 0,114,6,0,0,0,114,209,0,0,0,172,3,0,0,115, - 4,0,0,0,0,3,6,1,122,19,70,105,108,101,76,111, - 97,100,101,114,46,95,95,105,110,105,116,95,95,99,2,0, - 0,0,0,0,0,0,0,0,0,0,2,0,0,0,2,0, - 0,0,67,0,0,0,115,24,0,0,0,124,0,106,0,124, - 1,106,0,107,2,111,22,124,0,106,1,124,1,106,1,107, - 2,83,0,114,109,0,0,0,169,2,218,9,95,95,99,108, - 97,115,115,95,95,114,131,0,0,0,169,2,114,118,0,0, - 0,90,5,111,116,104,101,114,114,3,0,0,0,114,3,0, - 0,0,114,6,0,0,0,218,6,95,95,101,113,95,95,178, - 3,0,0,115,6,0,0,0,0,1,12,1,10,255,122,17, - 70,105,108,101,76,111,97,100,101,114,46,95,95,101,113,95, - 95,99,1,0,0,0,0,0,0,0,0,0,0,0,1,0, - 0,0,3,0,0,0,67,0,0,0,115,20,0,0,0,116, - 0,124,0,106,1,131,1,116,0,124,0,106,2,131,1,65, - 0,83,0,114,109,0,0,0,169,3,218,4,104,97,115,104, - 114,116,0,0,0,114,43,0,0,0,169,1,114,118,0,0, - 0,114,3,0,0,0,114,3,0,0,0,114,6,0,0,0, - 218,8,95,95,104,97,115,104,95,95,182,3,0,0,115,2, - 0,0,0,0,1,122,19,70,105,108,101,76,111,97,100,101, - 114,46,95,95,104,97,115,104,95,95,99,2,0,0,0,0, - 0,0,0,0,0,0,0,2,0,0,0,3,0,0,0,3, - 0,0,0,115,16,0,0,0,116,0,116,1,124,0,131,2, - 160,2,124,1,161,1,83,0,41,1,122,100,76,111,97,100, - 32,97,32,109,111,100,117,108,101,32,102,114,111,109,32,97, - 32,102,105,108,101,46,10,10,32,32,32,32,32,32,32,32, + 9,102,105,110,100,95,115,112,101,99,222,2,0,0,115,28, + 0,0,0,0,2,10,1,8,1,4,1,2,1,12,1,14, + 1,8,1,14,1,14,1,6,1,8,1,2,254,6,3,122, + 31,87,105,110,100,111,119,115,82,101,103,105,115,116,114,121, + 70,105,110,100,101,114,46,102,105,110,100,95,115,112,101,99, + 99,3,0,0,0,0,0,0,0,0,0,0,0,4,0,0, + 0,4,0,0,0,67,0,0,0,115,34,0,0,0,124,0, + 160,0,124,1,124,2,161,2,125,3,124,3,100,1,107,9, + 114,26,124,3,106,1,83,0,100,1,83,0,100,1,83,0, + 41,2,122,108,70,105,110,100,32,109,111,100,117,108,101,32, + 110,97,109,101,100,32,105,110,32,116,104,101,32,114,101,103, + 105,115,116,114,121,46,10,10,32,32,32,32,32,32,32,32, 84,104,105,115,32,109,101,116,104,111,100,32,105,115,32,100, 101,112,114,101,99,97,116,101,100,46,32,32,85,115,101,32, 101,120,101,99,95,109,111,100,117,108,101,40,41,32,105,110, 115,116,101,97,100,46,10,10,32,32,32,32,32,32,32,32, - 41,3,218,5,115,117,112,101,114,114,239,0,0,0,114,220, - 0,0,0,114,219,0,0,0,169,1,114,241,0,0,0,114, - 3,0,0,0,114,6,0,0,0,114,220,0,0,0,185,3, - 0,0,115,2,0,0,0,0,10,122,22,70,105,108,101,76, - 111,97,100,101,114,46,108,111,97,100,95,109,111,100,117,108, - 101,99,2,0,0,0,0,0,0,0,0,0,0,0,2,0, - 0,0,1,0,0,0,67,0,0,0,115,6,0,0,0,124, - 0,106,0,83,0,169,1,122,58,82,101,116,117,114,110,32, - 116,104,101,32,112,97,116,104,32,116,111,32,116,104,101,32, - 115,111,117,114,99,101,32,102,105,108,101,32,97,115,32,102, - 111,117,110,100,32,98,121,32,116,104,101,32,102,105,110,100, - 101,114,46,114,47,0,0,0,114,219,0,0,0,114,3,0, - 0,0,114,3,0,0,0,114,6,0,0,0,114,179,0,0, - 0,197,3,0,0,115,2,0,0,0,0,3,122,23,70,105, - 108,101,76,111,97,100,101,114,46,103,101,116,95,102,105,108, - 101,110,97,109,101,99,2,0,0,0,0,0,0,0,0,0, - 0,0,3,0,0,0,10,0,0,0,67,0,0,0,115,102, - 0,0,0,116,0,124,0,116,1,116,2,102,2,131,2,114, - 58,116,3,160,4,116,5,124,1,131,1,161,1,143,22,125, - 2,124,2,160,6,161,0,87,0,2,0,53,0,81,0,82, - 0,163,0,83,0,81,0,82,0,88,0,110,40,116,3,160, - 7,124,1,100,1,161,2,143,22,125,2,124,2,160,6,161, - 0,87,0,2,0,53,0,81,0,82,0,163,0,83,0,81, - 0,82,0,88,0,100,2,83,0,41,3,122,39,82,101,116, - 117,114,110,32,116,104,101,32,100,97,116,97,32,102,114,111, - 109,32,112,97,116,104,32,97,115,32,114,97,119,32,98,121, - 116,101,115,46,218,1,114,78,41,8,114,161,0,0,0,114, - 221,0,0,0,218,19,69,120,116,101,110,115,105,111,110,70, - 105,108,101,76,111,97,100,101,114,114,63,0,0,0,90,9, - 111,112,101,110,95,99,111,100,101,114,84,0,0,0,90,4, - 114,101,97,100,114,64,0,0,0,41,3,114,118,0,0,0, - 114,43,0,0,0,114,67,0,0,0,114,3,0,0,0,114, - 3,0,0,0,114,6,0,0,0,114,227,0,0,0,202,3, - 0,0,115,10,0,0,0,0,2,14,1,16,1,28,2,14, - 1,122,19,70,105,108,101,76,111,97,100,101,114,46,103,101, - 116,95,100,97,116,97,99,2,0,0,0,0,0,0,0,0, - 0,0,0,2,0,0,0,3,0,0,0,67,0,0,0,115, - 18,0,0,0,124,0,160,0,124,1,161,1,114,14,124,0, - 83,0,100,0,83,0,114,109,0,0,0,41,1,114,182,0, - 0,0,169,2,114,118,0,0,0,114,216,0,0,0,114,3, - 0,0,0,114,3,0,0,0,114,6,0,0,0,218,19,103, - 101,116,95,114,101,115,111,117,114,99,101,95,114,101,97,100, - 101,114,213,3,0,0,115,6,0,0,0,0,2,10,1,4, - 1,122,30,70,105,108,101,76,111,97,100,101,114,46,103,101, - 116,95,114,101,115,111,117,114,99,101,95,114,101,97,100,101, - 114,99,2,0,0,0,0,0,0,0,0,0,0,0,3,0, - 0,0,4,0,0,0,67,0,0,0,115,32,0,0,0,116, - 0,116,1,124,0,106,2,131,1,100,1,25,0,124,1,131, - 2,125,2,116,3,160,4,124,2,100,2,161,2,83,0,41, - 3,78,114,72,0,0,0,114,251,0,0,0,41,5,114,37, - 0,0,0,114,46,0,0,0,114,43,0,0,0,114,63,0, - 0,0,114,64,0,0,0,169,3,114,118,0,0,0,90,8, - 114,101,115,111,117,114,99,101,114,43,0,0,0,114,3,0, - 0,0,114,3,0,0,0,114,6,0,0,0,218,13,111,112, - 101,110,95,114,101,115,111,117,114,99,101,219,3,0,0,115, - 4,0,0,0,0,1,20,1,122,24,70,105,108,101,76,111, - 97,100,101,114,46,111,112,101,110,95,114,101,115,111,117,114, - 99,101,99,2,0,0,0,0,0,0,0,0,0,0,0,3, - 0,0,0,3,0,0,0,67,0,0,0,115,38,0,0,0, - 124,0,160,0,124,1,161,1,115,14,116,1,130,1,116,2, - 116,3,124,0,106,4,131,1,100,1,25,0,124,1,131,2, - 125,2,124,2,83,0,169,2,78,114,72,0,0,0,41,5, - 218,11,105,115,95,114,101,115,111,117,114,99,101,218,17,70, - 105,108,101,78,111,116,70,111,117,110,100,69,114,114,111,114, - 114,37,0,0,0,114,46,0,0,0,114,43,0,0,0,114, - 255,0,0,0,114,3,0,0,0,114,3,0,0,0,114,6, - 0,0,0,218,13,114,101,115,111,117,114,99,101,95,112,97, - 116,104,223,3,0,0,115,8,0,0,0,0,1,10,1,4, - 1,20,1,122,24,70,105,108,101,76,111,97,100,101,114,46, - 114,101,115,111,117,114,99,101,95,112,97,116,104,99,2,0, - 0,0,0,0,0,0,0,0,0,0,3,0,0,0,3,0, - 0,0,67,0,0,0,115,40,0,0,0,116,0,124,1,107, - 6,114,12,100,1,83,0,116,1,116,2,124,0,106,3,131, - 1,100,2,25,0,124,1,131,2,125,2,116,4,124,2,131, - 1,83,0,41,3,78,70,114,72,0,0,0,41,5,114,34, - 0,0,0,114,37,0,0,0,114,46,0,0,0,114,43,0, - 0,0,114,53,0,0,0,169,3,114,118,0,0,0,114,116, - 0,0,0,114,43,0,0,0,114,3,0,0,0,114,3,0, - 0,0,114,6,0,0,0,114,2,1,0,0,229,3,0,0, - 115,8,0,0,0,0,1,8,1,4,1,20,1,122,22,70, - 105,108,101,76,111,97,100,101,114,46,105,115,95,114,101,115, - 111,117,114,99,101,99,1,0,0,0,0,0,0,0,0,0, - 0,0,1,0,0,0,5,0,0,0,67,0,0,0,115,24, - 0,0,0,116,0,116,1,160,2,116,3,124,0,106,4,131, - 1,100,1,25,0,161,1,131,1,83,0,114,1,1,0,0, - 41,5,218,4,105,116,101,114,114,2,0,0,0,218,7,108, - 105,115,116,100,105,114,114,46,0,0,0,114,43,0,0,0, - 114,246,0,0,0,114,3,0,0,0,114,3,0,0,0,114, - 6,0,0,0,218,8,99,111,110,116,101,110,116,115,235,3, - 0,0,115,2,0,0,0,0,1,122,19,70,105,108,101,76, - 111,97,100,101,114,46,99,111,110,116,101,110,116,115,41,17, - 114,125,0,0,0,114,124,0,0,0,114,126,0,0,0,114, - 127,0,0,0,114,209,0,0,0,114,243,0,0,0,114,247, - 0,0,0,114,136,0,0,0,114,220,0,0,0,114,179,0, - 0,0,114,227,0,0,0,114,254,0,0,0,114,0,1,0, - 0,114,4,1,0,0,114,2,1,0,0,114,8,1,0,0, - 90,13,95,95,99,108,97,115,115,99,101,108,108,95,95,114, - 3,0,0,0,114,3,0,0,0,114,249,0,0,0,114,6, - 0,0,0,114,239,0,0,0,167,3,0,0,115,30,0,0, - 0,8,2,4,3,8,6,8,4,8,3,2,1,14,11,2, - 1,10,4,8,11,2,1,10,5,8,4,8,6,8,6,114, - 239,0,0,0,99,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,3,0,0,0,64,0,0,0,115,46,0, - 0,0,101,0,90,1,100,0,90,2,100,1,90,3,100,2, - 100,3,132,0,90,4,100,4,100,5,132,0,90,5,100,6, - 100,7,156,1,100,8,100,9,132,2,90,6,100,10,83,0, - 41,11,218,16,83,111,117,114,99,101,70,105,108,101,76,111, - 97,100,101,114,122,62,67,111,110,99,114,101,116,101,32,105, - 109,112,108,101,109,101,110,116,97,116,105,111,110,32,111,102, - 32,83,111,117,114,99,101,76,111,97,100,101,114,32,117,115, - 105,110,103,32,116,104,101,32,102,105,108,101,32,115,121,115, - 116,101,109,46,99,2,0,0,0,0,0,0,0,0,0,0, - 0,3,0,0,0,3,0,0,0,67,0,0,0,115,22,0, - 0,0,116,0,124,1,131,1,125,2,124,2,106,1,124,2, - 106,2,100,1,156,2,83,0,41,2,122,33,82,101,116,117, - 114,110,32,116,104,101,32,109,101,116,97,100,97,116,97,32, - 102,111,114,32,116,104,101,32,112,97,116,104,46,41,2,114, - 169,0,0,0,114,234,0,0,0,41,3,114,48,0,0,0, - 218,8,115,116,95,109,116,105,109,101,90,7,115,116,95,115, - 105,122,101,41,3,114,118,0,0,0,114,43,0,0,0,114, - 238,0,0,0,114,3,0,0,0,114,3,0,0,0,114,6, - 0,0,0,114,224,0,0,0,243,3,0,0,115,4,0,0, - 0,0,2,8,1,122,27,83,111,117,114,99,101,70,105,108, - 101,76,111,97,100,101,114,46,112,97,116,104,95,115,116,97, - 116,115,99,4,0,0,0,0,0,0,0,0,0,0,0,5, - 0,0,0,5,0,0,0,67,0,0,0,115,24,0,0,0, - 116,0,124,1,131,1,125,4,124,0,106,1,124,2,124,3, - 124,4,100,1,141,3,83,0,41,2,78,169,1,218,5,95, - 109,111,100,101,41,2,114,114,0,0,0,114,225,0,0,0, - 41,5,114,118,0,0,0,114,107,0,0,0,114,106,0,0, - 0,114,25,0,0,0,114,51,0,0,0,114,3,0,0,0, - 114,3,0,0,0,114,6,0,0,0,114,226,0,0,0,248, - 3,0,0,115,4,0,0,0,0,2,8,1,122,32,83,111, - 117,114,99,101,70,105,108,101,76,111,97,100,101,114,46,95, - 99,97,99,104,101,95,98,121,116,101,99,111,100,101,114,59, - 0,0,0,114,11,1,0,0,99,3,0,0,0,0,0,0, - 0,1,0,0,0,9,0,0,0,11,0,0,0,67,0,0, - 0,115,252,0,0,0,116,0,124,1,131,1,92,2,125,4, - 125,5,103,0,125,6,124,4,114,52,116,1,124,4,131,1, - 115,52,116,0,124,4,131,1,92,2,125,4,125,7,124,6, - 160,2,124,7,161,1,1,0,113,16,116,3,124,6,131,1, - 68,0,93,108,125,7,116,4,124,4,124,7,131,2,125,4, - 122,14,116,5,160,6,124,4,161,1,1,0,87,0,113,60, - 4,0,116,7,107,10,114,112,1,0,1,0,1,0,89,0, - 113,60,89,0,113,60,4,0,116,8,107,10,114,166,1,0, - 125,8,1,0,122,26,116,9,160,10,100,1,124,4,124,8, - 161,3,1,0,87,0,89,0,162,6,1,0,100,2,83,0, - 100,2,125,8,126,8,88,0,89,0,113,60,88,0,113,60, - 122,28,116,11,124,1,124,2,124,3,131,3,1,0,116,9, - 160,10,100,3,124,1,161,2,1,0,87,0,110,48,4,0, - 116,8,107,10,114,246,1,0,125,8,1,0,122,18,116,9, - 160,10,100,1,124,1,124,8,161,3,1,0,87,0,53,0, - 100,2,125,8,126,8,88,0,89,0,110,2,88,0,100,2, - 83,0,41,4,122,27,87,114,105,116,101,32,98,121,116,101, - 115,32,100,97,116,97,32,116,111,32,97,32,102,105,108,101, - 46,122,27,99,111,117,108,100,32,110,111,116,32,99,114,101, - 97,116,101,32,123,33,114,125,58,32,123,33,114,125,78,122, - 12,99,114,101,97,116,101,100,32,123,33,114,125,41,12,114, - 46,0,0,0,114,55,0,0,0,114,186,0,0,0,114,41, - 0,0,0,114,37,0,0,0,114,2,0,0,0,90,5,109, - 107,100,105,114,218,15,70,105,108,101,69,120,105,115,116,115, - 69,114,114,111,114,114,49,0,0,0,114,134,0,0,0,114, - 149,0,0,0,114,68,0,0,0,41,9,114,118,0,0,0, - 114,43,0,0,0,114,25,0,0,0,114,12,1,0,0,218, - 6,112,97,114,101,110,116,114,96,0,0,0,114,36,0,0, - 0,114,32,0,0,0,114,228,0,0,0,114,3,0,0,0, - 114,3,0,0,0,114,6,0,0,0,114,225,0,0,0,253, - 3,0,0,115,48,0,0,0,0,2,12,1,4,2,12,1, - 12,1,12,2,12,1,10,1,2,1,14,1,14,2,8,1, - 16,3,6,1,2,0,2,255,4,2,28,1,2,1,12,1, - 16,1,16,2,8,1,2,255,122,25,83,111,117,114,99,101, - 70,105,108,101,76,111,97,100,101,114,46,115,101,116,95,100, - 97,116,97,78,41,7,114,125,0,0,0,114,124,0,0,0, - 114,126,0,0,0,114,127,0,0,0,114,224,0,0,0,114, - 226,0,0,0,114,225,0,0,0,114,3,0,0,0,114,3, - 0,0,0,114,3,0,0,0,114,6,0,0,0,114,9,1, - 0,0,239,3,0,0,115,8,0,0,0,8,2,4,2,8, - 5,8,5,114,9,1,0,0,99,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,2,0,0,0,64,0,0, - 0,115,32,0,0,0,101,0,90,1,100,0,90,2,100,1, - 90,3,100,2,100,3,132,0,90,4,100,4,100,5,132,0, - 90,5,100,6,83,0,41,7,218,20,83,111,117,114,99,101, - 108,101,115,115,70,105,108,101,76,111,97,100,101,114,122,45, - 76,111,97,100,101,114,32,119,104,105,99,104,32,104,97,110, - 100,108,101,115,32,115,111,117,114,99,101,108,101,115,115,32, - 102,105,108,101,32,105,109,112,111,114,116,115,46,99,2,0, - 0,0,0,0,0,0,0,0,0,0,5,0,0,0,5,0, - 0,0,67,0,0,0,115,68,0,0,0,124,0,160,0,124, - 1,161,1,125,2,124,0,160,1,124,2,161,1,125,3,124, - 1,124,2,100,1,156,2,125,4,116,2,124,3,124,1,124, - 4,131,3,1,0,116,3,116,4,124,3,131,1,100,2,100, - 0,133,2,25,0,124,1,124,2,100,3,141,3,83,0,41, - 4,78,114,159,0,0,0,114,145,0,0,0,41,2,114,116, - 0,0,0,114,106,0,0,0,41,5,114,179,0,0,0,114, - 227,0,0,0,114,152,0,0,0,114,165,0,0,0,114,235, - 0,0,0,41,5,114,118,0,0,0,114,139,0,0,0,114, - 43,0,0,0,114,25,0,0,0,114,151,0,0,0,114,3, - 0,0,0,114,3,0,0,0,114,6,0,0,0,114,213,0, - 0,0,32,4,0,0,115,22,0,0,0,0,1,10,1,10, - 4,2,1,2,254,6,4,12,1,2,1,14,1,2,1,2, - 253,122,29,83,111,117,114,99,101,108,101,115,115,70,105,108, - 101,76,111,97,100,101,114,46,103,101,116,95,99,111,100,101, - 99,2,0,0,0,0,0,0,0,0,0,0,0,2,0,0, - 0,1,0,0,0,67,0,0,0,115,4,0,0,0,100,1, - 83,0,41,2,122,39,82,101,116,117,114,110,32,78,111,110, - 101,32,97,115,32,116,104,101,114,101,32,105,115,32,110,111, - 32,115,111,117,114,99,101,32,99,111,100,101,46,78,114,3, - 0,0,0,114,219,0,0,0,114,3,0,0,0,114,3,0, - 0,0,114,6,0,0,0,114,229,0,0,0,48,4,0,0, - 115,2,0,0,0,0,2,122,31,83,111,117,114,99,101,108, - 101,115,115,70,105,108,101,76,111,97,100,101,114,46,103,101, - 116,95,115,111,117,114,99,101,78,41,6,114,125,0,0,0, - 114,124,0,0,0,114,126,0,0,0,114,127,0,0,0,114, - 213,0,0,0,114,229,0,0,0,114,3,0,0,0,114,3, - 0,0,0,114,3,0,0,0,114,6,0,0,0,114,15,1, - 0,0,28,4,0,0,115,6,0,0,0,8,2,4,2,8, - 16,114,15,1,0,0,99,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,3,0,0,0,64,0,0,0,115, - 92,0,0,0,101,0,90,1,100,0,90,2,100,1,90,3, - 100,2,100,3,132,0,90,4,100,4,100,5,132,0,90,5, - 100,6,100,7,132,0,90,6,100,8,100,9,132,0,90,7, - 100,10,100,11,132,0,90,8,100,12,100,13,132,0,90,9, - 100,14,100,15,132,0,90,10,100,16,100,17,132,0,90,11, - 101,12,100,18,100,19,132,0,131,1,90,13,100,20,83,0, - 41,21,114,252,0,0,0,122,93,76,111,97,100,101,114,32, - 102,111,114,32,101,120,116,101,110,115,105,111,110,32,109,111, - 100,117,108,101,115,46,10,10,32,32,32,32,84,104,101,32, - 99,111,110,115,116,114,117,99,116,111,114,32,105,115,32,100, - 101,115,105,103,110,101,100,32,116,111,32,119,111,114,107,32, - 119,105,116,104,32,70,105,108,101,70,105,110,100,101,114,46, - 10,10,32,32,32,32,99,3,0,0,0,0,0,0,0,0, - 0,0,0,3,0,0,0,2,0,0,0,67,0,0,0,115, - 16,0,0,0,124,1,124,0,95,0,124,2,124,0,95,1, - 100,0,83,0,114,109,0,0,0,114,159,0,0,0,114,5, - 1,0,0,114,3,0,0,0,114,3,0,0,0,114,6,0, - 0,0,114,209,0,0,0,65,4,0,0,115,4,0,0,0, - 0,1,6,1,122,28,69,120,116,101,110,115,105,111,110,70, - 105,108,101,76,111,97,100,101,114,46,95,95,105,110,105,116, - 95,95,99,2,0,0,0,0,0,0,0,0,0,0,0,2, - 0,0,0,2,0,0,0,67,0,0,0,115,24,0,0,0, - 124,0,106,0,124,1,106,0,107,2,111,22,124,0,106,1, - 124,1,106,1,107,2,83,0,114,109,0,0,0,114,240,0, - 0,0,114,242,0,0,0,114,3,0,0,0,114,3,0,0, - 0,114,6,0,0,0,114,243,0,0,0,69,4,0,0,115, - 6,0,0,0,0,1,12,1,10,255,122,26,69,120,116,101, - 110,115,105,111,110,70,105,108,101,76,111,97,100,101,114,46, - 95,95,101,113,95,95,99,1,0,0,0,0,0,0,0,0, - 0,0,0,1,0,0,0,3,0,0,0,67,0,0,0,115, - 20,0,0,0,116,0,124,0,106,1,131,1,116,0,124,0, - 106,2,131,1,65,0,83,0,114,109,0,0,0,114,244,0, - 0,0,114,246,0,0,0,114,3,0,0,0,114,3,0,0, - 0,114,6,0,0,0,114,247,0,0,0,73,4,0,0,115, - 2,0,0,0,0,1,122,28,69,120,116,101,110,115,105,111, - 110,70,105,108,101,76,111,97,100,101,114,46,95,95,104,97, - 115,104,95,95,99,2,0,0,0,0,0,0,0,0,0,0, - 0,3,0,0,0,5,0,0,0,67,0,0,0,115,36,0, - 0,0,116,0,160,1,116,2,106,3,124,1,161,2,125,2, - 116,0,160,4,100,1,124,1,106,5,124,0,106,6,161,3, - 1,0,124,2,83,0,41,2,122,38,67,114,101,97,116,101, - 32,97,110,32,117,110,105,116,105,97,108,105,122,101,100,32, - 101,120,116,101,110,115,105,111,110,32,109,111,100,117,108,101, - 122,38,101,120,116,101,110,115,105,111,110,32,109,111,100,117, - 108,101,32,123,33,114,125,32,108,111,97,100,101,100,32,102, - 114,111,109,32,123,33,114,125,41,7,114,134,0,0,0,114, - 214,0,0,0,114,163,0,0,0,90,14,99,114,101,97,116, - 101,95,100,121,110,97,109,105,99,114,149,0,0,0,114,116, - 0,0,0,114,43,0,0,0,41,3,114,118,0,0,0,114, - 187,0,0,0,114,216,0,0,0,114,3,0,0,0,114,3, - 0,0,0,114,6,0,0,0,114,212,0,0,0,76,4,0, - 0,115,18,0,0,0,0,2,4,1,4,0,2,255,4,2, - 6,1,4,0,4,255,4,2,122,33,69,120,116,101,110,115, - 105,111,110,70,105,108,101,76,111,97,100,101,114,46,99,114, - 101,97,116,101,95,109,111,100,117,108,101,99,2,0,0,0, - 0,0,0,0,0,0,0,0,2,0,0,0,5,0,0,0, - 67,0,0,0,115,36,0,0,0,116,0,160,1,116,2,106, - 3,124,1,161,2,1,0,116,0,160,4,100,1,124,0,106, - 5,124,0,106,6,161,3,1,0,100,2,83,0,41,3,122, - 30,73,110,105,116,105,97,108,105,122,101,32,97,110,32,101, - 120,116,101,110,115,105,111,110,32,109,111,100,117,108,101,122, - 40,101,120,116,101,110,115,105,111,110,32,109,111,100,117,108, - 101,32,123,33,114,125,32,101,120,101,99,117,116,101,100,32, - 102,114,111,109,32,123,33,114,125,78,41,7,114,134,0,0, - 0,114,214,0,0,0,114,163,0,0,0,90,12,101,120,101, - 99,95,100,121,110,97,109,105,99,114,149,0,0,0,114,116, - 0,0,0,114,43,0,0,0,114,253,0,0,0,114,3,0, - 0,0,114,3,0,0,0,114,6,0,0,0,114,217,0,0, - 0,84,4,0,0,115,10,0,0,0,0,2,14,1,6,1, - 4,0,4,255,122,31,69,120,116,101,110,115,105,111,110,70, - 105,108,101,76,111,97,100,101,114,46,101,120,101,99,95,109, - 111,100,117,108,101,99,2,0,0,0,0,0,0,0,0,0, - 0,0,2,0,0,0,4,0,0,0,3,0,0,0,115,36, - 0,0,0,116,0,124,0,106,1,131,1,100,1,25,0,137, - 0,116,2,135,0,102,1,100,2,100,3,132,8,116,3,68, - 0,131,1,131,1,83,0,41,4,122,49,82,101,116,117,114, - 110,32,84,114,117,101,32,105,102,32,116,104,101,32,101,120, - 116,101,110,115,105,111,110,32,109,111,100,117,108,101,32,105, - 115,32,97,32,112,97,99,107,97,103,101,46,114,38,0,0, - 0,99,1,0,0,0,0,0,0,0,0,0,0,0,2,0, - 0,0,4,0,0,0,51,0,0,0,115,26,0,0,0,124, - 0,93,18,125,1,136,0,100,0,124,1,23,0,107,2,86, - 0,1,0,113,2,100,1,83,0,41,2,114,209,0,0,0, - 78,114,3,0,0,0,169,2,114,31,0,0,0,218,6,115, - 117,102,102,105,120,169,1,90,9,102,105,108,101,95,110,97, - 109,101,114,3,0,0,0,114,6,0,0,0,218,9,60,103, - 101,110,101,120,112,114,62,93,4,0,0,115,4,0,0,0, - 4,1,2,255,122,49,69,120,116,101,110,115,105,111,110,70, - 105,108,101,76,111,97,100,101,114,46,105,115,95,112,97,99, - 107,97,103,101,46,60,108,111,99,97,108,115,62,46,60,103, - 101,110,101,120,112,114,62,41,4,114,46,0,0,0,114,43, - 0,0,0,218,3,97,110,121,218,18,69,88,84,69,78,83, - 73,79,78,95,83,85,70,70,73,88,69,83,114,219,0,0, - 0,114,3,0,0,0,114,18,1,0,0,114,6,0,0,0, - 114,182,0,0,0,90,4,0,0,115,8,0,0,0,0,2, - 14,1,12,1,2,255,122,30,69,120,116,101,110,115,105,111, - 110,70,105,108,101,76,111,97,100,101,114,46,105,115,95,112, - 97,99,107,97,103,101,99,2,0,0,0,0,0,0,0,0, - 0,0,0,2,0,0,0,1,0,0,0,67,0,0,0,115, - 4,0,0,0,100,1,83,0,41,2,122,63,82,101,116,117, - 114,110,32,78,111,110,101,32,97,115,32,97,110,32,101,120, - 116,101,110,115,105,111,110,32,109,111,100,117,108,101,32,99, - 97,110,110,111,116,32,99,114,101,97,116,101,32,97,32,99, - 111,100,101,32,111,98,106,101,99,116,46,78,114,3,0,0, - 0,114,219,0,0,0,114,3,0,0,0,114,3,0,0,0, - 114,6,0,0,0,114,213,0,0,0,96,4,0,0,115,2, - 0,0,0,0,2,122,28,69,120,116,101,110,115,105,111,110, - 70,105,108,101,76,111,97,100,101,114,46,103,101,116,95,99, - 111,100,101,99,2,0,0,0,0,0,0,0,0,0,0,0, - 2,0,0,0,1,0,0,0,67,0,0,0,115,4,0,0, - 0,100,1,83,0,41,2,122,53,82,101,116,117,114,110,32, - 78,111,110,101,32,97,115,32,101,120,116,101,110,115,105,111, - 110,32,109,111,100,117,108,101,115,32,104,97,118,101,32,110, - 111,32,115,111,117,114,99,101,32,99,111,100,101,46,78,114, - 3,0,0,0,114,219,0,0,0,114,3,0,0,0,114,3, - 0,0,0,114,6,0,0,0,114,229,0,0,0,100,4,0, - 0,115,2,0,0,0,0,2,122,30,69,120,116,101,110,115, - 105,111,110,70,105,108,101,76,111,97,100,101,114,46,103,101, - 116,95,115,111,117,114,99,101,99,2,0,0,0,0,0,0, - 0,0,0,0,0,2,0,0,0,1,0,0,0,67,0,0, - 0,115,6,0,0,0,124,0,106,0,83,0,114,250,0,0, - 0,114,47,0,0,0,114,219,0,0,0,114,3,0,0,0, - 114,3,0,0,0,114,6,0,0,0,114,179,0,0,0,104, - 4,0,0,115,2,0,0,0,0,3,122,32,69,120,116,101, - 110,115,105,111,110,70,105,108,101,76,111,97,100,101,114,46, - 103,101,116,95,102,105,108,101,110,97,109,101,78,41,14,114, - 125,0,0,0,114,124,0,0,0,114,126,0,0,0,114,127, - 0,0,0,114,209,0,0,0,114,243,0,0,0,114,247,0, - 0,0,114,212,0,0,0,114,217,0,0,0,114,182,0,0, - 0,114,213,0,0,0,114,229,0,0,0,114,136,0,0,0, - 114,179,0,0,0,114,3,0,0,0,114,3,0,0,0,114, - 3,0,0,0,114,6,0,0,0,114,252,0,0,0,57,4, - 0,0,115,22,0,0,0,8,2,4,6,8,4,8,4,8, - 3,8,8,8,6,8,6,8,4,8,4,2,1,114,252,0, - 0,0,99,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,2,0,0,0,64,0,0,0,115,104,0,0,0, - 101,0,90,1,100,0,90,2,100,1,90,3,100,2,100,3, - 132,0,90,4,100,4,100,5,132,0,90,5,100,6,100,7, - 132,0,90,6,100,8,100,9,132,0,90,7,100,10,100,11, - 132,0,90,8,100,12,100,13,132,0,90,9,100,14,100,15, - 132,0,90,10,100,16,100,17,132,0,90,11,100,18,100,19, - 132,0,90,12,100,20,100,21,132,0,90,13,100,22,100,23, - 132,0,90,14,100,24,83,0,41,25,218,14,95,78,97,109, - 101,115,112,97,99,101,80,97,116,104,97,38,1,0,0,82, - 101,112,114,101,115,101,110,116,115,32,97,32,110,97,109,101, - 115,112,97,99,101,32,112,97,99,107,97,103,101,39,115,32, - 112,97,116,104,46,32,32,73,116,32,117,115,101,115,32,116, - 104,101,32,109,111,100,117,108,101,32,110,97,109,101,10,32, - 32,32,32,116,111,32,102,105,110,100,32,105,116,115,32,112, - 97,114,101,110,116,32,109,111,100,117,108,101,44,32,97,110, - 100,32,102,114,111,109,32,116,104,101,114,101,32,105,116,32, - 108,111,111,107,115,32,117,112,32,116,104,101,32,112,97,114, - 101,110,116,39,115,10,32,32,32,32,95,95,112,97,116,104, - 95,95,46,32,32,87,104,101,110,32,116,104,105,115,32,99, - 104,97,110,103,101,115,44,32,116,104,101,32,109,111,100,117, - 108,101,39,115,32,111,119,110,32,112,97,116,104,32,105,115, - 32,114,101,99,111,109,112,117,116,101,100,44,10,32,32,32, - 32,117,115,105,110,103,32,112,97,116,104,95,102,105,110,100, - 101,114,46,32,32,70,111,114,32,116,111,112,45,108,101,118, - 101,108,32,109,111,100,117,108,101,115,44,32,116,104,101,32, - 112,97,114,101,110,116,32,109,111,100,117,108,101,39,115,32, - 112,97,116,104,10,32,32,32,32,105,115,32,115,121,115,46, - 112,97,116,104,46,99,4,0,0,0,0,0,0,0,0,0, - 0,0,4,0,0,0,3,0,0,0,67,0,0,0,115,36, - 0,0,0,124,1,124,0,95,0,124,2,124,0,95,1,116, - 2,124,0,160,3,161,0,131,1,124,0,95,4,124,3,124, - 0,95,5,100,0,83,0,114,109,0,0,0,41,6,218,5, - 95,110,97,109,101,218,5,95,112,97,116,104,114,111,0,0, - 0,218,16,95,103,101,116,95,112,97,114,101,110,116,95,112, - 97,116,104,218,17,95,108,97,115,116,95,112,97,114,101,110, - 116,95,112,97,116,104,218,12,95,112,97,116,104,95,102,105, - 110,100,101,114,169,4,114,118,0,0,0,114,116,0,0,0, - 114,43,0,0,0,90,11,112,97,116,104,95,102,105,110,100, - 101,114,114,3,0,0,0,114,3,0,0,0,114,6,0,0, - 0,114,209,0,0,0,117,4,0,0,115,8,0,0,0,0, - 1,6,1,6,1,14,1,122,23,95,78,97,109,101,115,112, - 97,99,101,80,97,116,104,46,95,95,105,110,105,116,95,95, - 99,1,0,0,0,0,0,0,0,0,0,0,0,4,0,0, - 0,3,0,0,0,67,0,0,0,115,38,0,0,0,124,0, - 106,0,160,1,100,1,161,1,92,3,125,1,125,2,125,3, - 124,2,100,2,107,2,114,30,100,3,83,0,124,1,100,4, - 102,2,83,0,41,5,122,62,82,101,116,117,114,110,115,32, - 97,32,116,117,112,108,101,32,111,102,32,40,112,97,114,101, - 110,116,45,109,111,100,117,108,101,45,110,97,109,101,44,32, - 112,97,114,101,110,116,45,112,97,116,104,45,97,116,116,114, - 45,110,97,109,101,41,114,70,0,0,0,114,39,0,0,0, - 41,2,114,8,0,0,0,114,43,0,0,0,90,8,95,95, - 112,97,116,104,95,95,41,2,114,23,1,0,0,114,40,0, - 0,0,41,4,114,118,0,0,0,114,14,1,0,0,218,3, - 100,111,116,90,2,109,101,114,3,0,0,0,114,3,0,0, - 0,114,6,0,0,0,218,23,95,102,105,110,100,95,112,97, - 114,101,110,116,95,112,97,116,104,95,110,97,109,101,115,123, - 4,0,0,115,8,0,0,0,0,2,18,1,8,2,4,3, - 122,38,95,78,97,109,101,115,112,97,99,101,80,97,116,104, - 46,95,102,105,110,100,95,112,97,114,101,110,116,95,112,97, - 116,104,95,110,97,109,101,115,99,1,0,0,0,0,0,0, - 0,0,0,0,0,3,0,0,0,3,0,0,0,67,0,0, - 0,115,28,0,0,0,124,0,160,0,161,0,92,2,125,1, - 125,2,116,1,116,2,106,3,124,1,25,0,124,2,131,2, - 83,0,114,109,0,0,0,41,4,114,30,1,0,0,114,130, - 0,0,0,114,8,0,0,0,218,7,109,111,100,117,108,101, - 115,41,3,114,118,0,0,0,90,18,112,97,114,101,110,116, - 95,109,111,100,117,108,101,95,110,97,109,101,90,14,112,97, - 116,104,95,97,116,116,114,95,110,97,109,101,114,3,0,0, - 0,114,3,0,0,0,114,6,0,0,0,114,25,1,0,0, - 133,4,0,0,115,4,0,0,0,0,1,12,1,122,31,95, - 78,97,109,101,115,112,97,99,101,80,97,116,104,46,95,103, - 101,116,95,112,97,114,101,110,116,95,112,97,116,104,99,1, - 0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,4, - 0,0,0,67,0,0,0,115,80,0,0,0,116,0,124,0, - 160,1,161,0,131,1,125,1,124,1,124,0,106,2,107,3, - 114,74,124,0,160,3,124,0,106,4,124,1,161,2,125,2, - 124,2,100,0,107,9,114,68,124,2,106,5,100,0,107,8, - 114,68,124,2,106,6,114,68,124,2,106,6,124,0,95,7, - 124,1,124,0,95,2,124,0,106,7,83,0,114,109,0,0, - 0,41,8,114,111,0,0,0,114,25,1,0,0,114,26,1, - 0,0,114,27,1,0,0,114,23,1,0,0,114,140,0,0, - 0,114,178,0,0,0,114,24,1,0,0,41,3,114,118,0, - 0,0,90,11,112,97,114,101,110,116,95,112,97,116,104,114, - 187,0,0,0,114,3,0,0,0,114,3,0,0,0,114,6, - 0,0,0,218,12,95,114,101,99,97,108,99,117,108,97,116, - 101,137,4,0,0,115,16,0,0,0,0,2,12,1,10,1, - 14,3,18,1,6,1,8,1,6,1,122,27,95,78,97,109, - 101,115,112,97,99,101,80,97,116,104,46,95,114,101,99,97, - 108,99,117,108,97,116,101,99,1,0,0,0,0,0,0,0, - 0,0,0,0,1,0,0,0,3,0,0,0,67,0,0,0, - 115,12,0,0,0,116,0,124,0,160,1,161,0,131,1,83, - 0,114,109,0,0,0,41,2,114,6,1,0,0,114,32,1, - 0,0,114,246,0,0,0,114,3,0,0,0,114,3,0,0, - 0,114,6,0,0,0,218,8,95,95,105,116,101,114,95,95, - 150,4,0,0,115,2,0,0,0,0,1,122,23,95,78,97, - 109,101,115,112,97,99,101,80,97,116,104,46,95,95,105,116, - 101,114,95,95,99,2,0,0,0,0,0,0,0,0,0,0, - 0,2,0,0,0,2,0,0,0,67,0,0,0,115,12,0, - 0,0,124,0,160,0,161,0,124,1,25,0,83,0,114,109, - 0,0,0,169,1,114,32,1,0,0,41,2,114,118,0,0, - 0,218,5,105,110,100,101,120,114,3,0,0,0,114,3,0, - 0,0,114,6,0,0,0,218,11,95,95,103,101,116,105,116, - 101,109,95,95,153,4,0,0,115,2,0,0,0,0,1,122, - 26,95,78,97,109,101,115,112,97,99,101,80,97,116,104,46, - 95,95,103,101,116,105,116,101,109,95,95,99,3,0,0,0, - 0,0,0,0,0,0,0,0,3,0,0,0,3,0,0,0, - 67,0,0,0,115,14,0,0,0,124,2,124,0,106,0,124, - 1,60,0,100,0,83,0,114,109,0,0,0,41,1,114,24, - 1,0,0,41,3,114,118,0,0,0,114,35,1,0,0,114, - 43,0,0,0,114,3,0,0,0,114,3,0,0,0,114,6, - 0,0,0,218,11,95,95,115,101,116,105,116,101,109,95,95, - 156,4,0,0,115,2,0,0,0,0,1,122,26,95,78,97, - 109,101,115,112,97,99,101,80,97,116,104,46,95,95,115,101, - 116,105,116,101,109,95,95,99,1,0,0,0,0,0,0,0, - 0,0,0,0,1,0,0,0,3,0,0,0,67,0,0,0, - 115,12,0,0,0,116,0,124,0,160,1,161,0,131,1,83, - 0,114,109,0,0,0,41,2,114,22,0,0,0,114,32,1, - 0,0,114,246,0,0,0,114,3,0,0,0,114,3,0,0, - 0,114,6,0,0,0,218,7,95,95,108,101,110,95,95,159, - 4,0,0,115,2,0,0,0,0,1,122,22,95,78,97,109, - 101,115,112,97,99,101,80,97,116,104,46,95,95,108,101,110, - 95,95,99,1,0,0,0,0,0,0,0,0,0,0,0,1, - 0,0,0,3,0,0,0,67,0,0,0,115,12,0,0,0, - 100,1,160,0,124,0,106,1,161,1,83,0,41,2,78,122, - 20,95,78,97,109,101,115,112,97,99,101,80,97,116,104,40, - 123,33,114,125,41,41,2,114,61,0,0,0,114,24,1,0, - 0,114,246,0,0,0,114,3,0,0,0,114,3,0,0,0, - 114,6,0,0,0,218,8,95,95,114,101,112,114,95,95,162, - 4,0,0,115,2,0,0,0,0,1,122,23,95,78,97,109, - 101,115,112,97,99,101,80,97,116,104,46,95,95,114,101,112, - 114,95,95,99,2,0,0,0,0,0,0,0,0,0,0,0, - 2,0,0,0,3,0,0,0,67,0,0,0,115,12,0,0, - 0,124,1,124,0,160,0,161,0,107,6,83,0,114,109,0, - 0,0,114,34,1,0,0,169,2,114,118,0,0,0,218,4, - 105,116,101,109,114,3,0,0,0,114,3,0,0,0,114,6, - 0,0,0,218,12,95,95,99,111,110,116,97,105,110,115,95, - 95,165,4,0,0,115,2,0,0,0,0,1,122,27,95,78, - 97,109,101,115,112,97,99,101,80,97,116,104,46,95,95,99, - 111,110,116,97,105,110,115,95,95,99,2,0,0,0,0,0, - 0,0,0,0,0,0,2,0,0,0,3,0,0,0,67,0, - 0,0,115,16,0,0,0,124,0,106,0,160,1,124,1,161, - 1,1,0,100,0,83,0,114,109,0,0,0,41,2,114,24, - 1,0,0,114,186,0,0,0,114,40,1,0,0,114,3,0, - 0,0,114,3,0,0,0,114,6,0,0,0,114,186,0,0, - 0,168,4,0,0,115,2,0,0,0,0,1,122,21,95,78, - 97,109,101,115,112,97,99,101,80,97,116,104,46,97,112,112, - 101,110,100,78,41,15,114,125,0,0,0,114,124,0,0,0, - 114,126,0,0,0,114,127,0,0,0,114,209,0,0,0,114, - 30,1,0,0,114,25,1,0,0,114,32,1,0,0,114,33, - 1,0,0,114,36,1,0,0,114,37,1,0,0,114,38,1, - 0,0,114,39,1,0,0,114,42,1,0,0,114,186,0,0, + 78,169,2,114,203,0,0,0,114,140,0,0,0,169,4,114, + 193,0,0,0,114,139,0,0,0,114,43,0,0,0,114,187, + 0,0,0,114,3,0,0,0,114,3,0,0,0,114,6,0, + 0,0,218,11,102,105,110,100,95,109,111,100,117,108,101,238, + 2,0,0,115,8,0,0,0,0,7,12,1,8,1,6,2, + 122,33,87,105,110,100,111,119,115,82,101,103,105,115,116,114, + 121,70,105,110,100,101,114,46,102,105,110,100,95,109,111,100, + 117,108,101,41,2,78,78,41,1,78,41,12,114,125,0,0, + 0,114,124,0,0,0,114,126,0,0,0,114,127,0,0,0, + 114,197,0,0,0,114,196,0,0,0,114,195,0,0,0,218, + 11,99,108,97,115,115,109,101,116,104,111,100,114,194,0,0, + 0,114,200,0,0,0,114,203,0,0,0,114,206,0,0,0, + 114,3,0,0,0,114,3,0,0,0,114,3,0,0,0,114, + 6,0,0,0,114,191,0,0,0,188,2,0,0,115,28,0, + 0,0,8,2,4,3,2,255,2,4,2,255,2,3,4,2, + 2,1,10,6,2,1,10,14,2,1,12,15,2,1,114,191, + 0,0,0,99,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,2,0,0,0,64,0,0,0,115,48,0,0, + 0,101,0,90,1,100,0,90,2,100,1,90,3,100,2,100, + 3,132,0,90,4,100,4,100,5,132,0,90,5,100,6,100, + 7,132,0,90,6,100,8,100,9,132,0,90,7,100,10,83, + 0,41,11,218,13,95,76,111,97,100,101,114,66,97,115,105, + 99,115,122,83,66,97,115,101,32,99,108,97,115,115,32,111, + 102,32,99,111,109,109,111,110,32,99,111,100,101,32,110,101, + 101,100,101,100,32,98,121,32,98,111,116,104,32,83,111,117, + 114,99,101,76,111,97,100,101,114,32,97,110,100,10,32,32, + 32,32,83,111,117,114,99,101,108,101,115,115,70,105,108,101, + 76,111,97,100,101,114,46,99,2,0,0,0,0,0,0,0, + 0,0,0,0,5,0,0,0,4,0,0,0,67,0,0,0, + 115,64,0,0,0,116,0,124,0,160,1,124,1,161,1,131, + 1,100,1,25,0,125,2,124,2,160,2,100,2,100,1,161, + 2,100,3,25,0,125,3,124,1,160,3,100,2,161,1,100, + 4,25,0,125,4,124,3,100,5,107,2,111,62,124,4,100, + 5,107,3,83,0,41,6,122,141,67,111,110,99,114,101,116, + 101,32,105,109,112,108,101,109,101,110,116,97,116,105,111,110, + 32,111,102,32,73,110,115,112,101,99,116,76,111,97,100,101, + 114,46,105,115,95,112,97,99,107,97,103,101,32,98,121,32, + 99,104,101,99,107,105,110,103,32,105,102,10,32,32,32,32, + 32,32,32,32,116,104,101,32,112,97,116,104,32,114,101,116, + 117,114,110,101,100,32,98,121,32,103,101,116,95,102,105,108, + 101,110,97,109,101,32,104,97,115,32,97,32,102,105,108,101, + 110,97,109,101,32,111,102,32,39,95,95,105,110,105,116,95, + 95,46,112,121,39,46,114,38,0,0,0,114,70,0,0,0, + 114,72,0,0,0,114,27,0,0,0,218,8,95,95,105,110, + 105,116,95,95,41,4,114,46,0,0,0,114,179,0,0,0, + 114,42,0,0,0,114,40,0,0,0,41,5,114,118,0,0, + 0,114,139,0,0,0,114,96,0,0,0,90,13,102,105,108, + 101,110,97,109,101,95,98,97,115,101,90,9,116,97,105,108, + 95,110,97,109,101,114,3,0,0,0,114,3,0,0,0,114, + 6,0,0,0,114,182,0,0,0,1,3,0,0,115,8,0, + 0,0,0,3,18,1,16,1,14,1,122,24,95,76,111,97, + 100,101,114,66,97,115,105,99,115,46,105,115,95,112,97,99, + 107,97,103,101,99,2,0,0,0,0,0,0,0,0,0,0, + 0,2,0,0,0,1,0,0,0,67,0,0,0,115,4,0, + 0,0,100,1,83,0,169,2,122,42,85,115,101,32,100,101, + 102,97,117,108,116,32,115,101,109,97,110,116,105,99,115,32, + 102,111,114,32,109,111,100,117,108,101,32,99,114,101,97,116, + 105,111,110,46,78,114,3,0,0,0,169,2,114,118,0,0, + 0,114,187,0,0,0,114,3,0,0,0,114,3,0,0,0, + 114,6,0,0,0,218,13,99,114,101,97,116,101,95,109,111, + 100,117,108,101,9,3,0,0,115,2,0,0,0,0,1,122, + 27,95,76,111,97,100,101,114,66,97,115,105,99,115,46,99, + 114,101,97,116,101,95,109,111,100,117,108,101,99,2,0,0, + 0,0,0,0,0,0,0,0,0,3,0,0,0,5,0,0, + 0,67,0,0,0,115,56,0,0,0,124,0,160,0,124,1, + 106,1,161,1,125,2,124,2,100,1,107,8,114,36,116,2, + 100,2,160,3,124,1,106,1,161,1,131,1,130,1,116,4, + 160,5,116,6,124,2,124,1,106,7,161,3,1,0,100,1, + 83,0,41,3,122,19,69,120,101,99,117,116,101,32,116,104, + 101,32,109,111,100,117,108,101,46,78,122,52,99,97,110,110, + 111,116,32,108,111,97,100,32,109,111,100,117,108,101,32,123, + 33,114,125,32,119,104,101,110,32,103,101,116,95,99,111,100, + 101,40,41,32,114,101,116,117,114,110,115,32,78,111,110,101, + 41,8,218,8,103,101,116,95,99,111,100,101,114,125,0,0, + 0,114,117,0,0,0,114,61,0,0,0,114,134,0,0,0, + 218,25,95,99,97,108,108,95,119,105,116,104,95,102,114,97, + 109,101,115,95,114,101,109,111,118,101,100,218,4,101,120,101, + 99,114,131,0,0,0,41,3,114,118,0,0,0,218,6,109, + 111,100,117,108,101,114,164,0,0,0,114,3,0,0,0,114, + 3,0,0,0,114,6,0,0,0,218,11,101,120,101,99,95, + 109,111,100,117,108,101,12,3,0,0,115,12,0,0,0,0, + 2,12,1,8,1,6,1,4,255,6,2,122,25,95,76,111, + 97,100,101,114,66,97,115,105,99,115,46,101,120,101,99,95, + 109,111,100,117,108,101,99,2,0,0,0,0,0,0,0,0, + 0,0,0,2,0,0,0,4,0,0,0,67,0,0,0,115, + 12,0,0,0,116,0,160,1,124,0,124,1,161,2,83,0, + 41,1,122,26,84,104,105,115,32,109,111,100,117,108,101,32, + 105,115,32,100,101,112,114,101,99,97,116,101,100,46,41,2, + 114,134,0,0,0,218,17,95,108,111,97,100,95,109,111,100, + 117,108,101,95,115,104,105,109,169,2,114,118,0,0,0,114, + 139,0,0,0,114,3,0,0,0,114,3,0,0,0,114,6, + 0,0,0,218,11,108,111,97,100,95,109,111,100,117,108,101, + 20,3,0,0,115,2,0,0,0,0,2,122,25,95,76,111, + 97,100,101,114,66,97,115,105,99,115,46,108,111,97,100,95, + 109,111,100,117,108,101,78,41,8,114,125,0,0,0,114,124, + 0,0,0,114,126,0,0,0,114,127,0,0,0,114,182,0, + 0,0,114,212,0,0,0,114,217,0,0,0,114,220,0,0, 0,114,3,0,0,0,114,3,0,0,0,114,3,0,0,0, - 114,6,0,0,0,114,22,1,0,0,110,4,0,0,115,24, - 0,0,0,8,1,4,6,8,6,8,10,8,4,8,13,8, - 3,8,3,8,3,8,3,8,3,8,3,114,22,1,0,0, - 99,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,3,0,0,0,64,0,0,0,115,80,0,0,0,101,0, - 90,1,100,0,90,2,100,1,100,2,132,0,90,3,101,4, - 100,3,100,4,132,0,131,1,90,5,100,5,100,6,132,0, - 90,6,100,7,100,8,132,0,90,7,100,9,100,10,132,0, - 90,8,100,11,100,12,132,0,90,9,100,13,100,14,132,0, - 90,10,100,15,100,16,132,0,90,11,100,17,83,0,41,18, - 218,16,95,78,97,109,101,115,112,97,99,101,76,111,97,100, - 101,114,99,4,0,0,0,0,0,0,0,0,0,0,0,4, - 0,0,0,4,0,0,0,67,0,0,0,115,18,0,0,0, - 116,0,124,1,124,2,124,3,131,3,124,0,95,1,100,0, - 83,0,114,109,0,0,0,41,2,114,22,1,0,0,114,24, - 1,0,0,114,28,1,0,0,114,3,0,0,0,114,3,0, - 0,0,114,6,0,0,0,114,209,0,0,0,174,4,0,0, - 115,2,0,0,0,0,1,122,25,95,78,97,109,101,115,112, - 97,99,101,76,111,97,100,101,114,46,95,95,105,110,105,116, - 95,95,99,2,0,0,0,0,0,0,0,0,0,0,0,2, - 0,0,0,3,0,0,0,67,0,0,0,115,12,0,0,0, - 100,1,160,0,124,1,106,1,161,1,83,0,41,2,122,115, - 82,101,116,117,114,110,32,114,101,112,114,32,102,111,114,32, - 116,104,101,32,109,111,100,117,108,101,46,10,10,32,32,32, - 32,32,32,32,32,84,104,101,32,109,101,116,104,111,100,32, - 105,115,32,100,101,112,114,101,99,97,116,101,100,46,32,32, - 84,104,101,32,105,109,112,111,114,116,32,109,97,99,104,105, - 110,101,114,121,32,100,111,101,115,32,116,104,101,32,106,111, - 98,32,105,116,115,101,108,102,46,10,10,32,32,32,32,32, - 32,32,32,122,25,60,109,111,100,117,108,101,32,123,33,114, - 125,32,40,110,97,109,101,115,112,97,99,101,41,62,41,2, - 114,61,0,0,0,114,125,0,0,0,41,2,114,193,0,0, - 0,114,216,0,0,0,114,3,0,0,0,114,3,0,0,0, - 114,6,0,0,0,218,11,109,111,100,117,108,101,95,114,101, - 112,114,177,4,0,0,115,2,0,0,0,0,7,122,28,95, - 78,97,109,101,115,112,97,99,101,76,111,97,100,101,114,46, - 109,111,100,117,108,101,95,114,101,112,114,99,2,0,0,0, - 0,0,0,0,0,0,0,0,2,0,0,0,1,0,0,0, - 67,0,0,0,115,4,0,0,0,100,1,83,0,41,2,78, - 84,114,3,0,0,0,114,219,0,0,0,114,3,0,0,0, - 114,3,0,0,0,114,6,0,0,0,114,182,0,0,0,186, - 4,0,0,115,2,0,0,0,0,1,122,27,95,78,97,109, - 101,115,112,97,99,101,76,111,97,100,101,114,46,105,115,95, - 112,97,99,107,97,103,101,99,2,0,0,0,0,0,0,0, - 0,0,0,0,2,0,0,0,1,0,0,0,67,0,0,0, - 115,4,0,0,0,100,1,83,0,41,2,78,114,39,0,0, - 0,114,3,0,0,0,114,219,0,0,0,114,3,0,0,0, - 114,3,0,0,0,114,6,0,0,0,114,229,0,0,0,189, - 4,0,0,115,2,0,0,0,0,1,122,27,95,78,97,109, - 101,115,112,97,99,101,76,111,97,100,101,114,46,103,101,116, - 95,115,111,117,114,99,101,99,2,0,0,0,0,0,0,0, - 0,0,0,0,2,0,0,0,6,0,0,0,67,0,0,0, - 115,16,0,0,0,116,0,100,1,100,2,100,3,100,4,100, - 5,141,4,83,0,41,6,78,114,39,0,0,0,122,8,60, - 115,116,114,105,110,103,62,114,215,0,0,0,84,41,1,114, - 231,0,0,0,41,1,114,232,0,0,0,114,219,0,0,0, - 114,3,0,0,0,114,3,0,0,0,114,6,0,0,0,114, - 213,0,0,0,192,4,0,0,115,2,0,0,0,0,1,122, - 25,95,78,97,109,101,115,112,97,99,101,76,111,97,100,101, + 114,6,0,0,0,114,208,0,0,0,252,2,0,0,115,10, + 0,0,0,8,2,4,3,8,8,8,3,8,8,114,208,0, + 0,0,99,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,3,0,0,0,64,0,0,0,115,74,0,0,0, + 101,0,90,1,100,0,90,2,100,1,100,2,132,0,90,3, + 100,3,100,4,132,0,90,4,100,5,100,6,132,0,90,5, + 100,7,100,8,132,0,90,6,100,9,100,10,132,0,90,7, + 100,11,100,12,156,1,100,13,100,14,132,2,90,8,100,15, + 100,16,132,0,90,9,100,17,83,0,41,18,218,12,83,111, + 117,114,99,101,76,111,97,100,101,114,99,2,0,0,0,0, + 0,0,0,0,0,0,0,2,0,0,0,1,0,0,0,67, + 0,0,0,115,8,0,0,0,116,0,130,1,100,1,83,0, + 41,2,122,165,79,112,116,105,111,110,97,108,32,109,101,116, + 104,111,100,32,116,104,97,116,32,114,101,116,117,114,110,115, + 32,116,104,101,32,109,111,100,105,102,105,99,97,116,105,111, + 110,32,116,105,109,101,32,40,97,110,32,105,110,116,41,32, + 102,111,114,32,116,104,101,10,32,32,32,32,32,32,32,32, + 115,112,101,99,105,102,105,101,100,32,112,97,116,104,32,40, + 97,32,115,116,114,41,46,10,10,32,32,32,32,32,32,32, + 32,82,97,105,115,101,115,32,79,83,69,114,114,111,114,32, + 119,104,101,110,32,116,104,101,32,112,97,116,104,32,99,97, + 110,110,111,116,32,98,101,32,104,97,110,100,108,101,100,46, + 10,32,32,32,32,32,32,32,32,78,41,1,114,49,0,0, + 0,169,2,114,118,0,0,0,114,43,0,0,0,114,3,0, + 0,0,114,3,0,0,0,114,6,0,0,0,218,10,112,97, + 116,104,95,109,116,105,109,101,27,3,0,0,115,2,0,0, + 0,0,6,122,23,83,111,117,114,99,101,76,111,97,100,101, + 114,46,112,97,116,104,95,109,116,105,109,101,99,2,0,0, + 0,0,0,0,0,0,0,0,0,2,0,0,0,4,0,0, + 0,67,0,0,0,115,14,0,0,0,100,1,124,0,160,0, + 124,1,161,1,105,1,83,0,41,2,97,158,1,0,0,79, + 112,116,105,111,110,97,108,32,109,101,116,104,111,100,32,114, + 101,116,117,114,110,105,110,103,32,97,32,109,101,116,97,100, + 97,116,97,32,100,105,99,116,32,102,111,114,32,116,104,101, + 32,115,112,101,99,105,102,105,101,100,10,32,32,32,32,32, + 32,32,32,112,97,116,104,32,40,97,32,115,116,114,41,46, + 10,10,32,32,32,32,32,32,32,32,80,111,115,115,105,98, + 108,101,32,107,101,121,115,58,10,32,32,32,32,32,32,32, + 32,45,32,39,109,116,105,109,101,39,32,40,109,97,110,100, + 97,116,111,114,121,41,32,105,115,32,116,104,101,32,110,117, + 109,101,114,105,99,32,116,105,109,101,115,116,97,109,112,32, + 111,102,32,108,97,115,116,32,115,111,117,114,99,101,10,32, + 32,32,32,32,32,32,32,32,32,99,111,100,101,32,109,111, + 100,105,102,105,99,97,116,105,111,110,59,10,32,32,32,32, + 32,32,32,32,45,32,39,115,105,122,101,39,32,40,111,112, + 116,105,111,110,97,108,41,32,105,115,32,116,104,101,32,115, + 105,122,101,32,105,110,32,98,121,116,101,115,32,111,102,32, + 116,104,101,32,115,111,117,114,99,101,32,99,111,100,101,46, + 10,10,32,32,32,32,32,32,32,32,73,109,112,108,101,109, + 101,110,116,105,110,103,32,116,104,105,115,32,109,101,116,104, + 111,100,32,97,108,108,111,119,115,32,116,104,101,32,108,111, + 97,100,101,114,32,116,111,32,114,101,97,100,32,98,121,116, + 101,99,111,100,101,32,102,105,108,101,115,46,10,32,32,32, + 32,32,32,32,32,82,97,105,115,101,115,32,79,83,69,114, + 114,111,114,32,119,104,101,110,32,116,104,101,32,112,97,116, + 104,32,99,97,110,110,111,116,32,98,101,32,104,97,110,100, + 108,101,100,46,10,32,32,32,32,32,32,32,32,114,169,0, + 0,0,41,1,114,223,0,0,0,114,222,0,0,0,114,3, + 0,0,0,114,3,0,0,0,114,6,0,0,0,218,10,112, + 97,116,104,95,115,116,97,116,115,35,3,0,0,115,2,0, + 0,0,0,12,122,23,83,111,117,114,99,101,76,111,97,100, + 101,114,46,112,97,116,104,95,115,116,97,116,115,99,4,0, + 0,0,0,0,0,0,0,0,0,0,4,0,0,0,4,0, + 0,0,67,0,0,0,115,12,0,0,0,124,0,160,0,124, + 2,124,3,161,2,83,0,41,1,122,228,79,112,116,105,111, + 110,97,108,32,109,101,116,104,111,100,32,119,104,105,99,104, + 32,119,114,105,116,101,115,32,100,97,116,97,32,40,98,121, + 116,101,115,41,32,116,111,32,97,32,102,105,108,101,32,112, + 97,116,104,32,40,97,32,115,116,114,41,46,10,10,32,32, + 32,32,32,32,32,32,73,109,112,108,101,109,101,110,116,105, + 110,103,32,116,104,105,115,32,109,101,116,104,111,100,32,97, + 108,108,111,119,115,32,102,111,114,32,116,104,101,32,119,114, + 105,116,105,110,103,32,111,102,32,98,121,116,101,99,111,100, + 101,32,102,105,108,101,115,46,10,10,32,32,32,32,32,32, + 32,32,84,104,101,32,115,111,117,114,99,101,32,112,97,116, + 104,32,105,115,32,110,101,101,100,101,100,32,105,110,32,111, + 114,100,101,114,32,116,111,32,99,111,114,114,101,99,116,108, + 121,32,116,114,97,110,115,102,101,114,32,112,101,114,109,105, + 115,115,105,111,110,115,10,32,32,32,32,32,32,32,32,41, + 1,218,8,115,101,116,95,100,97,116,97,41,4,114,118,0, + 0,0,114,107,0,0,0,90,10,99,97,99,104,101,95,112, + 97,116,104,114,25,0,0,0,114,3,0,0,0,114,3,0, + 0,0,114,6,0,0,0,218,15,95,99,97,99,104,101,95, + 98,121,116,101,99,111,100,101,49,3,0,0,115,2,0,0, + 0,0,8,122,28,83,111,117,114,99,101,76,111,97,100,101, + 114,46,95,99,97,99,104,101,95,98,121,116,101,99,111,100, + 101,99,3,0,0,0,0,0,0,0,0,0,0,0,3,0, + 0,0,1,0,0,0,67,0,0,0,115,4,0,0,0,100, + 1,83,0,41,2,122,150,79,112,116,105,111,110,97,108,32, + 109,101,116,104,111,100,32,119,104,105,99,104,32,119,114,105, + 116,101,115,32,100,97,116,97,32,40,98,121,116,101,115,41, + 32,116,111,32,97,32,102,105,108,101,32,112,97,116,104,32, + 40,97,32,115,116,114,41,46,10,10,32,32,32,32,32,32, + 32,32,73,109,112,108,101,109,101,110,116,105,110,103,32,116, + 104,105,115,32,109,101,116,104,111,100,32,97,108,108,111,119, + 115,32,102,111,114,32,116,104,101,32,119,114,105,116,105,110, + 103,32,111,102,32,98,121,116,101,99,111,100,101,32,102,105, + 108,101,115,46,10,32,32,32,32,32,32,32,32,78,114,3, + 0,0,0,41,3,114,118,0,0,0,114,43,0,0,0,114, + 25,0,0,0,114,3,0,0,0,114,3,0,0,0,114,6, + 0,0,0,114,225,0,0,0,59,3,0,0,115,2,0,0, + 0,0,1,122,21,83,111,117,114,99,101,76,111,97,100,101, + 114,46,115,101,116,95,100,97,116,97,99,2,0,0,0,0, + 0,0,0,0,0,0,0,5,0,0,0,10,0,0,0,67, + 0,0,0,115,86,0,0,0,124,0,160,0,124,1,161,1, + 125,2,122,14,124,0,160,1,124,2,161,1,125,3,87,0, + 110,52,4,0,116,2,107,10,114,76,1,0,125,4,1,0, + 122,26,116,3,100,1,124,1,100,2,141,2,124,4,130,2, + 87,0,89,0,100,3,125,4,126,4,110,10,100,3,125,4, + 126,4,48,0,48,0,116,4,124,3,131,1,83,0,41,4, + 122,52,67,111,110,99,114,101,116,101,32,105,109,112,108,101, + 109,101,110,116,97,116,105,111,110,32,111,102,32,73,110,115, + 112,101,99,116,76,111,97,100,101,114,46,103,101,116,95,115, + 111,117,114,99,101,46,122,39,115,111,117,114,99,101,32,110, + 111,116,32,97,118,97,105,108,97,98,108,101,32,116,104,114, + 111,117,103,104,32,103,101,116,95,100,97,116,97,40,41,114, + 115,0,0,0,78,41,5,114,179,0,0,0,218,8,103,101, + 116,95,100,97,116,97,114,49,0,0,0,114,117,0,0,0, + 114,176,0,0,0,41,5,114,118,0,0,0,114,139,0,0, + 0,114,43,0,0,0,114,174,0,0,0,218,3,101,120,99, + 114,3,0,0,0,114,3,0,0,0,114,6,0,0,0,218, + 10,103,101,116,95,115,111,117,114,99,101,66,3,0,0,115, + 20,0,0,0,0,2,10,1,2,1,14,1,16,1,4,1, + 2,255,4,1,2,255,24,2,122,23,83,111,117,114,99,101, + 76,111,97,100,101,114,46,103,101,116,95,115,111,117,114,99, + 101,114,104,0,0,0,41,1,218,9,95,111,112,116,105,109, + 105,122,101,99,3,0,0,0,0,0,0,0,1,0,0,0, + 4,0,0,0,8,0,0,0,67,0,0,0,115,22,0,0, + 0,116,0,106,1,116,2,124,1,124,2,100,1,100,2,124, + 3,100,3,141,6,83,0,41,4,122,130,82,101,116,117,114, + 110,32,116,104,101,32,99,111,100,101,32,111,98,106,101,99, + 116,32,99,111,109,112,105,108,101,100,32,102,114,111,109,32, + 115,111,117,114,99,101,46,10,10,32,32,32,32,32,32,32, + 32,84,104,101,32,39,100,97,116,97,39,32,97,114,103,117, + 109,101,110,116,32,99,97,110,32,98,101,32,97,110,121,32, + 111,98,106,101,99,116,32,116,121,112,101,32,116,104,97,116, + 32,99,111,109,112,105,108,101,40,41,32,115,117,112,112,111, + 114,116,115,46,10,32,32,32,32,32,32,32,32,114,215,0, + 0,0,84,41,2,218,12,100,111,110,116,95,105,110,104,101, + 114,105,116,114,83,0,0,0,41,3,114,134,0,0,0,114, + 214,0,0,0,218,7,99,111,109,112,105,108,101,41,4,114, + 118,0,0,0,114,25,0,0,0,114,43,0,0,0,114,230, + 0,0,0,114,3,0,0,0,114,3,0,0,0,114,6,0, + 0,0,218,14,115,111,117,114,99,101,95,116,111,95,99,111, + 100,101,76,3,0,0,115,8,0,0,0,0,5,12,1,2, + 0,2,255,122,27,83,111,117,114,99,101,76,111,97,100,101, + 114,46,115,111,117,114,99,101,95,116,111,95,99,111,100,101, + 99,2,0,0,0,0,0,0,0,0,0,0,0,15,0,0, + 0,9,0,0,0,67,0,0,0,115,34,2,0,0,124,0, + 160,0,124,1,161,1,125,2,100,1,125,3,100,1,125,4, + 100,1,125,5,100,2,125,6,100,3,125,7,122,12,116,1, + 124,2,131,1,125,8,87,0,110,26,4,0,116,2,107,10, + 114,68,1,0,1,0,1,0,100,1,125,8,89,0,144,1, + 110,48,48,0,122,14,124,0,160,3,124,2,161,1,125,9, + 87,0,110,22,4,0,116,4,107,10,114,106,1,0,1,0, + 1,0,89,0,144,1,110,10,48,0,116,5,124,9,100,4, + 25,0,131,1,125,3,122,14,124,0,160,6,124,8,161,1, + 125,10,87,0,110,20,4,0,116,4,107,10,114,154,1,0, + 1,0,1,0,89,0,110,218,48,0,124,1,124,8,100,5, + 156,2,125,11,122,148,116,7,124,10,124,1,124,11,131,3, + 125,12,116,8,124,10,131,1,100,6,100,1,133,2,25,0, + 125,13,124,12,100,7,64,0,100,8,107,3,125,6,124,6, + 144,1,114,36,124,12,100,9,64,0,100,8,107,3,125,7, + 116,9,106,10,100,10,107,3,144,1,114,56,124,7,115,254, + 116,9,106,10,100,11,107,2,144,1,114,56,124,0,160,6, + 124,2,161,1,125,4,116,9,160,11,116,12,124,4,161,2, + 125,5,116,13,124,10,124,5,124,1,124,11,131,4,1,0, + 110,20,116,14,124,10,124,3,124,9,100,12,25,0,124,1, + 124,11,131,5,1,0,87,0,110,26,4,0,116,15,116,16, + 102,2,107,10,144,1,114,84,1,0,1,0,1,0,89,0, + 110,32,48,0,116,17,160,18,100,13,124,8,124,2,161,3, + 1,0,116,19,124,13,124,1,124,8,124,2,100,14,141,4, + 83,0,124,4,100,1,107,8,144,1,114,136,124,0,160,6, + 124,2,161,1,125,4,124,0,160,20,124,4,124,2,161,2, + 125,14,116,17,160,18,100,15,124,2,161,2,1,0,116,21, + 106,22,144,2,115,30,124,8,100,1,107,9,144,2,114,30, + 124,3,100,1,107,9,144,2,114,30,124,6,144,1,114,228, + 124,5,100,1,107,8,144,1,114,214,116,9,160,11,124,4, + 161,1,125,5,116,23,124,14,124,5,124,7,131,3,125,10, + 110,16,116,24,124,14,124,3,116,25,124,4,131,1,131,3, + 125,10,122,18,124,0,160,26,124,2,124,8,124,10,161,3, + 1,0,87,0,110,22,4,0,116,2,107,10,144,2,114,28, + 1,0,1,0,1,0,89,0,110,2,48,0,124,14,83,0, + 41,16,122,190,67,111,110,99,114,101,116,101,32,105,109,112, + 108,101,109,101,110,116,97,116,105,111,110,32,111,102,32,73, + 110,115,112,101,99,116,76,111,97,100,101,114,46,103,101,116, + 95,99,111,100,101,46,10,10,32,32,32,32,32,32,32,32, + 82,101,97,100,105,110,103,32,111,102,32,98,121,116,101,99, + 111,100,101,32,114,101,113,117,105,114,101,115,32,112,97,116, + 104,95,115,116,97,116,115,32,116,111,32,98,101,32,105,109, + 112,108,101,109,101,110,116,101,100,46,32,84,111,32,119,114, + 105,116,101,10,32,32,32,32,32,32,32,32,98,121,116,101, + 99,111,100,101,44,32,115,101,116,95,100,97,116,97,32,109, + 117,115,116,32,97,108,115,111,32,98,101,32,105,109,112,108, + 101,109,101,110,116,101,100,46,10,10,32,32,32,32,32,32, + 32,32,78,70,84,114,169,0,0,0,114,159,0,0,0,114, + 145,0,0,0,114,38,0,0,0,114,72,0,0,0,114,27, + 0,0,0,90,5,110,101,118,101,114,90,6,97,108,119,97, + 121,115,218,4,115,105,122,101,122,13,123,125,32,109,97,116, + 99,104,101,115,32,123,125,41,3,114,116,0,0,0,114,106, + 0,0,0,114,107,0,0,0,122,19,99,111,100,101,32,111, + 98,106,101,99,116,32,102,114,111,109,32,123,125,41,27,114, + 179,0,0,0,114,97,0,0,0,114,81,0,0,0,114,224, + 0,0,0,114,49,0,0,0,114,17,0,0,0,114,227,0, + 0,0,114,152,0,0,0,218,10,109,101,109,111,114,121,118, + 105,101,119,114,163,0,0,0,90,21,99,104,101,99,107,95, + 104,97,115,104,95,98,97,115,101,100,95,112,121,99,115,114, + 157,0,0,0,218,17,95,82,65,87,95,77,65,71,73,67, + 95,78,85,77,66,69,82,114,158,0,0,0,114,156,0,0, + 0,114,117,0,0,0,114,150,0,0,0,114,134,0,0,0, + 114,149,0,0,0,114,165,0,0,0,114,233,0,0,0,114, + 8,0,0,0,218,19,100,111,110,116,95,119,114,105,116,101, + 95,98,121,116,101,99,111,100,101,114,171,0,0,0,114,170, + 0,0,0,114,22,0,0,0,114,226,0,0,0,41,15,114, + 118,0,0,0,114,139,0,0,0,114,107,0,0,0,114,154, + 0,0,0,114,174,0,0,0,114,157,0,0,0,90,10,104, + 97,115,104,95,98,97,115,101,100,90,12,99,104,101,99,107, + 95,115,111,117,114,99,101,114,106,0,0,0,218,2,115,116, + 114,25,0,0,0,114,151,0,0,0,114,82,0,0,0,90, + 10,98,121,116,101,115,95,100,97,116,97,90,11,99,111,100, + 101,95,111,98,106,101,99,116,114,3,0,0,0,114,3,0, + 0,0,114,6,0,0,0,114,213,0,0,0,84,3,0,0, + 115,152,0,0,0,0,7,10,1,4,1,4,1,4,1,4, + 1,4,1,2,1,12,1,14,1,12,2,2,1,14,1,14, + 1,8,2,12,1,2,1,14,1,14,1,6,3,2,1,2, + 254,6,4,2,1,12,1,16,1,12,1,6,1,12,1,12, + 1,2,255,2,2,8,254,4,3,10,1,4,1,2,1,2, + 254,4,4,8,1,2,255,6,3,2,1,2,1,2,1,6, + 1,2,1,2,251,8,7,20,1,6,2,8,1,2,255,4, + 2,6,1,2,1,2,254,6,3,10,1,10,1,12,1,12, + 1,18,1,6,255,4,2,6,1,10,1,10,1,14,2,6, + 1,6,255,4,2,2,1,18,1,16,1,6,1,122,21,83, + 111,117,114,99,101,76,111,97,100,101,114,46,103,101,116,95, + 99,111,100,101,78,41,10,114,125,0,0,0,114,124,0,0, + 0,114,126,0,0,0,114,223,0,0,0,114,224,0,0,0, + 114,226,0,0,0,114,225,0,0,0,114,229,0,0,0,114, + 233,0,0,0,114,213,0,0,0,114,3,0,0,0,114,3, + 0,0,0,114,3,0,0,0,114,6,0,0,0,114,221,0, + 0,0,25,3,0,0,115,14,0,0,0,8,2,8,8,8, + 14,8,10,8,7,8,10,14,8,114,221,0,0,0,99,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4, + 0,0,0,0,0,0,0,115,124,0,0,0,101,0,90,1, + 100,0,90,2,100,1,90,3,100,2,100,3,132,0,90,4, + 100,4,100,5,132,0,90,5,100,6,100,7,132,0,90,6, + 101,7,135,0,102,1,100,8,100,9,132,8,131,1,90,8, + 101,7,100,10,100,11,132,0,131,1,90,9,100,12,100,13, + 132,0,90,10,101,7,100,14,100,15,132,0,131,1,90,11, + 100,16,100,17,132,0,90,12,100,18,100,19,132,0,90,13, + 100,20,100,21,132,0,90,14,100,22,100,23,132,0,90,15, + 135,0,4,0,90,16,83,0,41,24,218,10,70,105,108,101, + 76,111,97,100,101,114,122,103,66,97,115,101,32,102,105,108, + 101,32,108,111,97,100,101,114,32,99,108,97,115,115,32,119, + 104,105,99,104,32,105,109,112,108,101,109,101,110,116,115,32, + 116,104,101,32,108,111,97,100,101,114,32,112,114,111,116,111, + 99,111,108,32,109,101,116,104,111,100,115,32,116,104,97,116, + 10,32,32,32,32,114,101,113,117,105,114,101,32,102,105,108, + 101,32,115,121,115,116,101,109,32,117,115,97,103,101,46,99, + 3,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0, + 2,0,0,0,67,0,0,0,115,16,0,0,0,124,1,124, + 0,95,0,124,2,124,0,95,1,100,1,83,0,41,2,122, + 75,67,97,99,104,101,32,116,104,101,32,109,111,100,117,108, + 101,32,110,97,109,101,32,97,110,100,32,116,104,101,32,112, + 97,116,104,32,116,111,32,116,104,101,32,102,105,108,101,32, + 102,111,117,110,100,32,98,121,32,116,104,101,10,32,32,32, + 32,32,32,32,32,102,105,110,100,101,114,46,78,114,159,0, + 0,0,41,3,114,118,0,0,0,114,139,0,0,0,114,43, + 0,0,0,114,3,0,0,0,114,3,0,0,0,114,6,0, + 0,0,114,209,0,0,0,174,3,0,0,115,4,0,0,0, + 0,3,6,1,122,19,70,105,108,101,76,111,97,100,101,114, + 46,95,95,105,110,105,116,95,95,99,2,0,0,0,0,0, + 0,0,0,0,0,0,2,0,0,0,2,0,0,0,67,0, + 0,0,115,24,0,0,0,124,0,106,0,124,1,106,0,107, + 2,111,22,124,0,106,1,124,1,106,1,107,2,83,0,114, + 109,0,0,0,169,2,218,9,95,95,99,108,97,115,115,95, + 95,114,131,0,0,0,169,2,114,118,0,0,0,90,5,111, + 116,104,101,114,114,3,0,0,0,114,3,0,0,0,114,6, + 0,0,0,218,6,95,95,101,113,95,95,180,3,0,0,115, + 6,0,0,0,0,1,12,1,10,255,122,17,70,105,108,101, + 76,111,97,100,101,114,46,95,95,101,113,95,95,99,1,0, + 0,0,0,0,0,0,0,0,0,0,1,0,0,0,3,0, + 0,0,67,0,0,0,115,20,0,0,0,116,0,124,0,106, + 1,131,1,116,0,124,0,106,2,131,1,65,0,83,0,114, + 109,0,0,0,169,3,218,4,104,97,115,104,114,116,0,0, + 0,114,43,0,0,0,169,1,114,118,0,0,0,114,3,0, + 0,0,114,3,0,0,0,114,6,0,0,0,218,8,95,95, + 104,97,115,104,95,95,184,3,0,0,115,2,0,0,0,0, + 1,122,19,70,105,108,101,76,111,97,100,101,114,46,95,95, + 104,97,115,104,95,95,99,2,0,0,0,0,0,0,0,0, + 0,0,0,2,0,0,0,3,0,0,0,3,0,0,0,115, + 16,0,0,0,116,0,116,1,124,0,131,2,160,2,124,1, + 161,1,83,0,41,1,122,100,76,111,97,100,32,97,32,109, + 111,100,117,108,101,32,102,114,111,109,32,97,32,102,105,108, + 101,46,10,10,32,32,32,32,32,32,32,32,84,104,105,115, + 32,109,101,116,104,111,100,32,105,115,32,100,101,112,114,101, + 99,97,116,101,100,46,32,32,85,115,101,32,101,120,101,99, + 95,109,111,100,117,108,101,40,41,32,105,110,115,116,101,97, + 100,46,10,10,32,32,32,32,32,32,32,32,41,3,218,5, + 115,117,112,101,114,114,239,0,0,0,114,220,0,0,0,114, + 219,0,0,0,169,1,114,241,0,0,0,114,3,0,0,0, + 114,6,0,0,0,114,220,0,0,0,187,3,0,0,115,2, + 0,0,0,0,10,122,22,70,105,108,101,76,111,97,100,101, + 114,46,108,111,97,100,95,109,111,100,117,108,101,99,2,0, + 0,0,0,0,0,0,0,0,0,0,2,0,0,0,1,0, + 0,0,67,0,0,0,115,6,0,0,0,124,0,106,0,83, + 0,169,1,122,58,82,101,116,117,114,110,32,116,104,101,32, + 112,97,116,104,32,116,111,32,116,104,101,32,115,111,117,114, + 99,101,32,102,105,108,101,32,97,115,32,102,111,117,110,100, + 32,98,121,32,116,104,101,32,102,105,110,100,101,114,46,114, + 47,0,0,0,114,219,0,0,0,114,3,0,0,0,114,3, + 0,0,0,114,6,0,0,0,114,179,0,0,0,199,3,0, + 0,115,2,0,0,0,0,3,122,23,70,105,108,101,76,111, + 97,100,101,114,46,103,101,116,95,102,105,108,101,110,97,109, + 101,99,2,0,0,0,0,0,0,0,0,0,0,0,3,0, + 0,0,8,0,0,0,67,0,0,0,115,126,0,0,0,116, + 0,124,0,116,1,116,2,102,2,131,2,114,70,116,3,160, + 4,116,5,124,1,131,1,161,1,143,24,125,2,124,2,160, + 6,161,0,87,0,2,0,100,1,4,0,4,0,131,3,1, + 0,83,0,49,0,115,58,48,0,1,0,1,0,1,0,89, + 0,1,0,110,52,116,3,160,7,124,1,100,2,161,2,143, + 24,125,2,124,2,160,6,161,0,87,0,2,0,100,1,4, + 0,4,0,131,3,1,0,83,0,49,0,115,112,48,0,1, + 0,1,0,1,0,89,0,1,0,100,1,83,0,41,3,122, + 39,82,101,116,117,114,110,32,116,104,101,32,100,97,116,97, + 32,102,114,111,109,32,112,97,116,104,32,97,115,32,114,97, + 119,32,98,121,116,101,115,46,78,218,1,114,41,8,114,161, + 0,0,0,114,221,0,0,0,218,19,69,120,116,101,110,115, + 105,111,110,70,105,108,101,76,111,97,100,101,114,114,63,0, + 0,0,90,9,111,112,101,110,95,99,111,100,101,114,84,0, + 0,0,90,4,114,101,97,100,114,64,0,0,0,41,3,114, + 118,0,0,0,114,43,0,0,0,114,67,0,0,0,114,3, + 0,0,0,114,3,0,0,0,114,6,0,0,0,114,227,0, + 0,0,204,3,0,0,115,10,0,0,0,0,2,14,1,16, + 1,40,2,14,1,122,19,70,105,108,101,76,111,97,100,101, + 114,46,103,101,116,95,100,97,116,97,99,2,0,0,0,0, + 0,0,0,0,0,0,0,2,0,0,0,3,0,0,0,67, + 0,0,0,115,18,0,0,0,124,0,160,0,124,1,161,1, + 114,14,124,0,83,0,100,0,83,0,114,109,0,0,0,41, + 1,114,182,0,0,0,169,2,114,118,0,0,0,114,216,0, + 0,0,114,3,0,0,0,114,3,0,0,0,114,6,0,0, + 0,218,19,103,101,116,95,114,101,115,111,117,114,99,101,95, + 114,101,97,100,101,114,215,3,0,0,115,6,0,0,0,0, + 2,10,1,4,1,122,30,70,105,108,101,76,111,97,100,101, + 114,46,103,101,116,95,114,101,115,111,117,114,99,101,95,114, + 101,97,100,101,114,99,2,0,0,0,0,0,0,0,0,0, + 0,0,3,0,0,0,4,0,0,0,67,0,0,0,115,32, + 0,0,0,116,0,116,1,124,0,106,2,131,1,100,1,25, + 0,124,1,131,2,125,2,116,3,160,4,124,2,100,2,161, + 2,83,0,41,3,78,114,72,0,0,0,114,251,0,0,0, + 41,5,114,37,0,0,0,114,46,0,0,0,114,43,0,0, + 0,114,63,0,0,0,114,64,0,0,0,169,3,114,118,0, + 0,0,90,8,114,101,115,111,117,114,99,101,114,43,0,0, + 0,114,3,0,0,0,114,3,0,0,0,114,6,0,0,0, + 218,13,111,112,101,110,95,114,101,115,111,117,114,99,101,221, + 3,0,0,115,4,0,0,0,0,1,20,1,122,24,70,105, + 108,101,76,111,97,100,101,114,46,111,112,101,110,95,114,101, + 115,111,117,114,99,101,99,2,0,0,0,0,0,0,0,0, + 0,0,0,3,0,0,0,3,0,0,0,67,0,0,0,115, + 38,0,0,0,124,0,160,0,124,1,161,1,115,14,116,1, + 130,1,116,2,116,3,124,0,106,4,131,1,100,1,25,0, + 124,1,131,2,125,2,124,2,83,0,169,2,78,114,72,0, + 0,0,41,5,218,11,105,115,95,114,101,115,111,117,114,99, + 101,218,17,70,105,108,101,78,111,116,70,111,117,110,100,69, + 114,114,111,114,114,37,0,0,0,114,46,0,0,0,114,43, + 0,0,0,114,255,0,0,0,114,3,0,0,0,114,3,0, + 0,0,114,6,0,0,0,218,13,114,101,115,111,117,114,99, + 101,95,112,97,116,104,225,3,0,0,115,8,0,0,0,0, + 1,10,1,4,1,20,1,122,24,70,105,108,101,76,111,97, + 100,101,114,46,114,101,115,111,117,114,99,101,95,112,97,116, + 104,99,2,0,0,0,0,0,0,0,0,0,0,0,3,0, + 0,0,3,0,0,0,67,0,0,0,115,40,0,0,0,116, + 0,124,1,107,6,114,12,100,1,83,0,116,1,116,2,124, + 0,106,3,131,1,100,2,25,0,124,1,131,2,125,2,116, + 4,124,2,131,1,83,0,41,3,78,70,114,72,0,0,0, + 41,5,114,34,0,0,0,114,37,0,0,0,114,46,0,0, + 0,114,43,0,0,0,114,53,0,0,0,169,3,114,118,0, + 0,0,114,116,0,0,0,114,43,0,0,0,114,3,0,0, + 0,114,3,0,0,0,114,6,0,0,0,114,2,1,0,0, + 231,3,0,0,115,8,0,0,0,0,1,8,1,4,1,20, + 1,122,22,70,105,108,101,76,111,97,100,101,114,46,105,115, + 95,114,101,115,111,117,114,99,101,99,1,0,0,0,0,0, + 0,0,0,0,0,0,1,0,0,0,5,0,0,0,67,0, + 0,0,115,24,0,0,0,116,0,116,1,160,2,116,3,124, + 0,106,4,131,1,100,1,25,0,161,1,131,1,83,0,114, + 1,1,0,0,41,5,218,4,105,116,101,114,114,2,0,0, + 0,218,7,108,105,115,116,100,105,114,114,46,0,0,0,114, + 43,0,0,0,114,246,0,0,0,114,3,0,0,0,114,3, + 0,0,0,114,6,0,0,0,218,8,99,111,110,116,101,110, + 116,115,237,3,0,0,115,2,0,0,0,0,1,122,19,70, + 105,108,101,76,111,97,100,101,114,46,99,111,110,116,101,110, + 116,115,41,17,114,125,0,0,0,114,124,0,0,0,114,126, + 0,0,0,114,127,0,0,0,114,209,0,0,0,114,243,0, + 0,0,114,247,0,0,0,114,136,0,0,0,114,220,0,0, + 0,114,179,0,0,0,114,227,0,0,0,114,254,0,0,0, + 114,0,1,0,0,114,4,1,0,0,114,2,1,0,0,114, + 8,1,0,0,90,13,95,95,99,108,97,115,115,99,101,108, + 108,95,95,114,3,0,0,0,114,3,0,0,0,114,249,0, + 0,0,114,6,0,0,0,114,239,0,0,0,169,3,0,0, + 115,30,0,0,0,8,2,4,3,8,6,8,4,8,3,2, + 1,14,11,2,1,10,4,8,11,2,1,10,5,8,4,8, + 6,8,6,114,239,0,0,0,99,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,3,0,0,0,64,0,0, + 0,115,46,0,0,0,101,0,90,1,100,0,90,2,100,1, + 90,3,100,2,100,3,132,0,90,4,100,4,100,5,132,0, + 90,5,100,6,100,7,156,1,100,8,100,9,132,2,90,6, + 100,10,83,0,41,11,218,16,83,111,117,114,99,101,70,105, + 108,101,76,111,97,100,101,114,122,62,67,111,110,99,114,101, + 116,101,32,105,109,112,108,101,109,101,110,116,97,116,105,111, + 110,32,111,102,32,83,111,117,114,99,101,76,111,97,100,101, + 114,32,117,115,105,110,103,32,116,104,101,32,102,105,108,101, + 32,115,121,115,116,101,109,46,99,2,0,0,0,0,0,0, + 0,0,0,0,0,3,0,0,0,3,0,0,0,67,0,0, + 0,115,22,0,0,0,116,0,124,1,131,1,125,2,124,2, + 106,1,124,2,106,2,100,1,156,2,83,0,41,2,122,33, + 82,101,116,117,114,110,32,116,104,101,32,109,101,116,97,100, + 97,116,97,32,102,111,114,32,116,104,101,32,112,97,116,104, + 46,41,2,114,169,0,0,0,114,234,0,0,0,41,3,114, + 48,0,0,0,218,8,115,116,95,109,116,105,109,101,90,7, + 115,116,95,115,105,122,101,41,3,114,118,0,0,0,114,43, + 0,0,0,114,238,0,0,0,114,3,0,0,0,114,3,0, + 0,0,114,6,0,0,0,114,224,0,0,0,245,3,0,0, + 115,4,0,0,0,0,2,8,1,122,27,83,111,117,114,99, + 101,70,105,108,101,76,111,97,100,101,114,46,112,97,116,104, + 95,115,116,97,116,115,99,4,0,0,0,0,0,0,0,0, + 0,0,0,5,0,0,0,5,0,0,0,67,0,0,0,115, + 24,0,0,0,116,0,124,1,131,1,125,4,124,0,106,1, + 124,2,124,3,124,4,100,1,141,3,83,0,41,2,78,169, + 1,218,5,95,109,111,100,101,41,2,114,114,0,0,0,114, + 225,0,0,0,41,5,114,118,0,0,0,114,107,0,0,0, + 114,106,0,0,0,114,25,0,0,0,114,51,0,0,0,114, + 3,0,0,0,114,3,0,0,0,114,6,0,0,0,114,226, + 0,0,0,250,3,0,0,115,4,0,0,0,0,2,8,1, + 122,32,83,111,117,114,99,101,70,105,108,101,76,111,97,100, + 101,114,46,95,99,97,99,104,101,95,98,121,116,101,99,111, + 100,101,114,59,0,0,0,114,11,1,0,0,99,3,0,0, + 0,0,0,0,0,1,0,0,0,9,0,0,0,11,0,0, + 0,67,0,0,0,115,2,1,0,0,116,0,124,1,131,1, + 92,2,125,4,125,5,103,0,125,6,124,4,114,52,116,1, + 124,4,131,1,115,52,116,0,124,4,131,1,92,2,125,4, + 125,7,124,6,160,2,124,7,161,1,1,0,113,16,116,3, + 124,6,131,1,68,0,93,108,125,7,116,4,124,4,124,7, + 131,2,125,4,122,14,116,5,160,6,124,4,161,1,1,0, + 87,0,113,60,4,0,116,7,107,10,114,112,1,0,1,0, + 1,0,89,0,113,60,89,0,113,60,4,0,116,8,107,10, + 114,166,1,0,125,8,1,0,122,30,116,9,160,10,100,1, + 124,4,124,8,161,3,1,0,87,0,89,0,100,2,125,8, + 126,8,1,0,100,2,83,0,100,2,125,8,126,8,48,0, + 48,0,113,60,122,28,116,11,124,1,124,2,124,3,131,3, + 1,0,116,9,160,10,100,3,124,1,161,2,1,0,87,0, + 110,54,4,0,116,8,107,10,144,0,114,252,1,0,125,8, + 1,0,122,26,116,9,160,10,100,1,124,1,124,8,161,3, + 1,0,87,0,89,0,100,2,125,8,126,8,110,10,100,2, + 125,8,126,8,48,0,48,0,100,2,83,0,41,4,122,27, + 87,114,105,116,101,32,98,121,116,101,115,32,100,97,116,97, + 32,116,111,32,97,32,102,105,108,101,46,122,27,99,111,117, + 108,100,32,110,111,116,32,99,114,101,97,116,101,32,123,33, + 114,125,58,32,123,33,114,125,78,122,12,99,114,101,97,116, + 101,100,32,123,33,114,125,41,12,114,46,0,0,0,114,55, + 0,0,0,114,186,0,0,0,114,41,0,0,0,114,37,0, + 0,0,114,2,0,0,0,90,5,109,107,100,105,114,218,15, + 70,105,108,101,69,120,105,115,116,115,69,114,114,111,114,114, + 49,0,0,0,114,134,0,0,0,114,149,0,0,0,114,68, + 0,0,0,41,9,114,118,0,0,0,114,43,0,0,0,114, + 25,0,0,0,114,12,1,0,0,218,6,112,97,114,101,110, + 116,114,96,0,0,0,114,36,0,0,0,114,32,0,0,0, + 114,228,0,0,0,114,3,0,0,0,114,3,0,0,0,114, + 6,0,0,0,114,225,0,0,0,255,3,0,0,115,48,0, + 0,0,0,2,12,1,4,2,12,1,12,1,12,2,12,1, + 10,1,2,1,14,1,14,2,8,1,16,3,6,1,2,0, + 2,255,4,2,28,1,2,1,12,1,16,1,18,2,8,1, + 2,255,122,25,83,111,117,114,99,101,70,105,108,101,76,111, + 97,100,101,114,46,115,101,116,95,100,97,116,97,78,41,7, + 114,125,0,0,0,114,124,0,0,0,114,126,0,0,0,114, + 127,0,0,0,114,224,0,0,0,114,226,0,0,0,114,225, + 0,0,0,114,3,0,0,0,114,3,0,0,0,114,3,0, + 0,0,114,6,0,0,0,114,9,1,0,0,241,3,0,0, + 115,8,0,0,0,8,2,4,2,8,5,8,5,114,9,1, + 0,0,99,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,2,0,0,0,64,0,0,0,115,32,0,0,0, + 101,0,90,1,100,0,90,2,100,1,90,3,100,2,100,3, + 132,0,90,4,100,4,100,5,132,0,90,5,100,6,83,0, + 41,7,218,20,83,111,117,114,99,101,108,101,115,115,70,105, + 108,101,76,111,97,100,101,114,122,45,76,111,97,100,101,114, + 32,119,104,105,99,104,32,104,97,110,100,108,101,115,32,115, + 111,117,114,99,101,108,101,115,115,32,102,105,108,101,32,105, + 109,112,111,114,116,115,46,99,2,0,0,0,0,0,0,0, + 0,0,0,0,5,0,0,0,5,0,0,0,67,0,0,0, + 115,68,0,0,0,124,0,160,0,124,1,161,1,125,2,124, + 0,160,1,124,2,161,1,125,3,124,1,124,2,100,1,156, + 2,125,4,116,2,124,3,124,1,124,4,131,3,1,0,116, + 3,116,4,124,3,131,1,100,2,100,0,133,2,25,0,124, + 1,124,2,100,3,141,3,83,0,41,4,78,114,159,0,0, + 0,114,145,0,0,0,41,2,114,116,0,0,0,114,106,0, + 0,0,41,5,114,179,0,0,0,114,227,0,0,0,114,152, + 0,0,0,114,165,0,0,0,114,235,0,0,0,41,5,114, + 118,0,0,0,114,139,0,0,0,114,43,0,0,0,114,25, + 0,0,0,114,151,0,0,0,114,3,0,0,0,114,3,0, + 0,0,114,6,0,0,0,114,213,0,0,0,34,4,0,0, + 115,22,0,0,0,0,1,10,1,10,4,2,1,2,254,6, + 4,12,1,2,1,14,1,2,1,2,253,122,29,83,111,117, + 114,99,101,108,101,115,115,70,105,108,101,76,111,97,100,101, 114,46,103,101,116,95,99,111,100,101,99,2,0,0,0,0, 0,0,0,0,0,0,0,2,0,0,0,1,0,0,0,67, - 0,0,0,115,4,0,0,0,100,1,83,0,114,210,0,0, - 0,114,3,0,0,0,114,211,0,0,0,114,3,0,0,0, - 114,3,0,0,0,114,6,0,0,0,114,212,0,0,0,195, - 4,0,0,115,2,0,0,0,0,1,122,30,95,78,97,109, - 101,115,112,97,99,101,76,111,97,100,101,114,46,99,114,101, - 97,116,101,95,109,111,100,117,108,101,99,2,0,0,0,0, - 0,0,0,0,0,0,0,2,0,0,0,1,0,0,0,67, - 0,0,0,115,4,0,0,0,100,0,83,0,114,109,0,0, - 0,114,3,0,0,0,114,253,0,0,0,114,3,0,0,0, - 114,3,0,0,0,114,6,0,0,0,114,217,0,0,0,198, - 4,0,0,115,2,0,0,0,0,1,122,28,95,78,97,109, - 101,115,112,97,99,101,76,111,97,100,101,114,46,101,120,101, - 99,95,109,111,100,117,108,101,99,2,0,0,0,0,0,0, - 0,0,0,0,0,2,0,0,0,4,0,0,0,67,0,0, - 0,115,26,0,0,0,116,0,160,1,100,1,124,0,106,2, - 161,2,1,0,116,0,160,3,124,0,124,1,161,2,83,0, - 41,2,122,98,76,111,97,100,32,97,32,110,97,109,101,115, - 112,97,99,101,32,109,111,100,117,108,101,46,10,10,32,32, - 32,32,32,32,32,32,84,104,105,115,32,109,101,116,104,111, - 100,32,105,115,32,100,101,112,114,101,99,97,116,101,100,46, - 32,32,85,115,101,32,101,120,101,99,95,109,111,100,117,108, - 101,40,41,32,105,110,115,116,101,97,100,46,10,10,32,32, - 32,32,32,32,32,32,122,38,110,97,109,101,115,112,97,99, - 101,32,109,111,100,117,108,101,32,108,111,97,100,101,100,32, - 119,105,116,104,32,112,97,116,104,32,123,33,114,125,41,4, - 114,134,0,0,0,114,149,0,0,0,114,24,1,0,0,114, - 218,0,0,0,114,219,0,0,0,114,3,0,0,0,114,3, - 0,0,0,114,6,0,0,0,114,220,0,0,0,201,4,0, - 0,115,8,0,0,0,0,7,6,1,4,255,4,2,122,28, - 95,78,97,109,101,115,112,97,99,101,76,111,97,100,101,114, - 46,108,111,97,100,95,109,111,100,117,108,101,78,41,12,114, - 125,0,0,0,114,124,0,0,0,114,126,0,0,0,114,209, - 0,0,0,114,207,0,0,0,114,44,1,0,0,114,182,0, - 0,0,114,229,0,0,0,114,213,0,0,0,114,212,0,0, - 0,114,217,0,0,0,114,220,0,0,0,114,3,0,0,0, - 114,3,0,0,0,114,3,0,0,0,114,6,0,0,0,114, - 43,1,0,0,173,4,0,0,115,18,0,0,0,8,1,8, - 3,2,1,10,8,8,3,8,3,8,3,8,3,8,3,114, - 43,1,0,0,99,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,4,0,0,0,64,0,0,0,115,118,0, - 0,0,101,0,90,1,100,0,90,2,100,1,90,3,101,4, - 100,2,100,3,132,0,131,1,90,5,101,4,100,4,100,5, - 132,0,131,1,90,6,101,4,100,6,100,7,132,0,131,1, - 90,7,101,4,100,8,100,9,132,0,131,1,90,8,101,4, - 100,19,100,11,100,12,132,1,131,1,90,9,101,4,100,20, - 100,13,100,14,132,1,131,1,90,10,101,4,100,21,100,15, - 100,16,132,1,131,1,90,11,101,4,100,17,100,18,132,0, - 131,1,90,12,100,10,83,0,41,22,218,10,80,97,116,104, - 70,105,110,100,101,114,122,62,77,101,116,97,32,112,97,116, - 104,32,102,105,110,100,101,114,32,102,111,114,32,115,121,115, - 46,112,97,116,104,32,97,110,100,32,112,97,99,107,97,103, - 101,32,95,95,112,97,116,104,95,95,32,97,116,116,114,105, - 98,117,116,101,115,46,99,1,0,0,0,0,0,0,0,0, - 0,0,0,3,0,0,0,4,0,0,0,67,0,0,0,115, - 64,0,0,0,116,0,116,1,106,2,160,3,161,0,131,1, - 68,0,93,44,92,2,125,1,125,2,124,2,100,1,107,8, - 114,40,116,1,106,2,124,1,61,0,113,14,116,4,124,2, - 100,2,131,2,114,14,124,2,160,5,161,0,1,0,113,14, - 100,1,83,0,41,3,122,125,67,97,108,108,32,116,104,101, - 32,105,110,118,97,108,105,100,97,116,101,95,99,97,99,104, - 101,115,40,41,32,109,101,116,104,111,100,32,111,110,32,97, - 108,108,32,112,97,116,104,32,101,110,116,114,121,32,102,105, - 110,100,101,114,115,10,32,32,32,32,32,32,32,32,115,116, - 111,114,101,100,32,105,110,32,115,121,115,46,112,97,116,104, - 95,105,109,112,111,114,116,101,114,95,99,97,99,104,101,115, - 32,40,119,104,101,114,101,32,105,109,112,108,101,109,101,110, - 116,101,100,41,46,78,218,17,105,110,118,97,108,105,100,97, - 116,101,95,99,97,99,104,101,115,41,6,218,4,108,105,115, - 116,114,8,0,0,0,218,19,112,97,116,104,95,105,109,112, - 111,114,116,101,114,95,99,97,99,104,101,218,5,105,116,101, - 109,115,114,128,0,0,0,114,46,1,0,0,41,3,114,193, - 0,0,0,114,116,0,0,0,218,6,102,105,110,100,101,114, - 114,3,0,0,0,114,3,0,0,0,114,6,0,0,0,114, - 46,1,0,0,219,4,0,0,115,10,0,0,0,0,4,22, - 1,8,1,10,1,10,1,122,28,80,97,116,104,70,105,110, - 100,101,114,46,105,110,118,97,108,105,100,97,116,101,95,99, - 97,99,104,101,115,99,2,0,0,0,0,0,0,0,0,0, - 0,0,3,0,0,0,9,0,0,0,67,0,0,0,115,84, - 0,0,0,116,0,106,1,100,1,107,9,114,28,116,0,106, - 1,115,28,116,2,160,3,100,2,116,4,161,2,1,0,116, - 0,106,1,68,0,93,44,125,2,122,14,124,2,124,1,131, - 1,87,0,2,0,1,0,83,0,4,0,116,5,107,10,114, - 76,1,0,1,0,1,0,89,0,113,34,89,0,113,34,88, - 0,113,34,100,1,83,0,41,3,122,46,83,101,97,114,99, - 104,32,115,121,115,46,112,97,116,104,95,104,111,111,107,115, - 32,102,111,114,32,97,32,102,105,110,100,101,114,32,102,111, - 114,32,39,112,97,116,104,39,46,78,122,23,115,121,115,46, - 112,97,116,104,95,104,111,111,107,115,32,105,115,32,101,109, - 112,116,121,41,6,114,8,0,0,0,218,10,112,97,116,104, - 95,104,111,111,107,115,114,74,0,0,0,114,75,0,0,0, - 114,138,0,0,0,114,117,0,0,0,41,3,114,193,0,0, - 0,114,43,0,0,0,90,4,104,111,111,107,114,3,0,0, - 0,114,3,0,0,0,114,6,0,0,0,218,11,95,112,97, - 116,104,95,104,111,111,107,115,229,4,0,0,115,16,0,0, - 0,0,3,16,1,12,1,10,1,2,1,14,1,14,1,12, - 2,122,22,80,97,116,104,70,105,110,100,101,114,46,95,112, - 97,116,104,95,104,111,111,107,115,99,2,0,0,0,0,0, - 0,0,0,0,0,0,3,0,0,0,8,0,0,0,67,0, - 0,0,115,104,0,0,0,124,1,100,1,107,2,114,44,122, - 12,116,0,160,1,161,0,125,1,87,0,110,22,4,0,116, - 2,107,10,114,42,1,0,1,0,1,0,89,0,100,2,83, - 0,88,0,122,14,116,3,106,4,124,1,25,0,125,2,87, - 0,110,40,4,0,116,5,107,10,114,98,1,0,1,0,1, - 0,124,0,160,6,124,1,161,1,125,2,124,2,116,3,106, - 4,124,1,60,0,89,0,110,2,88,0,124,2,83,0,41, - 3,122,210,71,101,116,32,116,104,101,32,102,105,110,100,101, - 114,32,102,111,114,32,116,104,101,32,112,97,116,104,32,101, - 110,116,114,121,32,102,114,111,109,32,115,121,115,46,112,97, - 116,104,95,105,109,112,111,114,116,101,114,95,99,97,99,104, - 101,46,10,10,32,32,32,32,32,32,32,32,73,102,32,116, - 104,101,32,112,97,116,104,32,101,110,116,114,121,32,105,115, - 32,110,111,116,32,105,110,32,116,104,101,32,99,97,99,104, - 101,44,32,102,105,110,100,32,116,104,101,32,97,112,112,114, - 111,112,114,105,97,116,101,32,102,105,110,100,101,114,10,32, - 32,32,32,32,32,32,32,97,110,100,32,99,97,99,104,101, - 32,105,116,46,32,73,102,32,110,111,32,102,105,110,100,101, - 114,32,105,115,32,97,118,97,105,108,97,98,108,101,44,32, - 115,116,111,114,101,32,78,111,110,101,46,10,10,32,32,32, - 32,32,32,32,32,114,39,0,0,0,78,41,7,114,2,0, - 0,0,114,54,0,0,0,114,3,1,0,0,114,8,0,0, - 0,114,48,1,0,0,218,8,75,101,121,69,114,114,111,114, - 114,52,1,0,0,41,3,114,193,0,0,0,114,43,0,0, - 0,114,50,1,0,0,114,3,0,0,0,114,3,0,0,0, - 114,6,0,0,0,218,20,95,112,97,116,104,95,105,109,112, - 111,114,116,101,114,95,99,97,99,104,101,242,4,0,0,115, - 22,0,0,0,0,8,8,1,2,1,12,1,14,3,8,1, - 2,1,14,1,14,1,10,1,16,1,122,31,80,97,116,104, - 70,105,110,100,101,114,46,95,112,97,116,104,95,105,109,112, - 111,114,116,101,114,95,99,97,99,104,101,99,3,0,0,0, - 0,0,0,0,0,0,0,0,6,0,0,0,4,0,0,0, - 67,0,0,0,115,82,0,0,0,116,0,124,2,100,1,131, - 2,114,26,124,2,160,1,124,1,161,1,92,2,125,3,125, - 4,110,14,124,2,160,2,124,1,161,1,125,3,103,0,125, - 4,124,3,100,0,107,9,114,60,116,3,160,4,124,1,124, - 3,161,2,83,0,116,3,160,5,124,1,100,0,161,2,125, - 5,124,4,124,5,95,6,124,5,83,0,41,2,78,114,137, - 0,0,0,41,7,114,128,0,0,0,114,137,0,0,0,114, - 206,0,0,0,114,134,0,0,0,114,201,0,0,0,114,183, - 0,0,0,114,178,0,0,0,41,6,114,193,0,0,0,114, - 139,0,0,0,114,50,1,0,0,114,140,0,0,0,114,141, - 0,0,0,114,187,0,0,0,114,3,0,0,0,114,3,0, - 0,0,114,6,0,0,0,218,16,95,108,101,103,97,99,121, - 95,103,101,116,95,115,112,101,99,8,5,0,0,115,18,0, - 0,0,0,4,10,1,16,2,10,1,4,1,8,1,12,1, - 12,1,6,1,122,27,80,97,116,104,70,105,110,100,101,114, - 46,95,108,101,103,97,99,121,95,103,101,116,95,115,112,101, - 99,78,99,4,0,0,0,0,0,0,0,0,0,0,0,9, - 0,0,0,5,0,0,0,67,0,0,0,115,166,0,0,0, - 103,0,125,4,124,2,68,0,93,134,125,5,116,0,124,5, - 116,1,116,2,102,2,131,2,115,28,113,8,124,0,160,3, - 124,5,161,1,125,6,124,6,100,1,107,9,114,8,116,4, - 124,6,100,2,131,2,114,70,124,6,160,5,124,1,124,3, - 161,2,125,7,110,12,124,0,160,6,124,1,124,6,161,2, - 125,7,124,7,100,1,107,8,114,92,113,8,124,7,106,7, - 100,1,107,9,114,110,124,7,2,0,1,0,83,0,124,7, - 106,8,125,8,124,8,100,1,107,8,114,132,116,9,100,3, - 131,1,130,1,124,4,160,10,124,8,161,1,1,0,113,8, - 116,11,160,12,124,1,100,1,161,2,125,7,124,4,124,7, - 95,8,124,7,83,0,41,4,122,63,70,105,110,100,32,116, - 104,101,32,108,111,97,100,101,114,32,111,114,32,110,97,109, - 101,115,112,97,99,101,95,112,97,116,104,32,102,111,114,32, - 116,104,105,115,32,109,111,100,117,108,101,47,112,97,99,107, - 97,103,101,32,110,97,109,101,46,78,114,203,0,0,0,122, - 19,115,112,101,99,32,109,105,115,115,105,110,103,32,108,111, - 97,100,101,114,41,13,114,161,0,0,0,114,84,0,0,0, - 218,5,98,121,116,101,115,114,54,1,0,0,114,128,0,0, - 0,114,203,0,0,0,114,55,1,0,0,114,140,0,0,0, - 114,178,0,0,0,114,117,0,0,0,114,167,0,0,0,114, - 134,0,0,0,114,183,0,0,0,41,9,114,193,0,0,0, - 114,139,0,0,0,114,43,0,0,0,114,202,0,0,0,218, - 14,110,97,109,101,115,112,97,99,101,95,112,97,116,104,90, - 5,101,110,116,114,121,114,50,1,0,0,114,187,0,0,0, - 114,141,0,0,0,114,3,0,0,0,114,3,0,0,0,114, - 6,0,0,0,218,9,95,103,101,116,95,115,112,101,99,23, - 5,0,0,115,40,0,0,0,0,5,4,1,8,1,14,1, - 2,1,10,1,8,1,10,1,14,2,12,1,8,1,2,1, - 10,1,8,1,6,1,8,1,8,5,12,2,12,1,6,1, - 122,20,80,97,116,104,70,105,110,100,101,114,46,95,103,101, - 116,95,115,112,101,99,99,4,0,0,0,0,0,0,0,0, - 0,0,0,6,0,0,0,5,0,0,0,67,0,0,0,115, - 100,0,0,0,124,2,100,1,107,8,114,14,116,0,106,1, - 125,2,124,0,160,2,124,1,124,2,124,3,161,3,125,4, - 124,4,100,1,107,8,114,40,100,1,83,0,124,4,106,3, - 100,1,107,8,114,92,124,4,106,4,125,5,124,5,114,86, - 100,1,124,4,95,5,116,6,124,1,124,5,124,0,106,2, - 131,3,124,4,95,4,124,4,83,0,100,1,83,0,110,4, - 124,4,83,0,100,1,83,0,41,2,122,141,84,114,121,32, - 116,111,32,102,105,110,100,32,97,32,115,112,101,99,32,102, - 111,114,32,39,102,117,108,108,110,97,109,101,39,32,111,110, - 32,115,121,115,46,112,97,116,104,32,111,114,32,39,112,97, - 116,104,39,46,10,10,32,32,32,32,32,32,32,32,84,104, - 101,32,115,101,97,114,99,104,32,105,115,32,98,97,115,101, - 100,32,111,110,32,115,121,115,46,112,97,116,104,95,104,111, - 111,107,115,32,97,110,100,32,115,121,115,46,112,97,116,104, - 95,105,109,112,111,114,116,101,114,95,99,97,99,104,101,46, - 10,32,32,32,32,32,32,32,32,78,41,7,114,8,0,0, - 0,114,43,0,0,0,114,58,1,0,0,114,140,0,0,0, - 114,178,0,0,0,114,181,0,0,0,114,22,1,0,0,41, - 6,114,193,0,0,0,114,139,0,0,0,114,43,0,0,0, - 114,202,0,0,0,114,187,0,0,0,114,57,1,0,0,114, - 3,0,0,0,114,3,0,0,0,114,6,0,0,0,114,203, - 0,0,0,55,5,0,0,115,26,0,0,0,0,6,8,1, - 6,1,14,1,8,1,4,1,10,1,6,1,4,3,6,1, - 16,1,4,2,6,2,122,20,80,97,116,104,70,105,110,100, - 101,114,46,102,105,110,100,95,115,112,101,99,99,3,0,0, - 0,0,0,0,0,0,0,0,0,4,0,0,0,4,0,0, - 0,67,0,0,0,115,30,0,0,0,124,0,160,0,124,1, - 124,2,161,2,125,3,124,3,100,1,107,8,114,24,100,1, - 83,0,124,3,106,1,83,0,41,2,122,170,102,105,110,100, - 32,116,104,101,32,109,111,100,117,108,101,32,111,110,32,115, - 121,115,46,112,97,116,104,32,111,114,32,39,112,97,116,104, - 39,32,98,97,115,101,100,32,111,110,32,115,121,115,46,112, - 97,116,104,95,104,111,111,107,115,32,97,110,100,10,32,32, - 32,32,32,32,32,32,115,121,115,46,112,97,116,104,95,105, - 109,112,111,114,116,101,114,95,99,97,99,104,101,46,10,10, - 32,32,32,32,32,32,32,32,84,104,105,115,32,109,101,116, - 104,111,100,32,105,115,32,100,101,112,114,101,99,97,116,101, - 100,46,32,32,85,115,101,32,102,105,110,100,95,115,112,101, - 99,40,41,32,105,110,115,116,101,97,100,46,10,10,32,32, - 32,32,32,32,32,32,78,114,204,0,0,0,114,205,0,0, - 0,114,3,0,0,0,114,3,0,0,0,114,6,0,0,0, - 114,206,0,0,0,79,5,0,0,115,8,0,0,0,0,8, - 12,1,8,1,4,1,122,22,80,97,116,104,70,105,110,100, - 101,114,46,102,105,110,100,95,109,111,100,117,108,101,99,1, - 0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,3, - 0,0,0,79,0,0,0,115,24,0,0,0,100,1,100,2, - 108,0,109,1,125,3,1,0,124,3,106,2,124,1,124,2, - 142,1,83,0,41,3,97,32,1,0,0,10,32,32,32,32, - 32,32,32,32,70,105,110,100,32,100,105,115,116,114,105,98, - 117,116,105,111,110,115,46,10,10,32,32,32,32,32,32,32, - 32,82,101,116,117,114,110,32,97,110,32,105,116,101,114,97, - 98,108,101,32,111,102,32,97,108,108,32,68,105,115,116,114, - 105,98,117,116,105,111,110,32,105,110,115,116,97,110,99,101, - 115,32,99,97,112,97,98,108,101,32,111,102,10,32,32,32, - 32,32,32,32,32,108,111,97,100,105,110,103,32,116,104,101, - 32,109,101,116,97,100,97,116,97,32,102,111,114,32,112,97, - 99,107,97,103,101,115,32,109,97,116,99,104,105,110,103,32, - 96,96,99,111,110,116,101,120,116,46,110,97,109,101,96,96, - 10,32,32,32,32,32,32,32,32,40,111,114,32,97,108,108, - 32,110,97,109,101,115,32,105,102,32,96,96,78,111,110,101, - 96,96,32,105,110,100,105,99,97,116,101,100,41,32,97,108, - 111,110,103,32,116,104,101,32,112,97,116,104,115,32,105,110, - 32,116,104,101,32,108,105,115,116,10,32,32,32,32,32,32, - 32,32,111,102,32,100,105,114,101,99,116,111,114,105,101,115, - 32,96,96,99,111,110,116,101,120,116,46,112,97,116,104,96, - 96,46,10,32,32,32,32,32,32,32,32,114,72,0,0,0, - 41,1,218,18,77,101,116,97,100,97,116,97,80,97,116,104, - 70,105,110,100,101,114,41,3,90,18,105,109,112,111,114,116, - 108,105,98,46,109,101,116,97,100,97,116,97,114,59,1,0, - 0,218,18,102,105,110,100,95,100,105,115,116,114,105,98,117, - 116,105,111,110,115,41,4,114,193,0,0,0,114,119,0,0, - 0,114,120,0,0,0,114,59,1,0,0,114,3,0,0,0, - 114,3,0,0,0,114,6,0,0,0,114,60,1,0,0,92, - 5,0,0,115,4,0,0,0,0,10,12,1,122,29,80,97, - 116,104,70,105,110,100,101,114,46,102,105,110,100,95,100,105, - 115,116,114,105,98,117,116,105,111,110,115,41,1,78,41,2, - 78,78,41,1,78,41,13,114,125,0,0,0,114,124,0,0, - 0,114,126,0,0,0,114,127,0,0,0,114,207,0,0,0, - 114,46,1,0,0,114,52,1,0,0,114,54,1,0,0,114, - 55,1,0,0,114,58,1,0,0,114,203,0,0,0,114,206, - 0,0,0,114,60,1,0,0,114,3,0,0,0,114,3,0, - 0,0,114,3,0,0,0,114,6,0,0,0,114,45,1,0, - 0,215,4,0,0,115,34,0,0,0,8,2,4,2,2,1, - 10,9,2,1,10,12,2,1,10,21,2,1,10,14,2,1, - 12,31,2,1,12,23,2,1,12,12,2,1,114,45,1,0, - 0,99,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,3,0,0,0,64,0,0,0,115,90,0,0,0,101, - 0,90,1,100,0,90,2,100,1,90,3,100,2,100,3,132, - 0,90,4,100,4,100,5,132,0,90,5,101,6,90,7,100, - 6,100,7,132,0,90,8,100,8,100,9,132,0,90,9,100, - 19,100,11,100,12,132,1,90,10,100,13,100,14,132,0,90, - 11,101,12,100,15,100,16,132,0,131,1,90,13,100,17,100, - 18,132,0,90,14,100,10,83,0,41,20,218,10,70,105,108, - 101,70,105,110,100,101,114,122,172,70,105,108,101,45,98,97, - 115,101,100,32,102,105,110,100,101,114,46,10,10,32,32,32, - 32,73,110,116,101,114,97,99,116,105,111,110,115,32,119,105, - 116,104,32,116,104,101,32,102,105,108,101,32,115,121,115,116, - 101,109,32,97,114,101,32,99,97,99,104,101,100,32,102,111, - 114,32,112,101,114,102,111,114,109,97,110,99,101,44,32,98, - 101,105,110,103,10,32,32,32,32,114,101,102,114,101,115,104, - 101,100,32,119,104,101,110,32,116,104,101,32,100,105,114,101, - 99,116,111,114,121,32,116,104,101,32,102,105,110,100,101,114, - 32,105,115,32,104,97,110,100,108,105,110,103,32,104,97,115, - 32,98,101,101,110,32,109,111,100,105,102,105,101,100,46,10, - 10,32,32,32,32,99,2,0,0,0,0,0,0,0,0,0, - 0,0,5,0,0,0,6,0,0,0,7,0,0,0,115,84, - 0,0,0,103,0,125,3,124,2,68,0,93,32,92,2,137, - 0,125,4,124,3,160,0,135,0,102,1,100,1,100,2,132, - 8,124,4,68,0,131,1,161,1,1,0,113,8,124,3,124, - 0,95,1,124,1,112,54,100,3,124,0,95,2,100,4,124, - 0,95,3,116,4,131,0,124,0,95,5,116,4,131,0,124, - 0,95,6,100,5,83,0,41,6,122,154,73,110,105,116,105, - 97,108,105,122,101,32,119,105,116,104,32,116,104,101,32,112, - 97,116,104,32,116,111,32,115,101,97,114,99,104,32,111,110, - 32,97,110,100,32,97,32,118,97,114,105,97,98,108,101,32, - 110,117,109,98,101,114,32,111,102,10,32,32,32,32,32,32, - 32,32,50,45,116,117,112,108,101,115,32,99,111,110,116,97, - 105,110,105,110,103,32,116,104,101,32,108,111,97,100,101,114, - 32,97,110,100,32,116,104,101,32,102,105,108,101,32,115,117, - 102,102,105,120,101,115,32,116,104,101,32,108,111,97,100,101, - 114,10,32,32,32,32,32,32,32,32,114,101,99,111,103,110, - 105,122,101,115,46,99,1,0,0,0,0,0,0,0,0,0, - 0,0,2,0,0,0,3,0,0,0,51,0,0,0,115,22, - 0,0,0,124,0,93,14,125,1,124,1,136,0,102,2,86, - 0,1,0,113,2,100,0,83,0,114,109,0,0,0,114,3, - 0,0,0,114,16,1,0,0,169,1,114,140,0,0,0,114, - 3,0,0,0,114,6,0,0,0,114,19,1,0,0,121,5, - 0,0,115,4,0,0,0,4,0,2,0,122,38,70,105,108, - 101,70,105,110,100,101,114,46,95,95,105,110,105,116,95,95, - 46,60,108,111,99,97,108,115,62,46,60,103,101,110,101,120, - 112,114,62,114,70,0,0,0,114,104,0,0,0,78,41,7, - 114,167,0,0,0,218,8,95,108,111,97,100,101,114,115,114, - 43,0,0,0,218,11,95,112,97,116,104,95,109,116,105,109, - 101,218,3,115,101,116,218,11,95,112,97,116,104,95,99,97, - 99,104,101,218,19,95,114,101,108,97,120,101,100,95,112,97, - 116,104,95,99,97,99,104,101,41,5,114,118,0,0,0,114, - 43,0,0,0,218,14,108,111,97,100,101,114,95,100,101,116, - 97,105,108,115,90,7,108,111,97,100,101,114,115,114,189,0, - 0,0,114,3,0,0,0,114,62,1,0,0,114,6,0,0, - 0,114,209,0,0,0,115,5,0,0,115,16,0,0,0,0, - 4,4,1,12,1,26,1,6,2,10,1,6,1,8,1,122, - 19,70,105,108,101,70,105,110,100,101,114,46,95,95,105,110, - 105,116,95,95,99,1,0,0,0,0,0,0,0,0,0,0, - 0,1,0,0,0,2,0,0,0,67,0,0,0,115,10,0, - 0,0,100,1,124,0,95,0,100,2,83,0,41,3,122,31, - 73,110,118,97,108,105,100,97,116,101,32,116,104,101,32,100, - 105,114,101,99,116,111,114,121,32,109,116,105,109,101,46,114, - 104,0,0,0,78,41,1,114,64,1,0,0,114,246,0,0, - 0,114,3,0,0,0,114,3,0,0,0,114,6,0,0,0, - 114,46,1,0,0,129,5,0,0,115,2,0,0,0,0,2, - 122,28,70,105,108,101,70,105,110,100,101,114,46,105,110,118, - 97,108,105,100,97,116,101,95,99,97,99,104,101,115,99,2, - 0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,3, - 0,0,0,67,0,0,0,115,42,0,0,0,124,0,160,0, - 124,1,161,1,125,2,124,2,100,1,107,8,114,26,100,1, - 103,0,102,2,83,0,124,2,106,1,124,2,106,2,112,38, - 103,0,102,2,83,0,41,2,122,197,84,114,121,32,116,111, - 32,102,105,110,100,32,97,32,108,111,97,100,101,114,32,102, - 111,114,32,116,104,101,32,115,112,101,99,105,102,105,101,100, - 32,109,111,100,117,108,101,44,32,111,114,32,116,104,101,32, - 110,97,109,101,115,112,97,99,101,10,32,32,32,32,32,32, - 32,32,112,97,99,107,97,103,101,32,112,111,114,116,105,111, - 110,115,46,32,82,101,116,117,114,110,115,32,40,108,111,97, - 100,101,114,44,32,108,105,115,116,45,111,102,45,112,111,114, - 116,105,111,110,115,41,46,10,10,32,32,32,32,32,32,32, - 32,84,104,105,115,32,109,101,116,104,111,100,32,105,115,32, - 100,101,112,114,101,99,97,116,101,100,46,32,32,85,115,101, - 32,102,105,110,100,95,115,112,101,99,40,41,32,105,110,115, - 116,101,97,100,46,10,10,32,32,32,32,32,32,32,32,78, - 41,3,114,203,0,0,0,114,140,0,0,0,114,178,0,0, - 0,41,3,114,118,0,0,0,114,139,0,0,0,114,187,0, + 0,0,0,115,4,0,0,0,100,1,83,0,41,2,122,39, + 82,101,116,117,114,110,32,78,111,110,101,32,97,115,32,116, + 104,101,114,101,32,105,115,32,110,111,32,115,111,117,114,99, + 101,32,99,111,100,101,46,78,114,3,0,0,0,114,219,0, 0,0,114,3,0,0,0,114,3,0,0,0,114,6,0,0, - 0,114,137,0,0,0,135,5,0,0,115,8,0,0,0,0, - 7,10,1,8,1,8,1,122,22,70,105,108,101,70,105,110, - 100,101,114,46,102,105,110,100,95,108,111,97,100,101,114,99, - 6,0,0,0,0,0,0,0,0,0,0,0,7,0,0,0, - 6,0,0,0,67,0,0,0,115,26,0,0,0,124,1,124, - 2,124,3,131,2,125,6,116,0,124,2,124,3,124,6,124, - 4,100,1,141,4,83,0,41,2,78,114,177,0,0,0,41, - 1,114,190,0,0,0,41,7,114,118,0,0,0,114,188,0, - 0,0,114,139,0,0,0,114,43,0,0,0,90,4,115,109, - 115,108,114,202,0,0,0,114,140,0,0,0,114,3,0,0, - 0,114,3,0,0,0,114,6,0,0,0,114,58,1,0,0, - 147,5,0,0,115,8,0,0,0,0,1,10,1,8,1,2, - 255,122,20,70,105,108,101,70,105,110,100,101,114,46,95,103, - 101,116,95,115,112,101,99,78,99,3,0,0,0,0,0,0, - 0,0,0,0,0,14,0,0,0,8,0,0,0,67,0,0, - 0,115,98,1,0,0,100,1,125,3,124,1,160,0,100,2, - 161,1,100,3,25,0,125,4,122,24,116,1,124,0,106,2, - 112,34,116,3,160,4,161,0,131,1,106,5,125,5,87,0, - 110,24,4,0,116,6,107,10,114,66,1,0,1,0,1,0, - 100,4,125,5,89,0,110,2,88,0,124,5,124,0,106,7, - 107,3,114,92,124,0,160,8,161,0,1,0,124,5,124,0, - 95,7,116,9,131,0,114,114,124,0,106,10,125,6,124,4, - 160,11,161,0,125,7,110,10,124,0,106,12,125,6,124,4, - 125,7,124,7,124,6,107,6,114,218,116,13,124,0,106,2, - 124,4,131,2,125,8,124,0,106,14,68,0,93,58,92,2, - 125,9,125,10,100,5,124,9,23,0,125,11,116,13,124,8, - 124,11,131,2,125,12,116,15,124,12,131,1,114,150,124,0, - 160,16,124,10,124,1,124,12,124,8,103,1,124,2,161,5, - 2,0,1,0,83,0,113,150,116,17,124,8,131,1,125,3, - 124,0,106,14,68,0,93,82,92,2,125,9,125,10,116,13, - 124,0,106,2,124,4,124,9,23,0,131,2,125,12,116,18, - 106,19,100,6,124,12,100,3,100,7,141,3,1,0,124,7, - 124,9,23,0,124,6,107,6,114,224,116,15,124,12,131,1, - 114,224,124,0,160,16,124,10,124,1,124,12,100,8,124,2, - 161,5,2,0,1,0,83,0,113,224,124,3,144,1,114,94, - 116,18,160,19,100,9,124,8,161,2,1,0,116,18,160,20, - 124,1,100,8,161,2,125,13,124,8,103,1,124,13,95,21, - 124,13,83,0,100,8,83,0,41,10,122,111,84,114,121,32, - 116,111,32,102,105,110,100,32,97,32,115,112,101,99,32,102, - 111,114,32,116,104,101,32,115,112,101,99,105,102,105,101,100, - 32,109,111,100,117,108,101,46,10,10,32,32,32,32,32,32, - 32,32,82,101,116,117,114,110,115,32,116,104,101,32,109,97, - 116,99,104,105,110,103,32,115,112,101,99,44,32,111,114,32, - 78,111,110,101,32,105,102,32,110,111,116,32,102,111,117,110, - 100,46,10,32,32,32,32,32,32,32,32,70,114,70,0,0, - 0,114,27,0,0,0,114,104,0,0,0,114,209,0,0,0, - 122,9,116,114,121,105,110,103,32,123,125,41,1,90,9,118, - 101,114,98,111,115,105,116,121,78,122,25,112,111,115,115,105, - 98,108,101,32,110,97,109,101,115,112,97,99,101,32,102,111, - 114,32,123,125,41,22,114,40,0,0,0,114,48,0,0,0, - 114,43,0,0,0,114,2,0,0,0,114,54,0,0,0,114, - 10,1,0,0,114,49,0,0,0,114,64,1,0,0,218,11, - 95,102,105,108,108,95,99,97,99,104,101,114,7,0,0,0, - 114,67,1,0,0,114,105,0,0,0,114,66,1,0,0,114, - 37,0,0,0,114,63,1,0,0,114,53,0,0,0,114,58, - 1,0,0,114,55,0,0,0,114,134,0,0,0,114,149,0, - 0,0,114,183,0,0,0,114,178,0,0,0,41,14,114,118, - 0,0,0,114,139,0,0,0,114,202,0,0,0,90,12,105, - 115,95,110,97,109,101,115,112,97,99,101,90,11,116,97,105, - 108,95,109,111,100,117,108,101,114,169,0,0,0,90,5,99, - 97,99,104,101,90,12,99,97,99,104,101,95,109,111,100,117, - 108,101,90,9,98,97,115,101,95,112,97,116,104,114,17,1, - 0,0,114,188,0,0,0,90,13,105,110,105,116,95,102,105, - 108,101,110,97,109,101,90,9,102,117,108,108,95,112,97,116, - 104,114,187,0,0,0,114,3,0,0,0,114,3,0,0,0, - 114,6,0,0,0,114,203,0,0,0,152,5,0,0,115,74, - 0,0,0,0,5,4,1,14,1,2,1,24,1,14,1,10, - 1,10,1,8,1,6,2,6,1,6,1,10,2,6,1,4, - 2,8,1,12,1,14,1,8,1,10,1,8,1,26,4,8, - 2,14,1,16,1,16,1,12,1,8,1,10,1,2,0,2, - 255,10,2,6,1,12,1,12,1,8,1,4,1,122,20,70, - 105,108,101,70,105,110,100,101,114,46,102,105,110,100,95,115, - 112,101,99,99,1,0,0,0,0,0,0,0,0,0,0,0, - 9,0,0,0,10,0,0,0,67,0,0,0,115,190,0,0, - 0,124,0,106,0,125,1,122,22,116,1,160,2,124,1,112, - 22,116,1,160,3,161,0,161,1,125,2,87,0,110,30,4, - 0,116,4,116,5,116,6,102,3,107,10,114,58,1,0,1, - 0,1,0,103,0,125,2,89,0,110,2,88,0,116,7,106, - 8,160,9,100,1,161,1,115,84,116,10,124,2,131,1,124, - 0,95,11,110,74,116,10,131,0,125,3,124,2,68,0,93, - 56,125,4,124,4,160,12,100,2,161,1,92,3,125,5,125, - 6,125,7,124,6,114,136,100,3,160,13,124,5,124,7,160, - 14,161,0,161,2,125,8,110,4,124,5,125,8,124,3,160, - 15,124,8,161,1,1,0,113,94,124,3,124,0,95,11,116, - 7,106,8,160,9,116,16,161,1,114,186,100,4,100,5,132, - 0,124,2,68,0,131,1,124,0,95,17,100,6,83,0,41, - 7,122,68,70,105,108,108,32,116,104,101,32,99,97,99,104, - 101,32,111,102,32,112,111,116,101,110,116,105,97,108,32,109, - 111,100,117,108,101,115,32,97,110,100,32,112,97,99,107,97, - 103,101,115,32,102,111,114,32,116,104,105,115,32,100,105,114, - 101,99,116,111,114,121,46,114,0,0,0,0,114,70,0,0, - 0,114,60,0,0,0,99,1,0,0,0,0,0,0,0,0, - 0,0,0,2,0,0,0,4,0,0,0,83,0,0,0,115, - 20,0,0,0,104,0,124,0,93,12,125,1,124,1,160,0, - 161,0,146,2,113,4,83,0,114,3,0,0,0,41,1,114, - 105,0,0,0,41,2,114,31,0,0,0,90,2,102,110,114, - 3,0,0,0,114,3,0,0,0,114,6,0,0,0,218,9, - 60,115,101,116,99,111,109,112,62,229,5,0,0,115,4,0, - 0,0,6,0,2,0,122,41,70,105,108,101,70,105,110,100, - 101,114,46,95,102,105,108,108,95,99,97,99,104,101,46,60, - 108,111,99,97,108,115,62,46,60,115,101,116,99,111,109,112, - 62,78,41,18,114,43,0,0,0,114,2,0,0,0,114,7, - 1,0,0,114,54,0,0,0,114,3,1,0,0,218,15,80, - 101,114,109,105,115,115,105,111,110,69,114,114,111,114,218,18, - 78,111,116,65,68,105,114,101,99,116,111,114,121,69,114,114, - 111,114,114,8,0,0,0,114,9,0,0,0,114,10,0,0, - 0,114,65,1,0,0,114,66,1,0,0,114,100,0,0,0, - 114,61,0,0,0,114,105,0,0,0,218,3,97,100,100,114, - 11,0,0,0,114,67,1,0,0,41,9,114,118,0,0,0, - 114,43,0,0,0,114,8,1,0,0,90,21,108,111,119,101, - 114,95,115,117,102,102,105,120,95,99,111,110,116,101,110,116, - 115,114,41,1,0,0,114,116,0,0,0,114,29,1,0,0, - 114,17,1,0,0,90,8,110,101,119,95,110,97,109,101,114, - 3,0,0,0,114,3,0,0,0,114,6,0,0,0,114,69, - 1,0,0,200,5,0,0,115,34,0,0,0,0,2,6,1, - 2,1,22,1,20,3,10,3,12,1,12,7,6,1,8,1, - 16,1,4,1,18,2,4,1,12,1,6,1,12,1,122,22, - 70,105,108,101,70,105,110,100,101,114,46,95,102,105,108,108, - 95,99,97,99,104,101,99,1,0,0,0,0,0,0,0,0, - 0,0,0,3,0,0,0,3,0,0,0,7,0,0,0,115, - 18,0,0,0,135,0,135,1,102,2,100,1,100,2,132,8, - 125,2,124,2,83,0,41,3,97,20,1,0,0,65,32,99, - 108,97,115,115,32,109,101,116,104,111,100,32,119,104,105,99, - 104,32,114,101,116,117,114,110,115,32,97,32,99,108,111,115, - 117,114,101,32,116,111,32,117,115,101,32,111,110,32,115,121, - 115,46,112,97,116,104,95,104,111,111,107,10,32,32,32,32, - 32,32,32,32,119,104,105,99,104,32,119,105,108,108,32,114, - 101,116,117,114,110,32,97,110,32,105,110,115,116,97,110,99, - 101,32,117,115,105,110,103,32,116,104,101,32,115,112,101,99, - 105,102,105,101,100,32,108,111,97,100,101,114,115,32,97,110, - 100,32,116,104,101,32,112,97,116,104,10,32,32,32,32,32, - 32,32,32,99,97,108,108,101,100,32,111,110,32,116,104,101, - 32,99,108,111,115,117,114,101,46,10,10,32,32,32,32,32, - 32,32,32,73,102,32,116,104,101,32,112,97,116,104,32,99, - 97,108,108,101,100,32,111,110,32,116,104,101,32,99,108,111, - 115,117,114,101,32,105,115,32,110,111,116,32,97,32,100,105, - 114,101,99,116,111,114,121,44,32,73,109,112,111,114,116,69, - 114,114,111,114,32,105,115,10,32,32,32,32,32,32,32,32, - 114,97,105,115,101,100,46,10,10,32,32,32,32,32,32,32, - 32,99,1,0,0,0,0,0,0,0,0,0,0,0,1,0, - 0,0,4,0,0,0,19,0,0,0,115,34,0,0,0,116, - 0,124,0,131,1,115,20,116,1,100,1,124,0,100,2,141, - 2,130,1,136,0,124,0,102,1,136,1,158,2,142,0,83, - 0,41,3,122,45,80,97,116,104,32,104,111,111,107,32,102, - 111,114,32,105,109,112,111,114,116,108,105,98,46,109,97,99, - 104,105,110,101,114,121,46,70,105,108,101,70,105,110,100,101, - 114,46,122,30,111,110,108,121,32,100,105,114,101,99,116,111, - 114,105,101,115,32,97,114,101,32,115,117,112,112,111,114,116, - 101,100,114,47,0,0,0,41,2,114,55,0,0,0,114,117, - 0,0,0,114,47,0,0,0,169,2,114,193,0,0,0,114, - 68,1,0,0,114,3,0,0,0,114,6,0,0,0,218,24, - 112,97,116,104,95,104,111,111,107,95,102,111,114,95,70,105, - 108,101,70,105,110,100,101,114,241,5,0,0,115,6,0,0, - 0,0,2,8,1,12,1,122,54,70,105,108,101,70,105,110, - 100,101,114,46,112,97,116,104,95,104,111,111,107,46,60,108, - 111,99,97,108,115,62,46,112,97,116,104,95,104,111,111,107, - 95,102,111,114,95,70,105,108,101,70,105,110,100,101,114,114, - 3,0,0,0,41,3,114,193,0,0,0,114,68,1,0,0, - 114,75,1,0,0,114,3,0,0,0,114,74,1,0,0,114, - 6,0,0,0,218,9,112,97,116,104,95,104,111,111,107,231, - 5,0,0,115,4,0,0,0,0,10,14,6,122,20,70,105, - 108,101,70,105,110,100,101,114,46,112,97,116,104,95,104,111, - 111,107,99,1,0,0,0,0,0,0,0,0,0,0,0,1, - 0,0,0,3,0,0,0,67,0,0,0,115,12,0,0,0, - 100,1,160,0,124,0,106,1,161,1,83,0,41,2,78,122, - 16,70,105,108,101,70,105,110,100,101,114,40,123,33,114,125, - 41,41,2,114,61,0,0,0,114,43,0,0,0,114,246,0, - 0,0,114,3,0,0,0,114,3,0,0,0,114,6,0,0, - 0,114,39,1,0,0,249,5,0,0,115,2,0,0,0,0, - 1,122,19,70,105,108,101,70,105,110,100,101,114,46,95,95, - 114,101,112,114,95,95,41,1,78,41,15,114,125,0,0,0, - 114,124,0,0,0,114,126,0,0,0,114,127,0,0,0,114, - 209,0,0,0,114,46,1,0,0,114,143,0,0,0,114,206, - 0,0,0,114,137,0,0,0,114,58,1,0,0,114,203,0, - 0,0,114,69,1,0,0,114,207,0,0,0,114,76,1,0, - 0,114,39,1,0,0,114,3,0,0,0,114,3,0,0,0, - 114,3,0,0,0,114,6,0,0,0,114,61,1,0,0,106, - 5,0,0,115,22,0,0,0,8,2,4,7,8,14,8,4, - 4,2,8,12,8,5,10,48,8,31,2,1,10,17,114,61, - 1,0,0,99,4,0,0,0,0,0,0,0,0,0,0,0, - 6,0,0,0,8,0,0,0,67,0,0,0,115,146,0,0, - 0,124,0,160,0,100,1,161,1,125,4,124,0,160,0,100, - 2,161,1,125,5,124,4,115,66,124,5,114,36,124,5,106, - 1,125,4,110,30,124,2,124,3,107,2,114,56,116,2,124, - 1,124,2,131,2,125,4,110,10,116,3,124,1,124,2,131, - 2,125,4,124,5,115,84,116,4,124,1,124,2,124,4,100, - 3,141,3,125,5,122,36,124,5,124,0,100,2,60,0,124, - 4,124,0,100,1,60,0,124,2,124,0,100,4,60,0,124, - 3,124,0,100,5,60,0,87,0,110,20,4,0,116,5,107, - 10,114,140,1,0,1,0,1,0,89,0,110,2,88,0,100, - 0,83,0,41,6,78,218,10,95,95,108,111,97,100,101,114, - 95,95,218,8,95,95,115,112,101,99,95,95,114,62,1,0, - 0,90,8,95,95,102,105,108,101,95,95,90,10,95,95,99, - 97,99,104,101,100,95,95,41,6,218,3,103,101,116,114,140, - 0,0,0,114,15,1,0,0,114,9,1,0,0,114,190,0, - 0,0,218,9,69,120,99,101,112,116,105,111,110,41,6,90, - 2,110,115,114,116,0,0,0,90,8,112,97,116,104,110,97, - 109,101,90,9,99,112,97,116,104,110,97,109,101,114,140,0, - 0,0,114,187,0,0,0,114,3,0,0,0,114,3,0,0, - 0,114,6,0,0,0,218,14,95,102,105,120,95,117,112,95, - 109,111,100,117,108,101,255,5,0,0,115,34,0,0,0,0, - 2,10,1,10,1,4,1,4,1,8,1,8,1,12,2,10, - 1,4,1,14,1,2,1,8,1,8,1,8,1,12,1,14, - 2,114,81,1,0,0,99,0,0,0,0,0,0,0,0,0, - 0,0,0,3,0,0,0,3,0,0,0,67,0,0,0,115, - 38,0,0,0,116,0,116,1,160,2,161,0,102,2,125,0, - 116,3,116,4,102,2,125,1,116,5,116,6,102,2,125,2, - 124,0,124,1,124,2,103,3,83,0,41,1,122,95,82,101, - 116,117,114,110,115,32,97,32,108,105,115,116,32,111,102,32, - 102,105,108,101,45,98,97,115,101,100,32,109,111,100,117,108, - 101,32,108,111,97,100,101,114,115,46,10,10,32,32,32,32, - 69,97,99,104,32,105,116,101,109,32,105,115,32,97,32,116, - 117,112,108,101,32,40,108,111,97,100,101,114,44,32,115,117, - 102,102,105,120,101,115,41,46,10,32,32,32,32,41,7,114, - 252,0,0,0,114,163,0,0,0,218,18,101,120,116,101,110, - 115,105,111,110,95,115,117,102,102,105,120,101,115,114,9,1, - 0,0,114,101,0,0,0,114,15,1,0,0,114,88,0,0, - 0,41,3,90,10,101,120,116,101,110,115,105,111,110,115,90, - 6,115,111,117,114,99,101,90,8,98,121,116,101,99,111,100, + 0,114,229,0,0,0,50,4,0,0,115,2,0,0,0,0, + 2,122,31,83,111,117,114,99,101,108,101,115,115,70,105,108, + 101,76,111,97,100,101,114,46,103,101,116,95,115,111,117,114, + 99,101,78,41,6,114,125,0,0,0,114,124,0,0,0,114, + 126,0,0,0,114,127,0,0,0,114,213,0,0,0,114,229, + 0,0,0,114,3,0,0,0,114,3,0,0,0,114,3,0, + 0,0,114,6,0,0,0,114,15,1,0,0,30,4,0,0, + 115,6,0,0,0,8,2,4,2,8,16,114,15,1,0,0, + 99,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,3,0,0,0,64,0,0,0,115,92,0,0,0,101,0, + 90,1,100,0,90,2,100,1,90,3,100,2,100,3,132,0, + 90,4,100,4,100,5,132,0,90,5,100,6,100,7,132,0, + 90,6,100,8,100,9,132,0,90,7,100,10,100,11,132,0, + 90,8,100,12,100,13,132,0,90,9,100,14,100,15,132,0, + 90,10,100,16,100,17,132,0,90,11,101,12,100,18,100,19, + 132,0,131,1,90,13,100,20,83,0,41,21,114,252,0,0, + 0,122,93,76,111,97,100,101,114,32,102,111,114,32,101,120, + 116,101,110,115,105,111,110,32,109,111,100,117,108,101,115,46, + 10,10,32,32,32,32,84,104,101,32,99,111,110,115,116,114, + 117,99,116,111,114,32,105,115,32,100,101,115,105,103,110,101, + 100,32,116,111,32,119,111,114,107,32,119,105,116,104,32,70, + 105,108,101,70,105,110,100,101,114,46,10,10,32,32,32,32, + 99,3,0,0,0,0,0,0,0,0,0,0,0,3,0,0, + 0,2,0,0,0,67,0,0,0,115,16,0,0,0,124,1, + 124,0,95,0,124,2,124,0,95,1,100,0,83,0,114,109, + 0,0,0,114,159,0,0,0,114,5,1,0,0,114,3,0, + 0,0,114,3,0,0,0,114,6,0,0,0,114,209,0,0, + 0,67,4,0,0,115,4,0,0,0,0,1,6,1,122,28, + 69,120,116,101,110,115,105,111,110,70,105,108,101,76,111,97, + 100,101,114,46,95,95,105,110,105,116,95,95,99,2,0,0, + 0,0,0,0,0,0,0,0,0,2,0,0,0,2,0,0, + 0,67,0,0,0,115,24,0,0,0,124,0,106,0,124,1, + 106,0,107,2,111,22,124,0,106,1,124,1,106,1,107,2, + 83,0,114,109,0,0,0,114,240,0,0,0,114,242,0,0, + 0,114,3,0,0,0,114,3,0,0,0,114,6,0,0,0, + 114,243,0,0,0,71,4,0,0,115,6,0,0,0,0,1, + 12,1,10,255,122,26,69,120,116,101,110,115,105,111,110,70, + 105,108,101,76,111,97,100,101,114,46,95,95,101,113,95,95, + 99,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0, + 0,3,0,0,0,67,0,0,0,115,20,0,0,0,116,0, + 124,0,106,1,131,1,116,0,124,0,106,2,131,1,65,0, + 83,0,114,109,0,0,0,114,244,0,0,0,114,246,0,0, + 0,114,3,0,0,0,114,3,0,0,0,114,6,0,0,0, + 114,247,0,0,0,75,4,0,0,115,2,0,0,0,0,1, + 122,28,69,120,116,101,110,115,105,111,110,70,105,108,101,76, + 111,97,100,101,114,46,95,95,104,97,115,104,95,95,99,2, + 0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,5, + 0,0,0,67,0,0,0,115,36,0,0,0,116,0,160,1, + 116,2,106,3,124,1,161,2,125,2,116,0,160,4,100,1, + 124,1,106,5,124,0,106,6,161,3,1,0,124,2,83,0, + 41,2,122,38,67,114,101,97,116,101,32,97,110,32,117,110, + 105,116,105,97,108,105,122,101,100,32,101,120,116,101,110,115, + 105,111,110,32,109,111,100,117,108,101,122,38,101,120,116,101, + 110,115,105,111,110,32,109,111,100,117,108,101,32,123,33,114, + 125,32,108,111,97,100,101,100,32,102,114,111,109,32,123,33, + 114,125,41,7,114,134,0,0,0,114,214,0,0,0,114,163, + 0,0,0,90,14,99,114,101,97,116,101,95,100,121,110,97, + 109,105,99,114,149,0,0,0,114,116,0,0,0,114,43,0, + 0,0,41,3,114,118,0,0,0,114,187,0,0,0,114,216, + 0,0,0,114,3,0,0,0,114,3,0,0,0,114,6,0, + 0,0,114,212,0,0,0,78,4,0,0,115,18,0,0,0, + 0,2,4,1,4,0,2,255,4,2,6,1,4,0,4,255, + 4,2,122,33,69,120,116,101,110,115,105,111,110,70,105,108, + 101,76,111,97,100,101,114,46,99,114,101,97,116,101,95,109, + 111,100,117,108,101,99,2,0,0,0,0,0,0,0,0,0, + 0,0,2,0,0,0,5,0,0,0,67,0,0,0,115,36, + 0,0,0,116,0,160,1,116,2,106,3,124,1,161,2,1, + 0,116,0,160,4,100,1,124,0,106,5,124,0,106,6,161, + 3,1,0,100,2,83,0,41,3,122,30,73,110,105,116,105, + 97,108,105,122,101,32,97,110,32,101,120,116,101,110,115,105, + 111,110,32,109,111,100,117,108,101,122,40,101,120,116,101,110, + 115,105,111,110,32,109,111,100,117,108,101,32,123,33,114,125, + 32,101,120,101,99,117,116,101,100,32,102,114,111,109,32,123, + 33,114,125,78,41,7,114,134,0,0,0,114,214,0,0,0, + 114,163,0,0,0,90,12,101,120,101,99,95,100,121,110,97, + 109,105,99,114,149,0,0,0,114,116,0,0,0,114,43,0, + 0,0,114,253,0,0,0,114,3,0,0,0,114,3,0,0, + 0,114,6,0,0,0,114,217,0,0,0,86,4,0,0,115, + 10,0,0,0,0,2,14,1,6,1,4,0,4,255,122,31, + 69,120,116,101,110,115,105,111,110,70,105,108,101,76,111,97, + 100,101,114,46,101,120,101,99,95,109,111,100,117,108,101,99, + 2,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0, + 4,0,0,0,3,0,0,0,115,36,0,0,0,116,0,124, + 0,106,1,131,1,100,1,25,0,137,0,116,2,135,0,102, + 1,100,2,100,3,132,8,116,3,68,0,131,1,131,1,83, + 0,41,4,122,49,82,101,116,117,114,110,32,84,114,117,101, + 32,105,102,32,116,104,101,32,101,120,116,101,110,115,105,111, + 110,32,109,111,100,117,108,101,32,105,115,32,97,32,112,97, + 99,107,97,103,101,46,114,38,0,0,0,99,1,0,0,0, + 0,0,0,0,0,0,0,0,2,0,0,0,4,0,0,0, + 51,0,0,0,115,26,0,0,0,124,0,93,18,125,1,136, + 0,100,0,124,1,23,0,107,2,86,0,1,0,113,2,100, + 1,83,0,41,2,114,209,0,0,0,78,114,3,0,0,0, + 169,2,114,31,0,0,0,218,6,115,117,102,102,105,120,169, + 1,90,9,102,105,108,101,95,110,97,109,101,114,3,0,0, + 0,114,6,0,0,0,218,9,60,103,101,110,101,120,112,114, + 62,95,4,0,0,115,4,0,0,0,4,1,2,255,122,49, + 69,120,116,101,110,115,105,111,110,70,105,108,101,76,111,97, + 100,101,114,46,105,115,95,112,97,99,107,97,103,101,46,60, + 108,111,99,97,108,115,62,46,60,103,101,110,101,120,112,114, + 62,41,4,114,46,0,0,0,114,43,0,0,0,218,3,97, + 110,121,218,18,69,88,84,69,78,83,73,79,78,95,83,85, + 70,70,73,88,69,83,114,219,0,0,0,114,3,0,0,0, + 114,18,1,0,0,114,6,0,0,0,114,182,0,0,0,92, + 4,0,0,115,8,0,0,0,0,2,14,1,12,1,2,255, + 122,30,69,120,116,101,110,115,105,111,110,70,105,108,101,76, + 111,97,100,101,114,46,105,115,95,112,97,99,107,97,103,101, + 99,2,0,0,0,0,0,0,0,0,0,0,0,2,0,0, + 0,1,0,0,0,67,0,0,0,115,4,0,0,0,100,1, + 83,0,41,2,122,63,82,101,116,117,114,110,32,78,111,110, + 101,32,97,115,32,97,110,32,101,120,116,101,110,115,105,111, + 110,32,109,111,100,117,108,101,32,99,97,110,110,111,116,32, + 99,114,101,97,116,101,32,97,32,99,111,100,101,32,111,98, + 106,101,99,116,46,78,114,3,0,0,0,114,219,0,0,0, + 114,3,0,0,0,114,3,0,0,0,114,6,0,0,0,114, + 213,0,0,0,98,4,0,0,115,2,0,0,0,0,2,122, + 28,69,120,116,101,110,115,105,111,110,70,105,108,101,76,111, + 97,100,101,114,46,103,101,116,95,99,111,100,101,99,2,0, + 0,0,0,0,0,0,0,0,0,0,2,0,0,0,1,0, + 0,0,67,0,0,0,115,4,0,0,0,100,1,83,0,41, + 2,122,53,82,101,116,117,114,110,32,78,111,110,101,32,97, + 115,32,101,120,116,101,110,115,105,111,110,32,109,111,100,117, + 108,101,115,32,104,97,118,101,32,110,111,32,115,111,117,114, + 99,101,32,99,111,100,101,46,78,114,3,0,0,0,114,219, + 0,0,0,114,3,0,0,0,114,3,0,0,0,114,6,0, + 0,0,114,229,0,0,0,102,4,0,0,115,2,0,0,0, + 0,2,122,30,69,120,116,101,110,115,105,111,110,70,105,108, + 101,76,111,97,100,101,114,46,103,101,116,95,115,111,117,114, + 99,101,99,2,0,0,0,0,0,0,0,0,0,0,0,2, + 0,0,0,1,0,0,0,67,0,0,0,115,6,0,0,0, + 124,0,106,0,83,0,114,250,0,0,0,114,47,0,0,0, + 114,219,0,0,0,114,3,0,0,0,114,3,0,0,0,114, + 6,0,0,0,114,179,0,0,0,106,4,0,0,115,2,0, + 0,0,0,3,122,32,69,120,116,101,110,115,105,111,110,70, + 105,108,101,76,111,97,100,101,114,46,103,101,116,95,102,105, + 108,101,110,97,109,101,78,41,14,114,125,0,0,0,114,124, + 0,0,0,114,126,0,0,0,114,127,0,0,0,114,209,0, + 0,0,114,243,0,0,0,114,247,0,0,0,114,212,0,0, + 0,114,217,0,0,0,114,182,0,0,0,114,213,0,0,0, + 114,229,0,0,0,114,136,0,0,0,114,179,0,0,0,114, + 3,0,0,0,114,3,0,0,0,114,3,0,0,0,114,6, + 0,0,0,114,252,0,0,0,59,4,0,0,115,22,0,0, + 0,8,2,4,6,8,4,8,4,8,3,8,8,8,6,8, + 6,8,4,8,4,2,1,114,252,0,0,0,99,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0, + 0,64,0,0,0,115,104,0,0,0,101,0,90,1,100,0, + 90,2,100,1,90,3,100,2,100,3,132,0,90,4,100,4, + 100,5,132,0,90,5,100,6,100,7,132,0,90,6,100,8, + 100,9,132,0,90,7,100,10,100,11,132,0,90,8,100,12, + 100,13,132,0,90,9,100,14,100,15,132,0,90,10,100,16, + 100,17,132,0,90,11,100,18,100,19,132,0,90,12,100,20, + 100,21,132,0,90,13,100,22,100,23,132,0,90,14,100,24, + 83,0,41,25,218,14,95,78,97,109,101,115,112,97,99,101, + 80,97,116,104,97,38,1,0,0,82,101,112,114,101,115,101, + 110,116,115,32,97,32,110,97,109,101,115,112,97,99,101,32, + 112,97,99,107,97,103,101,39,115,32,112,97,116,104,46,32, + 32,73,116,32,117,115,101,115,32,116,104,101,32,109,111,100, + 117,108,101,32,110,97,109,101,10,32,32,32,32,116,111,32, + 102,105,110,100,32,105,116,115,32,112,97,114,101,110,116,32, + 109,111,100,117,108,101,44,32,97,110,100,32,102,114,111,109, + 32,116,104,101,114,101,32,105,116,32,108,111,111,107,115,32, + 117,112,32,116,104,101,32,112,97,114,101,110,116,39,115,10, + 32,32,32,32,95,95,112,97,116,104,95,95,46,32,32,87, + 104,101,110,32,116,104,105,115,32,99,104,97,110,103,101,115, + 44,32,116,104,101,32,109,111,100,117,108,101,39,115,32,111, + 119,110,32,112,97,116,104,32,105,115,32,114,101,99,111,109, + 112,117,116,101,100,44,10,32,32,32,32,117,115,105,110,103, + 32,112,97,116,104,95,102,105,110,100,101,114,46,32,32,70, + 111,114,32,116,111,112,45,108,101,118,101,108,32,109,111,100, + 117,108,101,115,44,32,116,104,101,32,112,97,114,101,110,116, + 32,109,111,100,117,108,101,39,115,32,112,97,116,104,10,32, + 32,32,32,105,115,32,115,121,115,46,112,97,116,104,46,99, + 4,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0, + 3,0,0,0,67,0,0,0,115,36,0,0,0,124,1,124, + 0,95,0,124,2,124,0,95,1,116,2,124,0,160,3,161, + 0,131,1,124,0,95,4,124,3,124,0,95,5,100,0,83, + 0,114,109,0,0,0,41,6,218,5,95,110,97,109,101,218, + 5,95,112,97,116,104,114,111,0,0,0,218,16,95,103,101, + 116,95,112,97,114,101,110,116,95,112,97,116,104,218,17,95, + 108,97,115,116,95,112,97,114,101,110,116,95,112,97,116,104, + 218,12,95,112,97,116,104,95,102,105,110,100,101,114,169,4, + 114,118,0,0,0,114,116,0,0,0,114,43,0,0,0,90, + 11,112,97,116,104,95,102,105,110,100,101,114,114,3,0,0, + 0,114,3,0,0,0,114,6,0,0,0,114,209,0,0,0, + 119,4,0,0,115,8,0,0,0,0,1,6,1,6,1,14, + 1,122,23,95,78,97,109,101,115,112,97,99,101,80,97,116, + 104,46,95,95,105,110,105,116,95,95,99,1,0,0,0,0, + 0,0,0,0,0,0,0,4,0,0,0,3,0,0,0,67, + 0,0,0,115,38,0,0,0,124,0,106,0,160,1,100,1, + 161,1,92,3,125,1,125,2,125,3,124,2,100,2,107,2, + 114,30,100,3,83,0,124,1,100,4,102,2,83,0,41,5, + 122,62,82,101,116,117,114,110,115,32,97,32,116,117,112,108, + 101,32,111,102,32,40,112,97,114,101,110,116,45,109,111,100, + 117,108,101,45,110,97,109,101,44,32,112,97,114,101,110,116, + 45,112,97,116,104,45,97,116,116,114,45,110,97,109,101,41, + 114,70,0,0,0,114,39,0,0,0,41,2,114,8,0,0, + 0,114,43,0,0,0,90,8,95,95,112,97,116,104,95,95, + 41,2,114,23,1,0,0,114,40,0,0,0,41,4,114,118, + 0,0,0,114,14,1,0,0,218,3,100,111,116,90,2,109, 101,114,3,0,0,0,114,3,0,0,0,114,6,0,0,0, - 114,184,0,0,0,22,6,0,0,115,8,0,0,0,0,5, - 12,1,8,1,8,1,114,184,0,0,0,99,1,0,0,0, - 0,0,0,0,0,0,0,0,12,0,0,0,9,0,0,0, - 67,0,0,0,115,178,1,0,0,124,0,97,0,116,0,106, - 1,97,1,116,0,106,2,97,2,116,1,106,3,116,4,25, - 0,125,1,100,1,68,0,93,48,125,2,124,2,116,1,106, - 3,107,7,114,56,116,0,160,5,124,2,161,1,125,3,110, - 10,116,1,106,3,124,2,25,0,125,3,116,6,124,1,124, - 2,124,3,131,3,1,0,113,30,100,2,100,3,103,1,102, - 2,100,4,100,5,100,3,103,2,102,2,102,2,125,4,124, - 4,68,0,93,110,92,2,125,5,125,6,116,7,100,6,100, - 7,132,0,124,6,68,0,131,1,131,1,115,136,74,0,130, - 1,124,6,100,8,25,0,125,7,124,5,116,1,106,3,107, - 6,114,170,116,1,106,3,124,5,25,0,125,8,1,0,113, - 226,113,106,122,20,116,0,160,5,124,5,161,1,125,8,87, - 0,1,0,113,226,87,0,113,106,4,0,116,8,107,10,114, - 214,1,0,1,0,1,0,89,0,113,106,89,0,113,106,88, - 0,113,106,116,8,100,9,131,1,130,1,116,6,124,1,100, - 10,124,8,131,3,1,0,116,6,124,1,100,11,124,7,131, - 3,1,0,116,6,124,1,100,12,100,13,160,9,124,6,161, - 1,131,3,1,0,116,6,124,1,100,14,100,15,100,16,132, - 0,124,6,68,0,131,1,131,3,1,0,116,0,160,5,100, - 17,161,1,125,9,116,6,124,1,100,17,124,9,131,3,1, - 0,116,0,160,5,100,18,161,1,125,10,116,6,124,1,100, - 18,124,10,131,3,1,0,124,5,100,4,107,2,144,1,114, - 110,116,0,160,5,100,19,161,1,125,11,116,6,124,1,100, - 20,124,11,131,3,1,0,116,6,124,1,100,21,116,10,131, - 0,131,3,1,0,116,11,160,12,116,2,160,13,161,0,161, - 1,1,0,124,5,100,4,107,2,144,1,114,174,116,14,160, - 15,100,22,161,1,1,0,100,23,116,11,107,6,144,1,114, - 174,100,24,116,16,95,17,100,25,83,0,41,26,122,205,83, - 101,116,117,112,32,116,104,101,32,112,97,116,104,45,98,97, - 115,101,100,32,105,109,112,111,114,116,101,114,115,32,102,111, - 114,32,105,109,112,111,114,116,108,105,98,32,98,121,32,105, - 109,112,111,114,116,105,110,103,32,110,101,101,100,101,100,10, - 32,32,32,32,98,117,105,108,116,45,105,110,32,109,111,100, - 117,108,101,115,32,97,110,100,32,105,110,106,101,99,116,105, - 110,103,32,116,104,101,109,32,105,110,116,111,32,116,104,101, - 32,103,108,111,98,97,108,32,110,97,109,101,115,112,97,99, - 101,46,10,10,32,32,32,32,79,116,104,101,114,32,99,111, - 109,112,111,110,101,110,116,115,32,97,114,101,32,101,120,116, - 114,97,99,116,101,100,32,102,114,111,109,32,116,104,101,32, - 99,111,114,101,32,98,111,111,116,115,116,114,97,112,32,109, - 111,100,117,108,101,46,10,10,32,32,32,32,41,4,114,63, - 0,0,0,114,74,0,0,0,218,8,98,117,105,108,116,105, - 110,115,114,160,0,0,0,90,5,112,111,115,105,120,250,1, - 47,90,2,110,116,250,1,92,99,1,0,0,0,0,0,0, - 0,0,0,0,0,2,0,0,0,3,0,0,0,115,0,0, - 0,115,26,0,0,0,124,0,93,18,125,1,116,0,124,1, - 131,1,100,0,107,2,86,0,1,0,113,2,100,1,83,0, - 41,2,114,38,0,0,0,78,41,1,114,22,0,0,0,41, - 2,114,31,0,0,0,114,94,0,0,0,114,3,0,0,0, - 114,3,0,0,0,114,6,0,0,0,114,19,1,0,0,58, - 6,0,0,115,4,0,0,0,4,0,2,0,122,25,95,115, - 101,116,117,112,46,60,108,111,99,97,108,115,62,46,60,103, - 101,110,101,120,112,114,62,114,72,0,0,0,122,30,105,109, - 112,111,114,116,108,105,98,32,114,101,113,117,105,114,101,115, - 32,112,111,115,105,120,32,111,114,32,110,116,114,2,0,0, - 0,114,34,0,0,0,114,30,0,0,0,114,39,0,0,0, - 114,57,0,0,0,99,1,0,0,0,0,0,0,0,0,0, - 0,0,2,0,0,0,4,0,0,0,83,0,0,0,115,22, - 0,0,0,104,0,124,0,93,14,125,1,100,0,124,1,155, - 0,157,2,146,2,113,4,83,0,41,1,114,73,0,0,0, - 114,3,0,0,0,41,2,114,31,0,0,0,218,1,115,114, - 3,0,0,0,114,3,0,0,0,114,6,0,0,0,114,70, - 1,0,0,74,6,0,0,115,4,0,0,0,6,0,2,0, - 122,25,95,115,101,116,117,112,46,60,108,111,99,97,108,115, - 62,46,60,115,101,116,99,111,109,112,62,90,7,95,116,104, - 114,101,97,100,90,8,95,119,101,97,107,114,101,102,90,6, - 119,105,110,114,101,103,114,192,0,0,0,114,7,0,0,0, - 122,4,46,112,121,119,122,6,95,100,46,112,121,100,84,78, - 41,18,114,134,0,0,0,114,8,0,0,0,114,163,0,0, - 0,114,31,1,0,0,114,125,0,0,0,90,18,95,98,117, - 105,108,116,105,110,95,102,114,111,109,95,110,97,109,101,114, - 129,0,0,0,218,3,97,108,108,114,117,0,0,0,114,35, - 0,0,0,114,13,0,0,0,114,21,1,0,0,114,167,0, - 0,0,114,82,1,0,0,114,101,0,0,0,114,186,0,0, - 0,114,191,0,0,0,114,195,0,0,0,41,12,218,17,95, - 98,111,111,116,115,116,114,97,112,95,109,111,100,117,108,101, - 90,11,115,101,108,102,95,109,111,100,117,108,101,90,12,98, - 117,105,108,116,105,110,95,110,97,109,101,90,14,98,117,105, - 108,116,105,110,95,109,111,100,117,108,101,90,10,111,115,95, - 100,101,116,97,105,108,115,90,10,98,117,105,108,116,105,110, - 95,111,115,114,30,0,0,0,114,34,0,0,0,90,9,111, - 115,95,109,111,100,117,108,101,90,13,116,104,114,101,97,100, - 95,109,111,100,117,108,101,90,14,119,101,97,107,114,101,102, - 95,109,111,100,117,108,101,90,13,119,105,110,114,101,103,95, - 109,111,100,117,108,101,114,3,0,0,0,114,3,0,0,0, - 114,6,0,0,0,218,6,95,115,101,116,117,112,33,6,0, - 0,115,78,0,0,0,0,8,4,1,6,1,6,3,10,1, - 8,1,10,1,12,2,10,1,14,3,22,1,12,2,22,1, - 8,1,10,1,10,1,6,2,2,1,10,1,10,1,14,1, - 12,2,8,1,12,1,12,1,18,1,22,3,10,1,12,3, - 10,1,12,3,10,1,10,1,12,3,14,1,14,1,10,1, - 10,1,10,1,114,89,1,0,0,99,1,0,0,0,0,0, - 0,0,0,0,0,0,2,0,0,0,4,0,0,0,67,0, - 0,0,115,50,0,0,0,116,0,124,0,131,1,1,0,116, - 1,131,0,125,1,116,2,106,3,160,4,116,5,106,6,124, - 1,142,0,103,1,161,1,1,0,116,2,106,7,160,8,116, - 9,161,1,1,0,100,1,83,0,41,2,122,41,73,110,115, - 116,97,108,108,32,116,104,101,32,112,97,116,104,45,98,97, - 115,101,100,32,105,109,112,111,114,116,32,99,111,109,112,111, - 110,101,110,116,115,46,78,41,10,114,89,1,0,0,114,184, - 0,0,0,114,8,0,0,0,114,51,1,0,0,114,167,0, - 0,0,114,61,1,0,0,114,76,1,0,0,218,9,109,101, - 116,97,95,112,97,116,104,114,186,0,0,0,114,45,1,0, - 0,41,2,114,88,1,0,0,90,17,115,117,112,112,111,114, - 116,101,100,95,108,111,97,100,101,114,115,114,3,0,0,0, - 114,3,0,0,0,114,6,0,0,0,218,8,95,105,110,115, - 116,97,108,108,98,6,0,0,115,8,0,0,0,0,2,8, - 1,6,1,20,1,114,91,1,0,0,41,1,114,59,0,0, - 0,41,1,78,41,3,78,78,78,41,2,114,72,0,0,0, - 114,72,0,0,0,41,1,84,41,1,78,41,1,78,41,63, - 114,127,0,0,0,114,12,0,0,0,90,37,95,67,65,83, - 69,95,73,78,83,69,78,83,73,84,73,86,69,95,80,76, - 65,84,70,79,82,77,83,95,66,89,84,69,83,95,75,69, - 89,114,11,0,0,0,114,13,0,0,0,114,20,0,0,0, - 114,26,0,0,0,114,28,0,0,0,114,37,0,0,0,114, - 46,0,0,0,114,48,0,0,0,114,52,0,0,0,114,53, - 0,0,0,114,55,0,0,0,114,58,0,0,0,114,68,0, - 0,0,218,4,116,121,112,101,218,8,95,95,99,111,100,101, - 95,95,114,162,0,0,0,114,18,0,0,0,114,148,0,0, - 0,114,17,0,0,0,114,23,0,0,0,114,236,0,0,0, - 114,91,0,0,0,114,87,0,0,0,114,101,0,0,0,114, - 88,0,0,0,90,23,68,69,66,85,71,95,66,89,84,69, - 67,79,68,69,95,83,85,70,70,73,88,69,83,90,27,79, - 80,84,73,77,73,90,69,68,95,66,89,84,69,67,79,68, - 69,95,83,85,70,70,73,88,69,83,114,97,0,0,0,114, - 102,0,0,0,114,108,0,0,0,114,112,0,0,0,114,114, - 0,0,0,114,136,0,0,0,114,143,0,0,0,114,152,0, - 0,0,114,156,0,0,0,114,158,0,0,0,114,165,0,0, - 0,114,170,0,0,0,114,171,0,0,0,114,176,0,0,0, - 218,6,111,98,106,101,99,116,114,185,0,0,0,114,190,0, - 0,0,114,191,0,0,0,114,208,0,0,0,114,221,0,0, - 0,114,239,0,0,0,114,9,1,0,0,114,15,1,0,0, - 114,21,1,0,0,114,252,0,0,0,114,22,1,0,0,114, - 43,1,0,0,114,45,1,0,0,114,61,1,0,0,114,81, - 1,0,0,114,184,0,0,0,114,89,1,0,0,114,91,1, + 218,23,95,102,105,110,100,95,112,97,114,101,110,116,95,112, + 97,116,104,95,110,97,109,101,115,125,4,0,0,115,8,0, + 0,0,0,2,18,1,8,2,4,3,122,38,95,78,97,109, + 101,115,112,97,99,101,80,97,116,104,46,95,102,105,110,100, + 95,112,97,114,101,110,116,95,112,97,116,104,95,110,97,109, + 101,115,99,1,0,0,0,0,0,0,0,0,0,0,0,3, + 0,0,0,3,0,0,0,67,0,0,0,115,28,0,0,0, + 124,0,160,0,161,0,92,2,125,1,125,2,116,1,116,2, + 106,3,124,1,25,0,124,2,131,2,83,0,114,109,0,0, + 0,41,4,114,30,1,0,0,114,130,0,0,0,114,8,0, + 0,0,218,7,109,111,100,117,108,101,115,41,3,114,118,0, + 0,0,90,18,112,97,114,101,110,116,95,109,111,100,117,108, + 101,95,110,97,109,101,90,14,112,97,116,104,95,97,116,116, + 114,95,110,97,109,101,114,3,0,0,0,114,3,0,0,0, + 114,6,0,0,0,114,25,1,0,0,135,4,0,0,115,4, + 0,0,0,0,1,12,1,122,31,95,78,97,109,101,115,112, + 97,99,101,80,97,116,104,46,95,103,101,116,95,112,97,114, + 101,110,116,95,112,97,116,104,99,1,0,0,0,0,0,0, + 0,0,0,0,0,3,0,0,0,4,0,0,0,67,0,0, + 0,115,80,0,0,0,116,0,124,0,160,1,161,0,131,1, + 125,1,124,1,124,0,106,2,107,3,114,74,124,0,160,3, + 124,0,106,4,124,1,161,2,125,2,124,2,100,0,107,9, + 114,68,124,2,106,5,100,0,107,8,114,68,124,2,106,6, + 114,68,124,2,106,6,124,0,95,7,124,1,124,0,95,2, + 124,0,106,7,83,0,114,109,0,0,0,41,8,114,111,0, + 0,0,114,25,1,0,0,114,26,1,0,0,114,27,1,0, + 0,114,23,1,0,0,114,140,0,0,0,114,178,0,0,0, + 114,24,1,0,0,41,3,114,118,0,0,0,90,11,112,97, + 114,101,110,116,95,112,97,116,104,114,187,0,0,0,114,3, + 0,0,0,114,3,0,0,0,114,6,0,0,0,218,12,95, + 114,101,99,97,108,99,117,108,97,116,101,139,4,0,0,115, + 16,0,0,0,0,2,12,1,10,1,14,3,18,1,6,1, + 8,1,6,1,122,27,95,78,97,109,101,115,112,97,99,101, + 80,97,116,104,46,95,114,101,99,97,108,99,117,108,97,116, + 101,99,1,0,0,0,0,0,0,0,0,0,0,0,1,0, + 0,0,3,0,0,0,67,0,0,0,115,12,0,0,0,116, + 0,124,0,160,1,161,0,131,1,83,0,114,109,0,0,0, + 41,2,114,6,1,0,0,114,32,1,0,0,114,246,0,0, + 0,114,3,0,0,0,114,3,0,0,0,114,6,0,0,0, + 218,8,95,95,105,116,101,114,95,95,152,4,0,0,115,2, + 0,0,0,0,1,122,23,95,78,97,109,101,115,112,97,99, + 101,80,97,116,104,46,95,95,105,116,101,114,95,95,99,2, + 0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,2, + 0,0,0,67,0,0,0,115,12,0,0,0,124,0,160,0, + 161,0,124,1,25,0,83,0,114,109,0,0,0,169,1,114, + 32,1,0,0,41,2,114,118,0,0,0,218,5,105,110,100, + 101,120,114,3,0,0,0,114,3,0,0,0,114,6,0,0, + 0,218,11,95,95,103,101,116,105,116,101,109,95,95,155,4, + 0,0,115,2,0,0,0,0,1,122,26,95,78,97,109,101, + 115,112,97,99,101,80,97,116,104,46,95,95,103,101,116,105, + 116,101,109,95,95,99,3,0,0,0,0,0,0,0,0,0, + 0,0,3,0,0,0,3,0,0,0,67,0,0,0,115,14, + 0,0,0,124,2,124,0,106,0,124,1,60,0,100,0,83, + 0,114,109,0,0,0,41,1,114,24,1,0,0,41,3,114, + 118,0,0,0,114,35,1,0,0,114,43,0,0,0,114,3, + 0,0,0,114,3,0,0,0,114,6,0,0,0,218,11,95, + 95,115,101,116,105,116,101,109,95,95,158,4,0,0,115,2, + 0,0,0,0,1,122,26,95,78,97,109,101,115,112,97,99, + 101,80,97,116,104,46,95,95,115,101,116,105,116,101,109,95, + 95,99,1,0,0,0,0,0,0,0,0,0,0,0,1,0, + 0,0,3,0,0,0,67,0,0,0,115,12,0,0,0,116, + 0,124,0,160,1,161,0,131,1,83,0,114,109,0,0,0, + 41,2,114,22,0,0,0,114,32,1,0,0,114,246,0,0, + 0,114,3,0,0,0,114,3,0,0,0,114,6,0,0,0, + 218,7,95,95,108,101,110,95,95,161,4,0,0,115,2,0, + 0,0,0,1,122,22,95,78,97,109,101,115,112,97,99,101, + 80,97,116,104,46,95,95,108,101,110,95,95,99,1,0,0, + 0,0,0,0,0,0,0,0,0,1,0,0,0,3,0,0, + 0,67,0,0,0,115,12,0,0,0,100,1,160,0,124,0, + 106,1,161,1,83,0,41,2,78,122,20,95,78,97,109,101, + 115,112,97,99,101,80,97,116,104,40,123,33,114,125,41,41, + 2,114,61,0,0,0,114,24,1,0,0,114,246,0,0,0, + 114,3,0,0,0,114,3,0,0,0,114,6,0,0,0,218, + 8,95,95,114,101,112,114,95,95,164,4,0,0,115,2,0, + 0,0,0,1,122,23,95,78,97,109,101,115,112,97,99,101, + 80,97,116,104,46,95,95,114,101,112,114,95,95,99,2,0, + 0,0,0,0,0,0,0,0,0,0,2,0,0,0,3,0, + 0,0,67,0,0,0,115,12,0,0,0,124,1,124,0,160, + 0,161,0,107,6,83,0,114,109,0,0,0,114,34,1,0, + 0,169,2,114,118,0,0,0,218,4,105,116,101,109,114,3, + 0,0,0,114,3,0,0,0,114,6,0,0,0,218,12,95, + 95,99,111,110,116,97,105,110,115,95,95,167,4,0,0,115, + 2,0,0,0,0,1,122,27,95,78,97,109,101,115,112,97, + 99,101,80,97,116,104,46,95,95,99,111,110,116,97,105,110, + 115,95,95,99,2,0,0,0,0,0,0,0,0,0,0,0, + 2,0,0,0,3,0,0,0,67,0,0,0,115,16,0,0, + 0,124,0,106,0,160,1,124,1,161,1,1,0,100,0,83, + 0,114,109,0,0,0,41,2,114,24,1,0,0,114,186,0, + 0,0,114,40,1,0,0,114,3,0,0,0,114,3,0,0, + 0,114,6,0,0,0,114,186,0,0,0,170,4,0,0,115, + 2,0,0,0,0,1,122,21,95,78,97,109,101,115,112,97, + 99,101,80,97,116,104,46,97,112,112,101,110,100,78,41,15, + 114,125,0,0,0,114,124,0,0,0,114,126,0,0,0,114, + 127,0,0,0,114,209,0,0,0,114,30,1,0,0,114,25, + 1,0,0,114,32,1,0,0,114,33,1,0,0,114,36,1, + 0,0,114,37,1,0,0,114,38,1,0,0,114,39,1,0, + 0,114,42,1,0,0,114,186,0,0,0,114,3,0,0,0, + 114,3,0,0,0,114,3,0,0,0,114,6,0,0,0,114, + 22,1,0,0,112,4,0,0,115,24,0,0,0,8,1,4, + 6,8,6,8,10,8,4,8,13,8,3,8,3,8,3,8, + 3,8,3,8,3,114,22,1,0,0,99,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,64, + 0,0,0,115,80,0,0,0,101,0,90,1,100,0,90,2, + 100,1,100,2,132,0,90,3,101,4,100,3,100,4,132,0, + 131,1,90,5,100,5,100,6,132,0,90,6,100,7,100,8, + 132,0,90,7,100,9,100,10,132,0,90,8,100,11,100,12, + 132,0,90,9,100,13,100,14,132,0,90,10,100,15,100,16, + 132,0,90,11,100,17,83,0,41,18,218,16,95,78,97,109, + 101,115,112,97,99,101,76,111,97,100,101,114,99,4,0,0, + 0,0,0,0,0,0,0,0,0,4,0,0,0,4,0,0, + 0,67,0,0,0,115,18,0,0,0,116,0,124,1,124,2, + 124,3,131,3,124,0,95,1,100,0,83,0,114,109,0,0, + 0,41,2,114,22,1,0,0,114,24,1,0,0,114,28,1, + 0,0,114,3,0,0,0,114,3,0,0,0,114,6,0,0, + 0,114,209,0,0,0,176,4,0,0,115,2,0,0,0,0, + 1,122,25,95,78,97,109,101,115,112,97,99,101,76,111,97, + 100,101,114,46,95,95,105,110,105,116,95,95,99,2,0,0, + 0,0,0,0,0,0,0,0,0,2,0,0,0,3,0,0, + 0,67,0,0,0,115,12,0,0,0,100,1,160,0,124,1, + 106,1,161,1,83,0,41,2,122,115,82,101,116,117,114,110, + 32,114,101,112,114,32,102,111,114,32,116,104,101,32,109,111, + 100,117,108,101,46,10,10,32,32,32,32,32,32,32,32,84, + 104,101,32,109,101,116,104,111,100,32,105,115,32,100,101,112, + 114,101,99,97,116,101,100,46,32,32,84,104,101,32,105,109, + 112,111,114,116,32,109,97,99,104,105,110,101,114,121,32,100, + 111,101,115,32,116,104,101,32,106,111,98,32,105,116,115,101, + 108,102,46,10,10,32,32,32,32,32,32,32,32,122,25,60, + 109,111,100,117,108,101,32,123,33,114,125,32,40,110,97,109, + 101,115,112,97,99,101,41,62,41,2,114,61,0,0,0,114, + 125,0,0,0,41,2,114,193,0,0,0,114,216,0,0,0, + 114,3,0,0,0,114,3,0,0,0,114,6,0,0,0,218, + 11,109,111,100,117,108,101,95,114,101,112,114,179,4,0,0, + 115,2,0,0,0,0,7,122,28,95,78,97,109,101,115,112, + 97,99,101,76,111,97,100,101,114,46,109,111,100,117,108,101, + 95,114,101,112,114,99,2,0,0,0,0,0,0,0,0,0, + 0,0,2,0,0,0,1,0,0,0,67,0,0,0,115,4, + 0,0,0,100,1,83,0,41,2,78,84,114,3,0,0,0, + 114,219,0,0,0,114,3,0,0,0,114,3,0,0,0,114, + 6,0,0,0,114,182,0,0,0,188,4,0,0,115,2,0, + 0,0,0,1,122,27,95,78,97,109,101,115,112,97,99,101, + 76,111,97,100,101,114,46,105,115,95,112,97,99,107,97,103, + 101,99,2,0,0,0,0,0,0,0,0,0,0,0,2,0, + 0,0,1,0,0,0,67,0,0,0,115,4,0,0,0,100, + 1,83,0,41,2,78,114,39,0,0,0,114,3,0,0,0, + 114,219,0,0,0,114,3,0,0,0,114,3,0,0,0,114, + 6,0,0,0,114,229,0,0,0,191,4,0,0,115,2,0, + 0,0,0,1,122,27,95,78,97,109,101,115,112,97,99,101, + 76,111,97,100,101,114,46,103,101,116,95,115,111,117,114,99, + 101,99,2,0,0,0,0,0,0,0,0,0,0,0,2,0, + 0,0,6,0,0,0,67,0,0,0,115,16,0,0,0,116, + 0,100,1,100,2,100,3,100,4,100,5,141,4,83,0,41, + 6,78,114,39,0,0,0,122,8,60,115,116,114,105,110,103, + 62,114,215,0,0,0,84,41,1,114,231,0,0,0,41,1, + 114,232,0,0,0,114,219,0,0,0,114,3,0,0,0,114, + 3,0,0,0,114,6,0,0,0,114,213,0,0,0,194,4, + 0,0,115,2,0,0,0,0,1,122,25,95,78,97,109,101, + 115,112,97,99,101,76,111,97,100,101,114,46,103,101,116,95, + 99,111,100,101,99,2,0,0,0,0,0,0,0,0,0,0, + 0,2,0,0,0,1,0,0,0,67,0,0,0,115,4,0, + 0,0,100,1,83,0,114,210,0,0,0,114,3,0,0,0, + 114,211,0,0,0,114,3,0,0,0,114,3,0,0,0,114, + 6,0,0,0,114,212,0,0,0,197,4,0,0,115,2,0, + 0,0,0,1,122,30,95,78,97,109,101,115,112,97,99,101, + 76,111,97,100,101,114,46,99,114,101,97,116,101,95,109,111, + 100,117,108,101,99,2,0,0,0,0,0,0,0,0,0,0, + 0,2,0,0,0,1,0,0,0,67,0,0,0,115,4,0, + 0,0,100,0,83,0,114,109,0,0,0,114,3,0,0,0, + 114,253,0,0,0,114,3,0,0,0,114,3,0,0,0,114, + 6,0,0,0,114,217,0,0,0,200,4,0,0,115,2,0, + 0,0,0,1,122,28,95,78,97,109,101,115,112,97,99,101, + 76,111,97,100,101,114,46,101,120,101,99,95,109,111,100,117, + 108,101,99,2,0,0,0,0,0,0,0,0,0,0,0,2, + 0,0,0,4,0,0,0,67,0,0,0,115,26,0,0,0, + 116,0,160,1,100,1,124,0,106,2,161,2,1,0,116,0, + 160,3,124,0,124,1,161,2,83,0,41,2,122,98,76,111, + 97,100,32,97,32,110,97,109,101,115,112,97,99,101,32,109, + 111,100,117,108,101,46,10,10,32,32,32,32,32,32,32,32, + 84,104,105,115,32,109,101,116,104,111,100,32,105,115,32,100, + 101,112,114,101,99,97,116,101,100,46,32,32,85,115,101,32, + 101,120,101,99,95,109,111,100,117,108,101,40,41,32,105,110, + 115,116,101,97,100,46,10,10,32,32,32,32,32,32,32,32, + 122,38,110,97,109,101,115,112,97,99,101,32,109,111,100,117, + 108,101,32,108,111,97,100,101,100,32,119,105,116,104,32,112, + 97,116,104,32,123,33,114,125,41,4,114,134,0,0,0,114, + 149,0,0,0,114,24,1,0,0,114,218,0,0,0,114,219, + 0,0,0,114,3,0,0,0,114,3,0,0,0,114,6,0, + 0,0,114,220,0,0,0,203,4,0,0,115,8,0,0,0, + 0,7,6,1,4,255,4,2,122,28,95,78,97,109,101,115, + 112,97,99,101,76,111,97,100,101,114,46,108,111,97,100,95, + 109,111,100,117,108,101,78,41,12,114,125,0,0,0,114,124, + 0,0,0,114,126,0,0,0,114,209,0,0,0,114,207,0, + 0,0,114,44,1,0,0,114,182,0,0,0,114,229,0,0, + 0,114,213,0,0,0,114,212,0,0,0,114,217,0,0,0, + 114,220,0,0,0,114,3,0,0,0,114,3,0,0,0,114, + 3,0,0,0,114,6,0,0,0,114,43,1,0,0,175,4, + 0,0,115,18,0,0,0,8,1,8,3,2,1,10,8,8, + 3,8,3,8,3,8,3,8,3,114,43,1,0,0,99,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4, + 0,0,0,64,0,0,0,115,118,0,0,0,101,0,90,1, + 100,0,90,2,100,1,90,3,101,4,100,2,100,3,132,0, + 131,1,90,5,101,4,100,4,100,5,132,0,131,1,90,6, + 101,4,100,6,100,7,132,0,131,1,90,7,101,4,100,8, + 100,9,132,0,131,1,90,8,101,4,100,19,100,11,100,12, + 132,1,131,1,90,9,101,4,100,20,100,13,100,14,132,1, + 131,1,90,10,101,4,100,21,100,15,100,16,132,1,131,1, + 90,11,101,4,100,17,100,18,132,0,131,1,90,12,100,10, + 83,0,41,22,218,10,80,97,116,104,70,105,110,100,101,114, + 122,62,77,101,116,97,32,112,97,116,104,32,102,105,110,100, + 101,114,32,102,111,114,32,115,121,115,46,112,97,116,104,32, + 97,110,100,32,112,97,99,107,97,103,101,32,95,95,112,97, + 116,104,95,95,32,97,116,116,114,105,98,117,116,101,115,46, + 99,1,0,0,0,0,0,0,0,0,0,0,0,3,0,0, + 0,4,0,0,0,67,0,0,0,115,64,0,0,0,116,0, + 116,1,106,2,160,3,161,0,131,1,68,0,93,44,92,2, + 125,1,125,2,124,2,100,1,107,8,114,40,116,1,106,2, + 124,1,61,0,113,14,116,4,124,2,100,2,131,2,114,14, + 124,2,160,5,161,0,1,0,113,14,100,1,83,0,41,3, + 122,125,67,97,108,108,32,116,104,101,32,105,110,118,97,108, + 105,100,97,116,101,95,99,97,99,104,101,115,40,41,32,109, + 101,116,104,111,100,32,111,110,32,97,108,108,32,112,97,116, + 104,32,101,110,116,114,121,32,102,105,110,100,101,114,115,10, + 32,32,32,32,32,32,32,32,115,116,111,114,101,100,32,105, + 110,32,115,121,115,46,112,97,116,104,95,105,109,112,111,114, + 116,101,114,95,99,97,99,104,101,115,32,40,119,104,101,114, + 101,32,105,109,112,108,101,109,101,110,116,101,100,41,46,78, + 218,17,105,110,118,97,108,105,100,97,116,101,95,99,97,99, + 104,101,115,41,6,218,4,108,105,115,116,114,8,0,0,0, + 218,19,112,97,116,104,95,105,109,112,111,114,116,101,114,95, + 99,97,99,104,101,218,5,105,116,101,109,115,114,128,0,0, + 0,114,46,1,0,0,41,3,114,193,0,0,0,114,116,0, + 0,0,218,6,102,105,110,100,101,114,114,3,0,0,0,114, + 3,0,0,0,114,6,0,0,0,114,46,1,0,0,221,4, + 0,0,115,10,0,0,0,0,4,22,1,8,1,10,1,10, + 1,122,28,80,97,116,104,70,105,110,100,101,114,46,105,110, + 118,97,108,105,100,97,116,101,95,99,97,99,104,101,115,99, + 2,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0, + 9,0,0,0,67,0,0,0,115,84,0,0,0,116,0,106, + 1,100,1,107,9,114,28,116,0,106,1,115,28,116,2,160, + 3,100,2,116,4,161,2,1,0,116,0,106,1,68,0,93, + 44,125,2,122,14,124,2,124,1,131,1,87,0,2,0,1, + 0,83,0,4,0,116,5,107,10,114,76,1,0,1,0,1, + 0,89,0,113,34,89,0,113,34,48,0,113,34,100,1,83, + 0,41,3,122,46,83,101,97,114,99,104,32,115,121,115,46, + 112,97,116,104,95,104,111,111,107,115,32,102,111,114,32,97, + 32,102,105,110,100,101,114,32,102,111,114,32,39,112,97,116, + 104,39,46,78,122,23,115,121,115,46,112,97,116,104,95,104, + 111,111,107,115,32,105,115,32,101,109,112,116,121,41,6,114, + 8,0,0,0,218,10,112,97,116,104,95,104,111,111,107,115, + 114,74,0,0,0,114,75,0,0,0,114,138,0,0,0,114, + 117,0,0,0,41,3,114,193,0,0,0,114,43,0,0,0, + 90,4,104,111,111,107,114,3,0,0,0,114,3,0,0,0, + 114,6,0,0,0,218,11,95,112,97,116,104,95,104,111,111, + 107,115,231,4,0,0,115,16,0,0,0,0,3,16,1,12, + 1,10,1,2,1,14,1,14,1,12,2,122,22,80,97,116, + 104,70,105,110,100,101,114,46,95,112,97,116,104,95,104,111, + 111,107,115,99,2,0,0,0,0,0,0,0,0,0,0,0, + 3,0,0,0,8,0,0,0,67,0,0,0,115,104,0,0, + 0,124,1,100,1,107,2,114,44,122,12,116,0,160,1,161, + 0,125,1,87,0,110,22,4,0,116,2,107,10,114,42,1, + 0,1,0,1,0,89,0,100,2,83,0,48,0,122,14,116, + 3,106,4,124,1,25,0,125,2,87,0,110,40,4,0,116, + 5,107,10,114,98,1,0,1,0,1,0,124,0,160,6,124, + 1,161,1,125,2,124,2,116,3,106,4,124,1,60,0,89, + 0,110,2,48,0,124,2,83,0,41,3,122,210,71,101,116, + 32,116,104,101,32,102,105,110,100,101,114,32,102,111,114,32, + 116,104,101,32,112,97,116,104,32,101,110,116,114,121,32,102, + 114,111,109,32,115,121,115,46,112,97,116,104,95,105,109,112, + 111,114,116,101,114,95,99,97,99,104,101,46,10,10,32,32, + 32,32,32,32,32,32,73,102,32,116,104,101,32,112,97,116, + 104,32,101,110,116,114,121,32,105,115,32,110,111,116,32,105, + 110,32,116,104,101,32,99,97,99,104,101,44,32,102,105,110, + 100,32,116,104,101,32,97,112,112,114,111,112,114,105,97,116, + 101,32,102,105,110,100,101,114,10,32,32,32,32,32,32,32, + 32,97,110,100,32,99,97,99,104,101,32,105,116,46,32,73, + 102,32,110,111,32,102,105,110,100,101,114,32,105,115,32,97, + 118,97,105,108,97,98,108,101,44,32,115,116,111,114,101,32, + 78,111,110,101,46,10,10,32,32,32,32,32,32,32,32,114, + 39,0,0,0,78,41,7,114,2,0,0,0,114,54,0,0, + 0,114,3,1,0,0,114,8,0,0,0,114,48,1,0,0, + 218,8,75,101,121,69,114,114,111,114,114,52,1,0,0,41, + 3,114,193,0,0,0,114,43,0,0,0,114,50,1,0,0, + 114,3,0,0,0,114,3,0,0,0,114,6,0,0,0,218, + 20,95,112,97,116,104,95,105,109,112,111,114,116,101,114,95, + 99,97,99,104,101,244,4,0,0,115,22,0,0,0,0,8, + 8,1,2,1,12,1,14,3,8,1,2,1,14,1,14,1, + 10,1,16,1,122,31,80,97,116,104,70,105,110,100,101,114, + 46,95,112,97,116,104,95,105,109,112,111,114,116,101,114,95, + 99,97,99,104,101,99,3,0,0,0,0,0,0,0,0,0, + 0,0,6,0,0,0,4,0,0,0,67,0,0,0,115,82, + 0,0,0,116,0,124,2,100,1,131,2,114,26,124,2,160, + 1,124,1,161,1,92,2,125,3,125,4,110,14,124,2,160, + 2,124,1,161,1,125,3,103,0,125,4,124,3,100,0,107, + 9,114,60,116,3,160,4,124,1,124,3,161,2,83,0,116, + 3,160,5,124,1,100,0,161,2,125,5,124,4,124,5,95, + 6,124,5,83,0,41,2,78,114,137,0,0,0,41,7,114, + 128,0,0,0,114,137,0,0,0,114,206,0,0,0,114,134, + 0,0,0,114,201,0,0,0,114,183,0,0,0,114,178,0, + 0,0,41,6,114,193,0,0,0,114,139,0,0,0,114,50, + 1,0,0,114,140,0,0,0,114,141,0,0,0,114,187,0, + 0,0,114,3,0,0,0,114,3,0,0,0,114,6,0,0, + 0,218,16,95,108,101,103,97,99,121,95,103,101,116,95,115, + 112,101,99,10,5,0,0,115,18,0,0,0,0,4,10,1, + 16,2,10,1,4,1,8,1,12,1,12,1,6,1,122,27, + 80,97,116,104,70,105,110,100,101,114,46,95,108,101,103,97, + 99,121,95,103,101,116,95,115,112,101,99,78,99,4,0,0, + 0,0,0,0,0,0,0,0,0,9,0,0,0,5,0,0, + 0,67,0,0,0,115,166,0,0,0,103,0,125,4,124,2, + 68,0,93,134,125,5,116,0,124,5,116,1,116,2,102,2, + 131,2,115,28,113,8,124,0,160,3,124,5,161,1,125,6, + 124,6,100,1,107,9,114,8,116,4,124,6,100,2,131,2, + 114,70,124,6,160,5,124,1,124,3,161,2,125,7,110,12, + 124,0,160,6,124,1,124,6,161,2,125,7,124,7,100,1, + 107,8,114,92,113,8,124,7,106,7,100,1,107,9,114,110, + 124,7,2,0,1,0,83,0,124,7,106,8,125,8,124,8, + 100,1,107,8,114,132,116,9,100,3,131,1,130,1,124,4, + 160,10,124,8,161,1,1,0,113,8,116,11,160,12,124,1, + 100,1,161,2,125,7,124,4,124,7,95,8,124,7,83,0, + 41,4,122,63,70,105,110,100,32,116,104,101,32,108,111,97, + 100,101,114,32,111,114,32,110,97,109,101,115,112,97,99,101, + 95,112,97,116,104,32,102,111,114,32,116,104,105,115,32,109, + 111,100,117,108,101,47,112,97,99,107,97,103,101,32,110,97, + 109,101,46,78,114,203,0,0,0,122,19,115,112,101,99,32, + 109,105,115,115,105,110,103,32,108,111,97,100,101,114,41,13, + 114,161,0,0,0,114,84,0,0,0,218,5,98,121,116,101, + 115,114,54,1,0,0,114,128,0,0,0,114,203,0,0,0, + 114,55,1,0,0,114,140,0,0,0,114,178,0,0,0,114, + 117,0,0,0,114,167,0,0,0,114,134,0,0,0,114,183, + 0,0,0,41,9,114,193,0,0,0,114,139,0,0,0,114, + 43,0,0,0,114,202,0,0,0,218,14,110,97,109,101,115, + 112,97,99,101,95,112,97,116,104,90,5,101,110,116,114,121, + 114,50,1,0,0,114,187,0,0,0,114,141,0,0,0,114, + 3,0,0,0,114,3,0,0,0,114,6,0,0,0,218,9, + 95,103,101,116,95,115,112,101,99,25,5,0,0,115,40,0, + 0,0,0,5,4,1,8,1,14,1,2,1,10,1,8,1, + 10,1,14,2,12,1,8,1,2,1,10,1,8,1,6,1, + 8,1,8,5,12,2,12,1,6,1,122,20,80,97,116,104, + 70,105,110,100,101,114,46,95,103,101,116,95,115,112,101,99, + 99,4,0,0,0,0,0,0,0,0,0,0,0,6,0,0, + 0,5,0,0,0,67,0,0,0,115,100,0,0,0,124,2, + 100,1,107,8,114,14,116,0,106,1,125,2,124,0,160,2, + 124,1,124,2,124,3,161,3,125,4,124,4,100,1,107,8, + 114,40,100,1,83,0,124,4,106,3,100,1,107,8,114,92, + 124,4,106,4,125,5,124,5,114,86,100,1,124,4,95,5, + 116,6,124,1,124,5,124,0,106,2,131,3,124,4,95,4, + 124,4,83,0,100,1,83,0,110,4,124,4,83,0,100,1, + 83,0,41,2,122,141,84,114,121,32,116,111,32,102,105,110, + 100,32,97,32,115,112,101,99,32,102,111,114,32,39,102,117, + 108,108,110,97,109,101,39,32,111,110,32,115,121,115,46,112, + 97,116,104,32,111,114,32,39,112,97,116,104,39,46,10,10, + 32,32,32,32,32,32,32,32,84,104,101,32,115,101,97,114, + 99,104,32,105,115,32,98,97,115,101,100,32,111,110,32,115, + 121,115,46,112,97,116,104,95,104,111,111,107,115,32,97,110, + 100,32,115,121,115,46,112,97,116,104,95,105,109,112,111,114, + 116,101,114,95,99,97,99,104,101,46,10,32,32,32,32,32, + 32,32,32,78,41,7,114,8,0,0,0,114,43,0,0,0, + 114,58,1,0,0,114,140,0,0,0,114,178,0,0,0,114, + 181,0,0,0,114,22,1,0,0,41,6,114,193,0,0,0, + 114,139,0,0,0,114,43,0,0,0,114,202,0,0,0,114, + 187,0,0,0,114,57,1,0,0,114,3,0,0,0,114,3, + 0,0,0,114,6,0,0,0,114,203,0,0,0,57,5,0, + 0,115,26,0,0,0,0,6,8,1,6,1,14,1,8,1, + 4,1,10,1,6,1,4,3,6,1,16,1,4,2,6,2, + 122,20,80,97,116,104,70,105,110,100,101,114,46,102,105,110, + 100,95,115,112,101,99,99,3,0,0,0,0,0,0,0,0, + 0,0,0,4,0,0,0,4,0,0,0,67,0,0,0,115, + 30,0,0,0,124,0,160,0,124,1,124,2,161,2,125,3, + 124,3,100,1,107,8,114,24,100,1,83,0,124,3,106,1, + 83,0,41,2,122,170,102,105,110,100,32,116,104,101,32,109, + 111,100,117,108,101,32,111,110,32,115,121,115,46,112,97,116, + 104,32,111,114,32,39,112,97,116,104,39,32,98,97,115,101, + 100,32,111,110,32,115,121,115,46,112,97,116,104,95,104,111, + 111,107,115,32,97,110,100,10,32,32,32,32,32,32,32,32, + 115,121,115,46,112,97,116,104,95,105,109,112,111,114,116,101, + 114,95,99,97,99,104,101,46,10,10,32,32,32,32,32,32, + 32,32,84,104,105,115,32,109,101,116,104,111,100,32,105,115, + 32,100,101,112,114,101,99,97,116,101,100,46,32,32,85,115, + 101,32,102,105,110,100,95,115,112,101,99,40,41,32,105,110, + 115,116,101,97,100,46,10,10,32,32,32,32,32,32,32,32, + 78,114,204,0,0,0,114,205,0,0,0,114,3,0,0,0, + 114,3,0,0,0,114,6,0,0,0,114,206,0,0,0,81, + 5,0,0,115,8,0,0,0,0,8,12,1,8,1,4,1, + 122,22,80,97,116,104,70,105,110,100,101,114,46,102,105,110, + 100,95,109,111,100,117,108,101,99,1,0,0,0,0,0,0, + 0,0,0,0,0,4,0,0,0,3,0,0,0,79,0,0, + 0,115,24,0,0,0,100,1,100,2,108,0,109,1,125,3, + 1,0,124,3,106,2,124,1,124,2,142,1,83,0,41,3, + 97,32,1,0,0,10,32,32,32,32,32,32,32,32,70,105, + 110,100,32,100,105,115,116,114,105,98,117,116,105,111,110,115, + 46,10,10,32,32,32,32,32,32,32,32,82,101,116,117,114, + 110,32,97,110,32,105,116,101,114,97,98,108,101,32,111,102, + 32,97,108,108,32,68,105,115,116,114,105,98,117,116,105,111, + 110,32,105,110,115,116,97,110,99,101,115,32,99,97,112,97, + 98,108,101,32,111,102,10,32,32,32,32,32,32,32,32,108, + 111,97,100,105,110,103,32,116,104,101,32,109,101,116,97,100, + 97,116,97,32,102,111,114,32,112,97,99,107,97,103,101,115, + 32,109,97,116,99,104,105,110,103,32,96,96,99,111,110,116, + 101,120,116,46,110,97,109,101,96,96,10,32,32,32,32,32, + 32,32,32,40,111,114,32,97,108,108,32,110,97,109,101,115, + 32,105,102,32,96,96,78,111,110,101,96,96,32,105,110,100, + 105,99,97,116,101,100,41,32,97,108,111,110,103,32,116,104, + 101,32,112,97,116,104,115,32,105,110,32,116,104,101,32,108, + 105,115,116,10,32,32,32,32,32,32,32,32,111,102,32,100, + 105,114,101,99,116,111,114,105,101,115,32,96,96,99,111,110, + 116,101,120,116,46,112,97,116,104,96,96,46,10,32,32,32, + 32,32,32,32,32,114,72,0,0,0,41,1,218,18,77,101, + 116,97,100,97,116,97,80,97,116,104,70,105,110,100,101,114, + 41,3,90,18,105,109,112,111,114,116,108,105,98,46,109,101, + 116,97,100,97,116,97,114,59,1,0,0,218,18,102,105,110, + 100,95,100,105,115,116,114,105,98,117,116,105,111,110,115,41, + 4,114,193,0,0,0,114,119,0,0,0,114,120,0,0,0, + 114,59,1,0,0,114,3,0,0,0,114,3,0,0,0,114, + 6,0,0,0,114,60,1,0,0,94,5,0,0,115,4,0, + 0,0,0,10,12,1,122,29,80,97,116,104,70,105,110,100, + 101,114,46,102,105,110,100,95,100,105,115,116,114,105,98,117, + 116,105,111,110,115,41,1,78,41,2,78,78,41,1,78,41, + 13,114,125,0,0,0,114,124,0,0,0,114,126,0,0,0, + 114,127,0,0,0,114,207,0,0,0,114,46,1,0,0,114, + 52,1,0,0,114,54,1,0,0,114,55,1,0,0,114,58, + 1,0,0,114,203,0,0,0,114,206,0,0,0,114,60,1, 0,0,114,3,0,0,0,114,3,0,0,0,114,3,0,0, - 0,114,6,0,0,0,218,8,60,109,111,100,117,108,101,62, - 1,0,0,0,115,126,0,0,0,4,22,4,1,4,1,2, - 1,2,255,4,4,8,17,8,5,8,5,8,6,8,6,8, - 12,8,10,8,9,8,5,8,7,8,9,10,22,10,127,0, - 14,16,1,12,2,4,1,4,2,6,2,6,2,8,2,16, - 71,8,40,8,19,8,12,8,12,8,28,8,17,8,33,8, - 28,8,24,10,13,10,10,10,11,8,14,6,3,4,1,2, - 255,12,68,14,64,14,29,16,127,0,17,14,72,18,45,18, - 26,4,3,18,53,14,63,14,42,14,127,0,20,14,127,0, - 22,10,23,8,11,8,65, + 0,114,6,0,0,0,114,45,1,0,0,217,4,0,0,115, + 34,0,0,0,8,2,4,2,2,1,10,9,2,1,10,12, + 2,1,10,21,2,1,10,14,2,1,12,31,2,1,12,23, + 2,1,12,12,2,1,114,45,1,0,0,99,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0, + 64,0,0,0,115,90,0,0,0,101,0,90,1,100,0,90, + 2,100,1,90,3,100,2,100,3,132,0,90,4,100,4,100, + 5,132,0,90,5,101,6,90,7,100,6,100,7,132,0,90, + 8,100,8,100,9,132,0,90,9,100,19,100,11,100,12,132, + 1,90,10,100,13,100,14,132,0,90,11,101,12,100,15,100, + 16,132,0,131,1,90,13,100,17,100,18,132,0,90,14,100, + 10,83,0,41,20,218,10,70,105,108,101,70,105,110,100,101, + 114,122,172,70,105,108,101,45,98,97,115,101,100,32,102,105, + 110,100,101,114,46,10,10,32,32,32,32,73,110,116,101,114, + 97,99,116,105,111,110,115,32,119,105,116,104,32,116,104,101, + 32,102,105,108,101,32,115,121,115,116,101,109,32,97,114,101, + 32,99,97,99,104,101,100,32,102,111,114,32,112,101,114,102, + 111,114,109,97,110,99,101,44,32,98,101,105,110,103,10,32, + 32,32,32,114,101,102,114,101,115,104,101,100,32,119,104,101, + 110,32,116,104,101,32,100,105,114,101,99,116,111,114,121,32, + 116,104,101,32,102,105,110,100,101,114,32,105,115,32,104,97, + 110,100,108,105,110,103,32,104,97,115,32,98,101,101,110,32, + 109,111,100,105,102,105,101,100,46,10,10,32,32,32,32,99, + 2,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0, + 6,0,0,0,7,0,0,0,115,84,0,0,0,103,0,125, + 3,124,2,68,0,93,32,92,2,137,0,125,4,124,3,160, + 0,135,0,102,1,100,1,100,2,132,8,124,4,68,0,131, + 1,161,1,1,0,113,8,124,3,124,0,95,1,124,1,112, + 54,100,3,124,0,95,2,100,4,124,0,95,3,116,4,131, + 0,124,0,95,5,116,4,131,0,124,0,95,6,100,5,83, + 0,41,6,122,154,73,110,105,116,105,97,108,105,122,101,32, + 119,105,116,104,32,116,104,101,32,112,97,116,104,32,116,111, + 32,115,101,97,114,99,104,32,111,110,32,97,110,100,32,97, + 32,118,97,114,105,97,98,108,101,32,110,117,109,98,101,114, + 32,111,102,10,32,32,32,32,32,32,32,32,50,45,116,117, + 112,108,101,115,32,99,111,110,116,97,105,110,105,110,103,32, + 116,104,101,32,108,111,97,100,101,114,32,97,110,100,32,116, + 104,101,32,102,105,108,101,32,115,117,102,102,105,120,101,115, + 32,116,104,101,32,108,111,97,100,101,114,10,32,32,32,32, + 32,32,32,32,114,101,99,111,103,110,105,122,101,115,46,99, + 1,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0, + 3,0,0,0,51,0,0,0,115,22,0,0,0,124,0,93, + 14,125,1,124,1,136,0,102,2,86,0,1,0,113,2,100, + 0,83,0,114,109,0,0,0,114,3,0,0,0,114,16,1, + 0,0,169,1,114,140,0,0,0,114,3,0,0,0,114,6, + 0,0,0,114,19,1,0,0,123,5,0,0,115,4,0,0, + 0,4,0,2,0,122,38,70,105,108,101,70,105,110,100,101, + 114,46,95,95,105,110,105,116,95,95,46,60,108,111,99,97, + 108,115,62,46,60,103,101,110,101,120,112,114,62,114,70,0, + 0,0,114,104,0,0,0,78,41,7,114,167,0,0,0,218, + 8,95,108,111,97,100,101,114,115,114,43,0,0,0,218,11, + 95,112,97,116,104,95,109,116,105,109,101,218,3,115,101,116, + 218,11,95,112,97,116,104,95,99,97,99,104,101,218,19,95, + 114,101,108,97,120,101,100,95,112,97,116,104,95,99,97,99, + 104,101,41,5,114,118,0,0,0,114,43,0,0,0,218,14, + 108,111,97,100,101,114,95,100,101,116,97,105,108,115,90,7, + 108,111,97,100,101,114,115,114,189,0,0,0,114,3,0,0, + 0,114,62,1,0,0,114,6,0,0,0,114,209,0,0,0, + 117,5,0,0,115,16,0,0,0,0,4,4,1,12,1,26, + 1,6,2,10,1,6,1,8,1,122,19,70,105,108,101,70, + 105,110,100,101,114,46,95,95,105,110,105,116,95,95,99,1, + 0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,2, + 0,0,0,67,0,0,0,115,10,0,0,0,100,1,124,0, + 95,0,100,2,83,0,41,3,122,31,73,110,118,97,108,105, + 100,97,116,101,32,116,104,101,32,100,105,114,101,99,116,111, + 114,121,32,109,116,105,109,101,46,114,104,0,0,0,78,41, + 1,114,64,1,0,0,114,246,0,0,0,114,3,0,0,0, + 114,3,0,0,0,114,6,0,0,0,114,46,1,0,0,131, + 5,0,0,115,2,0,0,0,0,2,122,28,70,105,108,101, + 70,105,110,100,101,114,46,105,110,118,97,108,105,100,97,116, + 101,95,99,97,99,104,101,115,99,2,0,0,0,0,0,0, + 0,0,0,0,0,3,0,0,0,3,0,0,0,67,0,0, + 0,115,42,0,0,0,124,0,160,0,124,1,161,1,125,2, + 124,2,100,1,107,8,114,26,100,1,103,0,102,2,83,0, + 124,2,106,1,124,2,106,2,112,38,103,0,102,2,83,0, + 41,2,122,197,84,114,121,32,116,111,32,102,105,110,100,32, + 97,32,108,111,97,100,101,114,32,102,111,114,32,116,104,101, + 32,115,112,101,99,105,102,105,101,100,32,109,111,100,117,108, + 101,44,32,111,114,32,116,104,101,32,110,97,109,101,115,112, + 97,99,101,10,32,32,32,32,32,32,32,32,112,97,99,107, + 97,103,101,32,112,111,114,116,105,111,110,115,46,32,82,101, + 116,117,114,110,115,32,40,108,111,97,100,101,114,44,32,108, + 105,115,116,45,111,102,45,112,111,114,116,105,111,110,115,41, + 46,10,10,32,32,32,32,32,32,32,32,84,104,105,115,32, + 109,101,116,104,111,100,32,105,115,32,100,101,112,114,101,99, + 97,116,101,100,46,32,32,85,115,101,32,102,105,110,100,95, + 115,112,101,99,40,41,32,105,110,115,116,101,97,100,46,10, + 10,32,32,32,32,32,32,32,32,78,41,3,114,203,0,0, + 0,114,140,0,0,0,114,178,0,0,0,41,3,114,118,0, + 0,0,114,139,0,0,0,114,187,0,0,0,114,3,0,0, + 0,114,3,0,0,0,114,6,0,0,0,114,137,0,0,0, + 137,5,0,0,115,8,0,0,0,0,7,10,1,8,1,8, + 1,122,22,70,105,108,101,70,105,110,100,101,114,46,102,105, + 110,100,95,108,111,97,100,101,114,99,6,0,0,0,0,0, + 0,0,0,0,0,0,7,0,0,0,6,0,0,0,67,0, + 0,0,115,26,0,0,0,124,1,124,2,124,3,131,2,125, + 6,116,0,124,2,124,3,124,6,124,4,100,1,141,4,83, + 0,41,2,78,114,177,0,0,0,41,1,114,190,0,0,0, + 41,7,114,118,0,0,0,114,188,0,0,0,114,139,0,0, + 0,114,43,0,0,0,90,4,115,109,115,108,114,202,0,0, + 0,114,140,0,0,0,114,3,0,0,0,114,3,0,0,0, + 114,6,0,0,0,114,58,1,0,0,149,5,0,0,115,8, + 0,0,0,0,1,10,1,8,1,2,255,122,20,70,105,108, + 101,70,105,110,100,101,114,46,95,103,101,116,95,115,112,101, + 99,78,99,3,0,0,0,0,0,0,0,0,0,0,0,14, + 0,0,0,8,0,0,0,67,0,0,0,115,98,1,0,0, + 100,1,125,3,124,1,160,0,100,2,161,1,100,3,25,0, + 125,4,122,24,116,1,124,0,106,2,112,34,116,3,160,4, + 161,0,131,1,106,5,125,5,87,0,110,24,4,0,116,6, + 107,10,114,66,1,0,1,0,1,0,100,4,125,5,89,0, + 110,2,48,0,124,5,124,0,106,7,107,3,114,92,124,0, + 160,8,161,0,1,0,124,5,124,0,95,7,116,9,131,0, + 114,114,124,0,106,10,125,6,124,4,160,11,161,0,125,7, + 110,10,124,0,106,12,125,6,124,4,125,7,124,7,124,6, + 107,6,114,218,116,13,124,0,106,2,124,4,131,2,125,8, + 124,0,106,14,68,0,93,58,92,2,125,9,125,10,100,5, + 124,9,23,0,125,11,116,13,124,8,124,11,131,2,125,12, + 116,15,124,12,131,1,114,150,124,0,160,16,124,10,124,1, + 124,12,124,8,103,1,124,2,161,5,2,0,1,0,83,0, + 113,150,116,17,124,8,131,1,125,3,124,0,106,14,68,0, + 93,82,92,2,125,9,125,10,116,13,124,0,106,2,124,4, + 124,9,23,0,131,2,125,12,116,18,106,19,100,6,124,12, + 100,3,100,7,141,3,1,0,124,7,124,9,23,0,124,6, + 107,6,114,224,116,15,124,12,131,1,114,224,124,0,160,16, + 124,10,124,1,124,12,100,8,124,2,161,5,2,0,1,0, + 83,0,113,224,124,3,144,1,114,94,116,18,160,19,100,9, + 124,8,161,2,1,0,116,18,160,20,124,1,100,8,161,2, + 125,13,124,8,103,1,124,13,95,21,124,13,83,0,100,8, + 83,0,41,10,122,111,84,114,121,32,116,111,32,102,105,110, + 100,32,97,32,115,112,101,99,32,102,111,114,32,116,104,101, + 32,115,112,101,99,105,102,105,101,100,32,109,111,100,117,108, + 101,46,10,10,32,32,32,32,32,32,32,32,82,101,116,117, + 114,110,115,32,116,104,101,32,109,97,116,99,104,105,110,103, + 32,115,112,101,99,44,32,111,114,32,78,111,110,101,32,105, + 102,32,110,111,116,32,102,111,117,110,100,46,10,32,32,32, + 32,32,32,32,32,70,114,70,0,0,0,114,27,0,0,0, + 114,104,0,0,0,114,209,0,0,0,122,9,116,114,121,105, + 110,103,32,123,125,41,1,90,9,118,101,114,98,111,115,105, + 116,121,78,122,25,112,111,115,115,105,98,108,101,32,110,97, + 109,101,115,112,97,99,101,32,102,111,114,32,123,125,41,22, + 114,40,0,0,0,114,48,0,0,0,114,43,0,0,0,114, + 2,0,0,0,114,54,0,0,0,114,10,1,0,0,114,49, + 0,0,0,114,64,1,0,0,218,11,95,102,105,108,108,95, + 99,97,99,104,101,114,7,0,0,0,114,67,1,0,0,114, + 105,0,0,0,114,66,1,0,0,114,37,0,0,0,114,63, + 1,0,0,114,53,0,0,0,114,58,1,0,0,114,55,0, + 0,0,114,134,0,0,0,114,149,0,0,0,114,183,0,0, + 0,114,178,0,0,0,41,14,114,118,0,0,0,114,139,0, + 0,0,114,202,0,0,0,90,12,105,115,95,110,97,109,101, + 115,112,97,99,101,90,11,116,97,105,108,95,109,111,100,117, + 108,101,114,169,0,0,0,90,5,99,97,99,104,101,90,12, + 99,97,99,104,101,95,109,111,100,117,108,101,90,9,98,97, + 115,101,95,112,97,116,104,114,17,1,0,0,114,188,0,0, + 0,90,13,105,110,105,116,95,102,105,108,101,110,97,109,101, + 90,9,102,117,108,108,95,112,97,116,104,114,187,0,0,0, + 114,3,0,0,0,114,3,0,0,0,114,6,0,0,0,114, + 203,0,0,0,154,5,0,0,115,74,0,0,0,0,5,4, + 1,14,1,2,1,24,1,14,1,10,1,10,1,8,1,6, + 2,6,1,6,1,10,2,6,1,4,2,8,1,12,1,14, + 1,8,1,10,1,8,1,26,4,8,2,14,1,16,1,16, + 1,12,1,8,1,10,1,2,0,2,255,10,2,6,1,12, + 1,12,1,8,1,4,1,122,20,70,105,108,101,70,105,110, + 100,101,114,46,102,105,110,100,95,115,112,101,99,99,1,0, + 0,0,0,0,0,0,0,0,0,0,9,0,0,0,10,0, + 0,0,67,0,0,0,115,190,0,0,0,124,0,106,0,125, + 1,122,22,116,1,160,2,124,1,112,22,116,1,160,3,161, + 0,161,1,125,2,87,0,110,30,4,0,116,4,116,5,116, + 6,102,3,107,10,114,58,1,0,1,0,1,0,103,0,125, + 2,89,0,110,2,48,0,116,7,106,8,160,9,100,1,161, + 1,115,84,116,10,124,2,131,1,124,0,95,11,110,74,116, + 10,131,0,125,3,124,2,68,0,93,56,125,4,124,4,160, + 12,100,2,161,1,92,3,125,5,125,6,125,7,124,6,114, + 136,100,3,160,13,124,5,124,7,160,14,161,0,161,2,125, + 8,110,4,124,5,125,8,124,3,160,15,124,8,161,1,1, + 0,113,94,124,3,124,0,95,11,116,7,106,8,160,9,116, + 16,161,1,114,186,100,4,100,5,132,0,124,2,68,0,131, + 1,124,0,95,17,100,6,83,0,41,7,122,68,70,105,108, + 108,32,116,104,101,32,99,97,99,104,101,32,111,102,32,112, + 111,116,101,110,116,105,97,108,32,109,111,100,117,108,101,115, + 32,97,110,100,32,112,97,99,107,97,103,101,115,32,102,111, + 114,32,116,104,105,115,32,100,105,114,101,99,116,111,114,121, + 46,114,0,0,0,0,114,70,0,0,0,114,60,0,0,0, + 99,1,0,0,0,0,0,0,0,0,0,0,0,2,0,0, + 0,4,0,0,0,83,0,0,0,115,20,0,0,0,104,0, + 124,0,93,12,125,1,124,1,160,0,161,0,146,2,113,4, + 83,0,114,3,0,0,0,41,1,114,105,0,0,0,41,2, + 114,31,0,0,0,90,2,102,110,114,3,0,0,0,114,3, + 0,0,0,114,6,0,0,0,218,9,60,115,101,116,99,111, + 109,112,62,231,5,0,0,115,4,0,0,0,6,0,2,0, + 122,41,70,105,108,101,70,105,110,100,101,114,46,95,102,105, + 108,108,95,99,97,99,104,101,46,60,108,111,99,97,108,115, + 62,46,60,115,101,116,99,111,109,112,62,78,41,18,114,43, + 0,0,0,114,2,0,0,0,114,7,1,0,0,114,54,0, + 0,0,114,3,1,0,0,218,15,80,101,114,109,105,115,115, + 105,111,110,69,114,114,111,114,218,18,78,111,116,65,68,105, + 114,101,99,116,111,114,121,69,114,114,111,114,114,8,0,0, + 0,114,9,0,0,0,114,10,0,0,0,114,65,1,0,0, + 114,66,1,0,0,114,100,0,0,0,114,61,0,0,0,114, + 105,0,0,0,218,3,97,100,100,114,11,0,0,0,114,67, + 1,0,0,41,9,114,118,0,0,0,114,43,0,0,0,114, + 8,1,0,0,90,21,108,111,119,101,114,95,115,117,102,102, + 105,120,95,99,111,110,116,101,110,116,115,114,41,1,0,0, + 114,116,0,0,0,114,29,1,0,0,114,17,1,0,0,90, + 8,110,101,119,95,110,97,109,101,114,3,0,0,0,114,3, + 0,0,0,114,6,0,0,0,114,69,1,0,0,202,5,0, + 0,115,34,0,0,0,0,2,6,1,2,1,22,1,20,3, + 10,3,12,1,12,7,6,1,8,1,16,1,4,1,18,2, + 4,1,12,1,6,1,12,1,122,22,70,105,108,101,70,105, + 110,100,101,114,46,95,102,105,108,108,95,99,97,99,104,101, + 99,1,0,0,0,0,0,0,0,0,0,0,0,3,0,0, + 0,3,0,0,0,7,0,0,0,115,18,0,0,0,135,0, + 135,1,102,2,100,1,100,2,132,8,125,2,124,2,83,0, + 41,3,97,20,1,0,0,65,32,99,108,97,115,115,32,109, + 101,116,104,111,100,32,119,104,105,99,104,32,114,101,116,117, + 114,110,115,32,97,32,99,108,111,115,117,114,101,32,116,111, + 32,117,115,101,32,111,110,32,115,121,115,46,112,97,116,104, + 95,104,111,111,107,10,32,32,32,32,32,32,32,32,119,104, + 105,99,104,32,119,105,108,108,32,114,101,116,117,114,110,32, + 97,110,32,105,110,115,116,97,110,99,101,32,117,115,105,110, + 103,32,116,104,101,32,115,112,101,99,105,102,105,101,100,32, + 108,111,97,100,101,114,115,32,97,110,100,32,116,104,101,32, + 112,97,116,104,10,32,32,32,32,32,32,32,32,99,97,108, + 108,101,100,32,111,110,32,116,104,101,32,99,108,111,115,117, + 114,101,46,10,10,32,32,32,32,32,32,32,32,73,102,32, + 116,104,101,32,112,97,116,104,32,99,97,108,108,101,100,32, + 111,110,32,116,104,101,32,99,108,111,115,117,114,101,32,105, + 115,32,110,111,116,32,97,32,100,105,114,101,99,116,111,114, + 121,44,32,73,109,112,111,114,116,69,114,114,111,114,32,105, + 115,10,32,32,32,32,32,32,32,32,114,97,105,115,101,100, + 46,10,10,32,32,32,32,32,32,32,32,99,1,0,0,0, + 0,0,0,0,0,0,0,0,1,0,0,0,4,0,0,0, + 19,0,0,0,115,34,0,0,0,116,0,124,0,131,1,115, + 20,116,1,100,1,124,0,100,2,141,2,130,1,136,0,124, + 0,102,1,136,1,158,2,142,0,83,0,41,3,122,45,80, + 97,116,104,32,104,111,111,107,32,102,111,114,32,105,109,112, + 111,114,116,108,105,98,46,109,97,99,104,105,110,101,114,121, + 46,70,105,108,101,70,105,110,100,101,114,46,122,30,111,110, + 108,121,32,100,105,114,101,99,116,111,114,105,101,115,32,97, + 114,101,32,115,117,112,112,111,114,116,101,100,114,47,0,0, + 0,41,2,114,55,0,0,0,114,117,0,0,0,114,47,0, + 0,0,169,2,114,193,0,0,0,114,68,1,0,0,114,3, + 0,0,0,114,6,0,0,0,218,24,112,97,116,104,95,104, + 111,111,107,95,102,111,114,95,70,105,108,101,70,105,110,100, + 101,114,243,5,0,0,115,6,0,0,0,0,2,8,1,12, + 1,122,54,70,105,108,101,70,105,110,100,101,114,46,112,97, + 116,104,95,104,111,111,107,46,60,108,111,99,97,108,115,62, + 46,112,97,116,104,95,104,111,111,107,95,102,111,114,95,70, + 105,108,101,70,105,110,100,101,114,114,3,0,0,0,41,3, + 114,193,0,0,0,114,68,1,0,0,114,75,1,0,0,114, + 3,0,0,0,114,74,1,0,0,114,6,0,0,0,218,9, + 112,97,116,104,95,104,111,111,107,233,5,0,0,115,4,0, + 0,0,0,10,14,6,122,20,70,105,108,101,70,105,110,100, + 101,114,46,112,97,116,104,95,104,111,111,107,99,1,0,0, + 0,0,0,0,0,0,0,0,0,1,0,0,0,3,0,0, + 0,67,0,0,0,115,12,0,0,0,100,1,160,0,124,0, + 106,1,161,1,83,0,41,2,78,122,16,70,105,108,101,70, + 105,110,100,101,114,40,123,33,114,125,41,41,2,114,61,0, + 0,0,114,43,0,0,0,114,246,0,0,0,114,3,0,0, + 0,114,3,0,0,0,114,6,0,0,0,114,39,1,0,0, + 251,5,0,0,115,2,0,0,0,0,1,122,19,70,105,108, + 101,70,105,110,100,101,114,46,95,95,114,101,112,114,95,95, + 41,1,78,41,15,114,125,0,0,0,114,124,0,0,0,114, + 126,0,0,0,114,127,0,0,0,114,209,0,0,0,114,46, + 1,0,0,114,143,0,0,0,114,206,0,0,0,114,137,0, + 0,0,114,58,1,0,0,114,203,0,0,0,114,69,1,0, + 0,114,207,0,0,0,114,76,1,0,0,114,39,1,0,0, + 114,3,0,0,0,114,3,0,0,0,114,3,0,0,0,114, + 6,0,0,0,114,61,1,0,0,108,5,0,0,115,22,0, + 0,0,8,2,4,7,8,14,8,4,4,2,8,12,8,5, + 10,48,8,31,2,1,10,17,114,61,1,0,0,99,4,0, + 0,0,0,0,0,0,0,0,0,0,6,0,0,0,8,0, + 0,0,67,0,0,0,115,146,0,0,0,124,0,160,0,100, + 1,161,1,125,4,124,0,160,0,100,2,161,1,125,5,124, + 4,115,66,124,5,114,36,124,5,106,1,125,4,110,30,124, + 2,124,3,107,2,114,56,116,2,124,1,124,2,131,2,125, + 4,110,10,116,3,124,1,124,2,131,2,125,4,124,5,115, + 84,116,4,124,1,124,2,124,4,100,3,141,3,125,5,122, + 36,124,5,124,0,100,2,60,0,124,4,124,0,100,1,60, + 0,124,2,124,0,100,4,60,0,124,3,124,0,100,5,60, + 0,87,0,110,20,4,0,116,5,107,10,114,140,1,0,1, + 0,1,0,89,0,110,2,48,0,100,0,83,0,41,6,78, + 218,10,95,95,108,111,97,100,101,114,95,95,218,8,95,95, + 115,112,101,99,95,95,114,62,1,0,0,90,8,95,95,102, + 105,108,101,95,95,90,10,95,95,99,97,99,104,101,100,95, + 95,41,6,218,3,103,101,116,114,140,0,0,0,114,15,1, + 0,0,114,9,1,0,0,114,190,0,0,0,218,9,69,120, + 99,101,112,116,105,111,110,41,6,90,2,110,115,114,116,0, + 0,0,90,8,112,97,116,104,110,97,109,101,90,9,99,112, + 97,116,104,110,97,109,101,114,140,0,0,0,114,187,0,0, + 0,114,3,0,0,0,114,3,0,0,0,114,6,0,0,0, + 218,14,95,102,105,120,95,117,112,95,109,111,100,117,108,101, + 1,6,0,0,115,34,0,0,0,0,2,10,1,10,1,4, + 1,4,1,8,1,8,1,12,2,10,1,4,1,14,1,2, + 1,8,1,8,1,8,1,12,1,14,2,114,81,1,0,0, + 99,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0, + 0,3,0,0,0,67,0,0,0,115,38,0,0,0,116,0, + 116,1,160,2,161,0,102,2,125,0,116,3,116,4,102,2, + 125,1,116,5,116,6,102,2,125,2,124,0,124,1,124,2, + 103,3,83,0,41,1,122,95,82,101,116,117,114,110,115,32, + 97,32,108,105,115,116,32,111,102,32,102,105,108,101,45,98, + 97,115,101,100,32,109,111,100,117,108,101,32,108,111,97,100, + 101,114,115,46,10,10,32,32,32,32,69,97,99,104,32,105, + 116,101,109,32,105,115,32,97,32,116,117,112,108,101,32,40, + 108,111,97,100,101,114,44,32,115,117,102,102,105,120,101,115, + 41,46,10,32,32,32,32,41,7,114,252,0,0,0,114,163, + 0,0,0,218,18,101,120,116,101,110,115,105,111,110,95,115, + 117,102,102,105,120,101,115,114,9,1,0,0,114,101,0,0, + 0,114,15,1,0,0,114,88,0,0,0,41,3,90,10,101, + 120,116,101,110,115,105,111,110,115,90,6,115,111,117,114,99, + 101,90,8,98,121,116,101,99,111,100,101,114,3,0,0,0, + 114,3,0,0,0,114,6,0,0,0,114,184,0,0,0,24, + 6,0,0,115,8,0,0,0,0,5,12,1,8,1,8,1, + 114,184,0,0,0,99,1,0,0,0,0,0,0,0,0,0, + 0,0,12,0,0,0,9,0,0,0,67,0,0,0,115,178, + 1,0,0,124,0,97,0,116,0,106,1,97,1,116,0,106, + 2,97,2,116,1,106,3,116,4,25,0,125,1,100,1,68, + 0,93,48,125,2,124,2,116,1,106,3,107,7,114,56,116, + 0,160,5,124,2,161,1,125,3,110,10,116,1,106,3,124, + 2,25,0,125,3,116,6,124,1,124,2,124,3,131,3,1, + 0,113,30,100,2,100,3,103,1,102,2,100,4,100,5,100, + 3,103,2,102,2,102,2,125,4,124,4,68,0,93,110,92, + 2,125,5,125,6,116,7,100,6,100,7,132,0,124,6,68, + 0,131,1,131,1,115,136,74,0,130,1,124,6,100,8,25, + 0,125,7,124,5,116,1,106,3,107,6,114,170,116,1,106, + 3,124,5,25,0,125,8,1,0,113,226,113,106,122,20,116, + 0,160,5,124,5,161,1,125,8,87,0,1,0,113,226,87, + 0,113,106,4,0,116,8,107,10,114,214,1,0,1,0,1, + 0,89,0,113,106,89,0,113,106,48,0,113,106,116,8,100, + 9,131,1,130,1,116,6,124,1,100,10,124,8,131,3,1, + 0,116,6,124,1,100,11,124,7,131,3,1,0,116,6,124, + 1,100,12,100,13,160,9,124,6,161,1,131,3,1,0,116, + 6,124,1,100,14,100,15,100,16,132,0,124,6,68,0,131, + 1,131,3,1,0,116,0,160,5,100,17,161,1,125,9,116, + 6,124,1,100,17,124,9,131,3,1,0,116,0,160,5,100, + 18,161,1,125,10,116,6,124,1,100,18,124,10,131,3,1, + 0,124,5,100,4,107,2,144,1,114,110,116,0,160,5,100, + 19,161,1,125,11,116,6,124,1,100,20,124,11,131,3,1, + 0,116,6,124,1,100,21,116,10,131,0,131,3,1,0,116, + 11,160,12,116,2,160,13,161,0,161,1,1,0,124,5,100, + 4,107,2,144,1,114,174,116,14,160,15,100,22,161,1,1, + 0,100,23,116,11,107,6,144,1,114,174,100,24,116,16,95, + 17,100,25,83,0,41,26,122,205,83,101,116,117,112,32,116, + 104,101,32,112,97,116,104,45,98,97,115,101,100,32,105,109, + 112,111,114,116,101,114,115,32,102,111,114,32,105,109,112,111, + 114,116,108,105,98,32,98,121,32,105,109,112,111,114,116,105, + 110,103,32,110,101,101,100,101,100,10,32,32,32,32,98,117, + 105,108,116,45,105,110,32,109,111,100,117,108,101,115,32,97, + 110,100,32,105,110,106,101,99,116,105,110,103,32,116,104,101, + 109,32,105,110,116,111,32,116,104,101,32,103,108,111,98,97, + 108,32,110,97,109,101,115,112,97,99,101,46,10,10,32,32, + 32,32,79,116,104,101,114,32,99,111,109,112,111,110,101,110, + 116,115,32,97,114,101,32,101,120,116,114,97,99,116,101,100, + 32,102,114,111,109,32,116,104,101,32,99,111,114,101,32,98, + 111,111,116,115,116,114,97,112,32,109,111,100,117,108,101,46, + 10,10,32,32,32,32,41,4,114,63,0,0,0,114,74,0, + 0,0,218,8,98,117,105,108,116,105,110,115,114,160,0,0, + 0,90,5,112,111,115,105,120,250,1,47,90,2,110,116,250, + 1,92,99,1,0,0,0,0,0,0,0,0,0,0,0,2, + 0,0,0,3,0,0,0,115,0,0,0,115,26,0,0,0, + 124,0,93,18,125,1,116,0,124,1,131,1,100,0,107,2, + 86,0,1,0,113,2,100,1,83,0,41,2,114,38,0,0, + 0,78,41,1,114,22,0,0,0,41,2,114,31,0,0,0, + 114,94,0,0,0,114,3,0,0,0,114,3,0,0,0,114, + 6,0,0,0,114,19,1,0,0,60,6,0,0,115,4,0, + 0,0,4,0,2,0,122,25,95,115,101,116,117,112,46,60, + 108,111,99,97,108,115,62,46,60,103,101,110,101,120,112,114, + 62,114,72,0,0,0,122,30,105,109,112,111,114,116,108,105, + 98,32,114,101,113,117,105,114,101,115,32,112,111,115,105,120, + 32,111,114,32,110,116,114,2,0,0,0,114,34,0,0,0, + 114,30,0,0,0,114,39,0,0,0,114,57,0,0,0,99, + 1,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0, + 4,0,0,0,83,0,0,0,115,22,0,0,0,104,0,124, + 0,93,14,125,1,100,0,124,1,155,0,157,2,146,2,113, + 4,83,0,41,1,114,73,0,0,0,114,3,0,0,0,41, + 2,114,31,0,0,0,218,1,115,114,3,0,0,0,114,3, + 0,0,0,114,6,0,0,0,114,70,1,0,0,76,6,0, + 0,115,4,0,0,0,6,0,2,0,122,25,95,115,101,116, + 117,112,46,60,108,111,99,97,108,115,62,46,60,115,101,116, + 99,111,109,112,62,90,7,95,116,104,114,101,97,100,90,8, + 95,119,101,97,107,114,101,102,90,6,119,105,110,114,101,103, + 114,192,0,0,0,114,7,0,0,0,122,4,46,112,121,119, + 122,6,95,100,46,112,121,100,84,78,41,18,114,134,0,0, + 0,114,8,0,0,0,114,163,0,0,0,114,31,1,0,0, + 114,125,0,0,0,90,18,95,98,117,105,108,116,105,110,95, + 102,114,111,109,95,110,97,109,101,114,129,0,0,0,218,3, + 97,108,108,114,117,0,0,0,114,35,0,0,0,114,13,0, + 0,0,114,21,1,0,0,114,167,0,0,0,114,82,1,0, + 0,114,101,0,0,0,114,186,0,0,0,114,191,0,0,0, + 114,195,0,0,0,41,12,218,17,95,98,111,111,116,115,116, + 114,97,112,95,109,111,100,117,108,101,90,11,115,101,108,102, + 95,109,111,100,117,108,101,90,12,98,117,105,108,116,105,110, + 95,110,97,109,101,90,14,98,117,105,108,116,105,110,95,109, + 111,100,117,108,101,90,10,111,115,95,100,101,116,97,105,108, + 115,90,10,98,117,105,108,116,105,110,95,111,115,114,30,0, + 0,0,114,34,0,0,0,90,9,111,115,95,109,111,100,117, + 108,101,90,13,116,104,114,101,97,100,95,109,111,100,117,108, + 101,90,14,119,101,97,107,114,101,102,95,109,111,100,117,108, + 101,90,13,119,105,110,114,101,103,95,109,111,100,117,108,101, + 114,3,0,0,0,114,3,0,0,0,114,6,0,0,0,218, + 6,95,115,101,116,117,112,35,6,0,0,115,78,0,0,0, + 0,8,4,1,6,1,6,3,10,1,8,1,10,1,12,2, + 10,1,14,3,22,1,12,2,22,1,8,1,10,1,10,1, + 6,2,2,1,10,1,10,1,14,1,12,2,8,1,12,1, + 12,1,18,1,22,3,10,1,12,3,10,1,12,3,10,1, + 10,1,12,3,14,1,14,1,10,1,10,1,10,1,114,89, + 1,0,0,99,1,0,0,0,0,0,0,0,0,0,0,0, + 2,0,0,0,4,0,0,0,67,0,0,0,115,50,0,0, + 0,116,0,124,0,131,1,1,0,116,1,131,0,125,1,116, + 2,106,3,160,4,116,5,106,6,124,1,142,0,103,1,161, + 1,1,0,116,2,106,7,160,8,116,9,161,1,1,0,100, + 1,83,0,41,2,122,41,73,110,115,116,97,108,108,32,116, + 104,101,32,112,97,116,104,45,98,97,115,101,100,32,105,109, + 112,111,114,116,32,99,111,109,112,111,110,101,110,116,115,46, + 78,41,10,114,89,1,0,0,114,184,0,0,0,114,8,0, + 0,0,114,51,1,0,0,114,167,0,0,0,114,61,1,0, + 0,114,76,1,0,0,218,9,109,101,116,97,95,112,97,116, + 104,114,186,0,0,0,114,45,1,0,0,41,2,114,88,1, + 0,0,90,17,115,117,112,112,111,114,116,101,100,95,108,111, + 97,100,101,114,115,114,3,0,0,0,114,3,0,0,0,114, + 6,0,0,0,218,8,95,105,110,115,116,97,108,108,100,6, + 0,0,115,8,0,0,0,0,2,8,1,6,1,20,1,114, + 91,1,0,0,41,1,114,59,0,0,0,41,1,78,41,3, + 78,78,78,41,2,114,72,0,0,0,114,72,0,0,0,41, + 1,84,41,1,78,41,1,78,41,63,114,127,0,0,0,114, + 12,0,0,0,90,37,95,67,65,83,69,95,73,78,83,69, + 78,83,73,84,73,86,69,95,80,76,65,84,70,79,82,77, + 83,95,66,89,84,69,83,95,75,69,89,114,11,0,0,0, + 114,13,0,0,0,114,20,0,0,0,114,26,0,0,0,114, + 28,0,0,0,114,37,0,0,0,114,46,0,0,0,114,48, + 0,0,0,114,52,0,0,0,114,53,0,0,0,114,55,0, + 0,0,114,58,0,0,0,114,68,0,0,0,218,4,116,121, + 112,101,218,8,95,95,99,111,100,101,95,95,114,162,0,0, + 0,114,18,0,0,0,114,148,0,0,0,114,17,0,0,0, + 114,23,0,0,0,114,236,0,0,0,114,91,0,0,0,114, + 87,0,0,0,114,101,0,0,0,114,88,0,0,0,90,23, + 68,69,66,85,71,95,66,89,84,69,67,79,68,69,95,83, + 85,70,70,73,88,69,83,90,27,79,80,84,73,77,73,90, + 69,68,95,66,89,84,69,67,79,68,69,95,83,85,70,70, + 73,88,69,83,114,97,0,0,0,114,102,0,0,0,114,108, + 0,0,0,114,112,0,0,0,114,114,0,0,0,114,136,0, + 0,0,114,143,0,0,0,114,152,0,0,0,114,156,0,0, + 0,114,158,0,0,0,114,165,0,0,0,114,170,0,0,0, + 114,171,0,0,0,114,176,0,0,0,218,6,111,98,106,101, + 99,116,114,185,0,0,0,114,190,0,0,0,114,191,0,0, + 0,114,208,0,0,0,114,221,0,0,0,114,239,0,0,0, + 114,9,1,0,0,114,15,1,0,0,114,21,1,0,0,114, + 252,0,0,0,114,22,1,0,0,114,43,1,0,0,114,45, + 1,0,0,114,61,1,0,0,114,81,1,0,0,114,184,0, + 0,0,114,89,1,0,0,114,91,1,0,0,114,3,0,0, + 0,114,3,0,0,0,114,3,0,0,0,114,6,0,0,0, + 218,8,60,109,111,100,117,108,101,62,1,0,0,0,115,126, + 0,0,0,4,22,4,1,4,1,2,1,2,255,4,4,8, + 17,8,5,8,5,8,6,8,6,8,12,8,10,8,9,8, + 5,8,7,8,9,10,22,10,127,0,16,16,1,12,2,4, + 1,4,2,6,2,6,2,8,2,16,71,8,40,8,19,8, + 12,8,12,8,28,8,17,8,33,8,28,8,24,10,13,10, + 10,10,11,8,14,6,3,4,1,2,255,12,68,14,64,14, + 29,16,127,0,17,14,72,18,45,18,26,4,3,18,53,14, + 63,14,42,14,127,0,20,14,127,0,22,10,23,8,11,8, + 65, }; diff --git a/Python/importlib_zipimport.h b/Python/importlib_zipimport.h index 2d10c8c9cf9..21633acb937 100644 --- a/Python/importlib_zipimport.h +++ b/Python/importlib_zipimport.h @@ -127,12 +127,12 @@ const unsigned char _Py_M__zipimport[] = { 0,116,8,160,12,124,1,161,1,92,2,125,5,125,6,124, 5,124,1,107,2,114,132,116,4,100,4,124,1,100,3,141, 2,130,1,124,5,125,1,124,3,160,13,124,6,161,1,1, - 0,89,0,113,64,88,0,124,4,106,14,100,5,64,0,100, + 0,89,0,113,64,48,0,124,4,106,14,100,5,64,0,100, 6,107,3,114,182,116,4,100,4,124,1,100,3,141,2,130, 1,113,182,113,64,122,12,116,15,124,1,25,0,125,7,87, 0,110,36,4,0,116,16,107,10,114,230,1,0,1,0,1, 0,116,17,124,1,131,1,125,7,124,7,116,15,124,1,60, - 0,89,0,110,2,88,0,124,7,124,0,95,18,124,1,124, + 0,89,0,110,2,48,0,124,7,124,0,95,18,124,1,124, 0,95,19,116,8,106,20,124,3,100,0,100,0,100,7,133, 3,25,0,142,0,124,0,95,21,124,0,106,21,144,1,114, 32,124,0,4,0,106,21,116,7,55,0,2,0,95,21,100, @@ -277,7 +277,7 @@ const unsigned char _Py_M__zipimport[] = { 2,23,0,131,1,100,1,133,2,25,0,125,2,122,14,124, 0,106,6,124,2,25,0,125,3,87,0,110,32,4,0,116, 7,107,10,114,104,1,0,1,0,1,0,116,8,100,2,100, - 3,124,2,131,3,130,1,89,0,110,2,88,0,116,9,124, + 3,124,2,131,3,130,1,89,0,110,2,48,0,116,9,124, 0,106,4,124,3,131,2,83,0,41,4,122,154,103,101,116, 95,100,97,116,97,40,112,97,116,104,110,97,109,101,41,32, 45,62,32,115,116,114,105,110,103,32,119,105,116,104,32,102, @@ -323,7 +323,7 @@ const unsigned char _Py_M__zipimport[] = { 3,100,4,161,2,125,4,110,10,124,3,155,0,100,5,157, 2,125,4,122,14,124,0,106,5,124,4,25,0,125,5,87, 0,110,22,4,0,116,6,107,10,114,110,1,0,1,0,1, - 0,89,0,100,1,83,0,88,0,116,7,124,0,106,8,124, + 0,89,0,100,1,83,0,48,0,116,7,124,0,106,8,124, 5,131,2,160,9,161,0,83,0,41,6,122,253,103,101,116, 95,115,111,117,114,99,101,40,102,117,108,108,110,97,109,101, 41,32,45,62,32,115,111,117,114,99,101,32,115,116,114,105, @@ -389,10 +389,10 @@ const unsigned char _Py_M__zipimport[] = { 124,5,95,13,116,8,160,14,124,5,106,15,124,1,124,4, 161,3,1,0,116,16,124,2,124,5,106,15,131,2,1,0, 87,0,110,22,1,0,1,0,1,0,116,1,106,2,124,1, - 61,0,130,0,89,0,110,2,88,0,122,14,116,1,106,2, + 61,0,130,0,89,0,110,2,48,0,122,14,116,1,106,2, 124,1,25,0,125,5,87,0,110,36,4,0,116,17,107,10, 114,228,1,0,1,0,1,0,116,18,100,3,124,1,155,2, - 100,4,157,3,131,1,130,1,89,0,110,2,88,0,116,19, + 100,4,157,3,131,1,130,1,89,0,110,2,48,0,116,19, 160,20,100,5,124,1,124,4,161,3,1,0,124,5,83,0, 41,6,122,245,108,111,97,100,95,109,111,100,117,108,101,40, 102,117,108,108,110,97,109,101,41,32,45,62,32,109,111,100, @@ -440,7 +440,7 @@ const unsigned char _Py_M__zipimport[] = { 0,8,0,0,0,67,0,0,0,115,88,0,0,0,122,20, 124,0,160,0,124,1,161,1,115,18,87,0,100,1,83,0, 87,0,110,22,4,0,116,1,107,10,114,42,1,0,1,0, - 1,0,89,0,100,1,83,0,88,0,116,2,106,3,115,78, + 1,0,89,0,100,1,83,0,48,0,116,2,106,3,115,78, 100,2,100,3,108,4,109,5,125,2,1,0,124,2,160,6, 116,2,161,1,1,0,100,4,116,2,95,3,116,2,124,0, 124,1,131,2,83,0,41,5,122,204,82,101,116,117,114,110, @@ -522,28 +522,28 @@ const unsigned char _Py_M__zipimport[] = { 0,0,0,114,35,0,0,0,65,1,0,0,115,12,0,0, 0,0,1,10,1,14,1,8,1,10,1,10,1,114,35,0, 0,0,99,1,0,0,0,0,0,0,0,0,0,0,0,26, - 0,0,0,9,0,0,0,67,0,0,0,115,252,4,0,0, + 0,0,0,9,0,0,0,67,0,0,0,115,18,5,0,0, 122,14,116,0,160,1,124,0,161,1,125,1,87,0,110,38, 4,0,116,2,107,10,114,52,1,0,1,0,1,0,116,3, 100,1,124,0,155,2,157,2,124,0,100,2,141,2,130,1, - 89,0,110,2,88,0,124,1,144,4,143,168,1,0,122,36, + 89,0,110,2,48,0,124,1,144,4,143,178,1,0,122,36, 124,1,160,4,116,5,11,0,100,3,161,2,1,0,124,1, 160,6,161,0,125,2,124,1,160,7,116,5,161,1,125,3, 87,0,110,38,4,0,116,2,107,10,114,136,1,0,1,0, 1,0,116,3,100,4,124,0,155,2,157,2,124,0,100,2, - 141,2,130,1,89,0,110,2,88,0,116,8,124,3,131,1, + 141,2,130,1,89,0,110,2,48,0,116,8,124,3,131,1, 116,5,107,3,114,168,116,3,100,4,124,0,155,2,157,2, 124,0,100,2,141,2,130,1,124,3,100,0,100,5,133,2, 25,0,116,9,107,3,144,1,114,178,122,24,124,1,160,4, 100,6,100,3,161,2,1,0,124,1,160,6,161,0,125,4, 87,0,110,38,4,0,116,2,107,10,114,248,1,0,1,0, 1,0,116,3,100,4,124,0,155,2,157,2,124,0,100,2, - 141,2,130,1,89,0,110,2,88,0,116,10,124,4,116,11, + 141,2,130,1,89,0,110,2,48,0,116,10,124,4,116,11, 24,0,116,5,24,0,100,6,131,2,125,5,122,22,124,1, 160,4,124,5,161,1,1,0,124,1,160,7,161,0,125,6, 87,0,110,40,4,0,116,2,107,10,144,1,114,74,1,0, 1,0,1,0,116,3,100,4,124,0,155,2,157,2,124,0, - 100,2,141,2,130,1,89,0,110,2,88,0,124,6,160,12, + 100,2,141,2,130,1,89,0,110,2,48,0,124,6,160,12, 116,9,161,1,125,7,124,7,100,6,107,0,144,1,114,114, 116,3,100,7,124,0,155,2,157,2,124,0,100,2,141,2, 130,1,124,6,124,7,124,7,116,5,23,0,133,2,25,0, @@ -562,7 +562,7 @@ const unsigned char _Py_M__zipimport[] = { 124,1,160,4,124,2,161,1,1,0,87,0,110,40,4,0, 116,2,107,10,144,2,114,116,1,0,1,0,1,0,116,3, 100,4,124,0,155,2,157,2,124,0,100,2,141,2,130,1, - 89,0,110,2,88,0,124,1,160,7,100,15,161,1,125,3, + 89,0,110,2,48,0,124,1,160,7,100,15,161,1,125,3, 116,8,124,3,131,1,100,5,107,0,144,2,114,150,116,14, 100,16,131,1,130,1,124,3,100,0,100,5,133,2,25,0, 100,17,107,3,144,2,114,172,144,4,113,224,116,8,124,3, @@ -584,7 +584,7 @@ const unsigned char _Py_M__zipimport[] = { 125,22,122,14,124,1,160,7,124,19,161,1,125,23,87,0, 110,40,4,0,116,2,107,10,144,3,114,216,1,0,1,0, 1,0,116,3,100,4,124,0,155,2,157,2,124,0,100,2, - 141,2,130,1,89,0,110,2,88,0,116,8,124,23,131,1, + 141,2,130,1,89,0,110,2,48,0,116,8,124,23,131,1, 124,19,107,3,144,3,114,250,116,3,100,4,124,0,155,2, 157,2,124,0,100,2,141,2,130,1,122,50,116,8,124,1, 160,7,124,8,124,19,24,0,161,1,131,1,124,8,124,19, @@ -592,490 +592,493 @@ const unsigned char _Py_M__zipimport[] = { 157,2,124,0,100,2,141,2,130,1,87,0,110,40,4,0, 116,2,107,10,144,4,114,84,1,0,1,0,1,0,116,3, 100,4,124,0,155,2,157,2,124,0,100,2,141,2,130,1, - 89,0,110,2,88,0,124,13,100,28,64,0,144,4,114,106, + 89,0,110,2,48,0,124,13,100,28,64,0,144,4,114,106, 124,23,160,16,161,0,125,23,110,54,122,14,124,23,160,16, 100,29,161,1,125,23,87,0,110,38,4,0,116,17,107,10, 144,4,114,158,1,0,1,0,1,0,124,23,160,16,100,30, - 161,1,160,18,116,19,161,1,125,23,89,0,110,2,88,0, + 161,1,160,18,116,19,161,1,125,23,89,0,110,2,48,0, 124,23,160,20,100,31,116,21,161,2,125,23,116,22,160,23, 124,0,124,23,161,2,125,24,124,24,124,14,124,18,124,4, 124,22,124,15,124,16,124,17,102,8,125,25,124,25,124,11, 124,23,60,0,124,12,100,32,55,0,125,12,144,2,113,118, - 87,0,53,0,81,0,82,0,88,0,116,24,160,25,100,33, - 124,12,124,0,161,3,1,0,124,11,83,0,41,34,78,122, - 21,99,97,110,39,116,32,111,112,101,110,32,90,105,112,32, - 102,105,108,101,58,32,114,12,0,0,0,114,86,0,0,0, - 250,21,99,97,110,39,116,32,114,101,97,100,32,90,105,112, - 32,102,105,108,101,58,32,233,4,0,0,0,114,0,0,0, - 0,122,16,110,111,116,32,97,32,90,105,112,32,102,105,108, - 101,58,32,122,18,99,111,114,114,117,112,116,32,90,105,112, - 32,102,105,108,101,58,32,233,12,0,0,0,233,16,0,0, - 0,233,20,0,0,0,122,28,98,97,100,32,99,101,110,116, - 114,97,108,32,100,105,114,101,99,116,111,114,121,32,115,105, - 122,101,58,32,122,30,98,97,100,32,99,101,110,116,114,97, - 108,32,100,105,114,101,99,116,111,114,121,32,111,102,102,115, - 101,116,58,32,122,38,98,97,100,32,99,101,110,116,114,97, - 108,32,100,105,114,101,99,116,111,114,121,32,115,105,122,101, - 32,111,114,32,111,102,102,115,101,116,58,32,233,46,0,0, - 0,250,27,69,79,70,32,114,101,97,100,32,119,104,101,114, - 101,32,110,111,116,32,101,120,112,101,99,116,101,100,115,4, - 0,0,0,80,75,1,2,233,8,0,0,0,233,10,0,0, - 0,233,14,0,0,0,233,24,0,0,0,233,28,0,0,0, - 233,30,0,0,0,233,32,0,0,0,233,34,0,0,0,233, - 42,0,0,0,122,25,98,97,100,32,108,111,99,97,108,32, - 104,101,97,100,101,114,32,111,102,102,115,101,116,58,32,105, - 0,8,0,0,218,5,97,115,99,105,105,90,6,108,97,116, - 105,110,49,250,1,47,114,5,0,0,0,122,33,122,105,112, - 105,109,112,111,114,116,58,32,102,111,117,110,100,32,123,125, - 32,110,97,109,101,115,32,105,110,32,123,33,114,125,41,26, - 218,3,95,105,111,218,9,111,112,101,110,95,99,111,100,101, - 114,22,0,0,0,114,3,0,0,0,218,4,115,101,101,107, - 218,20,69,78,68,95,67,69,78,84,82,65,76,95,68,73, - 82,95,83,73,90,69,90,4,116,101,108,108,218,4,114,101, - 97,100,114,51,0,0,0,218,18,83,84,82,73,78,71,95, - 69,78,68,95,65,82,67,72,73,86,69,218,3,109,97,120, - 218,15,77,65,88,95,67,79,77,77,69,78,84,95,76,69, - 78,218,5,114,102,105,110,100,114,2,0,0,0,218,8,69, - 79,70,69,114,114,111,114,114,1,0,0,0,114,62,0,0, - 0,218,18,85,110,105,99,111,100,101,68,101,99,111,100,101, - 69,114,114,111,114,218,9,116,114,97,110,115,108,97,116,101, - 218,11,99,112,52,51,55,95,116,97,98,108,101,114,19,0, - 0,0,114,20,0,0,0,114,21,0,0,0,114,30,0,0, - 0,114,76,0,0,0,114,77,0,0,0,41,26,114,29,0, - 0,0,218,2,102,112,90,15,104,101,97,100,101,114,95,112, - 111,115,105,116,105,111,110,218,6,98,117,102,102,101,114,218, - 9,102,105,108,101,95,115,105,122,101,90,17,109,97,120,95, - 99,111,109,109,101,110,116,95,115,116,97,114,116,218,4,100, - 97,116,97,90,3,112,111,115,218,11,104,101,97,100,101,114, - 95,115,105,122,101,90,13,104,101,97,100,101,114,95,111,102, - 102,115,101,116,90,10,97,114,99,95,111,102,102,115,101,116, - 114,33,0,0,0,218,5,99,111,117,110,116,218,5,102,108, - 97,103,115,218,8,99,111,109,112,114,101,115,115,218,4,116, - 105,109,101,218,4,100,97,116,101,218,3,99,114,99,218,9, - 100,97,116,97,95,115,105,122,101,218,9,110,97,109,101,95, - 115,105,122,101,218,10,101,120,116,114,97,95,115,105,122,101, - 90,12,99,111,109,109,101,110,116,95,115,105,122,101,218,11, - 102,105,108,101,95,111,102,102,115,101,116,114,59,0,0,0, - 114,13,0,0,0,218,1,116,114,9,0,0,0,114,9,0, - 0,0,114,10,0,0,0,114,27,0,0,0,96,1,0,0, - 115,212,0,0,0,0,1,2,1,14,1,14,1,24,2,8, - 1,2,1,14,1,8,1,14,1,14,1,24,1,12,1,18, - 1,18,3,2,1,12,1,12,1,14,1,10,1,2,255,12, - 2,8,1,2,255,2,1,2,255,4,2,2,1,10,1,12, - 1,16,1,10,1,2,255,12,2,10,1,10,1,10,1,2, - 255,6,2,16,1,14,1,10,1,2,255,6,2,16,2,16, - 1,16,1,10,1,18,1,10,1,18,1,8,1,8,1,10, - 1,18,2,4,2,4,1,2,1,14,1,16,1,24,2,10, - 1,14,1,8,2,18,1,4,1,14,1,8,1,16,1,16, - 1,16,1,16,1,16,1,16,1,16,1,16,1,16,1,16, - 1,16,1,12,1,10,1,18,1,8,2,2,1,14,1,16, - 1,24,1,14,1,18,4,2,1,28,1,22,1,16,1,24, - 2,10,2,10,3,2,1,14,1,16,1,22,2,12,1,12, - 1,20,1,8,1,22,1,14,1,114,27,0,0,0,117,190, - 1,0,0,0,1,2,3,4,5,6,7,8,9,10,11,12, - 13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28, - 29,30,31,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,87,88,89,90,91,92, - 93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108, - 109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124, - 125,126,127,195,135,195,188,195,169,195,162,195,164,195,160,195, - 165,195,167,195,170,195,171,195,168,195,175,195,174,195,172,195, - 132,195,133,195,137,195,166,195,134,195,180,195,182,195,178,195, - 187,195,185,195,191,195,150,195,156,194,162,194,163,194,165,226, - 130,167,198,146,195,161,195,173,195,179,195,186,195,177,195,145, - 194,170,194,186,194,191,226,140,144,194,172,194,189,194,188,194, - 161,194,171,194,187,226,150,145,226,150,146,226,150,147,226,148, - 130,226,148,164,226,149,161,226,149,162,226,149,150,226,149,149, - 226,149,163,226,149,145,226,149,151,226,149,157,226,149,156,226, - 149,155,226,148,144,226,148,148,226,148,180,226,148,172,226,148, - 156,226,148,128,226,148,188,226,149,158,226,149,159,226,149,154, - 226,149,148,226,149,169,226,149,166,226,149,160,226,149,144,226, - 149,172,226,149,167,226,149,168,226,149,164,226,149,165,226,149, - 153,226,149,152,226,149,146,226,149,147,226,149,171,226,149,170, - 226,148,152,226,148,140,226,150,136,226,150,132,226,150,140,226, - 150,144,226,150,128,206,177,195,159,206,147,207,128,206,163,207, - 131,194,181,207,132,206,166,206,152,206,169,206,180,226,136,158, - 207,134,206,181,226,136,169,226,137,161,194,177,226,137,165,226, - 137,164,226,140,160,226,140,161,195,183,226,137,136,194,176,226, - 136,153,194,183,226,136,154,226,129,191,194,178,226,150,160,194, - 160,99,0,0,0,0,0,0,0,0,0,0,0,0,1,0, - 0,0,8,0,0,0,67,0,0,0,115,108,0,0,0,116, - 0,114,22,116,1,160,2,100,1,161,1,1,0,116,3,100, - 2,131,1,130,1,100,3,97,0,122,60,122,16,100,5,100, - 6,108,4,109,5,125,0,1,0,87,0,110,38,4,0,116, - 6,107,10,114,82,1,0,1,0,1,0,116,1,160,2,100, - 1,161,1,1,0,116,3,100,2,131,1,130,1,89,0,110, - 2,88,0,87,0,53,0,100,4,97,0,88,0,116,1,160, - 2,100,7,161,1,1,0,124,0,83,0,41,8,78,122,27, - 122,105,112,105,109,112,111,114,116,58,32,122,108,105,98,32, - 85,78,65,86,65,73,76,65,66,76,69,250,41,99,97,110, - 39,116,32,100,101,99,111,109,112,114,101,115,115,32,100,97, - 116,97,59,32,122,108,105,98,32,110,111,116,32,97,118,97, - 105,108,97,98,108,101,84,70,114,0,0,0,0,169,1,218, - 10,100,101,99,111,109,112,114,101,115,115,122,25,122,105,112, - 105,109,112,111,114,116,58,32,122,108,105,98,32,97,118,97, - 105,108,97,98,108,101,41,7,218,15,95,105,109,112,111,114, - 116,105,110,103,95,122,108,105,98,114,76,0,0,0,114,77, - 0,0,0,114,3,0,0,0,90,4,122,108,105,98,114,141, - 0,0,0,218,9,69,120,99,101,112,116,105,111,110,114,140, - 0,0,0,114,9,0,0,0,114,9,0,0,0,114,10,0, - 0,0,218,20,95,103,101,116,95,100,101,99,111,109,112,114, - 101,115,115,95,102,117,110,99,254,1,0,0,115,24,0,0, - 0,0,2,4,3,10,1,8,2,4,1,4,1,16,1,14, - 1,10,1,18,2,6,2,10,1,114,144,0,0,0,99,2, - 0,0,0,0,0,0,0,0,0,0,0,17,0,0,0,9, - 0,0,0,67,0,0,0,115,128,1,0,0,124,1,92,8, - 125,2,125,3,125,4,125,5,125,6,125,7,125,8,125,9, - 124,4,100,1,107,0,114,36,116,0,100,2,131,1,130,1, - 116,1,160,2,124,0,161,1,144,1,143,8,125,10,122,14, - 124,10,160,3,124,6,161,1,1,0,87,0,110,38,4,0, - 116,4,107,10,114,102,1,0,1,0,1,0,116,0,100,3, - 124,0,155,2,157,2,124,0,100,4,141,2,130,1,89,0, - 110,2,88,0,124,10,160,5,100,5,161,1,125,11,116,6, - 124,11,131,1,100,5,107,3,114,134,116,7,100,6,131,1, - 130,1,124,11,100,0,100,7,133,2,25,0,100,8,107,3, - 114,168,116,0,100,9,124,0,155,2,157,2,124,0,100,4, - 141,2,130,1,116,8,124,11,100,10,100,11,133,2,25,0, - 131,1,125,12,116,8,124,11,100,11,100,5,133,2,25,0, - 131,1,125,13,100,5,124,12,23,0,124,13,23,0,125,14, - 124,6,124,14,55,0,125,6,122,14,124,10,160,3,124,6, - 161,1,1,0,87,0,110,40,4,0,116,4,107,10,144,1, - 114,18,1,0,1,0,1,0,116,0,100,3,124,0,155,2, - 157,2,124,0,100,4,141,2,130,1,89,0,110,2,88,0, - 124,10,160,5,124,4,161,1,125,15,116,6,124,15,131,1, - 124,4,107,3,144,1,114,52,116,4,100,12,131,1,130,1, - 87,0,53,0,81,0,82,0,88,0,124,3,100,1,107,2, - 144,1,114,76,124,15,83,0,122,10,116,9,131,0,125,16, - 87,0,110,30,4,0,116,10,107,10,144,1,114,116,1,0, - 1,0,1,0,116,0,100,13,131,1,130,1,89,0,110,2, - 88,0,124,16,124,15,100,14,131,2,83,0,41,15,78,114, - 0,0,0,0,122,18,110,101,103,97,116,105,118,101,32,100, - 97,116,97,32,115,105,122,101,114,92,0,0,0,114,12,0, - 0,0,114,104,0,0,0,114,98,0,0,0,114,93,0,0, - 0,115,4,0,0,0,80,75,3,4,122,23,98,97,100,32, - 108,111,99,97,108,32,102,105,108,101,32,104,101,97,100,101, - 114,58,32,233,26,0,0,0,114,103,0,0,0,122,26,122, - 105,112,105,109,112,111,114,116,58,32,99,97,110,39,116,32, - 114,101,97,100,32,100,97,116,97,114,139,0,0,0,105,241, - 255,255,255,41,11,114,3,0,0,0,114,110,0,0,0,114, - 111,0,0,0,114,112,0,0,0,114,22,0,0,0,114,114, - 0,0,0,114,51,0,0,0,114,119,0,0,0,114,1,0, - 0,0,114,144,0,0,0,114,143,0,0,0,41,17,114,29, - 0,0,0,114,54,0,0,0,90,8,100,97,116,97,112,97, - 116,104,114,130,0,0,0,114,134,0,0,0,114,125,0,0, - 0,114,137,0,0,0,114,131,0,0,0,114,132,0,0,0, - 114,133,0,0,0,114,123,0,0,0,114,124,0,0,0,114, - 135,0,0,0,114,136,0,0,0,114,127,0,0,0,90,8, - 114,97,119,95,100,97,116,97,114,141,0,0,0,114,9,0, - 0,0,114,9,0,0,0,114,10,0,0,0,114,52,0,0, - 0,19,2,0,0,115,62,0,0,0,0,1,20,1,8,1, - 8,2,14,2,2,1,14,1,14,1,24,1,10,1,12,1, - 8,2,16,2,18,2,16,1,16,1,12,1,8,1,2,1, - 14,1,16,1,24,1,10,1,14,1,18,2,10,2,4,3, - 2,1,10,1,16,1,14,1,114,52,0,0,0,99,2,0, - 0,0,0,0,0,0,0,0,0,0,2,0,0,0,3,0, - 0,0,67,0,0,0,115,16,0,0,0,116,0,124,0,124, - 1,24,0,131,1,100,1,107,1,83,0,41,2,78,114,5, - 0,0,0,41,1,218,3,97,98,115,41,2,90,2,116,49, - 90,2,116,50,114,9,0,0,0,114,9,0,0,0,114,10, - 0,0,0,218,9,95,101,113,95,109,116,105,109,101,65,2, - 0,0,115,2,0,0,0,0,2,114,147,0,0,0,99,5, - 0,0,0,0,0,0,0,0,0,0,0,14,0,0,0,8, - 0,0,0,67,0,0,0,115,60,1,0,0,124,3,124,2, - 100,1,156,2,125,5,122,18,116,0,160,1,124,4,124,3, - 124,5,161,3,125,6,87,0,110,22,4,0,116,2,107,10, - 114,50,1,0,1,0,1,0,89,0,100,0,83,0,88,0, - 124,6,100,2,64,0,100,3,107,3,125,7,124,7,114,182, - 124,6,100,4,64,0,100,3,107,3,125,8,116,3,106,4, - 100,5,107,3,114,180,124,8,115,104,116,3,106,4,100,6, - 107,2,114,180,116,5,124,0,124,2,131,2,125,9,124,9, - 100,0,107,9,114,180,116,3,160,6,116,0,106,7,124,9, - 161,2,125,10,122,20,116,8,160,9,124,4,124,10,124,3, - 124,5,161,4,1,0,87,0,110,22,4,0,116,2,107,10, - 114,178,1,0,1,0,1,0,89,0,100,0,83,0,88,0, - 110,84,116,10,124,0,124,2,131,2,92,2,125,11,125,12, - 124,11,144,1,114,10,116,11,116,12,124,4,100,7,100,8, - 133,2,25,0,131,1,124,11,131,2,114,246,116,12,124,4, - 100,8,100,9,133,2,25,0,131,1,124,12,107,3,144,1, - 114,10,116,13,160,14,100,10,124,3,155,2,157,2,161,1, - 1,0,100,0,83,0,116,15,160,16,124,4,100,9,100,0, - 133,2,25,0,161,1,125,13,116,17,124,13,116,18,131,2, - 144,1,115,56,116,19,100,11,124,1,155,2,100,12,157,3, - 131,1,130,1,124,13,83,0,41,13,78,41,2,114,59,0, - 0,0,114,13,0,0,0,114,5,0,0,0,114,0,0,0, - 0,114,86,0,0,0,90,5,110,101,118,101,114,90,6,97, - 108,119,97,121,115,114,99,0,0,0,114,94,0,0,0,114, - 95,0,0,0,122,22,98,121,116,101,99,111,100,101,32,105, - 115,32,115,116,97,108,101,32,102,111,114,32,122,16,99,111, - 109,112,105,108,101,100,32,109,111,100,117,108,101,32,122,21, - 32,105,115,32,110,111,116,32,97,32,99,111,100,101,32,111, - 98,106,101,99,116,41,20,114,21,0,0,0,90,13,95,99, - 108,97,115,115,105,102,121,95,112,121,99,114,75,0,0,0, - 218,4,95,105,109,112,90,21,99,104,101,99,107,95,104,97, - 115,104,95,98,97,115,101,100,95,112,121,99,115,218,15,95, - 103,101,116,95,112,121,99,95,115,111,117,114,99,101,218,11, - 115,111,117,114,99,101,95,104,97,115,104,90,17,95,82,65, - 87,95,77,65,71,73,67,95,78,85,77,66,69,82,90,18, - 95,98,111,111,115,116,114,97,112,95,101,120,116,101,114,110, - 97,108,90,18,95,118,97,108,105,100,97,116,101,95,104,97, - 115,104,95,112,121,99,218,29,95,103,101,116,95,109,116,105, - 109,101,95,97,110,100,95,115,105,122,101,95,111,102,95,115, - 111,117,114,99,101,114,147,0,0,0,114,2,0,0,0,114, - 76,0,0,0,114,77,0,0,0,218,7,109,97,114,115,104, - 97,108,90,5,108,111,97,100,115,114,15,0,0,0,218,10, - 95,99,111,100,101,95,116,121,112,101,218,9,84,121,112,101, - 69,114,114,111,114,41,14,114,32,0,0,0,114,53,0,0, - 0,114,63,0,0,0,114,38,0,0,0,114,126,0,0,0, - 90,11,101,120,99,95,100,101,116,97,105,108,115,114,129,0, - 0,0,90,10,104,97,115,104,95,98,97,115,101,100,90,12, - 99,104,101,99,107,95,115,111,117,114,99,101,90,12,115,111, - 117,114,99,101,95,98,121,116,101,115,114,150,0,0,0,90, - 12,115,111,117,114,99,101,95,109,116,105,109,101,90,11,115, - 111,117,114,99,101,95,115,105,122,101,114,46,0,0,0,114, - 9,0,0,0,114,9,0,0,0,114,10,0,0,0,218,15, - 95,117,110,109,97,114,115,104,97,108,95,99,111,100,101,75, - 2,0,0,115,88,0,0,0,0,2,2,1,2,254,6,5, - 2,1,18,1,14,1,8,2,12,1,4,1,12,1,10,1, - 2,255,2,1,8,255,2,2,10,1,8,1,4,1,4,1, - 2,254,4,5,2,1,4,1,2,0,2,0,2,0,2,255, - 8,2,14,1,10,3,8,255,6,3,6,3,22,1,18,255, - 4,2,4,1,8,255,4,2,4,2,18,1,12,1,16,1, - 114,155,0,0,0,99,1,0,0,0,0,0,0,0,0,0, - 0,0,1,0,0,0,4,0,0,0,67,0,0,0,115,28, - 0,0,0,124,0,160,0,100,1,100,2,161,2,125,0,124, - 0,160,0,100,3,100,2,161,2,125,0,124,0,83,0,41, - 4,78,115,2,0,0,0,13,10,243,1,0,0,0,10,243, - 1,0,0,0,13,41,1,114,19,0,0,0,41,1,218,6, - 115,111,117,114,99,101,114,9,0,0,0,114,9,0,0,0, - 114,10,0,0,0,218,23,95,110,111,114,109,97,108,105,122, - 101,95,108,105,110,101,95,101,110,100,105,110,103,115,126,2, - 0,0,115,6,0,0,0,0,1,12,1,12,1,114,159,0, - 0,0,99,2,0,0,0,0,0,0,0,0,0,0,0,2, - 0,0,0,6,0,0,0,67,0,0,0,115,24,0,0,0, - 116,0,124,1,131,1,125,1,116,1,124,1,124,0,100,1, - 100,2,100,3,141,4,83,0,41,4,78,114,74,0,0,0, - 84,41,1,90,12,100,111,110,116,95,105,110,104,101,114,105, - 116,41,2,114,159,0,0,0,218,7,99,111,109,112,105,108, - 101,41,2,114,53,0,0,0,114,158,0,0,0,114,9,0, - 0,0,114,9,0,0,0,114,10,0,0,0,218,15,95,99, - 111,109,112,105,108,101,95,115,111,117,114,99,101,133,2,0, - 0,115,4,0,0,0,0,1,8,1,114,161,0,0,0,99, + 87,0,100,0,4,0,4,0,131,3,1,0,110,18,49,0, + 144,4,115,246,48,0,1,0,1,0,1,0,89,0,1,0, + 116,24,160,25,100,33,124,12,124,0,161,3,1,0,124,11, + 83,0,41,34,78,122,21,99,97,110,39,116,32,111,112,101, + 110,32,90,105,112,32,102,105,108,101,58,32,114,12,0,0, + 0,114,86,0,0,0,250,21,99,97,110,39,116,32,114,101, + 97,100,32,90,105,112,32,102,105,108,101,58,32,233,4,0, + 0,0,114,0,0,0,0,122,16,110,111,116,32,97,32,90, + 105,112,32,102,105,108,101,58,32,122,18,99,111,114,114,117, + 112,116,32,90,105,112,32,102,105,108,101,58,32,233,12,0, + 0,0,233,16,0,0,0,233,20,0,0,0,122,28,98,97, + 100,32,99,101,110,116,114,97,108,32,100,105,114,101,99,116, + 111,114,121,32,115,105,122,101,58,32,122,30,98,97,100,32, + 99,101,110,116,114,97,108,32,100,105,114,101,99,116,111,114, + 121,32,111,102,102,115,101,116,58,32,122,38,98,97,100,32, + 99,101,110,116,114,97,108,32,100,105,114,101,99,116,111,114, + 121,32,115,105,122,101,32,111,114,32,111,102,102,115,101,116, + 58,32,233,46,0,0,0,250,27,69,79,70,32,114,101,97, + 100,32,119,104,101,114,101,32,110,111,116,32,101,120,112,101, + 99,116,101,100,115,4,0,0,0,80,75,1,2,233,8,0, + 0,0,233,10,0,0,0,233,14,0,0,0,233,24,0,0, + 0,233,28,0,0,0,233,30,0,0,0,233,32,0,0,0, + 233,34,0,0,0,233,42,0,0,0,122,25,98,97,100,32, + 108,111,99,97,108,32,104,101,97,100,101,114,32,111,102,102, + 115,101,116,58,32,105,0,8,0,0,218,5,97,115,99,105, + 105,90,6,108,97,116,105,110,49,250,1,47,114,5,0,0, + 0,122,33,122,105,112,105,109,112,111,114,116,58,32,102,111, + 117,110,100,32,123,125,32,110,97,109,101,115,32,105,110,32, + 123,33,114,125,41,26,218,3,95,105,111,218,9,111,112,101, + 110,95,99,111,100,101,114,22,0,0,0,114,3,0,0,0, + 218,4,115,101,101,107,218,20,69,78,68,95,67,69,78,84, + 82,65,76,95,68,73,82,95,83,73,90,69,90,4,116,101, + 108,108,218,4,114,101,97,100,114,51,0,0,0,218,18,83, + 84,82,73,78,71,95,69,78,68,95,65,82,67,72,73,86, + 69,218,3,109,97,120,218,15,77,65,88,95,67,79,77,77, + 69,78,84,95,76,69,78,218,5,114,102,105,110,100,114,2, + 0,0,0,218,8,69,79,70,69,114,114,111,114,114,1,0, + 0,0,114,62,0,0,0,218,18,85,110,105,99,111,100,101, + 68,101,99,111,100,101,69,114,114,111,114,218,9,116,114,97, + 110,115,108,97,116,101,218,11,99,112,52,51,55,95,116,97, + 98,108,101,114,19,0,0,0,114,20,0,0,0,114,21,0, + 0,0,114,30,0,0,0,114,76,0,0,0,114,77,0,0, + 0,41,26,114,29,0,0,0,218,2,102,112,90,15,104,101, + 97,100,101,114,95,112,111,115,105,116,105,111,110,218,6,98, + 117,102,102,101,114,218,9,102,105,108,101,95,115,105,122,101, + 90,17,109,97,120,95,99,111,109,109,101,110,116,95,115,116, + 97,114,116,218,4,100,97,116,97,90,3,112,111,115,218,11, + 104,101,97,100,101,114,95,115,105,122,101,90,13,104,101,97, + 100,101,114,95,111,102,102,115,101,116,90,10,97,114,99,95, + 111,102,102,115,101,116,114,33,0,0,0,218,5,99,111,117, + 110,116,218,5,102,108,97,103,115,218,8,99,111,109,112,114, + 101,115,115,218,4,116,105,109,101,218,4,100,97,116,101,218, + 3,99,114,99,218,9,100,97,116,97,95,115,105,122,101,218, + 9,110,97,109,101,95,115,105,122,101,218,10,101,120,116,114, + 97,95,115,105,122,101,90,12,99,111,109,109,101,110,116,95, + 115,105,122,101,218,11,102,105,108,101,95,111,102,102,115,101, + 116,114,59,0,0,0,114,13,0,0,0,218,1,116,114,9, + 0,0,0,114,9,0,0,0,114,10,0,0,0,114,27,0, + 0,0,96,1,0,0,115,212,0,0,0,0,1,2,1,14, + 1,14,1,24,2,8,1,2,1,14,1,8,1,14,1,14, + 1,24,1,12,1,18,1,18,3,2,1,12,1,12,1,14, + 1,10,1,2,255,12,2,8,1,2,255,2,1,2,255,4, + 2,2,1,10,1,12,1,16,1,10,1,2,255,12,2,10, + 1,10,1,10,1,2,255,6,2,16,1,14,1,10,1,2, + 255,6,2,16,2,16,1,16,1,10,1,18,1,10,1,18, + 1,8,1,8,1,10,1,18,2,4,2,4,1,2,1,14, + 1,16,1,24,2,10,1,14,1,8,2,18,1,4,1,14, + 1,8,1,16,1,16,1,16,1,16,1,16,1,16,1,16, + 1,16,1,16,1,16,1,16,1,12,1,10,1,18,1,8, + 2,2,1,14,1,16,1,24,1,14,1,18,4,2,1,28, + 1,22,1,16,1,24,2,10,2,10,3,2,1,14,1,16, + 1,22,2,12,1,12,1,20,1,8,1,44,1,14,1,114, + 27,0,0,0,117,190,1,0,0,0,1,2,3,4,5,6, + 7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22, + 23,24,25,26,27,28,29,30,31,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, + 87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102, + 103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118, + 119,120,121,122,123,124,125,126,127,195,135,195,188,195,169,195, + 162,195,164,195,160,195,165,195,167,195,170,195,171,195,168,195, + 175,195,174,195,172,195,132,195,133,195,137,195,166,195,134,195, + 180,195,182,195,178,195,187,195,185,195,191,195,150,195,156,194, + 162,194,163,194,165,226,130,167,198,146,195,161,195,173,195,179, + 195,186,195,177,195,145,194,170,194,186,194,191,226,140,144,194, + 172,194,189,194,188,194,161,194,171,194,187,226,150,145,226,150, + 146,226,150,147,226,148,130,226,148,164,226,149,161,226,149,162, + 226,149,150,226,149,149,226,149,163,226,149,145,226,149,151,226, + 149,157,226,149,156,226,149,155,226,148,144,226,148,148,226,148, + 180,226,148,172,226,148,156,226,148,128,226,148,188,226,149,158, + 226,149,159,226,149,154,226,149,148,226,149,169,226,149,166,226, + 149,160,226,149,144,226,149,172,226,149,167,226,149,168,226,149, + 164,226,149,165,226,149,153,226,149,152,226,149,146,226,149,147, + 226,149,171,226,149,170,226,148,152,226,148,140,226,150,136,226, + 150,132,226,150,140,226,150,144,226,150,128,206,177,195,159,206, + 147,207,128,206,163,207,131,194,181,207,132,206,166,206,152,206, + 169,206,180,226,136,158,207,134,206,181,226,136,169,226,137,161, + 194,177,226,137,165,226,137,164,226,140,160,226,140,161,195,183, + 226,137,136,194,176,226,136,153,194,183,226,136,154,226,129,191, + 194,178,226,150,160,194,160,99,0,0,0,0,0,0,0,0, + 0,0,0,0,1,0,0,0,8,0,0,0,67,0,0,0, + 115,112,0,0,0,116,0,114,22,116,1,160,2,100,1,161, + 1,1,0,116,3,100,2,131,1,130,1,100,3,97,0,122, + 64,122,16,100,4,100,5,108,4,109,5,125,0,1,0,87, + 0,110,38,4,0,116,6,107,10,114,82,1,0,1,0,1, + 0,116,1,160,2,100,1,161,1,1,0,116,3,100,2,131, + 1,130,1,89,0,110,2,48,0,87,0,100,6,97,0,110, + 6,100,6,97,0,48,0,116,1,160,2,100,7,161,1,1, + 0,124,0,83,0,41,8,78,122,27,122,105,112,105,109,112, + 111,114,116,58,32,122,108,105,98,32,85,78,65,86,65,73, + 76,65,66,76,69,250,41,99,97,110,39,116,32,100,101,99, + 111,109,112,114,101,115,115,32,100,97,116,97,59,32,122,108, + 105,98,32,110,111,116,32,97,118,97,105,108,97,98,108,101, + 84,114,0,0,0,0,169,1,218,10,100,101,99,111,109,112, + 114,101,115,115,70,122,25,122,105,112,105,109,112,111,114,116, + 58,32,122,108,105,98,32,97,118,97,105,108,97,98,108,101, + 41,7,218,15,95,105,109,112,111,114,116,105,110,103,95,122, + 108,105,98,114,76,0,0,0,114,77,0,0,0,114,3,0, + 0,0,90,4,122,108,105,98,114,141,0,0,0,218,9,69, + 120,99,101,112,116,105,111,110,114,140,0,0,0,114,9,0, + 0,0,114,9,0,0,0,114,10,0,0,0,218,20,95,103, + 101,116,95,100,101,99,111,109,112,114,101,115,115,95,102,117, + 110,99,254,1,0,0,115,26,0,0,0,0,2,4,3,10, + 1,8,2,4,1,4,1,16,1,14,1,10,1,16,2,6, + 0,6,2,10,1,114,144,0,0,0,99,2,0,0,0,0, + 0,0,0,0,0,0,0,17,0,0,0,9,0,0,0,67, + 0,0,0,115,150,1,0,0,124,1,92,8,125,2,125,3, + 125,4,125,5,125,6,125,7,125,8,125,9,124,4,100,1, + 107,0,114,36,116,0,100,2,131,1,130,1,116,1,160,2, + 124,0,161,1,144,1,143,18,125,10,122,14,124,10,160,3, + 124,6,161,1,1,0,87,0,110,38,4,0,116,4,107,10, + 114,102,1,0,1,0,1,0,116,0,100,3,124,0,155,2, + 157,2,124,0,100,4,141,2,130,1,89,0,110,2,48,0, + 124,10,160,5,100,5,161,1,125,11,116,6,124,11,131,1, + 100,5,107,3,114,134,116,7,100,6,131,1,130,1,124,11, + 100,0,100,7,133,2,25,0,100,8,107,3,114,168,116,0, + 100,9,124,0,155,2,157,2,124,0,100,4,141,2,130,1, + 116,8,124,11,100,10,100,11,133,2,25,0,131,1,125,12, + 116,8,124,11,100,11,100,5,133,2,25,0,131,1,125,13, + 100,5,124,12,23,0,124,13,23,0,125,14,124,6,124,14, + 55,0,125,6,122,14,124,10,160,3,124,6,161,1,1,0, + 87,0,110,40,4,0,116,4,107,10,144,1,114,18,1,0, + 1,0,1,0,116,0,100,3,124,0,155,2,157,2,124,0, + 100,4,141,2,130,1,89,0,110,2,48,0,124,10,160,5, + 124,4,161,1,125,15,116,6,124,15,131,1,124,4,107,3, + 144,1,114,52,116,4,100,12,131,1,130,1,87,0,100,0, + 4,0,4,0,131,3,1,0,110,18,49,0,144,1,115,74, + 48,0,1,0,1,0,1,0,89,0,1,0,124,3,100,1, + 107,2,144,1,114,98,124,15,83,0,122,10,116,9,131,0, + 125,16,87,0,110,30,4,0,116,10,107,10,144,1,114,138, + 1,0,1,0,1,0,116,0,100,13,131,1,130,1,89,0, + 110,2,48,0,124,16,124,15,100,14,131,2,83,0,41,15, + 78,114,0,0,0,0,122,18,110,101,103,97,116,105,118,101, + 32,100,97,116,97,32,115,105,122,101,114,92,0,0,0,114, + 12,0,0,0,114,104,0,0,0,114,98,0,0,0,114,93, + 0,0,0,115,4,0,0,0,80,75,3,4,122,23,98,97, + 100,32,108,111,99,97,108,32,102,105,108,101,32,104,101,97, + 100,101,114,58,32,233,26,0,0,0,114,103,0,0,0,122, + 26,122,105,112,105,109,112,111,114,116,58,32,99,97,110,39, + 116,32,114,101,97,100,32,100,97,116,97,114,139,0,0,0, + 105,241,255,255,255,41,11,114,3,0,0,0,114,110,0,0, + 0,114,111,0,0,0,114,112,0,0,0,114,22,0,0,0, + 114,114,0,0,0,114,51,0,0,0,114,119,0,0,0,114, + 1,0,0,0,114,144,0,0,0,114,143,0,0,0,41,17, + 114,29,0,0,0,114,54,0,0,0,90,8,100,97,116,97, + 112,97,116,104,114,130,0,0,0,114,134,0,0,0,114,125, + 0,0,0,114,137,0,0,0,114,131,0,0,0,114,132,0, + 0,0,114,133,0,0,0,114,123,0,0,0,114,124,0,0, + 0,114,135,0,0,0,114,136,0,0,0,114,127,0,0,0, + 90,8,114,97,119,95,100,97,116,97,114,141,0,0,0,114, + 9,0,0,0,114,9,0,0,0,114,10,0,0,0,114,52, + 0,0,0,19,2,0,0,115,62,0,0,0,0,1,20,1, + 8,1,8,2,14,2,2,1,14,1,14,1,24,1,10,1, + 12,1,8,2,16,2,18,2,16,1,16,1,12,1,8,1, + 2,1,14,1,16,1,24,1,10,1,14,1,40,2,10,2, + 4,3,2,1,10,1,16,1,14,1,114,52,0,0,0,99, 2,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0, - 11,0,0,0,67,0,0,0,115,68,0,0,0,116,0,160, - 1,124,0,100,1,63,0,100,2,23,0,124,0,100,3,63, - 0,100,4,64,0,124,0,100,5,64,0,124,1,100,6,63, - 0,124,1,100,3,63,0,100,7,64,0,124,1,100,5,64, - 0,100,8,20,0,100,9,100,9,100,9,102,9,161,1,83, - 0,41,10,78,233,9,0,0,0,105,188,7,0,0,233,5, - 0,0,0,233,15,0,0,0,233,31,0,0,0,233,11,0, - 0,0,233,63,0,0,0,114,86,0,0,0,114,14,0,0, - 0,41,2,114,131,0,0,0,90,6,109,107,116,105,109,101, - 41,2,218,1,100,114,138,0,0,0,114,9,0,0,0,114, - 9,0,0,0,114,10,0,0,0,218,14,95,112,97,114,115, - 101,95,100,111,115,116,105,109,101,139,2,0,0,115,22,0, - 0,0,0,1,4,1,10,1,10,1,6,1,6,1,10,1, - 10,1,2,0,2,0,2,249,114,169,0,0,0,99,2,0, - 0,0,0,0,0,0,0,0,0,0,6,0,0,0,10,0, - 0,0,67,0,0,0,115,116,0,0,0,122,82,124,1,100, - 1,100,0,133,2,25,0,100,2,107,6,115,22,74,0,130, - 1,124,1,100,0,100,1,133,2,25,0,125,1,124,0,106, - 0,124,1,25,0,125,2,124,2,100,3,25,0,125,3,124, - 2,100,4,25,0,125,4,124,2,100,5,25,0,125,5,116, - 1,124,4,124,3,131,2,124,5,102,2,87,0,83,0,4, - 0,116,2,116,3,116,4,102,3,107,10,114,110,1,0,1, - 0,1,0,89,0,100,6,83,0,88,0,100,0,83,0,41, - 7,78,114,14,0,0,0,169,2,218,1,99,218,1,111,114, - 163,0,0,0,233,6,0,0,0,233,3,0,0,0,41,2, - 114,0,0,0,0,114,0,0,0,0,41,5,114,28,0,0, - 0,114,169,0,0,0,114,26,0,0,0,218,10,73,110,100, - 101,120,69,114,114,111,114,114,154,0,0,0,41,6,114,32, - 0,0,0,114,13,0,0,0,114,54,0,0,0,114,131,0, - 0,0,114,132,0,0,0,90,17,117,110,99,111,109,112,114, - 101,115,115,101,100,95,115,105,122,101,114,9,0,0,0,114, - 9,0,0,0,114,10,0,0,0,114,151,0,0,0,152,2, - 0,0,115,20,0,0,0,0,1,2,2,20,1,12,1,10, - 3,8,1,8,1,8,1,16,1,20,1,114,151,0,0,0, - 99,2,0,0,0,0,0,0,0,0,0,0,0,3,0,0, - 0,8,0,0,0,67,0,0,0,115,86,0,0,0,124,1, - 100,1,100,0,133,2,25,0,100,2,107,6,115,20,74,0, - 130,1,124,1,100,0,100,1,133,2,25,0,125,1,122,14, - 124,0,106,0,124,1,25,0,125,2,87,0,110,22,4,0, - 116,1,107,10,114,68,1,0,1,0,1,0,89,0,100,0, - 83,0,88,0,116,2,124,0,106,3,124,2,131,2,83,0, - 100,0,83,0,41,3,78,114,14,0,0,0,114,170,0,0, - 0,41,4,114,28,0,0,0,114,26,0,0,0,114,52,0, - 0,0,114,29,0,0,0,41,3,114,32,0,0,0,114,13, - 0,0,0,114,54,0,0,0,114,9,0,0,0,114,9,0, - 0,0,114,10,0,0,0,114,149,0,0,0,171,2,0,0, - 115,14,0,0,0,0,2,20,1,12,2,2,1,14,1,14, - 1,8,2,114,149,0,0,0,99,2,0,0,0,0,0,0, - 0,0,0,0,0,11,0,0,0,9,0,0,0,67,0,0, - 0,115,198,0,0,0,116,0,124,0,124,1,131,2,125,2, - 116,1,68,0,93,160,92,3,125,3,125,4,125,5,124,2, - 124,3,23,0,125,6,116,2,106,3,100,1,124,0,106,4, - 116,5,124,6,100,2,100,3,141,5,1,0,122,14,124,0, - 106,6,124,6,25,0,125,7,87,0,110,20,4,0,116,7, - 107,10,114,88,1,0,1,0,1,0,89,0,113,14,88,0, - 124,7,100,4,25,0,125,8,116,8,124,0,106,4,124,7, - 131,2,125,9,124,4,114,132,116,9,124,0,124,8,124,6, - 124,1,124,9,131,5,125,10,110,10,116,10,124,8,124,9, - 131,2,125,10,124,10,100,0,107,8,114,152,113,14,124,7, - 100,4,25,0,125,8,124,10,124,5,124,8,102,3,2,0, - 1,0,83,0,113,14,116,11,100,5,124,1,155,2,157,2, - 124,1,100,6,141,2,130,1,100,0,83,0,41,7,78,122, - 13,116,114,121,105,110,103,32,123,125,123,125,123,125,114,86, - 0,0,0,41,1,90,9,118,101,114,98,111,115,105,116,121, - 114,0,0,0,0,114,57,0,0,0,114,58,0,0,0,41, - 12,114,36,0,0,0,114,89,0,0,0,114,76,0,0,0, - 114,77,0,0,0,114,29,0,0,0,114,20,0,0,0,114, - 28,0,0,0,114,26,0,0,0,114,52,0,0,0,114,155, - 0,0,0,114,161,0,0,0,114,3,0,0,0,41,11,114, - 32,0,0,0,114,38,0,0,0,114,13,0,0,0,114,90, - 0,0,0,114,91,0,0,0,114,47,0,0,0,114,63,0, - 0,0,114,54,0,0,0,114,40,0,0,0,114,126,0,0, - 0,114,46,0,0,0,114,9,0,0,0,114,9,0,0,0, - 114,10,0,0,0,114,44,0,0,0,186,2,0,0,115,36, - 0,0,0,0,1,10,1,14,1,8,1,22,1,2,1,14, - 1,14,1,6,2,8,1,12,1,4,1,18,2,10,1,8, - 3,2,1,8,1,16,2,114,44,0,0,0,99,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0, - 0,64,0,0,0,115,60,0,0,0,101,0,90,1,100,0, - 90,2,100,1,90,3,100,2,90,4,100,3,100,4,132,0, - 90,5,100,5,100,6,132,0,90,6,100,7,100,8,132,0, - 90,7,100,9,100,10,132,0,90,8,100,11,100,12,132,0, - 90,9,100,13,83,0,41,14,114,80,0,0,0,122,165,80, - 114,105,118,97,116,101,32,99,108,97,115,115,32,117,115,101, - 100,32,116,111,32,115,117,112,112,111,114,116,32,90,105,112, - 73,109,112,111,114,116,46,103,101,116,95,114,101,115,111,117, - 114,99,101,95,114,101,97,100,101,114,40,41,46,10,10,32, - 32,32,32,84,104,105,115,32,99,108,97,115,115,32,105,115, - 32,97,108,108,111,119,101,100,32,116,111,32,114,101,102,101, - 114,101,110,99,101,32,97,108,108,32,116,104,101,32,105,110, - 110,97,114,100,115,32,97,110,100,32,112,114,105,118,97,116, - 101,32,112,97,114,116,115,32,111,102,10,32,32,32,32,116, - 104,101,32,122,105,112,105,109,112,111,114,116,101,114,46,10, - 32,32,32,32,70,99,3,0,0,0,0,0,0,0,0,0, - 0,0,3,0,0,0,2,0,0,0,67,0,0,0,115,16, - 0,0,0,124,1,124,0,95,0,124,2,124,0,95,1,100, - 0,83,0,114,88,0,0,0,41,2,114,4,0,0,0,114, - 38,0,0,0,41,3,114,32,0,0,0,114,4,0,0,0, - 114,38,0,0,0,114,9,0,0,0,114,9,0,0,0,114, - 10,0,0,0,114,34,0,0,0,220,2,0,0,115,4,0, - 0,0,0,1,6,1,122,33,95,90,105,112,73,109,112,111, - 114,116,82,101,115,111,117,114,99,101,82,101,97,100,101,114, - 46,95,95,105,110,105,116,95,95,99,2,0,0,0,0,0, - 0,0,0,0,0,0,5,0,0,0,8,0,0,0,67,0, - 0,0,115,92,0,0,0,124,0,106,0,160,1,100,1,100, - 2,161,2,125,2,124,2,155,0,100,2,124,1,155,0,157, - 3,125,3,100,3,100,4,108,2,109,3,125,4,1,0,122, - 18,124,4,124,0,106,4,160,5,124,3,161,1,131,1,87, - 0,83,0,4,0,116,6,107,10,114,86,1,0,1,0,1, - 0,116,7,124,3,131,1,130,1,89,0,110,2,88,0,100, - 0,83,0,41,5,78,114,85,0,0,0,114,109,0,0,0, - 114,0,0,0,0,41,1,218,7,66,121,116,101,115,73,79, - 41,8,114,38,0,0,0,114,19,0,0,0,90,2,105,111, - 114,176,0,0,0,114,4,0,0,0,114,55,0,0,0,114, - 22,0,0,0,218,17,70,105,108,101,78,111,116,70,111,117, - 110,100,69,114,114,111,114,41,5,114,32,0,0,0,218,8, - 114,101,115,111,117,114,99,101,218,16,102,117,108,108,110,97, - 109,101,95,97,115,95,112,97,116,104,114,13,0,0,0,114, - 176,0,0,0,114,9,0,0,0,114,9,0,0,0,114,10, - 0,0,0,218,13,111,112,101,110,95,114,101,115,111,117,114, - 99,101,224,2,0,0,115,14,0,0,0,0,1,14,1,14, - 1,12,1,2,1,18,1,14,1,122,38,95,90,105,112,73, - 109,112,111,114,116,82,101,115,111,117,114,99,101,82,101,97, - 100,101,114,46,111,112,101,110,95,114,101,115,111,117,114,99, - 101,99,2,0,0,0,0,0,0,0,0,0,0,0,2,0, - 0,0,1,0,0,0,67,0,0,0,115,8,0,0,0,116, - 0,130,1,100,0,83,0,114,88,0,0,0,41,1,114,177, - 0,0,0,41,2,114,32,0,0,0,114,178,0,0,0,114, - 9,0,0,0,114,9,0,0,0,114,10,0,0,0,218,13, - 114,101,115,111,117,114,99,101,95,112,97,116,104,233,2,0, - 0,115,2,0,0,0,0,4,122,38,95,90,105,112,73,109, + 3,0,0,0,67,0,0,0,115,16,0,0,0,116,0,124, + 0,124,1,24,0,131,1,100,1,107,1,83,0,41,2,78, + 114,5,0,0,0,41,1,218,3,97,98,115,41,2,90,2, + 116,49,90,2,116,50,114,9,0,0,0,114,9,0,0,0, + 114,10,0,0,0,218,9,95,101,113,95,109,116,105,109,101, + 65,2,0,0,115,2,0,0,0,0,2,114,147,0,0,0, + 99,5,0,0,0,0,0,0,0,0,0,0,0,14,0,0, + 0,8,0,0,0,67,0,0,0,115,60,1,0,0,124,3, + 124,2,100,1,156,2,125,5,122,18,116,0,160,1,124,4, + 124,3,124,5,161,3,125,6,87,0,110,22,4,0,116,2, + 107,10,114,50,1,0,1,0,1,0,89,0,100,0,83,0, + 48,0,124,6,100,2,64,0,100,3,107,3,125,7,124,7, + 114,182,124,6,100,4,64,0,100,3,107,3,125,8,116,3, + 106,4,100,5,107,3,114,180,124,8,115,104,116,3,106,4, + 100,6,107,2,114,180,116,5,124,0,124,2,131,2,125,9, + 124,9,100,0,107,9,114,180,116,3,160,6,116,0,106,7, + 124,9,161,2,125,10,122,20,116,8,160,9,124,4,124,10, + 124,3,124,5,161,4,1,0,87,0,110,22,4,0,116,2, + 107,10,114,178,1,0,1,0,1,0,89,0,100,0,83,0, + 48,0,110,84,116,10,124,0,124,2,131,2,92,2,125,11, + 125,12,124,11,144,1,114,10,116,11,116,12,124,4,100,7, + 100,8,133,2,25,0,131,1,124,11,131,2,114,246,116,12, + 124,4,100,8,100,9,133,2,25,0,131,1,124,12,107,3, + 144,1,114,10,116,13,160,14,100,10,124,3,155,2,157,2, + 161,1,1,0,100,0,83,0,116,15,160,16,124,4,100,9, + 100,0,133,2,25,0,161,1,125,13,116,17,124,13,116,18, + 131,2,144,1,115,56,116,19,100,11,124,1,155,2,100,12, + 157,3,131,1,130,1,124,13,83,0,41,13,78,41,2,114, + 59,0,0,0,114,13,0,0,0,114,5,0,0,0,114,0, + 0,0,0,114,86,0,0,0,90,5,110,101,118,101,114,90, + 6,97,108,119,97,121,115,114,99,0,0,0,114,94,0,0, + 0,114,95,0,0,0,122,22,98,121,116,101,99,111,100,101, + 32,105,115,32,115,116,97,108,101,32,102,111,114,32,122,16, + 99,111,109,112,105,108,101,100,32,109,111,100,117,108,101,32, + 122,21,32,105,115,32,110,111,116,32,97,32,99,111,100,101, + 32,111,98,106,101,99,116,41,20,114,21,0,0,0,90,13, + 95,99,108,97,115,115,105,102,121,95,112,121,99,114,75,0, + 0,0,218,4,95,105,109,112,90,21,99,104,101,99,107,95, + 104,97,115,104,95,98,97,115,101,100,95,112,121,99,115,218, + 15,95,103,101,116,95,112,121,99,95,115,111,117,114,99,101, + 218,11,115,111,117,114,99,101,95,104,97,115,104,90,17,95, + 82,65,87,95,77,65,71,73,67,95,78,85,77,66,69,82, + 90,18,95,98,111,111,115,116,114,97,112,95,101,120,116,101, + 114,110,97,108,90,18,95,118,97,108,105,100,97,116,101,95, + 104,97,115,104,95,112,121,99,218,29,95,103,101,116,95,109, + 116,105,109,101,95,97,110,100,95,115,105,122,101,95,111,102, + 95,115,111,117,114,99,101,114,147,0,0,0,114,2,0,0, + 0,114,76,0,0,0,114,77,0,0,0,218,7,109,97,114, + 115,104,97,108,90,5,108,111,97,100,115,114,15,0,0,0, + 218,10,95,99,111,100,101,95,116,121,112,101,218,9,84,121, + 112,101,69,114,114,111,114,41,14,114,32,0,0,0,114,53, + 0,0,0,114,63,0,0,0,114,38,0,0,0,114,126,0, + 0,0,90,11,101,120,99,95,100,101,116,97,105,108,115,114, + 129,0,0,0,90,10,104,97,115,104,95,98,97,115,101,100, + 90,12,99,104,101,99,107,95,115,111,117,114,99,101,90,12, + 115,111,117,114,99,101,95,98,121,116,101,115,114,150,0,0, + 0,90,12,115,111,117,114,99,101,95,109,116,105,109,101,90, + 11,115,111,117,114,99,101,95,115,105,122,101,114,46,0,0, + 0,114,9,0,0,0,114,9,0,0,0,114,10,0,0,0, + 218,15,95,117,110,109,97,114,115,104,97,108,95,99,111,100, + 101,75,2,0,0,115,88,0,0,0,0,2,2,1,2,254, + 6,5,2,1,18,1,14,1,8,2,12,1,4,1,12,1, + 10,1,2,255,2,1,8,255,2,2,10,1,8,1,4,1, + 4,1,2,254,4,5,2,1,4,1,2,0,2,0,2,0, + 2,255,8,2,14,1,10,3,8,255,6,3,6,3,22,1, + 18,255,4,2,4,1,8,255,4,2,4,2,18,1,12,1, + 16,1,114,155,0,0,0,99,1,0,0,0,0,0,0,0, + 0,0,0,0,1,0,0,0,4,0,0,0,67,0,0,0, + 115,28,0,0,0,124,0,160,0,100,1,100,2,161,2,125, + 0,124,0,160,0,100,3,100,2,161,2,125,0,124,0,83, + 0,41,4,78,115,2,0,0,0,13,10,243,1,0,0,0, + 10,243,1,0,0,0,13,41,1,114,19,0,0,0,41,1, + 218,6,115,111,117,114,99,101,114,9,0,0,0,114,9,0, + 0,0,114,10,0,0,0,218,23,95,110,111,114,109,97,108, + 105,122,101,95,108,105,110,101,95,101,110,100,105,110,103,115, + 126,2,0,0,115,6,0,0,0,0,1,12,1,12,1,114, + 159,0,0,0,99,2,0,0,0,0,0,0,0,0,0,0, + 0,2,0,0,0,6,0,0,0,67,0,0,0,115,24,0, + 0,0,116,0,124,1,131,1,125,1,116,1,124,1,124,0, + 100,1,100,2,100,3,141,4,83,0,41,4,78,114,74,0, + 0,0,84,41,1,90,12,100,111,110,116,95,105,110,104,101, + 114,105,116,41,2,114,159,0,0,0,218,7,99,111,109,112, + 105,108,101,41,2,114,53,0,0,0,114,158,0,0,0,114, + 9,0,0,0,114,9,0,0,0,114,10,0,0,0,218,15, + 95,99,111,109,112,105,108,101,95,115,111,117,114,99,101,133, + 2,0,0,115,4,0,0,0,0,1,8,1,114,161,0,0, + 0,99,2,0,0,0,0,0,0,0,0,0,0,0,2,0, + 0,0,11,0,0,0,67,0,0,0,115,68,0,0,0,116, + 0,160,1,124,0,100,1,63,0,100,2,23,0,124,0,100, + 3,63,0,100,4,64,0,124,0,100,5,64,0,124,1,100, + 6,63,0,124,1,100,3,63,0,100,7,64,0,124,1,100, + 5,64,0,100,8,20,0,100,9,100,9,100,9,102,9,161, + 1,83,0,41,10,78,233,9,0,0,0,105,188,7,0,0, + 233,5,0,0,0,233,15,0,0,0,233,31,0,0,0,233, + 11,0,0,0,233,63,0,0,0,114,86,0,0,0,114,14, + 0,0,0,41,2,114,131,0,0,0,90,6,109,107,116,105, + 109,101,41,2,218,1,100,114,138,0,0,0,114,9,0,0, + 0,114,9,0,0,0,114,10,0,0,0,218,14,95,112,97, + 114,115,101,95,100,111,115,116,105,109,101,139,2,0,0,115, + 22,0,0,0,0,1,4,1,10,1,10,1,6,1,6,1, + 10,1,10,1,2,0,2,0,2,249,114,169,0,0,0,99, + 2,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0, + 10,0,0,0,67,0,0,0,115,116,0,0,0,122,82,124, + 1,100,1,100,0,133,2,25,0,100,2,107,6,115,22,74, + 0,130,1,124,1,100,0,100,1,133,2,25,0,125,1,124, + 0,106,0,124,1,25,0,125,2,124,2,100,3,25,0,125, + 3,124,2,100,4,25,0,125,4,124,2,100,5,25,0,125, + 5,116,1,124,4,124,3,131,2,124,5,102,2,87,0,83, + 0,4,0,116,2,116,3,116,4,102,3,107,10,114,110,1, + 0,1,0,1,0,89,0,100,6,83,0,48,0,100,0,83, + 0,41,7,78,114,14,0,0,0,169,2,218,1,99,218,1, + 111,114,163,0,0,0,233,6,0,0,0,233,3,0,0,0, + 41,2,114,0,0,0,0,114,0,0,0,0,41,5,114,28, + 0,0,0,114,169,0,0,0,114,26,0,0,0,218,10,73, + 110,100,101,120,69,114,114,111,114,114,154,0,0,0,41,6, + 114,32,0,0,0,114,13,0,0,0,114,54,0,0,0,114, + 131,0,0,0,114,132,0,0,0,90,17,117,110,99,111,109, + 112,114,101,115,115,101,100,95,115,105,122,101,114,9,0,0, + 0,114,9,0,0,0,114,10,0,0,0,114,151,0,0,0, + 152,2,0,0,115,20,0,0,0,0,1,2,2,20,1,12, + 1,10,3,8,1,8,1,8,1,16,1,20,1,114,151,0, + 0,0,99,2,0,0,0,0,0,0,0,0,0,0,0,3, + 0,0,0,8,0,0,0,67,0,0,0,115,86,0,0,0, + 124,1,100,1,100,0,133,2,25,0,100,2,107,6,115,20, + 74,0,130,1,124,1,100,0,100,1,133,2,25,0,125,1, + 122,14,124,0,106,0,124,1,25,0,125,2,87,0,110,22, + 4,0,116,1,107,10,114,68,1,0,1,0,1,0,89,0, + 100,0,83,0,48,0,116,2,124,0,106,3,124,2,131,2, + 83,0,100,0,83,0,41,3,78,114,14,0,0,0,114,170, + 0,0,0,41,4,114,28,0,0,0,114,26,0,0,0,114, + 52,0,0,0,114,29,0,0,0,41,3,114,32,0,0,0, + 114,13,0,0,0,114,54,0,0,0,114,9,0,0,0,114, + 9,0,0,0,114,10,0,0,0,114,149,0,0,0,171,2, + 0,0,115,14,0,0,0,0,2,20,1,12,2,2,1,14, + 1,14,1,8,2,114,149,0,0,0,99,2,0,0,0,0, + 0,0,0,0,0,0,0,11,0,0,0,9,0,0,0,67, + 0,0,0,115,198,0,0,0,116,0,124,0,124,1,131,2, + 125,2,116,1,68,0,93,160,92,3,125,3,125,4,125,5, + 124,2,124,3,23,0,125,6,116,2,106,3,100,1,124,0, + 106,4,116,5,124,6,100,2,100,3,141,5,1,0,122,14, + 124,0,106,6,124,6,25,0,125,7,87,0,110,20,4,0, + 116,7,107,10,114,88,1,0,1,0,1,0,89,0,113,14, + 48,0,124,7,100,4,25,0,125,8,116,8,124,0,106,4, + 124,7,131,2,125,9,124,4,114,132,116,9,124,0,124,8, + 124,6,124,1,124,9,131,5,125,10,110,10,116,10,124,8, + 124,9,131,2,125,10,124,10,100,0,107,8,114,152,113,14, + 124,7,100,4,25,0,125,8,124,10,124,5,124,8,102,3, + 2,0,1,0,83,0,113,14,116,11,100,5,124,1,155,2, + 157,2,124,1,100,6,141,2,130,1,100,0,83,0,41,7, + 78,122,13,116,114,121,105,110,103,32,123,125,123,125,123,125, + 114,86,0,0,0,41,1,90,9,118,101,114,98,111,115,105, + 116,121,114,0,0,0,0,114,57,0,0,0,114,58,0,0, + 0,41,12,114,36,0,0,0,114,89,0,0,0,114,76,0, + 0,0,114,77,0,0,0,114,29,0,0,0,114,20,0,0, + 0,114,28,0,0,0,114,26,0,0,0,114,52,0,0,0, + 114,155,0,0,0,114,161,0,0,0,114,3,0,0,0,41, + 11,114,32,0,0,0,114,38,0,0,0,114,13,0,0,0, + 114,90,0,0,0,114,91,0,0,0,114,47,0,0,0,114, + 63,0,0,0,114,54,0,0,0,114,40,0,0,0,114,126, + 0,0,0,114,46,0,0,0,114,9,0,0,0,114,9,0, + 0,0,114,10,0,0,0,114,44,0,0,0,186,2,0,0, + 115,36,0,0,0,0,1,10,1,14,1,8,1,22,1,2, + 1,14,1,14,1,6,2,8,1,12,1,4,1,18,2,10, + 1,8,3,2,1,8,1,16,2,114,44,0,0,0,99,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2, + 0,0,0,64,0,0,0,115,60,0,0,0,101,0,90,1, + 100,0,90,2,100,1,90,3,100,2,90,4,100,3,100,4, + 132,0,90,5,100,5,100,6,132,0,90,6,100,7,100,8, + 132,0,90,7,100,9,100,10,132,0,90,8,100,11,100,12, + 132,0,90,9,100,13,83,0,41,14,114,80,0,0,0,122, + 165,80,114,105,118,97,116,101,32,99,108,97,115,115,32,117, + 115,101,100,32,116,111,32,115,117,112,112,111,114,116,32,90, + 105,112,73,109,112,111,114,116,46,103,101,116,95,114,101,115, + 111,117,114,99,101,95,114,101,97,100,101,114,40,41,46,10, + 10,32,32,32,32,84,104,105,115,32,99,108,97,115,115,32, + 105,115,32,97,108,108,111,119,101,100,32,116,111,32,114,101, + 102,101,114,101,110,99,101,32,97,108,108,32,116,104,101,32, + 105,110,110,97,114,100,115,32,97,110,100,32,112,114,105,118, + 97,116,101,32,112,97,114,116,115,32,111,102,10,32,32,32, + 32,116,104,101,32,122,105,112,105,109,112,111,114,116,101,114, + 46,10,32,32,32,32,70,99,3,0,0,0,0,0,0,0, + 0,0,0,0,3,0,0,0,2,0,0,0,67,0,0,0, + 115,16,0,0,0,124,1,124,0,95,0,124,2,124,0,95, + 1,100,0,83,0,114,88,0,0,0,41,2,114,4,0,0, + 0,114,38,0,0,0,41,3,114,32,0,0,0,114,4,0, + 0,0,114,38,0,0,0,114,9,0,0,0,114,9,0,0, + 0,114,10,0,0,0,114,34,0,0,0,220,2,0,0,115, + 4,0,0,0,0,1,6,1,122,33,95,90,105,112,73,109, 112,111,114,116,82,101,115,111,117,114,99,101,82,101,97,100, - 101,114,46,114,101,115,111,117,114,99,101,95,112,97,116,104, - 99,2,0,0,0,0,0,0,0,0,0,0,0,4,0,0, - 0,8,0,0,0,67,0,0,0,115,72,0,0,0,124,0, - 106,0,160,1,100,1,100,2,161,2,125,2,124,2,155,0, - 100,2,124,1,155,0,157,3,125,3,122,16,124,0,106,2, - 160,3,124,3,161,1,1,0,87,0,110,22,4,0,116,4, - 107,10,114,66,1,0,1,0,1,0,89,0,100,3,83,0, - 88,0,100,4,83,0,41,5,78,114,85,0,0,0,114,109, - 0,0,0,70,84,41,5,114,38,0,0,0,114,19,0,0, - 0,114,4,0,0,0,114,55,0,0,0,114,22,0,0,0, - 41,4,114,32,0,0,0,114,59,0,0,0,114,179,0,0, - 0,114,13,0,0,0,114,9,0,0,0,114,9,0,0,0, - 114,10,0,0,0,218,11,105,115,95,114,101,115,111,117,114, - 99,101,239,2,0,0,115,14,0,0,0,0,3,14,1,14, - 1,2,1,16,1,14,1,8,1,122,36,95,90,105,112,73, - 109,112,111,114,116,82,101,115,111,117,114,99,101,82,101,97, - 100,101,114,46,105,115,95,114,101,115,111,117,114,99,101,99, - 1,0,0,0,0,0,0,0,0,0,0,0,9,0,0,0, - 9,0,0,0,99,0,0,0,115,186,0,0,0,100,1,100, - 2,108,0,109,1,125,1,1,0,124,1,124,0,106,2,160, - 3,124,0,106,4,161,1,131,1,125,2,124,2,160,5,124, - 0,106,2,106,6,161,1,125,3,124,3,106,7,100,3,107, - 2,115,58,74,0,130,1,124,3,106,8,125,4,116,9,131, - 0,125,5,124,0,106,2,106,10,68,0,93,102,125,6,122, - 18,124,1,124,6,131,1,160,5,124,4,161,1,125,7,87, - 0,110,24,4,0,116,11,107,10,114,124,1,0,1,0,1, - 0,89,0,113,78,89,0,110,2,88,0,124,7,106,8,106, - 7,125,8,116,12,124,8,131,1,100,1,107,2,114,156,124, - 7,106,7,86,0,1,0,113,78,124,8,124,5,107,7,114, - 78,124,5,160,13,124,8,161,1,1,0,124,8,86,0,1, - 0,113,78,100,0,83,0,41,4,78,114,0,0,0,0,41, - 1,218,4,80,97,116,104,114,60,0,0,0,41,14,90,7, - 112,97,116,104,108,105,98,114,183,0,0,0,114,4,0,0, - 0,114,56,0,0,0,114,38,0,0,0,90,11,114,101,108, - 97,116,105,118,101,95,116,111,114,29,0,0,0,114,59,0, - 0,0,90,6,112,97,114,101,110,116,218,3,115,101,116,114, - 28,0,0,0,114,23,0,0,0,114,51,0,0,0,218,3, - 97,100,100,41,9,114,32,0,0,0,114,183,0,0,0,90, - 13,102,117,108,108,110,97,109,101,95,112,97,116,104,90,13, - 114,101,108,97,116,105,118,101,95,112,97,116,104,90,12,112, - 97,99,107,97,103,101,95,112,97,116,104,90,12,115,117,98, - 100,105,114,115,95,115,101,101,110,218,8,102,105,108,101,110, - 97,109,101,90,8,114,101,108,97,116,105,118,101,90,11,112, - 97,114,101,110,116,95,110,97,109,101,114,9,0,0,0,114, - 9,0,0,0,114,10,0,0,0,218,8,99,111,110,116,101, - 110,116,115,250,2,0,0,115,34,0,0,0,0,8,12,1, - 18,1,14,3,14,1,6,1,6,1,12,1,2,1,18,1, - 14,1,10,5,8,1,12,1,10,1,8,1,10,1,122,33, - 95,90,105,112,73,109,112,111,114,116,82,101,115,111,117,114, - 99,101,82,101,97,100,101,114,46,99,111,110,116,101,110,116, - 115,78,41,10,114,6,0,0,0,114,7,0,0,0,114,8, - 0,0,0,114,84,0,0,0,114,81,0,0,0,114,34,0, - 0,0,114,180,0,0,0,114,181,0,0,0,114,182,0,0, - 0,114,187,0,0,0,114,9,0,0,0,114,9,0,0,0, - 114,9,0,0,0,114,10,0,0,0,114,80,0,0,0,212, - 2,0,0,115,14,0,0,0,8,1,4,5,4,2,8,4, - 8,9,8,6,8,11,114,80,0,0,0,41,45,114,84,0, - 0,0,90,26,95,102,114,111,122,101,110,95,105,109,112,111, - 114,116,108,105,98,95,101,120,116,101,114,110,97,108,114,21, - 0,0,0,114,1,0,0,0,114,2,0,0,0,90,17,95, - 102,114,111,122,101,110,95,105,109,112,111,114,116,108,105,98, - 114,76,0,0,0,114,148,0,0,0,114,110,0,0,0,114, - 152,0,0,0,114,67,0,0,0,114,131,0,0,0,90,7, - 95,95,97,108,108,95,95,114,20,0,0,0,90,15,112,97, - 116,104,95,115,101,112,97,114,97,116,111,114,115,114,18,0, - 0,0,114,75,0,0,0,114,3,0,0,0,114,25,0,0, - 0,218,4,116,121,112,101,114,70,0,0,0,114,113,0,0, - 0,114,115,0,0,0,114,117,0,0,0,114,4,0,0,0, - 114,89,0,0,0,114,36,0,0,0,114,37,0,0,0,114, - 35,0,0,0,114,27,0,0,0,114,122,0,0,0,114,142, - 0,0,0,114,144,0,0,0,114,52,0,0,0,114,147,0, - 0,0,114,155,0,0,0,218,8,95,95,99,111,100,101,95, - 95,114,153,0,0,0,114,159,0,0,0,114,161,0,0,0, - 114,169,0,0,0,114,151,0,0,0,114,149,0,0,0,114, - 44,0,0,0,114,80,0,0,0,114,9,0,0,0,114,9, - 0,0,0,114,9,0,0,0,114,10,0,0,0,218,8,60, - 109,111,100,117,108,101,62,1,0,0,0,115,88,0,0,0, - 4,16,8,1,16,1,8,1,8,1,8,1,8,1,8,1, - 8,2,8,3,6,1,14,3,16,4,4,2,8,2,4,1, - 4,1,4,2,14,127,0,127,0,1,12,1,12,1,2,1, - 2,252,4,9,8,4,8,9,8,31,8,126,2,254,2,29, - 4,5,8,21,8,46,8,10,8,46,10,5,8,7,8,6, - 8,13,8,19,8,15,8,26, + 101,114,46,95,95,105,110,105,116,95,95,99,2,0,0,0, + 0,0,0,0,0,0,0,0,5,0,0,0,8,0,0,0, + 67,0,0,0,115,92,0,0,0,124,0,106,0,160,1,100, + 1,100,2,161,2,125,2,124,2,155,0,100,2,124,1,155, + 0,157,3,125,3,100,3,100,4,108,2,109,3,125,4,1, + 0,122,18,124,4,124,0,106,4,160,5,124,3,161,1,131, + 1,87,0,83,0,4,0,116,6,107,10,114,86,1,0,1, + 0,1,0,116,7,124,3,131,1,130,1,89,0,110,2,48, + 0,100,0,83,0,41,5,78,114,85,0,0,0,114,109,0, + 0,0,114,0,0,0,0,41,1,218,7,66,121,116,101,115, + 73,79,41,8,114,38,0,0,0,114,19,0,0,0,90,2, + 105,111,114,176,0,0,0,114,4,0,0,0,114,55,0,0, + 0,114,22,0,0,0,218,17,70,105,108,101,78,111,116,70, + 111,117,110,100,69,114,114,111,114,41,5,114,32,0,0,0, + 218,8,114,101,115,111,117,114,99,101,218,16,102,117,108,108, + 110,97,109,101,95,97,115,95,112,97,116,104,114,13,0,0, + 0,114,176,0,0,0,114,9,0,0,0,114,9,0,0,0, + 114,10,0,0,0,218,13,111,112,101,110,95,114,101,115,111, + 117,114,99,101,224,2,0,0,115,14,0,0,0,0,1,14, + 1,14,1,12,1,2,1,18,1,14,1,122,38,95,90,105, + 112,73,109,112,111,114,116,82,101,115,111,117,114,99,101,82, + 101,97,100,101,114,46,111,112,101,110,95,114,101,115,111,117, + 114,99,101,99,2,0,0,0,0,0,0,0,0,0,0,0, + 2,0,0,0,1,0,0,0,67,0,0,0,115,8,0,0, + 0,116,0,130,1,100,0,83,0,114,88,0,0,0,41,1, + 114,177,0,0,0,41,2,114,32,0,0,0,114,178,0,0, + 0,114,9,0,0,0,114,9,0,0,0,114,10,0,0,0, + 218,13,114,101,115,111,117,114,99,101,95,112,97,116,104,233, + 2,0,0,115,2,0,0,0,0,4,122,38,95,90,105,112, + 73,109,112,111,114,116,82,101,115,111,117,114,99,101,82,101, + 97,100,101,114,46,114,101,115,111,117,114,99,101,95,112,97, + 116,104,99,2,0,0,0,0,0,0,0,0,0,0,0,4, + 0,0,0,8,0,0,0,67,0,0,0,115,72,0,0,0, + 124,0,106,0,160,1,100,1,100,2,161,2,125,2,124,2, + 155,0,100,2,124,1,155,0,157,3,125,3,122,16,124,0, + 106,2,160,3,124,3,161,1,1,0,87,0,110,22,4,0, + 116,4,107,10,114,66,1,0,1,0,1,0,89,0,100,3, + 83,0,48,0,100,4,83,0,41,5,78,114,85,0,0,0, + 114,109,0,0,0,70,84,41,5,114,38,0,0,0,114,19, + 0,0,0,114,4,0,0,0,114,55,0,0,0,114,22,0, + 0,0,41,4,114,32,0,0,0,114,59,0,0,0,114,179, + 0,0,0,114,13,0,0,0,114,9,0,0,0,114,9,0, + 0,0,114,10,0,0,0,218,11,105,115,95,114,101,115,111, + 117,114,99,101,239,2,0,0,115,14,0,0,0,0,3,14, + 1,14,1,2,1,16,1,14,1,8,1,122,36,95,90,105, + 112,73,109,112,111,114,116,82,101,115,111,117,114,99,101,82, + 101,97,100,101,114,46,105,115,95,114,101,115,111,117,114,99, + 101,99,1,0,0,0,0,0,0,0,0,0,0,0,9,0, + 0,0,9,0,0,0,99,0,0,0,115,186,0,0,0,100, + 1,100,2,108,0,109,1,125,1,1,0,124,1,124,0,106, + 2,160,3,124,0,106,4,161,1,131,1,125,2,124,2,160, + 5,124,0,106,2,106,6,161,1,125,3,124,3,106,7,100, + 3,107,2,115,58,74,0,130,1,124,3,106,8,125,4,116, + 9,131,0,125,5,124,0,106,2,106,10,68,0,93,102,125, + 6,122,18,124,1,124,6,131,1,160,5,124,4,161,1,125, + 7,87,0,110,24,4,0,116,11,107,10,114,124,1,0,1, + 0,1,0,89,0,113,78,89,0,110,2,48,0,124,7,106, + 8,106,7,125,8,116,12,124,8,131,1,100,1,107,2,114, + 156,124,7,106,7,86,0,1,0,113,78,124,8,124,5,107, + 7,114,78,124,5,160,13,124,8,161,1,1,0,124,8,86, + 0,1,0,113,78,100,0,83,0,41,4,78,114,0,0,0, + 0,41,1,218,4,80,97,116,104,114,60,0,0,0,41,14, + 90,7,112,97,116,104,108,105,98,114,183,0,0,0,114,4, + 0,0,0,114,56,0,0,0,114,38,0,0,0,90,11,114, + 101,108,97,116,105,118,101,95,116,111,114,29,0,0,0,114, + 59,0,0,0,90,6,112,97,114,101,110,116,218,3,115,101, + 116,114,28,0,0,0,114,23,0,0,0,114,51,0,0,0, + 218,3,97,100,100,41,9,114,32,0,0,0,114,183,0,0, + 0,90,13,102,117,108,108,110,97,109,101,95,112,97,116,104, + 90,13,114,101,108,97,116,105,118,101,95,112,97,116,104,90, + 12,112,97,99,107,97,103,101,95,112,97,116,104,90,12,115, + 117,98,100,105,114,115,95,115,101,101,110,218,8,102,105,108, + 101,110,97,109,101,90,8,114,101,108,97,116,105,118,101,90, + 11,112,97,114,101,110,116,95,110,97,109,101,114,9,0,0, + 0,114,9,0,0,0,114,10,0,0,0,218,8,99,111,110, + 116,101,110,116,115,250,2,0,0,115,34,0,0,0,0,8, + 12,1,18,1,14,3,14,1,6,1,6,1,12,1,2,1, + 18,1,14,1,10,5,8,1,12,1,10,1,8,1,10,1, + 122,33,95,90,105,112,73,109,112,111,114,116,82,101,115,111, + 117,114,99,101,82,101,97,100,101,114,46,99,111,110,116,101, + 110,116,115,78,41,10,114,6,0,0,0,114,7,0,0,0, + 114,8,0,0,0,114,84,0,0,0,114,81,0,0,0,114, + 34,0,0,0,114,180,0,0,0,114,181,0,0,0,114,182, + 0,0,0,114,187,0,0,0,114,9,0,0,0,114,9,0, + 0,0,114,9,0,0,0,114,10,0,0,0,114,80,0,0, + 0,212,2,0,0,115,14,0,0,0,8,1,4,5,4,2, + 8,4,8,9,8,6,8,11,114,80,0,0,0,41,45,114, + 84,0,0,0,90,26,95,102,114,111,122,101,110,95,105,109, + 112,111,114,116,108,105,98,95,101,120,116,101,114,110,97,108, + 114,21,0,0,0,114,1,0,0,0,114,2,0,0,0,90, + 17,95,102,114,111,122,101,110,95,105,109,112,111,114,116,108, + 105,98,114,76,0,0,0,114,148,0,0,0,114,110,0,0, + 0,114,152,0,0,0,114,67,0,0,0,114,131,0,0,0, + 90,7,95,95,97,108,108,95,95,114,20,0,0,0,90,15, + 112,97,116,104,95,115,101,112,97,114,97,116,111,114,115,114, + 18,0,0,0,114,75,0,0,0,114,3,0,0,0,114,25, + 0,0,0,218,4,116,121,112,101,114,70,0,0,0,114,113, + 0,0,0,114,115,0,0,0,114,117,0,0,0,114,4,0, + 0,0,114,89,0,0,0,114,36,0,0,0,114,37,0,0, + 0,114,35,0,0,0,114,27,0,0,0,114,122,0,0,0, + 114,142,0,0,0,114,144,0,0,0,114,52,0,0,0,114, + 147,0,0,0,114,155,0,0,0,218,8,95,95,99,111,100, + 101,95,95,114,153,0,0,0,114,159,0,0,0,114,161,0, + 0,0,114,169,0,0,0,114,151,0,0,0,114,149,0,0, + 0,114,44,0,0,0,114,80,0,0,0,114,9,0,0,0, + 114,9,0,0,0,114,9,0,0,0,114,10,0,0,0,218, + 8,60,109,111,100,117,108,101,62,1,0,0,0,115,88,0, + 0,0,4,16,8,1,16,1,8,1,8,1,8,1,8,1, + 8,1,8,2,8,3,6,1,14,3,16,4,4,2,8,2, + 4,1,4,1,4,2,14,127,0,127,0,1,12,1,12,1, + 2,1,2,252,4,9,8,4,8,9,8,31,8,126,2,254, + 2,29,4,5,8,21,8,46,8,10,8,46,10,5,8,7, + 8,6,8,13,8,19,8,15,8,26, }; diff --git a/Python/opcode_targets.h b/Python/opcode_targets.h index d39bad0bcd3..e4f4a8c7791 100644 --- a/Python/opcode_targets.h +++ b/Python/opcode_targets.h @@ -47,12 +47,12 @@ static void *opcode_targets[256] = { &&_unknown_opcode, &&_unknown_opcode, &&_unknown_opcode, - &&_unknown_opcode, - &&_unknown_opcode, + &&TARGET_RERAISE, + &&TARGET_WITH_EXCEPT_START, &&TARGET_GET_AITER, &&TARGET_GET_ANEXT, &&TARGET_BEFORE_ASYNC_WITH, - &&TARGET_BEGIN_FINALLY, + &&_unknown_opcode, &&TARGET_END_ASYNC_FOR, &&TARGET_INPLACE_ADD, &&TARGET_INPLACE_SUBTRACT, @@ -80,14 +80,14 @@ static void *opcode_targets[256] = { &&TARGET_INPLACE_XOR, &&TARGET_INPLACE_OR, &&_unknown_opcode, - &&TARGET_WITH_CLEANUP_START, - &&TARGET_WITH_CLEANUP_FINISH, + &&_unknown_opcode, + &&_unknown_opcode, &&TARGET_RETURN_VALUE, &&TARGET_IMPORT_STAR, &&TARGET_SETUP_ANNOTATIONS, &&TARGET_YIELD_VALUE, &&TARGET_POP_BLOCK, - &&TARGET_END_FINALLY, + &&_unknown_opcode, &&TARGET_POP_EXCEPT, &&TARGET_STORE_NAME, &&TARGET_DELETE_NAME, @@ -161,8 +161,8 @@ static void *opcode_targets[256] = { &&_unknown_opcode, &&TARGET_LOAD_METHOD, &&TARGET_CALL_METHOD, - &&TARGET_CALL_FINALLY, - &&TARGET_POP_FINALLY, + &&_unknown_opcode, + &&_unknown_opcode, &&_unknown_opcode, &&_unknown_opcode, &&_unknown_opcode, diff --git a/Python/peephole.c b/Python/peephole.c index d859648411f..714a4520ba8 100644 --- a/Python/peephole.c +++ b/Python/peephole.c @@ -198,7 +198,6 @@ markblocks(_Py_CODEUNIT *code, Py_ssize_t len) case SETUP_FINALLY: case SETUP_WITH: case SETUP_ASYNC_WITH: - case CALL_FINALLY: j = GETJUMPTGT(code, i); assert(j < len); blocks[j] = 1; @@ -432,14 +431,10 @@ PyCode_Optimize(PyObject *code, PyObject* consts, PyObject *names, /* Remove unreachable ops after RETURN */ case RETURN_VALUE: h = i + 1; - /* END_FINALLY should be kept since it denotes the end of - the 'finally' block in frame_setlineno() in frameobject.c. - SETUP_FINALLY should be kept for balancing. - */ - while (h < codelen && ISBASICBLOCK(blocks, i, h) && - _Py_OPCODE(codestr[h]) != END_FINALLY) + while (h < codelen && ISBASICBLOCK(blocks, i, h)) { - if (_Py_OPCODE(codestr[h]) == SETUP_FINALLY) { + /* Leave SETUP_FINALLY and RERAISE in place to help find block limits. */ + if (_Py_OPCODE(codestr[h]) == SETUP_FINALLY || _Py_OPCODE(codestr[h]) == RERAISE) { while (h > i + 1 && _Py_OPCODE(codestr[h - 1]) == EXTENDED_ARG) { @@ -506,7 +501,6 @@ PyCode_Optimize(PyObject *code, PyObject* consts, PyObject *names, case SETUP_FINALLY: case SETUP_WITH: case SETUP_ASYNC_WITH: - case CALL_FINALLY: j = blocks[j / sizeof(_Py_CODEUNIT) + i + 1] - blocks[i] - 1; j *= sizeof(_Py_CODEUNIT); break; From 5c534da798eae58eec9ad0601a1c480b271e25a9 Mon Sep 17 00:00:00 2001 From: Giampaolo Rodola Date: Thu, 21 Nov 2019 17:38:51 +0800 Subject: [PATCH 003/115] CODEOWNERS: add myself for asyncore/chat, ftplib and shutil modules (#17313) --- .github/CODEOWNERS | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 0df7b5d28d9..32d21143231 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -93,6 +93,7 @@ Include/pytime.h @pganssle @abalkin /Tools/msi/ @python/windows-team /Tools/nuget/ @python/windows-team +# Misc **/*itertools* @rhettinger **/*collections* @rhettinger **/*random* @rhettinger @@ -108,6 +109,11 @@ Include/pytime.h @pganssle @abalkin **/*typing* @gvanrossum @ilevkivskyi +**/*asyncore @giampaolo +**/*asynchat @giampaolo +**/*ftplib @giampaolo +**/*shutil @giampaolo + # macOS /Mac/ @python/macos-team **/*osx_support* @python/macos-team From 0127bb1c5c3286f87e284ff6083133bfdcfd5a4f Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Thu, 21 Nov 2019 12:54:02 +0100 Subject: [PATCH 004/115] bpo-38875: test_capi: trashcan tests require cpu resource (GH-17314) test_capi: trashcan tests now require the test "cpu" resource. --- Lib/test/test_capi.py | 2 ++ Misc/NEWS.d/next/Tests/2019-11-21-09-11-06.bpo-38875.wSZJal.rst | 1 + 2 files changed, 3 insertions(+) create mode 100644 Misc/NEWS.d/next/Tests/2019-11-21-09-11-06.bpo-38875.wSZJal.rst diff --git a/Lib/test/test_capi.py b/Lib/test/test_capi.py index 20244351097..e65973c4646 100644 --- a/Lib/test/test_capi.py +++ b/Lib/test/test_capi.py @@ -351,9 +351,11 @@ class CAPITest(unittest.TestCase): for i in range(1000): L = MyList((L,)) + @support.requires_resource('cpu') def test_trashcan_python_class1(self): self.do_test_trashcan_python_class(list) + @support.requires_resource('cpu') def test_trashcan_python_class2(self): from _testcapi import MyList self.do_test_trashcan_python_class(MyList) diff --git a/Misc/NEWS.d/next/Tests/2019-11-21-09-11-06.bpo-38875.wSZJal.rst b/Misc/NEWS.d/next/Tests/2019-11-21-09-11-06.bpo-38875.wSZJal.rst new file mode 100644 index 00000000000..3f6c86d3226 --- /dev/null +++ b/Misc/NEWS.d/next/Tests/2019-11-21-09-11-06.bpo-38875.wSZJal.rst @@ -0,0 +1 @@ +test_capi: trashcan tests now require the test "cpu" resource. From 3ab479a2d1959923c9ab80c227dd1f39720b4e2d Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Thu, 21 Nov 2019 12:54:54 +0100 Subject: [PATCH 005/115] bpo-38692: Skip test_posix.test_pidfd_open() on EPERM (GH-17290) Skip the test_posix.test_pidfd_open() test if os.pidfd_open() fails with a PermissionError. This situation can happen in a Linux sandbox using a syscall whitelist which doesn't allow the pidfd_open() syscall yet (like systemd-nspawn). --- Lib/test/test_posix.py | 2 ++ .../NEWS.d/next/Tests/2019-11-20-15-42-06.bpo-38692.aqAvyF.rst | 3 +++ 2 files changed, 5 insertions(+) create mode 100644 Misc/NEWS.d/next/Tests/2019-11-20-15-42-06.bpo-38692.aqAvyF.rst diff --git a/Lib/test/test_posix.py b/Lib/test/test_posix.py index 98a39c3f040..4df882b6210 100644 --- a/Lib/test/test_posix.py +++ b/Lib/test/test_posix.py @@ -1476,6 +1476,8 @@ class PosixTester(unittest.TestCase): os.pidfd_open(-1) if cm.exception.errno == errno.ENOSYS: self.skipTest("system does not support pidfd_open") + if isinstance(cm.exception, PermissionError): + self.skipTest(f"pidfd_open syscall blocked: {cm.exception!r}") self.assertEqual(cm.exception.errno, errno.EINVAL) os.close(os.pidfd_open(os.getpid(), 0)) diff --git a/Misc/NEWS.d/next/Tests/2019-11-20-15-42-06.bpo-38692.aqAvyF.rst b/Misc/NEWS.d/next/Tests/2019-11-20-15-42-06.bpo-38692.aqAvyF.rst new file mode 100644 index 00000000000..fa2056632ba --- /dev/null +++ b/Misc/NEWS.d/next/Tests/2019-11-20-15-42-06.bpo-38692.aqAvyF.rst @@ -0,0 +1,3 @@ +Skip the test_posix.test_pidfd_open() test if ``os.pidfd_open()`` fails with a +:exc:`PermissionError`. This situation can happen in a Linux sandbox using a +syscall whitelist which doesn't allow the ``pidfd_open()`` syscall yet. From 82f897bf8f72d09f537054d64a94e645ad23d8d6 Mon Sep 17 00:00:00 2001 From: Mark Shannon Date: Thu, 21 Nov 2019 14:47:49 +0000 Subject: [PATCH 006/115] Correct release version to 3.9 for RERAISE and WITH_EXCEPT_START bytecodes. (#17318) bpo-33387 Corrects commit fee5526 --- Doc/library/dis.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Doc/library/dis.rst b/Doc/library/dis.rst index 2b55486f3a2..1f540d95078 100644 --- a/Doc/library/dis.rst +++ b/Doc/library/dis.rst @@ -710,7 +710,7 @@ iterations of the loop. Re-raises the exception currently on top of the stack. - .. versionadded:: 3.8 + .. versionadded:: 3.9 .. opcode:: WITH_EXCEPT_START @@ -720,7 +720,7 @@ iterations of the loop. Used to implement the call ``context_manager.__exit__(*exc_info())`` when an exception has occurred in a :keyword:`with` statement. - .. versionadded:: 3.8 + .. versionadded:: 3.9 .. opcode:: LOAD_ASSERTION_ERROR From 0aca3a3a1e68b4ca2d334ab5255dfc267719096e Mon Sep 17 00:00:00 2001 From: benedwards14 <53377856+benedwards14@users.noreply.github.com> Date: Thu, 21 Nov 2019 17:24:58 +0000 Subject: [PATCH 007/115] bpo-37838: get_type_hints for wrapped functions with forward reference (GH-17126) https://bugs.python.org/issue37838 --- Lib/test/ann_module.py | 7 +++++++ Lib/test/test_typing.py | 15 +++++++++++++++ Lib/typing.py | 6 +++++- .../2019-11-21-11-39-17.bpo-37838.lRFcEC.rst | 1 + 4 files changed, 28 insertions(+), 1 deletion(-) create mode 100644 Misc/NEWS.d/next/Library/2019-11-21-11-39-17.bpo-37838.lRFcEC.rst diff --git a/Lib/test/ann_module.py b/Lib/test/ann_module.py index 9e6b87dac40..0567d6de1b6 100644 --- a/Lib/test/ann_module.py +++ b/Lib/test/ann_module.py @@ -6,6 +6,7 @@ Empty lines above are for good reason (testing for correct line numbers) """ from typing import Optional +from functools import wraps __annotations__[1] = 2 @@ -51,3 +52,9 @@ def foo(x: int = 10): def bar(y: List[str]): x: str = 'yes' bar() + +def dec(func): + @wraps(func) + def wrapper(*args, **kwargs): + return func(*args, **kwargs) + return wrapper diff --git a/Lib/test/test_typing.py b/Lib/test/test_typing.py index 49417efe511..ccd617c1fdf 100644 --- a/Lib/test/test_typing.py +++ b/Lib/test/test_typing.py @@ -2778,6 +2778,16 @@ except StopIteration as e: gth = get_type_hints +class ForRefExample: + @ann_module.dec + def func(self: 'ForRefExample'): + pass + + @ann_module.dec + @ann_module.dec + def nested(self: 'ForRefExample'): + pass + class GetTypeHintTests(BaseTestCase): def test_get_type_hints_from_various_objects(self): @@ -2876,6 +2886,11 @@ class GetTypeHintTests(BaseTestCase): 'x': ClassVar[Optional[B]]}) self.assertEqual(gth(G), {'lst': ClassVar[List[T]]}) + def test_get_type_hints_wrapped_decoratored_func(self): + expects = {'self': ForRefExample} + self.assertEqual(gth(ForRefExample.func), expects) + self.assertEqual(gth(ForRefExample.nested), expects) + class GetUtilitiesTestCase(TestCase): def test_get_origin(self): diff --git a/Lib/typing.py b/Lib/typing.py index 27be37a369a..5523ee01e1f 100644 --- a/Lib/typing.py +++ b/Lib/typing.py @@ -1234,7 +1234,11 @@ def get_type_hints(obj, globalns=None, localns=None): if isinstance(obj, types.ModuleType): globalns = obj.__dict__ else: - globalns = getattr(obj, '__globals__', {}) + nsobj = obj + # Find globalns for the unwrapped object. + while hasattr(nsobj, '__wrapped__'): + nsobj = nsobj.__wrapped__ + globalns = getattr(nsobj, '__globals__', {}) if localns is None: localns = globalns elif localns is None: diff --git a/Misc/NEWS.d/next/Library/2019-11-21-11-39-17.bpo-37838.lRFcEC.rst b/Misc/NEWS.d/next/Library/2019-11-21-11-39-17.bpo-37838.lRFcEC.rst new file mode 100644 index 00000000000..96d804addeb --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-11-21-11-39-17.bpo-37838.lRFcEC.rst @@ -0,0 +1 @@ +:meth:`typing.get_type_hints` properly handles functions decorated with :meth:`functools.wraps`. From 65444cf7fe84d8ca1f9b51c7f5992210751e08bb Mon Sep 17 00:00:00 2001 From: Claudiu Popa Date: Thu, 21 Nov 2019 22:23:13 +0100 Subject: [PATCH 008/115] bpo-38526: Fix zipfile.Path method name to be the correct one (#17317) --- Doc/library/zipfile.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Doc/library/zipfile.rst b/Doc/library/zipfile.rst index 18d2e9a60a7..e8a2530fb8c 100644 --- a/Doc/library/zipfile.rst +++ b/Doc/library/zipfile.rst @@ -494,7 +494,7 @@ Path objects are traversable using the ``/`` operator. Invoke :meth:`ZipFile.open` on the current path. Accepts the same arguments as :meth:`ZipFile.open`. -.. method:: Path.listdir() +.. method:: Path.iterdir() Enumerate the children of the current directory. From b4e5eeac267c436bb60776dc5be771d3259bd298 Mon Sep 17 00:00:00 2001 From: Raymond Hettinger Date: Thu, 21 Nov 2019 22:51:45 -0800 Subject: [PATCH 009/115] Defer import of shutil which only needed for help and usage (GH-17334) --- Lib/argparse.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Lib/argparse.py b/Lib/argparse.py index 5a8eff2f4cc..5d3ce2ad709 100644 --- a/Lib/argparse.py +++ b/Lib/argparse.py @@ -87,7 +87,6 @@ __all__ = [ import os as _os import re as _re -import shutil as _shutil import sys as _sys from gettext import gettext as _, ngettext @@ -167,7 +166,8 @@ class HelpFormatter(object): # default setting for width if width is None: - width = _shutil.get_terminal_size().columns + import shutil + width = shutil.get_terminal_size().columns width -= 2 self._prog = prog @@ -264,7 +264,7 @@ class HelpFormatter(object): invocations.append(get_invocation(subaction)) # update the maximum item length - invocation_length = max([len(s) for s in invocations]) + invocation_length = max(map(len, invocations)) action_length = invocation_length + self._current_indent self._action_max_length = max(self._action_max_length, action_length) From 91daa9d7224626dad4bb820924c01b3438ca6e3f Mon Sep 17 00:00:00 2001 From: Siwon Kang Date: Fri, 22 Nov 2019 18:13:05 +0900 Subject: [PATCH 010/115] bpo-38863: Improve is_cgi() in http.server (GH-17312) is_cgi() function of http.server library does not currently handle a cgi script if one of the cgi_directories is located at the sub-directory of given path. Since is_cgi() in CGIHTTPRequestHandler class separates given path into (dir, rest) based on the first seen '/', multi-level directories like /sub/dir/cgi-bin/hello.py is divided into head=/sub, rest=dir/cgi-bin/hello.py then check whether '/sub' exists in cgi_directories = [..., '/sub/dir/cgi-bin']. This patch makes the is_cgi() keep expanding dir part to the next '/' then checking if that expanded path exists in the cgi_directories. Signed-off-by: Siwon Kang https://bugs.python.org/issue38863 --- Lib/http/server.py | 6 +++-- Lib/test/test_httpservers.py | 24 +++++++++++++++++++ .../2019-11-21-16-30-00.bpo-38863.RkdTjf.rst | 2 ++ 3 files changed, 30 insertions(+), 2 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2019-11-21-16-30-00.bpo-38863.RkdTjf.rst diff --git a/Lib/http/server.py b/Lib/http/server.py index 005dd824f9a..47a4fcf9a65 100644 --- a/Lib/http/server.py +++ b/Lib/http/server.py @@ -1014,8 +1014,10 @@ class CGIHTTPRequestHandler(SimpleHTTPRequestHandler): """ collapsed_path = _url_collapse_path(self.path) dir_sep = collapsed_path.find('/', 1) - head, tail = collapsed_path[:dir_sep], collapsed_path[dir_sep+1:] - if head in self.cgi_directories: + while dir_sep > 0 and not collapsed_path[:dir_sep] in self.cgi_directories: + dir_sep = collapsed_path.find('/', dir_sep+1) + if dir_sep > 0: + head, tail = collapsed_path[:dir_sep], collapsed_path[dir_sep+1:] self.cgi_info = head, tail return True return False diff --git a/Lib/test/test_httpservers.py b/Lib/test/test_httpservers.py index 1c980a2fa66..26da71e0b27 100644 --- a/Lib/test/test_httpservers.py +++ b/Lib/test/test_httpservers.py @@ -601,13 +601,20 @@ class CGIHTTPServerTestCase(BaseTestCase): self.parent_dir = tempfile.mkdtemp() self.cgi_dir = os.path.join(self.parent_dir, 'cgi-bin') self.cgi_child_dir = os.path.join(self.cgi_dir, 'child-dir') + self.sub_dir_1 = os.path.join(self.parent_dir, 'sub') + self.sub_dir_2 = os.path.join(self.sub_dir_1, 'dir') + self.cgi_dir_in_sub_dir = os.path.join(self.sub_dir_2, 'cgi-bin') os.mkdir(self.cgi_dir) os.mkdir(self.cgi_child_dir) + os.mkdir(self.sub_dir_1) + os.mkdir(self.sub_dir_2) + os.mkdir(self.cgi_dir_in_sub_dir) self.nocgi_path = None self.file1_path = None self.file2_path = None self.file3_path = None self.file4_path = None + self.file5_path = None # The shebang line should be pure ASCII: use symlink if possible. # See issue #7668. @@ -652,6 +659,11 @@ class CGIHTTPServerTestCase(BaseTestCase): file4.write(cgi_file4 % (self.pythonexe, 'QUERY_STRING')) os.chmod(self.file4_path, 0o777) + self.file5_path = os.path.join(self.cgi_dir_in_sub_dir, 'file5.py') + with open(self.file5_path, 'w', encoding='utf-8') as file5: + file5.write(cgi_file1 % self.pythonexe) + os.chmod(self.file5_path, 0o777) + os.chdir(self.parent_dir) def tearDown(self): @@ -669,8 +681,13 @@ class CGIHTTPServerTestCase(BaseTestCase): os.remove(self.file3_path) if self.file4_path: os.remove(self.file4_path) + if self.file5_path: + os.remove(self.file5_path) os.rmdir(self.cgi_child_dir) os.rmdir(self.cgi_dir) + os.rmdir(self.cgi_dir_in_sub_dir) + os.rmdir(self.sub_dir_2) + os.rmdir(self.sub_dir_1) os.rmdir(self.parent_dir) finally: BaseTestCase.tearDown(self) @@ -789,6 +806,13 @@ class CGIHTTPServerTestCase(BaseTestCase): 'text/html', HTTPStatus.OK), (res.read(), res.getheader('Content-type'), res.status)) + def test_cgi_path_in_sub_directories(self): + CGIHTTPRequestHandler.cgi_directories.append('/sub/dir/cgi-bin') + res = self.request('/sub/dir/cgi-bin/file5.py') + self.assertEqual( + (b'Hello World' + self.linesep, 'text/html', HTTPStatus.OK), + (res.read(), res.getheader('Content-type'), res.status)) + class SocketlessRequestHandler(SimpleHTTPRequestHandler): def __init__(self, directory=None): diff --git a/Misc/NEWS.d/next/Library/2019-11-21-16-30-00.bpo-38863.RkdTjf.rst b/Misc/NEWS.d/next/Library/2019-11-21-16-30-00.bpo-38863.RkdTjf.rst new file mode 100644 index 00000000000..6b621eeea2f --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-11-21-16-30-00.bpo-38863.RkdTjf.rst @@ -0,0 +1,2 @@ +Improve :func:`is_cgi` function in :mod:`http.server`, which enables processing +the case that cgi directory is a child of another directory other than root. From 310e2d25170a88ef03f6fd31efcc899fe062da2c Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Fri, 22 Nov 2019 10:58:00 +0100 Subject: [PATCH 011/115] bpo-36854: Fix refleak in subinterpreter (GH-17331) finalize_interp_clear() now explicitly clears the codec registry and then trigger a GC collection to clear all references. --- Modules/_testcapimodule.c | 7 +++++-- Python/pylifecycle.c | 8 ++++++++ 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/Modules/_testcapimodule.c b/Modules/_testcapimodule.c index baa6907b7e4..0908f3457f5 100644 --- a/Modules/_testcapimodule.c +++ b/Modules/_testcapimodule.c @@ -6721,11 +6721,14 @@ PyInit__testcapi(void) PyModule_AddObject(m, "instancemethod", (PyObject *)&PyInstanceMethod_Type); PyModule_AddIntConstant(m, "the_number_three", 3); + PyObject *v; #ifdef WITH_PYMALLOC - PyModule_AddObject(m, "WITH_PYMALLOC", Py_True); + v = Py_True; #else - PyModule_AddObject(m, "WITH_PYMALLOC", Py_False); + v = Py_False; #endif + Py_INCREF(v); + PyModule_AddObject(m, "WITH_PYMALLOC", v); TestError = PyErr_NewException("_testcapi.error", NULL, NULL); Py_INCREF(TestError); diff --git a/Python/pylifecycle.c b/Python/pylifecycle.c index 7591f069b45..8c508e33800 100644 --- a/Python/pylifecycle.c +++ b/Python/pylifecycle.c @@ -1210,6 +1210,14 @@ finalize_interp_clear(PyThreadState *tstate) { int is_main_interp = _Py_IsMainInterpreter(tstate); + /* bpo-36854: Explicitly clear the codec registry + and trigger a GC collection */ + PyInterpreterState *interp = tstate->interp; + Py_CLEAR(interp->codec_search_path); + Py_CLEAR(interp->codec_search_cache); + Py_CLEAR(interp->codec_error_registry); + _PyGC_CollectNoFail(); + /* Clear interpreter state and all thread states */ PyInterpreterState_Clear(tstate->interp); From 3d4833488a173c16446c3f94f58f05e2d13c5dee Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Fri, 22 Nov 2019 12:27:50 +0100 Subject: [PATCH 012/115] bpo-38858: Call _PyUnicode_Fini() in Py_EndInterpreter() (GH-17330) Py_EndInterpreter() now clears the filesystem codec. --- Include/internal/pycore_pylifecycle.h | 2 +- Objects/unicodeobject.c | 35 +++++++++++++++------------ Python/pylifecycle.c | 10 ++++---- 3 files changed, 25 insertions(+), 22 deletions(-) diff --git a/Include/internal/pycore_pylifecycle.h b/Include/internal/pycore_pylifecycle.h index c837bcdbc03..73aa5ef1f6c 100644 --- a/Include/internal/pycore_pylifecycle.h +++ b/Include/internal/pycore_pylifecycle.h @@ -77,7 +77,7 @@ extern void _PyImport_Fini2(void); extern void _PyGC_Fini(PyThreadState *tstate); extern void _PyType_Fini(void); extern void _Py_HashRandomization_Fini(void); -extern void _PyUnicode_Fini(void); +extern void _PyUnicode_Fini(PyThreadState *tstate); extern void _PyLong_Fini(void); extern void _PyFaulthandler_Fini(void); extern void _PyHash_Fini(void); diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c index 5ae0af8ea33..89e45d01e37 100644 --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -15929,34 +15929,37 @@ _PyUnicode_EnableLegacyWindowsFSEncoding(void) void -_PyUnicode_Fini(void) +_PyUnicode_Fini(PyThreadState *tstate) { + if (_Py_IsMainInterpreter(tstate)) { #if defined(WITH_VALGRIND) || defined(__INSURE__) - /* Insure++ is a memory analysis tool that aids in discovering - * memory leaks and other memory problems. On Python exit, the - * interned string dictionaries are flagged as being in use at exit - * (which it is). Under normal circumstances, this is fine because - * the memory will be automatically reclaimed by the system. Under - * memory debugging, it's a huge source of useless noise, so we - * trade off slower shutdown for less distraction in the memory - * reports. -baw - */ - unicode_release_interned(); + /* Insure++ is a memory analysis tool that aids in discovering + * memory leaks and other memory problems. On Python exit, the + * interned string dictionaries are flagged as being in use at exit + * (which it is). Under normal circumstances, this is fine because + * the memory will be automatically reclaimed by the system. Under + * memory debugging, it's a huge source of useless noise, so we + * trade off slower shutdown for less distraction in the memory + * reports. -baw + */ + unicode_release_interned(); #endif /* __INSURE__ */ - Py_CLEAR(unicode_empty); + Py_CLEAR(unicode_empty); - for (Py_ssize_t i = 0; i < 256; i++) { - Py_CLEAR(unicode_latin1[i]); + for (Py_ssize_t i = 0; i < 256; i++) { + Py_CLEAR(unicode_latin1[i]); + } + _PyUnicode_ClearStaticStrings(); + (void)PyUnicode_ClearFreeList(); } - _PyUnicode_ClearStaticStrings(); - (void)PyUnicode_ClearFreeList(); PyInterpreterState *interp = _PyInterpreterState_GET_UNSAFE(); PyMem_RawFree(interp->fs_codec.encoding); interp->fs_codec.encoding = NULL; PyMem_RawFree(interp->fs_codec.errors); interp->fs_codec.errors = NULL; + interp->config.filesystem_errors = _Py_ERROR_UNKNOWN; } diff --git a/Python/pylifecycle.c b/Python/pylifecycle.c index 8c508e33800..5f3c49a6804 100644 --- a/Python/pylifecycle.c +++ b/Python/pylifecycle.c @@ -1182,9 +1182,6 @@ finalize_interp_types(PyThreadState *tstate, int is_main_interp) _PySet_Fini(); _PyBytes_Fini(); _PyLong_Fini(); - } - - if (is_main_interp) { _PyFloat_Fini(); _PyDict_Fini(); _PySlice_Fini(); @@ -1197,9 +1194,12 @@ finalize_interp_types(PyThreadState *tstate, int is_main_interp) _PyArg_Fini(); _PyAsyncGen_Fini(); _PyContext_Fini(); + } - /* Cleanup Unicode implementation */ - _PyUnicode_Fini(); + /* Cleanup Unicode implementation */ + _PyUnicode_Fini(tstate); + + if (is_main_interp) { _Py_ClearFileSystemEncoding(); } } From 138e7bbb0a5ed44bdd54605e8c58c8f3d3865321 Mon Sep 17 00:00:00 2001 From: jacksonriley <52106215+jacksonriley@users.noreply.github.com> Date: Fri, 22 Nov 2019 12:51:58 +0000 Subject: [PATCH 013/115] bpo-38866: Remove asyncore from test_pyclbr.py (GH-17316) Co-Authored-By: Kyle Stanley --- Lib/test/test_pyclbr.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Lib/test/test_pyclbr.py b/Lib/test/test_pyclbr.py index 4385271cd0f..869799cfa9a 100644 --- a/Lib/test/test_pyclbr.py +++ b/Lib/test/test_pyclbr.py @@ -247,7 +247,7 @@ class ReadmoduleTests(TestCase): # not a package. # # Issue #14798. - self.assertRaises(ImportError, pyclbr.readmodule_ex, 'asyncore.foo') + self.assertRaises(ImportError, pyclbr.readmodule_ex, 'asyncio.foo') def test_module_has_no_spec(self): module_name = "doesnotexist" From 4e205b74f91400c0e6810e79370a99e29a28d599 Mon Sep 17 00:00:00 2001 From: Alex <637714+alexchandel@users.noreply.github.com> Date: Fri, 22 Nov 2019 07:48:14 -0600 Subject: [PATCH 014/115] Fix quoted signature of setattrofunc (GH-17251) setattrofunc returns `int`, not `PyObject *`. --- Doc/c-api/typeobj.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Doc/c-api/typeobj.rst b/Doc/c-api/typeobj.rst index b4ffd6b41c6..7b205c04495 100644 --- a/Doc/c-api/typeobj.rst +++ b/Doc/c-api/typeobj.rst @@ -955,7 +955,7 @@ and :c:type:`PyType_Type` effectively act as defaults.) The signature is the same as for :c:func:`PyObject_SetAttr`:: - PyObject *tp_setattro(PyObject *self, PyObject *attr, PyObject *value); + int tp_setattro(PyObject *self, PyObject *attr, PyObject *value); In addition, setting *value* to ``NULL`` to delete an attribute must be supported. It is usually convenient to set this field to From 1b779bfb8593739b11cbb988ef82a883ec9d077e Mon Sep 17 00:00:00 2001 From: bcaller Date: Fri, 22 Nov 2019 14:22:11 +0000 Subject: [PATCH 015/115] bpo-38804: Fix REDoS in http.cookiejar (GH-17157) The regex http.cookiejar.LOOSE_HTTP_DATE_RE was vulnerable to regular expression denial of service (REDoS). LOOSE_HTTP_DATE_RE.match is called when using http.cookiejar.CookieJar to parse Set-Cookie headers returned by a server. Processing a response from a malicious HTTP server can lead to extreme CPU usage and execution will be blocked for a long time. The regex contained multiple overlapping \s* capture groups. Ignoring the ?-optional capture groups the regex could be simplified to \d+-\w+-\d+(\s*\s*\s*)$ Therefore, a long sequence of spaces can trigger bad performance. Matching a malicious string such as LOOSE_HTTP_DATE_RE.match("1-c-1" + (" " * 2000) + "!") caused catastrophic backtracking. The fix removes ambiguity about which \s* should match a particular space. You can create a malicious server which responds with Set-Cookie headers to attack all python programs which access it e.g. from http.server import BaseHTTPRequestHandler, HTTPServer def make_set_cookie_value(n_spaces): spaces = " " * n_spaces expiry = f"1-c-1{spaces}!" return f"b;Expires={expiry}" class Handler(BaseHTTPRequestHandler): def do_GET(self): self.log_request(204) self.send_response_only(204) # Don't bother sending Server and Date n_spaces = ( int(self.path[1:]) # Can GET e.g. /100 to test shorter sequences if len(self.path) > 1 else 65506 # Max header line length 65536 ) value = make_set_cookie_value(n_spaces) for i in range(99): # Not necessary, but we can have up to 100 header lines self.send_header("Set-Cookie", value) self.end_headers() if __name__ == "__main__": HTTPServer(("", 44020), Handler).serve_forever() This server returns 99 Set-Cookie headers. Each has 65506 spaces. Extracting the cookies will pretty much never complete. Vulnerable client using the example at the bottom of https://docs.python.org/3/library/http.cookiejar.html : import http.cookiejar, urllib.request cj = http.cookiejar.CookieJar() opener = urllib.request.build_opener(urllib.request.HTTPCookieProcessor(cj)) r = opener.open("http://localhost:44020/") The popular requests library was also vulnerable without any additional options (as it uses http.cookiejar by default): import requests requests.get("http://localhost:44020/") * Regression test for http.cookiejar REDoS If we regress, this test will take a very long time. * Improve performance of http.cookiejar.ISO_DATE_RE A string like "444444" + (" " * 2000) + "A" could cause poor performance due to the 2 overlapping \s* groups, although this is not as serious as the REDoS in LOOSE_HTTP_DATE_RE was. --- Lib/http/cookiejar.py | 18 ++++++++++++------ Lib/test/test_http_cookiejar.py | 13 +++++++++++++ Misc/ACKS | 1 + .../2019-11-15-00-54-42.bpo-38804.vjbM8V.rst | 1 + 4 files changed, 27 insertions(+), 6 deletions(-) create mode 100644 Misc/NEWS.d/next/Security/2019-11-15-00-54-42.bpo-38804.vjbM8V.rst diff --git a/Lib/http/cookiejar.py b/Lib/http/cookiejar.py index adc7ed62425..47ed5c3d64a 100644 --- a/Lib/http/cookiejar.py +++ b/Lib/http/cookiejar.py @@ -214,10 +214,14 @@ LOOSE_HTTP_DATE_RE = re.compile( (?::(\d\d))? # optional seconds )? # optional clock \s* - ([-+]?\d{2,4}|(?![APap][Mm]\b)[A-Za-z]+)? # timezone + (?: + ([-+]?\d{2,4}|(?![APap][Mm]\b)[A-Za-z]+) # timezone \s* - (?:\(\w+\))? # ASCII representation of timezone in parens. - \s*$""", re.X | re.ASCII) + )? + (?: + \(\w+\) # ASCII representation of timezone in parens. + \s* + )?$""", re.X | re.ASCII) def http2time(text): """Returns time in seconds since epoch of time represented by a string. @@ -287,9 +291,11 @@ ISO_DATE_RE = re.compile( (?::?(\d\d(?:\.\d*)?))? # optional seconds (and fractional) )? # optional clock \s* - ([-+]?\d\d?:?(:?\d\d)? - |Z|z)? # timezone (Z is "zero meridian", i.e. GMT) - \s*$""", re.X | re. ASCII) + (?: + ([-+]?\d\d?:?(:?\d\d)? + |Z|z) # timezone (Z is "zero meridian", i.e. GMT) + \s* + )?$""", re.X | re. ASCII) def iso2time(text): """ As for http2time, but parses the ISO 8601 formats: diff --git a/Lib/test/test_http_cookiejar.py b/Lib/test/test_http_cookiejar.py index 853a4004496..2d7077af6da 100644 --- a/Lib/test/test_http_cookiejar.py +++ b/Lib/test/test_http_cookiejar.py @@ -123,6 +123,13 @@ class DateTimeTests(unittest.TestCase): "http2time(%s) is not None\n" "http2time(test) %s" % (test, http2time(test))) + def test_http2time_redos_regression_actually_completes(self): + # LOOSE_HTTP_DATE_RE was vulnerable to malicious input which caused catastrophic backtracking (REDoS). + # If we regress to cubic complexity, this test will take a very long time to succeed. + # If fixed, it should complete within a fraction of a second. + http2time("01 Jan 1970{}00:00:00 GMT!".format(" " * 10 ** 5)) + http2time("01 Jan 1970 00:00:00{}GMT!".format(" " * 10 ** 5)) + def test_iso2time(self): def parse_date(text): return time.gmtime(iso2time(text))[:6] @@ -180,6 +187,12 @@ class DateTimeTests(unittest.TestCase): self.assertIsNone(iso2time(test), "iso2time(%r)" % test) + def test_iso2time_performance_regression(self): + # If ISO_DATE_RE regresses to quadratic complexity, this test will take a very long time to succeed. + # If fixed, it should complete within a fraction of a second. + iso2time('1994-02-03{}14:15:29 -0100!'.format(' '*10**6)) + iso2time('1994-02-03 14:15:29{}-0100!'.format(' '*10**6)) + class HeaderTests(unittest.TestCase): diff --git a/Misc/ACKS b/Misc/ACKS index 13c6676bace..357ce024e9e 100644 --- a/Misc/ACKS +++ b/Misc/ACKS @@ -250,6 +250,7 @@ Zach Byrne Vedran Čačić Nicolas Cadou Jp Calderone +Ben Caller Arnaud Calmettes Daniel Calvelo Tony Campbell diff --git a/Misc/NEWS.d/next/Security/2019-11-15-00-54-42.bpo-38804.vjbM8V.rst b/Misc/NEWS.d/next/Security/2019-11-15-00-54-42.bpo-38804.vjbM8V.rst new file mode 100644 index 00000000000..1f45142d9f7 --- /dev/null +++ b/Misc/NEWS.d/next/Security/2019-11-15-00-54-42.bpo-38804.vjbM8V.rst @@ -0,0 +1 @@ +Fixes a ReDoS vulnerability in :mod:`http.cookiejar`. Patch by Ben Caller. From e0c9ab8e26d1648b870b80c296b2490a5e9553e5 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Fri, 22 Nov 2019 16:19:14 +0100 Subject: [PATCH 016/115] bpo-38858: Add init_set_builtins_open() subfunction (GH-17346) --- Python/pylifecycle.c | 68 ++++++++++++++++++++++++++++++++------------ 1 file changed, 50 insertions(+), 18 deletions(-) diff --git a/Python/pylifecycle.c b/Python/pylifecycle.c index 5f3c49a6804..4825b8b28e6 100644 --- a/Python/pylifecycle.c +++ b/Python/pylifecycle.c @@ -64,6 +64,7 @@ extern grammar _PyParser_Grammar; /* From graminit.c */ /* Forward declarations */ static PyStatus add_main_module(PyInterpreterState *interp); static PyStatus init_import_site(void); +static PyStatus init_set_builtins_open(PyThreadState *tstate); static PyStatus init_sys_streams(PyThreadState *tstate); static PyStatus init_signals(PyThreadState *tstate); static void call_py_exitfuncs(PyThreadState *tstate); @@ -994,6 +995,11 @@ pyinit_main(PyThreadState *tstate) return status; } + status = init_set_builtins_open(tstate); + if (_PyStatus_EXCEPTION(status)) { + return status; + } + /* Initialize warnings. */ PyObject *warnoptions = PySys_GetObject("warnoptions"); if (warnoptions != NULL && PyList_Size(warnoptions) > 0) @@ -1569,6 +1575,11 @@ new_interpreter(PyThreadState **tstate_p) return status; } + status = init_set_builtins_open(tstate); + if (_PyStatus_EXCEPTION(status)) { + return status; + } + status = add_main_module(interp); if (_PyStatus_EXCEPTION(status)) { return status; @@ -1891,12 +1902,49 @@ error: return NULL; } +/* Set builtins.open to io.OpenWrapper */ +static PyStatus +init_set_builtins_open(PyThreadState *tstate) +{ + PyObject *iomod = NULL, *wrapper; + PyObject *bimod = NULL; + PyStatus res = _PyStatus_OK(); + + if (!(iomod = PyImport_ImportModule("io"))) { + goto error; + } + + if (!(bimod = PyImport_ImportModule("builtins"))) { + goto error; + } + + if (!(wrapper = PyObject_GetAttrString(iomod, "OpenWrapper"))) { + goto error; + } + + /* Set builtins.open */ + if (PyObject_SetAttrString(bimod, "open", wrapper) == -1) { + Py_DECREF(wrapper); + goto error; + } + Py_DECREF(wrapper); + goto done; + +error: + res = _PyStatus_ERR("can't initialize io.open"); + +done: + Py_XDECREF(bimod); + Py_XDECREF(iomod); + return res; +} + + /* Initialize sys.stdin, stdout, stderr and builtins.open */ static PyStatus init_sys_streams(PyThreadState *tstate) { - PyObject *iomod = NULL, *wrapper; - PyObject *bimod = NULL; + PyObject *iomod = NULL; PyObject *m; PyObject *std = NULL; int fd; @@ -1929,23 +1977,9 @@ init_sys_streams(PyThreadState *tstate) } Py_DECREF(m); - if (!(bimod = PyImport_ImportModule("builtins"))) { - goto error; - } - if (!(iomod = PyImport_ImportModule("io"))) { goto error; } - if (!(wrapper = PyObject_GetAttrString(iomod, "OpenWrapper"))) { - goto error; - } - - /* Set builtins.open */ - if (PyObject_SetAttrString(bimod, "open", wrapper) == -1) { - Py_DECREF(wrapper); - goto error; - } - Py_DECREF(wrapper); /* Set sys.stdin */ fd = fileno(stdin); @@ -2013,8 +2047,6 @@ error: done: _Py_ClearStandardStreamEncoding(); - - Py_XDECREF(bimod); Py_XDECREF(iomod); return res; } From b00513636c9891deba4cae50217e25e8faf6c6ac Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Fri, 22 Nov 2019 17:52:42 +0100 Subject: [PATCH 017/115] bpo-38858: Add init_interp_main() subfunction (GH-17347) Fix new_interpreter() error handling: undo it all if status is an exception. --- Python/pylifecycle.c | 282 ++++++++++++++++++++++--------------------- 1 file changed, 144 insertions(+), 138 deletions(-) diff --git a/Python/pylifecycle.c b/Python/pylifecycle.c index 4825b8b28e6..e692d75999d 100644 --- a/Python/pylifecycle.c +++ b/Python/pylifecycle.c @@ -260,6 +260,7 @@ _Py_LegacyLocaleDetected(int warn) #endif } +#ifndef MS_WINDOWS static const char *_C_LOCALE_WARNING = "Python runtime initialized with LC_CTYPE=C (a locale with default ASCII " "encoding), which may cause Unicode compatibility problems. Using C.UTF-8, " @@ -274,6 +275,7 @@ emit_stderr_warning_for_legacy_locale(_PyRuntimeState *runtime) PySys_FormatStderr("%s", _C_LOCALE_WARNING); } } +#endif /* !defined(MS_WINDOWS) */ typedef struct _CandidateLocale { const char *locale_name; /* The locale to try as a coercion target */ @@ -896,16 +898,16 @@ done: configuration. Example of bpo-34008: Py_Main() called after Py_Initialize(). */ static PyStatus -_Py_ReconfigureMainInterpreter(PyInterpreterState *interp) +_Py_ReconfigureMainInterpreter(PyThreadState *tstate) { - PyConfig *config = &interp->config; + PyConfig *config = &tstate->interp->config; PyObject *argv = _PyWideStringList_AsList(&config->argv); if (argv == NULL) { return _PyStatus_NO_MEMORY(); \ } - int res = PyDict_SetItemString(interp->sysdict, "argv", argv); + int res = PyDict_SetItemString(tstate->interp->sysdict, "argv", argv); Py_DECREF(argv); if (res < 0) { return _PyStatus_ERR("fail to set sys.argv"); @@ -913,6 +915,116 @@ _Py_ReconfigureMainInterpreter(PyInterpreterState *interp) return _PyStatus_OK(); } + +static PyStatus +init_interp_main(PyThreadState *tstate) +{ + PyStatus status; + int is_main_interp = _Py_IsMainInterpreter(tstate); + PyInterpreterState *interp = tstate->interp; + PyConfig *config = &interp->config; + + if (!config->_install_importlib) { + /* Special mode for freeze_importlib: run with no import system + * + * This means anything which needs support from extension modules + * or pure Python code in the standard library won't work. + */ + if (is_main_interp) { + interp->runtime->initialized = 1; + } + return _PyStatus_OK(); + } + + if (is_main_interp) { + if (_PyTime_Init() < 0) { + return _PyStatus_ERR("can't initialize time"); + } + + if (_PySys_InitMain(tstate) < 0) { + return _PyStatus_ERR("can't finish initializing sys"); + } + } + + status = init_importlib_external(tstate); + if (_PyStatus_EXCEPTION(status)) { + return status; + } + + if (is_main_interp) { + /* initialize the faulthandler module */ + status = _PyFaulthandler_Init(config->faulthandler); + if (_PyStatus_EXCEPTION(status)) { + return status; + } + } + + status = _PyUnicode_InitEncodings(tstate); + if (_PyStatus_EXCEPTION(status)) { + return status; + } + + if (is_main_interp) { + if (config->install_signal_handlers) { + status = init_signals(tstate); + if (_PyStatus_EXCEPTION(status)) { + return status; + } + } + + if (_PyTraceMalloc_Init(config->tracemalloc) < 0) { + return _PyStatus_ERR("can't initialize tracemalloc"); + } + } + + status = init_sys_streams(tstate); + if (_PyStatus_EXCEPTION(status)) { + return status; + } + + status = init_set_builtins_open(tstate); + if (_PyStatus_EXCEPTION(status)) { + return status; + } + + status = add_main_module(interp); + if (_PyStatus_EXCEPTION(status)) { + return status; + } + + if (is_main_interp) { + /* Initialize warnings. */ + PyObject *warnoptions = PySys_GetObject("warnoptions"); + if (warnoptions != NULL && PyList_Size(warnoptions) > 0) + { + PyObject *warnings_module = PyImport_ImportModule("warnings"); + if (warnings_module == NULL) { + fprintf(stderr, "'import warnings' failed; traceback:\n"); + _PyErr_Print(tstate); + } + Py_XDECREF(warnings_module); + } + + interp->runtime->initialized = 1; + } + + if (config->site_import) { + status = init_import_site(); + if (_PyStatus_EXCEPTION(status)) { + return status; + } + } + + if (is_main_interp) { +#ifndef MS_WINDOWS + emit_stderr_warning_for_legacy_locale(interp->runtime); +#endif + } + + return _PyStatus_OK(); +} + + /* Update interpreter state based on supplied configuration settings * * After calling this function, most of the restrictions on the interpreter @@ -927,104 +1039,19 @@ _Py_ReconfigureMainInterpreter(PyInterpreterState *interp) static PyStatus pyinit_main(PyThreadState *tstate) { - _PyRuntimeState *runtime = tstate->interp->runtime; - if (!runtime->core_initialized) { + PyInterpreterState *interp = tstate->interp; + if (!interp->runtime->core_initialized) { return _PyStatus_ERR("runtime core not initialized"); } - /* Configure the main interpreter */ - PyInterpreterState *interp = tstate->interp; - PyConfig *config = &interp->config; - - if (runtime->initialized) { - return _Py_ReconfigureMainInterpreter(interp); + if (interp->runtime->initialized) { + return _Py_ReconfigureMainInterpreter(tstate); } - if (!config->_install_importlib) { - /* Special mode for freeze_importlib: run with no import system - * - * This means anything which needs support from extension modules - * or pure Python code in the standard library won't work. - */ - runtime->initialized = 1; - return _PyStatus_OK(); - } - - if (_PyTime_Init() < 0) { - return _PyStatus_ERR("can't initialize time"); - } - - if (_PySys_InitMain(tstate) < 0) { - return _PyStatus_ERR("can't finish initializing sys"); - } - - PyStatus status = init_importlib_external(tstate); + PyStatus status = init_interp_main(tstate); if (_PyStatus_EXCEPTION(status)) { return status; } - - /* initialize the faulthandler module */ - status = _PyFaulthandler_Init(config->faulthandler); - if (_PyStatus_EXCEPTION(status)) { - return status; - } - - status = _PyUnicode_InitEncodings(tstate); - if (_PyStatus_EXCEPTION(status)) { - return status; - } - - if (config->install_signal_handlers) { - status = init_signals(tstate); - if (_PyStatus_EXCEPTION(status)) { - return status; - } - } - - if (_PyTraceMalloc_Init(config->tracemalloc) < 0) { - return _PyStatus_ERR("can't initialize tracemalloc"); - } - - status = add_main_module(interp); - if (_PyStatus_EXCEPTION(status)) { - return status; - } - - status = init_sys_streams(tstate); - if (_PyStatus_EXCEPTION(status)) { - return status; - } - - status = init_set_builtins_open(tstate); - if (_PyStatus_EXCEPTION(status)) { - return status; - } - - /* Initialize warnings. */ - PyObject *warnoptions = PySys_GetObject("warnoptions"); - if (warnoptions != NULL && PyList_Size(warnoptions) > 0) - { - PyObject *warnings_module = PyImport_ImportModule("warnings"); - if (warnings_module == NULL) { - fprintf(stderr, "'import warnings' failed; traceback:\n"); - _PyErr_Print(tstate); - } - Py_XDECREF(warnings_module); - } - - runtime->initialized = 1; - - if (config->site_import) { - status = init_import_site(); - if (_PyStatus_EXCEPTION(status)) { - return status; - } - } - -#ifndef MS_WINDOWS - emit_stderr_warning_for_legacy_locale(runtime); -#endif - return _PyStatus_OK(); } @@ -1440,6 +1467,7 @@ Py_Finalize(void) Py_FinalizeEx(); } + /* Create and initialize a new interpreter and thread, and return the new thread. This requires that Py_Initialize() has been called first. @@ -1499,7 +1527,7 @@ new_interpreter(PyThreadState **tstate_p) status = _PyConfig_Copy(&interp->config, config); if (_PyStatus_EXCEPTION(status)) { - return status; + goto done; } config = &interp->config; @@ -1508,7 +1536,8 @@ new_interpreter(PyThreadState **tstate_p) /* XXX The following is lax in error checking */ PyObject *modules = PyDict_New(); if (modules == NULL) { - return _PyStatus_ERR("can't make modules dictionary"); + status = _PyStatus_ERR("can't make modules dictionary"); + goto done; } interp->modules = modules; @@ -1516,101 +1545,78 @@ new_interpreter(PyThreadState **tstate_p) if (sysmod != NULL) { interp->sysdict = PyModule_GetDict(sysmod); if (interp->sysdict == NULL) { - goto handle_error; + goto handle_exc; } Py_INCREF(interp->sysdict); PyDict_SetItemString(interp->sysdict, "modules", modules); if (_PySys_InitMain(tstate) < 0) { - return _PyStatus_ERR("can't finish initializing sys"); + status = _PyStatus_ERR("can't finish initializing sys"); + goto done; } } else if (_PyErr_Occurred(tstate)) { - goto handle_error; + goto handle_exc; } PyObject *bimod = _PyImport_FindBuiltin(tstate, "builtins"); if (bimod != NULL) { interp->builtins = PyModule_GetDict(bimod); if (interp->builtins == NULL) - goto handle_error; + goto handle_exc; Py_INCREF(interp->builtins); } else if (_PyErr_Occurred(tstate)) { - goto handle_error; + goto handle_exc; } if (bimod != NULL && sysmod != NULL) { status = _PyBuiltins_AddExceptions(bimod); if (_PyStatus_EXCEPTION(status)) { - return status; + goto done; } status = _PySys_SetPreliminaryStderr(interp->sysdict); if (_PyStatus_EXCEPTION(status)) { - return status; + goto done; } status = _PyImportHooks_Init(tstate); if (_PyStatus_EXCEPTION(status)) { - return status; + goto done; } status = init_importlib(tstate, sysmod); if (_PyStatus_EXCEPTION(status)) { - return status; + goto done; } - status = init_importlib_external(tstate); + status = init_interp_main(tstate); if (_PyStatus_EXCEPTION(status)) { - return status; - } - - status = _PyUnicode_InitEncodings(tstate); - if (_PyStatus_EXCEPTION(status)) { - return status; - } - - status = init_sys_streams(tstate); - if (_PyStatus_EXCEPTION(status)) { - return status; - } - - status = init_set_builtins_open(tstate); - if (_PyStatus_EXCEPTION(status)) { - return status; - } - - status = add_main_module(interp); - if (_PyStatus_EXCEPTION(status)) { - return status; - } - - if (config->site_import) { - status = init_import_site(); - if (_PyStatus_EXCEPTION(status)) { - return status; - } + goto done; } } if (_PyErr_Occurred(tstate)) { - goto handle_error; + goto handle_exc; } *tstate_p = tstate; return _PyStatus_OK(); -handle_error: - /* Oops, it didn't work. Undo it all. */ +handle_exc: + status = _PyStatus_OK(); +done: + *tstate_p = NULL; + + /* Oops, it didn't work. Undo it all. */ PyErr_PrintEx(0); PyThreadState_Clear(tstate); PyThreadState_Delete(tstate); PyInterpreterState_Delete(interp); PyThreadState_Swap(save_tstate); - *tstate_p = NULL; - return _PyStatus_OK(); + return status; } PyThreadState * From 42bc60ead39c7be9f6bb7329977826e962f601eb Mon Sep 17 00:00:00 2001 From: Callum Ward Date: Fri, 22 Nov 2019 16:57:14 +0000 Subject: [PATCH 018/115] closes bpo-29275: Remove Y2K reference from time module docs (GH-17321) The Y2K reference is not needed as it only points out that Python's use of C standard functions doesn't generally suffer from Y2K issues; the point regarding conventions for conversion of 2-digit years in :func:`strptime` is still valid. --- Doc/library/time.rst | 15 +++++---------- 1 file changed, 5 insertions(+), 10 deletions(-) diff --git a/Doc/library/time.rst b/Doc/library/time.rst index 65ab679669e..e628ac44e80 100644 --- a/Doc/library/time.rst +++ b/Doc/library/time.rst @@ -42,17 +42,12 @@ An explanation of some terminology and conventions is in order. library; for 32-bit systems, it is typically in 2038. .. index:: - single: Year 2000 - single: Y2K + single: 2-digit years -.. _time-y2kissues: - -* **Year 2000 (Y2K) issues**: Python depends on the platform's C library, which - generally doesn't have year 2000 issues, since all dates and times are - represented internally as seconds since the epoch. Function :func:`strptime` - can parse 2-digit years when given ``%y`` format code. When 2-digit years are - parsed, they are converted according to the POSIX and ISO C standards: values - 69--99 are mapped to 1969--1999, and values 0--68 are mapped to 2000--2068. +* Function :func:`strptime` can parse 2-digit years when given ``%y`` format + code. When 2-digit years are parsed, they are converted according to the POSIX + and ISO C standards: values 69--99 are mapped to 1969--1999, and values 0--68 + are mapped to 2000--2068. .. index:: single: UTC From 82c83bd907409c287a5bd0d0f4598f2c0538f34d Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Fri, 22 Nov 2019 18:52:27 +0100 Subject: [PATCH 019/115] bpo-38858: _PyImport_FixupExtensionObject() handles subinterpreters (GH-17350) If _PyImport_FixupExtensionObject() is called from a subinterpreter, leave extensions unchanged and don't copy the module dictionary into def->m_base.m_copy. --- Include/cpython/pystate.h | 1 - Include/internal/pycore_pystate.h | 6 +++ Python/import.c | 70 ++++++++++++++++++------------- Python/pystate.c | 39 ++++++++++------- 4 files changed, 70 insertions(+), 46 deletions(-) diff --git a/Include/cpython/pystate.h b/Include/cpython/pystate.h index 6c8d2ae041e..d1792575c97 100644 --- a/Include/cpython/pystate.h +++ b/Include/cpython/pystate.h @@ -147,7 +147,6 @@ struct _ts { The caller must hold the GIL.*/ PyAPI_FUNC(PyInterpreterState *) _PyInterpreterState_Get(void); -PyAPI_FUNC(int) _PyState_AddModule(PyObject*, struct PyModuleDef*); PyAPI_FUNC(PyThreadState *) _PyThreadState_Prealloc(PyInterpreterState *); /* Similar to PyThreadState_Get(), but don't issue a fatal error diff --git a/Include/internal/pycore_pystate.h b/Include/internal/pycore_pystate.h index 936e9cbc65f..aa2103f07c7 100644 --- a/Include/internal/pycore_pystate.h +++ b/Include/internal/pycore_pystate.h @@ -324,6 +324,12 @@ extern void _PyInterpreterState_ClearModules(PyInterpreterState *interp); PyAPI_FUNC(void) _PyGILState_Reinit(_PyRuntimeState *runtime); + +PyAPI_FUNC(int) _PyState_AddModule( + PyThreadState *tstate, + PyObject* module, + struct PyModuleDef* def); + #ifdef __cplusplus } #endif diff --git a/Python/import.c b/Python/import.c index ac3d10cfed2..923c6d0465d 100644 --- a/Python/import.c +++ b/Python/import.c @@ -695,50 +695,62 @@ int _PyImport_FixupExtensionObject(PyObject *mod, PyObject *name, PyObject *filename, PyObject *modules) { - PyObject *dict, *key; - struct PyModuleDef *def; - int res; - if (extensions == NULL) { - extensions = PyDict_New(); - if (extensions == NULL) - return -1; - } if (mod == NULL || !PyModule_Check(mod)) { PyErr_BadInternalCall(); return -1; } - def = PyModule_GetDef(mod); + + struct PyModuleDef *def = PyModule_GetDef(mod); if (!def) { PyErr_BadInternalCall(); return -1; } - if (PyObject_SetItem(modules, name, mod) < 0) + + PyThreadState *tstate = _PyThreadState_GET(); + if (PyObject_SetItem(modules, name, mod) < 0) { return -1; - if (_PyState_AddModule(mod, def) < 0) { + } + if (_PyState_AddModule(tstate, mod, def) < 0) { PyMapping_DelItem(modules, name); return -1; } - if (def->m_size == -1) { - if (def->m_base.m_copy) { - /* Somebody already imported the module, - likely under a different name. - XXX this should really not happen. */ - Py_CLEAR(def->m_base.m_copy); + + if (_Py_IsMainInterpreter(tstate)) { + if (def->m_size == -1) { + if (def->m_base.m_copy) { + /* Somebody already imported the module, + likely under a different name. + XXX this should really not happen. */ + Py_CLEAR(def->m_base.m_copy); + } + PyObject *dict = PyModule_GetDict(mod); + if (dict == NULL) { + return -1; + } + def->m_base.m_copy = PyDict_Copy(dict); + if (def->m_base.m_copy == NULL) { + return -1; + } } - dict = PyModule_GetDict(mod); - if (dict == NULL) + + if (extensions == NULL) { + extensions = PyDict_New(); + if (extensions == NULL) { + return -1; + } + } + + PyObject *key = PyTuple_Pack(2, filename, name); + if (key == NULL) { return -1; - def->m_base.m_copy = PyDict_Copy(dict); - if (def->m_base.m_copy == NULL) + } + int res = PyDict_SetItem(extensions, key, (PyObject *)def); + Py_DECREF(key); + if (res < 0) { return -1; + } } - key = PyTuple_Pack(2, filename, name); - if (key == NULL) - return -1; - res = PyDict_SetItem(extensions, key, (PyObject *)def); - Py_DECREF(key); - if (res < 0) - return -1; + return 0; } @@ -801,7 +813,7 @@ import_find_extension(PyThreadState *tstate, PyObject *name, } Py_DECREF(mod); } - if (_PyState_AddModule(mod, def) < 0) { + if (_PyState_AddModule(tstate, mod, def) < 0) { PyMapping_DelItem(modules, name); return NULL; } diff --git a/Python/pystate.c b/Python/pystate.c index 0a6d035836e..d792380de46 100644 --- a/Python/pystate.c +++ b/Python/pystate.c @@ -661,9 +661,8 @@ PyState_FindModule(struct PyModuleDef* module) } int -_PyState_AddModule(PyObject* module, struct PyModuleDef* def) +_PyState_AddModule(PyThreadState *tstate, PyObject* module, struct PyModuleDef* def) { - PyInterpreterState *state; if (!def) { assert(PyErr_Occurred()); return -1; @@ -673,37 +672,45 @@ _PyState_AddModule(PyObject* module, struct PyModuleDef* def) "PyState_AddModule called on module with slots"); return -1; } - state = _PyInterpreterState_GET_UNSAFE(); - if (!state->modules_by_index) { - state->modules_by_index = PyList_New(0); - if (!state->modules_by_index) + + PyInterpreterState *interp = tstate->interp; + if (!interp->modules_by_index) { + interp->modules_by_index = PyList_New(0); + if (!interp->modules_by_index) { return -1; + } } - while (PyList_GET_SIZE(state->modules_by_index) <= def->m_base.m_index) - if (PyList_Append(state->modules_by_index, Py_None) < 0) + + while (PyList_GET_SIZE(interp->modules_by_index) <= def->m_base.m_index) { + if (PyList_Append(interp->modules_by_index, Py_None) < 0) { return -1; + } + } + Py_INCREF(module); - return PyList_SetItem(state->modules_by_index, + return PyList_SetItem(interp->modules_by_index, def->m_base.m_index, module); } int PyState_AddModule(PyObject* module, struct PyModuleDef* def) { - Py_ssize_t index; - PyInterpreterState *state = _PyInterpreterState_GET_UNSAFE(); if (!def) { Py_FatalError("PyState_AddModule: Module Definition is NULL"); return -1; } - index = def->m_base.m_index; - if (state->modules_by_index && - index < PyList_GET_SIZE(state->modules_by_index) && - module == PyList_GET_ITEM(state->modules_by_index, index)) { + + PyThreadState *tstate = _PyThreadState_GET(); + PyInterpreterState *interp = tstate->interp; + Py_ssize_t index = def->m_base.m_index; + if (interp->modules_by_index && + index < PyList_GET_SIZE(interp->modules_by_index) && + module == PyList_GET_ITEM(interp->modules_by_index, index)) + { Py_FatalError("PyState_AddModule: Module already added!"); return -1; } - return _PyState_AddModule(module, def); + return _PyState_AddModule(tstate, module, def); } int From 2582d46fbcf7bdf86b9cf4016850b8d155267ac6 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Fri, 22 Nov 2019 19:24:49 +0100 Subject: [PATCH 020/115] bpo-38858: new_interpreter() reuses pycore_init_builtins() (GH-17351) new_interpreter() now calls _PyBuiltin_Init() to create the builtins module and calls _PyImport_FixupBuiltin(), rather than using _PyImport_FindBuiltin(tstate, "builtins"). pycore_init_builtins() is now responsible to initialize intepr->builtins_copy: inline _PyImport_Init() and remove this function. --- Doc/data/refcounts.dat | 2 - Include/internal/pycore_pylifecycle.h | 1 - Python/import.c | 11 ------ Python/pylifecycle.c | 53 ++++++++++++--------------- 4 files changed, 24 insertions(+), 43 deletions(-) diff --git a/Doc/data/refcounts.dat b/Doc/data/refcounts.dat index cfed1bd5031..b55e972d536 100644 --- a/Doc/data/refcounts.dat +++ b/Doc/data/refcounts.dat @@ -3045,8 +3045,6 @@ Py_XINCREF:PyObject*:o:+1:if o is not NULL _PyImport_Fini:void::: -_PyImport_Init:void::: - _PyObject_New:PyObject*::+1: _PyObject_New:PyTypeObject*:type:0: diff --git a/Include/internal/pycore_pylifecycle.h b/Include/internal/pycore_pylifecycle.h index 73aa5ef1f6c..cd3be215ff1 100644 --- a/Include/internal/pycore_pylifecycle.h +++ b/Include/internal/pycore_pylifecycle.h @@ -44,7 +44,6 @@ extern PyStatus _PySys_SetPreliminaryStderr(PyObject *sysdict); extern PyStatus _PySys_ReadPreinitWarnOptions(PyWideStringList *options); extern PyStatus _PySys_ReadPreinitXOptions(PyConfig *config); extern int _PySys_InitMain(PyThreadState *tstate); -extern PyStatus _PyImport_Init(PyThreadState *tstate); extern PyStatus _PyExc_Init(void); extern PyStatus _PyErr_Init(void); extern PyStatus _PyBuiltins_AddExceptions(PyObject * bltinmod); diff --git a/Python/import.c b/Python/import.c index 923c6d0465d..045b6d0a9bf 100644 --- a/Python/import.c +++ b/Python/import.c @@ -48,17 +48,6 @@ module _imp /* Initialize things */ -PyStatus -_PyImport_Init(PyThreadState *tstate) -{ - PyInterpreterState *interp = tstate->interp; - interp->builtins_copy = PyDict_Copy(interp->builtins); - if (interp->builtins_copy == NULL) { - return _PyStatus_ERR("Can't backup builtins dict"); - } - return _PyStatus_OK(); -} - PyStatus _PyImportHooks_Init(PyThreadState *tstate) { diff --git a/Python/pylifecycle.c b/Python/pylifecycle.c index e692d75999d..e63fb64469d 100644 --- a/Python/pylifecycle.c +++ b/Python/pylifecycle.c @@ -622,25 +622,36 @@ pycore_init_types(PyThreadState *tstate) static PyStatus pycore_init_builtins(PyThreadState *tstate) { - PyInterpreterState *interp = tstate->interp; - PyObject *bimod = _PyBuiltin_Init(tstate); if (bimod == NULL) { - return _PyStatus_ERR("can't initialize builtins modules"); + goto error; } - _PyImport_FixupBuiltin(bimod, "builtins", interp->modules); - interp->builtins = PyModule_GetDict(bimod); - if (interp->builtins == NULL) { - return _PyStatus_ERR("can't initialize builtins dict"); + PyInterpreterState *interp = tstate->interp; + if (_PyImport_FixupBuiltin(bimod, "builtins", interp->modules) < 0) { + goto error; } - Py_INCREF(interp->builtins); + + PyObject *builtins_dict = PyModule_GetDict(bimod); + if (builtins_dict == NULL) { + goto error; + } + Py_INCREF(builtins_dict); + interp->builtins = builtins_dict; PyStatus status = _PyBuiltins_AddExceptions(bimod); if (_PyStatus_EXCEPTION(status)) { return status; } + + interp->builtins_copy = PyDict_Copy(interp->builtins); + if (interp->builtins_copy == NULL) { + goto error; + } return _PyStatus_OK(); + +error: + return _PyStatus_ERR("can't initialize builtins module"); } @@ -649,12 +660,7 @@ pycore_init_import_warnings(PyThreadState *tstate, PyObject *sysmod) { const PyConfig *config = &tstate->interp->config; - PyStatus status = _PyImport_Init(tstate); - if (_PyStatus_EXCEPTION(status)) { - return status; - } - - status = _PyImportHooks_Init(tstate); + PyStatus status = _PyImportHooks_Init(tstate); if (_PyStatus_EXCEPTION(status)) { return status; } @@ -1558,23 +1564,12 @@ new_interpreter(PyThreadState **tstate_p) goto handle_exc; } - PyObject *bimod = _PyImport_FindBuiltin(tstate, "builtins"); - if (bimod != NULL) { - interp->builtins = PyModule_GetDict(bimod); - if (interp->builtins == NULL) - goto handle_exc; - Py_INCREF(interp->builtins); - } - else if (_PyErr_Occurred(tstate)) { - goto handle_exc; + status = pycore_init_builtins(tstate); + if (_PyStatus_EXCEPTION(status)) { + goto done; } - if (bimod != NULL && sysmod != NULL) { - status = _PyBuiltins_AddExceptions(bimod); - if (_PyStatus_EXCEPTION(status)) { - goto done; - } - + if (sysmod != NULL) { status = _PySys_SetPreliminaryStderr(interp->sysdict); if (_PyStatus_EXCEPTION(status)) { goto done; From 2ec1a1b307cc893adae4662a32e1d2e94b6908e3 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Fri, 22 Nov 2019 21:54:33 +0100 Subject: [PATCH 021/115] bpo-38858: new_interpreter() uses pycore_init_import_warnings() (GH-17353) --- Python/pylifecycle.c | 25 +++++++++++-------------- 1 file changed, 11 insertions(+), 14 deletions(-) diff --git a/Python/pylifecycle.c b/Python/pylifecycle.c index e63fb64469d..cce4783bc12 100644 --- a/Python/pylifecycle.c +++ b/Python/pylifecycle.c @@ -665,15 +665,17 @@ pycore_init_import_warnings(PyThreadState *tstate, PyObject *sysmod) return status; } - /* Initialize _warnings. */ - if (_PyWarnings_Init() == NULL) { - return _PyStatus_ERR("can't initialize warnings"); - } + if (_Py_IsMainInterpreter(tstate)) { + /* Initialize _warnings. */ + if (_PyWarnings_Init() == NULL) { + return _PyStatus_ERR("can't initialize warnings"); + } - if (config->_install_importlib) { - status = _PyConfig_WritePathConfig(config); - if (_PyStatus_EXCEPTION(status)) { - return status; + if (config->_install_importlib) { + status = _PyConfig_WritePathConfig(config); + if (_PyStatus_EXCEPTION(status)) { + return status; + } } } @@ -1575,12 +1577,7 @@ new_interpreter(PyThreadState **tstate_p) goto done; } - status = _PyImportHooks_Init(tstate); - if (_PyStatus_EXCEPTION(status)) { - goto done; - } - - status = init_importlib(tstate, sysmod); + status = pycore_init_import_warnings(tstate, sysmod); if (_PyStatus_EXCEPTION(status)) { goto done; } From 3ae38cc181fe513abc09c8931f910eeb61bac60d Mon Sep 17 00:00:00 2001 From: Ethan Furman Date: Fri, 22 Nov 2019 14:28:41 -0800 Subject: [PATCH 022/115] Update CODEOWNERS (#17356) Add Ethan Furman for enum, cgi, and cgitb. --- .github/CODEOWNERS | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 32d21143231..7b415ac5c2f 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -114,6 +114,9 @@ Include/pytime.h @pganssle @abalkin **/*ftplib @giampaolo **/*shutil @giampaolo +**/*enum* @ethanfurman +**/*cgi* @ethanfurman + # macOS /Mac/ @python/macos-team **/*osx_support* @python/macos-team From 14a89c47983f2fb9e7fdf33c769e622eefd3a14a Mon Sep 17 00:00:00 2001 From: PypeBros Date: Sat, 23 Nov 2019 00:19:08 +0100 Subject: [PATCH 023/115] bpo-38686: fix HTTP Digest handling in request.py (#17045) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * fix HTTP Digest handling in request.py There is a bug triggered when server replies to a request with `WWW-Authenticate: Digest` where `qop="auth,auth-int"` rather than mere `qop="auth"`. Having both `auth` and `auth-int` is legitimate according to the `qop-options` rule in §3.2.1 of [[https://www.ietf.org/rfc/rfc2617.txt|RFC 2617]]: > qop-options = "qop" "=" <"> 1#qop-value <"> > qop-value = "auth" | "auth-int" | token > **qop-options**: [...] If present, it is a quoted string **of one or more** tokens indicating the "quality of protection" values supported by the server. The value `"auth"` indicates authentication; the value `"auth-int"` indicates authentication with integrity protection This is description confirmed by the definition of the [//n//]`#`[//m//]//rule// extended-BNF pattern defined in §2.1 of [[https://www.ietf.org/rfc/rfc2616.txt|RFC 2616]] as 'a comma-separated list of //rule// with at least //n// and at most //m// items'. When this reply is parsed by `get_authorization`, request.py only tests for identity with `'auth'`, failing to recognize it as one of the supported modes the server announced, and claims that `"qop 'auth,auth-int' is not supported"`. * 📜🤖 Added by blurb_it. * bpo-38686 review fix: remember why. * fix trailing space in Lib/urllib/request.py Co-Authored-By: Brandt Bucher --- Lib/urllib/request.py | 6 ++++-- .../next/Library/2019-11-06-15-26-15.bpo-38686.HNFBce.rst | 1 + 2 files changed, 5 insertions(+), 2 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2019-11-06-15-26-15.bpo-38686.HNFBce.rst diff --git a/Lib/urllib/request.py b/Lib/urllib/request.py index ebc41184f83..39553d809a3 100644 --- a/Lib/urllib/request.py +++ b/Lib/urllib/request.py @@ -1136,7 +1136,9 @@ class AbstractDigestAuthHandler: A2 = "%s:%s" % (req.get_method(), # XXX selector: what about proxies and full urls req.selector) - if qop == 'auth': + # NOTE: As per RFC 2617, when server sends "auth,auth-int", the client could use either `auth` + # or `auth-int` to the response back. we use `auth` to send the response back. + if 'auth' in qop.split(','): if nonce == self.last_nonce: self.nonce_count += 1 else: @@ -1144,7 +1146,7 @@ class AbstractDigestAuthHandler: self.last_nonce = nonce ncvalue = '%08x' % self.nonce_count cnonce = self.get_cnonce(nonce) - noncebit = "%s:%s:%s:%s:%s" % (nonce, ncvalue, cnonce, qop, H(A2)) + noncebit = "%s:%s:%s:%s:%s" % (nonce, ncvalue, cnonce, 'auth', H(A2)) respdig = KD(H(A1), noncebit) elif qop is None: respdig = KD(H(A1), "%s:%s" % (nonce, H(A2))) diff --git a/Misc/NEWS.d/next/Library/2019-11-06-15-26-15.bpo-38686.HNFBce.rst b/Misc/NEWS.d/next/Library/2019-11-06-15-26-15.bpo-38686.HNFBce.rst new file mode 100644 index 00000000000..7a419ff1e33 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-11-06-15-26-15.bpo-38686.HNFBce.rst @@ -0,0 +1 @@ +Added support for multiple ``qop`` values in :class:`urllib.request.AbstractDigestAuthHandler`. \ No newline at end of file From d68b592dd67cb87c4fa862a8d3b3fd0a7d05e113 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Sat, 23 Nov 2019 02:30:32 +0100 Subject: [PATCH 024/115] bpo-38896: Remove PyUnicode_ClearFreeList() function (GH-17354) Remove PyUnicode_ClearFreeList() function: the Unicode free list has been removed in Python 3.3. --- Doc/c-api/unicode.rst | 5 ----- Doc/whatsnew/3.9.rst | 4 ++++ Include/unicodeobject.h | 11 ----------- .../C API/2019-11-22-19-43-43.bpo-38896.6wvNMJ.rst | 2 ++ Modules/gcmodule.c | 1 - Objects/unicodeobject.c | 9 --------- PC/python3.def | 1 - 7 files changed, 6 insertions(+), 27 deletions(-) create mode 100644 Misc/NEWS.d/next/C API/2019-11-22-19-43-43.bpo-38896.6wvNMJ.rst diff --git a/Doc/c-api/unicode.rst b/Doc/c-api/unicode.rst index 2bf4a0f56bc..77f123cf1f2 100644 --- a/Doc/c-api/unicode.rst +++ b/Doc/c-api/unicode.rst @@ -197,11 +197,6 @@ access internal read-only data of Unicode objects: .. versionadded:: 3.3 -.. c:function:: int PyUnicode_ClearFreeList() - - Clear the free list. Return the total number of freed items. - - .. c:function:: Py_ssize_t PyUnicode_GET_SIZE(PyObject *o) Return the size of the deprecated :c:type:`Py_UNICODE` representation, in diff --git a/Doc/whatsnew/3.9.rst b/Doc/whatsnew/3.9.rst index 281173edb89..a3ad98d0206 100644 --- a/Doc/whatsnew/3.9.rst +++ b/Doc/whatsnew/3.9.rst @@ -235,6 +235,10 @@ Build and C API Changes functions: the free lists of bound method objects have been removed. (Contributed by Inada Naoki and Victor Stinner in :issue:`37340`.) +* Remove ``PyUnicode_ClearFreeList()`` function: the Unicode free list has been + removed in Python 3.3. + (Contributed by Victor Stinner in :issue:`38896`.) + Deprecated ========== diff --git a/Include/unicodeobject.h b/Include/unicodeobject.h index 97d8cd12f6d..4dea4942181 100644 --- a/Include/unicodeobject.h +++ b/Include/unicodeobject.h @@ -328,17 +328,6 @@ PyAPI_FUNC(wchar_t*) PyUnicode_AsWideCharString( PyAPI_FUNC(PyObject*) PyUnicode_FromOrdinal(int ordinal); -/* --- Free-list management ----------------------------------------------- */ - -/* Clear the free list used by the Unicode implementation. - - This can be used to release memory used for objects on the free - list back to the Python memory allocator. - -*/ - -PyAPI_FUNC(int) PyUnicode_ClearFreeList(void); - /* === Builtin Codecs ===================================================== Many of these APIs take two arguments encoding and errors. These diff --git a/Misc/NEWS.d/next/C API/2019-11-22-19-43-43.bpo-38896.6wvNMJ.rst b/Misc/NEWS.d/next/C API/2019-11-22-19-43-43.bpo-38896.6wvNMJ.rst new file mode 100644 index 00000000000..c5e108d7693 --- /dev/null +++ b/Misc/NEWS.d/next/C API/2019-11-22-19-43-43.bpo-38896.6wvNMJ.rst @@ -0,0 +1,2 @@ +Remove ``PyUnicode_ClearFreeList()`` function: the Unicode free list has +been removed in Python 3.3. diff --git a/Modules/gcmodule.c b/Modules/gcmodule.c index d232179a11c..64afe831c84 100644 --- a/Modules/gcmodule.c +++ b/Modules/gcmodule.c @@ -1031,7 +1031,6 @@ clear_freelists(void) { (void)PyFrame_ClearFreeList(); (void)PyTuple_ClearFreeList(); - (void)PyUnicode_ClearFreeList(); (void)PyFloat_ClearFreeList(); (void)PyList_ClearFreeList(); (void)PyDict_ClearFreeList(); diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c index 89e45d01e37..77760195b32 100644 --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -15332,14 +15332,6 @@ _PyUnicode_Init(void) return _PyStatus_OK(); } -/* Finalize the Unicode implementation */ - -int -PyUnicode_ClearFreeList(void) -{ - return 0; -} - void PyUnicode_InternInPlace(PyObject **p) @@ -15951,7 +15943,6 @@ _PyUnicode_Fini(PyThreadState *tstate) Py_CLEAR(unicode_latin1[i]); } _PyUnicode_ClearStaticStrings(); - (void)PyUnicode_ClearFreeList(); } PyInterpreterState *interp = _PyInterpreterState_GET_UNSAFE(); diff --git a/PC/python3.def b/PC/python3.def index 1f355bffc9b..4689b777a69 100644 --- a/PC/python3.def +++ b/PC/python3.def @@ -649,7 +649,6 @@ EXPORTS PyUnicode_AsWideChar=python39.PyUnicode_AsWideChar PyUnicode_AsWideCharString=python39.PyUnicode_AsWideCharString PyUnicode_BuildEncodingMap=python39.PyUnicode_BuildEncodingMap - PyUnicode_ClearFreeList=python39.PyUnicode_ClearFreeList PyUnicode_Compare=python39.PyUnicode_Compare PyUnicode_CompareWithASCIIString=python39.PyUnicode_CompareWithASCIIString PyUnicode_Concat=python39.PyUnicode_Concat From 84b1ff65609c5910b4f838adbe1ead83baae7dbf Mon Sep 17 00:00:00 2001 From: Brett Cannon <54418+brettcannon@users.noreply.github.com> Date: Fri, 22 Nov 2019 23:32:27 -0800 Subject: [PATCH 025/115] bpo-38899: virtual environment activation for fish should use `source` (GH-17359) The previously documented use of `.` is considered deprecated (https://fishshell.com/docs/current/commands.html#source). https://bugs.python.org/issue38899 Automerge-Triggered-By: @brettcannon --- Doc/using/venv-create.inc | 2 +- Lib/venv/scripts/posix/activate.fish | 4 ++-- .../Documentation/2019-11-22-15-57-29.bpo-38899.4aYPW2.rst | 3 +++ 3 files changed, 6 insertions(+), 3 deletions(-) create mode 100644 Misc/NEWS.d/next/Documentation/2019-11-22-15-57-29.bpo-38899.4aYPW2.rst diff --git a/Doc/using/venv-create.inc b/Doc/using/venv-create.inc index cf5af437d6a..6c6617dc158 100644 --- a/Doc/using/venv-create.inc +++ b/Doc/using/venv-create.inc @@ -104,7 +104,7 @@ directory containing the virtual environment): +=============+=================+=========================================+ | POSIX | bash/zsh | $ source /bin/activate | +-------------+-----------------+-----------------------------------------+ -| | fish | $ . /bin/activate.fish | +| | fish | $ source /bin/activate.fish | +-------------+-----------------+-----------------------------------------+ | | csh/tcsh | $ source /bin/activate.csh | +-------------+-----------------+-----------------------------------------+ diff --git a/Lib/venv/scripts/posix/activate.fish b/Lib/venv/scripts/posix/activate.fish index 777d51cb69b..d213b9060a6 100644 --- a/Lib/venv/scripts/posix/activate.fish +++ b/Lib/venv/scripts/posix/activate.fish @@ -1,5 +1,5 @@ -# This file must be used with ". bin/activate.fish" *from fish* (http://fishshell.org); -# you cannot run it directly. +# This file must be used with "source /bin/activate.fish" *from fish* +# (http://fishshell.org); you cannot run it directly. function deactivate -d "Exit virtualenv and return to normal shell environment" # reset old environment variables diff --git a/Misc/NEWS.d/next/Documentation/2019-11-22-15-57-29.bpo-38899.4aYPW2.rst b/Misc/NEWS.d/next/Documentation/2019-11-22-15-57-29.bpo-38899.4aYPW2.rst new file mode 100644 index 00000000000..4ee178bfb1b --- /dev/null +++ b/Misc/NEWS.d/next/Documentation/2019-11-22-15-57-29.bpo-38899.4aYPW2.rst @@ -0,0 +1,3 @@ +Update documentation to state that to activate virtual environments under +fish one should use `source`, not `.` as documented at +https://fishshell.com/docs/current/commands.html#source. From 041d8b48a2e59fa642b2c5124d78086baf74e339 Mon Sep 17 00:00:00 2001 From: Raymond Hettinger Date: Sat, 23 Nov 2019 02:22:13 -0800 Subject: [PATCH 026/115] bpo-38881: choices() raises ValueError when all weights are zero (GH-17362) --- Doc/library/random.rst | 8 ++++++-- Lib/random.py | 4 +++- Lib/test/test_random.py | 5 +++++ .../next/Library/2019-11-22-20-03-46.bpo-38881.7HV1Q0.rst | 1 + 4 files changed, 15 insertions(+), 3 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2019-11-22-20-03-46.bpo-38881.7HV1Q0.rst diff --git a/Doc/library/random.rst b/Doc/library/random.rst index 1bd1856937b..933da3f8fcf 100644 --- a/Doc/library/random.rst +++ b/Doc/library/random.rst @@ -165,8 +165,9 @@ Functions for sequences The *weights* or *cum_weights* can use any numeric type that interoperates with the :class:`float` values returned by :func:`random` (that includes - integers, floats, and fractions but excludes decimals). Weights are - assumed to be non-negative. + integers, floats, and fractions but excludes decimals). Behavior is + undefined if any weight is negative. A :exc:`ValueError` is raised if all + weights are zero. For a given seed, the :func:`choices` function with equal weighting typically produces a different sequence than repeated calls to @@ -177,6 +178,9 @@ Functions for sequences .. versionadded:: 3.6 + .. versionchanged:: 3.9 + Raises a :exc:`ValueError` if all weights are zero. + .. function:: shuffle(x[, random]) diff --git a/Lib/random.py b/Lib/random.py index be4401c554d..e24737d4508 100644 --- a/Lib/random.py +++ b/Lib/random.py @@ -413,8 +413,10 @@ class Random(_random.Random): raise TypeError('Cannot specify both weights and cumulative weights') if len(cum_weights) != n: raise ValueError('The number of weights does not match the population') - bisect = _bisect total = cum_weights[-1] + 0.0 # convert to float + if total <= 0.0: + raise ValueError('Total of weights must be greater than zero') + bisect = _bisect hi = n - 1 return [population[bisect(cum_weights, random() * total, 0, hi)] for i in _repeat(None, k)] diff --git a/Lib/test/test_random.py b/Lib/test/test_random.py index f59c5652b5d..2c8c8e88545 100644 --- a/Lib/test/test_random.py +++ b/Lib/test/test_random.py @@ -241,6 +241,11 @@ class TestBasicOps: choices = self.gen.choices choices(population=[1, 2], weights=[1e-323, 1e-323], k=5000) + def test_choices_with_all_zero_weights(self): + # See issue #38881 + with self.assertRaises(ValueError): + self.gen.choices('AB', [0.0, 0.0]) + def test_gauss(self): # Ensure that the seed() method initializes all the hidden state. In # particular, through 2.2.1 it failed to reset a piece of state used diff --git a/Misc/NEWS.d/next/Library/2019-11-22-20-03-46.bpo-38881.7HV1Q0.rst b/Misc/NEWS.d/next/Library/2019-11-22-20-03-46.bpo-38881.7HV1Q0.rst new file mode 100644 index 00000000000..9f4a27db452 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-11-22-20-03-46.bpo-38881.7HV1Q0.rst @@ -0,0 +1 @@ +random.choices() now raises a ValueError when all the weights are zero. From 665ad3dfa9993b9a4000b097ddead4e292590e8c Mon Sep 17 00:00:00 2001 From: Zac Hatfield-Dodds Date: Sun, 24 Nov 2019 21:48:48 +1100 Subject: [PATCH 027/115] Better runtime TypedDict (GH-17214) This patch enables downstream projects inspecting a TypedDict subclass at runtime to tell which keys are optional. This is essential for generating test data with Hypothesis or validating inputs with typeguard or pydantic. --- Lib/test/test_typing.py | 7 +++++++ Lib/typing.py | 18 +++++++++++++++--- .../2019-11-18-17-08-23.bpo-38834.abcdef.rst | 3 +++ 3 files changed, 25 insertions(+), 3 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2019-11-18-17-08-23.bpo-38834.abcdef.rst diff --git a/Lib/test/test_typing.py b/Lib/test/test_typing.py index ccd617c1fdf..5b4916f9c32 100644 --- a/Lib/test/test_typing.py +++ b/Lib/test/test_typing.py @@ -3741,6 +3741,13 @@ class TypedDictTests(BaseTestCase): self.assertEqual(Options(log_level=2), {'log_level': 2}) self.assertEqual(Options.__total__, False) + def test_optional_keys(self): + class Point2Dor3D(Point2D, total=False): + z: int + + assert Point2Dor3D.__required_keys__ == frozenset(['x', 'y']) + assert Point2Dor3D.__optional_keys__ == frozenset(['z']) + class IOTests(BaseTestCase): diff --git a/Lib/typing.py b/Lib/typing.py index 5523ee01e1f..7de3e346eaa 100644 --- a/Lib/typing.py +++ b/Lib/typing.py @@ -1715,9 +1715,20 @@ class _TypedDictMeta(type): anns = ns.get('__annotations__', {}) msg = "TypedDict('Name', {f0: t0, f1: t1, ...}); each t must be a type" anns = {n: _type_check(tp, msg) for n, tp in anns.items()} + required = set(anns if total else ()) + optional = set(() if total else anns) + for base in bases: - anns.update(base.__dict__.get('__annotations__', {})) + base_anns = base.__dict__.get('__annotations__', {}) + anns.update(base_anns) + if getattr(base, '__total__', True): + required.update(base_anns) + else: + optional.update(base_anns) + tp_dict.__annotations__ = anns + tp_dict.__required_keys__ = frozenset(required) + tp_dict.__optional_keys__ = frozenset(optional) if not hasattr(tp_dict, '__total__'): tp_dict.__total__ = total return tp_dict @@ -1744,8 +1755,9 @@ class TypedDict(dict, metaclass=_TypedDictMeta): assert Point2D(x=1, y=2, label='first') == dict(x=1, y=2, label='first') - The type info can be accessed via Point2D.__annotations__. TypedDict - supports two additional equivalent forms:: + The type info can be accessed via the Point2D.__annotations__ dict, and + the Point2D.__required_keys__ and Point2D.__optional_keys__ frozensets. + TypedDict supports two additional equivalent forms:: Point2D = TypedDict('Point2D', x=int, y=int, label=str) Point2D = TypedDict('Point2D', {'x': int, 'y': int, 'label': str}) diff --git a/Misc/NEWS.d/next/Library/2019-11-18-17-08-23.bpo-38834.abcdef.rst b/Misc/NEWS.d/next/Library/2019-11-18-17-08-23.bpo-38834.abcdef.rst new file mode 100644 index 00000000000..af108b1efbc --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-11-18-17-08-23.bpo-38834.abcdef.rst @@ -0,0 +1,3 @@ +:class:`typing.TypedDict` subclasses now track which keys are optional using +the ``__required_keys__`` and ``__optional_keys__`` attributes, to enable +runtime validation by downstream projects. Patch by Zac Hatfield-Dodds. From e407646b741db6851789963e525a1f5daad0a336 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Batuhan=20Ta=C5=9Fkaya?= <47358913+isidentical@users.noreply.github.com> Date: Sun, 24 Nov 2019 19:46:18 +0300 Subject: [PATCH 028/115] Remove unnecessary variable definition (GH-17368) --- Lib/inspect.py | 1 - 1 file changed, 1 deletion(-) diff --git a/Lib/inspect.py b/Lib/inspect.py index 3ff395ca333..608ca955116 100644 --- a/Lib/inspect.py +++ b/Lib/inspect.py @@ -1136,7 +1136,6 @@ def getfullargspec(func): varkw = None posonlyargs = [] kwonlyargs = [] - defaults = () annotations = {} defaults = () kwdefaults = {} From 6f03b236c17c96bc9f8a004ffa7e7ae0542e9cac Mon Sep 17 00:00:00 2001 From: Claudiu Popa Date: Sun, 24 Nov 2019 20:15:08 +0100 Subject: [PATCH 029/115] bpo-38876: Raise pickle.UnpicklingError when loading an item from memo for invalid input (GH-17335) The previous code was raising a `KeyError` for both the Python and C implementation. This was caused by the specified index of an invalid input which did not exist in the memo structure, where the pickle stores what objects it has seen. The malformed input would have caused either a `BINGET` or `LONG_BINGET` load from the memo, leading to a `KeyError` as the determined index was bogus. https://bugs.python.org/issue38876 https://bugs.python.org/issue38876 --- Lib/pickle.py | 18 +++++++++++++++--- Lib/test/pickletester.py | 4 +++- .../2019-11-22-10-58-58.bpo-38876.qqy1Vp.rst | 9 +++++++++ Modules/_pickle.c | 12 ++++++++---- 4 files changed, 35 insertions(+), 8 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2019-11-22-10-58-58.bpo-38876.qqy1Vp.rst diff --git a/Lib/pickle.py b/Lib/pickle.py index 71aa57d500e..01d41422aa4 100644 --- a/Lib/pickle.py +++ b/Lib/pickle.py @@ -1604,17 +1604,29 @@ class _Unpickler: def load_get(self): i = int(self.readline()[:-1]) - self.append(self.memo[i]) + try: + self.append(self.memo[i]) + except KeyError: + msg = f'Memo value not found at index {i}' + raise UnpicklingError(msg) from None dispatch[GET[0]] = load_get def load_binget(self): i = self.read(1)[0] - self.append(self.memo[i]) + try: + self.append(self.memo[i]) + except KeyError as exc: + msg = f'Memo value not found at index {i}' + raise UnpicklingError(msg) from None dispatch[BINGET[0]] = load_binget def load_long_binget(self): i, = unpack('UnpicklingError, "Memo value not found at index %ld", idx); + } Py_DECREF(key); return -1; } @@ -6201,7 +6203,8 @@ load_binget(UnpicklerObject *self) if (value == NULL) { PyObject *key = PyLong_FromSsize_t(idx); if (key != NULL) { - PyErr_SetObject(PyExc_KeyError, key); + PickleState *st = _Pickle_GetGlobalState(); + PyErr_Format(st->UnpicklingError, "Memo value not found at index %ld", idx); Py_DECREF(key); } return -1; @@ -6227,7 +6230,8 @@ load_long_binget(UnpicklerObject *self) if (value == NULL) { PyObject *key = PyLong_FromSsize_t(idx); if (key != NULL) { - PyErr_SetObject(PyExc_KeyError, key); + PickleState *st = _Pickle_GetGlobalState(); + PyErr_Format(st->UnpicklingError, "Memo value not found at index %ld", idx); Py_DECREF(key); } return -1; From 6bf644ec82f14cceae68278dc35bafb00875efae Mon Sep 17 00:00:00 2001 From: Terry Jan Reedy Date: Sun, 24 Nov 2019 16:29:29 -0500 Subject: [PATCH 030/115] bpo-38862: IDLE Strip Trailing Whitespace fixes end newlines (GH-17366) Extra newlines are removed at the end of non-shell files. If the file only has newlines after stripping other trailing whitespace, all are removed, as is done by patchcheck.py. --- Doc/library/idle.rst | 3 +- Lib/idlelib/NEWS.txt | 3 + Lib/idlelib/format.py | 10 ++++ Lib/idlelib/help.html | 25 ++++---- Lib/idlelib/idle_test/mock_idle.py | 5 +- Lib/idlelib/idle_test/test_format.py | 60 +++++++++++-------- .../2019-11-23-21-50-57.bpo-38862.KQ9A0m.rst | 2 + 7 files changed, 68 insertions(+), 40 deletions(-) create mode 100644 Misc/NEWS.d/next/IDLE/2019-11-23-21-50-57.bpo-38862.KQ9A0m.rst diff --git a/Doc/library/idle.rst b/Doc/library/idle.rst index 0bd248c22b1..273b5830e42 100644 --- a/Doc/library/idle.rst +++ b/Doc/library/idle.rst @@ -199,7 +199,8 @@ Format Paragraph Strip trailing whitespace Remove trailing space and other whitespace characters after the last non-whitespace character of a line by applying str.rstrip to each line, - including lines within multiline strings. + including lines within multiline strings. Except for Shell windows, + remove extra newlines at the end of the file. .. index:: single: Run script diff --git a/Lib/idlelib/NEWS.txt b/Lib/idlelib/NEWS.txt index c6aa00d0d54..5eb77398d95 100644 --- a/Lib/idlelib/NEWS.txt +++ b/Lib/idlelib/NEWS.txt @@ -3,6 +3,9 @@ Released on 2020-10-05? ====================================== +bpo-38862: 'Strip Trailing Whitespace' on the Format menu removes extra +newlines at the end of non-shell files. + bpo-38636: Fix IDLE Format menu tab toggle and file indent width. These functions (default shortcuts Alt-T and Alt-U) were mistakenly disabled in 3.7.5 and 3.8.0. diff --git a/Lib/idlelib/format.py b/Lib/idlelib/format.py index 2b098056573..4b57a182c9a 100644 --- a/Lib/idlelib/format.py +++ b/Lib/idlelib/format.py @@ -408,6 +408,16 @@ class Rstrip: # 'Strip Trailing Whitespace" on "Format" menu. if cut < raw: text.delete('%i.%i' % (cur, cut), '%i.end' % cur) + if (text.get('end-2c') == '\n' # File ends with at least 1 newline; + and not hasattr(self.editwin, 'interp')): # & is not Shell. + # Delete extra user endlines. + while (text.index('end-1c') > '1.0' # Stop if file empty. + and text.get('end-3c') == '\n'): + text.delete('end-3c') + # Because tk indexes are slice indexes and never raise, + # a file with only newlines will be emptied. + # patchcheck.py does the same. + undo.undo_block_stop() diff --git a/Lib/idlelib/help.html b/Lib/idlelib/help.html index 0754f2453ba..09dc4c57bcd 100644 --- a/Lib/idlelib/help.html +++ b/Lib/idlelib/help.html @@ -4,7 +4,7 @@ - IDLE — Python 3.9.0a0 documentation + IDLE — Python 3.9.0a1 documentation @@ -17,14 +17,14 @@ - + @@ -62,7 +62,7 @@ next |
  • - previous |
  • - 3.9.0a0 Documentation » + 3.9.0a1 Documentation »
  • @@ -240,7 +240,8 @@ paragraph will be formatted to less than N columns, where N defaults to 72.

    Strip trailing whitespace

    Remove trailing space and other whitespace characters after the last non-whitespace character of a line by applying str.rstrip to each line, -including lines within multiline strings.

    +including lines within multiline strings. Except for Shell windows, +remove extra newlines at the end of the file.

    @@ -886,8 +887,8 @@ also used for testing.

    Previous topic

    -

    tkinter.scrolledtext — Scrolled Text Widget

    +

    tkinter.tix — Extension widgets for Tk

    Next topic

    Other Graphical User Interface Packages

    @@ -919,7 +920,7 @@ also used for testing.

    next |
  • - previous |
  • - 3.9.0a0 Documentation » + 3.9.0a1 Documentation »
  • @@ -959,11 +960,11 @@ also used for testing.



    - Last updated on Sep 01, 2019. + Last updated on Nov 24, 2019. Found a bug?
    - Created using Sphinx 2.1.2. + Created using Sphinx 2.1.1. diff --git a/Lib/idlelib/idle_test/mock_idle.py b/Lib/idlelib/idle_test/mock_idle.py index f279a52fd51..71fa480ce4d 100644 --- a/Lib/idlelib/idle_test/mock_idle.py +++ b/Lib/idlelib/idle_test/mock_idle.py @@ -40,8 +40,9 @@ class Func: class Editor: '''Minimally imitate editor.EditorWindow class. ''' - def __init__(self, flist=None, filename=None, key=None, root=None): - self.text = Text() + def __init__(self, flist=None, filename=None, key=None, root=None, + text=None): # Allow real Text with mock Editor. + self.text = text or Text() self.undo = UndoDelegator() def get_selection_indices(self): diff --git a/Lib/idlelib/idle_test/test_format.py b/Lib/idlelib/idle_test/test_format.py index 20b5970f498..a79bb515089 100644 --- a/Lib/idlelib/idle_test/test_format.py +++ b/Lib/idlelib/idle_test/test_format.py @@ -611,37 +611,33 @@ class IndentsTest(unittest.TestCase): class RstripTest(unittest.TestCase): - def test_rstrip_line(self): - editor = MockEditor() - text = editor.text - do_rstrip = ft.Rstrip(editor).do_rstrip - eq = self.assertEqual + @classmethod + def setUpClass(cls): + requires('gui') + cls.root = Tk() + cls.root.withdraw() + cls.text = Text(cls.root) + cls.editor = MockEditor(text=cls.text) + cls.do_rstrip = ft.Rstrip(cls.editor).do_rstrip - do_rstrip() - eq(text.get('1.0', 'insert'), '') - text.insert('1.0', ' ') - do_rstrip() - eq(text.get('1.0', 'insert'), '') - text.insert('1.0', ' \n') - do_rstrip() - eq(text.get('1.0', 'insert'), '\n') + @classmethod + def tearDownClass(cls): + del cls.text, cls.do_rstrip, cls.editor + cls.root.update_idletasks() + cls.root.destroy() + del cls.root - def test_rstrip_multiple(self): - editor = MockEditor() - # Comment above, uncomment 3 below to test with real Editor & Text. - #from idlelib.editor import EditorWindow as Editor - #from tkinter import Tk - #editor = Editor(root=Tk()) - text = editor.text - do_rstrip = ft.Rstrip(editor).do_rstrip + def tearDown(self): + self.text.delete('1.0', 'end-1c') + def test_rstrip_lines(self): original = ( "Line with an ending tab \n" "Line ending in 5 spaces \n" "Linewithnospaces\n" " indented line\n" " indented line with trailing space \n" - " ") + " \n") stripped = ( "Line with an ending tab\n" "Line ending in 5 spaces\n" @@ -649,9 +645,23 @@ class RstripTest(unittest.TestCase): " indented line\n" " indented line with trailing space\n") - text.insert('1.0', original) - do_rstrip() - self.assertEqual(text.get('1.0', 'insert'), stripped) + self.text.insert('1.0', original) + self.do_rstrip() + self.assertEqual(self.text.get('1.0', 'insert'), stripped) + + def test_rstrip_end(self): + text = self.text + for code in ('', '\n', '\n\n\n'): + with self.subTest(code=code): + text.insert('1.0', code) + self.do_rstrip() + self.assertEqual(text.get('1.0','end-1c'), '') + for code in ('a\n', 'a\n\n', 'a\n\n\n'): + with self.subTest(code=code): + text.delete('1.0', 'end-1c') + text.insert('1.0', code) + self.do_rstrip() + self.assertEqual(text.get('1.0','end-1c'), 'a\n') if __name__ == '__main__': diff --git a/Misc/NEWS.d/next/IDLE/2019-11-23-21-50-57.bpo-38862.KQ9A0m.rst b/Misc/NEWS.d/next/IDLE/2019-11-23-21-50-57.bpo-38862.KQ9A0m.rst new file mode 100644 index 00000000000..14bab9e854b --- /dev/null +++ b/Misc/NEWS.d/next/IDLE/2019-11-23-21-50-57.bpo-38862.KQ9A0m.rst @@ -0,0 +1,2 @@ +'Strip Trailing Whitespace' on the Format menu removes extra newlines +at the end of non-shell files. From 27fc3b6f3fc49a36d3f962caac5c5495696d12ed Mon Sep 17 00:00:00 2001 From: Pablo Galindo Date: Sun, 24 Nov 2019 23:02:40 +0000 Subject: [PATCH 031/115] bpo-38870: Expose a function to unparse an ast object in the ast module (GH-17302) Add ast.unparse() as a function in the ast module that can be used to unparse an ast.AST object and produce a string with code that would produce an equivalent ast.AST object when parsed. --- Doc/library/ast.rst | 13 + Doc/whatsnew/3.9.rst | 5 + Lib/ast.py | 693 +++++++++++++++++ Lib/test/{test_tools => }/test_unparse.py | 104 +-- .../2019-11-20-22-43-48.bpo-38870.rLVZEv.rst | 4 + Tools/parser/unparse.py | 704 ------------------ 6 files changed, 772 insertions(+), 751 deletions(-) rename Lib/test/{test_tools => }/test_unparse.py (76%) create mode 100644 Misc/NEWS.d/next/Library/2019-11-20-22-43-48.bpo-38870.rLVZEv.rst delete mode 100644 Tools/parser/unparse.py diff --git a/Doc/library/ast.rst b/Doc/library/ast.rst index b468f4235df..a7e0729b902 100644 --- a/Doc/library/ast.rst +++ b/Doc/library/ast.rst @@ -161,6 +161,19 @@ and classes for traversing abstract syntax trees: Added ``type_comments``, ``mode='func_type'`` and ``feature_version``. +.. function:: unparse(ast_obj) + + Unparse an :class:`ast.AST` object and generate a string with code + that would produce an equivalent :class:`ast.AST` object if parsed + back with :func:`ast.parse`. + + .. warning:: + The produced code string will not necesarily be equal to the original + code that generated the :class:`ast.AST` object. + + .. versionadded:: 3.9 + + .. function:: literal_eval(node_or_string) Safely evaluate an expression node or a string containing a Python literal or diff --git a/Doc/whatsnew/3.9.rst b/Doc/whatsnew/3.9.rst index a3ad98d0206..9af5259de95 100644 --- a/Doc/whatsnew/3.9.rst +++ b/Doc/whatsnew/3.9.rst @@ -121,6 +121,11 @@ Added the *indent* option to :func:`~ast.dump` which allows it to produce a multiline indented output. (Contributed by Serhiy Storchaka in :issue:`37995`.) +Added the :func:`ast.unparse` as a function in the :mod:`ast` module that can +be used to unparse an :class:`ast.AST` object and produce a string with code +that would produce an equivalent :class:`ast.AST` object when parsed. +(Contributed by Pablo Galindo and Batuhan Taskaya in :issue:`38870`.) + asyncio ------- diff --git a/Lib/ast.py b/Lib/ast.py index 720dd48a761..97914ebc668 100644 --- a/Lib/ast.py +++ b/Lib/ast.py @@ -24,7 +24,9 @@ :copyright: Copyright 2008 by Armin Ronacher. :license: Python License. """ +import sys from _ast import * +from contextlib import contextmanager def parse(source, filename='', mode='exec', *, @@ -551,6 +553,697 @@ _const_node_type_names = { type(...): 'Ellipsis', } +# Large float and imaginary literals get turned into infinities in the AST. +# We unparse those infinities to INFSTR. +_INFSTR = "1e" + repr(sys.float_info.max_10_exp + 1) + +class _Unparser(NodeVisitor): + """Methods in this class recursively traverse an AST and + output source code for the abstract syntax; original formatting + is disregarded.""" + + def __init__(self): + self._source = [] + self._buffer = [] + self._indent = 0 + + def interleave(self, inter, f, seq): + """Call f on each item in seq, calling inter() in between.""" + seq = iter(seq) + try: + f(next(seq)) + except StopIteration: + pass + else: + for x in seq: + inter() + f(x) + + def fill(self, text=""): + """Indent a piece of text and append it, according to the current + indentation level""" + self.write("\n" + " " * self._indent + text) + + def write(self, text): + """Append a piece of text""" + self._source.append(text) + + def buffer_writer(self, text): + self._buffer.append(text) + + @property + def buffer(self): + value = "".join(self._buffer) + self._buffer.clear() + return value + + @contextmanager + def block(self): + """A context manager for preparing the source for blocks. It adds + the character':', increases the indentation on enter and decreases + the indentation on exit.""" + self.write(":") + self._indent += 1 + yield + self._indent -= 1 + + def traverse(self, node): + if isinstance(node, list): + for item in node: + self.traverse(item) + else: + super().visit(node) + + def visit(self, node): + """Outputs a source code string that, if converted back to an ast + (using ast.parse) will generate an AST equivalent to *node*""" + self._source = [] + self.traverse(node) + return "".join(self._source) + + def visit_Module(self, node): + for subnode in node.body: + self.traverse(subnode) + + def visit_Expr(self, node): + self.fill() + self.traverse(node.value) + + def visit_NamedExpr(self, node): + self.write("(") + self.traverse(node.target) + self.write(" := ") + self.traverse(node.value) + self.write(")") + + def visit_Import(self, node): + self.fill("import ") + self.interleave(lambda: self.write(", "), self.traverse, node.names) + + def visit_ImportFrom(self, node): + self.fill("from ") + self.write("." * node.level) + if node.module: + self.write(node.module) + self.write(" import ") + self.interleave(lambda: self.write(", "), self.traverse, node.names) + + def visit_Assign(self, node): + self.fill() + for target in node.targets: + self.traverse(target) + self.write(" = ") + self.traverse(node.value) + + def visit_AugAssign(self, node): + self.fill() + self.traverse(node.target) + self.write(" " + self.binop[node.op.__class__.__name__] + "= ") + self.traverse(node.value) + + def visit_AnnAssign(self, node): + self.fill() + if not node.simple and isinstance(node.target, Name): + self.write("(") + self.traverse(node.target) + if not node.simple and isinstance(node.target, Name): + self.write(")") + self.write(": ") + self.traverse(node.annotation) + if node.value: + self.write(" = ") + self.traverse(node.value) + + def visit_Return(self, node): + self.fill("return") + if node.value: + self.write(" ") + self.traverse(node.value) + + def visit_Pass(self, node): + self.fill("pass") + + def visit_Break(self, node): + self.fill("break") + + def visit_Continue(self, node): + self.fill("continue") + + def visit_Delete(self, node): + self.fill("del ") + self.interleave(lambda: self.write(", "), self.traverse, node.targets) + + def visit_Assert(self, node): + self.fill("assert ") + self.traverse(node.test) + if node.msg: + self.write(", ") + self.traverse(node.msg) + + def visit_Global(self, node): + self.fill("global ") + self.interleave(lambda: self.write(", "), self.write, node.names) + + def visit_Nonlocal(self, node): + self.fill("nonlocal ") + self.interleave(lambda: self.write(", "), self.write, node.names) + + def visit_Await(self, node): + self.write("(") + self.write("await") + if node.value: + self.write(" ") + self.traverse(node.value) + self.write(")") + + def visit_Yield(self, node): + self.write("(") + self.write("yield") + if node.value: + self.write(" ") + self.traverse(node.value) + self.write(")") + + def visit_YieldFrom(self, node): + self.write("(") + self.write("yield from") + if node.value: + self.write(" ") + self.traverse(node.value) + self.write(")") + + def visit_Raise(self, node): + self.fill("raise") + if not node.exc: + if node.cause: + raise ValueError(f"Node can't use cause without an exception.") + return + self.write(" ") + self.traverse(node.exc) + if node.cause: + self.write(" from ") + self.traverse(node.cause) + + def visit_Try(self, node): + self.fill("try") + with self.block(): + self.traverse(node.body) + for ex in node.handlers: + self.traverse(ex) + if node.orelse: + self.fill("else") + with self.block(): + self.traverse(node.orelse) + if node.finalbody: + self.fill("finally") + with self.block(): + self.traverse(node.finalbody) + + def visit_ExceptHandler(self, node): + self.fill("except") + if node.type: + self.write(" ") + self.traverse(node.type) + if node.name: + self.write(" as ") + self.write(node.name) + with self.block(): + self.traverse(node.body) + + def visit_ClassDef(self, node): + self.write("\n") + for deco in node.decorator_list: + self.fill("@") + self.traverse(deco) + self.fill("class " + node.name) + self.write("(") + comma = False + for e in node.bases: + if comma: + self.write(", ") + else: + comma = True + self.traverse(e) + for e in node.keywords: + if comma: + self.write(", ") + else: + comma = True + self.traverse(e) + self.write(")") + + with self.block(): + self.traverse(node.body) + + def visit_FunctionDef(self, node): + self.__FunctionDef_helper(node, "def") + + def visit_AsyncFunctionDef(self, node): + self.__FunctionDef_helper(node, "async def") + + def __FunctionDef_helper(self, node, fill_suffix): + self.write("\n") + for deco in node.decorator_list: + self.fill("@") + self.traverse(deco) + def_str = fill_suffix + " " + node.name + "(" + self.fill(def_str) + self.traverse(node.args) + self.write(")") + if node.returns: + self.write(" -> ") + self.traverse(node.returns) + with self.block(): + self.traverse(node.body) + + def visit_For(self, node): + self.__For_helper("for ", node) + + def visit_AsyncFor(self, node): + self.__For_helper("async for ", node) + + def __For_helper(self, fill, node): + self.fill(fill) + self.traverse(node.target) + self.write(" in ") + self.traverse(node.iter) + with self.block(): + self.traverse(node.body) + if node.orelse: + self.fill("else") + with self.block(): + self.traverse(node.orelse) + + def visit_If(self, node): + self.fill("if ") + self.traverse(node.test) + with self.block(): + self.traverse(node.body) + # collapse nested ifs into equivalent elifs. + while node.orelse and len(node.orelse) == 1 and isinstance(node.orelse[0], If): + node = node.orelse[0] + self.fill("elif ") + self.traverse(node.test) + with self.block(): + self.traverse(node.body) + # final else + if node.orelse: + self.fill("else") + with self.block(): + self.traverse(node.orelse) + + def visit_While(self, node): + self.fill("while ") + self.traverse(node.test) + with self.block(): + self.traverse(node.body) + if node.orelse: + self.fill("else") + with self.block(): + self.traverse(node.orelse) + + def visit_With(self, node): + self.fill("with ") + self.interleave(lambda: self.write(", "), self.traverse, node.items) + with self.block(): + self.traverse(node.body) + + def visit_AsyncWith(self, node): + self.fill("async with ") + self.interleave(lambda: self.write(", "), self.traverse, node.items) + with self.block(): + self.traverse(node.body) + + def visit_JoinedStr(self, node): + self.write("f") + self._fstring_JoinedStr(node, self.buffer_writer) + self.write(repr(self.buffer)) + + def visit_FormattedValue(self, node): + self.write("f") + self._fstring_FormattedValue(node, self.buffer_writer) + self.write(repr(self.buffer)) + + def _fstring_JoinedStr(self, node, write): + for value in node.values: + meth = getattr(self, "_fstring_" + type(value).__name__) + meth(value, write) + + def _fstring_Constant(self, node, write): + if not isinstance(node.value, str): + raise ValueError("Constants inside JoinedStr should be a string.") + value = node.value.replace("{", "{{").replace("}", "}}") + write(value) + + def _fstring_FormattedValue(self, node, write): + write("{") + expr = type(self)().visit(node.value).rstrip("\n") + if expr.startswith("{"): + write(" ") # Separate pair of opening brackets as "{ {" + write(expr) + if node.conversion != -1: + conversion = chr(node.conversion) + if conversion not in "sra": + raise ValueError("Unknown f-string conversion.") + write(f"!{conversion}") + if node.format_spec: + write(":") + meth = getattr(self, "_fstring_" + type(node.format_spec).__name__) + meth(node.format_spec, write) + write("}") + + def visit_Name(self, node): + self.write(node.id) + + def _write_constant(self, value): + if isinstance(value, (float, complex)): + # Substitute overflowing decimal literal for AST infinities. + self.write(repr(value).replace("inf", _INFSTR)) + else: + self.write(repr(value)) + + def visit_Constant(self, node): + value = node.value + if isinstance(value, tuple): + self.write("(") + if len(value) == 1: + self._write_constant(value[0]) + self.write(",") + else: + self.interleave(lambda: self.write(", "), self._write_constant, value) + self.write(")") + elif value is ...: + self.write("...") + else: + if node.kind == "u": + self.write("u") + self._write_constant(node.value) + + def visit_List(self, node): + self.write("[") + self.interleave(lambda: self.write(", "), self.traverse, node.elts) + self.write("]") + + def visit_ListComp(self, node): + self.write("[") + self.traverse(node.elt) + for gen in node.generators: + self.traverse(gen) + self.write("]") + + def visit_GeneratorExp(self, node): + self.write("(") + self.traverse(node.elt) + for gen in node.generators: + self.traverse(gen) + self.write(")") + + def visit_SetComp(self, node): + self.write("{") + self.traverse(node.elt) + for gen in node.generators: + self.traverse(gen) + self.write("}") + + def visit_DictComp(self, node): + self.write("{") + self.traverse(node.key) + self.write(": ") + self.traverse(node.value) + for gen in node.generators: + self.traverse(gen) + self.write("}") + + def visit_comprehension(self, node): + if node.is_async: + self.write(" async for ") + else: + self.write(" for ") + self.traverse(node.target) + self.write(" in ") + self.traverse(node.iter) + for if_clause in node.ifs: + self.write(" if ") + self.traverse(if_clause) + + def visit_IfExp(self, node): + self.write("(") + self.traverse(node.body) + self.write(" if ") + self.traverse(node.test) + self.write(" else ") + self.traverse(node.orelse) + self.write(")") + + def visit_Set(self, node): + if not node.elts: + raise ValueError("Set node should has at least one item") + self.write("{") + self.interleave(lambda: self.write(", "), self.traverse, node.elts) + self.write("}") + + def visit_Dict(self, node): + self.write("{") + + def write_key_value_pair(k, v): + self.traverse(k) + self.write(": ") + self.traverse(v) + + def write_item(item): + k, v = item + if k is None: + # for dictionary unpacking operator in dicts {**{'y': 2}} + # see PEP 448 for details + self.write("**") + self.traverse(v) + else: + write_key_value_pair(k, v) + + self.interleave( + lambda: self.write(", "), write_item, zip(node.keys, node.values) + ) + self.write("}") + + def visit_Tuple(self, node): + self.write("(") + if len(node.elts) == 1: + elt = node.elts[0] + self.traverse(elt) + self.write(",") + else: + self.interleave(lambda: self.write(", "), self.traverse, node.elts) + self.write(")") + + unop = {"Invert": "~", "Not": "not", "UAdd": "+", "USub": "-"} + + def visit_UnaryOp(self, node): + self.write("(") + self.write(self.unop[node.op.__class__.__name__]) + self.write(" ") + self.traverse(node.operand) + self.write(")") + + binop = { + "Add": "+", + "Sub": "-", + "Mult": "*", + "MatMult": "@", + "Div": "/", + "Mod": "%", + "LShift": "<<", + "RShift": ">>", + "BitOr": "|", + "BitXor": "^", + "BitAnd": "&", + "FloorDiv": "//", + "Pow": "**", + } + + def visit_BinOp(self, node): + self.write("(") + self.traverse(node.left) + self.write(" " + self.binop[node.op.__class__.__name__] + " ") + self.traverse(node.right) + self.write(")") + + cmpops = { + "Eq": "==", + "NotEq": "!=", + "Lt": "<", + "LtE": "<=", + "Gt": ">", + "GtE": ">=", + "Is": "is", + "IsNot": "is not", + "In": "in", + "NotIn": "not in", + } + + def visit_Compare(self, node): + self.write("(") + self.traverse(node.left) + for o, e in zip(node.ops, node.comparators): + self.write(" " + self.cmpops[o.__class__.__name__] + " ") + self.traverse(e) + self.write(")") + + boolops = {And: "and", Or: "or"} + + def visit_BoolOp(self, node): + self.write("(") + s = " %s " % self.boolops[node.op.__class__] + self.interleave(lambda: self.write(s), self.traverse, node.values) + self.write(")") + + def visit_Attribute(self, node): + self.traverse(node.value) + # Special case: 3.__abs__() is a syntax error, so if node.value + # is an integer literal then we need to either parenthesize + # it or add an extra space to get 3 .__abs__(). + if isinstance(node.value, Constant) and isinstance(node.value.value, int): + self.write(" ") + self.write(".") + self.write(node.attr) + + def visit_Call(self, node): + self.traverse(node.func) + self.write("(") + comma = False + for e in node.args: + if comma: + self.write(", ") + else: + comma = True + self.traverse(e) + for e in node.keywords: + if comma: + self.write(", ") + else: + comma = True + self.traverse(e) + self.write(")") + + def visit_Subscript(self, node): + self.traverse(node.value) + self.write("[") + self.traverse(node.slice) + self.write("]") + + def visit_Starred(self, node): + self.write("*") + self.traverse(node.value) + + def visit_Ellipsis(self, node): + self.write("...") + + def visit_Index(self, node): + self.traverse(node.value) + + def visit_Slice(self, node): + if node.lower: + self.traverse(node.lower) + self.write(":") + if node.upper: + self.traverse(node.upper) + if node.step: + self.write(":") + self.traverse(node.step) + + def visit_ExtSlice(self, node): + self.interleave(lambda: self.write(", "), self.traverse, node.dims) + + def visit_arg(self, node): + self.write(node.arg) + if node.annotation: + self.write(": ") + self.traverse(node.annotation) + + def visit_arguments(self, node): + first = True + # normal arguments + all_args = node.posonlyargs + node.args + defaults = [None] * (len(all_args) - len(node.defaults)) + node.defaults + for index, elements in enumerate(zip(all_args, defaults), 1): + a, d = elements + if first: + first = False + else: + self.write(", ") + self.traverse(a) + if d: + self.write("=") + self.traverse(d) + if index == len(node.posonlyargs): + self.write(", /") + + # varargs, or bare '*' if no varargs but keyword-only arguments present + if node.vararg or node.kwonlyargs: + if first: + first = False + else: + self.write(", ") + self.write("*") + if node.vararg: + self.write(node.vararg.arg) + if node.vararg.annotation: + self.write(": ") + self.traverse(node.vararg.annotation) + + # keyword-only arguments + if node.kwonlyargs: + for a, d in zip(node.kwonlyargs, node.kw_defaults): + if first: + first = False + else: + self.write(", ") + self.traverse(a), + if d: + self.write("=") + self.traverse(d) + + # kwargs + if node.kwarg: + if first: + first = False + else: + self.write(", ") + self.write("**" + node.kwarg.arg) + if node.kwarg.annotation: + self.write(": ") + self.traverse(node.kwarg.annotation) + + def visit_keyword(self, node): + if node.arg is None: + self.write("**") + else: + self.write(node.arg) + self.write("=") + self.traverse(node.value) + + def visit_Lambda(self, node): + self.write("(") + self.write("lambda ") + self.traverse(node.args) + self.write(": ") + self.traverse(node.body) + self.write(")") + + def visit_alias(self, node): + self.write(node.name) + if node.asname: + self.write(" as " + node.asname) + + def visit_withitem(self, node): + self.traverse(node.context_expr) + if node.optional_vars: + self.write(" as ") + self.traverse(node.optional_vars) + +def unparse(ast_obj): + unparser = _Unparser() + return unparser.visit(ast_obj) + def main(): import argparse diff --git a/Lib/test/test_tools/test_unparse.py b/Lib/test/test_unparse.py similarity index 76% rename from Lib/test/test_tools/test_unparse.py rename to Lib/test/test_unparse.py index a958ebb51cc..9197c8a4a9e 100644 --- a/Lib/test/test_tools/test_unparse.py +++ b/Lib/test/test_unparse.py @@ -3,19 +3,12 @@ import unittest import test.support import io -import os +import pathlib import random import tokenize import ast +import functools -from test.test_tools import basepath, toolsdir, skip_if_missing - -skip_if_missing() - -parser_path = os.path.join(toolsdir, "parser") - -with test.support.DirsOnSysPath(parser_path): - import unparse def read_pyfile(filename): """Read and return the contents of a Python source file (as a @@ -26,6 +19,7 @@ def read_pyfile(filename): source = pyfile.read() return source + for_else = """\ def f(): for x in range(10): @@ -119,18 +113,21 @@ with f() as x, g() as y: suite1 """ + class ASTTestCase(unittest.TestCase): def assertASTEqual(self, ast1, ast2): self.assertEqual(ast.dump(ast1), ast.dump(ast2)) - def check_roundtrip(self, code1, filename="internal"): - ast1 = compile(code1, filename, "exec", ast.PyCF_ONLY_AST) - unparse_buffer = io.StringIO() - unparse.Unparser(ast1, unparse_buffer) - code2 = unparse_buffer.getvalue() - ast2 = compile(code2, filename, "exec", ast.PyCF_ONLY_AST) + def check_roundtrip(self, code1): + ast1 = ast.parse(code1) + code2 = ast.unparse(ast1) + ast2 = ast.parse(code2) self.assertASTEqual(ast1, ast2) + def check_invalid(self, node, raises=ValueError): + self.assertRaises(raises, ast.unparse, node) + + class UnparseTestCase(ASTTestCase): # Tests for specific bugs found in earlier versions of unparse @@ -174,8 +171,8 @@ class UnparseTestCase(ASTTestCase): self.check_roundtrip("-1e1000j") def test_min_int(self): - self.check_roundtrip(str(-2**31)) - self.check_roundtrip(str(-2**63)) + self.check_roundtrip(str(-(2 ** 31))) + self.check_roundtrip(str(-(2 ** 63))) def test_imaginary_literals(self): self.check_roundtrip("7j") @@ -265,54 +262,67 @@ class UnparseTestCase(ASTTestCase): self.check_roundtrip(r"""{**{'y': 2}, 'x': 1}""") self.check_roundtrip(r"""{**{'y': 2}, **{'x': 1}}""") + def test_invalid_raise(self): + self.check_invalid(ast.Raise(exc=None, cause=ast.Name(id="X"))) + + def test_invalid_fstring_constant(self): + self.check_invalid(ast.JoinedStr(values=[ast.Constant(value=100)])) + + def test_invalid_fstring_conversion(self): + self.check_invalid( + ast.FormattedValue( + value=ast.Constant(value="a", kind=None), + conversion=ord("Y"), # random character + format_spec=None, + ) + ) + + def test_invalid_set(self): + self.check_invalid(ast.Set(elts=[])) + class DirectoryTestCase(ASTTestCase): """Test roundtrip behaviour on all files in Lib and Lib/test.""" - NAMES = None - # test directories, relative to the root of the distribution - test_directories = 'Lib', os.path.join('Lib', 'test') + lib_dir = pathlib.Path(__file__).parent / ".." + test_directories = (lib_dir, lib_dir / "test") + skip_files = {"test_fstring.py"} - @classmethod - def get_names(cls): - if cls.NAMES is not None: - return cls.NAMES + @functools.cached_property + def files_to_test(self): + # bpo-31174: Use cached_property to store the names sample + # to always test the same files. It prevents false alarms + # when hunting reference leaks. - names = [] - for d in cls.test_directories: - test_dir = os.path.join(basepath, d) - for n in os.listdir(test_dir): - if n.endswith('.py') and not n.startswith('bad'): - names.append(os.path.join(test_dir, n)) + items = [ + item.resolve() + for directory in self.test_directories + for item in directory.glob("*.py") + if not item.name.startswith("bad") + ] # Test limited subset of files unless the 'cpu' resource is specified. if not test.support.is_resource_enabled("cpu"): - names = random.sample(names, 10) - # bpo-31174: Store the names sample to always test the same files. - # It prevents false alarms when hunting reference leaks. - cls.NAMES = names - return names + items = random.sample(items, 10) + return items def test_files(self): - # get names of files to test - names = self.get_names() - - for filename in names: + for item in self.files_to_test: if test.support.verbose: - print('Testing %s' % filename) + print(f"Testing {item.absolute()}") # Some f-strings are not correctly round-tripped by - # Tools/parser/unparse.py. See issue 28002 for details. - # We need to skip files that contain such f-strings. - if os.path.basename(filename) in ('test_fstring.py', ): + # Tools/parser/unparse.py. See issue 28002 for details. + # We need to skip files that contain such f-strings. + if item.name in self.skip_files: if test.support.verbose: - print(f'Skipping {filename}: see issue 28002') + print(f"Skipping {item.absolute()}: see issue 28002") continue - with self.subTest(filename=filename): - source = read_pyfile(filename) + with self.subTest(filename=item): + source = read_pyfile(item) self.check_roundtrip(source) -if __name__ == '__main__': +if __name__ == "__main__": unittest.main() diff --git a/Misc/NEWS.d/next/Library/2019-11-20-22-43-48.bpo-38870.rLVZEv.rst b/Misc/NEWS.d/next/Library/2019-11-20-22-43-48.bpo-38870.rLVZEv.rst new file mode 100644 index 00000000000..61af368ba55 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-11-20-22-43-48.bpo-38870.rLVZEv.rst @@ -0,0 +1,4 @@ +Expose :func:`ast.unparse` as a function of the :mod:`ast` module that can +be used to unparse an :class:`ast.AST` object and produce a string with code +that would produce an equivalent :class:`ast.AST` object when parsed. Patch +by Pablo Galindo and Batuhan Taskaya. diff --git a/Tools/parser/unparse.py b/Tools/parser/unparse.py deleted file mode 100644 index a5cc000676b..00000000000 --- a/Tools/parser/unparse.py +++ /dev/null @@ -1,704 +0,0 @@ -"Usage: unparse.py " -import sys -import ast -import tokenize -import io -import os - -# Large float and imaginary literals get turned into infinities in the AST. -# We unparse those infinities to INFSTR. -INFSTR = "1e" + repr(sys.float_info.max_10_exp + 1) - -def interleave(inter, f, seq): - """Call f on each item in seq, calling inter() in between. - """ - seq = iter(seq) - try: - f(next(seq)) - except StopIteration: - pass - else: - for x in seq: - inter() - f(x) - -class Unparser: - """Methods in this class recursively traverse an AST and - output source code for the abstract syntax; original formatting - is disregarded. """ - - def __init__(self, tree, file = sys.stdout): - """Unparser(tree, file=sys.stdout) -> None. - Print the source for tree to file.""" - self.f = file - self._indent = 0 - self.dispatch(tree) - print("", file=self.f) - self.f.flush() - - def fill(self, text = ""): - "Indent a piece of text, according to the current indentation level" - self.f.write("\n"+" "*self._indent + text) - - def write(self, text): - "Append a piece of text to the current line." - self.f.write(text) - - def enter(self): - "Print ':', and increase the indentation." - self.write(":") - self._indent += 1 - - def leave(self): - "Decrease the indentation level." - self._indent -= 1 - - def dispatch(self, tree): - "Dispatcher function, dispatching tree type T to method _T." - if isinstance(tree, list): - for t in tree: - self.dispatch(t) - return - meth = getattr(self, "_"+tree.__class__.__name__) - meth(tree) - - - ############### Unparsing methods ###################### - # There should be one method per concrete grammar type # - # Constructors should be grouped by sum type. Ideally, # - # this would follow the order in the grammar, but # - # currently doesn't. # - ######################################################## - - def _Module(self, tree): - for stmt in tree.body: - self.dispatch(stmt) - - # stmt - def _Expr(self, tree): - self.fill() - self.dispatch(tree.value) - - def _NamedExpr(self, tree): - self.write("(") - self.dispatch(tree.target) - self.write(" := ") - self.dispatch(tree.value) - self.write(")") - - def _Import(self, t): - self.fill("import ") - interleave(lambda: self.write(", "), self.dispatch, t.names) - - def _ImportFrom(self, t): - self.fill("from ") - self.write("." * t.level) - if t.module: - self.write(t.module) - self.write(" import ") - interleave(lambda: self.write(", "), self.dispatch, t.names) - - def _Assign(self, t): - self.fill() - for target in t.targets: - self.dispatch(target) - self.write(" = ") - self.dispatch(t.value) - - def _AugAssign(self, t): - self.fill() - self.dispatch(t.target) - self.write(" "+self.binop[t.op.__class__.__name__]+"= ") - self.dispatch(t.value) - - def _AnnAssign(self, t): - self.fill() - if not t.simple and isinstance(t.target, ast.Name): - self.write('(') - self.dispatch(t.target) - if not t.simple and isinstance(t.target, ast.Name): - self.write(')') - self.write(": ") - self.dispatch(t.annotation) - if t.value: - self.write(" = ") - self.dispatch(t.value) - - def _Return(self, t): - self.fill("return") - if t.value: - self.write(" ") - self.dispatch(t.value) - - def _Pass(self, t): - self.fill("pass") - - def _Break(self, t): - self.fill("break") - - def _Continue(self, t): - self.fill("continue") - - def _Delete(self, t): - self.fill("del ") - interleave(lambda: self.write(", "), self.dispatch, t.targets) - - def _Assert(self, t): - self.fill("assert ") - self.dispatch(t.test) - if t.msg: - self.write(", ") - self.dispatch(t.msg) - - def _Global(self, t): - self.fill("global ") - interleave(lambda: self.write(", "), self.write, t.names) - - def _Nonlocal(self, t): - self.fill("nonlocal ") - interleave(lambda: self.write(", "), self.write, t.names) - - def _Await(self, t): - self.write("(") - self.write("await") - if t.value: - self.write(" ") - self.dispatch(t.value) - self.write(")") - - def _Yield(self, t): - self.write("(") - self.write("yield") - if t.value: - self.write(" ") - self.dispatch(t.value) - self.write(")") - - def _YieldFrom(self, t): - self.write("(") - self.write("yield from") - if t.value: - self.write(" ") - self.dispatch(t.value) - self.write(")") - - def _Raise(self, t): - self.fill("raise") - if not t.exc: - assert not t.cause - return - self.write(" ") - self.dispatch(t.exc) - if t.cause: - self.write(" from ") - self.dispatch(t.cause) - - def _Try(self, t): - self.fill("try") - self.enter() - self.dispatch(t.body) - self.leave() - for ex in t.handlers: - self.dispatch(ex) - if t.orelse: - self.fill("else") - self.enter() - self.dispatch(t.orelse) - self.leave() - if t.finalbody: - self.fill("finally") - self.enter() - self.dispatch(t.finalbody) - self.leave() - - def _ExceptHandler(self, t): - self.fill("except") - if t.type: - self.write(" ") - self.dispatch(t.type) - if t.name: - self.write(" as ") - self.write(t.name) - self.enter() - self.dispatch(t.body) - self.leave() - - def _ClassDef(self, t): - self.write("\n") - for deco in t.decorator_list: - self.fill("@") - self.dispatch(deco) - self.fill("class "+t.name) - self.write("(") - comma = False - for e in t.bases: - if comma: self.write(", ") - else: comma = True - self.dispatch(e) - for e in t.keywords: - if comma: self.write(", ") - else: comma = True - self.dispatch(e) - self.write(")") - - self.enter() - self.dispatch(t.body) - self.leave() - - def _FunctionDef(self, t): - self.__FunctionDef_helper(t, "def") - - def _AsyncFunctionDef(self, t): - self.__FunctionDef_helper(t, "async def") - - def __FunctionDef_helper(self, t, fill_suffix): - self.write("\n") - for deco in t.decorator_list: - self.fill("@") - self.dispatch(deco) - def_str = fill_suffix+" "+t.name + "(" - self.fill(def_str) - self.dispatch(t.args) - self.write(")") - if t.returns: - self.write(" -> ") - self.dispatch(t.returns) - self.enter() - self.dispatch(t.body) - self.leave() - - def _For(self, t): - self.__For_helper("for ", t) - - def _AsyncFor(self, t): - self.__For_helper("async for ", t) - - def __For_helper(self, fill, t): - self.fill(fill) - self.dispatch(t.target) - self.write(" in ") - self.dispatch(t.iter) - self.enter() - self.dispatch(t.body) - self.leave() - if t.orelse: - self.fill("else") - self.enter() - self.dispatch(t.orelse) - self.leave() - - def _If(self, t): - self.fill("if ") - self.dispatch(t.test) - self.enter() - self.dispatch(t.body) - self.leave() - # collapse nested ifs into equivalent elifs. - while (t.orelse and len(t.orelse) == 1 and - isinstance(t.orelse[0], ast.If)): - t = t.orelse[0] - self.fill("elif ") - self.dispatch(t.test) - self.enter() - self.dispatch(t.body) - self.leave() - # final else - if t.orelse: - self.fill("else") - self.enter() - self.dispatch(t.orelse) - self.leave() - - def _While(self, t): - self.fill("while ") - self.dispatch(t.test) - self.enter() - self.dispatch(t.body) - self.leave() - if t.orelse: - self.fill("else") - self.enter() - self.dispatch(t.orelse) - self.leave() - - def _With(self, t): - self.fill("with ") - interleave(lambda: self.write(", "), self.dispatch, t.items) - self.enter() - self.dispatch(t.body) - self.leave() - - def _AsyncWith(self, t): - self.fill("async with ") - interleave(lambda: self.write(", "), self.dispatch, t.items) - self.enter() - self.dispatch(t.body) - self.leave() - - # expr - def _JoinedStr(self, t): - self.write("f") - string = io.StringIO() - self._fstring_JoinedStr(t, string.write) - self.write(repr(string.getvalue())) - - def _FormattedValue(self, t): - self.write("f") - string = io.StringIO() - self._fstring_FormattedValue(t, string.write) - self.write(repr(string.getvalue())) - - def _fstring_JoinedStr(self, t, write): - for value in t.values: - meth = getattr(self, "_fstring_" + type(value).__name__) - meth(value, write) - - def _fstring_Constant(self, t, write): - assert isinstance(t.value, str) - value = t.value.replace("{", "{{").replace("}", "}}") - write(value) - - def _fstring_FormattedValue(self, t, write): - write("{") - expr = io.StringIO() - Unparser(t.value, expr) - expr = expr.getvalue().rstrip("\n") - if expr.startswith("{"): - write(" ") # Separate pair of opening brackets as "{ {" - write(expr) - if t.conversion != -1: - conversion = chr(t.conversion) - assert conversion in "sra" - write(f"!{conversion}") - if t.format_spec: - write(":") - meth = getattr(self, "_fstring_" + type(t.format_spec).__name__) - meth(t.format_spec, write) - write("}") - - def _Name(self, t): - self.write(t.id) - - def _write_constant(self, value): - if isinstance(value, (float, complex)): - # Substitute overflowing decimal literal for AST infinities. - self.write(repr(value).replace("inf", INFSTR)) - else: - self.write(repr(value)) - - def _Constant(self, t): - value = t.value - if isinstance(value, tuple): - self.write("(") - if len(value) == 1: - self._write_constant(value[0]) - self.write(",") - else: - interleave(lambda: self.write(", "), self._write_constant, value) - self.write(")") - elif value is ...: - self.write("...") - else: - if t.kind == "u": - self.write("u") - self._write_constant(t.value) - - def _List(self, t): - self.write("[") - interleave(lambda: self.write(", "), self.dispatch, t.elts) - self.write("]") - - def _ListComp(self, t): - self.write("[") - self.dispatch(t.elt) - for gen in t.generators: - self.dispatch(gen) - self.write("]") - - def _GeneratorExp(self, t): - self.write("(") - self.dispatch(t.elt) - for gen in t.generators: - self.dispatch(gen) - self.write(")") - - def _SetComp(self, t): - self.write("{") - self.dispatch(t.elt) - for gen in t.generators: - self.dispatch(gen) - self.write("}") - - def _DictComp(self, t): - self.write("{") - self.dispatch(t.key) - self.write(": ") - self.dispatch(t.value) - for gen in t.generators: - self.dispatch(gen) - self.write("}") - - def _comprehension(self, t): - if t.is_async: - self.write(" async for ") - else: - self.write(" for ") - self.dispatch(t.target) - self.write(" in ") - self.dispatch(t.iter) - for if_clause in t.ifs: - self.write(" if ") - self.dispatch(if_clause) - - def _IfExp(self, t): - self.write("(") - self.dispatch(t.body) - self.write(" if ") - self.dispatch(t.test) - self.write(" else ") - self.dispatch(t.orelse) - self.write(")") - - def _Set(self, t): - assert(t.elts) # should be at least one element - self.write("{") - interleave(lambda: self.write(", "), self.dispatch, t.elts) - self.write("}") - - def _Dict(self, t): - self.write("{") - def write_key_value_pair(k, v): - self.dispatch(k) - self.write(": ") - self.dispatch(v) - - def write_item(item): - k, v = item - if k is None: - # for dictionary unpacking operator in dicts {**{'y': 2}} - # see PEP 448 for details - self.write("**") - self.dispatch(v) - else: - write_key_value_pair(k, v) - interleave(lambda: self.write(", "), write_item, zip(t.keys, t.values)) - self.write("}") - - def _Tuple(self, t): - self.write("(") - if len(t.elts) == 1: - elt = t.elts[0] - self.dispatch(elt) - self.write(",") - else: - interleave(lambda: self.write(", "), self.dispatch, t.elts) - self.write(")") - - unop = {"Invert":"~", "Not": "not", "UAdd":"+", "USub":"-"} - def _UnaryOp(self, t): - self.write("(") - self.write(self.unop[t.op.__class__.__name__]) - self.write(" ") - self.dispatch(t.operand) - self.write(")") - - binop = { "Add":"+", "Sub":"-", "Mult":"*", "MatMult":"@", "Div":"/", "Mod":"%", - "LShift":"<<", "RShift":">>", "BitOr":"|", "BitXor":"^", "BitAnd":"&", - "FloorDiv":"//", "Pow": "**"} - def _BinOp(self, t): - self.write("(") - self.dispatch(t.left) - self.write(" " + self.binop[t.op.__class__.__name__] + " ") - self.dispatch(t.right) - self.write(")") - - cmpops = {"Eq":"==", "NotEq":"!=", "Lt":"<", "LtE":"<=", "Gt":">", "GtE":">=", - "Is":"is", "IsNot":"is not", "In":"in", "NotIn":"not in"} - def _Compare(self, t): - self.write("(") - self.dispatch(t.left) - for o, e in zip(t.ops, t.comparators): - self.write(" " + self.cmpops[o.__class__.__name__] + " ") - self.dispatch(e) - self.write(")") - - boolops = {ast.And: 'and', ast.Or: 'or'} - def _BoolOp(self, t): - self.write("(") - s = " %s " % self.boolops[t.op.__class__] - interleave(lambda: self.write(s), self.dispatch, t.values) - self.write(")") - - def _Attribute(self,t): - self.dispatch(t.value) - # Special case: 3.__abs__() is a syntax error, so if t.value - # is an integer literal then we need to either parenthesize - # it or add an extra space to get 3 .__abs__(). - if isinstance(t.value, ast.Constant) and isinstance(t.value.value, int): - self.write(" ") - self.write(".") - self.write(t.attr) - - def _Call(self, t): - self.dispatch(t.func) - self.write("(") - comma = False - for e in t.args: - if comma: self.write(", ") - else: comma = True - self.dispatch(e) - for e in t.keywords: - if comma: self.write(", ") - else: comma = True - self.dispatch(e) - self.write(")") - - def _Subscript(self, t): - self.dispatch(t.value) - self.write("[") - self.dispatch(t.slice) - self.write("]") - - def _Starred(self, t): - self.write("*") - self.dispatch(t.value) - - # slice - def _Ellipsis(self, t): - self.write("...") - - def _Index(self, t): - self.dispatch(t.value) - - def _Slice(self, t): - if t.lower: - self.dispatch(t.lower) - self.write(":") - if t.upper: - self.dispatch(t.upper) - if t.step: - self.write(":") - self.dispatch(t.step) - - def _ExtSlice(self, t): - interleave(lambda: self.write(', '), self.dispatch, t.dims) - - # argument - def _arg(self, t): - self.write(t.arg) - if t.annotation: - self.write(": ") - self.dispatch(t.annotation) - - # others - def _arguments(self, t): - first = True - # normal arguments - all_args = t.posonlyargs + t.args - defaults = [None] * (len(all_args) - len(t.defaults)) + t.defaults - for index, elements in enumerate(zip(all_args, defaults), 1): - a, d = elements - if first:first = False - else: self.write(", ") - self.dispatch(a) - if d: - self.write("=") - self.dispatch(d) - if index == len(t.posonlyargs): - self.write(", /") - - # varargs, or bare '*' if no varargs but keyword-only arguments present - if t.vararg or t.kwonlyargs: - if first:first = False - else: self.write(", ") - self.write("*") - if t.vararg: - self.write(t.vararg.arg) - if t.vararg.annotation: - self.write(": ") - self.dispatch(t.vararg.annotation) - - # keyword-only arguments - if t.kwonlyargs: - for a, d in zip(t.kwonlyargs, t.kw_defaults): - if first:first = False - else: self.write(", ") - self.dispatch(a), - if d: - self.write("=") - self.dispatch(d) - - # kwargs - if t.kwarg: - if first:first = False - else: self.write(", ") - self.write("**"+t.kwarg.arg) - if t.kwarg.annotation: - self.write(": ") - self.dispatch(t.kwarg.annotation) - - def _keyword(self, t): - if t.arg is None: - self.write("**") - else: - self.write(t.arg) - self.write("=") - self.dispatch(t.value) - - def _Lambda(self, t): - self.write("(") - self.write("lambda ") - self.dispatch(t.args) - self.write(": ") - self.dispatch(t.body) - self.write(")") - - def _alias(self, t): - self.write(t.name) - if t.asname: - self.write(" as "+t.asname) - - def _withitem(self, t): - self.dispatch(t.context_expr) - if t.optional_vars: - self.write(" as ") - self.dispatch(t.optional_vars) - -def roundtrip(filename, output=sys.stdout): - with open(filename, "rb") as pyfile: - encoding = tokenize.detect_encoding(pyfile.readline)[0] - with open(filename, "r", encoding=encoding) as pyfile: - source = pyfile.read() - tree = compile(source, filename, "exec", ast.PyCF_ONLY_AST) - Unparser(tree, output) - - - -def testdir(a): - try: - names = [n for n in os.listdir(a) if n.endswith('.py')] - except OSError: - print("Directory not readable: %s" % a, file=sys.stderr) - else: - for n in names: - fullname = os.path.join(a, n) - if os.path.isfile(fullname): - output = io.StringIO() - print('Testing %s' % fullname) - try: - roundtrip(fullname, output) - except Exception as e: - print(' Failed to compile, exception is %s' % repr(e)) - elif os.path.isdir(fullname): - testdir(fullname) - -def main(args): - if args[0] == '--testdir': - for a in args[1:]: - testdir(a) - else: - for a in args: - roundtrip(a) - -if __name__=='__main__': - main(sys.argv[1:]) From e11f25dbd85709ed370e83348da07be03e9b3d7a Mon Sep 17 00:00:00 2001 From: Pablo Galindo Date: Mon, 25 Nov 2019 11:16:39 +0000 Subject: [PATCH 032/115] Fix typo in Doc/whatsnew/3.9.rst (GH-17372) --- Doc/whatsnew/3.9.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Doc/whatsnew/3.9.rst b/Doc/whatsnew/3.9.rst index 9af5259de95..5c669a013c1 100644 --- a/Doc/whatsnew/3.9.rst +++ b/Doc/whatsnew/3.9.rst @@ -121,7 +121,7 @@ Added the *indent* option to :func:`~ast.dump` which allows it to produce a multiline indented output. (Contributed by Serhiy Storchaka in :issue:`37995`.) -Added the :func:`ast.unparse` as a function in the :mod:`ast` module that can +Added :func:`ast.unparse` as a function in the :mod:`ast` module that can be used to unparse an :class:`ast.AST` object and produce a string with code that would produce an equivalent :class:`ast.AST` object when parsed. (Contributed by Pablo Galindo and Batuhan Taskaya in :issue:`38870`.) From ded8888fbc33011dd39b7b1c86a5adfacc4943f3 Mon Sep 17 00:00:00 2001 From: Pablo Galindo Date: Mon, 25 Nov 2019 11:49:17 +0000 Subject: [PATCH 033/115] bpo-38870: Remove dependency on contextlib to avoid performance regression on import (GH-17376) https://bugs.python.org/issue38870 Automerge-Triggered-By: @pablogsal --- Lib/ast.py | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/Lib/ast.py b/Lib/ast.py index 97914ebc668..77eb24971ed 100644 --- a/Lib/ast.py +++ b/Lib/ast.py @@ -26,7 +26,6 @@ """ import sys from _ast import * -from contextlib import contextmanager def parse(source, filename='', mode='exec', *, @@ -597,15 +596,22 @@ class _Unparser(NodeVisitor): self._buffer.clear() return value - @contextmanager - def block(self): + class _Block: """A context manager for preparing the source for blocks. It adds the character':', increases the indentation on enter and decreases the indentation on exit.""" - self.write(":") - self._indent += 1 - yield - self._indent -= 1 + def __init__(self, unparser): + self.unparser = unparser + + def __enter__(self): + self.unparser.write(":") + self.unparser._indent += 1 + + def __exit__(self, exc_type, exc_value, traceback): + self.unparser._indent -= 1 + + def block(self): + return self._Block(self) def traverse(self, node): if isinstance(node, list): From c6a7bdb356835c9d7513b1ea6846683d446fe6c3 Mon Sep 17 00:00:00 2001 From: Stefan Behnel Date: Mon, 25 Nov 2019 16:36:25 +0100 Subject: [PATCH 034/115] bpo-20928: support base-URL and recursive includes in etree.ElementInclude (#5723) * bpo-20928: bring elementtree's XInclude support en-par with the implementation in lxml by adding support for recursive includes and a base-URL. * bpo-20928: Support xincluding the same file multiple times, just not recursively. * bpo-20928: Add 'max_depth' parameter to xinclude that limits the maximum recursion depth to 6 by default. * Add news entry for updated ElementInclude support --- Lib/test/test_xml_etree.py | 82 +++++++++++++++++++ Lib/xml/etree/ElementInclude.py | 56 +++++++++++-- .../2018-03-30-16-18-12.bpo-20928.ieXu6I.rst | 1 + 3 files changed, 132 insertions(+), 7 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2018-03-30-16-18-12.bpo-20928.ieXu6I.rst diff --git a/Lib/test/test_xml_etree.py b/Lib/test/test_xml_etree.py index 9fbb4ac1813..09c234ca689 100644 --- a/Lib/test/test_xml_etree.py +++ b/Lib/test/test_xml_etree.py @@ -1668,6 +1668,17 @@ XINCLUDE["default.xml"] = """\ """.format(html.escape(SIMPLE_XMLFILE, True)) +XINCLUDE["include_c1_repeated.xml"] = """\ + + +

    The following is the source code of Recursive1.xml:

    + + + + +
    +""" + # # badly formatted xi:include tags @@ -1688,6 +1699,31 @@ XINCLUDE_BAD["B2.xml"] = """\ """ +XINCLUDE["Recursive1.xml"] = """\ + + +

    The following is the source code of Recursive2.xml:

    + +
    +""" + +XINCLUDE["Recursive2.xml"] = """\ + + +

    The following is the source code of Recursive3.xml:

    + +
    +""" + +XINCLUDE["Recursive3.xml"] = """\ + + +

    The following is the source code of Recursive1.xml:

    + +
    +""" + + class XIncludeTest(unittest.TestCase): def xinclude_loader(self, href, parse="xml", encoding=None): @@ -1789,6 +1825,13 @@ class XIncludeTest(unittest.TestCase): ' \n' '') # C5 + def test_xinclude_repeated(self): + from xml.etree import ElementInclude + + document = self.xinclude_loader("include_c1_repeated.xml") + ElementInclude.include(document, self.xinclude_loader) + self.assertEqual(1+4*2, len(document.findall(".//p"))) + def test_xinclude_failures(self): from xml.etree import ElementInclude @@ -1821,6 +1864,45 @@ class XIncludeTest(unittest.TestCase): "xi:fallback tag must be child of xi:include " "('{http://www.w3.org/2001/XInclude}fallback')") + # Test infinitely recursive includes. + document = self.xinclude_loader("Recursive1.xml") + with self.assertRaises(ElementInclude.FatalIncludeError) as cm: + ElementInclude.include(document, self.xinclude_loader) + self.assertEqual(str(cm.exception), + "recursive include of Recursive2.xml") + + # Test 'max_depth' limitation. + document = self.xinclude_loader("Recursive1.xml") + with self.assertRaises(ElementInclude.FatalIncludeError) as cm: + ElementInclude.include(document, self.xinclude_loader, max_depth=None) + self.assertEqual(str(cm.exception), + "recursive include of Recursive2.xml") + + document = self.xinclude_loader("Recursive1.xml") + with self.assertRaises(ElementInclude.LimitedRecursiveIncludeError) as cm: + ElementInclude.include(document, self.xinclude_loader, max_depth=0) + self.assertEqual(str(cm.exception), + "maximum xinclude depth reached when including file Recursive2.xml") + + document = self.xinclude_loader("Recursive1.xml") + with self.assertRaises(ElementInclude.LimitedRecursiveIncludeError) as cm: + ElementInclude.include(document, self.xinclude_loader, max_depth=1) + self.assertEqual(str(cm.exception), + "maximum xinclude depth reached when including file Recursive3.xml") + + document = self.xinclude_loader("Recursive1.xml") + with self.assertRaises(ElementInclude.LimitedRecursiveIncludeError) as cm: + ElementInclude.include(document, self.xinclude_loader, max_depth=2) + self.assertEqual(str(cm.exception), + "maximum xinclude depth reached when including file Recursive1.xml") + + document = self.xinclude_loader("Recursive1.xml") + with self.assertRaises(ElementInclude.FatalIncludeError) as cm: + ElementInclude.include(document, self.xinclude_loader, max_depth=3) + self.assertEqual(str(cm.exception), + "recursive include of Recursive2.xml") + + # -------------------------------------------------------------------- # reported bugs diff --git a/Lib/xml/etree/ElementInclude.py b/Lib/xml/etree/ElementInclude.py index 963470e3b15..5303062716c 100644 --- a/Lib/xml/etree/ElementInclude.py +++ b/Lib/xml/etree/ElementInclude.py @@ -50,18 +50,28 @@ import copy from . import ElementTree +from urllib.parse import urljoin XINCLUDE = "{http://www.w3.org/2001/XInclude}" XINCLUDE_INCLUDE = XINCLUDE + "include" XINCLUDE_FALLBACK = XINCLUDE + "fallback" +# For security reasons, the inclusion depth is limited to this read-only value by default. +DEFAULT_MAX_INCLUSION_DEPTH = 6 + + ## # Fatal include error. class FatalIncludeError(SyntaxError): pass + +class LimitedRecursiveIncludeError(FatalIncludeError): + pass + + ## # Default loader. This loader reads an included resource from disk. # @@ -92,13 +102,33 @@ def default_loader(href, parse, encoding=None): # @param loader Optional resource loader. If omitted, it defaults # to {@link default_loader}. If given, it should be a callable # that implements the same interface as default_loader. +# @param base_url The base URL of the original file, to resolve +# relative include file references. +# @param max_depth The maximum number of recursive inclusions. +# Limited to reduce the risk of malicious content explosion. +# Pass a negative value to disable the limitation. +# @throws LimitedRecursiveIncludeError If the {@link max_depth} was exceeded. # @throws FatalIncludeError If the function fails to include a given # resource, or if the tree contains malformed XInclude elements. -# @throws OSError If the function fails to load a given resource. +# @throws IOError If the function fails to load a given resource. +# @returns the node or its replacement if it was an XInclude node -def include(elem, loader=None): +def include(elem, loader=None, base_url=None, + max_depth=DEFAULT_MAX_INCLUSION_DEPTH): + if max_depth is None: + max_depth = -1 + elif max_depth < 0: + raise ValueError("expected non-negative depth or None for 'max_depth', got %r" % max_depth) + + if hasattr(elem, 'getroot'): + elem = elem.getroot() if loader is None: loader = default_loader + + _include(elem, loader, base_url, max_depth, set()) + + +def _include(elem, loader, base_url, max_depth, _parent_hrefs): # look for xinclude elements i = 0 while i < len(elem): @@ -106,14 +136,24 @@ def include(elem, loader=None): if e.tag == XINCLUDE_INCLUDE: # process xinclude directive href = e.get("href") + if base_url: + href = urljoin(base_url, href) parse = e.get("parse", "xml") if parse == "xml": + if href in _parent_hrefs: + raise FatalIncludeError("recursive include of %s" % href) + if max_depth == 0: + raise LimitedRecursiveIncludeError( + "maximum xinclude depth reached when including file %s" % href) + _parent_hrefs.add(href) node = loader(href, parse) if node is None: raise FatalIncludeError( "cannot load %r as %r" % (href, parse) ) - node = copy.copy(node) + node = copy.copy(node) # FIXME: this makes little sense with recursive includes + _include(node, loader, href, max_depth - 1, _parent_hrefs) + _parent_hrefs.remove(href) if e.tail: node.tail = (node.tail or "") + e.tail elem[i] = node @@ -123,11 +163,13 @@ def include(elem, loader=None): raise FatalIncludeError( "cannot load %r as %r" % (href, parse) ) + if e.tail: + text += e.tail if i: node = elem[i-1] - node.tail = (node.tail or "") + text + (e.tail or "") + node.tail = (node.tail or "") + text else: - elem.text = (elem.text or "") + text + (e.tail or "") + elem.text = (elem.text or "") + text del elem[i] continue else: @@ -139,5 +181,5 @@ def include(elem, loader=None): "xi:fallback tag must be child of xi:include (%r)" % e.tag ) else: - include(e, loader) - i = i + 1 + _include(e, loader, base_url, max_depth, _parent_hrefs) + i += 1 diff --git a/Misc/NEWS.d/next/Library/2018-03-30-16-18-12.bpo-20928.ieXu6I.rst b/Misc/NEWS.d/next/Library/2018-03-30-16-18-12.bpo-20928.ieXu6I.rst new file mode 100644 index 00000000000..25854009077 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2018-03-30-16-18-12.bpo-20928.ieXu6I.rst @@ -0,0 +1 @@ +ElementTree supports recursive XInclude processing. Patch by Stefan Behnel. From f8a6316778faff3991144c3aec4fa92d7b30a72b Mon Sep 17 00:00:00 2001 From: Sanchit Khurana <54467174+GeniusLearner@users.noreply.github.com> Date: Tue, 26 Nov 2019 03:47:59 +0530 Subject: [PATCH 035/115] bpo-21063: Improve module synopsis for distutils (GH-17363) --- Doc/distutils/apiref.rst | 10 +++++----- Doc/library/2to3.rst | 2 +- Doc/library/linecache.rst | 2 +- Doc/library/statistics.rst | 2 +- Doc/library/zipimport.rst | 2 +- 5 files changed, 9 insertions(+), 9 deletions(-) diff --git a/Doc/distutils/apiref.rst b/Doc/distutils/apiref.rst index a42d2d3559f..80136b8a6bc 100644 --- a/Doc/distutils/apiref.rst +++ b/Doc/distutils/apiref.rst @@ -1545,7 +1545,7 @@ Python's own build procedures. ================================================= .. module:: distutils.text_file - :synopsis: provides the TextFile class, a simple interface to text files + :synopsis: Provides the TextFile class, a simple interface to text files This module provides the :class:`TextFile` class, which gives an interface to @@ -1684,7 +1684,7 @@ lines, and joining lines with backslashes. =================================================== .. module:: distutils.version - :synopsis: implements classes that represent module version numbers. + :synopsis: Implements classes that represent module version numbers. .. % todo @@ -1699,7 +1699,7 @@ lines, and joining lines with backslashes. =================================================================== .. module:: distutils.cmd - :synopsis: This module provides the abstract base class Command. This class + :synopsis: Provides the abstract base class :class:`~distutils.cmd.Command`. This class is subclassed by the modules in the distutils.command subpackage. @@ -1792,7 +1792,7 @@ Subclasses of :class:`Command` must define the following methods. ========================================================== .. module:: distutils.command - :synopsis: This subpackage contains one module for each standard Distutils command. + :synopsis: Contains one module for each standard Distutils command. .. % \subsubsection{Individual Distutils commands} @@ -2039,7 +2039,7 @@ This is described in more detail in :pep:`301`. =================================================================== .. module:: distutils.command.check - :synopsis: Check the metadata of a package + :synopsis: Check the meta-data of a package The ``check`` command performs some tests on the meta-data of a package. diff --git a/Doc/library/2to3.rst b/Doc/library/2to3.rst index fa4b0a96455..c3ff3e607e7 100644 --- a/Doc/library/2to3.rst +++ b/Doc/library/2to3.rst @@ -456,7 +456,7 @@ and off individually. They are described here in more detail. ------------------------------- .. module:: lib2to3 - :synopsis: the 2to3 library + :synopsis: The 2to3 library .. moduleauthor:: Guido van Rossum .. moduleauthor:: Collin Winter diff --git a/Doc/library/linecache.rst b/Doc/library/linecache.rst index 9278fc0641f..dd9f4ee45ba 100644 --- a/Doc/library/linecache.rst +++ b/Doc/library/linecache.rst @@ -2,7 +2,7 @@ ================================================ .. module:: linecache - :synopsis: This module provides random access to individual lines from text files. + :synopsis: Provides random access to individual lines from text files. .. sectionauthor:: Moshe Zadka diff --git a/Doc/library/statistics.rst b/Doc/library/statistics.rst index a790ed81a56..4c7239c1895 100644 --- a/Doc/library/statistics.rst +++ b/Doc/library/statistics.rst @@ -2,7 +2,7 @@ ======================================================= .. module:: statistics - :synopsis: mathematical statistics functions + :synopsis: Mathematical statistics functions .. moduleauthor:: Steven D'Aprano .. sectionauthor:: Steven D'Aprano diff --git a/Doc/library/zipimport.rst b/Doc/library/zipimport.rst index 2138697ff06..8ac3fb16bdb 100644 --- a/Doc/library/zipimport.rst +++ b/Doc/library/zipimport.rst @@ -2,7 +2,7 @@ ===================================================== .. module:: zipimport - :synopsis: support for importing Python modules from ZIP archives. + :synopsis: Support for importing Python modules from ZIP archives. .. moduleauthor:: Just van Rossum From e4db1f05e9a5828f6b287f99067362fa0e5732e8 Mon Sep 17 00:00:00 2001 From: Eddie Elizondo Date: Mon, 25 Nov 2019 19:07:37 -0800 Subject: [PATCH 036/115] closes bpo-38803: Fix leak in posixmodule. (GH-17373) --- Modules/posixmodule.c | 1 + 1 file changed, 1 insertion(+) diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c index f7386300c56..89854711373 100644 --- a/Modules/posixmodule.c +++ b/Modules/posixmodule.c @@ -7589,6 +7589,7 @@ wait_helper(pid_t pid, int status, struct rusage *ru) /* XXX(nnorwitz): Copied (w/mods) from resource.c, there should be only one. */ result = PyStructSequence_New((PyTypeObject*) struct_rusage); + Py_DECREF(struct_rusage); if (!result) return NULL; From 6dd9b64770af8905bef293c81d541eaaf8d8df52 Mon Sep 17 00:00:00 2001 From: Brandt Bucher Date: Mon, 25 Nov 2019 22:16:53 -0800 Subject: [PATCH 037/115] bpo-38328: Speed up the creation time of constant list and set display. (GH-17114) --- Lib/test/test_sys.py | 2 +- .../2019-11-11-23-44-15.bpo-38328.IFrrjq.rst | 2 ++ Python/compile.c | 22 +++++++++++++++++++ 3 files changed, 25 insertions(+), 1 deletion(-) create mode 100644 Misc/NEWS.d/next/Core and Builtins/2019-11-11-23-44-15.bpo-38328.IFrrjq.rst diff --git a/Lib/test/test_sys.py b/Lib/test/test_sys.py index 9961dee754c..947c935f347 100644 --- a/Lib/test/test_sys.py +++ b/Lib/test/test_sys.py @@ -1222,7 +1222,7 @@ class SizeofTest(unittest.TestCase): # list samples = [[], [1,2,3], ['1', '2', '3']] for sample in samples: - check(sample, vsize('Pn') + len(sample)*self.P) + check(list(sample), vsize('Pn') + len(sample)*self.P) # sortwrapper (list) # XXX # cmpwrapper (list) diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-11-11-23-44-15.bpo-38328.IFrrjq.rst b/Misc/NEWS.d/next/Core and Builtins/2019-11-11-23-44-15.bpo-38328.IFrrjq.rst new file mode 100644 index 00000000000..e0c5ca7bfe8 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2019-11-11-23-44-15.bpo-38328.IFrrjq.rst @@ -0,0 +1,2 @@ +Sped up the creation time of constant :class:`list` and :class:`set` displays. +Patch by Brandt Bucher. diff --git a/Python/compile.c b/Python/compile.c index f56c015fb96..98a4afa168c 100644 --- a/Python/compile.c +++ b/Python/compile.c @@ -197,6 +197,7 @@ static int compiler_visit_slice(struct compiler *, slice_ty, expr_context_ty); static int inplace_binop(struct compiler *, operator_ty); +static int are_all_items_const(asdl_seq *, Py_ssize_t, Py_ssize_t); static int expr_constant(expr_ty); static int compiler_with(struct compiler *, stmt_ty, int); @@ -3655,6 +3656,27 @@ starunpack_helper(struct compiler *c, asdl_seq *elts, { Py_ssize_t n = asdl_seq_LEN(elts); Py_ssize_t i, nsubitems = 0, nseen = 0; + if (n > 2 && are_all_items_const(elts, 0, n)) { + PyObject *folded = PyTuple_New(n); + if (folded == NULL) { + return 0; + } + PyObject *val; + for (i = 0; i < n; i++) { + val = ((expr_ty)asdl_seq_GET(elts, i))->v.Constant.value; + Py_INCREF(val); + PyTuple_SET_ITEM(folded, i, val); + } + if (outer_op == BUILD_SET_UNPACK) { + Py_SETREF(folded, PyFrozenSet_New(folded)); + if (folded == NULL) { + return 0; + } + } + ADDOP_LOAD_CONST_NEW(c, folded); + ADDOP_I(c, outer_op, 1); + return 1; + } for (i = 0; i < n; i++) { expr_ty elt = asdl_seq_GET(elts, i); if (elt->kind == Starred_kind) { From 386d00cc341b549800776b906bfc6b20ea40c7db Mon Sep 17 00:00:00 2001 From: David Coles Date: Mon, 25 Nov 2019 22:31:09 -0800 Subject: [PATCH 038/115] Remove use of deprecated `array.fromstring` method (GH-17332) --- Doc/library/socket.rst | 4 ++-- Doc/tools/susp-ignored.csv | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Doc/library/socket.rst b/Doc/library/socket.rst index 62552bcbe24..2d7ca33f292 100755 --- a/Doc/library/socket.rst +++ b/Doc/library/socket.rst @@ -1411,9 +1411,9 @@ to sockets. fds = array.array("i") # Array of ints msg, ancdata, flags, addr = sock.recvmsg(msglen, socket.CMSG_LEN(maxfds * fds.itemsize)) for cmsg_level, cmsg_type, cmsg_data in ancdata: - if (cmsg_level == socket.SOL_SOCKET and cmsg_type == socket.SCM_RIGHTS): + if cmsg_level == socket.SOL_SOCKET and cmsg_type == socket.SCM_RIGHTS: # Append data, ignoring any truncated integers at the end. - fds.fromstring(cmsg_data[:len(cmsg_data) - (len(cmsg_data) % fds.itemsize)]) + fds.frombytes(cmsg_data[:len(cmsg_data) - (len(cmsg_data) % fds.itemsize)]) return msg, list(fds) .. availability:: most Unix platforms, possibly others. diff --git a/Doc/tools/susp-ignored.csv b/Doc/tools/susp-ignored.csv index 7615f24e6cf..5cdfd40f5b0 100644 --- a/Doc/tools/susp-ignored.csv +++ b/Doc/tools/susp-ignored.csv @@ -201,7 +201,7 @@ library/readline,,:bind,"python:bind ^I rl_complete" library/smtplib,,:port,method must support that as well as a regular host:port library/socket,,::,'5aef:2b::8' library/socket,,:can,"return (can_id, can_dlc, data[:can_dlc])" -library/socket,,:len,fds.fromstring(cmsg_data[:len(cmsg_data) - (len(cmsg_data) % fds.itemsize)]) +library/socket,,:len,fds.frombytes(cmsg_data[:len(cmsg_data) - (len(cmsg_data) % fds.itemsize)]) library/sqlite3,,:age,"cur.execute(""select * from people where name_last=:who and age=:age"", {""who"": who, ""age"": age})" library/sqlite3,,:memory, library/sqlite3,,:who,"cur.execute(""select * from people where name_last=:who and age=:age"", {""who"": who, ""age"": age})" From 036fe85bd3e6cd01093d836d71792a1966f961e8 Mon Sep 17 00:00:00 2001 From: HongWeipeng <961365124@qq.com> Date: Tue, 26 Nov 2019 15:54:49 +0800 Subject: [PATCH 039/115] bpo-27145: small_ints[x] could be returned in long_add and long_sub (GH-15716) --- Lib/test/test_long.py | 8 ++++++++ .../2019-09-06-16-40-12.bpo-27145.njuCXU.rst | 1 + Objects/longobject.c | 16 +++++++++------- 3 files changed, 18 insertions(+), 7 deletions(-) create mode 100644 Misc/NEWS.d/next/Core and Builtins/2019-09-06-16-40-12.bpo-27145.njuCXU.rst diff --git a/Lib/test/test_long.py b/Lib/test/test_long.py index 53101b3badb..7ce37e8dbd6 100644 --- a/Lib/test/test_long.py +++ b/Lib/test/test_long.py @@ -956,6 +956,14 @@ class LongTest(unittest.TestCase): self.assertEqual(huge >> (sys.maxsize + 1), (1 << 499) + 5) self.assertEqual(huge >> (sys.maxsize + 1000), 0) + @support.cpython_only + def test_small_ints_in_huge_calculation(self): + a = 2 ** 100 + b = -a + 1 + c = a + 1 + self.assertIs(a + b, 1) + self.assertIs(c - a, 1) + def test_small_ints(self): for i in range(-5, 257): self.assertIs(i, i + 0) diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-09-06-16-40-12.bpo-27145.njuCXU.rst b/Misc/NEWS.d/next/Core and Builtins/2019-09-06-16-40-12.bpo-27145.njuCXU.rst new file mode 100644 index 00000000000..229753a3730 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2019-09-06-16-40-12.bpo-27145.njuCXU.rst @@ -0,0 +1 @@ +int + int and int - int operators can now return small integer singletons. Patch by hongweipeng. diff --git a/Objects/longobject.c b/Objects/longobject.c index 294308e3e12..f0567970468 100644 --- a/Objects/longobject.c +++ b/Objects/longobject.c @@ -3206,7 +3206,7 @@ x_sub(PyLongObject *a, PyLongObject *b) if (sign < 0) { Py_SIZE(z) = -Py_SIZE(z); } - return long_normalize(z); + return maybe_small_long(long_normalize(z)); } static PyObject * @@ -3254,13 +3254,15 @@ long_sub(PyLongObject *a, PyLongObject *b) return PyLong_FromLong(MEDIUM_VALUE(a) - MEDIUM_VALUE(b)); } if (Py_SIZE(a) < 0) { - if (Py_SIZE(b) < 0) - z = x_sub(a, b); - else + if (Py_SIZE(b) < 0) { + z = x_sub(b, a); + } + else { z = x_add(a, b); - if (z != NULL) { - assert(Py_SIZE(z) == 0 || Py_REFCNT(z) == 1); - Py_SIZE(z) = -(Py_SIZE(z)); + if (z != NULL) { + assert(Py_SIZE(z) == 0 || Py_REFCNT(z) == 1); + Py_SIZE(z) = -(Py_SIZE(z)); + } } } else { From bc441ed7c1449f06df37905ee6289aa93b85d4cb Mon Sep 17 00:00:00 2001 From: Karl Dubost Date: Wed, 27 Nov 2019 01:38:41 +0900 Subject: [PATCH 040/115] bpo-22377: Fixes documentation for %Z in datetime (GH-16507) This fixes the issue discussed in https://bugs.python.org/issue22377 and fixes it according to the comments made by Paul Ganssle @pganssle * It clarifies which values are acceptable in the table * It extends the note with a clearer information on the valid values https://bugs.python.org/issue22377 --- Doc/library/datetime.rst | 17 +++++++++++++---- .../2019-10-01-10-53-46.bpo-22377.5ni-iC.rst | 2 ++ 2 files changed, 15 insertions(+), 4 deletions(-) create mode 100644 Misc/NEWS.d/next/Documentation/2019-10-01-10-53-46.bpo-22377.5ni-iC.rst diff --git a/Doc/library/datetime.rst b/Doc/library/datetime.rst index b1e1b25691d..f9a114eeb0a 100644 --- a/Doc/library/datetime.rst +++ b/Doc/library/datetime.rst @@ -2362,7 +2362,7 @@ requires, and these work on all platforms with a standard C implementation. | | string if the object is | +063415, | | | | naive). | -030712.345216 | | +-----------+--------------------------------+------------------------+-------+ -| ``%Z`` | Time zone name (empty string | (empty), UTC, EST, CST | | +| ``%Z`` | Time zone name (empty string | (empty), UTC, GMT | \(6) | | | if the object is naive). | | | +-----------+--------------------------------+------------------------+-------+ | ``%j`` | Day of the year as a | 001, 002, ..., 366 | \(9) | @@ -2533,9 +2533,18 @@ Notes: In addition, providing ``'Z'`` is identical to ``'+00:00'``. ``%Z`` - If :meth:`tzname` returns ``None``, ``%Z`` is replaced by an empty - string. Otherwise ``%Z`` is replaced by the returned value, which must - be a string. + In :meth:`strftime`, ``%Z`` is replaced by an empty string if + :meth:`tzname` returns ``None``; otherwise ``%Z`` is replaced by the + returned value, which must be a string. + + :meth:`strptime` only accepts certain values for ``%Z``: + + 1. any value in ``time.tzname`` for your machine's locale + 2. the hard-coded values ``UTC`` and ``GMT`` + + So someone living in Japan may have ``JST``, ``UTC``, and ``GMT`` as + valid values, but probably not ``EST``. It will raise ``ValueError`` for + invalid values. .. versionchanged:: 3.2 When the ``%z`` directive is provided to the :meth:`strptime` method, an diff --git a/Misc/NEWS.d/next/Documentation/2019-10-01-10-53-46.bpo-22377.5ni-iC.rst b/Misc/NEWS.d/next/Documentation/2019-10-01-10-53-46.bpo-22377.5ni-iC.rst new file mode 100644 index 00000000000..d2943f75a84 --- /dev/null +++ b/Misc/NEWS.d/next/Documentation/2019-10-01-10-53-46.bpo-22377.5ni-iC.rst @@ -0,0 +1,2 @@ +Improves documentation of the values that :meth:`datetime.datetime.strptime` accepts for ``%Z``. +Patch by Karl Dubost. From e563a155be60fc0757914f87c8138f10de00bb16 Mon Sep 17 00:00:00 2001 From: Terry Jan Reedy Date: Tue, 26 Nov 2019 12:07:48 -0500 Subject: [PATCH 041/115] bpo-38892: Improve docs for audit event (GH-17361) --- Doc/c-api/sys.rst | 23 ++++++++++--------- Doc/library/audit_events.rst | 2 +- Doc/library/sys.rst | 6 ++--- .../2019-11-22-22-18-50.bpo-38892.LS586s.rst | 1 + 4 files changed, 17 insertions(+), 15 deletions(-) create mode 100644 Misc/NEWS.d/next/Core and Builtins/2019-11-22-22-18-50.bpo-38892.LS586s.rst diff --git a/Doc/c-api/sys.rst b/Doc/c-api/sys.rst index d3bbee23f50..eccb8a67e82 100644 --- a/Doc/c-api/sys.rst +++ b/Doc/c-api/sys.rst @@ -309,7 +309,7 @@ accessible to C code. They all work with the current interpreter thread's .. c:function:: int PySys_Audit(const char *event, const char *format, ...) - Raises an auditing event with any active hooks. Returns zero for success + Raise an auditing event with any active hooks. Return zero for success and non-zero with an exception set on failure. If any hooks have been added, *format* and other arguments will be used @@ -327,11 +327,16 @@ accessible to C code. They all work with the current interpreter thread's .. c:function:: int PySys_AddAuditHook(Py_AuditHookFunction hook, void *userData) - Adds to the collection of active auditing hooks. Returns zero for success - and non-zero on failure. If the runtime has been initialized, also sets an + Append the callable *hook* to the list of active auditing hooks. + Return zero for success + and non-zero on failure. If the runtime has been initialized, also set an error on failure. Hooks added through this API are called for all interpreters created by the runtime. + The *userData* pointer is passed into the hook function. Since hook + functions may be called from different runtimes, this pointer should not + refer directly to Python state. + This function is safe to call before :c:func:`Py_Initialize`. When called after runtime initialization, existing audit hooks are notified and may silently abort the operation by raising an error subclassed from @@ -342,14 +347,10 @@ accessible to C code. They all work with the current interpreter thread's :c:type:`PyTupleObject`. The hook function is always called with the GIL held by the Python interpreter that raised the event. - The *userData* pointer is passed into the hook function. Since hook - functions may be called from different runtimes, this pointer should not - refer directly to Python state. - - See :pep:`578` for a detailed description of auditing. Functions in the - runtime and standard library that raise events include the details in each - function's documentation and listed in the :ref:`audit events table - `. + See :pep:`578` for a detailed description of auditing. Functions in the + runtime and standard library that raise events are listed in the + :ref:`audit events table `. + Details are in each function's documentation. .. audit-event:: sys.addaudithook "" c.PySys_AddAuditHook diff --git a/Doc/library/audit_events.rst b/Doc/library/audit_events.rst index c23b9c61832..3c68a1515b3 100644 --- a/Doc/library/audit_events.rst +++ b/Doc/library/audit_events.rst @@ -7,7 +7,7 @@ Audit events table This table contains all events raised by :func:`sys.audit` or :c:func:`PySys_Audit` calls throughout the CPython runtime and the -standard library. +standard library. These calls were added in 3.8.0 or later. See :func:`sys.addaudithook` and :c:func:`PySys_AddAuditHook` for information on handling these events. diff --git a/Doc/library/sys.rst b/Doc/library/sys.rst index 4b0bcde4a8b..2f33445a6f9 100644 --- a/Doc/library/sys.rst +++ b/Doc/library/sys.rst @@ -25,7 +25,7 @@ always available. .. function:: addaudithook(hook) - Adds the callable *hook* to the collection of active auditing hooks for the + Append the callable *hook* to the list of active auditing hooks for the current interpreter. When an auditing event is raised through the :func:`sys.audit` function, each @@ -35,7 +35,7 @@ always available. .. audit-event:: sys.addaudithook "" sys.addaudithook - Raises a auditing event ``sys.addaudithook`` with no arguments. If any + Raise an auditing event ``sys.addaudithook`` with no arguments. If any existing hooks raise an exception derived from :class:`Exception`, the new hook will not be added and the exception suppressed. As a result, callers cannot assume that their hook has been added unless they control @@ -74,7 +74,7 @@ always available. .. index:: single: auditing - Raises an auditing event with any active hooks. The event name is a string + Raise an auditing event with any active hooks. The event name is a string identifying the event and its associated schema, which is the number and types of arguments. The schema for a given event is considered public and stable API and should not be modified between releases. diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-11-22-22-18-50.bpo-38892.LS586s.rst b/Misc/NEWS.d/next/Core and Builtins/2019-11-22-22-18-50.bpo-38892.LS586s.rst new file mode 100644 index 00000000000..5df67dcbfea --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2019-11-22-22-18-50.bpo-38892.LS586s.rst @@ -0,0 +1 @@ +Improve documentation for audit events table and functions. From 0b41a922f95f62b620d5a197b9f2ed8e4bb70730 Mon Sep 17 00:00:00 2001 From: HongWeipeng <961365124@qq.com> Date: Wed, 27 Nov 2019 06:36:02 +0800 Subject: [PATCH 042/115] bpo-38045: Improve the performance of _decompose() in enum.py (GH-16483) * Improve the performance of _decompose() in enum.py Co-Authored-By: Brandt Bucher --- Lib/enum.py | 33 ++++++------------- .../2019-09-30-12-09-41.bpo-38045.VDRtd3.rst | 1 + 2 files changed, 11 insertions(+), 23 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2019-09-30-12-09-41.bpo-38045.VDRtd3.rst diff --git a/Lib/enum.py b/Lib/enum.py index 06f42a97803..0be1b60cd6d 100644 --- a/Lib/enum.py +++ b/Lib/enum.py @@ -861,28 +861,20 @@ def _decompose(flag, value): # _decompose is only called if the value is not named not_covered = value negative = value < 0 - # issue29167: wrap accesses to _value2member_map_ in a list to avoid race - # conditions between iterating over it and having more pseudo- - # members added to it - if negative: - # only check for named flags - flags_to_check = [ - (m, v) - for v, m in list(flag._value2member_map_.items()) - if m.name is not None - ] - else: - # check for named flags and powers-of-two flags - flags_to_check = [ - (m, v) - for v, m in list(flag._value2member_map_.items()) - if m.name is not None or _power_of_two(v) - ] members = [] - for member, member_value in flags_to_check: + for member in flag: + member_value = member.value if member_value and member_value & value == member_value: members.append(member) not_covered &= ~member_value + if not negative: + tmp = not_covered + while tmp: + flag_value = 2 ** _high_bit(tmp) + if flag_value in flag._value2member_map_: + members.append(flag._value2member_map_[flag_value]) + not_covered &= ~flag_value + tmp &= ~flag_value if not members and value in flag._value2member_map_: members.append(flag._value2member_map_[value]) members.sort(key=lambda m: m._value_, reverse=True) @@ -890,8 +882,3 @@ def _decompose(flag, value): # we have the breakdown, don't need the value member itself members.pop(0) return members, not_covered - -def _power_of_two(value): - if value < 1: - return False - return value == 2 ** _high_bit(value) diff --git a/Misc/NEWS.d/next/Library/2019-09-30-12-09-41.bpo-38045.VDRtd3.rst b/Misc/NEWS.d/next/Library/2019-09-30-12-09-41.bpo-38045.VDRtd3.rst new file mode 100644 index 00000000000..e7e515f5c25 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-09-30-12-09-41.bpo-38045.VDRtd3.rst @@ -0,0 +1 @@ +Improve the performance of :func:`enum._decompose` in :mod:`enum`. Patch by hongweipeng. From c7c01ab1e5415b772c68e15f1aba51e520010830 Mon Sep 17 00:00:00 2001 From: Steve Dower Date: Tue, 26 Nov 2019 16:27:50 -0800 Subject: [PATCH 043/115] bpo-38922: Raise code.__new__ audit event when code object replace() is called (GH-17394) --- .../2019-11-26-12-20-34.bpo-38922.i6ja-i.rst | 2 ++ Objects/codeobject.c | 7 +++++++ 2 files changed, 9 insertions(+) create mode 100644 Misc/NEWS.d/next/Core and Builtins/2019-11-26-12-20-34.bpo-38922.i6ja-i.rst diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-11-26-12-20-34.bpo-38922.i6ja-i.rst b/Misc/NEWS.d/next/Core and Builtins/2019-11-26-12-20-34.bpo-38922.i6ja-i.rst new file mode 100644 index 00000000000..a7af652e5a5 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2019-11-26-12-20-34.bpo-38922.i6ja-i.rst @@ -0,0 +1,2 @@ +Calling ``replace`` on a code object now raises the ``code.__new__`` audit +event. diff --git a/Objects/codeobject.c b/Objects/codeobject.c index 39bf6fc6f22..f0b62ec9414 100644 --- a/Objects/codeobject.c +++ b/Objects/codeobject.c @@ -641,6 +641,13 @@ code_replace_impl(PyCodeObject *self, int co_argcount, #undef CHECK_INT_ARG + if (PySys_Audit("code.__new__", "OOOiiiiii", + co_code, co_filename, co_name, co_argcount, + co_posonlyargcount, co_kwonlyargcount, co_nlocals, + co_stacksize, co_flags) < 0) { + return NULL; + } + return (PyObject *)PyCode_NewWithPosOnlyArgs( co_argcount, co_posonlyargcount, co_kwonlyargcount, co_nlocals, co_stacksize, co_flags, (PyObject*)co_code, co_consts, co_names, From 9bbcbc9f6dfe1368fe7330b117707f828e6a2c18 Mon Sep 17 00:00:00 2001 From: "Bruno P. Kinoshita" Date: Wed, 27 Nov 2019 14:10:37 +1300 Subject: [PATCH 044/115] bpo-38688, shutil.copytree: consume iterator and create list of entries to prevent infinite recursion (GH-17098) --- Lib/shutil.py | 13 +++++++------ Lib/test/test_shutil.py | 11 +++++++++++ .../2019-11-22-10-45-03.bpo-38668.iKx23z.rst | 5 +++++ 3 files changed, 23 insertions(+), 6 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2019-11-22-10-45-03.bpo-38668.iKx23z.rst diff --git a/Lib/shutil.py b/Lib/shutil.py index f97de788d9d..8f609b312d3 100644 --- a/Lib/shutil.py +++ b/Lib/shutil.py @@ -442,7 +442,7 @@ def ignore_patterns(*patterns): def _copytree(entries, src, dst, symlinks, ignore, copy_function, ignore_dangling_symlinks, dirs_exist_ok=False): if ignore is not None: - ignored_names = ignore(src, set(os.listdir(src))) + ignored_names = ignore(src, {x.name for x in entries}) else: ignored_names = set() @@ -543,11 +543,12 @@ def copytree(src, dst, symlinks=False, ignore=None, copy_function=copy2, """ sys.audit("shutil.copytree", src, dst) - with os.scandir(src) as entries: - return _copytree(entries=entries, src=src, dst=dst, symlinks=symlinks, - ignore=ignore, copy_function=copy_function, - ignore_dangling_symlinks=ignore_dangling_symlinks, - dirs_exist_ok=dirs_exist_ok) + with os.scandir(src) as itr: + entries = list(itr) + return _copytree(entries=entries, src=src, dst=dst, symlinks=symlinks, + ignore=ignore, copy_function=copy_function, + ignore_dangling_symlinks=ignore_dangling_symlinks, + dirs_exist_ok=dirs_exist_ok) if hasattr(os.stat_result, 'st_file_attributes'): # Special handling for directory junctions to make them behave like diff --git a/Lib/test/test_shutil.py b/Lib/test/test_shutil.py index dd5589b2e3a..460b979ba93 100644 --- a/Lib/test/test_shutil.py +++ b/Lib/test/test_shutil.py @@ -727,6 +727,17 @@ class TestCopyTree(BaseTest, unittest.TestCase): rv = shutil.copytree(src_dir, dst_dir) self.assertEqual(['foo'], os.listdir(rv)) + def test_copytree_subdirectory(self): + # copytree where dst is a subdirectory of src, see Issue 38688 + base_dir = self.mkdtemp() + self.addCleanup(shutil.rmtree, base_dir, ignore_errors=True) + src_dir = os.path.join(base_dir, "t", "pg") + dst_dir = os.path.join(src_dir, "somevendor", "1.0") + os.makedirs(src_dir) + src = os.path.join(src_dir, 'pol') + write_file(src, 'pol') + rv = shutil.copytree(src_dir, dst_dir) + self.assertEqual(['pol'], os.listdir(rv)) class TestCopy(BaseTest, unittest.TestCase): diff --git a/Misc/NEWS.d/next/Library/2019-11-22-10-45-03.bpo-38668.iKx23z.rst b/Misc/NEWS.d/next/Library/2019-11-22-10-45-03.bpo-38668.iKx23z.rst new file mode 100644 index 00000000000..28b82ab1619 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-11-22-10-45-03.bpo-38668.iKx23z.rst @@ -0,0 +1,5 @@ +Calling func:`shutil.copytree` to copy a directory tree from one directory +to another subdirectory resulted in an endless loop and a RecursionError. A +fix was added to consume an iterator and create the list of the entries to +be copied, avoiding the recursion for newly created directories. Patch by +Bruno P. Kinoshita. From 1ef4c32c8d4f374adfea599f033fa61254bf951d Mon Sep 17 00:00:00 2001 From: Anthony Sottile Date: Tue, 26 Nov 2019 20:54:46 -0800 Subject: [PATCH 045/115] Be more specific about the `.so` gitignore patterns (GH-17328) In GH-15823 the pattern was changed from `libpython*.so*` to `*.so*` which matches a bit too greedily for some packagers. For instance this trips up `debian/README.source`. A more specific pattern fixes this issue. --- .gitignore | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index b11f72f69fa..8c1f8a43075 100644 --- a/.gitignore +++ b/.gitignore @@ -6,7 +6,8 @@ *.iml *.o *.a -*.so* +*.so +*.so.* *.dylib *.dll *.orig From ce4b7a273a9c560ed4b1a6284ef1bbb02d8e9782 Mon Sep 17 00:00:00 2001 From: Yoni Lavi Date: Wed, 27 Nov 2019 05:08:50 +0000 Subject: [PATCH 046/115] Show the differing module names for readlink() (GH-17395) This was very confusing with the text for both being just `readlink()`. --- Doc/whatsnew/3.9.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Doc/whatsnew/3.9.rst b/Doc/whatsnew/3.9.rst index 5c669a013c1..1cd96ef3b07 100644 --- a/Doc/whatsnew/3.9.rst +++ b/Doc/whatsnew/3.9.rst @@ -184,8 +184,8 @@ case), and one used ``__VENV_NAME__`` instead. pathlib ------- -Added :meth:`~pathlib.Path.readlink()` which acts similar to -:func:`~os.readlink`. +Added :meth:`pathlib.Path.readlink()` which acts similarly to +:func:`os.readlink`. (Contributed by Girts Folkmanis in :issue:`30618`) pprint From 1bddf890e595a865414645c6041733043c4081f8 Mon Sep 17 00:00:00 2001 From: Florian Dahlitz Date: Wed, 27 Nov 2019 09:46:40 +0100 Subject: [PATCH 047/115] bpo-38524: document implicit and explicit calling of descriptors' __set_name__ (GH-17364) --- Doc/reference/datamodel.rst | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/Doc/reference/datamodel.rst b/Doc/reference/datamodel.rst index 76b7035ced9..68098508afb 100644 --- a/Doc/reference/datamodel.rst +++ b/Doc/reference/datamodel.rst @@ -1655,8 +1655,19 @@ class' :attr:`~object.__dict__`. Called at the time the owning class *owner* is created. The descriptor has been assigned to *name*. - .. versionadded:: 3.6 + .. note:: + ``__set_name__`` is only called implicitly as part of the ``type`` constructor, so + it will need to be called explicitly with the appropriate parameters when a + descriptor is added to a class after initial creation:: + + descr = custom_descriptor() + cls.attr = descr + descr.__set_name__(cls, 'attr') + + See :ref:`class-object-creation` for more details. + + .. versionadded:: 3.6 The attribute :attr:`__objclass__` is interpreted by the :mod:`inspect` module as specifying the class where this object was defined (setting this From ea9835c5d154ab6a54eed627958473b6768b28cc Mon Sep 17 00:00:00 2001 From: Inada Naoki Date: Wed, 27 Nov 2019 22:22:06 +0900 Subject: [PATCH 048/115] bpo-26730: Fix SpooledTemporaryFile data corruption (GH-17400) SpooledTemporaryFile.rollback() might cause data corruption when it is in text mode. Co-Authored-By: Serhiy Storchaka --- Doc/library/tempfile.rst | 4 +-- Lib/tempfile.py | 15 ++++++----- Lib/test/test_tempfile.py | 25 +++++++++++-------- .../2019-11-27-16-30-02.bpo-26730.56cdBn.rst | 2 ++ 4 files changed, 27 insertions(+), 19 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2019-11-27-16-30-02.bpo-26730.56cdBn.rst diff --git a/Doc/library/tempfile.rst b/Doc/library/tempfile.rst index fff7a7a03eb..a59817c1039 100644 --- a/Doc/library/tempfile.rst +++ b/Doc/library/tempfile.rst @@ -105,8 +105,8 @@ The module defines the following user-callable items: causes the file to roll over to an on-disk file regardless of its size. The returned object is a file-like object whose :attr:`_file` attribute - is either an :class:`io.BytesIO` or :class:`io.StringIO` object (depending on - whether binary or text *mode* was specified) or a true file + is either an :class:`io.BytesIO` or :class:`io.TextIOWrapper` object + (depending on whether binary or text *mode* was specified) or a true file object, depending on whether :func:`rollover` has been called. This file-like object can be used in a :keyword:`with` statement, just like a normal file. diff --git a/Lib/tempfile.py b/Lib/tempfile.py index 45709cb06cf..62875540f8b 100644 --- a/Lib/tempfile.py +++ b/Lib/tempfile.py @@ -633,10 +633,9 @@ class SpooledTemporaryFile: if 'b' in mode: self._file = _io.BytesIO() else: - # Setting newline="\n" avoids newline translation; - # this is important because otherwise on Windows we'd - # get double newline translation upon rollover(). - self._file = _io.StringIO(newline="\n") + self._file = _io.TextIOWrapper(_io.BytesIO(), + encoding=encoding, errors=errors, + newline=newline) self._max_size = max_size self._rolled = False self._TemporaryFileArgs = {'mode': mode, 'buffering': buffering, @@ -656,8 +655,12 @@ class SpooledTemporaryFile: newfile = self._file = TemporaryFile(**self._TemporaryFileArgs) del self._TemporaryFileArgs - newfile.write(file.getvalue()) - newfile.seek(file.tell(), 0) + pos = file.tell() + if hasattr(newfile, 'buffer'): + newfile.buffer.write(file.detach().getvalue()) + else: + newfile.write(file.getvalue()) + newfile.seek(pos, 0) self._rolled = True diff --git a/Lib/test/test_tempfile.py b/Lib/test/test_tempfile.py index f995f6c9bfa..232c5dae10f 100644 --- a/Lib/test/test_tempfile.py +++ b/Lib/test/test_tempfile.py @@ -1114,7 +1114,8 @@ class TestSpooledTemporaryFile(BaseTestCase): def test_text_mode(self): # Creating a SpooledTemporaryFile with a text mode should produce # a file object reading and writing (Unicode) text strings. - f = tempfile.SpooledTemporaryFile(mode='w+', max_size=10) + f = tempfile.SpooledTemporaryFile(mode='w+', max_size=10, + encoding="utf-8") f.write("abc\n") f.seek(0) self.assertEqual(f.read(), "abc\n") @@ -1124,9 +1125,9 @@ class TestSpooledTemporaryFile(BaseTestCase): self.assertFalse(f._rolled) self.assertEqual(f.mode, 'w+') self.assertIsNone(f.name) - self.assertIsNone(f.newlines) - self.assertIsNone(f.encoding) - self.assertIsNone(f.errors) + self.assertEqual(f.newlines, os.linesep) + self.assertEqual(f.encoding, "utf-8") + self.assertEqual(f.errors, "strict") f.write("xyzzy\n") f.seek(0) @@ -1139,8 +1140,8 @@ class TestSpooledTemporaryFile(BaseTestCase): self.assertEqual(f.mode, 'w+') self.assertIsNotNone(f.name) self.assertEqual(f.newlines, os.linesep) - self.assertIsNotNone(f.encoding) - self.assertIsNotNone(f.errors) + self.assertEqual(f.encoding, "utf-8") + self.assertEqual(f.errors, "strict") def test_text_newline_and_encoding(self): f = tempfile.SpooledTemporaryFile(mode='w+', max_size=10, @@ -1152,13 +1153,15 @@ class TestSpooledTemporaryFile(BaseTestCase): self.assertFalse(f._rolled) self.assertEqual(f.mode, 'w+') self.assertIsNone(f.name) - self.assertIsNone(f.newlines) - self.assertIsNone(f.encoding) - self.assertIsNone(f.errors) + self.assertIsNotNone(f.newlines) + self.assertEqual(f.encoding, "utf-8") + self.assertEqual(f.errors, "ignore") - f.write("\u039B" * 20 + "\r\n") + f.write("\u039C" * 10 + "\r\n") + f.write("\u039D" * 20) f.seek(0) - self.assertEqual(f.read(), "\u039B\r\n" + ("\u039B" * 20) + "\r\n") + self.assertEqual(f.read(), + "\u039B\r\n" + ("\u039C" * 10) + "\r\n" + ("\u039D" * 20)) self.assertTrue(f._rolled) self.assertEqual(f.mode, 'w+') self.assertIsNotNone(f.name) diff --git a/Misc/NEWS.d/next/Library/2019-11-27-16-30-02.bpo-26730.56cdBn.rst b/Misc/NEWS.d/next/Library/2019-11-27-16-30-02.bpo-26730.56cdBn.rst new file mode 100644 index 00000000000..a92b90a4956 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-11-27-16-30-02.bpo-26730.56cdBn.rst @@ -0,0 +1,2 @@ +Fix ``SpooledTemporaryFile.rollover()`` might corrupt the file when it is in +text mode. Patch by Serhiy Storchaka. From 045d4e243d042638bbbc9479d4f85f6f579ac3ca Mon Sep 17 00:00:00 2001 From: Tzu-ping Chung Date: Thu, 28 Nov 2019 04:21:48 +0800 Subject: [PATCH 049/115] bpo-38928: Fix versionadded for venv's upgrade_deps function (GH-17404) --- Doc/library/venv.rst | 4 ++-- .../Documentation/2019-11-27-17-51-27.bpo-38928.AfgvfO.rst | 2 ++ 2 files changed, 4 insertions(+), 2 deletions(-) create mode 100644 Misc/NEWS.d/next/Documentation/2019-11-27-17-51-27.bpo-38928.AfgvfO.rst diff --git a/Doc/library/venv.rst b/Doc/library/venv.rst index b29fb3ebb60..5494c0c878b 100644 --- a/Doc/library/venv.rst +++ b/Doc/library/venv.rst @@ -132,7 +132,7 @@ creation according to their needs, the :class:`EnvBuilder` class. .. versionadded:: 3.6 Added the ``prompt`` parameter - .. versionadded:: 3.8 + .. versionadded:: 3.9 Added the ``upgrade_deps`` parameter Creators of third-party virtual environment tools will be free to use the @@ -197,7 +197,7 @@ creation according to their needs, the :class:`EnvBuilder` class. ``setuptools``) in the environment. This is done by shelling out to the ``pip`` executable in the environment. - .. versionadded:: 3.8 + .. versionadded:: 3.9 .. method:: post_setup(context) diff --git a/Misc/NEWS.d/next/Documentation/2019-11-27-17-51-27.bpo-38928.AfgvfO.rst b/Misc/NEWS.d/next/Documentation/2019-11-27-17-51-27.bpo-38928.AfgvfO.rst new file mode 100644 index 00000000000..952d4a8664d --- /dev/null +++ b/Misc/NEWS.d/next/Documentation/2019-11-27-17-51-27.bpo-38928.AfgvfO.rst @@ -0,0 +1,2 @@ +Correct when venv's ``upgrade_dependencies()`` and ``--upgrade-deps`` are +added. From d9aa216d49423d58e192cd7a25016f90fe771ce7 Mon Sep 17 00:00:00 2001 From: Tzu-ping Chung Date: Thu, 28 Nov 2019 04:25:23 +0800 Subject: [PATCH 050/115] bpo-38927: Use python -m pip to upgrade venv deps (GH-17403) I suggest you add `bpo-NNNNN: ` as a prefix for the first commit for future PRs. Thanks! --- Lib/test/test_venv.py | 8 +++++--- Lib/venv/__init__.py | 6 +++--- .../next/Library/2019-11-27-17-47-00.bpo-38927.qT7xKY.rst | 1 + 3 files changed, 9 insertions(+), 6 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2019-11-27-17-47-00.bpo-38927.qT7xKY.rst diff --git a/Lib/test/test_venv.py b/Lib/test/test_venv.py index 0103de8828d..741ac109bbc 100644 --- a/Lib/test/test_venv.py +++ b/Lib/test/test_venv.py @@ -141,16 +141,18 @@ class BasicTest(BaseTest): def test_upgrade_dependencies(self): builder = venv.EnvBuilder() bin_path = 'Scripts' if sys.platform == 'win32' else 'bin' - pip_exe = 'pip.exe' if sys.platform == 'win32' else 'pip' + python_exe = 'python.exe' if sys.platform == 'win32' else 'python' with tempfile.TemporaryDirectory() as fake_env_dir: def pip_cmd_checker(cmd): self.assertEqual( cmd, [ - os.path.join(fake_env_dir, bin_path, pip_exe), + os.path.join(fake_env_dir, bin_path, python_exe), + '-m', + 'pip', 'install', - '-U', + '--upgrade', 'pip', 'setuptools' ] diff --git a/Lib/venv/__init__.py b/Lib/venv/__init__.py index 4ab9cc6d6fb..81cb1d13e21 100644 --- a/Lib/venv/__init__.py +++ b/Lib/venv/__init__.py @@ -393,10 +393,10 @@ class EnvBuilder: f'Upgrading {CORE_VENV_DEPS} packages in {context.bin_path}' ) if sys.platform == 'win32': - pip_exe = os.path.join(context.bin_path, 'pip.exe') + python_exe = os.path.join(context.bin_path, 'python.exe') else: - pip_exe = os.path.join(context.bin_path, 'pip') - cmd = [pip_exe, 'install', '-U'] + python_exe = os.path.join(context.bin_path, 'python') + cmd = [python_exe, '-m', 'pip', 'install', '--upgrade'] cmd.extend(CORE_VENV_DEPS) subprocess.check_call(cmd) diff --git a/Misc/NEWS.d/next/Library/2019-11-27-17-47-00.bpo-38927.qT7xKY.rst b/Misc/NEWS.d/next/Library/2019-11-27-17-47-00.bpo-38927.qT7xKY.rst new file mode 100644 index 00000000000..ca6ed63e5cc --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-11-27-17-47-00.bpo-38927.qT7xKY.rst @@ -0,0 +1 @@ +Use ``python -m pip`` instead of ``pip`` to upgrade dependencies in venv. From 02519f75d15b063914a11351da30178ca4ceb54b Mon Sep 17 00:00:00 2001 From: Tal Einat Date: Thu, 28 Nov 2019 07:22:09 +0200 Subject: [PATCH 051/115] bpo-38524: clarify example a bit and improve formatting (GH-17406) --- Doc/reference/datamodel.rst | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/Doc/reference/datamodel.rst b/Doc/reference/datamodel.rst index 68098508afb..b22ed92ec96 100644 --- a/Doc/reference/datamodel.rst +++ b/Doc/reference/datamodel.rst @@ -1657,13 +1657,16 @@ class' :attr:`~object.__dict__`. .. note:: - ``__set_name__`` is only called implicitly as part of the ``type`` constructor, so - it will need to be called explicitly with the appropriate parameters when a - descriptor is added to a class after initial creation:: + :meth:`__set_name__` is only called implicitly as part of the + :class:`type` constructor, so it will need to be called explicitly with + the appropriate parameters when a descriptor is added to a class after + initial creation:: + class A: + pass descr = custom_descriptor() - cls.attr = descr - descr.__set_name__(cls, 'attr') + A.attr = descr + descr.__set_name__(A, 'attr') See :ref:`class-object-creation` for more details. From bea33f5e1db6e4a554919a82894f44568576e979 Mon Sep 17 00:00:00 2001 From: Steve Dower Date: Thu, 28 Nov 2019 08:46:11 -0800 Subject: [PATCH 052/115] bpo-38920: Add audit hooks for when sys.excepthook and sys.unraisable hooks are invoked (GH-17392) Also fixes some potential segfaults in unraisable hook handling. --- Doc/library/sys.rst | 23 +++++- Lib/test/audit-tests.py | 37 +++++++++ Lib/test/test_audit.py | 56 ++++++++++---- .../2019-11-26-09-16-47.bpo-38920.Vx__sT.rst | 2 + Python/errors.c | 76 +++++++++++-------- Python/pythonrun.c | 8 ++ Python/sysmodule.c | 4 +- 7 files changed, 156 insertions(+), 50 deletions(-) create mode 100644 Misc/NEWS.d/next/Core and Builtins/2019-11-26-09-16-47.bpo-38920.Vx__sT.rst diff --git a/Doc/library/sys.rst b/Doc/library/sys.rst index 2f33445a6f9..a824fb95e8e 100644 --- a/Doc/library/sys.rst +++ b/Doc/library/sys.rst @@ -36,13 +36,18 @@ always available. .. audit-event:: sys.addaudithook "" sys.addaudithook Raise an auditing event ``sys.addaudithook`` with no arguments. If any - existing hooks raise an exception derived from :class:`Exception`, the + existing hooks raise an exception derived from :class:`RuntimeError`, the new hook will not be added and the exception suppressed. As a result, callers cannot assume that their hook has been added unless they control all existing hooks. .. versionadded:: 3.8 + .. versionchanged:: 3.8.1 + + Exceptions derived from :class:`Exception` but not :class:`RuntimeError` + are no longer suppressed. + .. impl-detail:: When tracing is enabled (see :func:`settrace`), Python hooks are only @@ -308,6 +313,15 @@ always available. before the program exits. The handling of such top-level exceptions can be customized by assigning another three-argument function to ``sys.excepthook``. + .. audit-event:: sys.excepthook hook,type,value,traceback sys.excepthook + + Raise an auditing event ``sys.excepthook`` with arguments ``hook``, + ``type``, ``value``, ``traceback`` when an uncaught exception occurs. + If no hook has been set, ``hook`` may be ``None``. If any hook raises + an exception derived from :class:`RuntimeError` the call to the hook will + be suppressed. Otherwise, the audit hook exception will be reported as + unraisable and ``sys.excepthook`` will be called. + .. seealso:: The :func:`sys.unraisablehook` function handles unraisable exceptions @@ -1540,6 +1554,13 @@ always available. See also :func:`excepthook` which handles uncaught exceptions. + .. audit-event:: sys.unraisablehook hook,unraisable sys.unraisablehook + + Raise an auditing event ``sys.unraisablehook`` with arguments + ``hook``, ``unraisable`` when an exception that cannot be handled occurs. + The ``unraisable`` object is the same as what will be passed to the hook. + If no hook has been set, ``hook`` may be ``None``. + .. versionadded:: 3.8 .. data:: version diff --git a/Lib/test/audit-tests.py b/Lib/test/audit-tests.py index ddeff22030a..ed08612c041 100644 --- a/Lib/test/audit-tests.py +++ b/Lib/test/audit-tests.py @@ -263,13 +263,50 @@ def test_cantrace(): def test_mmap(): import mmap + with TestHook() as hook: mmap.mmap(-1, 8) assertEqual(hook.seen[0][1][:2], (-1, 8)) +def test_excepthook(): + def excepthook(exc_type, exc_value, exc_tb): + if exc_type is not RuntimeError: + sys.__excepthook__(exc_type, exc_value, exc_tb) + + def hook(event, args): + if event == "sys.excepthook": + if not isinstance(args[2], args[1]): + raise TypeError(f"Expected isinstance({args[2]!r}, " f"{args[1]!r})") + if args[0] != excepthook: + raise ValueError(f"Expected {args[0]} == {excepthook}") + print(event, repr(args[2])) + + sys.addaudithook(hook) + sys.excepthook = excepthook + raise RuntimeError("fatal-error") + + +def test_unraisablehook(): + from _testcapi import write_unraisable_exc + + def unraisablehook(hookargs): + pass + + def hook(event, args): + if event == "sys.unraisablehook": + if args[0] != unraisablehook: + raise ValueError(f"Expected {args[0]} == {unraisablehook}") + print(event, repr(args[1].exc_value), args[1].err_msg) + + sys.addaudithook(hook) + sys.unraisablehook = unraisablehook + write_unraisable_exc(RuntimeError("nonfatal-error"), "for audit hook test", None) + + if __name__ == "__main__": from test.libregrtest.setup import suppress_msvcrt_asserts + suppress_msvcrt_asserts(False) test = sys.argv[1] diff --git a/Lib/test/test_audit.py b/Lib/test/test_audit.py index 41f9fae1022..31a08559273 100644 --- a/Lib/test/test_audit.py +++ b/Lib/test/test_audit.py @@ -24,7 +24,23 @@ class AuditTest(unittest.TestCase): sys.stdout.writelines(p.stdout) sys.stderr.writelines(p.stderr) if p.returncode: - self.fail(''.join(p.stderr)) + self.fail("".join(p.stderr)) + + def run_python(self, *args): + events = [] + with subprocess.Popen( + [sys.executable, "-X utf8", AUDIT_TESTS_PY, *args], + encoding="utf-8", + stdout=subprocess.PIPE, + stderr=subprocess.PIPE, + ) as p: + p.wait() + sys.stderr.writelines(p.stderr) + return ( + p.returncode, + [line.strip().partition(" ") for line in p.stdout], + "".join(p.stderr), + ) def test_basic(self): self.do_test("test_basic") @@ -36,19 +52,11 @@ class AuditTest(unittest.TestCase): self.do_test("test_block_add_hook_baseexception") def test_finalize_hooks(self): - events = [] - with subprocess.Popen( - [sys.executable, "-X utf8", AUDIT_TESTS_PY, "test_finalize_hooks"], - encoding="utf-8", - stdout=subprocess.PIPE, - stderr=subprocess.PIPE, - ) as p: - p.wait() - for line in p.stdout: - events.append(line.strip().partition(" ")) - sys.stderr.writelines(p.stderr) - if p.returncode: - self.fail(''.join(p.stderr)) + returncode, events, stderr = self.run_python("test_finalize_hooks") + if stderr: + print(stderr, file=sys.stderr) + if returncode: + self.fail(stderr) firstId = events[0][2] self.assertSequenceEqual( @@ -76,6 +84,26 @@ class AuditTest(unittest.TestCase): def test_mmap(self): self.do_test("test_mmap") + def test_excepthook(self): + returncode, events, stderr = self.run_python("test_excepthook") + if not returncode: + self.fail(f"Expected fatal exception\n{stderr}") + + self.assertSequenceEqual( + [("sys.excepthook", " ", "RuntimeError('fatal-error')")], events + ) + + def test_unraisablehook(self): + returncode, events, stderr = self.run_python("test_unraisablehook") + if returncode: + self.fail(stderr) + + self.assertEqual(events[0][0], "sys.unraisablehook") + self.assertEqual( + events[0][2], + "RuntimeError('nonfatal-error') Exception ignored for audit hook test", + ) + if __name__ == "__main__": unittest.main() diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-11-26-09-16-47.bpo-38920.Vx__sT.rst b/Misc/NEWS.d/next/Core and Builtins/2019-11-26-09-16-47.bpo-38920.Vx__sT.rst new file mode 100644 index 00000000000..2e9e443dd99 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2019-11-26-09-16-47.bpo-38920.Vx__sT.rst @@ -0,0 +1,2 @@ +Add audit hooks for when :func:`sys.excepthook` and +:func:`sys.unraisablehook` are invoked diff --git a/Python/errors.c b/Python/errors.c index 1783084c336..d65707e7f97 100644 --- a/Python/errors.c +++ b/Python/errors.c @@ -1391,43 +1391,53 @@ _PyErr_WriteUnraisableMsg(const char *err_msg_str, PyObject *obj) } } + PyObject *hook_args = make_unraisable_hook_args( + tstate, exc_type, exc_value, exc_tb, err_msg, obj); + if (hook_args == NULL) { + err_msg_str = ("Exception ignored on building " + "sys.unraisablehook arguments"); + goto error; + } + _Py_IDENTIFIER(unraisablehook); PyObject *hook = _PySys_GetObjectId(&PyId_unraisablehook); - if (hook != NULL && hook != Py_None) { - PyObject *hook_args; - - hook_args = make_unraisable_hook_args(tstate, exc_type, exc_value, - exc_tb, err_msg, obj); - if (hook_args != NULL) { - PyObject *res = _PyObject_CallOneArg(hook, hook_args); - Py_DECREF(hook_args); - if (res != NULL) { - Py_DECREF(res); - goto done; - } - - err_msg_str = "Exception ignored in sys.unraisablehook"; - } - else { - err_msg_str = ("Exception ignored on building " - "sys.unraisablehook arguments"); - } - - Py_XDECREF(err_msg); - err_msg = PyUnicode_FromString(err_msg_str); - if (err_msg == NULL) { - PyErr_Clear(); - } - - /* sys.unraisablehook failed: log its error using default hook */ - Py_XDECREF(exc_type); - Py_XDECREF(exc_value); - Py_XDECREF(exc_tb); - _PyErr_Fetch(tstate, &exc_type, &exc_value, &exc_tb); - - obj = hook; + if (hook == NULL) { + Py_DECREF(hook_args); + goto default_hook; } + if (PySys_Audit("sys.unraisablehook", "OO", hook, hook_args) < 0) { + Py_DECREF(hook_args); + err_msg_str = "Exception ignored in audit hook"; + obj = NULL; + goto error; + } + + if (hook == Py_None) { + Py_DECREF(hook_args); + goto default_hook; + } + + PyObject *res = _PyObject_CallOneArg(hook, hook_args); + Py_DECREF(hook_args); + if (res != NULL) { + Py_DECREF(res); + goto done; + } + + /* sys.unraisablehook failed: log its error using default hook */ + obj = hook; + err_msg_str = NULL; + +error: + /* err_msg_str and obj have been updated and we have a new exception */ + Py_XSETREF(err_msg, PyUnicode_FromString(err_msg_str ? + err_msg_str : "Exception ignored in sys.unraisablehook")); + Py_XDECREF(exc_type); + Py_XDECREF(exc_value); + Py_XDECREF(exc_tb); + _PyErr_Fetch(tstate, &exc_type, &exc_value, &exc_tb); + default_hook: /* Call the default unraisable hook (ignore failure) */ (void)write_unraisable_exc(tstate, exc_type, exc_value, exc_tb, diff --git a/Python/pythonrun.c b/Python/pythonrun.c index 77a95ceb94b..b68a0b5572a 100644 --- a/Python/pythonrun.c +++ b/Python/pythonrun.c @@ -695,6 +695,14 @@ _PyErr_PrintEx(PyThreadState *tstate, int set_sys_last_vars) } } hook = _PySys_GetObjectId(&PyId_excepthook); + if (PySys_Audit("sys.excepthook", "OOOO", hook ? hook : Py_None, + exception, v, tb) < 0) { + if (PyErr_ExceptionMatches(PyExc_RuntimeError)) { + PyErr_Clear(); + goto done; + } + _PyErr_WriteUnraisableMsg("in audit hook", NULL); + } if (hook) { PyObject* stack[3]; PyObject *result; diff --git a/Python/sysmodule.c b/Python/sysmodule.c index 30c7e987461..78b9d22821f 100644 --- a/Python/sysmodule.c +++ b/Python/sysmodule.c @@ -323,8 +323,8 @@ PySys_AddAuditHook(Py_AuditHookFunction hook, void *userData) /* Cannot invoke hooks until we are initialized */ if (runtime->initialized) { if (PySys_Audit("sys.addaudithook", NULL) < 0) { - if (_PyErr_ExceptionMatches(tstate, PyExc_Exception)) { - /* We do not report errors derived from Exception */ + if (_PyErr_ExceptionMatches(tstate, PyExc_RuntimeError)) { + /* We do not report errors derived from RuntimeError */ _PyErr_Clear(tstate); return 0; } From 1df65f7c6c00dfae9286c7a58e1b3803e3af33e5 Mon Sep 17 00:00:00 2001 From: Brett Cannon <54418+brettcannon@users.noreply.github.com> Date: Fri, 29 Nov 2019 15:37:08 -0800 Subject: [PATCH 053/115] Fix old mention of virtualenv (GH-17417) Automerge-Triggered-By: @brettcannon --- Lib/venv/scripts/posix/activate.fish | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Lib/venv/scripts/posix/activate.fish b/Lib/venv/scripts/posix/activate.fish index d213b9060a6..cb1ba1c301e 100644 --- a/Lib/venv/scripts/posix/activate.fish +++ b/Lib/venv/scripts/posix/activate.fish @@ -1,7 +1,7 @@ # This file must be used with "source /bin/activate.fish" *from fish* # (http://fishshell.org); you cannot run it directly. -function deactivate -d "Exit virtualenv and return to normal shell environment" +function deactivate -d "Exit virtual environment and return to normal shell environment" # reset old environment variables if test -n "$_OLD_VIRTUAL_PATH" set -gx PATH $_OLD_VIRTUAL_PATH From 8d62df60d8733d0fa9aee14ef746d0009a7a9726 Mon Sep 17 00:00:00 2001 From: Daniel Hillier Date: Sat, 30 Nov 2019 19:30:47 +1100 Subject: [PATCH 054/115] bpo-37523: Raise ValueError for I/O operations on a closed zipfile.ZipExtFile. (GH-14658) Raises ValueError when calling the following on a closed zipfile.ZipExtFile: read, readable, seek, seekable, tell. --- Lib/test/test_zipfile.py | 14 ++++++++++++++ Lib/zipfile.py | 10 ++++++++++ .../2019-10-02-02-55-37.bpo-37523.GguwJ6.rst | 1 + 3 files changed, 25 insertions(+) create mode 100644 Misc/NEWS.d/next/Library/2019-10-02-02-55-37.bpo-37523.GguwJ6.rst diff --git a/Lib/test/test_zipfile.py b/Lib/test/test_zipfile.py index 1e1854be710..66f05ac1f3a 100644 --- a/Lib/test/test_zipfile.py +++ b/Lib/test/test_zipfile.py @@ -571,6 +571,20 @@ class StoredTestsWithSourceFile(AbstractTestsWithSourceFile, with open(TESTFN, "rb") as f: self.assertEqual(zipfp.read(TESTFN), f.read()) + def test_io_on_closed_zipextfile(self): + fname = "somefile.txt" + with zipfile.ZipFile(TESTFN2, mode="w") as zipfp: + zipfp.writestr(fname, "bogus") + + with zipfile.ZipFile(TESTFN2, mode="r") as zipfp: + with zipfp.open(fname) as fid: + fid.close() + self.assertRaises(ValueError, fid.read) + self.assertRaises(ValueError, fid.seek, 0) + self.assertRaises(ValueError, fid.tell) + self.assertRaises(ValueError, fid.readable) + self.assertRaises(ValueError, fid.seekable) + def test_write_to_readonly(self): """Check that trying to call write() on a readonly ZipFile object raises a ValueError.""" diff --git a/Lib/zipfile.py b/Lib/zipfile.py index b0afb9da942..e1d07f2a523 100644 --- a/Lib/zipfile.py +++ b/Lib/zipfile.py @@ -889,12 +889,16 @@ class ZipExtFile(io.BufferedIOBase): return self._readbuffer[self._offset: self._offset + 512] def readable(self): + if self.closed: + raise ValueError("I/O operation on closed file.") return True def read(self, n=-1): """Read and return up to n bytes. If the argument is omitted, None, or negative, data is read and returned until EOF is reached. """ + if self.closed: + raise ValueError("read from closed file.") if n is None or n < 0: buf = self._readbuffer[self._offset:] self._readbuffer = b'' @@ -1031,9 +1035,13 @@ class ZipExtFile(io.BufferedIOBase): super().close() def seekable(self): + if self.closed: + raise ValueError("I/O operation on closed file.") return self._seekable def seek(self, offset, whence=0): + if self.closed: + raise ValueError("seek on closed file.") if not self._seekable: raise io.UnsupportedOperation("underlying stream is not seekable") curr_pos = self.tell() @@ -1082,6 +1090,8 @@ class ZipExtFile(io.BufferedIOBase): return self.tell() def tell(self): + if self.closed: + raise ValueError("tell on closed file.") if not self._seekable: raise io.UnsupportedOperation("underlying stream is not seekable") filepos = self._orig_file_size - self._left - len(self._readbuffer) + self._offset diff --git a/Misc/NEWS.d/next/Library/2019-10-02-02-55-37.bpo-37523.GguwJ6.rst b/Misc/NEWS.d/next/Library/2019-10-02-02-55-37.bpo-37523.GguwJ6.rst new file mode 100644 index 00000000000..5711969ff38 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-10-02-02-55-37.bpo-37523.GguwJ6.rst @@ -0,0 +1 @@ +Change :class:`zipfile.ZipExtFile` to raise ``ValueError`` when trying to access the underlying file object after it has been closed. This new behavior is consistent with how accessing closed files is handled in other parts of Python. \ No newline at end of file From 575d0b46d122292ca6e0576a91265d7abf7cbc3d Mon Sep 17 00:00:00 2001 From: Ofek Lev Date: Sun, 1 Dec 2019 00:44:21 -0500 Subject: [PATCH 055/115] Fix typos (GH-17423) --- Doc/library/datetime.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Doc/library/datetime.rst b/Doc/library/datetime.rst index f9a114eeb0a..2bd25cc4362 100644 --- a/Doc/library/datetime.rst +++ b/Doc/library/datetime.rst @@ -881,7 +881,7 @@ Other constructors, all class methods: Because naive ``datetime`` objects are treated by many ``datetime`` methods as local times, it is preferred to use aware datetimes to represent times in UTC. As such, the recommended way to create an object representing the - current time in UTC by calling ``datetime.now(timezone.utc)``. + current time in UTC is by calling ``datetime.now(timezone.utc)``. .. classmethod:: datetime.fromtimestamp(timestamp, tz=None) @@ -942,7 +942,7 @@ Other constructors, all class methods: Because naive ``datetime`` objects are treated by many ``datetime`` methods as local times, it is preferred to use aware datetimes to represent times in UTC. As such, the recommended way to create an object representing a - specific timestamp in UTC by calling + specific timestamp in UTC is by calling ``datetime.fromtimestamp(timestamp, tz=timezone.utc)``. .. versionchanged:: 3.3 From fdafa1d0ed0a8930b52ee81e57c931cc4d5c2388 Mon Sep 17 00:00:00 2001 From: idomic Date: Sun, 1 Dec 2019 15:07:39 -0500 Subject: [PATCH 056/115] document threading.Lock.locked() (GH-17427) --- Doc/library/threading.rst | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Doc/library/threading.rst b/Doc/library/threading.rst index 9a68491fbd5..96989bdd525 100644 --- a/Doc/library/threading.rst +++ b/Doc/library/threading.rst @@ -496,6 +496,10 @@ All methods are executed atomically. There is no return value. + .. method:: locked() + Return true if the lock is acquired. + + .. _rlock-objects: From 2fe4c48917c2d1b40cf063c6ed22ae2e71f4cb62 Mon Sep 17 00:00:00 2001 From: Dong-hee Na Date: Mon, 2 Dec 2019 08:06:28 +0900 Subject: [PATCH 057/115] bpo-38449: Add URL delimiters test cases (#16729) * bpo-38449: Add tricky test cases * bpo-38449: Reflect codereview --- Lib/test/test_mimetypes.py | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/Lib/test/test_mimetypes.py b/Lib/test/test_mimetypes.py index bfd5eeedaa7..a5a06b189de 100644 --- a/Lib/test/test_mimetypes.py +++ b/Lib/test/test_mimetypes.py @@ -51,6 +51,21 @@ class MimeTypesTestCase(unittest.TestCase): eq(self.db.guess_type('foo.xul', strict=False), ('text/xul', None)) eq(self.db.guess_extension('image/jpg', strict=False), '.jpg') + def test_filename_with_url_delimiters(self): + # bpo-38449: URL delimiters cases should be handled also. + # They would have different mime types if interpreted as URL as + # compared to when interpreted as filename because of the semicolon. + eq = self.assertEqual + gzip_expected = ('application/x-tar', 'gzip') + eq(self.db.guess_type(";1.tar.gz"), gzip_expected) + eq(self.db.guess_type("?1.tar.gz"), gzip_expected) + eq(self.db.guess_type("#1.tar.gz"), gzip_expected) + eq(self.db.guess_type("#1#.tar.gz"), gzip_expected) + eq(self.db.guess_type(";1#.tar.gz"), gzip_expected) + eq(self.db.guess_type(";&1=123;?.tar.gz"), gzip_expected) + eq(self.db.guess_type("?k1=v1&k2=v2.tar.gz"), gzip_expected) + eq(self.db.guess_type(r" \"\`;b&b&c |.tar.gz"), gzip_expected) + def test_guess_all_types(self): eq = self.assertEqual unless = self.assertTrue From 34864d1cffdbfc620f8517dab9a68ae9a37b8c53 Mon Sep 17 00:00:00 2001 From: torsava Date: Mon, 2 Dec 2019 17:15:42 +0100 Subject: [PATCH 058/115] bpo-38815: Accept TLSv3 default in min max test (GH-NNNN) (GH-17437) Make ssl tests less strict and also accept TLSv3 as the default maximum version. This change unbreaks test_min_max_version on Fedora 32. https://bugs.python.org/issue38815 --- Lib/test/test_ssl.py | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/Lib/test/test_ssl.py b/Lib/test/test_ssl.py index 3cd6e927a46..258816d912b 100644 --- a/Lib/test/test_ssl.py +++ b/Lib/test/test_ssl.py @@ -1203,12 +1203,18 @@ class ContextTests(unittest.TestCase): # RHEL 8 uses TLS 1.2 by default ssl.TLSVersion.TLSv1_2 } + maximum_range = { + # stock OpenSSL + ssl.TLSVersion.MAXIMUM_SUPPORTED, + # Fedora 32 uses TLS 1.3 by default + ssl.TLSVersion.TLSv1_3 + } self.assertIn( ctx.minimum_version, minimum_range ) - self.assertEqual( - ctx.maximum_version, ssl.TLSVersion.MAXIMUM_SUPPORTED + self.assertIn( + ctx.maximum_version, maximum_range ) ctx.minimum_version = ssl.TLSVersion.TLSv1_1 From 016b0280b8a97bc26e97c6a8dd5fb8fad5fe72e4 Mon Sep 17 00:00:00 2001 From: Pablo Galindo Date: Mon, 2 Dec 2019 18:09:43 +0000 Subject: [PATCH 059/115] Fix compiler warning in Objects/unicodeobject.c (GH-17440) --- Objects/unicodeobject.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c index 77760195b32..1ec2accdb09 100644 --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -15950,7 +15950,7 @@ _PyUnicode_Fini(PyThreadState *tstate) interp->fs_codec.encoding = NULL; PyMem_RawFree(interp->fs_codec.errors); interp->fs_codec.errors = NULL; - interp->config.filesystem_errors = _Py_ERROR_UNKNOWN; + interp->config.filesystem_errors = (wchar_t *)_Py_ERROR_UNKNOWN; } From a62ad4730c9b575f140f24074656c0257c86a09a Mon Sep 17 00:00:00 2001 From: Matthew Rollings <1211162+stealthcopter@users.noreply.github.com> Date: Mon, 2 Dec 2019 22:25:21 +0000 Subject: [PATCH 060/115] bpo-38945: UU Encoding: Don't let newline in filename corrupt the output format (#17418) --- Lib/encodings/uu_codec.py | 4 ++++ Lib/test/test_uu.py | 9 +++++++++ Lib/uu.py | 7 +++++++ .../Security/2019-12-01-22-44-40.bpo-38945.ztmNXc.rst | 1 + 4 files changed, 21 insertions(+) create mode 100644 Misc/NEWS.d/next/Security/2019-12-01-22-44-40.bpo-38945.ztmNXc.rst diff --git a/Lib/encodings/uu_codec.py b/Lib/encodings/uu_codec.py index 2a5728fb5b7..4e58c62fe9e 100644 --- a/Lib/encodings/uu_codec.py +++ b/Lib/encodings/uu_codec.py @@ -20,6 +20,10 @@ def uu_encode(input, errors='strict', filename='', mode=0o666): read = infile.read write = outfile.write + # Remove newline chars from filename + filename = filename.replace('\n','\\n') + filename = filename.replace('\r','\\r') + # Encode write(('begin %o %s\n' % (mode & 0o777, filename)).encode('ascii')) chunk = read(45) diff --git a/Lib/test/test_uu.py b/Lib/test/test_uu.py index c9f05e5b760..c8709f7a0d6 100644 --- a/Lib/test/test_uu.py +++ b/Lib/test/test_uu.py @@ -136,6 +136,15 @@ class UUTest(unittest.TestCase): decoded = codecs.decode(encodedtext, "uu_codec") self.assertEqual(decoded, plaintext) + def test_newlines_escaped(self): + # Test newlines are escaped with uu.encode + inp = io.BytesIO(plaintext) + out = io.BytesIO() + filename = "test.txt\n\roverflow.txt" + safefilename = b"test.txt\\n\\roverflow.txt" + uu.encode(inp, out, filename) + self.assertIn(safefilename, out.getvalue()) + class UUStdIOTest(unittest.TestCase): def setUp(self): diff --git a/Lib/uu.py b/Lib/uu.py index 9b1e5e60720..9f1f37f1a64 100755 --- a/Lib/uu.py +++ b/Lib/uu.py @@ -73,6 +73,13 @@ def encode(in_file, out_file, name=None, mode=None, *, backtick=False): name = '-' if mode is None: mode = 0o666 + + # + # Remove newline chars from name + # + name = name.replace('\n','\\n') + name = name.replace('\r','\\r') + # # Write the data # diff --git a/Misc/NEWS.d/next/Security/2019-12-01-22-44-40.bpo-38945.ztmNXc.rst b/Misc/NEWS.d/next/Security/2019-12-01-22-44-40.bpo-38945.ztmNXc.rst new file mode 100644 index 00000000000..1bf6ed567b2 --- /dev/null +++ b/Misc/NEWS.d/next/Security/2019-12-01-22-44-40.bpo-38945.ztmNXc.rst @@ -0,0 +1 @@ +Newline characters have been escaped when performing uu encoding to prevent them from overflowing into to content section of the encoded file. This prevents malicious or accidental modification of data during the decoding process. \ No newline at end of file From 894331838b256412c95d54051ec46a1cb96f52e7 Mon Sep 17 00:00:00 2001 From: stratakis Date: Tue, 3 Dec 2019 16:35:54 +0100 Subject: [PATCH 061/115] bpo-38270: Fix indentation of test_hmac assertions (GH-17446) Since https://github.com/python/cpython/commit/c64a1a61e6fc542cada40eb069a239317e1af36e two assertions were indented and thus ignored when running test_hmac. This PR fixes it. As the change is quite trivial I didn't add a NEWS entry. https://bugs.python.org/issue38270 --- Lib/test/test_hmac.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Lib/test/test_hmac.py b/Lib/test/test_hmac.py index ea00367c802..23c108f6e3c 100644 --- a/Lib/test/test_hmac.py +++ b/Lib/test/test_hmac.py @@ -367,7 +367,7 @@ class ConstructorTestCase(unittest.TestCase): digestmod="sha256") except Exception: self.fail("Constructor call with bytearray arguments raised exception.") - self.assertEqual(h.hexdigest(), self.expected) + self.assertEqual(h.hexdigest(), self.expected) @requires_hashdigest('sha256') def test_with_memoryview_msg(self): @@ -375,7 +375,7 @@ class ConstructorTestCase(unittest.TestCase): h = hmac.HMAC(b"key", memoryview(b"hash this!"), digestmod="sha256") except Exception: self.fail("Constructor call with memoryview msg raised exception.") - self.assertEqual(h.hexdigest(), self.expected) + self.assertEqual(h.hexdigest(), self.expected) @requires_hashdigest('sha256') def test_withmodule(self): From eb48a451e3844185b9a8751c9badffbddc89689d Mon Sep 17 00:00:00 2001 From: An Long Date: Wed, 4 Dec 2019 07:30:53 +0800 Subject: [PATCH 062/115] bpo-27873: Update docstring for multiprocessing.Pool.map (GH-17436) Update docstring for `multiprocessing.Pool.map` to mention `pool.starmap()`. Prev PR: https://github.com/python/cpython/pull/17367 @aeros https://bugs.python.org/issue27873 --- Doc/library/multiprocessing.rst | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Doc/library/multiprocessing.rst b/Doc/library/multiprocessing.rst index d8182feab96..3c7b5cc1262 100644 --- a/Doc/library/multiprocessing.rst +++ b/Doc/library/multiprocessing.rst @@ -2169,7 +2169,8 @@ with the :class:`Pool` class. .. method:: map(func, iterable[, chunksize]) A parallel equivalent of the :func:`map` built-in function (it supports only - one *iterable* argument though). It blocks until the result is ready. + one *iterable* argument though, for multiple iterables see :meth:`starmap`). + It blocks until the result is ready. This method chops the iterable into a number of chunks which it submits to the process pool as separate tasks. The (approximate) size of these From 03257949bc02a4afdf2ea1eb07a73f8128129579 Mon Sep 17 00:00:00 2001 From: Daniel Himmelstein Date: Wed, 4 Dec 2019 01:15:19 -0500 Subject: [PATCH 063/115] bpo-29636: Add --(no-)indent arguments to json.tool (GH-345) --- Lib/json/tool.py | 30 ++++++++++---- Lib/test/test_json/test_tool.py | 41 +++++++++++++++++++ .../2018-02-22-11-24-33.bpo-29636.ogGRE2.rst | 5 +++ 3 files changed, 69 insertions(+), 7 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2018-02-22-11-24-33.bpo-29636.ogGRE2.rst diff --git a/Lib/json/tool.py b/Lib/json/tool.py index b3ef9923e31..6c687d77c51 100644 --- a/Lib/json/tool.py +++ b/Lib/json/tool.py @@ -30,20 +30,36 @@ def main(): help='sort the output of dictionaries alphabetically by key') parser.add_argument('--json-lines', action='store_true', default=False, help='parse input using the jsonlines format') + group = parser.add_mutually_exclusive_group() + group.add_argument('--indent', default=4, type=int, + help='separate items with newlines and use this number ' + 'of spaces for indentation') + group.add_argument('--tab', action='store_const', dest='indent', + const='\t', help='separate items with newlines and use ' + 'tabs for indentation') + group.add_argument('--no-indent', action='store_const', dest='indent', + const=None, + help='separate items with spaces rather than newlines') + group.add_argument('--compact', action='store_true', + help='suppress all whitespace separation (most compact)') options = parser.parse_args() - infile = options.infile - outfile = options.outfile - sort_keys = options.sort_keys - json_lines = options.json_lines - with infile, outfile: + dump_args = { + 'sort_keys': options.sort_keys, + 'indent': options.indent, + } + if options.compact: + dump_args['indent'] = None + dump_args['separators'] = ',', ':' + + with options.infile as infile, options.outfile as outfile: try: - if json_lines: + if options.json_lines: objs = (json.loads(line) for line in infile) else: objs = (json.load(infile), ) for obj in objs: - json.dump(obj, outfile, sort_keys=sort_keys, indent=4) + json.dump(obj, outfile, **dump_args) outfile.write('\n') except ValueError as e: raise SystemExit(e) diff --git a/Lib/test/test_json/test_tool.py b/Lib/test/test_json/test_tool.py index 1e95bc79e5d..81d179c6d10 100644 --- a/Lib/test/test_json/test_tool.py +++ b/Lib/test/test_json/test_tool.py @@ -134,3 +134,44 @@ class TestTool(unittest.TestCase): self.assertEqual(out.splitlines(), self.expect_without_sort_keys.encode().splitlines()) self.assertEqual(err, b'') + + def test_indent(self): + json_stdin = b'[1, 2]' + expect = textwrap.dedent('''\ + [ + 1, + 2 + ] + ''').encode() + args = sys.executable, '-m', 'json.tool', '--indent', '2' + with Popen(args, stdin=PIPE, stdout=PIPE, stderr=PIPE) as proc: + json_stdout, err = proc.communicate(json_stdin) + self.assertEqual(expect.splitlines(), json_stdout.splitlines()) + self.assertEqual(err, b'') + + def test_no_indent(self): + json_stdin = b'[1,\n2]' + expect = b'[1, 2]' + args = sys.executable, '-m', 'json.tool', '--no-indent' + with Popen(args, stdin=PIPE, stdout=PIPE, stderr=PIPE) as proc: + json_stdout, err = proc.communicate(json_stdin) + self.assertEqual(expect.splitlines(), json_stdout.splitlines()) + self.assertEqual(err, b'') + + def test_tab(self): + json_stdin = b'[1, 2]' + expect = b'[\n\t1,\n\t2\n]\n' + args = sys.executable, '-m', 'json.tool', '--tab' + with Popen(args, stdin=PIPE, stdout=PIPE, stderr=PIPE) as proc: + json_stdout, err = proc.communicate(json_stdin) + self.assertEqual(expect.splitlines(), json_stdout.splitlines()) + self.assertEqual(err, b'') + + def test_compact(self): + json_stdin = b'[ 1 ,\n 2]' + expect = b'[1,2]' + args = sys.executable, '-m', 'json.tool', '--compact' + with Popen(args, stdin=PIPE, stdout=PIPE, stderr=PIPE) as proc: + json_stdout, err = proc.communicate(json_stdin) + self.assertEqual(expect.splitlines(), json_stdout.splitlines()) + self.assertEqual(err, b'') diff --git a/Misc/NEWS.d/next/Library/2018-02-22-11-24-33.bpo-29636.ogGRE2.rst b/Misc/NEWS.d/next/Library/2018-02-22-11-24-33.bpo-29636.ogGRE2.rst new file mode 100644 index 00000000000..9f96ed28f92 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2018-02-22-11-24-33.bpo-29636.ogGRE2.rst @@ -0,0 +1,5 @@ +Add whitespace options for formatting JSON with the ``json.tool`` CLI. The +following mutually exclusive options are now supported: ``--indent`` for +setting the indent level in spaces; ``--tab`` for indenting with tabs; +``--no-indent`` for suppressing newlines; and ``--compact`` for suppressing +all whitespace. The default behavior remains the same as ``--indent=4``. From 83f144962fd3f6677e35e5a02b62ab909497c58b Mon Sep 17 00:00:00 2001 From: Ethan Furman Date: Wed, 4 Dec 2019 00:18:31 -0800 Subject: [PATCH 064/115] add @ethanfurman for tarfile (GH-17461) --- .github/CODEOWNERS | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 7b415ac5c2f..40305d4607a 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -116,6 +116,7 @@ Include/pytime.h @pganssle @abalkin **/*enum* @ethanfurman **/*cgi* @ethanfurman +**/*tarfile* @ethanfurman # macOS /Mac/ @python/macos-team From edd5b38c137db82e2857242518fcc400e9b5a9c1 Mon Sep 17 00:00:00 2001 From: Raymond Hettinger Date: Wed, 4 Dec 2019 04:07:02 -0500 Subject: [PATCH 065/115] Add setobject.c (GH-17463) --- .github/CODEOWNERS | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 40305d4607a..9354cc85d28 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -11,6 +11,7 @@ **/*context* @1st1 **/*genobject* @1st1 **/*hamt* @1st1 +Objects/set* @rhettinger Objects/dict* @methane # Hashing From 24f5cac7254177a4c9956d680c0a9b6dadd85c6f Mon Sep 17 00:00:00 2001 From: Pablo Galindo Date: Wed, 4 Dec 2019 09:29:10 +0000 Subject: [PATCH 066/115] bpo-38962: Fix reference leak in test_httpservers (GH-17454) --- Lib/test/test_httpservers.py | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/Lib/test/test_httpservers.py b/Lib/test/test_httpservers.py index 26da71e0b27..c442f5571a8 100644 --- a/Lib/test/test_httpservers.py +++ b/Lib/test/test_httpservers.py @@ -807,11 +807,15 @@ class CGIHTTPServerTestCase(BaseTestCase): (res.read(), res.getheader('Content-type'), res.status)) def test_cgi_path_in_sub_directories(self): - CGIHTTPRequestHandler.cgi_directories.append('/sub/dir/cgi-bin') - res = self.request('/sub/dir/cgi-bin/file5.py') - self.assertEqual( - (b'Hello World' + self.linesep, 'text/html', HTTPStatus.OK), - (res.read(), res.getheader('Content-type'), res.status)) + try: + CGIHTTPRequestHandler.cgi_directories.append('/sub/dir/cgi-bin') + res = self.request('/sub/dir/cgi-bin/file5.py') + self.assertEqual( + (b'Hello World' + self.linesep, 'text/html', HTTPStatus.OK), + (res.read(), res.getheader('Content-type'), res.status)) + finally: + CGIHTTPRequestHandler.cgi_directories.remove('/sub/dir/cgi-bin') + class SocketlessRequestHandler(SimpleHTTPRequestHandler): From 808769f3a4cbdc47cf1a5708dd61b1787bb192d4 Mon Sep 17 00:00:00 2001 From: Inada Naoki Date: Wed, 4 Dec 2019 18:39:31 +0900 Subject: [PATCH 067/115] bpo-33684: json.tool: Use utf-8 for infile and outfile. (GH-17460) --- Lib/json/tool.py | 6 ++++-- Lib/test/test_json/test_tool.py | 21 ++++++++++++++++--- .../2019-12-04-15-28-40.bpo-33684.QeSmQP.rst | 2 ++ 3 files changed, 24 insertions(+), 5 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2019-12-04-15-28-40.bpo-33684.QeSmQP.rst diff --git a/Lib/json/tool.py b/Lib/json/tool.py index 6c687d77c51..2a404a44417 100644 --- a/Lib/json/tool.py +++ b/Lib/json/tool.py @@ -20,10 +20,12 @@ def main(): description = ('A simple command line interface for json module ' 'to validate and pretty-print JSON objects.') parser = argparse.ArgumentParser(prog=prog, description=description) - parser.add_argument('infile', nargs='?', type=argparse.FileType(), + parser.add_argument('infile', nargs='?', + type=argparse.FileType(encoding="utf-8"), help='a JSON file to be validated or pretty-printed', default=sys.stdin) - parser.add_argument('outfile', nargs='?', type=argparse.FileType('w'), + parser.add_argument('outfile', nargs='?', + type=argparse.FileType('w', encoding="utf-8"), help='write the output of infile to outfile', default=sys.stdout) parser.add_argument('--sort-keys', action='store_true', default=False, diff --git a/Lib/test/test_json/test_tool.py b/Lib/test/test_json/test_tool.py index 81d179c6d10..953a5696e7c 100644 --- a/Lib/test/test_json/test_tool.py +++ b/Lib/test/test_json/test_tool.py @@ -89,11 +89,11 @@ class TestTool(unittest.TestCase): self.assertEqual(out.splitlines(), self.expect.encode().splitlines()) self.assertEqual(err, b'') - def _create_infile(self): + def _create_infile(self, data=None): infile = support.TESTFN - with open(infile, "w") as fp: + with open(infile, "w", encoding="utf-8") as fp: self.addCleanup(os.remove, infile) - fp.write(self.data) + fp.write(data or self.data) return infile def test_infile_stdout(self): @@ -103,6 +103,21 @@ class TestTool(unittest.TestCase): self.assertEqual(out.splitlines(), self.expect.encode().splitlines()) self.assertEqual(err, b'') + def test_non_ascii_infile(self): + data = '{"msg": "\u3053\u3093\u306b\u3061\u306f"}' + expect = textwrap.dedent('''\ + { + "msg": "\\u3053\\u3093\\u306b\\u3061\\u306f" + } + ''').encode() + + infile = self._create_infile(data) + rc, out, err = assert_python_ok('-m', 'json.tool', infile) + + self.assertEqual(rc, 0) + self.assertEqual(out.splitlines(), expect.splitlines()) + self.assertEqual(err, b'') + def test_infile_outfile(self): infile = self._create_infile() outfile = support.TESTFN + '.out' diff --git a/Misc/NEWS.d/next/Library/2019-12-04-15-28-40.bpo-33684.QeSmQP.rst b/Misc/NEWS.d/next/Library/2019-12-04-15-28-40.bpo-33684.QeSmQP.rst new file mode 100644 index 00000000000..107f9bb0083 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-12-04-15-28-40.bpo-33684.QeSmQP.rst @@ -0,0 +1,2 @@ +Fix ``json.tool`` failed to read a JSON file with non-ASCII characters when +locale encoding is not UTF-8. From b96c6b0723b889d3a0c1740bce7f579f33d246f2 Mon Sep 17 00:00:00 2001 From: Pablo Galindo Date: Wed, 4 Dec 2019 11:19:59 +0000 Subject: [PATCH 068/115] bpo-38962: Fix reference leak in new_interpreter() (GH-17453) https://bugs.python.org/issue38962 Automerge-Triggered-By: @pablogsal --- Python/pylifecycle.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Python/pylifecycle.c b/Python/pylifecycle.c index cce4783bc12..9218978cc6f 100644 --- a/Python/pylifecycle.c +++ b/Python/pylifecycle.c @@ -648,9 +648,11 @@ pycore_init_builtins(PyThreadState *tstate) if (interp->builtins_copy == NULL) { goto error; } + Py_DECREF(bimod); return _PyStatus_OK(); error: + Py_XDECREF(bimod); return _PyStatus_ERR("can't initialize builtins module"); } From ac0e1c2694bc199dbd073312145e3c09bee52cc4 Mon Sep 17 00:00:00 2001 From: Pablo Galindo Date: Wed, 4 Dec 2019 11:51:03 +0000 Subject: [PATCH 069/115] bpo-38962: Fix reference leak in the per-subinterpreter gc (GH-17457) https://bugs.python.org/issue38962 Automerge-Triggered-By: @pablogsal --- Python/pylifecycle.c | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/Python/pylifecycle.c b/Python/pylifecycle.c index 9218978cc6f..d6f65ec3caf 100644 --- a/Python/pylifecycle.c +++ b/Python/pylifecycle.c @@ -1253,17 +1253,16 @@ finalize_interp_clear(PyThreadState *tstate) { int is_main_interp = _Py_IsMainInterpreter(tstate); - /* bpo-36854: Explicitly clear the codec registry - and trigger a GC collection */ PyInterpreterState *interp = tstate->interp; - Py_CLEAR(interp->codec_search_path); - Py_CLEAR(interp->codec_search_cache); - Py_CLEAR(interp->codec_error_registry); - _PyGC_CollectNoFail(); /* Clear interpreter state and all thread states */ PyInterpreterState_Clear(tstate->interp); + /* Trigger a GC collection on subinterpreters*/ + if (!is_main_interp) { + _PyGC_CollectNoFail(); + } + finalize_interp_types(tstate, is_main_interp); if (is_main_interp) { From 7105319ada2e663659020cbe9fdf7ff38f421ab2 Mon Sep 17 00:00:00 2001 From: serge-sans-paille Date: Wed, 4 Dec 2019 17:02:57 +0100 Subject: [PATCH 070/115] bpo-38634: Allow non-apple build to cope with libedit (GH-16986) The readline module now detects if Python is linked to libedit at runtime on all platforms. Previously, the check was only done on macOS. If Python is used as a library by a binary linking to libedit, the linker resolves the rl_initialize symbol required by the readline module against libedit instead of libreadline, which leads to a segfault. Take advantage of the existing supporting code to have readline module being compatible with both situations. --- .../2019-12-04-15-56-28.bpo-38634.pq0ZWa.rst | 2 ++ Modules/readline.c | 23 ++++--------------- 2 files changed, 6 insertions(+), 19 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2019-12-04-15-56-28.bpo-38634.pq0ZWa.rst diff --git a/Misc/NEWS.d/next/Library/2019-12-04-15-56-28.bpo-38634.pq0ZWa.rst b/Misc/NEWS.d/next/Library/2019-12-04-15-56-28.bpo-38634.pq0ZWa.rst new file mode 100644 index 00000000000..d60c3172c2e --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-12-04-15-56-28.bpo-38634.pq0ZWa.rst @@ -0,0 +1,2 @@ +The :mod:`readline` module now detects if Python is linked to libedit at runtime +on all platforms. Previously, the check was only done on macOS. diff --git a/Modules/readline.c b/Modules/readline.c index b76861f7b04..27a993f449f 100644 --- a/Modules/readline.c +++ b/Modules/readline.c @@ -45,14 +45,14 @@ extern char **completion_matches(char *, CPFunction *); #endif #endif -#ifdef __APPLE__ /* * It is possible to link the readline module to the readline * emulation library of editline/libedit. * - * On OSX this emulation library is not 100% API compatible - * with the "real" readline and cannot be detected at compile-time, - * hence we use a runtime check to detect if we're using libedit + * This emulation library is not 100% API compatible with the "real" readline + * and cannot be detected at compile-time, + * hence we use a runtime check to detect if the Python readlinke module is + * linked to libedit. * * Currently there is one known API incompatibility: * - 'get_history' has a 1-based index with GNU readline, and a 0-based @@ -64,7 +64,6 @@ static int using_libedit_emulation = 0; static const char libedit_version_tag[] = "EditLine wrapper"; static int libedit_history_start = 0; -#endif /* __APPLE__ */ #ifdef HAVE_RL_COMPLETION_DISPLAY_MATCHES_HOOK static void @@ -693,7 +692,6 @@ get_history_item(PyObject *self, PyObject *args) if (!PyArg_ParseTuple(args, "i:get_history_item", &idx)) return NULL; -#ifdef __APPLE__ if (using_libedit_emulation) { /* Older versions of libedit's readline emulation * use 0-based indexes, while readline and newer @@ -713,7 +711,6 @@ get_history_item(PyObject *self, PyObject *args) Py_RETURN_NONE; } } -#endif /* __APPLE__ */ if ((hist_ent = history_get(idx))) return decode(hist_ent->line); else { @@ -1081,7 +1078,6 @@ setup_readline(readlinestate *mod_state) /* The name must be defined before initialization */ rl_readline_name = "python"; -#ifdef __APPLE__ /* the libedit readline emulation resets key bindings etc * when calling rl_initialize. So call it upfront */ @@ -1098,7 +1094,6 @@ setup_readline(readlinestate *mod_state) libedit_history_start = 1; } clear_history(); -#endif /* __APPLE__ */ using_history(); @@ -1127,9 +1122,7 @@ setup_readline(readlinestate *mod_state) mod_state->begidx = PyLong_FromLong(0L); mod_state->endidx = PyLong_FromLong(0L); -#ifdef __APPLE__ if (!using_libedit_emulation) -#endif { if (!isatty(STDOUT_FILENO)) { /* Issue #19884: stdout is not a terminal. Disable meta modifier @@ -1149,11 +1142,9 @@ setup_readline(readlinestate *mod_state) * XXX: A bug in the readline-2.2 library causes a memory leak * inside this function. Nothing we can do about it. */ -#ifdef __APPLE__ if (using_libedit_emulation) rl_read_init_file(NULL); else -#endif /* __APPLE__ */ rl_initialize(); RESTORE_LOCALE(saved_locale) @@ -1283,12 +1274,10 @@ call_readline(FILE *sys_stdin, FILE *sys_stdout, const char *prompt) int length = _py_get_history_length(); if (length > 0) { HIST_ENTRY *hist_ent; -#ifdef __APPLE__ if (using_libedit_emulation) { /* handle older 0-based or newer 1-based indexing */ hist_ent = history_get(length + libedit_history_start - 1); } else -#endif /* __APPLE__ */ hist_ent = history_get(length); line = hist_ent ? hist_ent->line : ""; } else @@ -1316,10 +1305,8 @@ call_readline(FILE *sys_stdin, FILE *sys_stdout, const char *prompt) PyDoc_STRVAR(doc_module, "Importing this module enables command line editing using GNU readline."); -#ifdef __APPLE__ PyDoc_STRVAR(doc_module_le, "Importing this module enables command line editing using libedit readline."); -#endif /* __APPLE__ */ static struct PyModuleDef readlinemodule = { PyModuleDef_HEAD_INIT, @@ -1340,7 +1327,6 @@ PyInit_readline(void) PyObject *m; readlinestate *mod_state; -#ifdef __APPLE__ if (strncmp(rl_library_version, libedit_version_tag, strlen(libedit_version_tag)) == 0) { using_libedit_emulation = 1; } @@ -1348,7 +1334,6 @@ PyInit_readline(void) if (using_libedit_emulation) readlinemodule.m_doc = doc_module_le; -#endif /* __APPLE__ */ m = PyModule_Create(&readlinemodule); From 8b787964e0a647caa0558b7c29ae501470d727d9 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Wed, 4 Dec 2019 21:10:06 +0100 Subject: [PATCH 071/115] bpo-38965: Fix faulthandler._stack_overflow() on GCC 10 (GH-17467) Use the "volatile" keyword to prevent tail call optimization on any compiler, rather than relying on compiler specific pragma. --- .../2019-12-04-17-08-55.bpo-38965.yqax3m.rst | 3 +++ Modules/faulthandler.c | 16 ++++++---------- 2 files changed, 9 insertions(+), 10 deletions(-) create mode 100644 Misc/NEWS.d/next/Tests/2019-12-04-17-08-55.bpo-38965.yqax3m.rst diff --git a/Misc/NEWS.d/next/Tests/2019-12-04-17-08-55.bpo-38965.yqax3m.rst b/Misc/NEWS.d/next/Tests/2019-12-04-17-08-55.bpo-38965.yqax3m.rst new file mode 100644 index 00000000000..517a1371eac --- /dev/null +++ b/Misc/NEWS.d/next/Tests/2019-12-04-17-08-55.bpo-38965.yqax3m.rst @@ -0,0 +1,3 @@ +Fix test_faulthandler on GCC 10. Use the "volatile" keyword in +``faulthandler._stack_overflow()`` to prevent tail call optimization on any +compiler, rather than relying on compiler specific pragma. diff --git a/Modules/faulthandler.c b/Modules/faulthandler.c index d1280532ae2..b19401e94d8 100644 --- a/Modules/faulthandler.c +++ b/Modules/faulthandler.c @@ -1161,18 +1161,14 @@ faulthandler_fatal_error_py(PyObject *self, PyObject *args) #if defined(FAULTHANDLER_USE_ALT_STACK) #define FAULTHANDLER_STACK_OVERFLOW -#ifdef __INTEL_COMPILER - /* Issue #23654: Turn off ICC's tail call optimization for the - * stack_overflow generator. ICC turns the recursive tail call into - * a loop. */ -# pragma intel optimization_level 0 -#endif -static -uintptr_t +static uintptr_t stack_overflow(uintptr_t min_sp, uintptr_t max_sp, size_t *depth) { - /* allocate 4096 bytes on the stack at each call */ - unsigned char buffer[4096]; + /* Allocate (at least) 4096 bytes on the stack at each call. + + bpo-23654, bpo-38965: use volatile keyword to prevent tail call + optimization. */ + volatile unsigned char buffer[4096]; uintptr_t sp = (uintptr_t)&buffer; *depth += 1; if (sp < min_sp || max_sp < sp) From bb815499af855b1759c02535f8d7a9d0358e74e8 Mon Sep 17 00:00:00 2001 From: Claudiu Popa Date: Thu, 5 Dec 2019 04:14:26 +0100 Subject: [PATCH 072/115] bpo-38698: Prevent UnboundLocalError to pop up in parse_message_id (GH-17277) parse_message_id() was improperly using a token defined inside an exception handler, which was raising `UnboundLocalError` on parsing an invalid value. https://bugs.python.org/issue38698 --- Lib/email/_header_value_parser.py | 3 ++- Lib/test/test_email/test__header_value_parser.py | 6 ++++++ .../next/Library/2019-12-02-10-35-19.bpo-38698.WZnAPQ.rst | 5 +++++ 3 files changed, 13 insertions(+), 1 deletion(-) create mode 100644 Misc/NEWS.d/next/Library/2019-12-02-10-35-19.bpo-38698.WZnAPQ.rst diff --git a/Lib/email/_header_value_parser.py b/Lib/email/_header_value_parser.py index 1668b4a14e9..abdef8189ca 100644 --- a/Lib/email/_header_value_parser.py +++ b/Lib/email/_header_value_parser.py @@ -2113,7 +2113,8 @@ def parse_message_id(value): except errors.HeaderParseError: message_id.defects.append(errors.InvalidHeaderDefect( "Expected msg-id but found {!r}".format(value))) - message_id.append(token) + else: + message_id.append(token) return message_id # diff --git a/Lib/test/test_email/test__header_value_parser.py b/Lib/test/test_email/test__header_value_parser.py index 46d90b38e91..71168f3183d 100644 --- a/Lib/test/test_email/test__header_value_parser.py +++ b/Lib/test/test_email/test__header_value_parser.py @@ -2638,6 +2638,12 @@ class TestParser(TestParserMixin, TestEmailBase): ) self.assertEqual(msg_id.token_type, 'msg-id') + def test_get_msg_id_invalid_expected_msg_id_not_found(self): + text = "Message-Id: 935-XPB-567:0:86089:180874:0:45327:9:90305:17843586-40@example.com" + msg_id = parser.parse_message_id(text) + self.assertDefectsEqual(msg_id.all_defects, + [errors.InvalidHeaderDefect]) + def test_get_msg_id_no_angle_start(self): with self.assertRaises(errors.HeaderParseError): parser.get_msg_id("msgwithnoankle") diff --git a/Misc/NEWS.d/next/Library/2019-12-02-10-35-19.bpo-38698.WZnAPQ.rst b/Misc/NEWS.d/next/Library/2019-12-02-10-35-19.bpo-38698.WZnAPQ.rst new file mode 100644 index 00000000000..e606acb5dcf --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-12-02-10-35-19.bpo-38698.WZnAPQ.rst @@ -0,0 +1,5 @@ +Prevent UnboundLocalError to pop up in parse_message_id + +parse_message_id() was improperly using a token defined inside an exception +handler, which was raising `UnboundLocalError` on parsing an invalid value. +Patch by Claudiu Popa. From 99eb70a9eb9493602ff6ad8bb92df4318cf05a3e Mon Sep 17 00:00:00 2001 From: Hill Ma Date: Thu, 5 Dec 2019 04:40:12 -0800 Subject: [PATCH 073/115] bpo-38951: Use threading.main_thread() check in asyncio (GH-17433) https://bugs.python.org/issue38951 --- Lib/asyncio/events.py | 2 +- Lib/asyncio/unix_events.py | 5 ++--- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/Lib/asyncio/events.py b/Lib/asyncio/events.py index 36b7ea307e0..c7343f515ca 100644 --- a/Lib/asyncio/events.py +++ b/Lib/asyncio/events.py @@ -636,7 +636,7 @@ class BaseDefaultEventLoopPolicy(AbstractEventLoopPolicy): """ if (self._local._loop is None and not self._local._set_called and - isinstance(threading.current_thread(), threading._MainThread)): + threading.current_thread() is threading.main_thread()): self.set_event_loop(self.new_event_loop()) if self._local._loop is None: diff --git a/Lib/asyncio/unix_events.py b/Lib/asyncio/unix_events.py index 632546ad008..97198ea2f49 100644 --- a/Lib/asyncio/unix_events.py +++ b/Lib/asyncio/unix_events.py @@ -1406,8 +1406,7 @@ class _UnixDefaultEventLoopPolicy(events.BaseDefaultEventLoopPolicy): with events._lock: if self._watcher is None: # pragma: no branch self._watcher = ThreadedChildWatcher() - if isinstance(threading.current_thread(), - threading._MainThread): + if threading.current_thread() is threading.main_thread(): self._watcher.attach_loop(self._local._loop) def set_event_loop(self, loop): @@ -1421,7 +1420,7 @@ class _UnixDefaultEventLoopPolicy(events.BaseDefaultEventLoopPolicy): super().set_event_loop(loop) if (self._watcher is not None and - isinstance(threading.current_thread(), threading._MainThread)): + threading.current_thread() is threading.main_thread()): self._watcher.attach_loop(loop) def get_child_watcher(self): From 1f9f69dd4c5ee232c0b2f782933a89359932a67f Mon Sep 17 00:00:00 2001 From: Sergey Fedoseev Date: Thu, 5 Dec 2019 19:55:28 +0500 Subject: [PATCH 074/115] bpo-27961: Replace PY_LLONG_MAX, PY_LLONG_MIN and PY_ULLONG_MAX with standard macros (GH-15385) Use standard constants LLONG_MIN, LLONG_MAX and ULLONG_MAX. --- Doc/c-api/long.rst | 4 ++-- Include/pythread.h | 8 ++++---- Modules/_testcapimodule.c | 30 +++++++++++++++--------------- Objects/longobject.c | 10 +++++----- 4 files changed, 26 insertions(+), 26 deletions(-) diff --git a/Doc/c-api/long.rst b/Doc/c-api/long.rst index 83d59de6a0d..5a6d09ad1bd 100644 --- a/Doc/c-api/long.rst +++ b/Doc/c-api/long.rst @@ -195,8 +195,8 @@ distinguished from a number. Use :c:func:`PyErr_Occurred` to disambiguate. :meth:`__int__` method (if present) to convert it to a :c:type:`PyLongObject`. - If the value of *obj* is greater than :const:`PY_LLONG_MAX` or less than - :const:`PY_LLONG_MIN`, set *\*overflow* to ``1`` or ``-1``, respectively, + If the value of *obj* is greater than :const:`LLONG_MAX` or less than + :const:`LLONG_MIN`, set *\*overflow* to ``1`` or ``-1``, respectively, and return ``-1``; otherwise, set *\*overflow* to ``0``. If any other exception occurs set *\*overflow* to ``0`` and return ``-1`` as usual. diff --git a/Include/pythread.h b/Include/pythread.h index f22e8c42c50..569d6964899 100644 --- a/Include/pythread.h +++ b/Include/pythread.h @@ -51,16 +51,16 @@ PyAPI_FUNC(int) PyThread_acquire_lock(PyThread_type_lock, int); #if defined(_POSIX_THREADS) /* PyThread_acquire_lock_timed() uses _PyTime_FromNanoseconds(us * 1000), convert microseconds to nanoseconds. */ -# define PY_TIMEOUT_MAX (PY_LLONG_MAX / 1000) +# define PY_TIMEOUT_MAX (LLONG_MAX / 1000) #elif defined (NT_THREADS) /* In the NT API, the timeout is a DWORD and is expressed in milliseconds */ -# if 0xFFFFFFFFLL * 1000 < PY_LLONG_MAX +# if 0xFFFFFFFFLL * 1000 < LLONG_MAX # define PY_TIMEOUT_MAX (0xFFFFFFFFLL * 1000) # else -# define PY_TIMEOUT_MAX PY_LLONG_MAX +# define PY_TIMEOUT_MAX LLONG_MAX # endif #else -# define PY_TIMEOUT_MAX PY_LLONG_MAX +# define PY_TIMEOUT_MAX LLONG_MAX #endif diff --git a/Modules/_testcapimodule.c b/Modules/_testcapimodule.c index 0908f3457f5..943bee6e21e 100644 --- a/Modules/_testcapimodule.c +++ b/Modules/_testcapimodule.c @@ -639,7 +639,7 @@ test_long_long_and_overflow(PyObject *self, PyObject *Py_UNUSED(ignored)) int overflow; /* Test that overflow is set properly for a large value. */ - /* num is a number larger than PY_LLONG_MAX on a typical machine. */ + /* num is a number larger than LLONG_MAX on a typical machine. */ num = PyLong_FromString("FFFFFFFFFFFFFFFFFFFFFFFF", NULL, 16); if (num == NULL) return NULL; @@ -655,8 +655,8 @@ test_long_long_and_overflow(PyObject *self, PyObject *Py_UNUSED(ignored)) return raiseTestError("test_long_long_and_overflow", "overflow was not set to 1"); - /* Same again, with num = PY_LLONG_MAX + 1 */ - num = PyLong_FromLongLong(PY_LLONG_MAX); + /* Same again, with num = LLONG_MAX + 1 */ + num = PyLong_FromLongLong(LLONG_MAX); if (num == NULL) return NULL; one = PyLong_FromLong(1L); @@ -683,7 +683,7 @@ test_long_long_and_overflow(PyObject *self, PyObject *Py_UNUSED(ignored)) "overflow was not set to 1"); /* Test that overflow is set properly for a large negative value. */ - /* num is a number smaller than PY_LLONG_MIN on a typical platform */ + /* num is a number smaller than LLONG_MIN on a typical platform */ num = PyLong_FromString("-FFFFFFFFFFFFFFFFFFFFFFFF", NULL, 16); if (num == NULL) return NULL; @@ -699,8 +699,8 @@ test_long_long_and_overflow(PyObject *self, PyObject *Py_UNUSED(ignored)) return raiseTestError("test_long_long_and_overflow", "overflow was not set to -1"); - /* Same again, with num = PY_LLONG_MIN - 1 */ - num = PyLong_FromLongLong(PY_LLONG_MIN); + /* Same again, with num = LLONG_MIN - 1 */ + num = PyLong_FromLongLong(LLONG_MIN); if (num == NULL) return NULL; one = PyLong_FromLong(1L); @@ -757,7 +757,7 @@ test_long_long_and_overflow(PyObject *self, PyObject *Py_UNUSED(ignored)) return raiseTestError("test_long_long_and_overflow", "overflow was set incorrectly"); - num = PyLong_FromLongLong(PY_LLONG_MAX); + num = PyLong_FromLongLong(LLONG_MAX); if (num == NULL) return NULL; overflow = 1234; @@ -765,14 +765,14 @@ test_long_long_and_overflow(PyObject *self, PyObject *Py_UNUSED(ignored)) Py_DECREF(num); if (value == -1 && PyErr_Occurred()) return NULL; - if (value != PY_LLONG_MAX) + if (value != LLONG_MAX) return raiseTestError("test_long_long_and_overflow", - "expected return value PY_LLONG_MAX"); + "expected return value LLONG_MAX"); if (overflow != 0) return raiseTestError("test_long_long_and_overflow", "overflow was not cleared"); - num = PyLong_FromLongLong(PY_LLONG_MIN); + num = PyLong_FromLongLong(LLONG_MIN); if (num == NULL) return NULL; overflow = 0; @@ -780,9 +780,9 @@ test_long_long_and_overflow(PyObject *self, PyObject *Py_UNUSED(ignored)) Py_DECREF(num); if (value == -1 && PyErr_Occurred()) return NULL; - if (value != PY_LLONG_MIN) + if (value != LLONG_MIN) return raiseTestError("test_long_long_and_overflow", - "expected return value PY_LLONG_MIN"); + "expected return value LLONG_MIN"); if (overflow != 0) return raiseTestError("test_long_long_and_overflow", "overflow was not cleared"); @@ -6710,9 +6710,9 @@ PyInit__testcapi(void) PyModule_AddObject(m, "FLT_MIN", PyFloat_FromDouble(FLT_MIN)); PyModule_AddObject(m, "DBL_MAX", PyFloat_FromDouble(DBL_MAX)); PyModule_AddObject(m, "DBL_MIN", PyFloat_FromDouble(DBL_MIN)); - PyModule_AddObject(m, "LLONG_MAX", PyLong_FromLongLong(PY_LLONG_MAX)); - PyModule_AddObject(m, "LLONG_MIN", PyLong_FromLongLong(PY_LLONG_MIN)); - PyModule_AddObject(m, "ULLONG_MAX", PyLong_FromUnsignedLongLong(PY_ULLONG_MAX)); + PyModule_AddObject(m, "LLONG_MAX", PyLong_FromLongLong(LLONG_MAX)); + PyModule_AddObject(m, "LLONG_MIN", PyLong_FromLongLong(LLONG_MIN)); + PyModule_AddObject(m, "ULLONG_MAX", PyLong_FromUnsignedLongLong(ULLONG_MAX)); PyModule_AddObject(m, "PY_SSIZE_T_MAX", PyLong_FromSsize_t(PY_SSIZE_T_MAX)); PyModule_AddObject(m, "PY_SSIZE_T_MIN", PyLong_FromSsize_t(PY_SSIZE_T_MIN)); PyModule_AddObject(m, "SIZEOF_PYGC_HEAD", PyLong_FromSsize_t(sizeof(PyGC_Head))); diff --git a/Objects/longobject.c b/Objects/longobject.c index f0567970468..bc87fb2bd65 100644 --- a/Objects/longobject.c +++ b/Objects/longobject.c @@ -1158,7 +1158,7 @@ PyLong_AsVoidPtr(PyObject *vv) * rewritten to use the newer PyLong_{As,From}ByteArray API. */ -#define PY_ABS_LLONG_MIN (0-(unsigned long long)PY_LLONG_MIN) +#define PY_ABS_LLONG_MIN (0-(unsigned long long)LLONG_MIN) /* Create a new int object from a C long long int. */ @@ -1462,11 +1462,11 @@ PyLong_AsLongLongAndOverflow(PyObject *vv, int *overflow) /* Haven't lost any bits, but casting to long requires extra * care (see comment above). */ - if (x <= (unsigned long long)PY_LLONG_MAX) { + if (x <= (unsigned long long)LLONG_MAX) { res = (long long)x * sign; } else if (sign < 0 && x == PY_ABS_LLONG_MIN) { - res = PY_LLONG_MIN; + res = LLONG_MIN; } else { *overflow = sign; @@ -5020,7 +5020,7 @@ simple: /* a fits into a long, so b must too */ x = PyLong_AsLong((PyObject *)a); y = PyLong_AsLong((PyObject *)b); -#elif PY_LLONG_MAX >> PyLong_SHIFT >> PyLong_SHIFT +#elif LLONG_MAX >> PyLong_SHIFT >> PyLong_SHIFT x = PyLong_AsLongLong((PyObject *)a); y = PyLong_AsLongLong((PyObject *)b); #else @@ -5039,7 +5039,7 @@ simple: } #if LONG_MAX >> PyLong_SHIFT >> PyLong_SHIFT return PyLong_FromLong(x); -#elif PY_LLONG_MAX >> PyLong_SHIFT >> PyLong_SHIFT +#elif LLONG_MAX >> PyLong_SHIFT >> PyLong_SHIFT return PyLong_FromLongLong(x); #else # error "_PyLong_GCD" From 4da44000843824d4231901c3cf28b604e79df456 Mon Sep 17 00:00:00 2001 From: Pablo Galindo Date: Thu, 5 Dec 2019 16:18:27 +0000 Subject: [PATCH 075/115] Remove unused variable in Python/pylifecycle.c (GH-17475) --- Python/pylifecycle.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/Python/pylifecycle.c b/Python/pylifecycle.c index d6f65ec3caf..410156b8021 100644 --- a/Python/pylifecycle.c +++ b/Python/pylifecycle.c @@ -1253,8 +1253,6 @@ finalize_interp_clear(PyThreadState *tstate) { int is_main_interp = _Py_IsMainInterpreter(tstate); - PyInterpreterState *interp = tstate->interp; - /* Clear interpreter state and all thread states */ PyInterpreterState_Clear(tstate->interp); From 44ea525ca56ad8ef783cbcd3a0636a425e5d801a Mon Sep 17 00:00:00 2001 From: Steve Dower Date: Thu, 5 Dec 2019 15:32:04 -0800 Subject: [PATCH 076/115] Fix unquoted YAML in Windows release build (GH-17479) --- .azure-pipelines/windows-release/stage-publish-nugetorg.yml | 2 +- .azure-pipelines/windows-release/stage-publish-pythonorg.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.azure-pipelines/windows-release/stage-publish-nugetorg.yml b/.azure-pipelines/windows-release/stage-publish-nugetorg.yml index 5aba048cd72..b78bd493a0f 100644 --- a/.azure-pipelines/windows-release/stage-publish-nugetorg.yml +++ b/.azure-pipelines/windows-release/stage-publish-nugetorg.yml @@ -31,7 +31,7 @@ jobs: buildVersionToDownload: specific buildId: $(BuildToPublish) - - powershell: gci pythonarm*.nupkg | %{ Write-Host "Not publishing: $($_.Name)"; gi $_ } | del + - powershell: 'gci pythonarm*.nupkg | %{ Write-Host "Not publishing: $($_.Name)"; gi $_ } | del' displayName: 'Prevent publishing ARM/ARM64 packages' workingDirectory: '$(Build.BinariesDirectory)\nuget' condition: and(succeeded(), not(variables['PublishArmPackages'])) diff --git a/.azure-pipelines/windows-release/stage-publish-pythonorg.yml b/.azure-pipelines/windows-release/stage-publish-pythonorg.yml index 6c61e9ac3bd..8c95f1b950c 100644 --- a/.azure-pipelines/windows-release/stage-publish-pythonorg.yml +++ b/.azure-pipelines/windows-release/stage-publish-pythonorg.yml @@ -39,7 +39,7 @@ jobs: artifactName: embed downloadPath: $(Build.BinariesDirectory) - - powershell: gci *embed-arm*.zip | %{ Write-Host "Not publishing: $($_.Name)"; gi $_ } | del + - powershell: 'gci *embed-arm*.zip | %{ Write-Host "Not publishing: $($_.Name)"; gi $_ } | del' displayName: 'Prevent publishing ARM/ARM64 packages' workingDirectory: '$(Build.BinariesDirectory)\embed' condition: and(succeeded(), not(variables['PublishArmPackages'])) From 81fe5bd3d78f9bb955f8255404d99df27a31c36a Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Fri, 6 Dec 2019 02:43:30 +0100 Subject: [PATCH 077/115] bpo-38858: new_interpreter() reuses _PySys_Create() (GH-17481) new_interpreter() now calls _PySys_Create() to create a new sys module isolated from the main interpreter. It now calls _PySys_InitCore() and _PyImport_FixupBuiltin(). init_interp_main() now calls _PySys_InitMain(). --- Include/internal/pycore_pylifecycle.h | 1 - Python/pylifecycle.c | 81 +++++++++++---------------- Python/sysmodule.c | 19 +++++-- 3 files changed, 46 insertions(+), 55 deletions(-) diff --git a/Include/internal/pycore_pylifecycle.h b/Include/internal/pycore_pylifecycle.h index cd3be215ff1..4e4bbc2bed0 100644 --- a/Include/internal/pycore_pylifecycle.h +++ b/Include/internal/pycore_pylifecycle.h @@ -40,7 +40,6 @@ extern PyObject * _PyBuiltin_Init(PyThreadState *tstate); extern PyStatus _PySys_Create( PyThreadState *tstate, PyObject **sysmod_p); -extern PyStatus _PySys_SetPreliminaryStderr(PyObject *sysdict); extern PyStatus _PySys_ReadPreinitWarnOptions(PyWideStringList *options); extern PyStatus _PySys_ReadPreinitXOptions(PyConfig *config); extern int _PySys_InitMain(PyThreadState *tstate); diff --git a/Python/pylifecycle.c b/Python/pylifecycle.c index 410156b8021..9822cce4ae3 100644 --- a/Python/pylifecycle.c +++ b/Python/pylifecycle.c @@ -622,6 +622,8 @@ pycore_init_types(PyThreadState *tstate) static PyStatus pycore_init_builtins(PyThreadState *tstate) { + assert(!_PyErr_Occurred(tstate)); + PyObject *bimod = _PyBuiltin_Init(tstate); if (bimod == NULL) { goto error; @@ -649,6 +651,9 @@ pycore_init_builtins(PyThreadState *tstate) goto error; } Py_DECREF(bimod); + + assert(!_PyErr_Occurred(tstate)); + return _PyStatus_OK(); error: @@ -660,13 +665,14 @@ error: static PyStatus pycore_init_import_warnings(PyThreadState *tstate, PyObject *sysmod) { - const PyConfig *config = &tstate->interp->config; + assert(!_PyErr_Occurred(tstate)); PyStatus status = _PyImportHooks_Init(tstate); if (_PyStatus_EXCEPTION(status)) { return status; } + const PyConfig *config = &tstate->interp->config; if (_Py_IsMainInterpreter(tstate)) { /* Initialize _warnings. */ if (_PyWarnings_Init() == NULL) { @@ -688,6 +694,9 @@ pycore_init_import_warnings(PyThreadState *tstate, PyObject *sysmod) return status; } } + + assert(!_PyErr_Occurred(tstate)); + return _PyStatus_OK(); } @@ -929,6 +938,8 @@ _Py_ReconfigureMainInterpreter(PyThreadState *tstate) static PyStatus init_interp_main(PyThreadState *tstate) { + assert(!_PyErr_Occurred(tstate)); + PyStatus status; int is_main_interp = _Py_IsMainInterpreter(tstate); PyInterpreterState *interp = tstate->interp; @@ -950,10 +961,10 @@ init_interp_main(PyThreadState *tstate) if (_PyTime_Init() < 0) { return _PyStatus_ERR("can't initialize time"); } + } - if (_PySys_InitMain(tstate) < 0) { - return _PyStatus_ERR("can't finish initializing sys"); - } + if (_PySys_InitMain(tstate) < 0) { + return _PyStatus_ERR("can't finish initializing sys"); } status = init_importlib_external(tstate); @@ -1031,6 +1042,8 @@ init_interp_main(PyThreadState *tstate) #endif } + assert(!_PyErr_Occurred(tstate)); + return _PyStatus_OK(); } @@ -1534,70 +1547,40 @@ new_interpreter(PyThreadState **tstate_p) status = _PyConfig_Copy(&interp->config, config); if (_PyStatus_EXCEPTION(status)) { - goto done; + goto error; } config = &interp->config; status = pycore_init_types(tstate); - - /* XXX The following is lax in error checking */ - PyObject *modules = PyDict_New(); - if (modules == NULL) { - status = _PyStatus_ERR("can't make modules dictionary"); - goto done; + if (_PyStatus_EXCEPTION(status)) { + goto error; } - interp->modules = modules; - PyObject *sysmod = _PyImport_FindBuiltin(tstate, "sys"); - if (sysmod != NULL) { - interp->sysdict = PyModule_GetDict(sysmod); - if (interp->sysdict == NULL) { - goto handle_exc; - } - Py_INCREF(interp->sysdict); - PyDict_SetItemString(interp->sysdict, "modules", modules); - if (_PySys_InitMain(tstate) < 0) { - status = _PyStatus_ERR("can't finish initializing sys"); - goto done; - } - } - else if (_PyErr_Occurred(tstate)) { - goto handle_exc; + PyObject *sysmod; + status = _PySys_Create(tstate, &sysmod); + if (_PyStatus_EXCEPTION(status)) { + return status; } status = pycore_init_builtins(tstate); if (_PyStatus_EXCEPTION(status)) { - goto done; + goto error; } - if (sysmod != NULL) { - status = _PySys_SetPreliminaryStderr(interp->sysdict); - if (_PyStatus_EXCEPTION(status)) { - goto done; - } - - status = pycore_init_import_warnings(tstate, sysmod); - if (_PyStatus_EXCEPTION(status)) { - goto done; - } - - status = init_interp_main(tstate); - if (_PyStatus_EXCEPTION(status)) { - goto done; - } + status = pycore_init_import_warnings(tstate, sysmod); + if (_PyStatus_EXCEPTION(status)) { + goto error; } - if (_PyErr_Occurred(tstate)) { - goto handle_exc; + status = init_interp_main(tstate); + if (_PyStatus_EXCEPTION(status)) { + goto error; } *tstate_p = tstate; return _PyStatus_OK(); -handle_exc: - status = _PyStatus_OK(); - -done: +error: *tstate_p = NULL; /* Oops, it didn't work. Undo it all. */ diff --git a/Python/sysmodule.c b/Python/sysmodule.c index 78b9d22821f..b6bdf51bce3 100644 --- a/Python/sysmodule.c +++ b/Python/sysmodule.c @@ -2919,7 +2919,7 @@ err_occurred: infrastructure for the io module in place. Use UTF-8/surrogateescape and ignore EAGAIN errors. */ -PyStatus +static PyStatus _PySys_SetPreliminaryStderr(PyObject *sysdict) { PyObject *pstderr = PyFile_NewStdPrinter(fileno(stderr)); @@ -2946,11 +2946,13 @@ error: PyStatus _PySys_Create(PyThreadState *tstate, PyObject **sysmod_p) { + assert(!_PyErr_Occurred(tstate)); + PyInterpreterState *interp = tstate->interp; PyObject *modules = PyDict_New(); if (modules == NULL) { - return _PyStatus_ERR("can't make modules dictionary"); + goto error; } interp->modules = modules; @@ -2961,13 +2963,13 @@ _PySys_Create(PyThreadState *tstate, PyObject **sysmod_p) PyObject *sysdict = PyModule_GetDict(sysmod); if (sysdict == NULL) { - return _PyStatus_ERR("can't initialize sys dict"); + goto error; } Py_INCREF(sysdict); interp->sysdict = sysdict; if (PyDict_SetItemString(sysdict, "modules", interp->modules) < 0) { - return _PyStatus_ERR("can't initialize sys module"); + goto error; } PyStatus status = _PySys_SetPreliminaryStderr(sysdict); @@ -2980,10 +2982,17 @@ _PySys_Create(PyThreadState *tstate, PyObject **sysmod_p) return status; } - _PyImport_FixupBuiltin(sysmod, "sys", interp->modules); + if (_PyImport_FixupBuiltin(sysmod, "sys", interp->modules) < 0) { + goto error; + } + + assert(!_PyErr_Occurred(tstate)); *sysmod_p = sysmod; return _PyStatus_OK(); + +error: + return _PyStatus_ERR("can't initialize sys module"); } From d863ade0c7fa4826e8b71aa467809c83a711f019 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Fri, 6 Dec 2019 03:37:07 +0100 Subject: [PATCH 078/115] bpo-38858: Add pycore_interp_init() code to factorize code (GH-17483) Add a new pycore_interp_init() function called by new_interpreter() and pyinit_config(). --- Python/pylifecycle.c | 62 +++++++++++++++++++------------------------- 1 file changed, 27 insertions(+), 35 deletions(-) diff --git a/Python/pylifecycle.c b/Python/pylifecycle.c index 9822cce4ae3..8bd71a350de 100644 --- a/Python/pylifecycle.c +++ b/Python/pylifecycle.c @@ -701,6 +701,31 @@ pycore_init_import_warnings(PyThreadState *tstate, PyObject *sysmod) } +static PyStatus +pycore_interp_init(PyThreadState *tstate) +{ + PyStatus status; + + status = pycore_init_types(tstate); + if (_PyStatus_EXCEPTION(status)) { + return status; + } + + PyObject *sysmod; + status = _PySys_Create(tstate, &sysmod); + if (_PyStatus_EXCEPTION(status)) { + return status; + } + + status = pycore_init_builtins(tstate); + if (_PyStatus_EXCEPTION(status)) { + return status; + } + + return pycore_init_import_warnings(tstate, sysmod); +} + + static PyStatus pyinit_config(_PyRuntimeState *runtime, PyThreadState **tstate_p, @@ -721,23 +746,7 @@ pyinit_config(_PyRuntimeState *runtime, config = &tstate->interp->config; *tstate_p = tstate; - status = pycore_init_types(tstate); - if (_PyStatus_EXCEPTION(status)) { - return status; - } - - PyObject *sysmod; - status = _PySys_Create(tstate, &sysmod); - if (_PyStatus_EXCEPTION(status)) { - return status; - } - - status = pycore_init_builtins(tstate); - if (_PyStatus_EXCEPTION(status)) { - return status; - } - - status = pycore_init_import_warnings(tstate, sysmod); + status = pycore_interp_init(tstate); if (_PyStatus_EXCEPTION(status)) { return status; } @@ -1549,25 +1558,8 @@ new_interpreter(PyThreadState **tstate_p) if (_PyStatus_EXCEPTION(status)) { goto error; } - config = &interp->config; - status = pycore_init_types(tstate); - if (_PyStatus_EXCEPTION(status)) { - goto error; - } - - PyObject *sysmod; - status = _PySys_Create(tstate, &sysmod); - if (_PyStatus_EXCEPTION(status)) { - return status; - } - - status = pycore_init_builtins(tstate); - if (_PyStatus_EXCEPTION(status)) { - goto error; - } - - status = pycore_init_import_warnings(tstate, sysmod); + status = pycore_interp_init(tstate); if (_PyStatus_EXCEPTION(status)) { goto error; } From efefe25443c56988841ab96cdac01352123ba268 Mon Sep 17 00:00:00 2001 From: wim glenn Date: Fri, 6 Dec 2019 00:44:01 -0600 Subject: [PATCH 079/115] bpo-27413: json.tool: Add --no-ensure-ascii option. (GH-17472) --- Doc/library/json.rst | 6 +++++ Lib/json/tool.py | 3 +++ Lib/test/test_json/test_tool.py | 22 +++++++++++++++++++ .../2019-12-05-02-02-58.bpo-27413.212Th2.rst | 2 ++ 4 files changed, 33 insertions(+) create mode 100644 Misc/NEWS.d/next/Library/2019-12-05-02-02-58.bpo-27413.212Th2.rst diff --git a/Doc/library/json.rst b/Doc/library/json.rst index 23e39e95f78..573ec1cb77d 100644 --- a/Doc/library/json.rst +++ b/Doc/library/json.rst @@ -732,6 +732,12 @@ Command line options .. versionadded:: 3.5 +.. cmdoption:: --no-ensure-ascii + + Disable escaping of non-ascii characters, see :func:`json.dumps` for more information. + + .. versionadded:: 3.9 + .. cmdoption:: --json-lines Parse every input line as separate JSON object. diff --git a/Lib/json/tool.py b/Lib/json/tool.py index 2a404a44417..5542ce48c38 100644 --- a/Lib/json/tool.py +++ b/Lib/json/tool.py @@ -30,6 +30,8 @@ def main(): default=sys.stdout) parser.add_argument('--sort-keys', action='store_true', default=False, help='sort the output of dictionaries alphabetically by key') + parser.add_argument('--no-ensure-ascii', dest='ensure_ascii', action='store_false', + help='disable escaping of non-ASCII characters') parser.add_argument('--json-lines', action='store_true', default=False, help='parse input using the jsonlines format') group = parser.add_mutually_exclusive_group() @@ -49,6 +51,7 @@ def main(): dump_args = { 'sort_keys': options.sort_keys, 'indent': options.indent, + 'ensure_ascii': options.ensure_ascii, } if options.compact: dump_args['indent'] = None diff --git a/Lib/test/test_json/test_tool.py b/Lib/test/test_json/test_tool.py index 953a5696e7c..54800ae840c 100644 --- a/Lib/test/test_json/test_tool.py +++ b/Lib/test/test_json/test_tool.py @@ -190,3 +190,25 @@ class TestTool(unittest.TestCase): json_stdout, err = proc.communicate(json_stdin) self.assertEqual(expect.splitlines(), json_stdout.splitlines()) self.assertEqual(err, b'') + + def test_no_ensure_ascii_flag(self): + infile = self._create_infile('{"key":"💩"}') + outfile = support.TESTFN + '.out' + self.addCleanup(os.remove, outfile) + assert_python_ok('-m', 'json.tool', '--no-ensure-ascii', infile, outfile) + with open(outfile, "rb") as f: + lines = f.read().splitlines() + # asserting utf-8 encoded output file + expected = [b'{', b' "key": "\xf0\x9f\x92\xa9"', b"}"] + self.assertEqual(lines, expected) + + def test_ensure_ascii_default(self): + infile = self._create_infile('{"key":"💩"}') + outfile = support.TESTFN + '.out' + self.addCleanup(os.remove, outfile) + assert_python_ok('-m', 'json.tool', infile, outfile) + with open(outfile, "rb") as f: + lines = f.read().splitlines() + # asserting an ascii encoded output file + expected = [b'{', rb' "key": "\ud83d\udca9"', b"}"] + self.assertEqual(lines, expected) diff --git a/Misc/NEWS.d/next/Library/2019-12-05-02-02-58.bpo-27413.212Th2.rst b/Misc/NEWS.d/next/Library/2019-12-05-02-02-58.bpo-27413.212Th2.rst new file mode 100644 index 00000000000..0116b8c2813 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-12-05-02-02-58.bpo-27413.212Th2.rst @@ -0,0 +1,2 @@ +Added ability to pass through ``ensure_ascii`` options to json.dumps in the +``json.tool`` command-line interface. From b64334cb93d0ddbb551c8cd712942bab2fc72772 Mon Sep 17 00:00:00 2001 From: Mario Corchero Date: Fri, 6 Dec 2019 14:27:38 +0000 Subject: [PATCH 080/115] bpo-36820: Break unnecessary cycle in socket.py, codeop.py and dyld.py (GH-13135) Break cycle generated when saving an exception in socket.py, codeop.py and dyld.py as they keep alive not only the exception but user objects through the ``__traceback__`` attribute. https://bugs.python.org/issue36820 Automerge-Triggered-By: @pablogsal --- Lib/codeop.py | 11 +++++++---- Lib/ctypes/macholib/dyld.py | 2 ++ Lib/socket.py | 6 +++++- .../Library/2019-05-06-15-34-17.bpo-36820.Eh5mIB.rst | 3 +++ 4 files changed, 17 insertions(+), 5 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2019-05-06-15-34-17.bpo-36820.Eh5mIB.rst diff --git a/Lib/codeop.py b/Lib/codeop.py index fc7e1e70cea..082285f94fe 100644 --- a/Lib/codeop.py +++ b/Lib/codeop.py @@ -93,10 +93,13 @@ def _maybe_compile(compiler, source, filename, symbol): except SyntaxError as e: err2 = e - if code: - return code - if not code1 and repr(err1) == repr(err2): - raise err1 + try: + if code: + return code + if not code1 and repr(err1) == repr(err2): + raise err1 + finally: + err1 = err2 = None def _compile(source, filename, symbol): return compile(source, filename, symbol, PyCF_DONT_IMPLY_DEDENT) diff --git a/Lib/ctypes/macholib/dyld.py b/Lib/ctypes/macholib/dyld.py index c158e672f05..9d86b058765 100644 --- a/Lib/ctypes/macholib/dyld.py +++ b/Lib/ctypes/macholib/dyld.py @@ -149,6 +149,8 @@ def framework_find(fn, executable_path=None, env=None): return dyld_find(fn, executable_path=executable_path, env=env) except ValueError: raise error + finally: + error = None def test_dyld_find(): env = {} diff --git a/Lib/socket.py b/Lib/socket.py index 84a5dcb0daf..374f1124bf7 100755 --- a/Lib/socket.py +++ b/Lib/socket.py @@ -839,7 +839,11 @@ def create_connection(address, timeout=_GLOBAL_DEFAULT_TIMEOUT, sock.close() if err is not None: - raise err + try: + raise err + finally: + # Break explicitly a reference cycle + err = None else: raise error("getaddrinfo returns an empty list") diff --git a/Misc/NEWS.d/next/Library/2019-05-06-15-34-17.bpo-36820.Eh5mIB.rst b/Misc/NEWS.d/next/Library/2019-05-06-15-34-17.bpo-36820.Eh5mIB.rst new file mode 100644 index 00000000000..82f6635c815 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-05-06-15-34-17.bpo-36820.Eh5mIB.rst @@ -0,0 +1,3 @@ +Break cycle generated when saving an exception in socket.py, codeop.py and +dyld.py as they keep alive not only the exception but user objects through +the ``__traceback__`` attribute. Patch by Mario Corchero. From e76ee1a72b9e3f5da287663ea3daec4bb3f67612 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Fri, 6 Dec 2019 16:32:41 +0100 Subject: [PATCH 081/115] bpo-38982: Fix asyncio PidfdChildWatcher on waitpid() error (GH-17477) If waitpid() is called elsewhere, waitpid() call fails with ChildProcessError: use return code 255 in this case, and log a warning. It ensure that the pidfd file descriptor is closed if this error occurs. --- Lib/asyncio/unix_events.py | 15 +++++++++++++-- .../2019-12-05-18-21-26.bpo-38982.W3u-03.rst | 5 +++++ 2 files changed, 18 insertions(+), 2 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2019-12-05-18-21-26.bpo-38982.W3u-03.rst diff --git a/Lib/asyncio/unix_events.py b/Lib/asyncio/unix_events.py index 97198ea2f49..28fb4918645 100644 --- a/Lib/asyncio/unix_events.py +++ b/Lib/asyncio/unix_events.py @@ -930,9 +930,20 @@ class PidfdChildWatcher(AbstractChildWatcher): def _do_wait(self, pid): pidfd, callback, args = self._callbacks.pop(pid) self._loop._remove_reader(pidfd) - _, status = os.waitpid(pid, 0) + try: + _, status = os.waitpid(pid, 0) + except ChildProcessError: + # The child process is already reaped + # (may happen if waitpid() is called elsewhere). + returncode = 255 + logger.warning( + "child process pid %d exit status already read: " + " will report returncode 255", + pid) + else: + returncode = _compute_returncode(status) + os.close(pidfd) - returncode = _compute_returncode(status) callback(pid, returncode, *args) def remove_child_handler(self, pid): diff --git a/Misc/NEWS.d/next/Library/2019-12-05-18-21-26.bpo-38982.W3u-03.rst b/Misc/NEWS.d/next/Library/2019-12-05-18-21-26.bpo-38982.W3u-03.rst new file mode 100644 index 00000000000..b591209ea06 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-12-05-18-21-26.bpo-38982.W3u-03.rst @@ -0,0 +1,5 @@ +Fix asyncio ``PidfdChildWatcher``: handle ``waitpid()`` error. If +``waitpid()`` is called elsewhere, ``waitpid()`` call fails with +:exc:`ChildProcessError`: use return code 255 in this case, and log a +warning. It ensures that the pidfd file descriptor is closed if this error +occurs. From 723f71abf7ab0a7be394f9f7b2daa9ecdf6fb1eb Mon Sep 17 00:00:00 2001 From: Benoit Hudson Date: Fri, 6 Dec 2019 14:15:03 -0500 Subject: [PATCH 082/115] bpo-37931: Fix crash on OSX re-initializing os.environ (GH-15428) On most platforms, the `environ` symbol is accessible everywhere. In a dylib on OSX, it's not easily accessible, you need to find it with _NSGetEnviron. The code was caching the *value* of environ. But a setenv() can change the value, leaving garbage at the old value. Fix: don't cache the value of environ, just read it every time. --- Misc/ACKS | 1 + .../macOS/2019-08-23-12-14-34.bpo-37931.goYgQj.rst | 3 +++ Modules/posixmodule.c | 10 +++++----- 3 files changed, 9 insertions(+), 5 deletions(-) create mode 100644 Misc/NEWS.d/next/macOS/2019-08-23-12-14-34.bpo-37931.goYgQj.rst diff --git a/Misc/ACKS b/Misc/ACKS index 357ce024e9e..239d06ffd0b 100644 --- a/Misc/ACKS +++ b/Misc/ACKS @@ -733,6 +733,7 @@ Miro Hrončok Chiu-Hsiang Hsu Chih-Hao Huang Christian Hudon +Benoît Hudson Lawrence Hudson Michael Hudson Jim Hugunin diff --git a/Misc/NEWS.d/next/macOS/2019-08-23-12-14-34.bpo-37931.goYgQj.rst b/Misc/NEWS.d/next/macOS/2019-08-23-12-14-34.bpo-37931.goYgQj.rst new file mode 100644 index 00000000000..45b54e89cb8 --- /dev/null +++ b/Misc/NEWS.d/next/macOS/2019-08-23-12-14-34.bpo-37931.goYgQj.rst @@ -0,0 +1,3 @@ +Fixed a crash on OSX dynamic builds that occurred when re-initializing the +posix module after a Py_Finalize if the environment had changed since the +previous `import posix`. Patch by Benoît Hudson. diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c index 89854711373..322c2159812 100644 --- a/Modules/posixmodule.c +++ b/Modules/posixmodule.c @@ -1402,7 +1402,6 @@ win32_get_reparse_tag(HANDLE reparse_point_handle, ULONG *reparse_tag) ** man environ(7). */ #include -static char **environ; #elif !defined(_MSC_VER) && (!defined(__WATCOMC__) || defined(__QNX__) || defined(__VXWORKS__)) extern char **environ; #endif /* !_MSC_VER */ @@ -1420,15 +1419,16 @@ convertenviron(void) d = PyDict_New(); if (d == NULL) return NULL; -#if defined(WITH_NEXT_FRAMEWORK) || (defined(__APPLE__) && defined(Py_ENABLE_SHARED)) - if (environ == NULL) - environ = *_NSGetEnviron(); -#endif #ifdef MS_WINDOWS /* _wenviron must be initialized in this way if the program is started through main() instead of wmain(). */ _wgetenv(L""); e = _wenviron; +#elif defined(WITH_NEXT_FRAMEWORK) || (defined(__APPLE__) && defined(Py_ENABLE_SHARED)) + /* environ is not accessible as an extern in a shared object on OSX; use + _NSGetEnviron to resolve it. The value changes if you add environment + variables between calls to Py_Initialize, so don't cache the value. */ + e = *_NSGetEnviron(); #else e = environ; #endif From dec367261e7e2bb4dd42feeb58031abed2ade683 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Batuhan=20Ta=C5=9Fkaya?= <47358913+isidentical@users.noreply.github.com> Date: Sat, 7 Dec 2019 14:05:07 +0300 Subject: [PATCH 083/115] bpo-38978: Implement __class_getitem__ for asyncio objects (GH-17491) https://bugs.python.org/issue38978 --- Lib/asyncio/futures.py | 3 +++ Lib/asyncio/queues.py | 3 +++ Lib/asyncio/tasks.py | 3 +++ .../2019-12-07-13-40-52.bpo-38978.R3gHZI.rst | 2 ++ Modules/_asynciomodule.c | 15 +++++++++++++++ 5 files changed, 26 insertions(+) create mode 100644 Misc/NEWS.d/next/Library/2019-12-07-13-40-52.bpo-38978.R3gHZI.rst diff --git a/Lib/asyncio/futures.py b/Lib/asyncio/futures.py index 9afda220bd7..a3cf379ee81 100644 --- a/Lib/asyncio/futures.py +++ b/Lib/asyncio/futures.py @@ -103,6 +103,9 @@ class Future: context['source_traceback'] = self._source_traceback self._loop.call_exception_handler(context) + def __class_getitem__(cls, type): + return cls + @property def _log_traceback(self): return self.__log_traceback diff --git a/Lib/asyncio/queues.py b/Lib/asyncio/queues.py index 390ae9a6821..cd3f7c6a567 100644 --- a/Lib/asyncio/queues.py +++ b/Lib/asyncio/queues.py @@ -76,6 +76,9 @@ class Queue: def __str__(self): return f'<{type(self).__name__} {self._format()}>' + def __class_getitem__(cls, type): + return cls + def _format(self): result = f'maxsize={self._maxsize!r}' if getattr(self, '_queue', None): diff --git a/Lib/asyncio/tasks.py b/Lib/asyncio/tasks.py index 38d982716d4..894d28eb107 100644 --- a/Lib/asyncio/tasks.py +++ b/Lib/asyncio/tasks.py @@ -175,6 +175,9 @@ class Task(futures._PyFuture): # Inherit Python Task implementation self._loop.call_exception_handler(context) super().__del__() + def __class_getitem__(cls, type): + return cls + def _repr_info(self): return base_tasks._task_repr_info(self) diff --git a/Misc/NEWS.d/next/Library/2019-12-07-13-40-52.bpo-38978.R3gHZI.rst b/Misc/NEWS.d/next/Library/2019-12-07-13-40-52.bpo-38978.R3gHZI.rst new file mode 100644 index 00000000000..8b2eab0d52a --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-12-07-13-40-52.bpo-38978.R3gHZI.rst @@ -0,0 +1,2 @@ +Implement ``__class_getitem__`` on asyncio objects (Future, Task, Queue). +Patch by Batuhan Taskaya. diff --git a/Modules/_asynciomodule.c b/Modules/_asynciomodule.c index aa46e3cf564..2d147447ab7 100644 --- a/Modules/_asynciomodule.c +++ b/Modules/_asynciomodule.c @@ -1381,6 +1381,12 @@ finally: PyErr_Restore(error_type, error_value, error_traceback); } +static PyObject * +future_cls_getitem(PyObject *cls, PyObject *type) +{ + Py_INCREF(cls); + return cls; +} static PyAsyncMethods FutureType_as_async = { (unaryfunc)future_new_iter, /* am_await */ @@ -1400,6 +1406,7 @@ static PyMethodDef FutureType_methods[] = { _ASYNCIO_FUTURE_DONE_METHODDEF _ASYNCIO_FUTURE_GET_LOOP_METHODDEF _ASYNCIO_FUTURE__REPR_INFO_METHODDEF + {"__class_getitem__", future_cls_getitem, METH_O|METH_CLASS, NULL}, {NULL, NULL} /* Sentinel */ }; @@ -2429,6 +2436,13 @@ done: FutureObj_finalize((FutureObj*)task); } +static PyObject * +task_cls_getitem(PyObject *cls, PyObject *type) +{ + Py_INCREF(cls); + return cls; +} + static void TaskObj_dealloc(PyObject *); /* Needs Task_CheckExact */ static PyMethodDef TaskType_methods[] = { @@ -2449,6 +2463,7 @@ static PyMethodDef TaskType_methods[] = { _ASYNCIO_TASK_GET_NAME_METHODDEF _ASYNCIO_TASK_SET_NAME_METHODDEF _ASYNCIO_TASK_GET_CORO_METHODDEF + {"__class_getitem__", task_cls_getitem, METH_O|METH_CLASS, NULL}, {NULL, NULL} /* Sentinel */ }; From 7ddcd0caa4c2e6b43265df144f59c5aa508a94f2 Mon Sep 17 00:00:00 2001 From: Andrew Svetlov Date: Sat, 7 Dec 2019 13:22:00 +0200 Subject: [PATCH 084/115] bpo-38529: Fix asyncio stream warning (GH-17474) --- Lib/asyncio/streams.py | 19 +------ Lib/test/test_asyncio/test_streams.py | 53 ------------------- .../2019-12-05-16-13-25.bpo-38529.yvQgx3.rst | 2 + 3 files changed, 3 insertions(+), 71 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2019-12-05-16-13-25.bpo-38529.yvQgx3.rst diff --git a/Lib/asyncio/streams.py b/Lib/asyncio/streams.py index 795530e6f69..3c80bb88925 100644 --- a/Lib/asyncio/streams.py +++ b/Lib/asyncio/streams.py @@ -214,8 +214,7 @@ class StreamReaderProtocol(FlowControlMixin, protocols.Protocol): def __init__(self, stream_reader, client_connected_cb=None, loop=None): super().__init__(loop=loop) if stream_reader is not None: - self._stream_reader_wr = weakref.ref(stream_reader, - self._on_reader_gc) + self._stream_reader_wr = weakref.ref(stream_reader) self._source_traceback = stream_reader._source_traceback else: self._stream_reader_wr = None @@ -231,22 +230,6 @@ class StreamReaderProtocol(FlowControlMixin, protocols.Protocol): self._over_ssl = False self._closed = self._loop.create_future() - def _on_reader_gc(self, wr): - transport = self._transport - if transport is not None: - # connection_made was called - context = { - 'message': ('An open stream object is being garbage ' - 'collected; call "stream.close()" explicitly.') - } - if self._source_traceback: - context['source_traceback'] = self._source_traceback - self._loop.call_exception_handler(context) - transport.abort() - else: - self._reject_connection = True - self._stream_reader_wr = None - @property def _stream_reader(self): if self._stream_reader_wr is None: diff --git a/Lib/test/test_asyncio/test_streams.py b/Lib/test/test_asyncio/test_streams.py index b9413ab35fc..12bd536911d 100644 --- a/Lib/test/test_asyncio/test_streams.py +++ b/Lib/test/test_asyncio/test_streams.py @@ -924,59 +924,6 @@ os.close(fd) wr.close() self.loop.run_until_complete(wr.wait_closed()) - def test_del_stream_before_sock_closing(self): - messages = [] - self.loop.set_exception_handler(lambda loop, ctx: messages.append(ctx)) - - with test_utils.run_test_server() as httpd: - with self.assertWarns(DeprecationWarning): - rd, wr = self.loop.run_until_complete( - asyncio.open_connection(*httpd.address, loop=self.loop)) - sock = wr.get_extra_info('socket') - self.assertNotEqual(sock.fileno(), -1) - - wr.write(b'GET / HTTP/1.0\r\n\r\n') - f = rd.readline() - data = self.loop.run_until_complete(f) - self.assertEqual(data, b'HTTP/1.0 200 OK\r\n') - - # drop refs to reader/writer - del rd - del wr - gc.collect() - # make a chance to close the socket - test_utils.run_briefly(self.loop) - - self.assertEqual(1, len(messages)) - self.assertEqual(sock.fileno(), -1) - - self.assertEqual(1, len(messages)) - self.assertEqual('An open stream object is being garbage ' - 'collected; call "stream.close()" explicitly.', - messages[0]['message']) - - def test_del_stream_before_connection_made(self): - messages = [] - self.loop.set_exception_handler(lambda loop, ctx: messages.append(ctx)) - - with test_utils.run_test_server() as httpd: - rd = asyncio.StreamReader(loop=self.loop) - pr = asyncio.StreamReaderProtocol(rd, loop=self.loop) - del rd - gc.collect() - tr, _ = self.loop.run_until_complete( - self.loop.create_connection( - lambda: pr, *httpd.address)) - - sock = tr.get_extra_info('socket') - self.assertEqual(sock.fileno(), -1) - - self.assertEqual(1, len(messages)) - self.assertEqual('An open stream was garbage collected prior to ' - 'establishing network connection; ' - 'call "stream.close()" explicitly.', - messages[0]['message']) - def test_async_writer_api(self): async def inner(httpd): rd, wr = await asyncio.open_connection(*httpd.address) diff --git a/Misc/NEWS.d/next/Library/2019-12-05-16-13-25.bpo-38529.yvQgx3.rst b/Misc/NEWS.d/next/Library/2019-12-05-16-13-25.bpo-38529.yvQgx3.rst new file mode 100644 index 00000000000..c688926b4a4 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-12-05-16-13-25.bpo-38529.yvQgx3.rst @@ -0,0 +1,2 @@ +Drop too noisy asyncio warning about deletion of a stream without explicit +``.close()`` call. From 969ae7aca809a8dacafee04c261110eea0ac1945 Mon Sep 17 00:00:00 2001 From: Andrew Svetlov Date: Sat, 7 Dec 2019 13:23:21 +0200 Subject: [PATCH 085/115] Make repr of C accelerated TaskWakeupMethWrapper the same as of pure Python version (GH-17484) --- .../2019-12-06-15-11-42.bpo-38986.bg6iZt.rst | 2 ++ Modules/_asynciomodule.c | 18 +++++++++++++++++- 2 files changed, 19 insertions(+), 1 deletion(-) create mode 100644 Misc/NEWS.d/next/Library/2019-12-06-15-11-42.bpo-38986.bg6iZt.rst diff --git a/Misc/NEWS.d/next/Library/2019-12-06-15-11-42.bpo-38986.bg6iZt.rst b/Misc/NEWS.d/next/Library/2019-12-06-15-11-42.bpo-38986.bg6iZt.rst new file mode 100644 index 00000000000..777535299be --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-12-06-15-11-42.bpo-38986.bg6iZt.rst @@ -0,0 +1,2 @@ +Make repr of C accelerated TaskWakeupMethWrapper the same as of pure Python +version. diff --git a/Modules/_asynciomodule.c b/Modules/_asynciomodule.c index 2d147447ab7..70da40a8a3b 100644 --- a/Modules/_asynciomodule.c +++ b/Modules/_asynciomodule.c @@ -1815,6 +1815,21 @@ TaskWakeupMethWrapper_dealloc(TaskWakeupMethWrapper *o) Py_TYPE(o)->tp_free(o); } +static PyObject * +TaskWakeupMethWrapper_get___self__(TaskWakeupMethWrapper *o, void *Py_UNUSED(ignored)) +{ + if (o->ww_task) { + Py_INCREF(o->ww_task); + return (PyObject*)o->ww_task; + } + Py_RETURN_NONE; +} + +static PyGetSetDef TaskWakeupMethWrapper_getsetlist[] = { + {"__self__", (getter)TaskWakeupMethWrapper_get___self__, NULL, NULL}, + {NULL} /* Sentinel */ +}; + static PyTypeObject TaskWakeupMethWrapper_Type = { PyVarObject_HEAD_INIT(NULL, 0) "TaskWakeupMethWrapper", @@ -1826,6 +1841,7 @@ static PyTypeObject TaskWakeupMethWrapper_Type = { .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC, .tp_traverse = (traverseproc)TaskWakeupMethWrapper_traverse, .tp_clear = (inquiry)TaskWakeupMethWrapper_clear, + .tp_getset = TaskWakeupMethWrapper_getsetlist, }; static PyObject * @@ -3266,7 +3282,7 @@ module_init(void) } if (module_initialized != 0) { return 0; - } + } else { module_initialized = 1; } From 892f9e0777f262d366d4747a54c33a1c15a49da6 Mon Sep 17 00:00:00 2001 From: idomic Date: Sat, 7 Dec 2019 06:52:36 -0500 Subject: [PATCH 086/115] bpo-37404: Raising value error if an SSLSocket is passed to asyncio functions (GH-16457) https://bugs.python.org/issue37404 --- Lib/asyncio/selector_events.py | 10 ++++++++++ .../Build/2019-12-01-21-45-24.bpo-37404.cNsA7S.rst | 2 ++ 2 files changed, 12 insertions(+) create mode 100644 Misc/NEWS.d/next/Build/2019-12-01-21-45-24.bpo-37404.cNsA7S.rst diff --git a/Lib/asyncio/selector_events.py b/Lib/asyncio/selector_events.py index 00e3244bfb2..e1abf511861 100644 --- a/Lib/asyncio/selector_events.py +++ b/Lib/asyncio/selector_events.py @@ -348,6 +348,8 @@ class BaseSelectorEventLoop(base_events.BaseEventLoop): The maximum amount of data to be received at once is specified by nbytes. """ + if isinstance(sock, ssl.SSLSocket): + raise TypeError("Socket cannot be of type SSLSocket") if self._debug and sock.gettimeout() != 0: raise ValueError("the socket must be non-blocking") try: @@ -386,6 +388,8 @@ class BaseSelectorEventLoop(base_events.BaseEventLoop): The received data is written into *buf* (a writable buffer). The return value is the number of bytes written. """ + if isinstance(sock, ssl.SSLSocket): + raise TypeError("Socket cannot be of type SSLSocket") if self._debug and sock.gettimeout() != 0: raise ValueError("the socket must be non-blocking") try: @@ -425,6 +429,8 @@ class BaseSelectorEventLoop(base_events.BaseEventLoop): raised, and there is no way to determine how much data, if any, was successfully processed by the receiving end of the connection. """ + if isinstance(sock, ssl.SSLSocket): + raise TypeError("Socket cannot be of type SSLSocket") if self._debug and sock.gettimeout() != 0: raise ValueError("the socket must be non-blocking") try: @@ -472,6 +478,8 @@ class BaseSelectorEventLoop(base_events.BaseEventLoop): This method is a coroutine. """ + if isinstance(sock, ssl.SSLSocket): + raise TypeError("Socket cannot be of type SSLSocket") if self._debug and sock.gettimeout() != 0: raise ValueError("the socket must be non-blocking") @@ -533,6 +541,8 @@ class BaseSelectorEventLoop(base_events.BaseEventLoop): object usable to send and receive data on the connection, and address is the address bound to the socket on the other end of the connection. """ + if isinstance(sock, ssl.SSLSocket): + raise TypeError("Socket cannot be of type SSLSocket") if self._debug and sock.gettimeout() != 0: raise ValueError("the socket must be non-blocking") fut = self.create_future() diff --git a/Misc/NEWS.d/next/Build/2019-12-01-21-45-24.bpo-37404.cNsA7S.rst b/Misc/NEWS.d/next/Build/2019-12-01-21-45-24.bpo-37404.cNsA7S.rst new file mode 100644 index 00000000000..067fc9d3f18 --- /dev/null +++ b/Misc/NEWS.d/next/Build/2019-12-01-21-45-24.bpo-37404.cNsA7S.rst @@ -0,0 +1,2 @@ +:mod:`asyncio` now raises :exc:`TyperError` when calling incompatible methods +with an :class:`ssl.SSLSocket` socket. Patch by Ido Michael. From 4443450fdaf248427cf4a00a6ee36229e6402ec6 Mon Sep 17 00:00:00 2001 From: Anj-A <2017anj@gmail.com> Date: Sat, 7 Dec 2019 12:53:13 +0000 Subject: [PATCH 087/115] bpo-38652: Remove provisional note for asyncio.BufferedProtocol (GH-17047) https://bugs.python.org/issue38652 --- Doc/library/asyncio-protocol.rst | 3 --- Misc/ACKS | 1 + 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/Doc/library/asyncio-protocol.rst b/Doc/library/asyncio-protocol.rst index ffac9018127..3079716f03e 100644 --- a/Doc/library/asyncio-protocol.rst +++ b/Doc/library/asyncio-protocol.rst @@ -588,9 +588,6 @@ Buffered Streaming Protocols ---------------------------- .. versionadded:: 3.7 - **Important:** this has been added to asyncio in Python 3.7 - *on a provisional basis*! This is as an experimental API that - might be changed or removed completely in Python 3.8. Buffered Protocols can be used with any event loop method that supports `Streaming Protocols`_. diff --git a/Misc/ACKS b/Misc/ACKS index 239d06ffd0b..2286f7b5017 100644 --- a/Misc/ACKS +++ b/Misc/ACKS @@ -22,6 +22,7 @@ Eitan Adler Anton Afanasyev Ali Afshar Nitika Agarwal +Anjani Agrawal Pablo S. Blum de Aguiar Jim Ahlstrom Farhan Ahmad From 15fb7fa88187f5841088721a43609bffe64a8dc7 Mon Sep 17 00:00:00 2001 From: Daniel Himmelstein Date: Sat, 7 Dec 2019 07:14:40 -0700 Subject: [PATCH 088/115] bpo-29636: json.tool: Add document for indentation options. (GH-17482) And updated test to use subprocess.run --- Doc/library/json.rst | 6 ++++ Lib/json/tool.py | 3 +- Lib/test/test_json/test_tool.py | 60 +++++++++++++++------------------ 3 files changed, 35 insertions(+), 34 deletions(-) diff --git a/Doc/library/json.rst b/Doc/library/json.rst index 573ec1cb77d..cfe68c9dd91 100644 --- a/Doc/library/json.rst +++ b/Doc/library/json.rst @@ -744,6 +744,12 @@ Command line options .. versionadded:: 3.8 +.. cmdoption:: --indent, --tab, --no-indent, --compact + + Mutually exclusive options for whitespace control + + .. versionadded:: 3.9 + .. cmdoption:: -h, --help Show the help message. diff --git a/Lib/json/tool.py b/Lib/json/tool.py index 5542ce48c38..6d7d9a002e5 100644 --- a/Lib/json/tool.py +++ b/Lib/json/tool.py @@ -33,7 +33,8 @@ def main(): parser.add_argument('--no-ensure-ascii', dest='ensure_ascii', action='store_false', help='disable escaping of non-ASCII characters') parser.add_argument('--json-lines', action='store_true', default=False, - help='parse input using the jsonlines format') + help='parse input using the JSON Lines format. ' + 'Use with --no-indent or --compact to produce valid JSON Lines output.') group = parser.add_mutually_exclusive_group() group.add_argument('--indent', default=4, type=int, help='separate items with newlines and use this number ' diff --git a/Lib/test/test_json/test_tool.py b/Lib/test/test_json/test_tool.py index 54800ae840c..c9a969b3033 100644 --- a/Lib/test/test_json/test_tool.py +++ b/Lib/test/test_json/test_tool.py @@ -2,7 +2,7 @@ import os import sys import textwrap import unittest -from subprocess import Popen, PIPE +import subprocess from test import support from test.support.script_helper import assert_python_ok @@ -84,10 +84,9 @@ class TestTool(unittest.TestCase): def test_stdin_stdout(self): args = sys.executable, '-m', 'json.tool' - with Popen(args, stdin=PIPE, stdout=PIPE, stderr=PIPE) as proc: - out, err = proc.communicate(self.data.encode()) - self.assertEqual(out.splitlines(), self.expect.encode().splitlines()) - self.assertEqual(err, b'') + process = subprocess.run(args, input=self.data, capture_output=True, text=True, check=True) + self.assertEqual(process.stdout, self.expect) + self.assertEqual(process.stderr, '') def _create_infile(self, data=None): infile = support.TESTFN @@ -131,10 +130,9 @@ class TestTool(unittest.TestCase): def test_jsonlines(self): args = sys.executable, '-m', 'json.tool', '--json-lines' - with Popen(args, stdin=PIPE, stdout=PIPE, stderr=PIPE) as proc: - out, err = proc.communicate(self.jsonlines_raw.encode()) - self.assertEqual(out.splitlines(), self.jsonlines_expect.encode().splitlines()) - self.assertEqual(err, b'') + process = subprocess.run(args, input=self.jsonlines_raw, capture_output=True, text=True, check=True) + self.assertEqual(process.stdout, self.jsonlines_expect) + self.assertEqual(process.stderr, '') def test_help_flag(self): rc, out, err = assert_python_ok('-m', 'json.tool', '-h') @@ -151,45 +149,41 @@ class TestTool(unittest.TestCase): self.assertEqual(err, b'') def test_indent(self): - json_stdin = b'[1, 2]' + input_ = '[1, 2]' expect = textwrap.dedent('''\ [ 1, 2 ] - ''').encode() + ''') args = sys.executable, '-m', 'json.tool', '--indent', '2' - with Popen(args, stdin=PIPE, stdout=PIPE, stderr=PIPE) as proc: - json_stdout, err = proc.communicate(json_stdin) - self.assertEqual(expect.splitlines(), json_stdout.splitlines()) - self.assertEqual(err, b'') + process = subprocess.run(args, input=input_, capture_output=True, text=True, check=True) + self.assertEqual(process.stdout, expect) + self.assertEqual(process.stderr, '') def test_no_indent(self): - json_stdin = b'[1,\n2]' - expect = b'[1, 2]' + input_ = '[1,\n2]' + expect = '[1, 2]\n' args = sys.executable, '-m', 'json.tool', '--no-indent' - with Popen(args, stdin=PIPE, stdout=PIPE, stderr=PIPE) as proc: - json_stdout, err = proc.communicate(json_stdin) - self.assertEqual(expect.splitlines(), json_stdout.splitlines()) - self.assertEqual(err, b'') + process = subprocess.run(args, input=input_, capture_output=True, text=True, check=True) + self.assertEqual(process.stdout, expect) + self.assertEqual(process.stderr, '') def test_tab(self): - json_stdin = b'[1, 2]' - expect = b'[\n\t1,\n\t2\n]\n' + input_ = '[1, 2]' + expect = '[\n\t1,\n\t2\n]\n' args = sys.executable, '-m', 'json.tool', '--tab' - with Popen(args, stdin=PIPE, stdout=PIPE, stderr=PIPE) as proc: - json_stdout, err = proc.communicate(json_stdin) - self.assertEqual(expect.splitlines(), json_stdout.splitlines()) - self.assertEqual(err, b'') + process = subprocess.run(args, input=input_, capture_output=True, text=True, check=True) + self.assertEqual(process.stdout, expect) + self.assertEqual(process.stderr, '') def test_compact(self): - json_stdin = b'[ 1 ,\n 2]' - expect = b'[1,2]' + input_ = '[ 1 ,\n 2]' + expect = '[1,2]\n' args = sys.executable, '-m', 'json.tool', '--compact' - with Popen(args, stdin=PIPE, stdout=PIPE, stderr=PIPE) as proc: - json_stdout, err = proc.communicate(json_stdin) - self.assertEqual(expect.splitlines(), json_stdout.splitlines()) - self.assertEqual(err, b'') + process = subprocess.run(args, input=input_, capture_output=True, text=True, check=True) + self.assertEqual(process.stdout, expect) + self.assertEqual(process.stderr, '') def test_no_ensure_ascii_flag(self): infile = self._create_infile('{"key":"💩"}') From 2b7de6696bf2f924cd2cd9ff0a539c8aa37c6244 Mon Sep 17 00:00:00 2001 From: Christian Heimes Date: Sat, 7 Dec 2019 17:59:36 +0100 Subject: [PATCH 089/115] bpo-38820: OpenSSL 3.0.0 compatibility. (GH-17190) test_openssl_version now accepts version 3.0.0. getpeercert() no longer returns IPv6 addresses with a trailing new line. Signed-off-by: Christian Heimes https://bugs.python.org/issue38820 --- Doc/library/ssl.rst | 3 ++ Lib/test/test_ssl.py | 12 ++--- .../2019-11-16-16-09-07.bpo-38820.ivhUSV.rst | 2 + Modules/_ssl.c | 49 ++++++++++++++++++- 4 files changed, 59 insertions(+), 7 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2019-11-16-16-09-07.bpo-38820.ivhUSV.rst diff --git a/Doc/library/ssl.rst b/Doc/library/ssl.rst index e2c75bbd0a0..3e5fcab22d0 100644 --- a/Doc/library/ssl.rst +++ b/Doc/library/ssl.rst @@ -1256,6 +1256,9 @@ SSL sockets also have the following additional methods and attributes: The returned dictionary includes additional X509v3 extension items such as ``crlDistributionPoints``, ``caIssuers`` and ``OCSP`` URIs. + .. versionchanged:: 3.9 + IPv6 address strings no longer have a trailing new line. + .. method:: SSLSocket.cipher() Returns a three-value tuple containing the name of the cipher being used, the diff --git a/Lib/test/test_ssl.py b/Lib/test/test_ssl.py index 258816d912b..4f70799465c 100644 --- a/Lib/test/test_ssl.py +++ b/Lib/test/test_ssl.py @@ -488,7 +488,7 @@ class BasicSocketTests(unittest.TestCase): ('email', 'null@python.org\x00user@example.org'), ('URI', 'http://null.python.org\x00http://example.org'), ('IP Address', '192.0.2.1'), - ('IP Address', '2001:DB8:0:0:0:0:0:1\n')) + ('IP Address', '2001:DB8:0:0:0:0:0:1')) else: # OpenSSL 0.9.7 doesn't support IPv6 addresses in subjectAltName san = (('DNS', 'altnull.python.org\x00example.com'), @@ -515,7 +515,7 @@ class BasicSocketTests(unittest.TestCase): (('commonName', 'dirname example'),))), ('URI', 'https://www.python.org/'), ('IP Address', '127.0.0.1'), - ('IP Address', '0:0:0:0:0:0:0:1\n'), + ('IP Address', '0:0:0:0:0:0:0:1'), ('Registered ID', '1.2.3.4.5') ) ) @@ -542,11 +542,11 @@ class BasicSocketTests(unittest.TestCase): # Some sanity checks follow # >= 0.9 self.assertGreaterEqual(n, 0x900000) - # < 3.0 - self.assertLess(n, 0x30000000) + # < 4.0 + self.assertLess(n, 0x40000000) major, minor, fix, patch, status = t - self.assertGreaterEqual(major, 0) - self.assertLess(major, 3) + self.assertGreaterEqual(major, 1) + self.assertLess(major, 4) self.assertGreaterEqual(minor, 0) self.assertLess(minor, 256) self.assertGreaterEqual(fix, 0) diff --git a/Misc/NEWS.d/next/Library/2019-11-16-16-09-07.bpo-38820.ivhUSV.rst b/Misc/NEWS.d/next/Library/2019-11-16-16-09-07.bpo-38820.ivhUSV.rst new file mode 100644 index 00000000000..2c6a6e853c2 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-11-16-16-09-07.bpo-38820.ivhUSV.rst @@ -0,0 +1,2 @@ +Make Python compatible with OpenSSL 3.0.0. :func:`ssl.SSLSocket.getpeercert` +no longer returns IPv6 addresses with a trailing new line. diff --git a/Modules/_ssl.c b/Modules/_ssl.c index 6f1f9c88153..43b236c2121 100644 --- a/Modules/_ssl.c +++ b/Modules/_ssl.c @@ -1410,6 +1410,54 @@ _get_peer_alt_names (X509 *certificate) { PyTuple_SET_ITEM(t, 1, v); break; + case GEN_IPADD: + /* OpenSSL < 3.0.0 adds a trailing \n to IPv6. 3.0.0 removed + * the trailing newline. Remove it in all versions + */ + t = PyTuple_New(2); + if (t == NULL) + goto fail; + + v = PyUnicode_FromString("IP Address"); + if (v == NULL) { + Py_DECREF(t); + goto fail; + } + PyTuple_SET_ITEM(t, 0, v); + + if (name->d.ip->length == 4) { + unsigned char *p = name->d.ip->data; + v = PyUnicode_FromFormat( + "%d.%d.%d.%d", + p[0], p[1], p[2], p[3] + ); + } else if (name->d.ip->length == 16) { + /* PyUnicode_FromFormat() does not support %X */ + unsigned char *p = name->d.ip->data; + len = sprintf( + buf, + "%X:%X:%X:%X:%X:%X:%X:%X", + p[0] << 8 | p[1], + p[2] << 8 | p[3], + p[4] << 8 | p[5], + p[6] << 8 | p[7], + p[8] << 8 | p[9], + p[10] << 8 | p[11], + p[12] << 8 | p[13], + p[14] << 8 | p[15] + ); + v = PyUnicode_FromStringAndSize(buf, len); + } else { + v = PyUnicode_FromString(""); + } + + if (v == NULL) { + Py_DECREF(t); + goto fail; + } + PyTuple_SET_ITEM(t, 1, v); + break; + default: /* for everything else, we use the OpenSSL print form */ switch (gntype) { @@ -1417,7 +1465,6 @@ _get_peer_alt_names (X509 *certificate) { case GEN_OTHERNAME: case GEN_X400: case GEN_EDIPARTY: - case GEN_IPADD: case GEN_RID: break; default: From 6cac1136665b70f72db291b95876d7affcf1d2db Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Sun, 8 Dec 2019 08:38:16 +0100 Subject: [PATCH 090/115] bpo-38991: Remove test.support.strip_python_stderr() (GH-17490) test.support: run_python_until_end(), assert_python_ok() and assert_python_failure() functions no longer strip whitespaces from stderr. --- Doc/library/test.rst | 16 +++--- Lib/test/support/__init__.py | 10 ---- Lib/test/support/script_helper.py | 3 +- Lib/test/test_cmd_line.py | 6 +-- Lib/test/test_cmd_line_script.py | 4 +- Lib/test/test_faulthandler.py | 3 +- Lib/test/test_gc.py | 6 +-- Lib/test/test_subprocess.py | 50 ++++++++----------- Lib/test/test_support.py | 1 - Lib/test/test_warnings/__init__.py | 3 +- .../2019-12-07-00-52-09.bpo-38991.JE3_o-.rst | 5 ++ 11 files changed, 46 insertions(+), 61 deletions(-) create mode 100644 Misc/NEWS.d/next/Tests/2019-12-07-00-52-09.bpo-38991.JE3_o-.rst diff --git a/Doc/library/test.rst b/Doc/library/test.rst index 4a61566c223..73b3fe5cf06 100644 --- a/Doc/library/test.rst +++ b/Doc/library/test.rst @@ -686,13 +686,6 @@ The :mod:`test.support` module defines the following functions: ``sys.stdout`` if it's not set. -.. function:: strip_python_strerr(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 - :meth:`subprocess.Popen.communicate`. - - .. function:: args_from_interpreter_flags() Return a list of command line arguments reproducing the current settings @@ -1499,6 +1492,9 @@ script execution tests. in a subprocess. The values can include ``__isolated``, ``__cleanenv``, ``__cwd``, and ``TERM``. + .. versionchanged:: 3.9 + The function no longer strips whitespaces from *stderr*. + .. function:: assert_python_ok(*args, **env_vars) @@ -1512,6 +1508,9 @@ script execution tests. Python is started in isolated mode (command line option ``-I``), except if the ``__isolated`` keyword is set to ``False``. + .. versionchanged:: 3.9 + The function no longer strips whitespaces from *stderr*. + .. function:: assert_python_failure(*args, **env_vars) @@ -1521,6 +1520,9 @@ script execution tests. See :func:`assert_python_ok` for more options. + .. versionchanged:: 3.9 + The function no longer strips whitespaces from *stderr*. + .. function:: spawn_python(*args, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, **kw) diff --git a/Lib/test/support/__init__.py b/Lib/test/support/__init__.py index 7e1b30cc160..215bab8131a 100644 --- a/Lib/test/support/__init__.py +++ b/Lib/test/support/__init__.py @@ -2512,16 +2512,6 @@ def swap_item(obj, item, new_val): if item in obj: del obj[item] -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, \d+ blocks\]\r?\n?", b"", stderr).strip() - return stderr - requires_type_collecting = unittest.skipIf(hasattr(sys, 'getcounts'), 'types are immortal if COUNT_ALLOCS is defined') diff --git a/Lib/test/support/script_helper.py b/Lib/test/support/script_helper.py index 83519988e39..37e576d4a77 100644 --- a/Lib/test/support/script_helper.py +++ b/Lib/test/support/script_helper.py @@ -11,7 +11,7 @@ import py_compile import zipfile from importlib.util import source_from_cache -from test.support import make_legacy_pyc, strip_python_stderr +from test.support import make_legacy_pyc # Cached result of the expensive test performed in the function below. @@ -134,7 +134,6 @@ def run_python_until_end(*args, **env_vars): proc.kill() subprocess._cleanup() rc = proc.returncode - err = strip_python_stderr(err) return _PythonRunResult(rc, out, err), cmd_line def _assert_python(expected_success, /, *args, **env_vars): diff --git a/Lib/test/test_cmd_line.py b/Lib/test/test_cmd_line.py index 497bfa9eb89..47810020dd3 100644 --- a/Lib/test/test_cmd_line.py +++ b/Lib/test/test_cmd_line.py @@ -332,10 +332,10 @@ class CmdLineTest(unittest.TestCase): if sys.platform == 'win32': self.assertEqual(b'1\r\n2\r\n', out) - self.assertEqual(b'3\r\n4', err) + self.assertEqual(b'3\r\n4\r\n', err) else: self.assertEqual(b'1\n2\n', out) - self.assertEqual(b'3\n4', err) + self.assertEqual(b'3\n4\n', err) def test_unmached_quote(self): # Issue #10206: python program starting with unmatched quote @@ -391,7 +391,7 @@ class CmdLineTest(unittest.TestCase): stderr=subprocess.PIPE, preexec_fn=preexec) out, err = p.communicate() - self.assertEqual(support.strip_python_stderr(err), b'') + self.assertEqual(err, b'') self.assertEqual(p.returncode, 42) def test_no_stdin(self): diff --git a/Lib/test/test_cmd_line_script.py b/Lib/test/test_cmd_line_script.py index 60723078efc..2ac926deac4 100644 --- a/Lib/test/test_cmd_line_script.py +++ b/Lib/test/test_cmd_line_script.py @@ -535,7 +535,7 @@ class CmdLineTest(unittest.TestCase): script_name = _make_test_script(script_dir, 'script', script) exitcode, stdout, stderr = assert_python_failure(script_name) text = stderr.decode('ascii').split('\n') - self.assertEqual(len(text), 4) + self.assertEqual(len(text), 5) self.assertTrue(text[0].startswith('Traceback')) self.assertTrue(text[1].startswith(' File ')) self.assertTrue(text[3].startswith('NameError')) @@ -579,7 +579,7 @@ class CmdLineTest(unittest.TestCase): script_name = _make_test_script(script_dir, 'script', script) exitcode, stdout, stderr = assert_python_failure(script_name) text = stderr.decode('ascii') - self.assertEqual(text, "some text") + self.assertEqual(text.rstrip(), "some text") def test_syntaxerror_unindented_caret_position(self): script = "1 + 1 = 2\n" diff --git a/Lib/test/test_faulthandler.py b/Lib/test/test_faulthandler.py index a4427a537d1..ac8cf4686bf 100644 --- a/Lib/test/test_faulthandler.py +++ b/Lib/test/test_faulthandler.py @@ -71,9 +71,8 @@ class FaultHandlerTests(unittest.TestCase): with support.SuppressCrashReport(): process = script_helper.spawn_python('-c', code, pass_fds=pass_fds) with process: - stdout, stderr = process.communicate() + output, stderr = process.communicate() exitcode = process.wait() - output = support.strip_python_stderr(stdout) output = output.decode('ascii', 'backslashreplace') if filename: self.assertEqual(output, '') diff --git a/Lib/test/test_gc.py b/Lib/test/test_gc.py index fdb8752b668..c0d4a7507ae 100644 --- a/Lib/test/test_gc.py +++ b/Lib/test/test_gc.py @@ -1,7 +1,7 @@ import unittest import unittest.mock from test.support import (verbose, refcount_test, run_unittest, - strip_python_stderr, cpython_only, start_threads, + cpython_only, start_threads, temp_dir, requires_type_collecting, TESTFN, unlink, import_module) from test.support.script_helper import assert_python_ok, make_script @@ -671,8 +671,8 @@ class GCTests(unittest.TestCase): p.stdout.close() p.stderr.close() self.assertEqual(p.returncode, 0) - self.assertEqual(stdout.strip(), b"") - return strip_python_stderr(stderr) + self.assertEqual(stdout, b"") + return stderr stderr = run_command(code % "0") self.assertIn(b"ResourceWarning: gc: 2 uncollectable objects at " diff --git a/Lib/test/test_subprocess.py b/Lib/test/test_subprocess.py index 97dc09c5649..f806be817b5 100644 --- a/Lib/test/test_subprocess.py +++ b/Lib/test/test_subprocess.py @@ -85,15 +85,6 @@ class BaseTestCase(unittest.TestCase): self.doCleanups() support.reap_children() - def assertStderrEqual(self, stderr, expected, msg=None): - # In a debug build, stuff like "[6580 refs]" is printed to stderr at - # shutdown time. That frustrates tests trying to check stderr produced - # from a spawned Python process. - actual = support.strip_python_stderr(stderr) - # strip_python_stderr also strips whitespace, so we do too. - expected = expected.strip() - self.assertEqual(actual, expected, msg) - class PopenTestException(Exception): pass @@ -547,7 +538,7 @@ class ProcessTestCase(BaseTestCase): 'import sys; sys.stderr.write("strawberry")'], stderr=subprocess.PIPE) with p: - self.assertStderrEqual(p.stderr.read(), b"strawberry") + self.assertEqual(p.stderr.read(), b"strawberry") def test_stderr_filedes(self): # stderr is set to open file descriptor @@ -559,7 +550,7 @@ class ProcessTestCase(BaseTestCase): stderr=d) p.wait() os.lseek(d, 0, 0) - self.assertStderrEqual(os.read(d, 1024), b"strawberry") + self.assertEqual(os.read(d, 1024), b"strawberry") def test_stderr_fileobj(self): # stderr is set to open file object @@ -570,7 +561,7 @@ class ProcessTestCase(BaseTestCase): stderr=tf) p.wait() tf.seek(0) - self.assertStderrEqual(tf.read(), b"strawberry") + self.assertEqual(tf.read(), b"strawberry") def test_stderr_redirect_with_no_stdout_redirect(self): # test stderr=STDOUT while stdout=None (not set) @@ -589,8 +580,8 @@ class ProcessTestCase(BaseTestCase): stderr=subprocess.PIPE) stdout, stderr = p.communicate() #NOTE: stdout should get stderr from grandchild - self.assertStderrEqual(stdout, b'42') - self.assertStderrEqual(stderr, b'') # should be empty + self.assertEqual(stdout, b'42') + self.assertEqual(stderr, b'') # should be empty self.assertEqual(p.returncode, 0) def test_stdout_stderr_pipe(self): @@ -603,7 +594,7 @@ class ProcessTestCase(BaseTestCase): stdout=subprocess.PIPE, stderr=subprocess.STDOUT) with p: - self.assertStderrEqual(p.stdout.read(), b"appleorange") + self.assertEqual(p.stdout.read(), b"appleorange") def test_stdout_stderr_file(self): # capture stdout and stderr to the same open file @@ -618,7 +609,7 @@ class ProcessTestCase(BaseTestCase): stderr=tf) p.wait() tf.seek(0) - self.assertStderrEqual(tf.read(), b"appleorange") + self.assertEqual(tf.read(), b"appleorange") def test_stdout_filedes_of_stdout(self): # stdout is set to 1 (#1531862). @@ -767,7 +758,7 @@ class ProcessTestCase(BaseTestCase): stderr=subprocess.PIPE) (stdout, stderr) = p.communicate() self.assertEqual(stdout, None) - self.assertStderrEqual(stderr, b"pineapple") + self.assertEqual(stderr, b"pineapple") def test_communicate(self): p = subprocess.Popen([sys.executable, "-c", @@ -782,7 +773,7 @@ class ProcessTestCase(BaseTestCase): self.addCleanup(p.stdin.close) (stdout, stderr) = p.communicate(b"banana") self.assertEqual(stdout, b"banana") - self.assertStderrEqual(stderr, b"pineapple") + self.assertEqual(stderr, b"pineapple") def test_communicate_timeout(self): p = subprocess.Popen([sys.executable, "-c", @@ -801,7 +792,7 @@ class ProcessTestCase(BaseTestCase): # after it completes. (stdout, stderr) = p.communicate() self.assertEqual(stdout, "banana") - self.assertStderrEqual(stderr.encode(), b"pineapple\npear\n") + self.assertEqual(stderr.encode(), b"pineapple\npear\n") def test_communicate_timeout_large_output(self): # Test an expiring timeout while the child is outputting lots of data. @@ -887,7 +878,7 @@ class ProcessTestCase(BaseTestCase): p.stdin.write(b"banana") (stdout, stderr) = p.communicate(b"split") self.assertEqual(stdout, b"bananasplit") - self.assertStderrEqual(stderr, b"") + self.assertEqual(stderr, b"") def test_universal_newlines_and_text(self): args = [ @@ -1005,7 +996,6 @@ class ProcessTestCase(BaseTestCase): self.assertEqual("line1\nline2\nline3\nline4\nline5\n", stdout) # Python debug build push something like "[42442 refs]\n" # to stderr at exit of subprocess. - # Don't use assertStderrEqual because it strips CR and LF from output. self.assertTrue(stderr.startswith("eline2\neline6\neline7\n")) def test_universal_newlines_communicate_encodings(self): @@ -2240,13 +2230,13 @@ class POSIXProcessTestCase(BaseTestCase): def test_kill(self): p = self._kill_process('kill') _, stderr = p.communicate() - self.assertStderrEqual(stderr, b'') + self.assertEqual(stderr, b'') self.assertEqual(p.wait(), -signal.SIGKILL) def test_terminate(self): p = self._kill_process('terminate') _, stderr = p.communicate() - self.assertStderrEqual(stderr, b'') + self.assertEqual(stderr, b'') self.assertEqual(p.wait(), -signal.SIGTERM) def test_send_signal_dead(self): @@ -2294,8 +2284,8 @@ class POSIXProcessTestCase(BaseTestCase): stdin=stdin, stdout=subprocess.PIPE, stderr=subprocess.PIPE).communicate() - err = support.strip_python_stderr(err) - self.assertEqual((out, err), (b'apple', b'orange')) + self.assertEqual(out, b'apple') + self.assertEqual(err, b'orange') finally: self._restore_fds(saved_fds) @@ -2380,7 +2370,7 @@ class POSIXProcessTestCase(BaseTestCase): os.lseek(fd, 0, 0) out = os.read(temp_fds[2], 1024) - err = support.strip_python_stderr(os.read(temp_fds[0], 1024)) + err = os.read(temp_fds[0], 1024).strip() self.assertEqual(out, b"got STDIN") self.assertEqual(err, b"err") @@ -2422,7 +2412,7 @@ class POSIXProcessTestCase(BaseTestCase): os.lseek(fd, 0, 0) out = os.read(stdout_no, 1024) - err = support.strip_python_stderr(os.read(stderr_no, 1024)) + err = os.read(stderr_no, 1024).strip() finally: self._restore_fds(saved_fds) @@ -3338,7 +3328,7 @@ class Win32ProcessTestCase(BaseTestCase): p.stdout.read(1) getattr(p, method)(*args) _, stderr = p.communicate() - self.assertStderrEqual(stderr, b'') + self.assertEqual(stderr, b'') returncode = p.wait() self.assertNotEqual(returncode, 0) @@ -3361,7 +3351,7 @@ class Win32ProcessTestCase(BaseTestCase): # This shouldn't raise even though the child is now dead getattr(p, method)(*args) _, stderr = p.communicate() - self.assertStderrEqual(stderr, b'') + self.assertEqual(stderr, b'') rc = p.wait() self.assertEqual(rc, 42) @@ -3550,7 +3540,7 @@ class ContextManagerTests(BaseTestCase): stdout=subprocess.PIPE, stderr=subprocess.PIPE) as proc: self.assertEqual(proc.stdout.read(), b"stdout") - self.assertStderrEqual(proc.stderr.read(), b"stderr") + self.assertEqual(proc.stderr.read(), b"stderr") self.assertTrue(proc.stdout.closed) self.assertTrue(proc.stderr.closed) diff --git a/Lib/test/test_support.py b/Lib/test/test_support.py index e3ce670b843..eb27c0cf866 100644 --- a/Lib/test/test_support.py +++ b/Lib/test/test_support.py @@ -653,7 +653,6 @@ class TestSupport(unittest.TestCase): # run_doctest # threading_cleanup # reap_threads - # strip_python_stderr # can_symlink # skip_unless_symlink # SuppressCrashReport diff --git a/Lib/test/test_warnings/__init__.py b/Lib/test/test_warnings/__init__.py index d1031829514..3a6d64eaad1 100644 --- a/Lib/test/test_warnings/__init__.py +++ b/Lib/test/test_warnings/__init__.py @@ -1219,7 +1219,8 @@ class A: a=A() """ rc, out, err = assert_python_ok("-c", code) - self.assertEqual(err.decode(), ':7: UserWarning: test') + self.assertEqual(err.decode().rstrip(), + ':7: UserWarning: test') def test_late_resource_warning(self): # Issue #21925: Emitting a ResourceWarning late during the Python diff --git a/Misc/NEWS.d/next/Tests/2019-12-07-00-52-09.bpo-38991.JE3_o-.rst b/Misc/NEWS.d/next/Tests/2019-12-07-00-52-09.bpo-38991.JE3_o-.rst new file mode 100644 index 00000000000..cff5a656465 --- /dev/null +++ b/Misc/NEWS.d/next/Tests/2019-12-07-00-52-09.bpo-38991.JE3_o-.rst @@ -0,0 +1,5 @@ +:mod:`test.support`: :func:`~test.support.run_python_until_end`, +:func:`~test.support.assert_python_ok` and +:func:`~test.support.assert_python_failure` functions no longer strip +whitespaces from stderr. Remove ``test.support.strip_python_stderr()`` +function. From 00ada2c1d57c5b8b468bad32ff24fa14113ae5c7 Mon Sep 17 00:00:00 2001 From: xdegaye Date: Sun, 8 Dec 2019 08:40:14 +0100 Subject: [PATCH 091/115] bpo-38852: Set thread stack size to 8 Mb for debug builds on android platforms (GH-17337) --- .../2019-11-22-09-55-21.bpo-38852.y7oPEa.rst | 1 + Python/thread_pthread.h | 10 ++++++++++ 2 files changed, 11 insertions(+) create mode 100644 Misc/NEWS.d/next/Core and Builtins/2019-11-22-09-55-21.bpo-38852.y7oPEa.rst diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-11-22-09-55-21.bpo-38852.y7oPEa.rst b/Misc/NEWS.d/next/Core and Builtins/2019-11-22-09-55-21.bpo-38852.y7oPEa.rst new file mode 100644 index 00000000000..915a936aae2 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2019-11-22-09-55-21.bpo-38852.y7oPEa.rst @@ -0,0 +1 @@ +Set the thread stack size to 8 Mb for debug builds on android platforms. diff --git a/Python/thread_pthread.h b/Python/thread_pthread.h index b9a340530cf..ff4266c72b4 100644 --- a/Python/thread_pthread.h +++ b/Python/thread_pthread.h @@ -51,6 +51,16 @@ #undef THREAD_STACK_SIZE #define THREAD_STACK_SIZE 0x200000 #endif +/* bpo-38852: test_threading.test_recursion_limit() checks that 1000 recursive + Python calls (default recursion limit) doesn't crash, but raise a regular + RecursionError exception. In debug mode, Python function calls allocates + more memory on the stack, so use a stack of 8 MiB. */ +#if defined(__ANDROID__) && defined(THREAD_STACK_SIZE) && THREAD_STACK_SIZE == 0 +# ifdef Py_DEBUG +# undef THREAD_STACK_SIZE +# define THREAD_STACK_SIZE 0x800000 +# endif +#endif /* for safety, ensure a viable minimum stacksize */ #define THREAD_STACK_MIN 0x8000 /* 32 KiB */ #else /* !_POSIX_THREAD_ATTR_STACKSIZE */ From 28c91631c24e53713ad0e8a2bbae716373f5e53d Mon Sep 17 00:00:00 2001 From: AMIR <31338382+amiremohamadi@users.noreply.github.com> Date: Sun, 8 Dec 2019 15:05:59 +0330 Subject: [PATCH 092/115] bpo-38979: fix ContextVar "__class_getitem__" method (GH-17497) now contextvars.ContextVar "__class_getitem__" method returns ContextVar class, not None. https://bugs.python.org/issue38979 Automerge-Triggered-By: @asvetlov --- Lib/test/test_context.py | 7 ++++--- .../next/Library/2019-12-07-16-32-42.bpo-38979.q0sIHy.rst | 1 + Python/context.c | 7 ++++--- 3 files changed, 9 insertions(+), 6 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2019-12-07-16-32-42.bpo-38979.q0sIHy.rst diff --git a/Lib/test/test_context.py b/Lib/test/test_context.py index efd7319a23a..b9e991a4000 100644 --- a/Lib/test/test_context.py +++ b/Lib/test/test_context.py @@ -38,9 +38,6 @@ class ContextTest(unittest.TestCase): self.assertNotEqual(hash(c), hash('aaa')) - def test_context_var_new_2(self): - self.assertIsNone(contextvars.ContextVar[int]) - @isolated_context def test_context_var_repr_1(self): c = contextvars.ContextVar('a') @@ -361,6 +358,10 @@ class ContextTest(unittest.TestCase): tp.shutdown() self.assertEqual(results, list(range(10))) + def test_contextvar_getitem(self): + clss = contextvars.ContextVar + self.assertEqual(clss[str], clss) + # HAMT Tests diff --git a/Misc/NEWS.d/next/Library/2019-12-07-16-32-42.bpo-38979.q0sIHy.rst b/Misc/NEWS.d/next/Library/2019-12-07-16-32-42.bpo-38979.q0sIHy.rst new file mode 100644 index 00000000000..6a91a12e493 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-12-07-16-32-42.bpo-38979.q0sIHy.rst @@ -0,0 +1 @@ +Return class from ``ContextVar.__class_getitem__`` to simplify subclassing. diff --git a/Python/context.c b/Python/context.c index 26f22994eec..e0338c97e18 100644 --- a/Python/context.c +++ b/Python/context.c @@ -1024,9 +1024,10 @@ _contextvars_ContextVar_reset(PyContextVar *self, PyObject *token) static PyObject * -contextvar_cls_getitem(PyObject *self, PyObject *args) +contextvar_cls_getitem(PyObject *self, PyObject *arg) { - Py_RETURN_NONE; + Py_INCREF(self); + return self; } static PyMemberDef PyContextVar_members[] = { @@ -1039,7 +1040,7 @@ static PyMethodDef PyContextVar_methods[] = { _CONTEXTVARS_CONTEXTVAR_SET_METHODDEF _CONTEXTVARS_CONTEXTVAR_RESET_METHODDEF {"__class_getitem__", contextvar_cls_getitem, - METH_VARARGS | METH_STATIC, NULL}, + METH_O | METH_CLASS, NULL}, {NULL, NULL} }; From cd90a52983db34896a6335a572d55bdda274778f Mon Sep 17 00:00:00 2001 From: Elena Oat Date: Sun, 8 Dec 2019 12:14:38 -0800 Subject: [PATCH 093/115] bpo-38669: patch.object now raises a helpful error (GH17034) This means a clearer message is now shown when patch.object is called with two string arguments, rather than a class and a string argument. --- Lib/unittest/mock.py | 4 ++++ Lib/unittest/test/testmock/testpatch.py | 4 ++++ .../next/Tests/2019-11-04-02-54-16.bpo-38669.pazXZ8.rst | 1 + 3 files changed, 9 insertions(+) create mode 100644 Misc/NEWS.d/next/Tests/2019-11-04-02-54-16.bpo-38669.pazXZ8.rst diff --git a/Lib/unittest/mock.py b/Lib/unittest/mock.py index b06e29cf01c..cd5a2aeb608 100644 --- a/Lib/unittest/mock.py +++ b/Lib/unittest/mock.py @@ -1601,6 +1601,10 @@ def _patch_object( When used as a class decorator `patch.object` honours `patch.TEST_PREFIX` for choosing which methods to wrap. """ + if type(target) is str: + raise TypeError( + f"{target!r} must be the actual object to be patched, not a str" + ) getter = lambda: target return _patch( getter, attribute, new, spec, create, diff --git a/Lib/unittest/test/testmock/testpatch.py b/Lib/unittest/test/testmock/testpatch.py index 0632d95e58f..e065a2c35fb 100644 --- a/Lib/unittest/test/testmock/testpatch.py +++ b/Lib/unittest/test/testmock/testpatch.py @@ -105,6 +105,10 @@ class PatchTest(unittest.TestCase): self.assertEqual(Something.attribute, sentinel.Original, "patch not restored") + def test_patchobject_with_string_as_target(self): + msg = "'Something' must be the actual object to be patched, not a str" + with self.assertRaisesRegex(TypeError, msg): + patch.object('Something', 'do_something') def test_patchobject_with_none(self): class Something(object): diff --git a/Misc/NEWS.d/next/Tests/2019-11-04-02-54-16.bpo-38669.pazXZ8.rst b/Misc/NEWS.d/next/Tests/2019-11-04-02-54-16.bpo-38669.pazXZ8.rst new file mode 100644 index 00000000000..5060ecf2dc5 --- /dev/null +++ b/Misc/NEWS.d/next/Tests/2019-11-04-02-54-16.bpo-38669.pazXZ8.rst @@ -0,0 +1 @@ +Raise :exc:`TypeError` when passing target as a string with :meth:`unittest.mock.patch.object`. \ No newline at end of file From 526606baf76e7a5309bb00f3bfaefa861a2014ba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Batuhan=20Ta=C5=9Fkaya?= <47358913+isidentical@users.noreply.github.com> Date: Sun, 8 Dec 2019 23:31:15 +0300 Subject: [PATCH 094/115] bpo-38994: Implement __class_getitem__ for PathLike (GH-17498) https://bugs.python.org/issue38994 --- Lib/os.py | 3 +++ Lib/pathlib.py | 3 +++ Lib/test/test_os.py | 3 +++ Lib/test/test_pathlib.py | 3 +++ .../next/Library/2019-12-07-18-58-44.bpo-38994.IJYhz_.rst | 1 + 5 files changed, 13 insertions(+) create mode 100644 Misc/NEWS.d/next/Library/2019-12-07-18-58-44.bpo-38994.IJYhz_.rst diff --git a/Lib/os.py b/Lib/os.py index 52d3f1d7415..c901bd1b8ed 100644 --- a/Lib/os.py +++ b/Lib/os.py @@ -1072,6 +1072,9 @@ class PathLike(abc.ABC): def __subclasshook__(cls, subclass): return hasattr(subclass, '__fspath__') + def __class_getitem__(cls, type): + return cls + if name == 'nt': class _AddedDllDirectory: diff --git a/Lib/pathlib.py b/Lib/pathlib.py index d70fde0ea3b..f0537cfea19 100644 --- a/Lib/pathlib.py +++ b/Lib/pathlib.py @@ -777,6 +777,9 @@ class PurePath(object): return NotImplemented return self._cparts >= other._cparts + def __class_getitem__(cls, type): + return cls + drive = property(attrgetter('_drv'), doc="""The drive prefix (letter or UNC path), if any.""") diff --git a/Lib/test/test_os.py b/Lib/test/test_os.py index bf40cb1e8fa..f44ddbad7d6 100644 --- a/Lib/test/test_os.py +++ b/Lib/test/test_os.py @@ -4048,6 +4048,9 @@ class TestPEP519(unittest.TestCase): self.assertRaises(ZeroDivisionError, self.fspath, FakePath(ZeroDivisionError())) + def test_pathlike_class_getitem(self): + self.assertIs(os.PathLike[bytes], os.PathLike) + class TimesTests(unittest.TestCase): def test_times(self): diff --git a/Lib/test/test_pathlib.py b/Lib/test/test_pathlib.py index 058a201aebc..b8e7fcc2e30 100644 --- a/Lib/test/test_pathlib.py +++ b/Lib/test/test_pathlib.py @@ -2217,6 +2217,9 @@ class _BasePathTest(object): class PathTest(_BasePathTest, unittest.TestCase): cls = pathlib.Path + def test_class_getitem(self): + self.assertIs(self.cls[str], self.cls) + def test_concrete_class(self): p = self.cls('a') self.assertIs(type(p), diff --git a/Misc/NEWS.d/next/Library/2019-12-07-18-58-44.bpo-38994.IJYhz_.rst b/Misc/NEWS.d/next/Library/2019-12-07-18-58-44.bpo-38994.IJYhz_.rst new file mode 100644 index 00000000000..b9cb4176350 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-12-07-18-58-44.bpo-38994.IJYhz_.rst @@ -0,0 +1 @@ +Implement ``__class_getitem__`` for ``os.PathLike``, ``pathlib.Path`` From 080ee5a88406fb68aaab741145cd5d2a7c5f2ad6 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Sun, 8 Dec 2019 21:55:58 +0100 Subject: [PATCH 095/115] bpo-38858: Fix ref leak in pycore_interp_init() (GH-17512) bpo-38858, bpo-38997: _PySys_Create() returns a strong reference to the sys module: Py_DECREF() is needed when we are done with the module. --- Python/pylifecycle.c | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/Python/pylifecycle.c b/Python/pylifecycle.c index 8bd71a350de..823d96e86a4 100644 --- a/Python/pylifecycle.c +++ b/Python/pylifecycle.c @@ -705,24 +705,29 @@ static PyStatus pycore_interp_init(PyThreadState *tstate) { PyStatus status; + PyObject *sysmod = NULL; status = pycore_init_types(tstate); if (_PyStatus_EXCEPTION(status)) { - return status; + goto done; } - PyObject *sysmod; status = _PySys_Create(tstate, &sysmod); if (_PyStatus_EXCEPTION(status)) { - return status; + goto done; } status = pycore_init_builtins(tstate); if (_PyStatus_EXCEPTION(status)) { - return status; + goto done; } - return pycore_init_import_warnings(tstate, sysmod); + status = pycore_init_import_warnings(tstate, sysmod); + +done: + /* sys.modules['sys'] contains a strong reference to the module */ + Py_XDECREF(sysmod); + return status; } From 68157da8b42b26408af5d157d2dba4fcf29c6320 Mon Sep 17 00:00:00 2001 From: Abhilash Raj Date: Sun, 8 Dec 2019 17:35:38 -0800 Subject: [PATCH 096/115] bpo-38698: Add a new InvalidMessageID token to email header parser. (GH-17503) This adds a new InvalidMessageID token to the email header parser which can be used to represent invalid message-id headers in the parse tree. --- Lib/email/_header_value_parser.py | 20 ++++++++-- .../test_email/test__header_value_parser.py | 40 +++++++++++++++++-- .../2019-12-07-21-49-50.bpo-38698.HxoSym.rst | 3 ++ 3 files changed, 56 insertions(+), 7 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2019-12-07-21-49-50.bpo-38698.HxoSym.rst diff --git a/Lib/email/_header_value_parser.py b/Lib/email/_header_value_parser.py index abdef8189ca..cb013225ec6 100644 --- a/Lib/email/_header_value_parser.py +++ b/Lib/email/_header_value_parser.py @@ -850,10 +850,15 @@ class MsgID(TokenList): # message-id tokens may not be folded. return str(self) + policy.linesep + class MessageID(MsgID): token_type = 'message-id' +class InvalidMessageID(MessageID): + token_type = 'invalid-message-id' + + class Header(TokenList): token_type = 'header' @@ -2110,11 +2115,18 @@ def parse_message_id(value): message_id = MessageID() try: token, value = get_msg_id(value) - except errors.HeaderParseError: - message_id.defects.append(errors.InvalidHeaderDefect( - "Expected msg-id but found {!r}".format(value))) - else: message_id.append(token) + except errors.HeaderParseError as ex: + token = get_unstructured(value) + message_id = InvalidMessageID(token) + message_id.defects.append( + errors.InvalidHeaderDefect("Invalid msg-id: {!r}".format(ex))) + else: + # Value after parsing a valid msg_id should be None. + if value: + message_id.defects.append(errors.InvalidHeaderDefect( + "Unexpected {!r}".format(value))) + return message_id # diff --git a/Lib/test/test_email/test__header_value_parser.py b/Lib/test/test_email/test__header_value_parser.py index 71168f3183d..d59d70117b8 100644 --- a/Lib/test/test_email/test__header_value_parser.py +++ b/Lib/test/test_email/test__header_value_parser.py @@ -2639,10 +2639,44 @@ class TestParser(TestParserMixin, TestEmailBase): self.assertEqual(msg_id.token_type, 'msg-id') def test_get_msg_id_invalid_expected_msg_id_not_found(self): - text = "Message-Id: 935-XPB-567:0:86089:180874:0:45327:9:90305:17843586-40@example.com" + text = "935-XPB-567:0:45327:9:90305:17843586-40@example.com" msg_id = parser.parse_message_id(text) - self.assertDefectsEqual(msg_id.all_defects, - [errors.InvalidHeaderDefect]) + self.assertDefectsEqual( + msg_id.all_defects, + [errors.InvalidHeaderDefect]) + + def test_parse_invalid_message_id(self): + message_id = self._test_parse_x( + parser.parse_message_id, + "935-XPB-567:0:45327:9:90305:17843586-40@example.com", + "935-XPB-567:0:45327:9:90305:17843586-40@example.com", + "935-XPB-567:0:45327:9:90305:17843586-40@example.com", + [errors.InvalidHeaderDefect], + ) + self.assertEqual(message_id.token_type, 'invalid-message-id') + + def test_parse_valid_message_id(self): + message_id = self._test_parse_x( + parser.parse_message_id, + "", + "", + "", + [], + ) + self.assertEqual(message_id.token_type, 'message-id') + + def test_parse_message_id_with_remaining(self): + message_id = self._test_parse_x( + parser.parse_message_id, + "thensomething", + "", + "", + [errors.InvalidHeaderDefect], + [], + ) + self.assertEqual(message_id.token_type, 'message-id') + self.assertEqual(str(message_id.all_defects[0]), + "Unexpected 'thensomething'") def test_get_msg_id_no_angle_start(self): with self.assertRaises(errors.HeaderParseError): diff --git a/Misc/NEWS.d/next/Library/2019-12-07-21-49-50.bpo-38698.HxoSym.rst b/Misc/NEWS.d/next/Library/2019-12-07-21-49-50.bpo-38698.HxoSym.rst new file mode 100644 index 00000000000..b930dea0fa7 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-12-07-21-49-50.bpo-38698.HxoSym.rst @@ -0,0 +1,3 @@ +Add a new ``InvalidMessageID`` token to email parser to represent invalid +Message-ID headers. Also, add defects when there is remaining value after +parsing the header. From 3ae4ea1931361dd2743e464790e739d9285501bf Mon Sep 17 00:00:00 2001 From: Abhilash Raj Date: Sun, 8 Dec 2019 17:37:34 -0800 Subject: [PATCH 097/115] bpo-38708: email: Fix a potential IndexError when parsing Message-ID (GH-17504) Fix a potential IndexError when passing an empty value to the message-id parser. Instead, HeaderParseError should be raised. --- Lib/email/_header_value_parser.py | 2 +- Lib/test/test_email/test__header_value_parser.py | 6 ++++++ .../next/Library/2019-12-07-22-25-39.bpo-38708.rZTUfk.rst | 1 + 3 files changed, 8 insertions(+), 1 deletion(-) create mode 100644 Misc/NEWS.d/next/Library/2019-12-07-22-25-39.bpo-38708.rZTUfk.rst diff --git a/Lib/email/_header_value_parser.py b/Lib/email/_header_value_parser.py index cb013225ec6..9c55ef7fb45 100644 --- a/Lib/email/_header_value_parser.py +++ b/Lib/email/_header_value_parser.py @@ -2047,7 +2047,7 @@ def get_msg_id(value): no-fold-literal = "[" *dtext "]" """ msg_id = MsgID() - if value[0] in CFWS_LEADER: + if value and value[0] in CFWS_LEADER: token, value = get_cfws(value) msg_id.append(token) if not value or value[0] != '<': diff --git a/Lib/test/test_email/test__header_value_parser.py b/Lib/test/test_email/test__header_value_parser.py index d59d70117b8..1bdcfa129b4 100644 --- a/Lib/test/test_email/test__header_value_parser.py +++ b/Lib/test/test_email/test__header_value_parser.py @@ -2583,6 +2583,11 @@ class TestParser(TestParserMixin, TestEmailBase): # get_msg_id + def test_get_msg_id_empty(self): + # bpo-38708: Test that HeaderParseError is raised and not IndexError. + with self.assertRaises(errors.HeaderParseError): + parser.get_msg_id('') + def test_get_msg_id_valid(self): msg_id = self._test_get_x( parser.get_msg_id, @@ -2694,6 +2699,7 @@ class TestParser(TestParserMixin, TestEmailBase): self.assertEqual(msg_id.token_type, 'msg-id') + @parameterize class Test_parse_mime_parameters(TestParserMixin, TestEmailBase): diff --git a/Misc/NEWS.d/next/Library/2019-12-07-22-25-39.bpo-38708.rZTUfk.rst b/Misc/NEWS.d/next/Library/2019-12-07-22-25-39.bpo-38708.rZTUfk.rst new file mode 100644 index 00000000000..23a0a46d1fe --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-12-07-22-25-39.bpo-38708.rZTUfk.rst @@ -0,0 +1 @@ +Fix a potential IndexError in email parser when parsing an empty msg-id. From 109fc2792a490ee5cd8a423e17d415fbdedec5c8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Batuhan=20Ta=C5=9Fkaya?= <47358913+isidentical@users.noreply.github.com> Date: Mon, 9 Dec 2019 07:36:27 +0300 Subject: [PATCH 098/115] bpo-38673: dont switch to ps2 if the line starts with comment or whitespace (GH-17421) https://bugs.python.org/issue38673 --- .../2019-12-01-00-17-44.bpo-38673.K_Tze-.rst | 1 + Parser/tokenizer.c | 6 ++++++ 2 files changed, 7 insertions(+) create mode 100644 Misc/NEWS.d/next/Core and Builtins/2019-12-01-00-17-44.bpo-38673.K_Tze-.rst diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-12-01-00-17-44.bpo-38673.K_Tze-.rst b/Misc/NEWS.d/next/Core and Builtins/2019-12-01-00-17-44.bpo-38673.K_Tze-.rst new file mode 100644 index 00000000000..8f8cf88e5e2 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2019-12-01-00-17-44.bpo-38673.K_Tze-.rst @@ -0,0 +1 @@ +In REPL mode, don't switch to PS2 if the line starts with comment or whitespace. Based on work by Batuhan Taşkaya. diff --git a/Parser/tokenizer.c b/Parser/tokenizer.c index 5763e47c4b0..f84093dae5b 100644 --- a/Parser/tokenizer.c +++ b/Parser/tokenizer.c @@ -1148,6 +1148,12 @@ tok_get(struct tok_state *tok, char **p_start, char **p_end) if (col == 0 && c == '\n' && tok->prompt != NULL) { blankline = 0; /* Let it through */ } + else if (tok->prompt != NULL && tok->lineno == 1) { + /* In interactive mode, if the first line contains + only spaces and/or a comment, let it through. */ + blankline = 0; + col = altcol = 0; + } else { blankline = 1; /* Ignore completely */ } From a1838ec2592e5082c75c77888f2a7a3eb21133e5 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Mon, 9 Dec 2019 11:57:05 +0100 Subject: [PATCH 099/115] bpo-38547: Fix test_pty if the process is the session leader (GH-17519) Fix test_pty: if the process is the session leader, closing the master file descriptor raises a SIGHUP signal: simply ignore SIGHUP when running the tests. --- Lib/test/test_pty.py | 19 ++++++++++++++++--- .../2019-12-09-11-32-34.bpo-38547.Juw54e.rst | 3 +++ 2 files changed, 19 insertions(+), 3 deletions(-) create mode 100644 Misc/NEWS.d/next/Tests/2019-12-09-11-32-34.bpo-38547.Juw54e.rst diff --git a/Lib/test/test_pty.py b/Lib/test/test_pty.py index 3b448569a2f..ce85f575a08 100644 --- a/Lib/test/test_pty.py +++ b/Lib/test/test_pty.py @@ -66,16 +66,27 @@ def _readline(fd): # XXX(nnorwitz): these tests leak fds when there is an error. class PtyTest(unittest.TestCase): def setUp(self): - # isatty() and close() can hang on some platforms. Set an alarm - # before running the test to make sure we don't hang forever. old_alarm = signal.signal(signal.SIGALRM, self.handle_sig) self.addCleanup(signal.signal, signal.SIGALRM, old_alarm) + + old_sighup = signal.signal(signal.SIGHUP, self.handle_sighup) + self.addCleanup(signal.signal, signal.SIGHUP, old_alarm) + + # isatty() and close() can hang on some platforms. Set an alarm + # before running the test to make sure we don't hang forever. self.addCleanup(signal.alarm, 0) signal.alarm(10) def handle_sig(self, sig, frame): self.fail("isatty hung") + @staticmethod + def handle_sighup(sig, frame): + # if the process is the session leader, os.close(master_fd) + # of "master_fd, slave_name = pty.master_open()" raises SIGHUP + # signal: just ignore the signal. + pass + def test_basic(self): try: debug("Calling master_open()") @@ -122,9 +133,11 @@ class PtyTest(unittest.TestCase): self.assertEqual(b'For my pet fish, Eric.\n', normalize_output(s2)) os.close(slave_fd) + # closing master_fd can raise a SIGHUP if the process is + # the session leader: we installed a SIGHUP signal handler + # to ignore this signal. os.close(master_fd) - def test_fork(self): debug("calling pty.fork()") pid, master_fd = pty.fork() diff --git a/Misc/NEWS.d/next/Tests/2019-12-09-11-32-34.bpo-38547.Juw54e.rst b/Misc/NEWS.d/next/Tests/2019-12-09-11-32-34.bpo-38547.Juw54e.rst new file mode 100644 index 00000000000..10f3cc08511 --- /dev/null +++ b/Misc/NEWS.d/next/Tests/2019-12-09-11-32-34.bpo-38547.Juw54e.rst @@ -0,0 +1,3 @@ +Fix test_pty: if the process is the session leader, closing the master file +descriptor raises a SIGHUP signal: simply ignore SIGHUP when running the +tests. From 0131aba5ae20d704b972ecd2ef0fc6c9e370a1b3 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Mon, 9 Dec 2019 14:09:14 +0100 Subject: [PATCH 100/115] bpo-38916: array.array: remove fromstring() and tostring() (GH-17487) array.array: Remove tostring() and fromstring() methods. They were aliases to tobytes() and frombytes(), deprecated since Python 3.2. --- Doc/library/array.rst | 10 --- Doc/whatsnew/3.9.rst | 5 ++ Lib/test/test_array.py | 20 ------ .../2019-12-06-18-47-56.bpo-38916.K-raU8.rst | 3 + Modules/arraymodule.c | 41 ----------- Modules/clinic/arraymodule.c.h | 70 +------------------ 6 files changed, 9 insertions(+), 140 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2019-12-06-18-47-56.bpo-38916.K-raU8.rst diff --git a/Doc/library/array.rst b/Doc/library/array.rst index 2ae2a071262..c9a9b1dabb2 100644 --- a/Doc/library/array.rst +++ b/Doc/library/array.rst @@ -169,11 +169,6 @@ The following data items and methods are also supported: a.append(x)`` except that if there is a type error, the array is unchanged. -.. method:: array.fromstring() - - Deprecated alias for :meth:`frombytes`. - - .. method:: array.fromunicode(s) Extends this array with data from the given unicode string. The array must @@ -231,11 +226,6 @@ The following data items and methods are also supported: Convert the array to an ordinary list with the same items. -.. method:: array.tostring() - - Deprecated alias for :meth:`tobytes`. - - .. method:: array.tounicode() Convert the array to a unicode string. The array must be a type ``'u'`` array; diff --git a/Doc/whatsnew/3.9.rst b/Doc/whatsnew/3.9.rst index 1cd96ef3b07..7cf49bfbb93 100644 --- a/Doc/whatsnew/3.9.rst +++ b/Doc/whatsnew/3.9.rst @@ -279,6 +279,11 @@ Deprecated Removed ======= +* :class:`array.array`: ``tostring()`` and ``fromstring()`` methods have been + removed. They were aliases to ``tobytes()`` and ``frombytes()``, deprecated + since Python 3.2. + (Contributed by Victor Stinner in :issue:`38916`.) + * The abstract base classes in :mod:`collections.abc` no longer are exposed in the regular :mod:`collections` module. This will help create a clearer distinction between the concrete classes and the abstract diff --git a/Lib/test/test_array.py b/Lib/test/test_array.py index c2439579e8e..5f612fba8a4 100644 --- a/Lib/test/test_array.py +++ b/Lib/test/test_array.py @@ -426,26 +426,6 @@ class BaseTest: b.fromlist(a.tolist()) self.assertEqual(a, b) - def test_tofromstring(self): - # Warnings not raised when arguments are incorrect as Argument Clinic - # handles that before the warning can be raised. - nb_warnings = 2 - with warnings.catch_warnings(record=True) as r: - warnings.filterwarnings("always", - message=r"(to|from)string\(\) is deprecated", - category=DeprecationWarning) - a = array.array(self.typecode, 2*self.example) - b = array.array(self.typecode) - self.assertRaises(TypeError, a.tostring, 42) - self.assertRaises(TypeError, b.fromstring) - self.assertRaises(TypeError, b.fromstring, 42) - b.fromstring(a.tostring()) - self.assertEqual(a, b) - if a.itemsize>1: - self.assertRaises(ValueError, b.fromstring, "x") - nb_warnings += 1 - self.assertEqual(len(r), nb_warnings) - def test_tofrombytes(self): a = array.array(self.typecode, 2*self.example) b = array.array(self.typecode) diff --git a/Misc/NEWS.d/next/Library/2019-12-06-18-47-56.bpo-38916.K-raU8.rst b/Misc/NEWS.d/next/Library/2019-12-06-18-47-56.bpo-38916.K-raU8.rst new file mode 100644 index 00000000000..cb4c4c03c12 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-12-06-18-47-56.bpo-38916.K-raU8.rst @@ -0,0 +1,3 @@ +:class:`array.array`: Remove ``tostring()`` and ``fromstring()`` methods. +They were aliases to ``tobytes()`` and ``frombytes()``, deprecated since +Python 3.2. diff --git a/Modules/arraymodule.c b/Modules/arraymodule.c index 1ceba9e63cb..edb56ab6e18 100644 --- a/Modules/arraymodule.c +++ b/Modules/arraymodule.c @@ -1623,27 +1623,6 @@ frombytes(arrayobject *self, Py_buffer *buffer) Py_RETURN_NONE; } -/*[clinic input] -array.array.fromstring - - buffer: Py_buffer(accept={str, buffer}) - / - -Appends items from the string, interpreting it as an array of machine values, as if it had been read from a file using the fromfile() method). - -This method is deprecated. Use frombytes instead. -[clinic start generated code]*/ - -static PyObject * -array_array_fromstring_impl(arrayobject *self, Py_buffer *buffer) -/*[clinic end generated code: output=31c4baa779df84ce input=a3341a512e11d773]*/ -{ - if (PyErr_WarnEx(PyExc_DeprecationWarning, - "fromstring() is deprecated. Use frombytes() instead.", 2) != 0) - return NULL; - return frombytes(self, buffer); -} - /*[clinic input] array.array.frombytes @@ -1678,24 +1657,6 @@ array_array_tobytes_impl(arrayobject *self) } } -/*[clinic input] -array.array.tostring - -Convert the array to an array of machine values and return the bytes representation. - -This method is deprecated. Use tobytes instead. -[clinic start generated code]*/ - -static PyObject * -array_array_tostring_impl(arrayobject *self) -/*[clinic end generated code: output=7d6bd92745a2c8f3 input=b6c0ddee7b30457e]*/ -{ - if (PyErr_WarnEx(PyExc_DeprecationWarning, - "tostring() is deprecated. Use tobytes() instead.", 2) != 0) - return NULL; - return array_array_tobytes_impl(self); -} - /*[clinic input] array.array.fromunicode @@ -2283,7 +2244,6 @@ static PyMethodDef array_methods[] = { ARRAY_ARRAY_EXTEND_METHODDEF ARRAY_ARRAY_FROMFILE_METHODDEF ARRAY_ARRAY_FROMLIST_METHODDEF - ARRAY_ARRAY_FROMSTRING_METHODDEF ARRAY_ARRAY_FROMBYTES_METHODDEF ARRAY_ARRAY_FROMUNICODE_METHODDEF ARRAY_ARRAY_INDEX_METHODDEF @@ -2294,7 +2254,6 @@ static PyMethodDef array_methods[] = { ARRAY_ARRAY_REVERSE_METHODDEF ARRAY_ARRAY_TOFILE_METHODDEF ARRAY_ARRAY_TOLIST_METHODDEF - ARRAY_ARRAY_TOSTRING_METHODDEF ARRAY_ARRAY_TOBYTES_METHODDEF ARRAY_ARRAY_TOUNICODE_METHODDEF ARRAY_ARRAY___SIZEOF___METHODDEF diff --git a/Modules/clinic/arraymodule.c.h b/Modules/clinic/arraymodule.c.h index 33f82d4da8b..e1f4b0397b9 100644 --- a/Modules/clinic/arraymodule.c.h +++ b/Modules/clinic/arraymodule.c.h @@ -312,54 +312,6 @@ array_array_tolist(arrayobject *self, PyObject *Py_UNUSED(ignored)) return array_array_tolist_impl(self); } -PyDoc_STRVAR(array_array_fromstring__doc__, -"fromstring($self, buffer, /)\n" -"--\n" -"\n" -"Appends items from the string, interpreting it as an array of machine values, as if it had been read from a file using the fromfile() method).\n" -"\n" -"This method is deprecated. Use frombytes instead."); - -#define ARRAY_ARRAY_FROMSTRING_METHODDEF \ - {"fromstring", (PyCFunction)array_array_fromstring, METH_O, array_array_fromstring__doc__}, - -static PyObject * -array_array_fromstring_impl(arrayobject *self, Py_buffer *buffer); - -static PyObject * -array_array_fromstring(arrayobject *self, PyObject *arg) -{ - PyObject *return_value = NULL; - Py_buffer buffer = {NULL, NULL}; - - if (PyUnicode_Check(arg)) { - Py_ssize_t len; - const char *ptr = PyUnicode_AsUTF8AndSize(arg, &len); - if (ptr == NULL) { - goto exit; - } - PyBuffer_FillInfo(&buffer, arg, (void *)ptr, len, 1, 0); - } - else { /* any bytes-like object */ - if (PyObject_GetBuffer(arg, &buffer, PyBUF_SIMPLE) != 0) { - goto exit; - } - if (!PyBuffer_IsContiguous(&buffer, 'C')) { - _PyArg_BadArgument("fromstring", "argument", "contiguous buffer", arg); - goto exit; - } - } - return_value = array_array_fromstring_impl(self, &buffer); - -exit: - /* Cleanup for buffer */ - if (buffer.obj) { - PyBuffer_Release(&buffer); - } - - return return_value; -} - PyDoc_STRVAR(array_array_frombytes__doc__, "frombytes($self, buffer, /)\n" "--\n" @@ -414,26 +366,6 @@ array_array_tobytes(arrayobject *self, PyObject *Py_UNUSED(ignored)) return array_array_tobytes_impl(self); } -PyDoc_STRVAR(array_array_tostring__doc__, -"tostring($self, /)\n" -"--\n" -"\n" -"Convert the array to an array of machine values and return the bytes representation.\n" -"\n" -"This method is deprecated. Use tobytes instead."); - -#define ARRAY_ARRAY_TOSTRING_METHODDEF \ - {"tostring", (PyCFunction)array_array_tostring, METH_NOARGS, array_array_tostring__doc__}, - -static PyObject * -array_array_tostring_impl(arrayobject *self); - -static PyObject * -array_array_tostring(arrayobject *self, PyObject *Py_UNUSED(ignored)) -{ - return array_array_tostring_impl(self); -} - PyDoc_STRVAR(array_array_fromunicode__doc__, "fromunicode($self, ustr, /)\n" "--\n" @@ -599,4 +531,4 @@ PyDoc_STRVAR(array_arrayiterator___setstate____doc__, #define ARRAY_ARRAYITERATOR___SETSTATE___METHODDEF \ {"__setstate__", (PyCFunction)array_arrayiterator___setstate__, METH_O, array_arrayiterator___setstate____doc__}, -/*[clinic end generated code: output=6aa421571e2c0756 input=a9049054013a1b77]*/ +/*[clinic end generated code: output=f649fc0bc9f6b13a input=a9049054013a1b77]*/ From 82b4950b5e92bec343a436b3f9c116400b66e1b9 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Mon, 9 Dec 2019 15:02:03 +0100 Subject: [PATCH 101/115] bpo-39006: Fix asyncio when the ssl module is missing (GH-17524) Fix asyncio when the ssl module is missing: only check for ssl.SSLSocket instance if the ssl module is available. --- Lib/asyncio/selector_events.py | 20 +++++++++---------- .../2019-12-09-14-40-09.bpo-39006.v4VsPg.rst | 2 ++ 2 files changed, 12 insertions(+), 10 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2019-12-09-14-40-09.bpo-39006.v4VsPg.rst diff --git a/Lib/asyncio/selector_events.py b/Lib/asyncio/selector_events.py index e1abf511861..a05cbb6bdd6 100644 --- a/Lib/asyncio/selector_events.py +++ b/Lib/asyncio/selector_events.py @@ -40,6 +40,11 @@ def _test_selector_event(selector, fd, event): return bool(key.events & event) +def _check_ssl_socket(sock): + if ssl is not None and isinstance(sock, ssl.SSLSocket): + raise TypeError("Socket cannot be of type SSLSocket") + + class BaseSelectorEventLoop(base_events.BaseEventLoop): """Selector event loop. @@ -348,8 +353,7 @@ class BaseSelectorEventLoop(base_events.BaseEventLoop): The maximum amount of data to be received at once is specified by nbytes. """ - if isinstance(sock, ssl.SSLSocket): - raise TypeError("Socket cannot be of type SSLSocket") + _check_ssl_socket(sock) if self._debug and sock.gettimeout() != 0: raise ValueError("the socket must be non-blocking") try: @@ -388,8 +392,7 @@ class BaseSelectorEventLoop(base_events.BaseEventLoop): The received data is written into *buf* (a writable buffer). The return value is the number of bytes written. """ - if isinstance(sock, ssl.SSLSocket): - raise TypeError("Socket cannot be of type SSLSocket") + _check_ssl_socket(sock) if self._debug and sock.gettimeout() != 0: raise ValueError("the socket must be non-blocking") try: @@ -429,8 +432,7 @@ class BaseSelectorEventLoop(base_events.BaseEventLoop): raised, and there is no way to determine how much data, if any, was successfully processed by the receiving end of the connection. """ - if isinstance(sock, ssl.SSLSocket): - raise TypeError("Socket cannot be of type SSLSocket") + _check_ssl_socket(sock) if self._debug and sock.gettimeout() != 0: raise ValueError("the socket must be non-blocking") try: @@ -478,8 +480,7 @@ class BaseSelectorEventLoop(base_events.BaseEventLoop): This method is a coroutine. """ - if isinstance(sock, ssl.SSLSocket): - raise TypeError("Socket cannot be of type SSLSocket") + _check_ssl_socket(sock) if self._debug and sock.gettimeout() != 0: raise ValueError("the socket must be non-blocking") @@ -541,8 +542,7 @@ class BaseSelectorEventLoop(base_events.BaseEventLoop): object usable to send and receive data on the connection, and address is the address bound to the socket on the other end of the connection. """ - if isinstance(sock, ssl.SSLSocket): - raise TypeError("Socket cannot be of type SSLSocket") + _check_ssl_socket(sock) if self._debug and sock.gettimeout() != 0: raise ValueError("the socket must be non-blocking") fut = self.create_future() diff --git a/Misc/NEWS.d/next/Library/2019-12-09-14-40-09.bpo-39006.v4VsPg.rst b/Misc/NEWS.d/next/Library/2019-12-09-14-40-09.bpo-39006.v4VsPg.rst new file mode 100644 index 00000000000..8402845a5a0 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-12-09-14-40-09.bpo-39006.v4VsPg.rst @@ -0,0 +1,2 @@ +Fix asyncio when the ssl module is missing: only check for ssl.SSLSocket +instance if the ssl module is available. From ab513a38c98695f271e448fe2cb7c5e39eeaaaaf Mon Sep 17 00:00:00 2001 From: Kyle Stanley Date: Mon, 9 Dec 2019 09:21:10 -0500 Subject: [PATCH 102/115] bpo-37228: Fix loop.create_datagram_endpoint()'s usage of SO_REUSEADDR (#17311) --- Doc/library/asyncio-eventloop.rst | 24 ++++++++--- Lib/asyncio/base_events.py | 25 +++++++---- Lib/test/test_asyncio/test_base_events.py | 41 +++++++++++-------- .../2019-11-21-21-36-54.bpo-37228.yBZnFG.rst | 6 +++ 4 files changed, 67 insertions(+), 29 deletions(-) create mode 100644 Misc/NEWS.d/next/Security/2019-11-21-21-36-54.bpo-37228.yBZnFG.rst diff --git a/Doc/library/asyncio-eventloop.rst b/Doc/library/asyncio-eventloop.rst index 240d814f13d..d9b1cf7a8d8 100644 --- a/Doc/library/asyncio-eventloop.rst +++ b/Doc/library/asyncio-eventloop.rst @@ -473,6 +473,21 @@ Opening network connections reuse_address=None, reuse_port=None, \ allow_broadcast=None, sock=None) + .. note:: + The parameter *reuse_address* is no longer supported, as using + :py:data:`~sockets.SO_REUSEADDR` poses a significant security concern for + UDP. Explicitly passing ``reuse_address=True`` will raise an exception. + + When multiple processes with differing UIDs assign sockets to an + indentical UDP socket address with ``SO_REUSEADDR``, incoming packets can + become randomly distributed among the sockets. + + For supported platforms, *reuse_port* can be used as a replacement for + similar functionality. With *reuse_port*, + :py:data:`~sockets.SO_REUSEPORT` is used instead, which specifically + prevents processes with differing UIDs from assigning sockets to the same + socket address. + Create a datagram connection. The socket family can be either :py:data:`~socket.AF_INET`, @@ -501,11 +516,6 @@ Opening network connections resolution. If given, these should all be integers from the corresponding :mod:`socket` module constants. - * *reuse_address* tells the kernel to reuse a local socket in - ``TIME_WAIT`` state, without waiting for its natural timeout to - expire. If not specified will automatically be set to ``True`` on - Unix. - * *reuse_port* tells the kernel to allow this endpoint to be bound to the same port as other existing endpoints are bound to, so long as they all set this flag when being created. This option is not supported on Windows @@ -527,6 +537,10 @@ Opening network connections The *family*, *proto*, *flags*, *reuse_address*, *reuse_port, *allow_broadcast*, and *sock* parameters were added. + .. versionchanged:: 3.8.1 + The *reuse_address* parameter is no longer supported due to security + concerns. + .. versionchanged:: 3.8 Added support for Windows. diff --git a/Lib/asyncio/base_events.py b/Lib/asyncio/base_events.py index 031071281b3..adcdec171b0 100644 --- a/Lib/asyncio/base_events.py +++ b/Lib/asyncio/base_events.py @@ -66,6 +66,10 @@ _HAS_IPv6 = hasattr(socket, 'AF_INET6') # Maximum timeout passed to select to avoid OS limitations MAXIMUM_SELECT_TIMEOUT = 24 * 3600 +# Used for deprecation and removal of `loop.create_datagram_endpoint()`'s +# *reuse_address* parameter +_unset = object() + def _format_handle(handle): cb = handle._callback @@ -1230,7 +1234,7 @@ class BaseEventLoop(events.AbstractEventLoop): async def create_datagram_endpoint(self, protocol_factory, local_addr=None, remote_addr=None, *, family=0, proto=0, flags=0, - reuse_address=None, reuse_port=None, + reuse_address=_unset, reuse_port=None, allow_broadcast=None, sock=None): """Create datagram connection.""" if sock is not None: @@ -1239,7 +1243,7 @@ class BaseEventLoop(events.AbstractEventLoop): f'A UDP Socket was expected, got {sock!r}') if (local_addr or remote_addr or family or proto or flags or - reuse_address or reuse_port or allow_broadcast): + reuse_port or allow_broadcast): # show the problematic kwargs in exception msg opts = dict(local_addr=local_addr, remote_addr=remote_addr, family=family, proto=proto, flags=flags, @@ -1306,8 +1310,18 @@ class BaseEventLoop(events.AbstractEventLoop): exceptions = [] - if reuse_address is None: - reuse_address = os.name == 'posix' and sys.platform != 'cygwin' + # bpo-37228 + if reuse_address is not _unset: + if reuse_address: + raise ValueError("Passing `reuse_address=True` is no " + "longer supported, as the usage of " + "SO_REUSEPORT in UDP poses a significant " + "security concern.") + else: + warnings.warn("The *reuse_address* parameter has been " + "deprecated as of 3.5.10 and is scheduled " + "for removal in 3.11.", DeprecationWarning, + stacklevel=2) for ((family, proto), (local_address, remote_address)) in addr_pairs_info: @@ -1316,9 +1330,6 @@ class BaseEventLoop(events.AbstractEventLoop): try: sock = socket.socket( family=family, type=socket.SOCK_DGRAM, proto=proto) - if reuse_address: - sock.setsockopt( - socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) if reuse_port: _set_reuseport(sock) if allow_broadcast: diff --git a/Lib/test/test_asyncio/test_base_events.py b/Lib/test/test_asyncio/test_base_events.py index ca99d5c6c0a..6c0f00dc936 100644 --- a/Lib/test/test_asyncio/test_base_events.py +++ b/Lib/test/test_asyncio/test_base_events.py @@ -1738,10 +1738,6 @@ class BaseEventLoopWithSelectorTests(test_utils.TestCase): MyDatagramProto, flags=1, sock=FakeSock()) self.assertRaises(ValueError, self.loop.run_until_complete, fut) - fut = self.loop.create_datagram_endpoint( - MyDatagramProto, reuse_address=True, sock=FakeSock()) - self.assertRaises(ValueError, self.loop.run_until_complete, fut) - fut = self.loop.create_datagram_endpoint( MyDatagramProto, reuse_port=True, sock=FakeSock()) self.assertRaises(ValueError, self.loop.run_until_complete, fut) @@ -1752,7 +1748,6 @@ class BaseEventLoopWithSelectorTests(test_utils.TestCase): def test_create_datagram_endpoint_sockopts(self): # Socket options should not be applied unless asked for. - # SO_REUSEADDR defaults to on for UNIX. # SO_REUSEPORT is not available on all platforms. coro = self.loop.create_datagram_endpoint( @@ -1761,18 +1756,8 @@ class BaseEventLoopWithSelectorTests(test_utils.TestCase): transport, protocol = self.loop.run_until_complete(coro) sock = transport.get_extra_info('socket') - reuse_address_default_on = ( - os.name == 'posix' and sys.platform != 'cygwin') reuseport_supported = hasattr(socket, 'SO_REUSEPORT') - if reuse_address_default_on: - self.assertTrue( - sock.getsockopt( - socket.SOL_SOCKET, socket.SO_REUSEADDR)) - else: - self.assertFalse( - sock.getsockopt( - socket.SOL_SOCKET, socket.SO_REUSEADDR)) if reuseport_supported: self.assertFalse( sock.getsockopt( @@ -1788,13 +1773,12 @@ class BaseEventLoopWithSelectorTests(test_utils.TestCase): coro = self.loop.create_datagram_endpoint( lambda: MyDatagramProto(create_future=True, loop=self.loop), local_addr=('127.0.0.1', 0), - reuse_address=True, reuse_port=reuseport_supported, allow_broadcast=True) transport, protocol = self.loop.run_until_complete(coro) sock = transport.get_extra_info('socket') - self.assertTrue( + self.assertFalse( sock.getsockopt( socket.SOL_SOCKET, socket.SO_REUSEADDR)) if reuseport_supported: @@ -1809,6 +1793,29 @@ class BaseEventLoopWithSelectorTests(test_utils.TestCase): self.loop.run_until_complete(protocol.done) self.assertEqual('CLOSED', protocol.state) + def test_create_datagram_endpoint_reuse_address_error(self): + # bpo-37228: Ensure that explicit passing of `reuse_address=True` + # raises an error, as it is not safe to use SO_REUSEADDR when using UDP + + coro = self.loop.create_datagram_endpoint( + lambda: MyDatagramProto(create_future=True, loop=self.loop), + local_addr=('127.0.0.1', 0), + reuse_address=True) + + with self.assertRaises(ValueError): + self.loop.run_until_complete(coro) + + def test_create_datagram_endpoint_reuse_address_warning(self): + # bpo-37228: Deprecate *reuse_address* parameter + + coro = self.loop.create_datagram_endpoint( + lambda: MyDatagramProto(create_future=True, loop=self.loop), + local_addr=('127.0.0.1', 0), + reuse_address=False) + + with self.assertWarns(DeprecationWarning): + self.loop.run_until_complete(coro) + @patch_socket def test_create_datagram_endpoint_nosoreuseport(self, m_socket): del m_socket.SO_REUSEPORT diff --git a/Misc/NEWS.d/next/Security/2019-11-21-21-36-54.bpo-37228.yBZnFG.rst b/Misc/NEWS.d/next/Security/2019-11-21-21-36-54.bpo-37228.yBZnFG.rst new file mode 100644 index 00000000000..0fafb63402e --- /dev/null +++ b/Misc/NEWS.d/next/Security/2019-11-21-21-36-54.bpo-37228.yBZnFG.rst @@ -0,0 +1,6 @@ +Due to significant security concerns, the *reuse_address* parameter of +:meth:`asyncio.loop.create_datagram_endpoint` is no longer supported. This is +because of the behavior of ``SO_REUSEADDR`` in UDP. For more details, see the +documentation for ``loop.create_datagram_endpoint()``. +(Contributed by Kyle Stanley, Antoine Pitrou, and Yury Selivanov in +:issue:`37228`.) From bba873e633f0f1e88ea12fb935cbd58faa77f976 Mon Sep 17 00:00:00 2001 From: Mark Dickinson Date: Mon, 9 Dec 2019 08:36:34 -0600 Subject: [PATCH 103/115] bpo-38992: avoid fsum test failure from constant-folding (GH-17513) * Issue 38992: avoid fsum test failure * Add NEWS entry --- Lib/test/test_math.py | 8 +++++++- .../next/Tests/2019-12-08-15-11-06.bpo-38992.cVoHOZ.rst | 1 + 2 files changed, 8 insertions(+), 1 deletion(-) create mode 100644 Misc/NEWS.d/next/Tests/2019-12-08-15-11-06.bpo-38992.cVoHOZ.rst diff --git a/Lib/test/test_math.py b/Lib/test/test_math.py index f832246dda3..5c35c8cff12 100644 --- a/Lib/test/test_math.py +++ b/Lib/test/test_math.py @@ -676,7 +676,6 @@ class MathTests(unittest.TestCase): float.fromhex('0x1.df11f45f4e61ap+2')), ([(-1.)**n/n for n in range(1, 1001)], float.fromhex('-0x1.62a2af1bd3624p-1')), - ([1.7**(i+1)-1.7**i for i in range(1000)] + [-1.7**1000], -1.0), ([1e16, 1., 1e-16], 10000000000000002.0), ([1e16-2., 1.-2.**-53, -(1e16-2.), -(1.-2.**-53)], 0.0), # exercise code for resizing partials array @@ -685,6 +684,13 @@ class MathTests(unittest.TestCase): float.fromhex('0x1.5555555555555p+970')), ] + # Telescoping sum, with exact differences (due to Sterbenz) + terms = [1.7**i for i in range(1001)] + test_values.append(( + [terms[i+1] - terms[i] for i in range(1000)] + [-terms[1000]], + -terms[0] + )) + for i, (vals, expected) in enumerate(test_values): try: actual = math.fsum(vals) diff --git a/Misc/NEWS.d/next/Tests/2019-12-08-15-11-06.bpo-38992.cVoHOZ.rst b/Misc/NEWS.d/next/Tests/2019-12-08-15-11-06.bpo-38992.cVoHOZ.rst new file mode 100644 index 00000000000..815ae0f65c8 --- /dev/null +++ b/Misc/NEWS.d/next/Tests/2019-12-08-15-11-06.bpo-38992.cVoHOZ.rst @@ -0,0 +1 @@ +Fix a test for :func:`math.fsum` that was failing due to constant folding. From d219cc4180e7589807ebbef7421879f095e72a98 Mon Sep 17 00:00:00 2001 From: Yury Selivanov Date: Mon, 9 Dec 2019 09:54:20 -0500 Subject: [PATCH 104/115] bpo-34776: Fix dataclasses to support __future__ "annotations" mode (#9518) --- Lib/dataclasses.py | 87 +++++++++++-------- Lib/test/dataclass_textanno.py | 12 +++ Lib/test/test_dataclasses.py | 12 +++ .../2018-09-23-14-24-37.bpo-34776.1SrQe3.rst | 1 + 4 files changed, 78 insertions(+), 34 deletions(-) create mode 100644 Lib/test/dataclass_textanno.py create mode 100644 Misc/NEWS.d/next/Library/2018-09-23-14-24-37.bpo-34776.1SrQe3.rst diff --git a/Lib/dataclasses.py b/Lib/dataclasses.py index 91c1f6f80fc..00851c648a1 100644 --- a/Lib/dataclasses.py +++ b/Lib/dataclasses.py @@ -378,23 +378,24 @@ def _create_fn(name, args, body, *, globals=None, locals=None, # worries about external callers. if locals is None: locals = {} - # __builtins__ may be the "builtins" module or - # the value of its "__dict__", - # so make sure "__builtins__" is the module. - if globals is not None and '__builtins__' not in globals: - globals['__builtins__'] = builtins + if 'BUILTINS' not in locals: + locals['BUILTINS'] = builtins return_annotation = '' if return_type is not MISSING: locals['_return_type'] = return_type return_annotation = '->_return_type' args = ','.join(args) - body = '\n'.join(f' {b}' for b in body) + body = '\n'.join(f' {b}' for b in body) # Compute the text of the entire function. - txt = f'def {name}({args}){return_annotation}:\n{body}' + txt = f' def {name}({args}){return_annotation}:\n{body}' - exec(txt, globals, locals) - return locals[name] + local_vars = ', '.join(locals.keys()) + txt = f"def __create_fn__({local_vars}):\n{txt}\n return {name}" + + ns = {} + exec(txt, globals, ns) + return ns['__create_fn__'](**locals) def _field_assign(frozen, name, value, self_name): @@ -405,7 +406,7 @@ def _field_assign(frozen, name, value, self_name): # self_name is what "self" is called in this function: don't # hard-code "self", since that might be a field name. if frozen: - return f'__builtins__.object.__setattr__({self_name},{name!r},{value})' + return f'BUILTINS.object.__setattr__({self_name},{name!r},{value})' return f'{self_name}.{name}={value}' @@ -482,7 +483,7 @@ def _init_param(f): return f'{f.name}:_type_{f.name}{default}' -def _init_fn(fields, frozen, has_post_init, self_name): +def _init_fn(fields, frozen, has_post_init, self_name, globals): # fields contains both real fields and InitVar pseudo-fields. # Make sure we don't have fields without defaults following fields @@ -500,12 +501,15 @@ def _init_fn(fields, frozen, has_post_init, self_name): raise TypeError(f'non-default argument {f.name!r} ' 'follows default argument') - globals = {'MISSING': MISSING, - '_HAS_DEFAULT_FACTORY': _HAS_DEFAULT_FACTORY} + locals = {f'_type_{f.name}': f.type for f in fields} + locals.update({ + 'MISSING': MISSING, + '_HAS_DEFAULT_FACTORY': _HAS_DEFAULT_FACTORY, + }) body_lines = [] for f in fields: - line = _field_init(f, frozen, globals, self_name) + line = _field_init(f, frozen, locals, self_name) # line is None means that this field doesn't require # initialization (it's a pseudo-field). Just skip it. if line: @@ -521,7 +525,6 @@ def _init_fn(fields, frozen, has_post_init, self_name): if not body_lines: body_lines = ['pass'] - locals = {f'_type_{f.name}': f.type for f in fields} return _create_fn('__init__', [self_name] + [_init_param(f) for f in fields if f.init], body_lines, @@ -530,20 +533,19 @@ def _init_fn(fields, frozen, has_post_init, self_name): return_type=None) -def _repr_fn(fields): +def _repr_fn(fields, globals): fn = _create_fn('__repr__', ('self',), ['return self.__class__.__qualname__ + f"(' + ', '.join([f"{f.name}={{self.{f.name}!r}}" for f in fields]) + - ')"']) + ')"'], + globals=globals) return _recursive_repr(fn) -def _frozen_get_del_attr(cls, fields): - # XXX: globals is modified on the first call to _create_fn, then - # the modified version is used in the second call. Is this okay? - globals = {'cls': cls, +def _frozen_get_del_attr(cls, fields, globals): + locals = {'cls': cls, 'FrozenInstanceError': FrozenInstanceError} if fields: fields_str = '(' + ','.join(repr(f.name) for f in fields) + ',)' @@ -555,17 +557,19 @@ def _frozen_get_del_attr(cls, fields): (f'if type(self) is cls or name in {fields_str}:', ' raise FrozenInstanceError(f"cannot assign to field {name!r}")', f'super(cls, self).__setattr__(name, value)'), + locals=locals, globals=globals), _create_fn('__delattr__', ('self', 'name'), (f'if type(self) is cls or name in {fields_str}:', ' raise FrozenInstanceError(f"cannot delete field {name!r}")', f'super(cls, self).__delattr__(name)'), + locals=locals, globals=globals), ) -def _cmp_fn(name, op, self_tuple, other_tuple): +def _cmp_fn(name, op, self_tuple, other_tuple, globals): # Create a comparison function. If the fields in the object are # named 'x' and 'y', then self_tuple is the string # '(self.x,self.y)' and other_tuple is the string @@ -575,14 +579,16 @@ def _cmp_fn(name, op, self_tuple, other_tuple): ('self', 'other'), [ 'if other.__class__ is self.__class__:', f' return {self_tuple}{op}{other_tuple}', - 'return NotImplemented']) + 'return NotImplemented'], + globals=globals) -def _hash_fn(fields): +def _hash_fn(fields, globals): self_tuple = _tuple_str('self', fields) return _create_fn('__hash__', ('self',), - [f'return hash({self_tuple})']) + [f'return hash({self_tuple})'], + globals=globals) def _is_classvar(a_type, typing): @@ -755,14 +761,14 @@ def _set_new_attribute(cls, name, value): # take. The common case is to do nothing, so instead of providing a # function that is a no-op, use None to signify that. -def _hash_set_none(cls, fields): +def _hash_set_none(cls, fields, globals): return None -def _hash_add(cls, fields): +def _hash_add(cls, fields, globals): flds = [f for f in fields if (f.compare if f.hash is None else f.hash)] - return _hash_fn(flds) + return _hash_fn(flds, globals) -def _hash_exception(cls, fields): +def _hash_exception(cls, fields, globals): # Raise an exception. raise TypeError(f'Cannot overwrite attribute __hash__ ' f'in class {cls.__name__}') @@ -804,6 +810,16 @@ def _process_class(cls, init, repr, eq, order, unsafe_hash, frozen): # is defined by the base class, which is found first. fields = {} + if cls.__module__ in sys.modules: + globals = sys.modules[cls.__module__].__dict__ + else: + # Theoretically this can happen if someone writes + # a custom string to cls.__module__. In which case + # such dataclass won't be fully introspectable + # (w.r.t. typing.get_type_hints) but will still function + # correctly. + globals = {} + setattr(cls, _PARAMS, _DataclassParams(init, repr, eq, order, unsafe_hash, frozen)) @@ -913,6 +929,7 @@ def _process_class(cls, init, repr, eq, order, unsafe_hash, frozen): # if possible. '__dataclass_self__' if 'self' in fields else 'self', + globals, )) # Get the fields as a list, and include only real fields. This is @@ -921,7 +938,7 @@ def _process_class(cls, init, repr, eq, order, unsafe_hash, frozen): if repr: flds = [f for f in field_list if f.repr] - _set_new_attribute(cls, '__repr__', _repr_fn(flds)) + _set_new_attribute(cls, '__repr__', _repr_fn(flds, globals)) if eq: # Create _eq__ method. There's no need for a __ne__ method, @@ -931,7 +948,8 @@ def _process_class(cls, init, repr, eq, order, unsafe_hash, frozen): other_tuple = _tuple_str('other', flds) _set_new_attribute(cls, '__eq__', _cmp_fn('__eq__', '==', - self_tuple, other_tuple)) + self_tuple, other_tuple, + globals=globals)) if order: # Create and set the ordering methods. @@ -944,13 +962,14 @@ def _process_class(cls, init, repr, eq, order, unsafe_hash, frozen): ('__ge__', '>='), ]: if _set_new_attribute(cls, name, - _cmp_fn(name, op, self_tuple, other_tuple)): + _cmp_fn(name, op, self_tuple, other_tuple, + globals=globals)): raise TypeError(f'Cannot overwrite attribute {name} ' f'in class {cls.__name__}. Consider using ' 'functools.total_ordering') if frozen: - for fn in _frozen_get_del_attr(cls, field_list): + for fn in _frozen_get_del_attr(cls, field_list, globals): if _set_new_attribute(cls, fn.__name__, fn): raise TypeError(f'Cannot overwrite attribute {fn.__name__} ' f'in class {cls.__name__}') @@ -963,7 +982,7 @@ def _process_class(cls, init, repr, eq, order, unsafe_hash, frozen): if hash_action: # No need to call _set_new_attribute here, since by the time # we're here the overwriting is unconditional. - cls.__hash__ = hash_action(cls, field_list) + cls.__hash__ = hash_action(cls, field_list, globals) if not getattr(cls, '__doc__'): # Create a class doc-string. diff --git a/Lib/test/dataclass_textanno.py b/Lib/test/dataclass_textanno.py new file mode 100644 index 00000000000..3eb6c943d4c --- /dev/null +++ b/Lib/test/dataclass_textanno.py @@ -0,0 +1,12 @@ +from __future__ import annotations + +import dataclasses + + +class Foo: + pass + + +@dataclasses.dataclass +class Bar: + foo: Foo diff --git a/Lib/test/test_dataclasses.py b/Lib/test/test_dataclasses.py index 238335e7d9e..8f9fb2ce8c1 100644 --- a/Lib/test/test_dataclasses.py +++ b/Lib/test/test_dataclasses.py @@ -10,6 +10,7 @@ import builtins import unittest from unittest.mock import Mock from typing import ClassVar, Any, List, Union, Tuple, Dict, Generic, TypeVar, Optional +from typing import get_type_hints from collections import deque, OrderedDict, namedtuple from functools import total_ordering @@ -2926,6 +2927,17 @@ class TestStringAnnotations(unittest.TestCase): # won't exist on the instance. self.assertNotIn('not_iv4', c.__dict__) + def test_text_annotations(self): + from test import dataclass_textanno + + self.assertEqual( + get_type_hints(dataclass_textanno.Bar), + {'foo': dataclass_textanno.Foo}) + self.assertEqual( + get_type_hints(dataclass_textanno.Bar.__init__), + {'foo': dataclass_textanno.Foo, + 'return': type(None)}) + class TestMakeDataclass(unittest.TestCase): def test_simple(self): diff --git a/Misc/NEWS.d/next/Library/2018-09-23-14-24-37.bpo-34776.1SrQe3.rst b/Misc/NEWS.d/next/Library/2018-09-23-14-24-37.bpo-34776.1SrQe3.rst new file mode 100644 index 00000000000..815a4876e0b --- /dev/null +++ b/Misc/NEWS.d/next/Library/2018-09-23-14-24-37.bpo-34776.1SrQe3.rst @@ -0,0 +1 @@ +Fix dataclasses to support forward references in type annotations From a1a99b4bb7cbe2dbc55a1d92c3c509b4466d3c3b Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Mon, 9 Dec 2019 17:34:02 +0100 Subject: [PATCH 105/115] bpo-20443: No longer make sys.argv[0] absolute for script (GH-17534) In Python 3.9.0a1, sys.argv[0] was made an asolute path if a filename was specified on the command line. Revert this change, since most users expect sys.argv to be unmodified. --- Lib/test/test_cmd_line_script.py | 5 +++-- Lib/test/test_embed.py | 5 ++--- .../2019-12-09-17-05-53.bpo-20443.8OyT5P.rst | 3 +++ Python/initconfig.c | 4 ---- 4 files changed, 8 insertions(+), 9 deletions(-) create mode 100644 Misc/NEWS.d/next/Core and Builtins/2019-12-09-17-05-53.bpo-20443.8OyT5P.rst diff --git a/Lib/test/test_cmd_line_script.py b/Lib/test/test_cmd_line_script.py index 2ac926deac4..adfb8ce5ed2 100644 --- a/Lib/test/test_cmd_line_script.py +++ b/Lib/test/test_cmd_line_script.py @@ -223,12 +223,13 @@ class CmdLineTest(unittest.TestCase): def test_script_abspath(self): # pass the script using the relative path, expect the absolute path - # in __file__ and sys.argv[0] + # in __file__ with support.temp_cwd() as script_dir: self.assertTrue(os.path.isabs(script_dir), script_dir) script_name = _make_test_script(script_dir, 'script') - self._check_script(os.path.basename(script_name), script_name, script_name, + relative_name = os.path.basename(script_name) + self._check_script(relative_name, script_name, relative_name, script_dir, None, importlib.machinery.SourceFileLoader) diff --git a/Lib/test/test_embed.py b/Lib/test/test_embed.py index b87863a372a..60f7f7a93ea 100644 --- a/Lib/test/test_embed.py +++ b/Lib/test/test_embed.py @@ -858,10 +858,9 @@ class InitConfigTests(EmbeddingTestsMixin, unittest.TestCase): preconfig = { 'allocator': PYMEM_ALLOCATOR_DEBUG, } - script_abspath = os.path.abspath('script.py') config = { - 'argv': [script_abspath], - 'run_filename': script_abspath, + 'argv': ['script.py'], + 'run_filename': os.path.abspath('script.py'), 'dev_mode': 1, 'faulthandler': 1, 'warnoptions': ['default'], diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-12-09-17-05-53.bpo-20443.8OyT5P.rst b/Misc/NEWS.d/next/Core and Builtins/2019-12-09-17-05-53.bpo-20443.8OyT5P.rst new file mode 100644 index 00000000000..d3855f293b9 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2019-12-09-17-05-53.bpo-20443.8OyT5P.rst @@ -0,0 +1,3 @@ +In Python 3.9.0a1, sys.argv[0] was made an asolute path if a filename was +specified on the command line. Revert this change, since most users expect +sys.argv to be unmodified. diff --git a/Python/initconfig.c b/Python/initconfig.c index caa9bf5f568..74c9ca007ed 100644 --- a/Python/initconfig.c +++ b/Python/initconfig.c @@ -2198,10 +2198,6 @@ config_update_argv(PyConfig *config, Py_ssize_t opt_index) /* Force sys.argv[0] = '-m'*/ arg0 = L"-m"; } - else if (config->run_filename != NULL) { - /* run_filename is converted to an absolute path: update argv */ - arg0 = config->run_filename; - } if (arg0 != NULL) { arg0 = _PyMem_RawWcsdup(arg0); From e89e159b18cc9f32a0a4a818d080eb6a63d888a7 Mon Sep 17 00:00:00 2001 From: Steve Dower Date: Mon, 9 Dec 2019 08:43:13 -0800 Subject: [PATCH 106/115] Fix APPX registry key generation (GH-17489) --- PC/layout/support/appxmanifest.py | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/PC/layout/support/appxmanifest.py b/PC/layout/support/appxmanifest.py index 9e008f793cf..9a7439d0271 100644 --- a/PC/layout/support/appxmanifest.py +++ b/PC/layout/support/appxmanifest.py @@ -339,7 +339,17 @@ def _get_registry_entries(ns, root="", d=None): for key, value in d.items(): if key == "_condition": continue - elif isinstance(value, dict): + if value is SPECIAL_LOOKUP: + if key == "SysArchitecture": + value = { + "win32": "32bit", + "amd64": "64bit", + "arm32": "32bit", + "arm64": "64bit", + }[ns.arch] + else: + raise ValueError(f"Key '{key}' unhandled for special lookup") + if isinstance(value, dict): cond = value.get("_condition") if cond and not cond(ns): continue @@ -349,16 +359,6 @@ def _get_registry_entries(ns, root="", d=None): if len(fullkey.parts) > 1: yield str(fullkey), None, None yield from _get_registry_entries(ns, fullkey, value) - elif value is SPECIAL_LOOKUP: - if key == "SysArchitecture": - return { - "win32": "32bit", - "amd64": "64bit", - "arm32": "32bit", - "arm64": "64bit", - }[ns.arch] - else: - raise ValueError(f"Key '{key}' unhandled for special lookup") elif len(r.parts) > 1: yield str(r), key, value From c18b805ac6a2d22176240ca93982fa1fb6559ec7 Mon Sep 17 00:00:00 2001 From: Tim Gates Date: Tue, 10 Dec 2019 04:42:17 +1100 Subject: [PATCH 107/115] bpo-39002: Fix simple typo: tranlation -> translation (GH-17517) --- Lib/test/test_statistics.py | 4 ++-- Misc/ACKS | 1 + .../Documentation/2019-12-09-10-12-00.bpo-39002.AfgvfO.rst | 1 + 3 files changed, 4 insertions(+), 2 deletions(-) create mode 100644 Misc/NEWS.d/next/Documentation/2019-12-09-10-12-00.bpo-39002.AfgvfO.rst diff --git a/Lib/test/test_statistics.py b/Lib/test/test_statistics.py index bebd9b5d6f5..a9a427bc8d9 100644 --- a/Lib/test/test_statistics.py +++ b/Lib/test/test_statistics.py @@ -2192,7 +2192,7 @@ class TestQuantiles(unittest.TestCase): quantiles(padded_data, n=n, method='inclusive'), (n, data), ) - # Invariant under tranlation and scaling + # Invariant under translation and scaling def f(x): return 3.5 * x - 1234.675 exp = list(map(f, expected)) @@ -2232,7 +2232,7 @@ class TestQuantiles(unittest.TestCase): result = quantiles(map(datatype, data), n=n, method="inclusive") self.assertTrue(all(type(x) == datatype) for x in result) self.assertEqual(result, list(map(datatype, expected))) - # Invariant under tranlation and scaling + # Invariant under translation and scaling def f(x): return 3.5 * x - 1234.675 exp = list(map(f, expected)) diff --git a/Misc/ACKS b/Misc/ACKS index 2286f7b5017..253e2f6133d 100644 --- a/Misc/ACKS +++ b/Misc/ACKS @@ -1900,3 +1900,4 @@ Robert Leenders Tim Hopper Dan Lidral-Porter Ngalim Siregar +Tim Gates diff --git a/Misc/NEWS.d/next/Documentation/2019-12-09-10-12-00.bpo-39002.AfgvfO.rst b/Misc/NEWS.d/next/Documentation/2019-12-09-10-12-00.bpo-39002.AfgvfO.rst new file mode 100644 index 00000000000..a6dfa22eb7a --- /dev/null +++ b/Misc/NEWS.d/next/Documentation/2019-12-09-10-12-00.bpo-39002.AfgvfO.rst @@ -0,0 +1 @@ +Fix simple typo in Lib/test/test_statistics.py. From ac229116a34a679511c20bfeca167cc6a9df9807 Mon Sep 17 00:00:00 2001 From: Pablo Galindo Date: Mon, 9 Dec 2019 17:57:50 +0000 Subject: [PATCH 108/115] bpo-39003: Make sure all test are the same when using -R in test_unparse (GH-17537) --- Lib/test/test_unparse.py | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/Lib/test/test_unparse.py b/Lib/test/test_unparse.py index 9197c8a4a9e..96110260f55 100644 --- a/Lib/test/test_unparse.py +++ b/Lib/test/test_unparse.py @@ -288,15 +288,17 @@ class DirectoryTestCase(ASTTestCase): test_directories = (lib_dir, lib_dir / "test") skip_files = {"test_fstring.py"} - @functools.cached_property - def files_to_test(self): - # bpo-31174: Use cached_property to store the names sample - # to always test the same files. It prevents false alarms - # when hunting reference leaks. + _files_to_test = None + + @classmethod + def files_to_test(cls): + + if cls._files_to_test is not None: + return cls._files_to_test items = [ item.resolve() - for directory in self.test_directories + for directory in cls.test_directories for item in directory.glob("*.py") if not item.name.startswith("bad") ] @@ -304,10 +306,15 @@ class DirectoryTestCase(ASTTestCase): # Test limited subset of files unless the 'cpu' resource is specified. if not test.support.is_resource_enabled("cpu"): items = random.sample(items, 10) + + # bpo-31174: Store the names sample to always test the same files. + # It prevents false alarms when hunting reference leaks. + cls._files_to_test = items + return items def test_files(self): - for item in self.files_to_test: + for item in self.files_to_test(): if test.support.verbose: print(f"Testing {item.absolute()}") From b8cbe74c3498c617f0e73fd0cdc5c07f2c532092 Mon Sep 17 00:00:00 2001 From: Steve Dower Date: Mon, 9 Dec 2019 11:05:39 -0800 Subject: [PATCH 109/115] bpo-39008: Require Py_ssize_t for PySys_Audit formats rather than raise a deprecation warning (GH-17540) --- Doc/c-api/sys.rst | 8 ++++++++ .../2019-12-09-10-38-51.bpo-39008.Rrp6f1.rst | 3 +++ Python/sysmodule.c | 2 +- 3 files changed, 12 insertions(+), 1 deletion(-) create mode 100644 Misc/NEWS.d/next/Core and Builtins/2019-12-09-10-38-51.bpo-39008.Rrp6f1.rst diff --git a/Doc/c-api/sys.rst b/Doc/c-api/sys.rst index eccb8a67e82..c851ff66487 100644 --- a/Doc/c-api/sys.rst +++ b/Doc/c-api/sys.rst @@ -320,10 +320,18 @@ accessible to C code. They all work with the current interpreter thread's arguments to this function will be consumed, using it may cause reference leaks.) + Note that ``#`` format characters should always be treated as + ``Py_ssize_t``, regardless of whether ``PY_SSIZE_T_CLEAN`` was defined. + :func:`sys.audit` performs the same function from Python code. .. versionadded:: 3.8 + .. versionchanged:: 3.8.2 + + Require ``Py_ssize_t`` for ``#`` format characters. Previously, an + unavoidable deprecation warning was raised. + .. c:function:: int PySys_AddAuditHook(Py_AuditHookFunction hook, void *userData) diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-12-09-10-38-51.bpo-39008.Rrp6f1.rst b/Misc/NEWS.d/next/Core and Builtins/2019-12-09-10-38-51.bpo-39008.Rrp6f1.rst new file mode 100644 index 00000000000..35237ce2714 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2019-12-09-10-38-51.bpo-39008.Rrp6f1.rst @@ -0,0 +1,3 @@ +:c:func:`PySys_Audit` now requires ``Py_ssize_t`` to be used for size +arguments in the format string, regardless of whethen ``PY_SSIZE_T_CLEAN`` +was defined at include time. diff --git a/Python/sysmodule.c b/Python/sysmodule.c index b6bdf51bce3..9f866a2a3d2 100644 --- a/Python/sysmodule.c +++ b/Python/sysmodule.c @@ -181,7 +181,7 @@ PySys_Audit(const char *event, const char *argFormat, ...) if (argFormat && argFormat[0]) { va_list args; va_start(args, argFormat); - eventArgs = Py_VaBuildValue(argFormat, args); + eventArgs = _Py_VaBuildValue_SizeT(argFormat, args); va_end(args); if (eventArgs && !PyTuple_Check(eventArgs)) { PyObject *argTuple = PyTuple_Pack(1, eventArgs); From ee17e3735634c5fe15a43f897707de8011618627 Mon Sep 17 00:00:00 2001 From: Steve Dower Date: Mon, 9 Dec 2019 11:18:12 -0800 Subject: [PATCH 110/115] bpo-39007: Add auditing events to functions in winreg (GH-17541) Also allows winreg.CloseKey() to accept same types as other functions. --- Doc/library/winreg.rst | 49 ++++++ Lib/test/audit-tests.py | 23 +++ Lib/test/test_audit.py | 14 ++ .../2019-12-09-10-40-34.bpo-39007.vtarxo.rst | 1 + PC/winreg.c | 156 +++++++++++++++--- 5 files changed, 217 insertions(+), 26 deletions(-) create mode 100644 Misc/NEWS.d/next/Windows/2019-12-09-10-40-34.bpo-39007.vtarxo.rst diff --git a/Doc/library/winreg.rst b/Doc/library/winreg.rst index 5e810680b26..dccb7db27e9 100644 --- a/Doc/library/winreg.rst +++ b/Doc/library/winreg.rst @@ -53,6 +53,8 @@ This module offers the following functions: The return value is the handle of the opened key. If the function fails, an :exc:`OSError` exception is raised. + .. audit-event:: winreg.ConnectRegistry computer_name,key winreg.ConnectRegistry + .. versionchanged:: 3.3 See :ref:`above `. @@ -75,6 +77,10 @@ This module offers the following functions: The return value is the handle of the opened key. If the function fails, an :exc:`OSError` exception is raised. + .. audit-event:: winreg.CreateKey key,sub_key,access winreg.CreateKey + + .. audit-event:: winreg.OpenKey/result key winreg.CreateKey + .. versionchanged:: 3.3 See :ref:`above `. @@ -103,6 +109,10 @@ This module offers the following functions: The return value is the handle of the opened key. If the function fails, an :exc:`OSError` exception is raised. + .. audit-event:: winreg.CreateKey key,sub_key,access winreg.CreateKeyEx + + .. audit-event:: winreg.OpenKey/result key winreg.CreateKeyEx + .. versionadded:: 3.2 .. versionchanged:: 3.3 @@ -124,6 +134,8 @@ This module offers the following functions: If the method succeeds, the entire key, including all of its values, is removed. If the method fails, an :exc:`OSError` exception is raised. + .. audit-event:: winreg.DeleteKey key,sub_key,access winreg.DeleteKey + .. versionchanged:: 3.3 See :ref:`above `. @@ -158,6 +170,8 @@ This module offers the following functions: On unsupported Windows versions, :exc:`NotImplementedError` is raised. + .. audit-event:: winreg.DeleteKey key,sub_key,access winreg.DeleteKeyEx + .. versionadded:: 3.2 .. versionchanged:: 3.3 @@ -173,6 +187,8 @@ This module offers the following functions: *value* is a string that identifies the value to remove. + .. audit-event:: winreg.DeleteValue key,value winreg.DeleteValue + .. function:: EnumKey(key, index) @@ -187,6 +203,8 @@ This module offers the following functions: typically called repeatedly until an :exc:`OSError` exception is raised, indicating, no more values are available. + .. audit-event:: winreg.EnumKey key,index winreg.EnumKey + .. versionchanged:: 3.3 See :ref:`above `. @@ -220,6 +238,8 @@ This module offers the following functions: | | :meth:`SetValueEx`) | +-------+--------------------------------------------+ + .. audit-event:: winreg.EnumValue key,index winreg.EnumValue + .. versionchanged:: 3.3 See :ref:`above `. @@ -235,6 +255,8 @@ This module offers the following functions: >>> ExpandEnvironmentStrings('%windir%') 'C:\\Windows' + .. audit-event:: winreg.ExpandEnvironmentStrings str winreg.ExpandEnvironmentStrings + .. function:: FlushKey(key) @@ -279,6 +301,8 @@ This module offers the following functions: If *key* is a handle returned by :func:`ConnectRegistry`, then the path specified in *file_name* is relative to the remote computer. + .. audit-event:: winreg.LoadKey key,sub_key,file_name winreg.LoadKey + .. function:: OpenKey(key, sub_key, reserved=0, access=KEY_READ) OpenKeyEx(key, sub_key, reserved=0, access=KEY_READ) @@ -300,6 +324,10 @@ This module offers the following functions: If the function fails, :exc:`OSError` is raised. + .. audit-event:: winreg.OpenKey key,sub_key,access winreg.OpenKey + + .. audit-event:: winreg.OpenKey/result key winreg.OpenKey + .. versionchanged:: 3.2 Allow the use of named arguments. @@ -330,6 +358,8 @@ This module offers the following functions: | | nanoseconds since Jan 1, 1601. | +-------+---------------------------------------------+ + .. audit-event:: winreg.QueryInfoKey key winreg.QueryInfoKey + .. function:: QueryValue(key, sub_key) @@ -347,6 +377,8 @@ This module offers the following functions: underlying API call doesn't return the type, so always use :func:`QueryValueEx` if possible. + .. audit-event:: winreg.QueryValue key,sub_key,value_name winreg.QueryValue + .. function:: QueryValueEx(key, value_name) @@ -370,6 +402,8 @@ This module offers the following functions: | | :meth:`SetValueEx`) | +-------+-----------------------------------------+ + .. audit-event:: winreg.QueryValue key,sub_key,value_name winreg.QueryValueEx + .. function:: SaveKey(key, file_name) @@ -393,6 +427,8 @@ This module offers the following functions: This function passes ``NULL`` for *security_attributes* to the API. + .. audit-event:: winreg.SaveKey key,file_name winreg.SaveKey + .. function:: SetValue(key, sub_key, type, value) @@ -419,6 +455,8 @@ This module offers the following functions: The key identified by the *key* parameter must have been opened with :const:`KEY_SET_VALUE` access. + .. audit-event:: winreg.SetValue key,sub_key,type,value winreg.SetValue + .. function:: SetValueEx(key, value_name, reserved, type, value) @@ -447,6 +485,8 @@ This module offers the following functions: bytes) should be stored as files with the filenames stored in the configuration registry. This helps the registry perform efficiently. + .. audit-event:: winreg.SetValue key,sub_key,type,value winreg.SetValueEx + .. function:: DisableReflectionKey(key) @@ -463,6 +503,8 @@ This module offers the following functions: effect. Disabling reflection for a key does not affect reflection of any subkeys. + .. audit-event:: winreg.DisableReflectionKey key winreg.DisableReflectionKey + .. function:: EnableReflectionKey(key) @@ -476,6 +518,8 @@ This module offers the following functions: Restoring reflection for a key does not affect reflection of any subkeys. + .. audit-event:: winreg.EnableReflectionKey key winreg.EnableReflectionKey + .. function:: QueryReflectionKey(key) @@ -489,6 +533,8 @@ This module offers the following functions: Will generally raise :exc:`NotImplementedError` if executed on a 32-bit operating system. + .. audit-event:: winreg.QueryReflectionKey key winreg.QueryReflectionKey + .. _constants: @@ -741,6 +787,9 @@ integer handle, and also disconnect the Windows handle from the handle object. handle is not closed. You would call this function when you need the underlying Win32 handle to exist beyond the lifetime of the handle object. + .. audit-event:: winreg.PyHKEY.Detach key winreg.PyHKEY.Detach + + .. method:: PyHKEY.__enter__() PyHKEY.__exit__(\*exc_info) diff --git a/Lib/test/audit-tests.py b/Lib/test/audit-tests.py index ed08612c041..33f320992bb 100644 --- a/Lib/test/audit-tests.py +++ b/Lib/test/audit-tests.py @@ -304,6 +304,29 @@ def test_unraisablehook(): write_unraisable_exc(RuntimeError("nonfatal-error"), "for audit hook test", None) +def test_winreg(): + from winreg import OpenKey, EnumKey, CloseKey, HKEY_LOCAL_MACHINE + + def hook(event, args): + if not event.startswith("winreg."): + return + print(event, *args) + + sys.addaudithook(hook) + + k = OpenKey(HKEY_LOCAL_MACHINE, "Software") + EnumKey(k, 0) + try: + EnumKey(k, 10000) + except OSError: + pass + else: + raise RuntimeError("Expected EnumKey(HKLM, 10000) to fail") + + kv = k.Detach() + CloseKey(kv) + + if __name__ == "__main__": from test.libregrtest.setup import suppress_msvcrt_asserts diff --git a/Lib/test/test_audit.py b/Lib/test/test_audit.py index 31a08559273..73dd5c5b7db 100644 --- a/Lib/test/test_audit.py +++ b/Lib/test/test_audit.py @@ -104,6 +104,20 @@ class AuditTest(unittest.TestCase): "RuntimeError('nonfatal-error') Exception ignored for audit hook test", ) + def test_winreg(self): + support.import_module("winreg") + returncode, events, stderr = self.run_python("test_winreg") + if returncode: + self.fail(stderr) + + self.assertEqual(events[0][0], "winreg.OpenKey") + self.assertEqual(events[1][0], "winreg.OpenKey/result") + expected = events[1][2] + self.assertTrue(expected) + self.assertSequenceEqual(["winreg.EnumKey", " ", f"{expected} 0"], events[2]) + self.assertSequenceEqual(["winreg.EnumKey", " ", f"{expected} 10000"], events[3]) + self.assertSequenceEqual(["winreg.PyHKEY.Detach", " ", expected], events[4]) + if __name__ == "__main__": unittest.main() diff --git a/Misc/NEWS.d/next/Windows/2019-12-09-10-40-34.bpo-39007.vtarxo.rst b/Misc/NEWS.d/next/Windows/2019-12-09-10-40-34.bpo-39007.vtarxo.rst new file mode 100644 index 00000000000..f2f72f9dad3 --- /dev/null +++ b/Misc/NEWS.d/next/Windows/2019-12-09-10-40-34.bpo-39007.vtarxo.rst @@ -0,0 +1 @@ +Add auditing events to functions in :mod:`winreg`. diff --git a/PC/winreg.c b/PC/winreg.c index 72a7c380bee..5dff7deadf7 100644 --- a/PC/winreg.c +++ b/PC/winreg.c @@ -293,6 +293,9 @@ winreg_HKEYType_Detach_impl(PyHKEYObject *self) /*[clinic end generated code: output=dda5a9e1a01ae78f input=dd2cc09e6c6ba833]*/ { void* ret; + if (PySys_Audit("winreg.PyHKEY.Detach", "n", (Py_ssize_t)self->hkey) < 0) { + return NULL; + } ret = (void*)self->hkey; self->hkey = 0; return PyLong_FromVoidPtr(ret); @@ -397,15 +400,15 @@ BOOL PyHKEY_Close(PyObject *ob_handle) { LONG rc; - PyHKEYObject *key; + HKEY key; - if (!PyHKEY_Check(ob_handle)) { - PyErr_SetString(PyExc_TypeError, "bad operand type"); + if (!PyHKEY_AsHKEY(ob_handle, &key, TRUE)) { return FALSE; } - key = (PyHKEYObject *)ob_handle; - rc = key->hkey ? RegCloseKey((HKEY)key->hkey) : ERROR_SUCCESS; - key->hkey = 0; + if (PyHKEY_Check(ob_handle)) { + ((PyHKEYObject*)ob_handle)->hkey = 0; + } + rc = key ? RegCloseKey(key) : ERROR_SUCCESS; if (rc != ERROR_SUCCESS) PyErr_SetFromWindowsErrWithFunction(rc, "RegCloseKey"); return rc == ERROR_SUCCESS; @@ -841,6 +844,10 @@ winreg_ConnectRegistry_impl(PyObject *module, { HKEY retKey; long rc; + if (PySys_Audit("winreg.ConnectRegistry", "un", + computer_name, (Py_ssize_t)key) < 0) { + return NULL; + } Py_BEGIN_ALLOW_THREADS rc = RegConnectRegistryW(computer_name, key, &retKey); Py_END_ALLOW_THREADS @@ -878,11 +885,20 @@ winreg_CreateKey_impl(PyObject *module, HKEY key, const Py_UNICODE *sub_key) HKEY retKey; long rc; + if (PySys_Audit("winreg.CreateKey", "nun", + (Py_ssize_t)key, sub_key, + (Py_ssize_t)KEY_WRITE) < 0) { + return NULL; + } rc = RegCreateKeyW(key, sub_key, &retKey); if (rc != ERROR_SUCCESS) { PyErr_SetFromWindowsErrWithFunction(rc, "CreateKey"); return NULL; } + if (PySys_Audit("winreg.OpenKey/result", "n", + (Py_ssize_t)retKey) < 0) { + return NULL; + } return retKey; } @@ -919,12 +935,21 @@ winreg_CreateKeyEx_impl(PyObject *module, HKEY key, HKEY retKey; long rc; + if (PySys_Audit("winreg.CreateKey", "nun", + (Py_ssize_t)key, sub_key, + (Py_ssize_t)access) < 0) { + return NULL; + } rc = RegCreateKeyExW(key, sub_key, reserved, NULL, 0, access, NULL, &retKey, NULL); if (rc != ERROR_SUCCESS) { PyErr_SetFromWindowsErrWithFunction(rc, "CreateKeyEx"); return NULL; } + if (PySys_Audit("winreg.OpenKey/result", "n", + (Py_ssize_t)retKey) < 0) { + return NULL; + } return retKey; } @@ -951,6 +976,11 @@ winreg_DeleteKey_impl(PyObject *module, HKEY key, const Py_UNICODE *sub_key) /*[clinic end generated code: output=d2652a84f70e0862 input=b31d225b935e4211]*/ { long rc; + if (PySys_Audit("winreg.DeleteKey", "nun", + (Py_ssize_t)key, sub_key, + (Py_ssize_t)0) < 0) { + return NULL; + } rc = RegDeleteKeyW(key, sub_key ); if (rc != ERROR_SUCCESS) return PyErr_SetFromWindowsErrWithFunction(rc, "RegDeleteKey"); @@ -992,13 +1022,17 @@ winreg_DeleteKeyEx_impl(PyObject *module, HKEY key, RDKEFunc pfn = NULL; long rc; + if (PySys_Audit("winreg.DeleteKey", "nun", + (Py_ssize_t)key, sub_key, + (Py_ssize_t)access) < 0) { + return NULL; + } /* Only available on 64bit platforms, so we must load it dynamically. */ Py_BEGIN_ALLOW_THREADS hMod = GetModuleHandleW(L"advapi32.dll"); if (hMod) - pfn = (RDKEFunc)GetProcAddress(hMod, - "RegDeleteKeyExW"); + pfn = (RDKEFunc)GetProcAddress(hMod, "RegDeleteKeyExW"); Py_END_ALLOW_THREADS if (!pfn) { PyErr_SetString(PyExc_NotImplementedError, @@ -1031,6 +1065,10 @@ winreg_DeleteValue_impl(PyObject *module, HKEY key, const Py_UNICODE *value) /*[clinic end generated code: output=56fa9d21f3a54371 input=a78d3407a4197b21]*/ { long rc; + if (PySys_Audit("winreg.DeleteValue", "nu", + (Py_ssize_t)key, value) < 0) { + return NULL; + } Py_BEGIN_ALLOW_THREADS rc = RegDeleteValueW(key, value); Py_END_ALLOW_THREADS @@ -1063,6 +1101,10 @@ winreg_EnumKey_impl(PyObject *module, HKEY key, int index) long rc; PyObject *retStr; + if (PySys_Audit("winreg.EnumKey", "ni", + (Py_ssize_t)key, index) < 0) { + return NULL; + } /* The Windows docs claim that the max key name length is 255 * characters, plus a terminating nul character. However, * empirical testing demonstrates that it is possible to @@ -1121,6 +1163,10 @@ winreg_EnumValue_impl(PyObject *module, HKEY key, int index) PyObject *obData; PyObject *retVal; + if (PySys_Audit("winreg.EnumValue", "ni", + (Py_ssize_t)key, index) < 0) { + return NULL; + } if ((rc = RegQueryInfoKeyW(key, NULL, NULL, NULL, NULL, NULL, NULL, NULL, &retValueSize, &retDataSize, NULL, NULL)) @@ -1204,6 +1250,11 @@ winreg_ExpandEnvironmentStrings_impl(PyObject *module, DWORD rc; PyObject *o; + if (PySys_Audit("winreg.ExpandEnvironmentStrings", "u", + string) < 0) { + return NULL; + } + retValueSize = ExpandEnvironmentStringsW(string, retValue, 0); if (retValueSize == 0) { return PyErr_SetFromWindowsErrWithFunction(retValueSize, @@ -1295,6 +1346,10 @@ winreg_LoadKey_impl(PyObject *module, HKEY key, const Py_UNICODE *sub_key, { long rc; + if (PySys_Audit("winreg.LoadKey", "nuu", + (Py_ssize_t)key, sub_key, file_name) < 0) { + return NULL; + } Py_BEGIN_ALLOW_THREADS rc = RegLoadKeyW(key, sub_key, file_name ); Py_END_ALLOW_THREADS @@ -1330,6 +1385,11 @@ winreg_OpenKey_impl(PyObject *module, HKEY key, const Py_UNICODE *sub_key, HKEY retKey; long rc; + if (PySys_Audit("winreg.OpenKey", "nun", + (Py_ssize_t)key, sub_key, + (Py_ssize_t)access) < 0) { + return NULL; + } Py_BEGIN_ALLOW_THREADS rc = RegOpenKeyExW(key, sub_key, reserved, access, &retKey); Py_END_ALLOW_THREADS @@ -1337,6 +1397,10 @@ winreg_OpenKey_impl(PyObject *module, HKEY key, const Py_UNICODE *sub_key, PyErr_SetFromWindowsErrWithFunction(rc, "RegOpenKeyEx"); return NULL; } + if (PySys_Audit("winreg.OpenKey/result", "n", + (Py_ssize_t)retKey) < 0) { + return NULL; + } return retKey; } @@ -1377,25 +1441,30 @@ static PyObject * winreg_QueryInfoKey_impl(PyObject *module, HKEY key) /*[clinic end generated code: output=dc657b8356a4f438 input=c3593802390cde1f]*/ { - long rc; - DWORD nSubKeys, nValues; - FILETIME ft; - LARGE_INTEGER li; - PyObject *l; - PyObject *ret; + long rc; + DWORD nSubKeys, nValues; + FILETIME ft; + LARGE_INTEGER li; + PyObject *l; + PyObject *ret; - if ((rc = RegQueryInfoKey(key, NULL, NULL, 0, &nSubKeys, NULL, NULL, - &nValues, NULL, NULL, NULL, &ft)) - != ERROR_SUCCESS) - return PyErr_SetFromWindowsErrWithFunction(rc, "RegQueryInfoKey"); - li.LowPart = ft.dwLowDateTime; - li.HighPart = ft.dwHighDateTime; - l = PyLong_FromLongLong(li.QuadPart); - if (l == NULL) - return NULL; - ret = Py_BuildValue("iiO", nSubKeys, nValues, l); - Py_DECREF(l); - return ret; + if (PySys_Audit("winreg.QueryInfoKey", "n", (Py_ssize_t)key) < 0) { + return NULL; + } + if ((rc = RegQueryInfoKey(key, NULL, NULL, 0, &nSubKeys, NULL, NULL, + &nValues, NULL, NULL, NULL, &ft)) + != ERROR_SUCCESS) { + return PyErr_SetFromWindowsErrWithFunction(rc, "RegQueryInfoKey"); + } + li.LowPart = ft.dwLowDateTime; + li.HighPart = ft.dwHighDateTime; + l = PyLong_FromLongLong(li.QuadPart); + if (l == NULL) { + return NULL; + } + ret = Py_BuildValue("iiO", nSubKeys, nValues, l); + Py_DECREF(l); + return ret; } /*[clinic input] @@ -1430,6 +1499,10 @@ winreg_QueryValue_impl(PyObject *module, HKEY key, const Py_UNICODE *sub_key) DWORD retSize = 0; wchar_t *tmp; + if (PySys_Audit("winreg.QueryValue", "nuu", + (Py_ssize_t)key, sub_key, NULL) < 0) { + return NULL; + } rc = RegQueryValueW(key, sub_key, NULL, &retSize); if (rc == ERROR_MORE_DATA) retSize = 256; @@ -1497,6 +1570,10 @@ winreg_QueryValueEx_impl(PyObject *module, HKEY key, const Py_UNICODE *name) PyObject *obData; PyObject *result; + if (PySys_Audit("winreg.QueryValue", "nuu", + (Py_ssize_t)key, NULL, name) < 0) { + return NULL; + } rc = RegQueryValueExW(key, name, NULL, NULL, NULL, &bufSize); if (rc == ERROR_MORE_DATA) bufSize = 256; @@ -1570,6 +1647,10 @@ winreg_SaveKey_impl(PyObject *module, HKEY key, const Py_UNICODE *file_name) if (!PyWinObject_AsSECURITY_ATTRIBUTES(obSA, &pSA, TRUE)) return NULL; */ + if (PySys_Audit("winreg.SaveKey", "nu", + (Py_ssize_t)key, file_name) < 0) { + return NULL; + } Py_BEGIN_ALLOW_THREADS rc = RegSaveKeyW(key, file_name, pSA ); Py_END_ALLOW_THREADS @@ -1622,6 +1703,12 @@ winreg_SetValue_impl(PyObject *module, HKEY key, const Py_UNICODE *sub_key, return NULL; } + if (PySys_Audit("winreg.SetValue", "nunu#", + (Py_ssize_t)key, sub_key, (Py_ssize_t)type, + value, value_length) < 0) { + return NULL; + } + Py_BEGIN_ALLOW_THREADS rc = RegSetValueW(key, sub_key, REG_SZ, value, (DWORD)(value_length + 1)); Py_END_ALLOW_THREADS @@ -1692,6 +1779,11 @@ winreg_SetValueEx_impl(PyObject *module, HKEY key, "Could not convert the data to the specified type."); return NULL; } + if (PySys_Audit("winreg.SetValue", "nunO", + (Py_ssize_t)key, value_name, (Py_ssize_t)type, + value) < 0) { + return NULL; + } Py_BEGIN_ALLOW_THREADS rc = RegSetValueExW(key, value_name, 0, type, data, len); Py_END_ALLOW_THREADS @@ -1727,6 +1819,10 @@ winreg_DisableReflectionKey_impl(PyObject *module, HKEY key) RDRKFunc pfn = NULL; LONG rc; + if (PySys_Audit("winreg.DisableReflectionKey", "n", (Py_ssize_t)key) < 0) { + return NULL; + } + /* Only available on 64bit platforms, so we must load it dynamically.*/ Py_BEGIN_ALLOW_THREADS @@ -1772,6 +1868,10 @@ winreg_EnableReflectionKey_impl(PyObject *module, HKEY key) RERKFunc pfn = NULL; LONG rc; + if (PySys_Audit("winreg.EnableReflectionKey", "n", (Py_ssize_t)key) < 0) { + return NULL; + } + /* Only available on 64bit platforms, so we must load it dynamically.*/ Py_BEGIN_ALLOW_THREADS @@ -1816,6 +1916,10 @@ winreg_QueryReflectionKey_impl(PyObject *module, HKEY key) BOOL result; LONG rc; + if (PySys_Audit("winreg.QueryReflectionKey", "n", (Py_ssize_t)key) < 0) { + return NULL; + } + /* Only available on 64bit platforms, so we must load it dynamically.*/ Py_BEGIN_ALLOW_THREADS From a2ff283d519be11f50220885ddc4d029eb8cb0a0 Mon Sep 17 00:00:00 2001 From: Sergey Fedoseev Date: Tue, 10 Dec 2019 01:22:19 +0500 Subject: [PATCH 111/115] bpo-27961: Replace PY_ULLONG_MAX with ULLONG_MAX (GH-17539) --- Doc/c-api/long.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Doc/c-api/long.rst b/Doc/c-api/long.rst index 5a6d09ad1bd..c3601045920 100644 --- a/Doc/c-api/long.rst +++ b/Doc/c-api/long.rst @@ -304,7 +304,7 @@ distinguished from a number. Use :c:func:`PyErr_Occurred` to disambiguate. it to a :c:type:`PyLongObject`. If the value of *obj* is out of range for an :c:type:`unsigned long long`, - return the reduction of that value modulo ``PY_ULLONG_MAX + 1``. + return the reduction of that value modulo ``ULLONG_MAX + 1``. Returns ``(unsigned long long)-1`` on error. Use :c:func:`PyErr_Occurred` to disambiguate. From 2ad7651c00c9b58b2b8b9e3687c82c203ece576c Mon Sep 17 00:00:00 2001 From: Tim Gates Date: Tue, 10 Dec 2019 09:16:01 +1100 Subject: [PATCH 112/115] bpo-39009: Fix typo in test__locale (GH-17544) --- Lib/test/test__locale.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Lib/test/test__locale.py b/Lib/test/test__locale.py index ab4e2479618..cda0ee91b70 100644 --- a/Lib/test/test__locale.py +++ b/Lib/test/test__locale.py @@ -30,7 +30,7 @@ def setUpModule(): global candidate_locales # Issue #13441: Skip some locales (e.g. cs_CZ and hu_HU) on Solaris to # workaround a mbstowcs() bug. For example, on Solaris, the hu_HU locale uses - # the locale encoding ISO-8859-2, the thousauds separator is b'\xA0' and it is + # the locale encoding ISO-8859-2, the thousands separator is b'\xA0' and it is # decoded as U+30000020 (an invalid character) by mbstowcs(). if sys.platform == 'sunos5': old_locale = locale.setlocale(locale.LC_ALL) From 232689b40d8fcbbac27c8705607ff482ea5b46f8 Mon Sep 17 00:00:00 2001 From: JohnnyNajera <58344607+JohnnyNajera@users.noreply.github.com> Date: Tue, 10 Dec 2019 01:22:16 +0200 Subject: [PATCH 113/115] bpo-38944: Escape key now closes IDLE completion windows. (GH-17419) --- Lib/idlelib/NEWS.txt | 3 +++ Lib/idlelib/autocomplete_w.py | 2 +- Misc/NEWS.d/next/IDLE/2019-11-30-12-10-36.bpo-38944._3xjKG.rst | 1 + 3 files changed, 5 insertions(+), 1 deletion(-) create mode 100644 Misc/NEWS.d/next/IDLE/2019-11-30-12-10-36.bpo-38944._3xjKG.rst diff --git a/Lib/idlelib/NEWS.txt b/Lib/idlelib/NEWS.txt index 5eb77398d95..90e7d801535 100644 --- a/Lib/idlelib/NEWS.txt +++ b/Lib/idlelib/NEWS.txt @@ -3,6 +3,9 @@ Released on 2020-10-05? ====================================== +bpo-38944: Excape key now closes IDLE completion windows. Patch by +Johnny Najera. + bpo-38862: 'Strip Trailing Whitespace' on the Format menu removes extra newlines at the end of non-shell files. diff --git a/Lib/idlelib/autocomplete_w.py b/Lib/idlelib/autocomplete_w.py index 5035e067392..f20b6330997 100644 --- a/Lib/idlelib/autocomplete_w.py +++ b/Lib/idlelib/autocomplete_w.py @@ -17,7 +17,7 @@ KEYPRESS_VIRTUAL_EVENT_NAME = "<>" # before the default specific IDLE function KEYPRESS_SEQUENCES = ("", "", "", "", "", "", "", "", - "", "") + "", "", "") KEYRELEASE_VIRTUAL_EVENT_NAME = "<>" KEYRELEASE_SEQUENCE = "" LISTUPDATE_SEQUENCE = "" diff --git a/Misc/NEWS.d/next/IDLE/2019-11-30-12-10-36.bpo-38944._3xjKG.rst b/Misc/NEWS.d/next/IDLE/2019-11-30-12-10-36.bpo-38944._3xjKG.rst new file mode 100644 index 00000000000..38084fafd2f --- /dev/null +++ b/Misc/NEWS.d/next/IDLE/2019-11-30-12-10-36.bpo-38944._3xjKG.rst @@ -0,0 +1 @@ +Excape key now closes IDLE completion windows. Patch by Johnny Najera. From bbc4162bafe018f07bab0b624b37974cc33daad9 Mon Sep 17 00:00:00 2001 From: JohnnyNajera <58344607+JohnnyNajera@users.noreply.github.com> Date: Tue, 10 Dec 2019 02:30:01 +0200 Subject: [PATCH 114/115] bpo-38943: Fix IDLE autocomplete window not always appearing (GH-17416) This has happened on some versions of Ubuntu. --- Lib/idlelib/NEWS.txt | 3 +++ Lib/idlelib/autocomplete_w.py | 1 + Misc/NEWS.d/next/IDLE/2019-11-29-23-44-11.bpo-38943.8pUKKs.rst | 2 ++ 3 files changed, 6 insertions(+) create mode 100644 Misc/NEWS.d/next/IDLE/2019-11-29-23-44-11.bpo-38943.8pUKKs.rst diff --git a/Lib/idlelib/NEWS.txt b/Lib/idlelib/NEWS.txt index 90e7d801535..304cf6375f7 100644 --- a/Lib/idlelib/NEWS.txt +++ b/Lib/idlelib/NEWS.txt @@ -3,6 +3,9 @@ Released on 2020-10-05? ====================================== +bpo-38943: Fix autocomplete windows not always appearing on some +systems. Patch by Johnny Najera. + bpo-38944: Excape key now closes IDLE completion windows. Patch by Johnny Najera. diff --git a/Lib/idlelib/autocomplete_w.py b/Lib/idlelib/autocomplete_w.py index f20b6330997..0643c092c6e 100644 --- a/Lib/idlelib/autocomplete_w.py +++ b/Lib/idlelib/autocomplete_w.py @@ -257,6 +257,7 @@ class AutoCompleteWindow: # place acw above current line new_y -= acw_height acw.wm_geometry("+%d+%d" % (new_x, new_y)) + acw.update_idletasks() if platform.system().startswith('Windows'): # See issue 15786. When on Windows platform, Tk will misbehave diff --git a/Misc/NEWS.d/next/IDLE/2019-11-29-23-44-11.bpo-38943.8pUKKs.rst b/Misc/NEWS.d/next/IDLE/2019-11-29-23-44-11.bpo-38943.8pUKKs.rst new file mode 100644 index 00000000000..5c9323e2467 --- /dev/null +++ b/Misc/NEWS.d/next/IDLE/2019-11-29-23-44-11.bpo-38943.8pUKKs.rst @@ -0,0 +1,2 @@ +Fix IDLE autocomplete windows not always appearing on some systems. +Patch by Johnny Najera. From e9df88e8e9ce8e5a6be30dd1d06bc76b8e9f0fdc Mon Sep 17 00:00:00 2001 From: Pablo Galindo Date: Tue, 10 Dec 2019 00:37:47 +0000 Subject: [PATCH 115/115] Clean imports in test_unparse (GH-17545) --- Lib/test/test_unparse.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/Lib/test/test_unparse.py b/Lib/test/test_unparse.py index 96110260f55..45d819f175b 100644 --- a/Lib/test/test_unparse.py +++ b/Lib/test/test_unparse.py @@ -2,12 +2,10 @@ import unittest import test.support -import io import pathlib import random import tokenize import ast -import functools def read_pyfile(filename):