diff options
author | Benjamin Peterson <benjamin@python.org> | 2014-04-10 03:55:56 (GMT) |
---|---|---|
committer | Benjamin Peterson <benjamin@python.org> | 2014-04-10 03:55:56 (GMT) |
commit | d51374ed78a3e3145911a16cdf3b9b84b3ba7d15 (patch) | |
tree | 31f9086f20f5b8923604f41f1a4d139fa809aaed | |
parent | 2aad6ef77419887f5875ba942e9369b4bdd34a5e (diff) | |
download | cpython-d51374ed78a3e3145911a16cdf3b9b84b3ba7d15.zip cpython-d51374ed78a3e3145911a16cdf3b9b84b3ba7d15.tar.gz cpython-d51374ed78a3e3145911a16cdf3b9b84b3ba7d15.tar.bz2 |
PEP 465: a dedicated infix operator for matrix multiplication (closes #21176)
42 files changed, 800 insertions, 439 deletions
diff --git a/Doc/c-api/number.rst b/Doc/c-api/number.rst index 21951c3..9bcb649 100644 --- a/Doc/c-api/number.rst +++ b/Doc/c-api/number.rst @@ -30,6 +30,14 @@ Number Protocol the equivalent of the Python expression ``o1 * o2``. +.. c:function:: PyObject* PyNumber_MatrixMultiply(PyObject *o1, PyObject *o2) + + Returns the result of matrix multiplication on *o1* and *o2*, or *NULL* on + failure. This is the equivalent of the Python expression ``o1 @ o2``. + + .. versionadded:: 3.5 + + .. c:function:: PyObject* PyNumber_FloorDivide(PyObject *o1, PyObject *o2) Return the floor of *o1* divided by *o2*, or *NULL* on failure. This is @@ -146,6 +154,15 @@ Number Protocol the Python statement ``o1 *= o2``. +.. c:function:: PyObject* PyNumber_InPlaceMatrixMultiply(PyObject *o1, PyObject *o2) + + Returns the result of matrix multiplication on *o1* and *o2*, or *NULL* on + failure. The operation is done *in-place* when *o1* supports it. This is + the equivalent of the Python statement ``o1 @= o2``. + + .. versionadded:: 3.5 + + .. c:function:: PyObject* PyNumber_InPlaceFloorDivide(PyObject *o1, PyObject *o2) Returns the mathematical floor of dividing *o1* by *o2*, or *NULL* on failure. diff --git a/Doc/c-api/typeobj.rst b/Doc/c-api/typeobj.rst index 666de64..5d52315 100644 --- a/Doc/c-api/typeobj.rst +++ b/Doc/c-api/typeobj.rst @@ -1121,6 +1121,9 @@ Number Object Structures binaryfunc nb_inplace_true_divide; unaryfunc nb_index; + + binaryfunc nb_matrix_multiply; + binaryfunc nb_inplace_matrix_multiply; } PyNumberMethods; .. note:: diff --git a/Doc/library/dis.rst b/Doc/library/dis.rst index d86550f..fbabe35 100644 --- a/Doc/library/dis.rst +++ b/Doc/library/dis.rst @@ -364,6 +364,11 @@ result back on the stack. Implements ``TOS = TOS1 * TOS``. +.. opcode:: BINARY_MATRIX_MULTIPLY + + Implements ``TOS = TOS1 @ TOS``. + + .. opcode:: BINARY_FLOOR_DIVIDE Implements ``TOS = TOS1 // TOS``. @@ -436,6 +441,11 @@ the original TOS1. Implements in-place ``TOS = TOS1 * TOS``. +.. opcode:: INPLACE_MATRIX_MULTIPLY + + Implements in-place ``TOS = TOS1 @ TOS``. + + .. opcode:: INPLACE_FLOOR_DIVIDE Implements in-place ``TOS = TOS1 // TOS``. diff --git a/Doc/library/operator.rst b/Doc/library/operator.rst index 3bcbaa4..3654d13 100644 --- a/Doc/library/operator.rst +++ b/Doc/library/operator.rst @@ -138,6 +138,14 @@ The mathematical and bitwise operations are the most numerous: Return ``a * b``, for *a* and *b* numbers. +.. function:: matmul(a, b) + __matmul__(a, b) + + Return ``a @ b``. + + .. versionadded:: 3.5 + + .. function:: neg(obj) __neg__(obj) @@ -400,6 +408,8 @@ Python syntax and the functions in the :mod:`operator` module. +-----------------------+-------------------------+---------------------------------------+ | Multiplication | ``a * b`` | ``mul(a, b)`` | +-----------------------+-------------------------+---------------------------------------+ +| Matrix Multiplication | ``a @ b`` | ``matmul(a, b)`` | ++-----------------------+-------------------------+---------------------------------------+ | Negation (Arithmetic) | ``- a`` | ``neg(a)`` | +-----------------------+-------------------------+---------------------------------------+ | Negation (Logical) | ``not a`` | ``not_(a)`` | @@ -508,6 +518,14 @@ will perform the update, so no subsequent assignment is necessary: ``a = imul(a, b)`` is equivalent to ``a *= b``. +.. function:: imatmul(a, b) + __imatmul__(a, b) + + ``a = imatmul(a, b)`` is equivalent to ``a @= b``. + + .. versionadded:: 3.5 + + .. function:: ior(a, b) __ior__(a, b) diff --git a/Doc/library/token.rst b/Doc/library/token.rst index 4cd7098..88fb38b 100644 --- a/Doc/library/token.rst +++ b/Doc/library/token.rst @@ -93,6 +93,7 @@ The token constants are: DOUBLESLASH DOUBLESLASHEQUAL AT + ATEQUAL RARROW ELLIPSIS OP diff --git a/Doc/reference/datamodel.rst b/Doc/reference/datamodel.rst index ccaa4f7..825580a 100644 --- a/Doc/reference/datamodel.rst +++ b/Doc/reference/datamodel.rst @@ -1970,6 +1970,7 @@ left undefined. .. method:: object.__add__(self, other) object.__sub__(self, other) object.__mul__(self, other) + object.__matmul__(self, other) object.__truediv__(self, other) object.__floordiv__(self, other) object.__mod__(self, other) @@ -1986,15 +1987,16 @@ left undefined. builtin: pow builtin: pow - These methods are called to implement the binary arithmetic operations (``+``, - ``-``, ``*``, ``/``, ``//``, ``%``, :func:`divmod`, :func:`pow`, ``**``, ``<<``, - ``>>``, ``&``, ``^``, ``|``). For instance, to evaluate the expression - ``x + y``, where *x* is an instance of a class that has an :meth:`__add__` - method, ``x.__add__(y)`` is called. The :meth:`__divmod__` method should be the - equivalent to using :meth:`__floordiv__` and :meth:`__mod__`; it should not be - related to :meth:`__truediv__`. Note that :meth:`__pow__` should be defined - to accept an optional third argument if the ternary version of the built-in - :func:`pow` function is to be supported. + These methods are called to implement the binary arithmetic operations + (``+``, ``-``, ``*``, ``@``, ``/``, ``//``, ``%``, :func:`divmod`, + :func:`pow`, ``**``, ``<<``, ``>>``, ``&``, ``^``, ``|``). For instance, to + evaluate the expression ``x + y``, where *x* is an instance of a class that + has an :meth:`__add__` method, ``x.__add__(y)`` is called. The + :meth:`__divmod__` method should be the equivalent to using + :meth:`__floordiv__` and :meth:`__mod__`; it should not be related to + :meth:`__truediv__`. Note that :meth:`__pow__` should be defined to accept + an optional third argument if the ternary version of the built-in :func:`pow` + function is to be supported. If one of those methods does not support the operation with the supplied arguments, it should return ``NotImplemented``. @@ -2003,6 +2005,7 @@ left undefined. .. method:: object.__radd__(self, other) object.__rsub__(self, other) object.__rmul__(self, other) + object.__rmatmul__(self, other) object.__rtruediv__(self, other) object.__rfloordiv__(self, other) object.__rmod__(self, other) @@ -2018,14 +2021,14 @@ left undefined. builtin: divmod builtin: pow - These methods are called to implement the binary arithmetic operations (``+``, - ``-``, ``*``, ``/``, ``//``, ``%``, :func:`divmod`, :func:`pow`, ``**``, - ``<<``, ``>>``, ``&``, ``^``, ``|``) with reflected (swapped) operands. - These functions are only called if the left operand does not support the - corresponding operation and the operands are of different types. [#]_ For - instance, to evaluate the expression ``x - y``, where *y* is an instance of - a class that has an :meth:`__rsub__` method, ``y.__rsub__(x)`` is called if - ``x.__sub__(y)`` returns *NotImplemented*. + These methods are called to implement the binary arithmetic operations + (``+``, ``-``, ``*``, ``@``, ``/``, ``//``, ``%``, :func:`divmod`, + :func:`pow`, ``**``, ``<<``, ``>>``, ``&``, ``^``, ``|``) with reflected + (swapped) operands. These functions are only called if the left operand does + not support the corresponding operation and the operands are of different + types. [#]_ For instance, to evaluate the expression ``x - y``, where *y* is + an instance of a class that has an :meth:`__rsub__` method, ``y.__rsub__(x)`` + is called if ``x.__sub__(y)`` returns *NotImplemented*. .. index:: builtin: pow @@ -2043,6 +2046,7 @@ left undefined. .. method:: object.__iadd__(self, other) object.__isub__(self, other) object.__imul__(self, other) + object.__imatmul__(self, other) object.__itruediv__(self, other) object.__ifloordiv__(self, other) object.__imod__(self, other) @@ -2054,17 +2058,17 @@ left undefined. object.__ior__(self, other) These methods are called to implement the augmented arithmetic assignments - (``+=``, ``-=``, ``*=``, ``/=``, ``//=``, ``%=``, ``**=``, ``<<=``, ``>>=``, - ``&=``, ``^=``, ``|=``). These methods should attempt to do the operation - in-place (modifying *self*) and return the result (which could be, but does - not have to be, *self*). If a specific method is not defined, the augmented - assignment falls back to the normal methods. For instance, if *x* is an - instance of a class with an :meth:`__iadd__` method, ``x += y`` is equivalent - to ``x = x.__iadd__(y)`` . Otherwise, ``x.__add__(y)`` and ``y.__radd__(x)`` - are considered, as with the evaluation of ``x + y``. In certain situations, - augmented assignment can result in unexpected errors (see - :ref:`faq-augmented-assignment-tuple-error`), but this behavior is in - fact part of the data model. + (``+=``, ``-=``, ``*=``, ``@=``, ``/=``, ``//=``, ``%=``, ``**=``, ``<<=``, + ``>>=``, ``&=``, ``^=``, ``|=``). These methods should attempt to do the + operation in-place (modifying *self*) and return the result (which could be, + but does not have to be, *self*). If a specific method is not defined, the + augmented assignment falls back to the normal methods. For instance, if *x* + is an instance of a class with an :meth:`__iadd__` method, ``x += y`` is + equivalent to ``x = x.__iadd__(y)`` . Otherwise, ``x.__add__(y)`` and + ``y.__radd__(x)`` are considered, as with the evaluation of ``x + y``. In + certain situations, augmented assignment can result in unexpected errors (see + :ref:`faq-augmented-assignment-tuple-error`), but this behavior is in fact + part of the data model. .. method:: object.__neg__(self) diff --git a/Doc/reference/expressions.rst b/Doc/reference/expressions.rst index 06baba0..5b92a48 100644 --- a/Doc/reference/expressions.rst +++ b/Doc/reference/expressions.rst @@ -892,8 +892,9 @@ from the power operator, there are only two levels, one for multiplicative operators and one for additive operators: .. productionlist:: - m_expr: `u_expr` | `m_expr` "*" `u_expr` | `m_expr` "//" `u_expr` | `m_expr` "/" `u_expr` - : | `m_expr` "%" `u_expr` + m_expr: `u_expr` | `m_expr` "*" `u_expr` | `m_expr` "@" `m_expr` | + : `m_expr` "//" `u_expr`| `m_expr` "/" `u_expr` | + : `m_expr` "%" `u_expr` a_expr: `m_expr` | `a_expr` "+" `m_expr` | `a_expr` "-" `m_expr` .. index:: single: multiplication @@ -904,6 +905,13 @@ the other must be a sequence. In the former case, the numbers are converted to a common type and then multiplied together. In the latter case, sequence repetition is performed; a negative repetition factor yields an empty sequence. +.. index:: single: matrix multiplication + +The ``@`` (at) operator is intended to be used for matrix multiplication. No +builtin Python types implement this operator. + +.. versionadded:: 3.5 + .. index:: exception: ZeroDivisionError single: division @@ -1346,8 +1354,9 @@ groups from right to left). +-----------------------------------------------+-------------------------------------+ | ``+``, ``-`` | Addition and subtraction | +-----------------------------------------------+-------------------------------------+ -| ``*``, ``/``, ``//``, ``%`` | Multiplication, division, remainder | -| | [#]_ | +| ``*``, ``@``, ``/``, ``//``, ``%`` | Multiplication, matrix | +| | multiplication division, | +| | remainder [#]_ | +-----------------------------------------------+-------------------------------------+ | ``+x``, ``-x``, ``~x`` | Positive, negative, bitwise NOT | +-----------------------------------------------+-------------------------------------+ diff --git a/Doc/reference/simple_stmts.rst b/Doc/reference/simple_stmts.rst index 40bbc39..799c323 100644 --- a/Doc/reference/simple_stmts.rst +++ b/Doc/reference/simple_stmts.rst @@ -267,7 +267,7 @@ operation and an assignment statement: .. productionlist:: augmented_assignment_stmt: `augtarget` `augop` (`expression_list` | `yield_expression`) augtarget: `identifier` | `attributeref` | `subscription` | `slicing` - augop: "+=" | "-=" | "*=" | "/=" | "//=" | "%=" | "**=" + augop: "+=" | "-=" | "*=" | "@=" | "/=" | "//=" | "%=" | "**=" : | ">>=" | "<<=" | "&=" | "^=" | "|=" (See section :ref:`primaries` for the syntax definitions for the last three diff --git a/Grammar/Grammar b/Grammar/Grammar index d7aaffd..354fe60 100644 --- a/Grammar/Grammar +++ b/Grammar/Grammar @@ -40,7 +40,7 @@ small_stmt: (expr_stmt | del_stmt | pass_stmt | flow_stmt | expr_stmt: testlist_star_expr (augassign (yield_expr|testlist) | ('=' (yield_expr|testlist_star_expr))*) testlist_star_expr: (test|star_expr) (',' (test|star_expr))* [','] -augassign: ('+=' | '-=' | '*=' | '/=' | '%=' | '&=' | '|=' | '^=' | +augassign: ('+=' | '-=' | '*=' | '@=' | '/=' | '%=' | '&=' | '|=' | '^=' | '<<=' | '>>=' | '**=' | '//=') # For normal assignments, additional restrictions enforced by the interpreter del_stmt: 'del' exprlist @@ -97,7 +97,7 @@ xor_expr: and_expr ('^' and_expr)* and_expr: shift_expr ('&' shift_expr)* shift_expr: arith_expr (('<<'|'>>') arith_expr)* arith_expr: term (('+'|'-') term)* -term: factor (('*'|'/'|'%'|'//') factor)* +term: factor (('*'|'@'|'/'|'%'|'//') factor)* factor: ('+'|'-'|'~') factor | power power: atom trailer* ['**' factor] atom: ('(' [yield_expr|testlist_comp] ')' | diff --git a/Include/Python-ast.h b/Include/Python-ast.h index 67d677b..37e9a60 100644 --- a/Include/Python-ast.h +++ b/Include/Python-ast.h @@ -15,9 +15,9 @@ typedef struct _slice *slice_ty; typedef enum _boolop { And=1, Or=2 } boolop_ty; -typedef enum _operator { Add=1, Sub=2, Mult=3, Div=4, Mod=5, Pow=6, LShift=7, - RShift=8, BitOr=9, BitXor=10, BitAnd=11, FloorDiv=12 } - operator_ty; +typedef enum _operator { Add=1, Sub=2, Mult=3, MatMult=4, Div=5, Mod=6, Pow=7, + LShift=8, RShift=9, BitOr=10, BitXor=11, BitAnd=12, + FloorDiv=13 } operator_ty; typedef enum _unaryop { Invert=1, Not=2, UAdd=3, USub=4 } unaryop_ty; diff --git a/Include/abstract.h b/Include/abstract.h index 6e850b8..db70f21 100644 --- a/Include/abstract.h +++ b/Include/abstract.h @@ -658,6 +658,12 @@ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx*/ o1*o2. */ + PyAPI_FUNC(PyObject *) PyNumber_MatrixMultiply(PyObject *o1, PyObject *o2); + + /* + This is the equivalent of the Python expression: o1 @ o2. + */ + PyAPI_FUNC(PyObject *) PyNumber_FloorDivide(PyObject *o1, PyObject *o2); /* @@ -832,6 +838,12 @@ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx*/ o1 *= o2. */ + PyAPI_FUNC(PyObject *) PyNumber_InPlaceMatrixMultiply(PyObject *o1, PyObject *o2); + + /* + This is the equivalent of the Python expression: o1 @= o2. + */ + PyAPI_FUNC(PyObject *) PyNumber_InPlaceFloorDivide(PyObject *o1, PyObject *o2); diff --git a/Include/object.h b/Include/object.h index 7584d4c..f3c87eb 100644 --- a/Include/object.h +++ b/Include/object.h @@ -275,6 +275,9 @@ typedef struct { binaryfunc nb_inplace_true_divide; unaryfunc nb_index; + + binaryfunc nb_matrix_multiply; + binaryfunc nb_inplace_matrix_multiply; } PyNumberMethods; typedef struct { diff --git a/Include/opcode.h b/Include/opcode.h index 0936f2d..9e5f0bf 100644 --- a/Include/opcode.h +++ b/Include/opcode.h @@ -20,6 +20,9 @@ extern "C" { #define UNARY_INVERT 15 +#define BINARY_MATRIX_MULTIPLY 16 +#define INPLACE_MATRIX_MULTIPLY 17 + #define BINARY_POWER 19 #define BINARY_MULTIPLY 20 diff --git a/Include/token.h b/Include/token.h index 905022b..2b213ee 100644 --- a/Include/token.h +++ b/Include/token.h @@ -58,13 +58,14 @@ extern "C" { #define DOUBLESTAREQUAL 46 #define DOUBLESLASH 47 #define DOUBLESLASHEQUAL 48 -#define AT 49 -#define RARROW 50 -#define ELLIPSIS 51 +#define AT 49 +#define ATEQUAL 50 +#define RARROW 51 +#define ELLIPSIS 52 /* Don't forget to update the table _PyParser_TokenNames in tokenizer.c! */ -#define OP 52 -#define ERRORTOKEN 53 -#define N_TOKENS 54 +#define OP 53 +#define ERRORTOKEN 54 +#define N_TOKENS 55 /* Special definitions for cooperation with parser */ diff --git a/Include/typeslots.h b/Include/typeslots.h index ad3cdfb..da2e87c 100644 --- a/Include/typeslots.h +++ b/Include/typeslots.h @@ -74,3 +74,5 @@ #define Py_tp_members 72 #define Py_tp_getset 73 #define Py_tp_free 74 +#define Py_nb_matrix_multiply 75 +#define Py_nb_inplace_matrix_multiply 76 diff --git a/Lib/importlib/_bootstrap.py b/Lib/importlib/_bootstrap.py index beaa9b3..6b8c9ea 100644 --- a/Lib/importlib/_bootstrap.py +++ b/Lib/importlib/_bootstrap.py @@ -419,12 +419,13 @@ def _call_with_frames_removed(f, *args, **kwds): # Python 3.4a4 3290 (changes to __qualname__ computation) # Python 3.4a4 3300 (more changes to __qualname__ computation) # Python 3.4rc2 3310 (alter __qualname__ computation) +# Python 3.5a0 3320 (matrix multiplication operator) # # MAGIC must change whenever the bytecode emitted by the compiler may no # longer be understood by older implementations of the eval loop (usually # due to the addition of new opcodes). -MAGIC_NUMBER = (3310).to_bytes(2, 'little') + b'\r\n' +MAGIC_NUMBER = (3320).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 0bd1ee6..bfd3c4d 100644 --- a/Lib/opcode.py +++ b/Lib/opcode.py @@ -70,6 +70,9 @@ def_op('UNARY_NOT', 12) def_op('UNARY_INVERT', 15) +def_op('BINARY_MATRIX_MULTIPLY', 16) +def_op('INPLACE_MATRIX_MULTIPLY', 17) + def_op('BINARY_POWER', 19) def_op('BINARY_MULTIPLY', 20) diff --git a/Lib/operator.py b/Lib/operator.py index b60349f..856036d 100644 --- a/Lib/operator.py +++ b/Lib/operator.py @@ -105,6 +105,10 @@ def mul(a, b): "Same as a * b." return a * b +def matmul(a, b): + "Same as a @ b." + return a @ b + def neg(a): "Same as -a." return -a @@ -326,6 +330,11 @@ def imul(a, b): a *= b return a +def imatmul(a, b): + "Same as a @= b." + a @= b + return a + def ior(a, b): "Same as a |= b." a |= b @@ -383,6 +392,7 @@ __invert__ = invert __lshift__ = lshift __mod__ = mod __mul__ = mul +__matmul__ = matmul __neg__ = neg __or__ = or_ __pos__ = pos @@ -403,6 +413,7 @@ __ifloordiv__ = ifloordiv __ilshift__ = ilshift __imod__ = imod __imul__ = imul +__imatmul__ = imatmul __ior__ = ior __ipow__ = ipow __irshift__ = irshift diff --git a/Lib/test/test_augassign.py b/Lib/test/test_augassign.py index 9a59c58..19b7687 100644 --- a/Lib/test/test_augassign.py +++ b/Lib/test/test_augassign.py @@ -136,6 +136,14 @@ class AugAssignTest(unittest.TestCase): output.append("__imul__ called") return self + def __matmul__(self, val): + output.append("__matmul__ called") + def __rmatmul__(self, val): + output.append("__rmatmul__ called") + def __imatmul__(self, val): + output.append("__imatmul__ called") + return self + def __div__(self, val): output.append("__div__ called") def __rdiv__(self, val): @@ -233,6 +241,10 @@ class AugAssignTest(unittest.TestCase): 1 * x x *= 1 + x @ 1 + 1 @ x + x @= 1 + x / 1 1 / x x /= 1 @@ -279,6 +291,9 @@ __isub__ called __mul__ called __rmul__ called __imul__ called +__matmul__ called +__rmatmul__ called +__imatmul__ called __truediv__ called __rtruediv__ called __itruediv__ called diff --git a/Lib/test/test_capi.py b/Lib/test/test_capi.py index 408f12c..ba7f2c4 100644 --- a/Lib/test/test_capi.py +++ b/Lib/test/test_capi.py @@ -150,6 +150,23 @@ class CAPITest(unittest.TestCase): self.assertEqual(_testcapi.docstring_with_signature_and_extra_newlines.__text_signature__, "($module, /, parameter)") + def test_c_type_with_matrix_multiplication(self): + M = _testcapi.matmulType + m1 = M() + m2 = M() + self.assertEqual(m1 @ m2, ("matmul", m1, m2)) + self.assertEqual(m1 @ 42, ("matmul", m1, 42)) + self.assertEqual(42 @ m1, ("matmul", 42, m1)) + o = m1 + o @= m2 + self.assertEqual(o, ("imatmul", m1, m2)) + o = m1 + o @= 42 + self.assertEqual(o, ("imatmul", m1, 42)) + o = 42 + o @= m1 + self.assertEqual(o, ("matmul", 42, m1)) + @unittest.skipUnless(threading, 'Threading required for this test.') class TestPendingCalls(unittest.TestCase): diff --git a/Lib/test/test_descr.py b/Lib/test/test_descr.py index 8bb7d6a..e65edb2 100644 --- a/Lib/test/test_descr.py +++ b/Lib/test/test_descr.py @@ -4160,6 +4160,7 @@ order (MRO) for bases """ ('__add__', 'x + y', 'x += y'), ('__sub__', 'x - y', 'x -= y'), ('__mul__', 'x * y', 'x *= y'), + ('__matmul__', 'x @ y', 'x @= y'), ('__truediv__', 'operator.truediv(x, y)', None), ('__floordiv__', 'operator.floordiv(x, y)', None), ('__div__', 'x / y', 'x /= y'), diff --git a/Lib/test/test_grammar.py b/Lib/test/test_grammar.py index bba8820..a7bad2d 100644 --- a/Lib/test/test_grammar.py +++ b/Lib/test/test_grammar.py @@ -985,6 +985,20 @@ class GrammarTests(unittest.TestCase): self.assertFalse((False is 2) is 3) self.assertFalse(False is 2 is 3) + def test_matrix_mul(self): + # This is not intended to be a comprehensive test, rather just to be few + # samples of the @ operator in test_grammar.py. + class M: + def __matmul__(self, o): + return 4 + def __imatmul__(self, o): + self.other = o + return self + m = M() + self.assertEqual(m @ m, 4) + m @= 42 + self.assertEqual(m.other, 42) + def test_main(): run_unittest(TokenTests, GrammarTests) diff --git a/Lib/test/test_operator.py b/Lib/test/test_operator.py index ab58a98..1bd0391 100644 --- a/Lib/test/test_operator.py +++ b/Lib/test/test_operator.py @@ -203,6 +203,15 @@ class OperatorTestCase: self.assertRaises(TypeError, operator.mul, None, None) self.assertTrue(operator.mul(5, 2) == 10) + def test_matmul(self): + operator = self.module + self.assertRaises(TypeError, operator.matmul) + self.assertRaises(TypeError, operator.matmul, 42, 42) + class M: + def __matmul__(self, other): + return other - 1 + self.assertEqual(M() @ 42, 41) + def test_neg(self): operator = self.module self.assertRaises(TypeError, operator.neg) @@ -416,6 +425,7 @@ class OperatorTestCase: def __ilshift__ (self, other): return "ilshift" def __imod__ (self, other): return "imod" def __imul__ (self, other): return "imul" + def __imatmul__ (self, other): return "imatmul" def __ior__ (self, other): return "ior" def __ipow__ (self, other): return "ipow" def __irshift__ (self, other): return "irshift" @@ -430,6 +440,7 @@ class OperatorTestCase: self.assertEqual(operator.ilshift (c, 5), "ilshift") self.assertEqual(operator.imod (c, 5), "imod") self.assertEqual(operator.imul (c, 5), "imul") + self.assertEqual(operator.imatmul (c, 5), "imatmul") self.assertEqual(operator.ior (c, 5), "ior") self.assertEqual(operator.ipow (c, 5), "ipow") self.assertEqual(operator.irshift (c, 5), "irshift") diff --git a/Lib/test/test_sys.py b/Lib/test/test_sys.py index b82358e..a809fd7 100644 --- a/Lib/test/test_sys.py +++ b/Lib/test/test_sys.py @@ -952,7 +952,7 @@ class SizeofTest(unittest.TestCase): check(int, s) # (PyTypeObject + PyNumberMethods + PyMappingMethods + # PySequenceMethods + PyBufferProcs + 4P) - s = vsize('P2n15Pl4Pn9Pn11PIP') + struct.calcsize('34P 3P 10P 2P 4P') + s = vsize('P2n17Pl4Pn9Pn11PIP') + struct.calcsize('34P 3P 10P 2P 4P') # Separate block for PyDictKeysObject with 4 entries s += struct.calcsize("2nPn") + 4*struct.calcsize("n2P") # class diff --git a/Lib/test/test_tokenize.py b/Lib/test/test_tokenize.py index 38611a7..8f74a06 100644 --- a/Lib/test/test_tokenize.py +++ b/Lib/test/test_tokenize.py @@ -464,7 +464,7 @@ Additive Multiplicative - >>> dump_tokens("x = 1//1*1/5*12%0x12") + >>> dump_tokens("x = 1//1*1/5*12%0x12@42") ENCODING 'utf-8' (0, 0) (0, 0) NAME 'x' (1, 0) (1, 1) OP '=' (1, 2) (1, 3) @@ -479,6 +479,8 @@ Multiplicative NUMBER '12' (1, 13) (1, 15) OP '%' (1, 15) (1, 16) NUMBER '0x12' (1, 16) (1, 20) + OP '@' (1, 20) (1, 21) + NUMBER '42' (1, 21) (1, 23) Unary @@ -1154,6 +1156,7 @@ class TestTokenize(TestCase): self.assertExactTypeEqual('//', token.DOUBLESLASH) self.assertExactTypeEqual('//=', token.DOUBLESLASHEQUAL) self.assertExactTypeEqual('@', token.AT) + self.assertExactTypeEqual('@=', token.ATEQUAL) self.assertExactTypeEqual('a**2+b**2==c**2', NAME, token.DOUBLESTAR, NUMBER, diff --git a/Lib/token.py b/Lib/token.py index 7470c8c..bdfcec8 100644 --- a/Lib/token.py +++ b/Lib/token.py @@ -60,11 +60,12 @@ DOUBLESTAREQUAL = 46 DOUBLESLASH = 47 DOUBLESLASHEQUAL = 48 AT = 49 -RARROW = 50 -ELLIPSIS = 51 -OP = 52 -ERRORTOKEN = 53 -N_TOKENS = 54 +ATEQUAL = 50 +RARROW = 51 +ELLIPSIS = 52 +OP = 53 +ERRORTOKEN = 54 +N_TOKENS = 55 NT_OFFSET = 256 #--end constants-- diff --git a/Lib/tokenize.py b/Lib/tokenize.py index 98e9122..742abd1 100644 --- a/Lib/tokenize.py +++ b/Lib/tokenize.py @@ -91,7 +91,8 @@ EXACT_TOKEN_TYPES = { '**=': DOUBLESTAREQUAL, '//': DOUBLESLASH, '//=': DOUBLESLASHEQUAL, - '@': AT + '@': AT, + '@=': ATEQUAL, } class TokenInfo(collections.namedtuple('TokenInfo', 'type string start end line')): @@ -150,7 +151,7 @@ String = group(StringPrefix + r"'[^\n'\\]*(?:\\.[^\n'\\]*)*'", # recognized as two instances of =). Operator = group(r"\*\*=?", r">>=?", r"<<=?", r"!=", r"//=?", r"->", - r"[+\-*/%&|^=<>]=?", + r"[+\-*/%&@|^=<>]=?", r"~") Bracket = '[][(){}]' @@ -10,6 +10,8 @@ Release date: TBA Core and Builtins ----------------- +- PEP 465 and Issue #21176: Add the '@' operator for matrix multiplication. + - Issue #21134: Fix segfault when str is called on an uninitialized UnicodeEncodeError, UnicodeDecodeError, or UnicodeTranslateError object. diff --git a/Modules/_operator.c b/Modules/_operator.c index e8bef04..bcc0a0e 100644 --- a/Modules/_operator.c +++ b/Modules/_operator.c @@ -69,6 +69,7 @@ spami(truth , PyObject_IsTrue) spam2(op_add , PyNumber_Add) spam2(op_sub , PyNumber_Subtract) spam2(op_mul , PyNumber_Multiply) +spam2(op_matmul , PyNumber_MatrixMultiply) spam2(op_floordiv , PyNumber_FloorDivide) spam2(op_truediv , PyNumber_TrueDivide) spam2(op_mod , PyNumber_Remainder) @@ -86,6 +87,7 @@ spam2(op_or_ , PyNumber_Or) spam2(op_iadd , PyNumber_InPlaceAdd) spam2(op_isub , PyNumber_InPlaceSubtract) spam2(op_imul , PyNumber_InPlaceMultiply) +spam2(op_imatmul , PyNumber_InPlaceMatrixMultiply) spam2(op_ifloordiv , PyNumber_InPlaceFloorDivide) spam2(op_itruediv , PyNumber_InPlaceTrueDivide) spam2(op_imod , PyNumber_InPlaceRemainder) @@ -343,6 +345,7 @@ spam2o(index, "index(a) -- Same as a.__index__()") spam2(add, "add(a, b) -- Same as a + b.") spam2(sub, "sub(a, b) -- Same as a - b.") spam2(mul, "mul(a, b) -- Same as a * b.") +spam2(matmul, "matmul(a, b) -- Same as a @ b.") spam2(floordiv, "floordiv(a, b) -- Same as a // b.") spam2(truediv, "truediv(a, b) -- Same as a / b.") spam2(mod, "mod(a, b) -- Same as a % b.") @@ -360,6 +363,7 @@ spam2(or_, "or_(a, b) -- Same as a | b.") spam2(iadd, "a = iadd(a, b) -- Same as a += b.") spam2(isub, "a = isub(a, b) -- Same as a -= b.") spam2(imul, "a = imul(a, b) -- Same as a *= b.") +spam2(imatmul, "a = imatmul(a, b) -- Same as a @= b.") spam2(ifloordiv, "a = ifloordiv(a, b) -- Same as a //= b.") spam2(itruediv, "a = itruediv(a, b) -- Same as a /= b") spam2(imod, "a = imod(a, b) -- Same as a %= b.") diff --git a/Modules/_testcapimodule.c b/Modules/_testcapimodule.c index db2376d..291eee6 100644 --- a/Modules/_testcapimodule.c +++ b/Modules/_testcapimodule.c @@ -3298,6 +3298,109 @@ static PyTypeObject test_structmembersType = { }; +typedef struct { + PyObject_HEAD +} matmulObject; + +static PyObject * +matmulType_matmul(PyObject *self, PyObject *other) +{ + return Py_BuildValue("(sOO)", "matmul", self, other); +} + +static PyObject * +matmulType_imatmul(PyObject *self, PyObject *other) +{ + return Py_BuildValue("(sOO)", "imatmul", self, other); +} + +static void +matmulType_dealloc(PyObject *self) +{ + return Py_TYPE(self)->tp_free(self); +} + +static PyNumberMethods matmulType_as_number = { + 0, /* nb_add */ + 0, /* nb_subtract */ + 0, /* nb_multiply */ + 0, /* nb_remainde r*/ + 0, /* nb_divmod */ + 0, /* nb_power */ + 0, /* nb_negative */ + 0, /* tp_positive */ + 0, /* tp_absolute */ + 0, /* tp_bool */ + 0, /* nb_invert */ + 0, /* nb_lshift */ + 0, /* nb_rshift */ + 0, /* nb_and */ + 0, /* nb_xor */ + 0, /* nb_or */ + 0, /* nb_int */ + 0, /* nb_reserved */ + 0, /* nb_float */ + 0, /* nb_inplace_add */ + 0, /* nb_inplace_subtract */ + 0, /* nb_inplace_multiply */ + 0, /* nb_inplace_remainder */ + 0, /* nb_inplace_power */ + 0, /* nb_inplace_lshift */ + 0, /* nb_inplace_rshift */ + 0, /* nb_inplace_and */ + 0, /* nb_inplace_xor */ + 0, /* nb_inplace_or */ + 0, /* nb_floor_divide */ + 0, /* nb_true_divide */ + 0, /* nb_inplace_floor_divide */ + 0, /* nb_inplace_true_divide */ + 0, /* nb_index */ + matmulType_matmul, /* nb_matrix_multiply */ + matmulType_imatmul /* nb_matrix_inplace_multiply */ +}; + +static PyTypeObject matmulType = { + PyVarObject_HEAD_INIT(NULL, 0) + "matmulType", + sizeof(matmulObject), /* tp_basicsize */ + 0, /* tp_itemsize */ + matmulType_dealloc, /* destructor tp_dealloc */ + 0, /* tp_print */ + 0, /* tp_getattr */ + 0, /* tp_setattr */ + 0, /* tp_reserved */ + 0, /* tp_repr */ + &matmulType_as_number, /* tp_as_number */ + 0, /* tp_as_sequence */ + 0, /* tp_as_mapping */ + 0, /* tp_hash */ + 0, /* tp_call */ + 0, /* tp_str */ + PyObject_GenericGetAttr, /* tp_getattro */ + PyObject_GenericSetAttr, /* tp_setattro */ + 0, /* tp_as_buffer */ + 0, /* tp_flags */ + "C level type with matrix operations defined", + 0, /* traverseproc tp_traverse */ + 0, /* tp_clear */ + 0, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + 0, /* tp_iter */ + 0, /* tp_iternext */ + 0, /* tp_methods */ + 0, /* tp_members */ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + PyType_GenericNew, /* tp_new */ + PyObject_Del, /* tp_free */ +}; + static struct PyModuleDef _testcapimodule = { PyModuleDef_HEAD_INIT, @@ -3327,6 +3430,10 @@ PyInit__testcapi(void) /* don't use a name starting with "test", since we don't want test_capi to automatically call this */ PyModule_AddObject(m, "_test_structmembersType", (PyObject *)&test_structmembersType); + if (PyType_Ready(&matmulType) < 0) + return NULL; + Py_INCREF(&matmulType); + PyModule_AddObject(m, "matmulType", (PyObject *)&matmulType); PyModule_AddObject(m, "CHAR_MAX", PyLong_FromLong(CHAR_MAX)); PyModule_AddObject(m, "CHAR_MIN", PyLong_FromLong(CHAR_MIN)); diff --git a/Objects/abstract.c b/Objects/abstract.c index 38ddb0f..aeb8634 100644 --- a/Objects/abstract.c +++ b/Objects/abstract.c @@ -932,6 +932,12 @@ PyNumber_Multiply(PyObject *v, PyObject *w) } PyObject * +PyNumber_MatrixMultiply(PyObject *v, PyObject *w) +{ + return binary_op(v, w, NB_SLOT(nb_matrix_multiply), "@"); +} + +PyObject * PyNumber_FloorDivide(PyObject *v, PyObject *w) { return binary_op(v, w, NB_SLOT(nb_floor_divide), "//"); @@ -1012,6 +1018,7 @@ INPLACE_BINOP(PyNumber_InPlaceAnd, nb_inplace_and, nb_and, "&=") INPLACE_BINOP(PyNumber_InPlaceLshift, nb_inplace_lshift, nb_lshift, "<<=") INPLACE_BINOP(PyNumber_InPlaceRshift, nb_inplace_rshift, nb_rshift, ">>=") INPLACE_BINOP(PyNumber_InPlaceSubtract, nb_inplace_subtract, nb_subtract, "-=") +INPLACE_BINOP(PyNumber_InMatrixMultiply, nb_inplace_matrix_multiply, nb_matrix_multiply, "@=") PyObject * PyNumber_InPlaceFloorDivide(PyObject *v, PyObject *w) @@ -1078,6 +1085,13 @@ PyNumber_InPlaceMultiply(PyObject *v, PyObject *w) } PyObject * +PyNumber_InPlaceMatrixMultiply(PyObject *v, PyObject *w) +{ + return binary_iop(v, w, NB_SLOT(nb_inplace_matrix_multiply), + NB_SLOT(nb_matrix_multiply), "@="); +} + +PyObject * PyNumber_InPlaceRemainder(PyObject *v, PyObject *w) { return binary_iop(v, w, NB_SLOT(nb_inplace_remainder), diff --git a/Objects/typeobject.c b/Objects/typeobject.c index c21b397..6129523 100644 --- a/Objects/typeobject.c +++ b/Objects/typeobject.c @@ -4469,6 +4469,8 @@ inherit_slots(PyTypeObject *type, PyTypeObject *base) COPYNUM(nb_inplace_true_divide); COPYNUM(nb_inplace_floor_divide); COPYNUM(nb_index); + COPYNUM(nb_matrix_multiply); + COPYNUM(nb_inplace_matrix_multiply); } if (type->tp_as_sequence != NULL && base->tp_as_sequence != NULL) { @@ -5605,6 +5607,7 @@ slot_mp_ass_subscript(PyObject *self, PyObject *key, PyObject *value) SLOT1BIN(slot_nb_add, nb_add, "__add__", "__radd__") SLOT1BIN(slot_nb_subtract, nb_subtract, "__sub__", "__rsub__") SLOT1BIN(slot_nb_multiply, nb_multiply, "__mul__", "__rmul__") +SLOT1BIN(slot_nb_matrix_multiply, nb_matrix_multiply, "__matmul__", "__rmatmul__") SLOT1BIN(slot_nb_remainder, nb_remainder, "__mod__", "__rmod__") SLOT1BIN(slot_nb_divmod, nb_divmod, "__divmod__", "__rdivmod__") @@ -5698,6 +5701,7 @@ SLOT0(slot_nb_float, "__float__") SLOT1(slot_nb_inplace_add, "__iadd__", PyObject *, "O") SLOT1(slot_nb_inplace_subtract, "__isub__", PyObject *, "O") SLOT1(slot_nb_inplace_multiply, "__imul__", PyObject *, "O") +SLOT1(slot_nb_inplace_matrix_multiply, "__imatmul__", PyObject *, "O") SLOT1(slot_nb_inplace_remainder, "__imod__", PyObject *, "O") /* Can't use SLOT1 here, because nb_inplace_power is ternary */ static PyObject * @@ -6278,6 +6282,12 @@ static slotdef slotdefs[] = { "__index__($self, /)\n--\n\n" "Return self converted to an integer, if self is suitable" "for use as an index into a list."), + BINSLOT("__matmul__", nb_matrix_multiply, slot_nb_matrix_multiply, + "@"), + RBINSLOT("__rmatmul__", nb_matrix_multiply, slot_nb_matrix_multiply, + "@"), + IBSLOT("__imatmul__", nb_inplace_matrix_multiply, slot_nb_inplace_matrix_multiply, + wrap_binaryfunc, "@="), MPSLOT("__len__", mp_length, slot_mp_length, wrap_lenfunc, "__len__($self, /)\n--\n\nReturn len(self)."), MPSLOT("__getitem__", mp_subscript, slot_mp_subscript, diff --git a/Objects/typeslots.inc b/Objects/typeslots.inc index caa1e03..2ed99d8 100644 --- a/Objects/typeslots.inc +++ b/Objects/typeslots.inc @@ -73,3 +73,5 @@ offsetof(PyHeapTypeObject, ht_type.tp_traverse), offsetof(PyHeapTypeObject, ht_type.tp_members), offsetof(PyHeapTypeObject, ht_type.tp_getset), offsetof(PyHeapTypeObject, ht_type.tp_free), +offsetof(PyHeapTypeObject, as_number.nb_matrix_multiply), +offsetof(PyHeapTypeObject, as_number.nb_inplace_matrix_multiply), diff --git a/Parser/Python.asdl b/Parser/Python.asdl index debd89e..792cab7 100644 --- a/Parser/Python.asdl +++ b/Parser/Python.asdl @@ -91,7 +91,7 @@ module Python boolop = And | Or - operator = Add | Sub | Mult | Div | Mod | Pow | LShift + operator = Add | Sub | Mult | MatMult | Div | Mod | Pow | LShift | RShift | BitOr | BitXor | BitAnd | FloorDiv unaryop = Invert | Not | UAdd | USub diff --git a/Parser/tokenizer.c b/Parser/tokenizer.c index 7283058..6aaa4a9 100644 --- a/Parser/tokenizer.c +++ b/Parser/tokenizer.c @@ -98,6 +98,7 @@ const char *_PyParser_TokenNames[] = { "DOUBLESLASH", "DOUBLESLASHEQUAL", "AT", + "ATEQUAL", "RARROW", "ELLIPSIS", /* This table must match the #defines in token.h! */ @@ -1131,7 +1132,7 @@ PyToken_OneChar(int c) case '}': return RBRACE; case '^': return CIRCUMFLEX; case '~': return TILDE; - case '@': return AT; + case '@': return AT; default: return OP; } } @@ -1207,6 +1208,11 @@ PyToken_TwoChars(int c1, int c2) case '=': return CIRCUMFLEXEQUAL; } break; + case '@': + switch (c2) { + case '=': return ATEQUAL; + } + break; } return OP; } diff --git a/Python/Python-ast.c b/Python/Python-ast.c index 44fdafc..994e721 100644 --- a/Python/Python-ast.c +++ b/Python/Python-ast.c @@ -349,13 +349,14 @@ static PyTypeObject *And_type; static PyTypeObject *Or_type; static PyTypeObject *operator_type; static PyObject *Add_singleton, *Sub_singleton, *Mult_singleton, -*Div_singleton, *Mod_singleton, *Pow_singleton, *LShift_singleton, -*RShift_singleton, *BitOr_singleton, *BitXor_singleton, *BitAnd_singleton, -*FloorDiv_singleton; +*MatMult_singleton, *Div_singleton, *Mod_singleton, *Pow_singleton, +*LShift_singleton, *RShift_singleton, *BitOr_singleton, *BitXor_singleton, +*BitAnd_singleton, *FloorDiv_singleton; static PyObject* ast2obj_operator(operator_ty); static PyTypeObject *Add_type; static PyTypeObject *Sub_type; static PyTypeObject *Mult_type; +static PyTypeObject *MatMult_type; static PyTypeObject *Div_type; static PyTypeObject *Mod_type; static PyTypeObject *Pow_type; @@ -970,6 +971,10 @@ static int init_types(void) if (!Mult_type) return 0; Mult_singleton = PyType_GenericNew(Mult_type, NULL, NULL); if (!Mult_singleton) return 0; + MatMult_type = make_type("MatMult", operator_type, NULL, 0); + if (!MatMult_type) return 0; + MatMult_singleton = PyType_GenericNew(MatMult_type, NULL, NULL); + if (!MatMult_singleton) return 0; Div_type = make_type("Div", operator_type, NULL, 0); if (!Div_type) return 0; Div_singleton = PyType_GenericNew(Div_type, NULL, NULL); @@ -3232,6 +3237,9 @@ PyObject* ast2obj_operator(operator_ty o) case Mult: Py_INCREF(Mult_singleton); return Mult_singleton; + case MatMult: + Py_INCREF(MatMult_singleton); + return MatMult_singleton; case Div: Py_INCREF(Div_singleton); return Div_singleton; @@ -6175,6 +6183,14 @@ obj2ast_operator(PyObject* obj, operator_ty* out, PyArena* arena) *out = Mult; return 0; } + isinstance = PyObject_IsInstance(obj, (PyObject *)MatMult_type); + if (isinstance == -1) { + return 1; + } + if (isinstance) { + *out = MatMult; + return 0; + } isinstance = PyObject_IsInstance(obj, (PyObject *)Div_type); if (isinstance == -1) { return 1; @@ -6956,6 +6972,8 @@ PyInit__ast(void) if (PyDict_SetItemString(d, "Add", (PyObject*)Add_type) < 0) return NULL; if (PyDict_SetItemString(d, "Sub", (PyObject*)Sub_type) < 0) return NULL; if (PyDict_SetItemString(d, "Mult", (PyObject*)Mult_type) < 0) return NULL; + if (PyDict_SetItemString(d, "MatMult", (PyObject*)MatMult_type) < 0) return + NULL; if (PyDict_SetItemString(d, "Div", (PyObject*)Div_type) < 0) return NULL; if (PyDict_SetItemString(d, "Mod", (PyObject*)Mod_type) < 0) return NULL; if (PyDict_SetItemString(d, "Pow", (PyObject*)Pow_type) < 0) return NULL; diff --git a/Python/ast.c b/Python/ast.c index 5668755..d6bddf1 100644 --- a/Python/ast.c +++ b/Python/ast.c @@ -825,6 +825,8 @@ get_operator(const node *n) return Sub; case STAR: return Mult; + case AT: + return MatMult; case SLASH: return Div; case DOUBLESLASH: @@ -1030,6 +1032,8 @@ ast_for_augassign(struct compiling *c, const node *n) return Pow; else return Mult; + case '@': + return MatMult; default: PyErr_Format(PyExc_SystemError, "invalid augassign: %s", STR(n)); return (operator_ty)0; @@ -2266,7 +2270,7 @@ ast_for_expr(struct compiling *c, const node *n) and_expr: shift_expr ('&' shift_expr)* shift_expr: arith_expr (('<<'|'>>') arith_expr)* arith_expr: term (('+'|'-') term)* - term: factor (('*'|'/'|'%'|'//') factor)* + term: factor (('*'|'@'|'/'|'%'|'//') factor)* factor: ('+'|'-'|'~') factor | power power: atom trailer* ('**' factor)* */ @@ -2577,7 +2581,7 @@ ast_for_expr_stmt(struct compiling *c, const node *n) /* expr_stmt: testlist_star_expr (augassign (yield_expr|testlist) | ('=' (yield_expr|testlist))*) testlist_star_expr: (test|star_expr) (',' test|star_expr)* [','] - augassign: '+=' | '-=' | '*=' | '/=' | '%=' | '&=' | '|=' | '^=' + augassign: '+=' | '-=' | '*=' | '@=' | '/=' | '%=' | '&=' | '|=' | '^=' | '<<=' | '>>=' | '**=' | '//=' test: ... here starts the operator precendence dance */ diff --git a/Python/ceval.c b/Python/ceval.c index 5db88be..ab7afa9 100644 --- a/Python/ceval.c +++ b/Python/ceval.c @@ -1495,6 +1495,18 @@ PyEval_EvalFrameEx(PyFrameObject *f, int throwflag) DISPATCH(); } + TARGET(BINARY_MATRIX_MULTIPLY) { + PyObject *right = POP(); + PyObject *left = TOP(); + PyObject *res = PyNumber_MatrixMultiply(left, right); + Py_DECREF(left); + Py_DECREF(right); + SET_TOP(res); + if (res == NULL) + goto error; + DISPATCH(); + } + TARGET(BINARY_TRUE_DIVIDE) { PyObject *divisor = POP(); PyObject *dividend = TOP(); @@ -1685,6 +1697,18 @@ PyEval_EvalFrameEx(PyFrameObject *f, int throwflag) DISPATCH(); } + TARGET(INPLACE_MATRIX_MULTIPLY) { + PyObject *right = POP(); + PyObject *left = TOP(); + PyObject *res = PyNumber_InPlaceMatrixMultiply(left, right); + Py_DECREF(left); + Py_DECREF(right); + SET_TOP(res); + if (res == NULL) + goto error; + DISPATCH(); + } + TARGET(INPLACE_TRUE_DIVIDE) { PyObject *divisor = POP(); PyObject *dividend = TOP(); diff --git a/Python/compile.c b/Python/compile.c index 9978eb3..9d3646e 100644 --- a/Python/compile.c +++ b/Python/compile.c @@ -881,6 +881,7 @@ PyCompile_OpcodeStackEffect(int opcode, int oparg) case BINARY_POWER: case BINARY_MULTIPLY: + case BINARY_MATRIX_MULTIPLY: case BINARY_MODULO: case BINARY_ADD: case BINARY_SUBTRACT: @@ -895,6 +896,7 @@ PyCompile_OpcodeStackEffect(int opcode, int oparg) case INPLACE_ADD: case INPLACE_SUBTRACT: case INPLACE_MULTIPLY: + case INPLACE_MATRIX_MULTIPLY: case INPLACE_MODULO: return -1; case STORE_SUBSCR: @@ -2625,6 +2627,8 @@ binop(struct compiler *c, operator_ty op) return BINARY_SUBTRACT; case Mult: return BINARY_MULTIPLY; + case MatMult: + return BINARY_MATRIX_MULTIPLY; case Div: return BINARY_TRUE_DIVIDE; case Mod: @@ -2689,6 +2693,8 @@ inplace_binop(struct compiler *c, operator_ty op) return INPLACE_SUBTRACT; case Mult: return INPLACE_MULTIPLY; + case MatMult: + return INPLACE_MATRIX_MULTIPLY; case Div: return INPLACE_TRUE_DIVIDE; case Mod: diff --git a/Python/graminit.c b/Python/graminit.c index e04999b..9f79d59 100644 --- a/Python/graminit.c +++ b/Python/graminit.c @@ -476,7 +476,7 @@ static state states_16[3] = { {2, arcs_16_1}, {3, arcs_16_2}, }; -static arc arcs_17_0[12] = { +static arc arcs_17_0[13] = { {49, 1}, {50, 1}, {51, 1}, @@ -489,19 +489,20 @@ static arc arcs_17_0[12] = { {58, 1}, {59, 1}, {60, 1}, + {61, 1}, }; static arc arcs_17_1[1] = { {0, 1}, }; static state states_17[2] = { - {12, arcs_17_0}, + {13, arcs_17_0}, {1, arcs_17_1}, }; static arc arcs_18_0[1] = { - {61, 1}, + {62, 1}, }; static arc arcs_18_1[1] = { - {62, 2}, + {63, 2}, }; static arc arcs_18_2[1] = { {0, 2}, @@ -512,7 +513,7 @@ static state states_18[3] = { {1, arcs_18_2}, }; static arc arcs_19_0[1] = { - {63, 1}, + {64, 1}, }; static arc arcs_19_1[1] = { {0, 1}, @@ -522,11 +523,11 @@ static state states_19[2] = { {1, arcs_19_1}, }; static arc arcs_20_0[5] = { - {64, 1}, {65, 1}, {66, 1}, {67, 1}, {68, 1}, + {69, 1}, }; static arc arcs_20_1[1] = { {0, 1}, @@ -536,7 +537,7 @@ static state states_20[2] = { {1, arcs_20_1}, }; static arc arcs_21_0[1] = { - {69, 1}, + {70, 1}, }; static arc arcs_21_1[1] = { {0, 1}, @@ -546,7 +547,7 @@ static state states_21[2] = { {1, arcs_21_1}, }; static arc arcs_22_0[1] = { - {70, 1}, + {71, 1}, }; static arc arcs_22_1[1] = { {0, 1}, @@ -556,7 +557,7 @@ static state states_22[2] = { {1, arcs_22_1}, }; static arc arcs_23_0[1] = { - {71, 1}, + {72, 1}, }; static arc arcs_23_1[2] = { {9, 2}, @@ -581,14 +582,14 @@ static state states_24[2] = { {1, arcs_24_1}, }; static arc arcs_25_0[1] = { - {72, 1}, + {73, 1}, }; static arc arcs_25_1[2] = { {24, 2}, {0, 1}, }; static arc arcs_25_2[2] = { - {73, 3}, + {74, 3}, {0, 2}, }; static arc arcs_25_3[1] = { @@ -605,8 +606,8 @@ static state states_25[5] = { {1, arcs_25_4}, }; static arc arcs_26_0[2] = { - {74, 1}, {75, 1}, + {76, 1}, }; static arc arcs_26_1[1] = { {0, 1}, @@ -616,10 +617,10 @@ static state states_26[2] = { {1, arcs_26_1}, }; static arc arcs_27_0[1] = { - {76, 1}, + {77, 1}, }; static arc arcs_27_1[1] = { - {77, 2}, + {78, 2}, }; static arc arcs_27_2[1] = { {0, 2}, @@ -630,32 +631,32 @@ static state states_27[3] = { {1, arcs_27_2}, }; static arc arcs_28_0[1] = { - {73, 1}, + {74, 1}, }; static arc arcs_28_1[3] = { - {78, 2}, {79, 2}, + {80, 2}, {12, 3}, }; static arc arcs_28_2[4] = { - {78, 2}, {79, 2}, + {80, 2}, {12, 3}, - {76, 4}, + {77, 4}, }; static arc arcs_28_3[1] = { - {76, 4}, + {77, 4}, }; static arc arcs_28_4[3] = { {31, 5}, {13, 6}, - {80, 5}, + {81, 5}, }; static arc arcs_28_5[1] = { {0, 5}, }; static arc arcs_28_6[1] = { - {80, 7}, + {81, 7}, }; static arc arcs_28_7[1] = { {15, 5}, @@ -674,7 +675,7 @@ static arc arcs_29_0[1] = { {21, 1}, }; static arc arcs_29_1[2] = { - {82, 2}, + {83, 2}, {0, 1}, }; static arc arcs_29_2[1] = { @@ -693,7 +694,7 @@ static arc arcs_30_0[1] = { {12, 1}, }; static arc arcs_30_1[2] = { - {82, 2}, + {83, 2}, {0, 1}, }; static arc arcs_30_2[1] = { @@ -709,14 +710,14 @@ static state states_30[4] = { {1, arcs_30_3}, }; static arc arcs_31_0[1] = { - {81, 1}, + {82, 1}, }; static arc arcs_31_1[2] = { {30, 2}, {0, 1}, }; static arc arcs_31_2[2] = { - {81, 1}, + {82, 1}, {0, 2}, }; static state states_31[3] = { @@ -725,7 +726,7 @@ static state states_31[3] = { {2, arcs_31_2}, }; static arc arcs_32_0[1] = { - {83, 1}, + {84, 1}, }; static arc arcs_32_1[2] = { {30, 0}, @@ -739,7 +740,7 @@ static arc arcs_33_0[1] = { {21, 1}, }; static arc arcs_33_1[2] = { - {78, 0}, + {79, 0}, {0, 1}, }; static state states_33[2] = { @@ -747,7 +748,7 @@ static state states_33[2] = { {2, arcs_33_1}, }; static arc arcs_34_0[1] = { - {84, 1}, + {85, 1}, }; static arc arcs_34_1[1] = { {21, 2}, @@ -762,7 +763,7 @@ static state states_34[3] = { {2, arcs_34_2}, }; static arc arcs_35_0[1] = { - {85, 1}, + {86, 1}, }; static arc arcs_35_1[1] = { {21, 2}, @@ -777,7 +778,7 @@ static state states_35[3] = { {2, arcs_35_2}, }; static arc arcs_36_0[1] = { - {86, 1}, + {87, 1}, }; static arc arcs_36_1[1] = { {24, 2}, @@ -800,11 +801,11 @@ static state states_36[5] = { {1, arcs_36_4}, }; static arc arcs_37_0[8] = { - {87, 1}, {88, 1}, {89, 1}, {90, 1}, {91, 1}, + {92, 1}, {19, 1}, {18, 1}, {17, 1}, @@ -817,7 +818,7 @@ static state states_37[2] = { {1, arcs_37_1}, }; static arc arcs_38_0[1] = { - {92, 1}, + {93, 1}, }; static arc arcs_38_1[1] = { {24, 2}, @@ -829,8 +830,8 @@ static arc arcs_38_3[1] = { {26, 4}, }; static arc arcs_38_4[3] = { - {93, 1}, - {94, 5}, + {94, 1}, + {95, 5}, {0, 4}, }; static arc arcs_38_5[1] = { @@ -853,7 +854,7 @@ static state states_38[8] = { {1, arcs_38_7}, }; static arc arcs_39_0[1] = { - {95, 1}, + {96, 1}, }; static arc arcs_39_1[1] = { {24, 2}, @@ -865,7 +866,7 @@ static arc arcs_39_3[1] = { {26, 4}, }; static arc arcs_39_4[2] = { - {94, 5}, + {95, 5}, {0, 4}, }; static arc arcs_39_5[1] = { @@ -888,13 +889,13 @@ static state states_39[8] = { {1, arcs_39_7}, }; static arc arcs_40_0[1] = { - {96, 1}, + {97, 1}, }; static arc arcs_40_1[1] = { - {62, 2}, + {63, 2}, }; static arc arcs_40_2[1] = { - {97, 3}, + {98, 3}, }; static arc arcs_40_3[1] = { {9, 4}, @@ -906,7 +907,7 @@ static arc arcs_40_5[1] = { {26, 6}, }; static arc arcs_40_6[2] = { - {94, 7}, + {95, 7}, {0, 6}, }; static arc arcs_40_7[1] = { @@ -931,7 +932,7 @@ static state states_40[10] = { {1, arcs_40_9}, }; static arc arcs_41_0[1] = { - {98, 1}, + {99, 1}, }; static arc arcs_41_1[1] = { {25, 2}, @@ -940,8 +941,8 @@ static arc arcs_41_2[1] = { {26, 3}, }; static arc arcs_41_3[2] = { - {99, 4}, - {100, 5}, + {100, 4}, + {101, 5}, }; static arc arcs_41_4[1] = { {25, 6}, @@ -956,9 +957,9 @@ static arc arcs_41_7[1] = { {26, 9}, }; static arc arcs_41_8[4] = { - {99, 4}, - {94, 10}, - {100, 5}, + {100, 4}, + {95, 10}, + {101, 5}, {0, 8}, }; static arc arcs_41_9[1] = { @@ -971,7 +972,7 @@ static arc arcs_41_11[1] = { {26, 12}, }; static arc arcs_41_12[2] = { - {100, 5}, + {101, 5}, {0, 12}, }; static state states_41[13] = { @@ -990,10 +991,10 @@ static state states_41[13] = { {2, arcs_41_12}, }; static arc arcs_42_0[1] = { - {101, 1}, + {102, 1}, }; static arc arcs_42_1[1] = { - {102, 2}, + {103, 2}, }; static arc arcs_42_2[2] = { {30, 1}, @@ -1016,11 +1017,11 @@ static arc arcs_43_0[1] = { {24, 1}, }; static arc arcs_43_1[2] = { - {82, 2}, + {83, 2}, {0, 1}, }; static arc arcs_43_2[1] = { - {103, 3}, + {104, 3}, }; static arc arcs_43_3[1] = { {0, 3}, @@ -1032,14 +1033,14 @@ static state states_43[4] = { {1, arcs_43_3}, }; static arc arcs_44_0[1] = { - {104, 1}, + {105, 1}, }; static arc arcs_44_1[2] = { {24, 2}, {0, 1}, }; static arc arcs_44_2[2] = { - {82, 3}, + {83, 3}, {0, 2}, }; static arc arcs_44_3[1] = { @@ -1063,14 +1064,14 @@ static arc arcs_45_1[1] = { {0, 1}, }; static arc arcs_45_2[1] = { - {105, 3}, + {106, 3}, }; static arc arcs_45_3[1] = { {6, 4}, }; static arc arcs_45_4[2] = { {6, 4}, - {106, 1}, + {107, 1}, }; static state states_45[5] = { {2, arcs_45_0}, @@ -1080,21 +1081,21 @@ static state states_45[5] = { {2, arcs_45_4}, }; static arc arcs_46_0[2] = { - {107, 1}, - {108, 2}, + {108, 1}, + {109, 2}, }; static arc arcs_46_1[2] = { - {92, 3}, + {93, 3}, {0, 1}, }; static arc arcs_46_2[1] = { {0, 2}, }; static arc arcs_46_3[1] = { - {107, 4}, + {108, 4}, }; static arc arcs_46_4[1] = { - {94, 5}, + {95, 5}, }; static arc arcs_46_5[1] = { {24, 2}, @@ -1108,8 +1109,8 @@ static state states_46[6] = { {1, arcs_46_5}, }; static arc arcs_47_0[2] = { - {107, 1}, - {110, 1}, + {108, 1}, + {111, 1}, }; static arc arcs_47_1[1] = { {0, 1}, @@ -1119,7 +1120,7 @@ static state states_47[2] = { {1, arcs_47_1}, }; static arc arcs_48_0[1] = { - {111, 1}, + {112, 1}, }; static arc arcs_48_1[2] = { {33, 2}, @@ -1142,7 +1143,7 @@ static state states_48[5] = { {1, arcs_48_4}, }; static arc arcs_49_0[1] = { - {111, 1}, + {112, 1}, }; static arc arcs_49_1[2] = { {33, 2}, @@ -1152,7 +1153,7 @@ static arc arcs_49_2[1] = { {25, 3}, }; static arc arcs_49_3[1] = { - {109, 4}, + {110, 4}, }; static arc arcs_49_4[1] = { {0, 4}, @@ -1165,10 +1166,10 @@ static state states_49[5] = { {1, arcs_49_4}, }; static arc arcs_50_0[1] = { - {112, 1}, + {113, 1}, }; static arc arcs_50_1[2] = { - {113, 0}, + {114, 0}, {0, 1}, }; static state states_50[2] = { @@ -1176,10 +1177,10 @@ static state states_50[2] = { {2, arcs_50_1}, }; static arc arcs_51_0[1] = { - {114, 1}, + {115, 1}, }; static arc arcs_51_1[2] = { - {115, 0}, + {116, 0}, {0, 1}, }; static state states_51[2] = { @@ -1187,11 +1188,11 @@ static state states_51[2] = { {2, arcs_51_1}, }; static arc arcs_52_0[2] = { - {116, 1}, - {117, 2}, + {117, 1}, + {118, 2}, }; static arc arcs_52_1[1] = { - {114, 2}, + {115, 2}, }; static arc arcs_52_2[1] = { {0, 2}, @@ -1202,10 +1203,10 @@ static state states_52[3] = { {1, arcs_52_2}, }; static arc arcs_53_0[1] = { - {103, 1}, + {104, 1}, }; static arc arcs_53_1[2] = { - {118, 0}, + {119, 0}, {0, 1}, }; static state states_53[2] = { @@ -1213,25 +1214,25 @@ static state states_53[2] = { {2, arcs_53_1}, }; static arc arcs_54_0[10] = { - {119, 1}, {120, 1}, {121, 1}, {122, 1}, {123, 1}, {124, 1}, {125, 1}, - {97, 1}, - {116, 2}, - {126, 3}, + {126, 1}, + {98, 1}, + {117, 2}, + {127, 3}, }; static arc arcs_54_1[1] = { {0, 1}, }; static arc arcs_54_2[1] = { - {97, 1}, + {98, 1}, }; static arc arcs_54_3[2] = { - {116, 1}, + {117, 1}, {0, 3}, }; static state states_54[4] = { @@ -1244,7 +1245,7 @@ static arc arcs_55_0[1] = { {31, 1}, }; static arc arcs_55_1[1] = { - {103, 2}, + {104, 2}, }; static arc arcs_55_2[1] = { {0, 2}, @@ -1255,10 +1256,10 @@ static state states_55[3] = { {1, arcs_55_2}, }; static arc arcs_56_0[1] = { - {127, 1}, + {128, 1}, }; static arc arcs_56_1[2] = { - {128, 0}, + {129, 0}, {0, 1}, }; static state states_56[2] = { @@ -1266,10 +1267,10 @@ static state states_56[2] = { {2, arcs_56_1}, }; static arc arcs_57_0[1] = { - {129, 1}, + {130, 1}, }; static arc arcs_57_1[2] = { - {130, 0}, + {131, 0}, {0, 1}, }; static state states_57[2] = { @@ -1277,10 +1278,10 @@ static state states_57[2] = { {2, arcs_57_1}, }; static arc arcs_58_0[1] = { - {131, 1}, + {132, 1}, }; static arc arcs_58_1[2] = { - {132, 0}, + {133, 0}, {0, 1}, }; static state states_58[2] = { @@ -1288,11 +1289,11 @@ static state states_58[2] = { {2, arcs_58_1}, }; static arc arcs_59_0[1] = { - {133, 1}, + {134, 1}, }; static arc arcs_59_1[3] = { - {134, 0}, {135, 0}, + {136, 0}, {0, 1}, }; static state states_59[2] = { @@ -1300,11 +1301,11 @@ static state states_59[2] = { {3, arcs_59_1}, }; static arc arcs_60_0[1] = { - {136, 1}, + {137, 1}, }; static arc arcs_60_1[3] = { - {137, 0}, {138, 0}, + {139, 0}, {0, 1}, }; static state states_60[2] = { @@ -1312,27 +1313,28 @@ static state states_60[2] = { {3, arcs_60_1}, }; static arc arcs_61_0[1] = { - {139, 1}, + {140, 1}, }; -static arc arcs_61_1[5] = { +static arc arcs_61_1[6] = { {31, 0}, - {140, 0}, + {11, 0}, {141, 0}, {142, 0}, + {143, 0}, {0, 1}, }; static state states_61[2] = { {1, arcs_61_0}, - {5, arcs_61_1}, + {6, arcs_61_1}, }; static arc arcs_62_0[4] = { - {137, 1}, {138, 1}, - {143, 1}, - {144, 2}, + {139, 1}, + {144, 1}, + {145, 2}, }; static arc arcs_62_1[1] = { - {139, 2}, + {140, 2}, }; static arc arcs_62_2[1] = { {0, 2}, @@ -1343,15 +1345,15 @@ static state states_62[3] = { {1, arcs_62_2}, }; static arc arcs_63_0[1] = { - {145, 1}, + {146, 1}, }; static arc arcs_63_1[3] = { - {146, 1}, + {147, 1}, {32, 2}, {0, 1}, }; static arc arcs_63_2[1] = { - {139, 3}, + {140, 3}, }; static arc arcs_63_3[1] = { {0, 3}, @@ -1364,44 +1366,44 @@ static state states_63[4] = { }; static arc arcs_64_0[10] = { {13, 1}, - {148, 2}, - {150, 3}, + {149, 2}, + {151, 3}, {21, 4}, - {153, 4}, - {154, 5}, - {79, 4}, - {155, 4}, + {154, 4}, + {155, 5}, + {80, 4}, {156, 4}, {157, 4}, + {158, 4}, }; static arc arcs_64_1[3] = { {47, 6}, - {147, 6}, + {148, 6}, {15, 4}, }; static arc arcs_64_2[2] = { - {147, 7}, - {149, 4}, + {148, 7}, + {150, 4}, }; static arc arcs_64_3[2] = { - {151, 8}, - {152, 4}, + {152, 8}, + {153, 4}, }; static arc arcs_64_4[1] = { {0, 4}, }; static arc arcs_64_5[2] = { - {154, 5}, + {155, 5}, {0, 5}, }; static arc arcs_64_6[1] = { {15, 4}, }; static arc arcs_64_7[1] = { - {149, 4}, + {150, 4}, }; static arc arcs_64_8[1] = { - {152, 4}, + {153, 4}, }; static state states_64[9] = { {10, arcs_64_0}, @@ -1419,7 +1421,7 @@ static arc arcs_65_0[2] = { {48, 1}, }; static arc arcs_65_1[3] = { - {158, 2}, + {159, 2}, {30, 3}, {0, 1}, }; @@ -1444,15 +1446,15 @@ static state states_65[5] = { }; static arc arcs_66_0[3] = { {13, 1}, - {148, 2}, - {78, 3}, + {149, 2}, + {79, 3}, }; static arc arcs_66_1[2] = { {14, 4}, {15, 5}, }; static arc arcs_66_2[1] = { - {159, 6}, + {160, 6}, }; static arc arcs_66_3[1] = { {21, 5}, @@ -1464,7 +1466,7 @@ static arc arcs_66_5[1] = { {0, 5}, }; static arc arcs_66_6[1] = { - {149, 5}, + {150, 5}, }; static state states_66[7] = { {3, arcs_66_0}, @@ -1476,14 +1478,14 @@ static state states_66[7] = { {1, arcs_66_6}, }; static arc arcs_67_0[1] = { - {160, 1}, + {161, 1}, }; static arc arcs_67_1[2] = { {30, 2}, {0, 1}, }; static arc arcs_67_2[2] = { - {160, 1}, + {161, 1}, {0, 2}, }; static state states_67[3] = { @@ -1501,11 +1503,11 @@ static arc arcs_68_1[2] = { }; static arc arcs_68_2[3] = { {24, 3}, - {161, 4}, + {162, 4}, {0, 2}, }; static arc arcs_68_3[2] = { - {161, 4}, + {162, 4}, {0, 3}, }; static arc arcs_68_4[1] = { @@ -1534,7 +1536,7 @@ static state states_69[3] = { {1, arcs_69_2}, }; static arc arcs_70_0[2] = { - {103, 1}, + {104, 1}, {48, 1}, }; static arc arcs_70_1[2] = { @@ -1542,7 +1544,7 @@ static arc arcs_70_1[2] = { {0, 1}, }; static arc arcs_70_2[3] = { - {103, 1}, + {104, 1}, {48, 1}, {0, 2}, }; @@ -1572,7 +1574,7 @@ static arc arcs_72_0[1] = { }; static arc arcs_72_1[4] = { {25, 2}, - {158, 3}, + {159, 3}, {30, 4}, {0, 1}, }; @@ -1587,7 +1589,7 @@ static arc arcs_72_4[2] = { {0, 4}, }; static arc arcs_72_5[3] = { - {158, 3}, + {159, 3}, {30, 7}, {0, 5}, }; @@ -1623,7 +1625,7 @@ static state states_72[11] = { {2, arcs_72_10}, }; static arc arcs_73_0[1] = { - {162, 1}, + {163, 1}, }; static arc arcs_73_1[1] = { {21, 2}, @@ -1659,7 +1661,7 @@ static state states_73[8] = { {1, arcs_73_7}, }; static arc arcs_74_0[3] = { - {163, 1}, + {164, 1}, {31, 2}, {32, 3}, }; @@ -1674,7 +1676,7 @@ static arc arcs_74_3[1] = { {24, 6}, }; static arc arcs_74_4[4] = { - {163, 1}, + {164, 1}, {31, 2}, {32, 3}, {0, 4}, @@ -1687,7 +1689,7 @@ static arc arcs_74_6[1] = { {0, 6}, }; static arc arcs_74_7[2] = { - {163, 5}, + {164, 5}, {32, 3}, }; static state states_74[8] = { @@ -1704,7 +1706,7 @@ static arc arcs_75_0[1] = { {24, 1}, }; static arc arcs_75_1[3] = { - {158, 2}, + {159, 2}, {29, 3}, {0, 1}, }; @@ -1721,8 +1723,8 @@ static state states_75[4] = { {1, arcs_75_3}, }; static arc arcs_76_0[2] = { - {158, 1}, - {165, 1}, + {159, 1}, + {166, 1}, }; static arc arcs_76_1[1] = { {0, 1}, @@ -1732,19 +1734,19 @@ static state states_76[2] = { {1, arcs_76_1}, }; static arc arcs_77_0[1] = { - {96, 1}, + {97, 1}, }; static arc arcs_77_1[1] = { - {62, 2}, + {63, 2}, }; static arc arcs_77_2[1] = { - {97, 3}, + {98, 3}, }; static arc arcs_77_3[1] = { - {107, 4}, + {108, 4}, }; static arc arcs_77_4[2] = { - {164, 5}, + {165, 5}, {0, 4}, }; static arc arcs_77_5[1] = { @@ -1759,13 +1761,13 @@ static state states_77[6] = { {1, arcs_77_5}, }; static arc arcs_78_0[1] = { - {92, 1}, + {93, 1}, }; static arc arcs_78_1[1] = { - {109, 2}, + {110, 2}, }; static arc arcs_78_2[2] = { - {164, 3}, + {165, 3}, {0, 2}, }; static arc arcs_78_3[1] = { @@ -1788,10 +1790,10 @@ static state states_79[2] = { {1, arcs_79_1}, }; static arc arcs_80_0[1] = { - {167, 1}, + {168, 1}, }; static arc arcs_80_1[2] = { - {168, 2}, + {169, 2}, {0, 1}, }; static arc arcs_80_2[1] = { @@ -1803,7 +1805,7 @@ static state states_80[3] = { {1, arcs_80_2}, }; static arc arcs_81_0[2] = { - {73, 1}, + {74, 1}, {9, 2}, }; static arc arcs_81_1[1] = { @@ -1819,11 +1821,11 @@ static state states_81[3] = { }; static dfa dfas[82] = { {256, "single_input", 0, 3, states_0, - "\004\050\060\200\000\000\000\240\340\223\160\220\045\200\020\000\000\206\120\076\204\000"}, + "\004\050\060\200\000\000\000\100\301\047\341\040\113\000\041\000\000\014\241\174\010\001"}, {257, "file_input", 0, 2, states_1, - "\204\050\060\200\000\000\000\240\340\223\160\220\045\200\020\000\000\206\120\076\204\000"}, + "\204\050\060\200\000\000\000\100\301\047\341\040\113\000\041\000\000\014\241\174\010\001"}, {258, "eval_input", 0, 3, states_2, - "\000\040\040\000\000\000\000\000\000\200\000\000\000\200\020\000\000\206\120\076\000\000"}, + "\000\040\040\000\000\000\000\000\000\000\001\000\000\000\041\000\000\014\241\174\000\000"}, {259, "decorator", 0, 7, states_3, "\000\010\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {260, "decorators", 0, 2, states_4, @@ -1843,39 +1845,39 @@ static dfa dfas[82] = { {267, "vfpdef", 0, 2, states_11, "\000\000\040\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {268, "stmt", 0, 2, states_12, - "\000\050\060\200\000\000\000\240\340\223\160\220\045\200\020\000\000\206\120\076\204\000"}, + "\000\050\060\200\000\000\000\100\301\047\341\040\113\000\041\000\000\014\241\174\010\001"}, {269, "simple_stmt", 0, 4, states_13, - "\000\040\040\200\000\000\000\240\340\223\160\000\000\200\020\000\000\206\120\076\200\000"}, + "\000\040\040\200\000\000\000\100\301\047\341\000\000\000\041\000\000\014\241\174\000\001"}, {270, "small_stmt", 0, 2, states_14, - "\000\040\040\200\000\000\000\240\340\223\160\000\000\200\020\000\000\206\120\076\200\000"}, + "\000\040\040\200\000\000\000\100\301\047\341\000\000\000\041\000\000\014\241\174\000\001"}, {271, "expr_stmt", 0, 6, states_15, - "\000\040\040\200\000\000\000\000\000\200\000\000\000\200\020\000\000\206\120\076\000\000"}, + "\000\040\040\200\000\000\000\000\000\000\001\000\000\000\041\000\000\014\241\174\000\000"}, {272, "testlist_star_expr", 0, 3, states_16, - "\000\040\040\200\000\000\000\000\000\200\000\000\000\200\020\000\000\206\120\076\000\000"}, + "\000\040\040\200\000\000\000\000\000\000\001\000\000\000\041\000\000\014\241\174\000\000"}, {273, "augassign", 0, 2, states_17, - "\000\000\000\000\000\000\376\037\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, + "\000\000\000\000\000\000\376\077\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {274, "del_stmt", 0, 3, states_18, - "\000\000\000\000\000\000\000\040\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, + "\000\000\000\000\000\000\000\100\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {275, "pass_stmt", 0, 2, states_19, - "\000\000\000\000\000\000\000\200\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, + "\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {276, "flow_stmt", 0, 2, states_20, - "\000\000\000\000\000\000\000\000\340\001\000\000\000\000\000\000\000\000\000\000\200\000"}, + "\000\000\000\000\000\000\000\000\300\003\000\000\000\000\000\000\000\000\000\000\000\001"}, {277, "break_stmt", 0, 2, states_21, - "\000\000\000\000\000\000\000\000\040\000\000\000\000\000\000\000\000\000\000\000\000\000"}, - {278, "continue_stmt", 0, 2, states_22, "\000\000\000\000\000\000\000\000\100\000\000\000\000\000\000\000\000\000\000\000\000\000"}, - {279, "return_stmt", 0, 3, states_23, + {278, "continue_stmt", 0, 2, states_22, "\000\000\000\000\000\000\000\000\200\000\000\000\000\000\000\000\000\000\000\000\000\000"}, + {279, "return_stmt", 0, 3, states_23, + "\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000"}, {280, "yield_stmt", 0, 2, states_24, - "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\200\000"}, + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001"}, {281, "raise_stmt", 0, 5, states_25, - "\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000"}, + "\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000"}, {282, "import_stmt", 0, 2, states_26, - "\000\000\000\000\000\000\000\000\000\022\000\000\000\000\000\000\000\000\000\000\000\000"}, + "\000\000\000\000\000\000\000\000\000\044\000\000\000\000\000\000\000\000\000\000\000\000"}, {283, "import_name", 0, 3, states_27, - "\000\000\000\000\000\000\000\000\000\020\000\000\000\000\000\000\000\000\000\000\000\000"}, + "\000\000\000\000\000\000\000\000\000\040\000\000\000\000\000\000\000\000\000\000\000\000"}, {284, "import_from", 0, 8, states_28, - "\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000"}, + "\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000"}, {285, "import_as_name", 0, 4, states_29, "\000\000\040\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {286, "dotted_as_name", 0, 4, states_30, @@ -1887,103 +1889,103 @@ static dfa dfas[82] = { {289, "dotted_name", 0, 2, states_33, "\000\000\040\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {290, "global_stmt", 0, 3, states_34, - "\000\000\000\000\000\000\000\000\000\000\020\000\000\000\000\000\000\000\000\000\000\000"}, - {291, "nonlocal_stmt", 0, 3, states_35, "\000\000\000\000\000\000\000\000\000\000\040\000\000\000\000\000\000\000\000\000\000\000"}, - {292, "assert_stmt", 0, 5, states_36, + {291, "nonlocal_stmt", 0, 3, states_35, "\000\000\000\000\000\000\000\000\000\000\100\000\000\000\000\000\000\000\000\000\000\000"}, + {292, "assert_stmt", 0, 5, states_36, + "\000\000\000\000\000\000\000\000\000\000\200\000\000\000\000\000\000\000\000\000\000\000"}, {293, "compound_stmt", 0, 2, states_37, - "\000\010\020\000\000\000\000\000\000\000\000\220\045\000\000\000\000\000\000\000\004\000"}, + "\000\010\020\000\000\000\000\000\000\000\000\040\113\000\000\000\000\000\000\000\010\000"}, {294, "if_stmt", 0, 8, states_38, - "\000\000\000\000\000\000\000\000\000\000\000\020\000\000\000\000\000\000\000\000\000\000"}, + "\000\000\000\000\000\000\000\000\000\000\000\040\000\000\000\000\000\000\000\000\000\000"}, {295, "while_stmt", 0, 8, states_39, - "\000\000\000\000\000\000\000\000\000\000\000\200\000\000\000\000\000\000\000\000\000\000"}, - {296, "for_stmt", 0, 10, states_40, "\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000"}, + {296, "for_stmt", 0, 10, states_40, + "\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000"}, {297, "try_stmt", 0, 13, states_41, - "\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000"}, + "\000\000\000\000\000\000\000\000\000\000\000\000\010\000\000\000\000\000\000\000\000\000"}, {298, "with_stmt", 0, 5, states_42, - "\000\000\000\000\000\000\000\000\000\000\000\000\040\000\000\000\000\000\000\000\000\000"}, + "\000\000\000\000\000\000\000\000\000\000\000\000\100\000\000\000\000\000\000\000\000\000"}, {299, "with_item", 0, 4, states_43, - "\000\040\040\000\000\000\000\000\000\200\000\000\000\200\020\000\000\206\120\076\000\000"}, + "\000\040\040\000\000\000\000\000\000\000\001\000\000\000\041\000\000\014\241\174\000\000"}, {300, "except_clause", 0, 5, states_44, - "\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000"}, + "\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000"}, {301, "suite", 0, 5, states_45, - "\004\040\040\200\000\000\000\240\340\223\160\000\000\200\020\000\000\206\120\076\200\000"}, + "\004\040\040\200\000\000\000\100\301\047\341\000\000\000\041\000\000\014\241\174\000\001"}, {302, "test", 0, 6, states_46, - "\000\040\040\000\000\000\000\000\000\200\000\000\000\200\020\000\000\206\120\076\000\000"}, + "\000\040\040\000\000\000\000\000\000\000\001\000\000\000\041\000\000\014\241\174\000\000"}, {303, "test_nocond", 0, 2, states_47, - "\000\040\040\000\000\000\000\000\000\200\000\000\000\200\020\000\000\206\120\076\000\000"}, + "\000\040\040\000\000\000\000\000\000\000\001\000\000\000\041\000\000\014\241\174\000\000"}, {304, "lambdef", 0, 5, states_48, - "\000\000\000\000\000\000\000\000\000\000\000\000\000\200\000\000\000\000\000\000\000\000"}, + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000"}, {305, "lambdef_nocond", 0, 5, states_49, - "\000\000\000\000\000\000\000\000\000\000\000\000\000\200\000\000\000\000\000\000\000\000"}, + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000"}, {306, "or_test", 0, 2, states_50, - "\000\040\040\000\000\000\000\000\000\200\000\000\000\000\020\000\000\206\120\076\000\000"}, + "\000\040\040\000\000\000\000\000\000\000\001\000\000\000\040\000\000\014\241\174\000\000"}, {307, "and_test", 0, 2, states_51, - "\000\040\040\000\000\000\000\000\000\200\000\000\000\000\020\000\000\206\120\076\000\000"}, + "\000\040\040\000\000\000\000\000\000\000\001\000\000\000\040\000\000\014\241\174\000\000"}, {308, "not_test", 0, 3, states_52, - "\000\040\040\000\000\000\000\000\000\200\000\000\000\000\020\000\000\206\120\076\000\000"}, + "\000\040\040\000\000\000\000\000\000\000\001\000\000\000\040\000\000\014\241\174\000\000"}, {309, "comparison", 0, 2, states_53, - "\000\040\040\000\000\000\000\000\000\200\000\000\000\000\000\000\000\206\120\076\000\000"}, + "\000\040\040\000\000\000\000\000\000\000\001\000\000\000\000\000\000\014\241\174\000\000"}, {310, "comp_op", 0, 4, states_54, - "\000\000\000\000\000\000\000\000\000\000\000\000\002\000\220\177\000\000\000\000\000\000"}, + "\000\000\000\000\000\000\000\000\000\000\000\000\004\000\040\377\000\000\000\000\000\000"}, {311, "star_expr", 0, 3, states_55, "\000\000\000\200\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {312, "expr", 0, 2, states_56, - "\000\040\040\000\000\000\000\000\000\200\000\000\000\000\000\000\000\206\120\076\000\000"}, + "\000\040\040\000\000\000\000\000\000\000\001\000\000\000\000\000\000\014\241\174\000\000"}, {313, "xor_expr", 0, 2, states_57, - "\000\040\040\000\000\000\000\000\000\200\000\000\000\000\000\000\000\206\120\076\000\000"}, + "\000\040\040\000\000\000\000\000\000\000\001\000\000\000\000\000\000\014\241\174\000\000"}, {314, "and_expr", 0, 2, states_58, - "\000\040\040\000\000\000\000\000\000\200\000\000\000\000\000\000\000\206\120\076\000\000"}, + "\000\040\040\000\000\000\000\000\000\000\001\000\000\000\000\000\000\014\241\174\000\000"}, {315, "shift_expr", 0, 2, states_59, - "\000\040\040\000\000\000\000\000\000\200\000\000\000\000\000\000\000\206\120\076\000\000"}, + "\000\040\040\000\000\000\000\000\000\000\001\000\000\000\000\000\000\014\241\174\000\000"}, {316, "arith_expr", 0, 2, states_60, - "\000\040\040\000\000\000\000\000\000\200\000\000\000\000\000\000\000\206\120\076\000\000"}, + "\000\040\040\000\000\000\000\000\000\000\001\000\000\000\000\000\000\014\241\174\000\000"}, {317, "term", 0, 2, states_61, - "\000\040\040\000\000\000\000\000\000\200\000\000\000\000\000\000\000\206\120\076\000\000"}, + "\000\040\040\000\000\000\000\000\000\000\001\000\000\000\000\000\000\014\241\174\000\000"}, {318, "factor", 0, 3, states_62, - "\000\040\040\000\000\000\000\000\000\200\000\000\000\000\000\000\000\206\120\076\000\000"}, + "\000\040\040\000\000\000\000\000\000\000\001\000\000\000\000\000\000\014\241\174\000\000"}, {319, "power", 0, 4, states_63, - "\000\040\040\000\000\000\000\000\000\200\000\000\000\000\000\000\000\000\120\076\000\000"}, + "\000\040\040\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\240\174\000\000"}, {320, "atom", 0, 9, states_64, - "\000\040\040\000\000\000\000\000\000\200\000\000\000\000\000\000\000\000\120\076\000\000"}, + "\000\040\040\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\240\174\000\000"}, {321, "testlist_comp", 0, 5, states_65, - "\000\040\040\200\000\000\000\000\000\200\000\000\000\200\020\000\000\206\120\076\000\000"}, + "\000\040\040\200\000\000\000\000\000\000\001\000\000\000\041\000\000\014\241\174\000\000"}, {322, "trailer", 0, 7, states_66, - "\000\040\000\000\000\000\000\000\000\100\000\000\000\000\000\000\000\000\020\000\000\000"}, + "\000\040\000\000\000\000\000\000\000\200\000\000\000\000\000\000\000\000\040\000\000\000"}, {323, "subscriptlist", 0, 3, states_67, - "\000\040\040\002\000\000\000\000\000\200\000\000\000\200\020\000\000\206\120\076\000\000"}, + "\000\040\040\002\000\000\000\000\000\000\001\000\000\000\041\000\000\014\241\174\000\000"}, {324, "subscript", 0, 5, states_68, - "\000\040\040\002\000\000\000\000\000\200\000\000\000\200\020\000\000\206\120\076\000\000"}, + "\000\040\040\002\000\000\000\000\000\000\001\000\000\000\041\000\000\014\241\174\000\000"}, {325, "sliceop", 0, 3, states_69, "\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {326, "exprlist", 0, 3, states_70, - "\000\040\040\200\000\000\000\000\000\200\000\000\000\000\000\000\000\206\120\076\000\000"}, + "\000\040\040\200\000\000\000\000\000\000\001\000\000\000\000\000\000\014\241\174\000\000"}, {327, "testlist", 0, 3, states_71, - "\000\040\040\000\000\000\000\000\000\200\000\000\000\200\020\000\000\206\120\076\000\000"}, + "\000\040\040\000\000\000\000\000\000\000\001\000\000\000\041\000\000\014\241\174\000\000"}, {328, "dictorsetmaker", 0, 11, states_72, - "\000\040\040\000\000\000\000\000\000\200\000\000\000\200\020\000\000\206\120\076\000\000"}, + "\000\040\040\000\000\000\000\000\000\000\001\000\000\000\041\000\000\014\241\174\000\000"}, {329, "classdef", 0, 8, states_73, - "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000"}, + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\010\000"}, {330, "arglist", 0, 8, states_74, - "\000\040\040\200\001\000\000\000\000\200\000\000\000\200\020\000\000\206\120\076\000\000"}, + "\000\040\040\200\001\000\000\000\000\000\001\000\000\000\041\000\000\014\241\174\000\000"}, {331, "argument", 0, 4, states_75, - "\000\040\040\000\000\000\000\000\000\200\000\000\000\200\020\000\000\206\120\076\000\000"}, + "\000\040\040\000\000\000\000\000\000\000\001\000\000\000\041\000\000\014\241\174\000\000"}, {332, "comp_iter", 0, 2, states_76, - "\000\000\000\000\000\000\000\000\000\000\000\020\001\000\000\000\000\000\000\000\000\000"}, + "\000\000\000\000\000\000\000\000\000\000\000\040\002\000\000\000\000\000\000\000\000\000"}, {333, "comp_for", 0, 6, states_77, - "\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000"}, + "\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000"}, {334, "comp_if", 0, 4, states_78, - "\000\000\000\000\000\000\000\000\000\000\000\020\000\000\000\000\000\000\000\000\000\000"}, + "\000\000\000\000\000\000\000\000\000\000\000\040\000\000\000\000\000\000\000\000\000\000"}, {335, "encoding_decl", 0, 2, states_79, "\000\000\040\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {336, "yield_expr", 0, 3, states_80, - "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\200\000"}, + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001"}, {337, "yield_arg", 0, 3, states_81, - "\000\040\040\000\000\000\000\000\000\202\000\000\000\200\020\000\000\206\120\076\000\000"}, + "\000\040\040\000\000\000\000\000\000\004\001\000\000\000\041\000\000\014\241\174\000\000"}, }; -static label labels[169] = { +static label labels[170] = { {0, "EMPTY"}, {256, 0}, {4, 0}, @@ -2007,7 +2009,7 @@ static label labels[169] = { {1, "def"}, {1, 0}, {263, 0}, - {50, 0}, + {51, 0}, {302, 0}, {11, 0}, {301, 0}, @@ -2036,6 +2038,7 @@ static label labels[169] = { {36, 0}, {37, 0}, {38, 0}, + {50, 0}, {39, 0}, {40, 0}, {41, 0}, @@ -2063,7 +2066,7 @@ static label labels[169] = { {1, "import"}, {288, 0}, {23, 0}, - {51, 0}, + {52, 0}, {287, 0}, {285, 0}, {1, "as"}, @@ -2157,6 +2160,6 @@ static label labels[169] = { grammar _PyParser_Grammar = { 82, dfas, - {169, labels}, + {170, labels}, 256 }; diff --git a/Python/importlib.h b/Python/importlib.h index 2644b1d..a97af19 100644 --- a/Python/importlib.h +++ b/Python/importlib.h @@ -702,7 +702,7 @@ const unsigned char _Py_M__importlib[] = { 5,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,57, 1,0,0,115,2,0,0,0,0,8,114,114,0,0,0,105, - 238,12,0,0,233,2,0,0,0,114,13,0,0,0,115,2, + 248,12,0,0,233,2,0,0,0,114,13,0,0,0,115,2, 0,0,0,13,10,90,11,95,95,112,121,99,97,99,104,101, 95,95,122,3,46,112,121,122,4,46,112,121,99,122,4,46, 112,121,111,78,99,2,0,0,0,0,0,0,0,11,0,0, @@ -771,7 +771,7 @@ const unsigned char _Py_M__importlib[] = { 3,116,97,103,218,8,102,105,108,101,110,97,109,101,114,4, 0,0,0,114,4,0,0,0,114,5,0,0,0,218,17,99, 97,99,104,101,95,102,114,111,109,95,115,111,117,114,99,101, - 181,1,0,0,115,22,0,0,0,0,13,31,1,6,1,9, + 182,1,0,0,115,22,0,0,0,0,13,31,1,6,1,9, 2,6,1,18,1,24,1,12,1,12,1,15,1,31,1,114, 132,0,0,0,99,1,0,0,0,0,0,0,0,5,0,0, 0,5,0,0,0,67,0,0,0,115,193,0,0,0,116,0, @@ -828,7 +828,7 @@ const unsigned char _Py_M__importlib[] = { 95,102,105,108,101,110,97,109,101,90,7,112,121,99,97,99, 104,101,114,129,0,0,0,114,4,0,0,0,114,4,0,0, 0,114,5,0,0,0,218,17,115,111,117,114,99,101,95,102, - 114,111,109,95,99,97,99,104,101,208,1,0,0,115,24,0, + 114,111,109,95,99,97,99,104,101,209,1,0,0,115,24,0, 0,0,0,9,18,1,15,1,18,1,18,1,12,1,3,1, 24,1,21,1,3,1,21,1,19,1,114,135,0,0,0,99, 1,0,0,0,0,0,0,0,5,0,0,0,13,0,0,0, @@ -865,7 +865,7 @@ const unsigned char _Py_M__importlib[] = { 105,111,110,218,11,115,111,117,114,99,101,95,112,97,116,104, 114,4,0,0,0,114,4,0,0,0,114,5,0,0,0,218, 15,95,103,101,116,95,115,111,117,114,99,101,102,105,108,101, - 231,1,0,0,115,20,0,0,0,0,7,18,1,4,1,24, + 232,1,0,0,115,20,0,0,0,0,7,18,1,4,1,24, 1,35,1,4,1,3,1,16,1,19,1,21,1,114,142,0, 0,0,99,1,0,0,0,0,0,0,0,2,0,0,0,11, 0,0,0,67,0,0,0,115,60,0,0,0,121,19,0,116, @@ -880,7 +880,7 @@ const unsigned char _Py_M__importlib[] = { 114,41,0,0,0,114,40,0,0,0,41,2,114,35,0,0, 0,114,42,0,0,0,114,4,0,0,0,114,4,0,0,0, 114,5,0,0,0,218,10,95,99,97,108,99,95,109,111,100, - 101,250,1,0,0,115,12,0,0,0,0,2,3,1,19,1, + 101,251,1,0,0,115,12,0,0,0,0,2,3,1,19,1, 13,1,11,3,10,1,114,144,0,0,0,218,9,118,101,114, 98,111,115,105,116,121,114,29,0,0,0,99,1,0,0,0, 1,0,0,0,3,0,0,0,4,0,0,0,71,0,0,0, @@ -901,7 +901,7 @@ const unsigned char _Py_M__importlib[] = { 6,115,116,100,101,114,114,41,3,218,7,109,101,115,115,97, 103,101,114,145,0,0,0,114,80,0,0,0,114,4,0,0, 0,114,4,0,0,0,114,5,0,0,0,218,16,95,118,101, - 114,98,111,115,101,95,109,101,115,115,97,103,101,6,2,0, + 114,98,111,115,101,95,109,101,115,115,97,103,101,7,2,0, 0,115,8,0,0,0,0,2,18,1,15,1,13,1,114,152, 0,0,0,99,1,0,0,0,0,0,0,0,2,0,0,0, 4,0,0,0,3,0,0,0,115,38,0,0,0,100,1,0, @@ -937,14 +937,14 @@ const unsigned char _Py_M__importlib[] = { 0,0,114,80,0,0,0,114,108,0,0,0,41,1,218,6, 109,101,116,104,111,100,114,4,0,0,0,114,5,0,0,0, 218,19,95,99,104,101,99,107,95,110,97,109,101,95,119,114, - 97,112,112,101,114,22,2,0,0,115,10,0,0,0,0,1, + 97,112,112,101,114,23,2,0,0,115,10,0,0,0,0,1, 12,1,12,1,15,1,25,1,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,41,1,114,65,0,0,0,41,2,114,154,0,0,0, 114,155,0,0,0,114,4,0,0,0,41,1,114,154,0,0, 0,114,5,0,0,0,218,11,95,99,104,101,99,107,95,110, - 97,109,101,14,2,0,0,115,6,0,0,0,0,8,21,6, + 97,109,101,15,2,0,0,115,6,0,0,0,0,8,21,6, 13,1,114,156,0,0,0,99,1,0,0,0,0,0,0,0, 2,0,0,0,3,0,0,0,3,0,0,0,115,35,0,0, 0,135,0,0,102,1,0,100,1,0,100,2,0,134,0,0, @@ -966,7 +966,7 @@ const unsigned char _Py_M__importlib[] = { 0,0,218,8,102,117,108,108,110,97,109,101,41,1,218,3, 102,120,110,114,4,0,0,0,114,5,0,0,0,218,25,95, 114,101,113,117,105,114,101,115,95,98,117,105,108,116,105,110, - 95,119,114,97,112,112,101,114,34,2,0,0,115,8,0,0, + 95,119,114,97,112,112,101,114,35,2,0,0,115,8,0,0, 0,0,1,15,1,18,1,12,1,122,52,95,114,101,113,117, 105,114,101,115,95,98,117,105,108,116,105,110,46,60,108,111, 99,97,108,115,62,46,95,114,101,113,117,105,114,101,115,95, @@ -974,7 +974,7 @@ const unsigned char _Py_M__importlib[] = { 1,114,65,0,0,0,41,2,114,159,0,0,0,114,160,0, 0,0,114,4,0,0,0,41,1,114,159,0,0,0,114,5, 0,0,0,218,17,95,114,101,113,117,105,114,101,115,95,98, - 117,105,108,116,105,110,32,2,0,0,115,6,0,0,0,0, + 117,105,108,116,105,110,33,2,0,0,115,6,0,0,0,0, 2,18,5,13,1,114,161,0,0,0,99,1,0,0,0,0, 0,0,0,2,0,0,0,3,0,0,0,3,0,0,0,115, 35,0,0,0,135,0,0,102,1,0,100,1,0,100,2,0, @@ -995,7 +995,7 @@ const unsigned char _Py_M__importlib[] = { 2,114,71,0,0,0,114,158,0,0,0,41,1,114,159,0, 0,0,114,4,0,0,0,114,5,0,0,0,218,24,95,114, 101,113,117,105,114,101,115,95,102,114,111,122,101,110,95,119, - 114,97,112,112,101,114,45,2,0,0,115,8,0,0,0,0, + 114,97,112,112,101,114,46,2,0,0,115,8,0,0,0,0, 1,15,1,18,1,12,1,122,50,95,114,101,113,117,105,114, 101,115,95,102,114,111,122,101,110,46,60,108,111,99,97,108, 115,62,46,95,114,101,113,117,105,114,101,115,95,102,114,111, @@ -1003,7 +1003,7 @@ const unsigned char _Py_M__importlib[] = { 0,0,41,2,114,159,0,0,0,114,163,0,0,0,114,4, 0,0,0,41,1,114,159,0,0,0,114,5,0,0,0,218, 16,95,114,101,113,117,105,114,101,115,95,102,114,111,122,101, - 110,43,2,0,0,115,6,0,0,0,0,2,18,5,13,1, + 110,44,2,0,0,115,6,0,0,0,0,2,18,5,13,1, 114,164,0,0,0,99,2,0,0,0,0,0,0,0,5,0, 0,0,5,0,0,0,67,0,0,0,115,87,0,0,0,124, 0,0,106,0,0,124,1,0,131,1,0,92,2,0,125,2, @@ -1032,7 +1032,7 @@ const unsigned char _Py_M__importlib[] = { 108,111,97,100,101,114,218,8,112,111,114,116,105,111,110,115, 218,3,109,115,103,114,4,0,0,0,114,4,0,0,0,114, 5,0,0,0,218,17,95,102,105,110,100,95,109,111,100,117, - 108,101,95,115,104,105,109,54,2,0,0,115,10,0,0,0, + 108,101,95,115,104,105,109,55,2,0,0,115,10,0,0,0, 0,10,21,1,24,1,6,1,32,1,114,172,0,0,0,99, 2,0,0,0,0,0,0,0,5,0,0,0,3,0,0,0, 67,0,0,0,115,93,0,0,0,116,0,0,124,1,0,124, @@ -1057,7 +1057,7 @@ const unsigned char _Py_M__importlib[] = { 4,115,112,101,99,218,7,109,101,116,104,111,100,115,218,6, 109,111,100,117,108,101,114,4,0,0,0,114,4,0,0,0, 114,5,0,0,0,218,17,95,108,111,97,100,95,109,111,100, - 117,108,101,95,115,104,105,109,71,2,0,0,115,14,0,0, + 117,108,101,95,115,104,105,109,72,2,0,0,115,14,0,0, 0,0,6,15,1,12,1,15,1,13,1,13,1,11,2,114, 180,0,0,0,99,4,0,0,0,0,0,0,0,11,0,0, 0,19,0,0,0,67,0,0,0,115,243,1,0,0,105,0, @@ -1142,7 +1142,7 @@ const unsigned char _Py_M__importlib[] = { 101,95,109,116,105,109,101,218,11,115,111,117,114,99,101,95, 115,105,122,101,114,4,0,0,0,114,4,0,0,0,114,5, 0,0,0,218,25,95,118,97,108,105,100,97,116,101,95,98, - 121,116,101,99,111,100,101,95,104,101,97,100,101,114,87,2, + 121,116,101,99,111,100,101,95,104,101,97,100,101,114,88,2, 0,0,115,76,0,0,0,0,11,6,1,12,1,13,3,6, 1,12,1,13,1,16,1,16,1,16,1,12,1,18,1,10, 1,18,1,18,1,15,1,10,1,15,1,18,1,15,1,10, @@ -1173,7 +1173,7 @@ const unsigned char _Py_M__importlib[] = { 41,5,114,53,0,0,0,114,67,0,0,0,114,140,0,0, 0,114,141,0,0,0,218,4,99,111,100,101,114,4,0,0, 0,114,4,0,0,0,114,5,0,0,0,218,17,95,99,111, - 109,112,105,108,101,95,98,121,116,101,99,111,100,101,142,2, + 109,112,105,108,101,95,98,121,116,101,99,111,100,101,143,2, 0,0,115,16,0,0,0,0,2,15,1,15,1,13,1,12, 1,19,1,4,2,18,1,114,195,0,0,0,114,84,0,0, 0,99,3,0,0,0,0,0,0,0,4,0,0,0,3,0, @@ -1193,7 +1193,7 @@ const unsigned char _Py_M__importlib[] = { 5,100,117,109,112,115,41,4,114,194,0,0,0,114,183,0, 0,0,114,189,0,0,0,114,53,0,0,0,114,4,0,0, 0,114,4,0,0,0,114,5,0,0,0,218,17,95,99,111, - 100,101,95,116,111,95,98,121,116,101,99,111,100,101,154,2, + 100,101,95,116,111,95,98,121,116,101,99,111,100,101,155,2, 0,0,115,10,0,0,0,0,3,12,1,19,1,19,1,22, 1,114,198,0,0,0,99,1,0,0,0,0,0,0,0,5, 0,0,0,4,0,0,0,67,0,0,0,115,89,0,0,0, @@ -1222,7 +1222,7 @@ const unsigned char _Py_M__importlib[] = { 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,4,0,0, 0,114,4,0,0,0,114,5,0,0,0,218,13,100,101,99, - 111,100,101,95,115,111,117,114,99,101,164,2,0,0,115,10, + 111,100,101,95,115,111,117,114,99,101,165,2,0,0,115,10, 0,0,0,0,5,12,1,18,1,15,1,18,1,114,203,0, 0,0,99,1,0,0,0,0,0,0,0,5,0,0,0,35, 0,0,0,67,0,0,0,115,15,1,0,0,116,0,0,124, @@ -1256,7 +1256,7 @@ const unsigned char _Py_M__importlib[] = { 95,95,114,47,0,0,0,41,5,114,179,0,0,0,114,169, 0,0,0,114,177,0,0,0,114,67,0,0,0,114,131,0, 0,0,114,4,0,0,0,114,4,0,0,0,114,5,0,0, - 0,218,12,95,109,111,100,117,108,101,95,114,101,112,114,178, + 0,218,12,95,109,111,100,117,108,101,95,114,101,112,114,179, 2,0,0,115,46,0,0,0,0,2,18,1,15,4,3,1, 17,1,13,1,8,1,3,1,13,1,13,1,5,2,12,1, 16,4,3,1,13,1,13,1,11,1,3,1,13,1,13,1, @@ -1273,7 +1273,7 @@ const unsigned char _Py_M__importlib[] = { 83,41,1,78,41,3,218,7,95,109,111,100,117,108,101,114, 208,0,0,0,218,5,95,115,112,101,99,41,2,114,71,0, 0,0,114,179,0,0,0,114,4,0,0,0,114,4,0,0, - 0,114,5,0,0,0,114,72,0,0,0,216,2,0,0,115, + 0,114,5,0,0,0,114,72,0,0,0,217,2,0,0,115, 4,0,0,0,0,1,9,1,122,26,95,105,110,115,116,97, 108,108,101,100,95,115,97,102,101,108,121,46,95,95,105,110, 105,116,95,95,99,1,0,0,0,0,0,0,0,1,0,0, @@ -1284,7 +1284,7 @@ const unsigned char _Py_M__importlib[] = { 13,95,105,110,105,116,105,97,108,105,122,105,110,103,114,213, 0,0,0,114,7,0,0,0,114,73,0,0,0,114,67,0, 0,0,41,1,114,71,0,0,0,114,4,0,0,0,114,4, - 0,0,0,114,5,0,0,0,114,75,0,0,0,220,2,0, + 0,0,0,114,5,0,0,0,114,75,0,0,0,221,2,0, 0,115,4,0,0,0,0,4,12,1,122,27,95,105,110,115, 116,97,108,108,101,100,95,115,97,102,101,108,121,46,95,95, 101,110,116,101,114,95,95,99,1,0,0,0,0,0,0,0, @@ -1302,7 +1302,7 @@ const unsigned char _Py_M__importlib[] = { 124,1,0,100,0,0,107,9,0,86,1,113,3,0,100,0, 0,83,41,1,78,114,4,0,0,0,41,2,114,22,0,0, 0,114,76,0,0,0,114,4,0,0,0,114,4,0,0,0, - 114,5,0,0,0,114,77,0,0,0,230,2,0,0,115,2, + 114,5,0,0,0,114,77,0,0,0,231,2,0,0,115,2, 0,0,0,6,0,122,45,95,105,110,115,116,97,108,108,101, 100,95,115,97,102,101,108,121,46,95,95,101,120,105,116,95, 95,46,60,108,111,99,97,108,115,62,46,60,103,101,110,101, @@ -1312,14 +1312,14 @@ const unsigned char _Py_M__importlib[] = { 67,0,0,0,114,79,0,0,0,114,152,0,0,0,114,169, 0,0,0,114,215,0,0,0,41,3,114,71,0,0,0,114, 80,0,0,0,114,177,0,0,0,114,4,0,0,0,114,4, - 0,0,0,114,5,0,0,0,114,81,0,0,0,227,2,0, + 0,0,0,114,5,0,0,0,114,81,0,0,0,228,2,0, 0,115,18,0,0,0,0,1,3,1,9,1,25,1,3,1, 17,1,13,1,8,2,26,2,122,26,95,105,110,115,116,97, 108,108,101,100,95,115,97,102,101,108,121,46,95,95,101,120, 105,116,95,95,78,41,6,114,57,0,0,0,114,56,0,0, 0,114,58,0,0,0,114,72,0,0,0,114,75,0,0,0, 114,81,0,0,0,114,4,0,0,0,114,4,0,0,0,114, - 4,0,0,0,114,5,0,0,0,114,212,0,0,0,214,2, + 4,0,0,0,114,5,0,0,0,114,212,0,0,0,215,2, 0,0,115,6,0,0,0,12,2,12,4,12,7,114,212,0, 0,0,99,0,0,0,0,0,0,0,0,0,0,0,0,8, 0,0,0,64,0,0,0,115,172,0,0,0,101,0,0,90, @@ -1444,7 +1444,7 @@ const unsigned char _Py_M__importlib[] = { 97,99,104,101,100,41,6,114,71,0,0,0,114,67,0,0, 0,114,169,0,0,0,114,217,0,0,0,114,218,0,0,0, 114,219,0,0,0,114,4,0,0,0,114,4,0,0,0,114, - 5,0,0,0,114,72,0,0,0,22,3,0,0,115,14,0, + 5,0,0,0,114,72,0,0,0,23,3,0,0,115,14,0, 0,0,0,2,9,1,9,1,9,1,9,1,21,3,9,1, 122,19,77,111,100,117,108,101,83,112,101,99,46,95,95,105, 110,105,116,95,95,99,1,0,0,0,0,0,0,0,2,0, @@ -1469,7 +1469,7 @@ const unsigned char _Py_M__importlib[] = { 95,95,99,108,97,115,115,95,95,114,57,0,0,0,114,26, 0,0,0,41,2,114,71,0,0,0,114,80,0,0,0,114, 4,0,0,0,114,4,0,0,0,114,5,0,0,0,114,101, - 0,0,0,34,3,0,0,115,16,0,0,0,0,1,15,1, + 0,0,0,35,3,0,0,115,16,0,0,0,0,1,15,1, 21,1,15,1,28,1,15,1,6,1,22,1,122,19,77,111, 100,117,108,101,83,112,101,99,46,95,95,114,101,112,114,95, 95,99,2,0,0,0,0,0,0,0,3,0,0,0,13,0, @@ -1488,7 +1488,7 @@ const unsigned char _Py_M__importlib[] = { 104,97,115,95,108,111,99,97,116,105,111,110,114,209,0,0, 0,41,3,114,71,0,0,0,218,5,111,116,104,101,114,218, 4,115,109,115,108,114,4,0,0,0,114,4,0,0,0,114, - 5,0,0,0,218,6,95,95,101,113,95,95,44,3,0,0, + 5,0,0,0,218,6,95,95,101,113,95,95,45,3,0,0, 115,20,0,0,0,0,1,9,1,3,1,18,1,18,1,18, 1,15,1,18,1,20,1,13,1,122,17,77,111,100,117,108, 101,83,112,101,99,46,95,95,101,113,95,95,99,1,0,0, @@ -1509,7 +1509,7 @@ const unsigned char _Py_M__importlib[] = { 0,0,0,114,124,0,0,0,218,17,66,89,84,69,67,79, 68,69,95,83,85,70,70,73,88,69,83,41,2,114,71,0, 0,0,114,131,0,0,0,114,4,0,0,0,114,4,0,0, - 0,114,5,0,0,0,114,225,0,0,0,56,3,0,0,115, + 0,114,5,0,0,0,114,225,0,0,0,57,3,0,0,115, 22,0,0,0,0,2,15,1,24,1,9,1,21,1,3,1, 19,1,13,1,8,1,21,1,18,1,122,17,77,111,100,117, 108,101,83,112,101,99,46,99,97,99,104,101,100,99,2,0, @@ -1517,7 +1517,7 @@ const unsigned char _Py_M__importlib[] = { 0,0,115,13,0,0,0,124,1,0,124,0,0,95,0,0, 100,0,0,83,41,1,78,41,1,114,222,0,0,0,41,2, 114,71,0,0,0,114,225,0,0,0,114,4,0,0,0,114, - 4,0,0,0,114,5,0,0,0,114,225,0,0,0,70,3, + 4,0,0,0,114,5,0,0,0,114,225,0,0,0,71,3, 0,0,115,2,0,0,0,0,2,99,1,0,0,0,0,0, 0,0,1,0,0,0,2,0,0,0,67,0,0,0,115,46, 0,0,0,124,0,0,106,0,0,100,1,0,107,8,0,114, @@ -1528,14 +1528,14 @@ const unsigned char _Py_M__importlib[] = { 114,101,110,116,46,78,114,116,0,0,0,114,84,0,0,0, 41,3,114,220,0,0,0,114,67,0,0,0,114,32,0,0, 0,41,1,114,71,0,0,0,114,4,0,0,0,114,4,0, - 0,0,114,5,0,0,0,218,6,112,97,114,101,110,116,74, + 0,0,114,5,0,0,0,218,6,112,97,114,101,110,116,75, 3,0,0,115,6,0,0,0,0,3,15,1,20,2,122,17, 77,111,100,117,108,101,83,112,101,99,46,112,97,114,101,110, 116,99,1,0,0,0,0,0,0,0,1,0,0,0,1,0, 0,0,67,0,0,0,115,7,0,0,0,124,0,0,106,0, 0,83,41,1,78,41,1,114,221,0,0,0,41,1,114,71, 0,0,0,114,4,0,0,0,114,4,0,0,0,114,5,0, - 0,0,114,226,0,0,0,82,3,0,0,115,2,0,0,0, + 0,0,114,226,0,0,0,83,3,0,0,115,2,0,0,0, 0,2,122,23,77,111,100,117,108,101,83,112,101,99,46,104, 97,115,95,108,111,99,97,116,105,111,110,99,2,0,0,0, 0,0,0,0,2,0,0,0,2,0,0,0,67,0,0,0, @@ -1543,14 +1543,14 @@ const unsigned char _Py_M__importlib[] = { 0,95,1,0,100,0,0,83,41,1,78,41,2,218,4,98, 111,111,108,114,221,0,0,0,41,2,114,71,0,0,0,218, 5,118,97,108,117,101,114,4,0,0,0,114,4,0,0,0, - 114,5,0,0,0,114,226,0,0,0,86,3,0,0,115,2, + 114,5,0,0,0,114,226,0,0,0,87,3,0,0,115,2, 0,0,0,0,2,41,12,114,57,0,0,0,114,56,0,0, 0,114,58,0,0,0,114,59,0,0,0,114,72,0,0,0, 114,101,0,0,0,114,229,0,0,0,218,8,112,114,111,112, 101,114,116,121,114,225,0,0,0,218,6,115,101,116,116,101, 114,114,233,0,0,0,114,226,0,0,0,114,4,0,0,0, 114,4,0,0,0,114,4,0,0,0,114,5,0,0,0,114, - 216,0,0,0,241,2,0,0,115,20,0,0,0,12,35,6, + 216,0,0,0,242,2,0,0,115,20,0,0,0,12,35,6, 2,15,1,15,11,12,10,12,12,18,14,21,4,18,8,18, 4,114,216,0,0,0,114,217,0,0,0,114,219,0,0,0, 99,2,0,0,0,2,0,0,0,5,0,0,0,15,0,0, @@ -1578,7 +1578,7 @@ const unsigned char _Py_M__importlib[] = { 0,0,114,216,0,0,0,41,5,114,67,0,0,0,114,169, 0,0,0,114,217,0,0,0,114,219,0,0,0,90,6,115, 101,97,114,99,104,114,4,0,0,0,114,4,0,0,0,114, - 5,0,0,0,114,173,0,0,0,91,3,0,0,115,28,0, + 5,0,0,0,114,173,0,0,0,92,3,0,0,115,28,0, 0,0,0,2,15,1,12,1,16,1,18,1,15,1,7,2, 12,1,15,1,3,1,19,1,13,1,14,3,9,2,114,173, 0,0,0,114,169,0,0,0,114,220,0,0,0,99,2,0, @@ -1640,7 +1640,7 @@ const unsigned char _Py_M__importlib[] = { 218,12,108,111,97,100,101,114,95,99,108,97,115,115,114,127, 0,0,0,114,219,0,0,0,90,7,100,105,114,110,97,109, 101,114,4,0,0,0,114,4,0,0,0,114,5,0,0,0, - 114,239,0,0,0,116,3,0,0,115,60,0,0,0,0,12, + 114,239,0,0,0,117,3,0,0,115,60,0,0,0,0,12, 12,4,6,1,15,2,3,1,19,1,13,1,11,8,21,1, 9,3,12,1,22,1,21,1,15,1,9,1,8,2,7,3, 12,2,15,1,3,1,19,1,13,1,5,2,6,1,18,2, @@ -1680,7 +1680,7 @@ const unsigned char _Py_M__importlib[] = { 217,0,0,0,114,177,0,0,0,114,67,0,0,0,114,242, 0,0,0,114,225,0,0,0,114,220,0,0,0,114,4,0, 0,0,114,4,0,0,0,114,5,0,0,0,218,17,95,115, - 112,101,99,95,102,114,111,109,95,109,111,100,117,108,101,180, + 112,101,99,95,102,114,111,109,95,109,111,100,117,108,101,181, 3,0,0,115,72,0,0,0,0,2,3,1,13,1,13,1, 5,2,12,1,4,2,9,1,12,1,3,1,13,1,13,2, 8,1,3,1,13,1,13,1,11,1,12,1,12,1,3,1, @@ -1707,7 +1707,7 @@ const unsigned char _Py_M__importlib[] = { 124,0,0,95,0,0,100,0,0,83,41,1,78,41,1,114, 177,0,0,0,41,2,114,71,0,0,0,114,177,0,0,0, 114,4,0,0,0,114,4,0,0,0,114,5,0,0,0,114, - 72,0,0,0,232,3,0,0,115,2,0,0,0,0,1,122, + 72,0,0,0,233,3,0,0,115,2,0,0,0,0,1,122, 21,95,83,112,101,99,77,101,116,104,111,100,115,46,95,95, 105,110,105,116,95,95,99,1,0,0,0,0,0,0,0,3, 0,0,0,3,0,0,0,67,0,0,0,115,158,0,0,0, @@ -1733,7 +1733,7 @@ const unsigned char _Py_M__importlib[] = { 0,114,169,0,0,0,114,47,0,0,0,114,226,0,0,0, 41,3,114,71,0,0,0,114,177,0,0,0,114,67,0,0, 0,114,4,0,0,0,114,4,0,0,0,114,5,0,0,0, - 114,205,0,0,0,235,3,0,0,115,18,0,0,0,0,3, + 114,205,0,0,0,236,3,0,0,115,18,0,0,0,0,3, 9,1,30,1,15,1,15,1,13,2,22,2,9,1,19,2, 122,24,95,83,112,101,99,77,101,116,104,111,100,115,46,109, 111,100,117,108,101,95,114,101,112,114,218,9,95,111,118,101, @@ -1824,7 +1824,7 @@ const unsigned char _Py_M__importlib[] = { 71,0,0,0,114,179,0,0,0,114,248,0,0,0,114,249, 0,0,0,114,177,0,0,0,114,169,0,0,0,114,4,0, 0,0,114,4,0,0,0,114,5,0,0,0,218,17,105,110, - 105,116,95,109,111,100,117,108,101,95,97,116,116,114,115,251, + 105,116,95,109,111,100,117,108,101,95,97,116,116,114,115,252, 3,0,0,115,88,0,0,0,0,17,9,6,12,1,24,1, 3,1,16,1,13,1,8,3,30,1,9,1,12,2,15,1, 15,1,18,1,3,1,13,1,13,1,8,3,30,1,3,1, @@ -1856,7 +1856,7 @@ const unsigned char _Py_M__importlib[] = { 0,0,114,68,0,0,0,114,67,0,0,0,114,254,0,0, 0,41,3,114,71,0,0,0,114,177,0,0,0,114,179,0, 0,0,114,4,0,0,0,114,4,0,0,0,114,5,0,0, - 0,218,6,99,114,101,97,116,101,75,4,0,0,115,16,0, + 0,218,6,99,114,101,97,116,101,76,4,0,0,115,16,0, 0,0,0,7,9,2,18,3,21,2,6,1,12,4,18,1, 13,1,122,19,95,83,112,101,99,77,101,116,104,111,100,115, 46,99,114,101,97,116,101,99,2,0,0,0,0,0,0,0, @@ -1878,7 +1878,7 @@ const unsigned char _Py_M__importlib[] = { 0,114,169,0,0,0,218,11,101,120,101,99,95,109,111,100, 117,108,101,41,2,114,71,0,0,0,114,179,0,0,0,114, 4,0,0,0,114,4,0,0,0,114,5,0,0,0,218,5, - 95,101,120,101,99,98,4,0,0,115,2,0,0,0,0,7, + 95,101,120,101,99,99,4,0,0,115,2,0,0,0,0,7, 122,18,95,83,112,101,99,77,101,116,104,111,100,115,46,95, 101,120,101,99,99,2,0,0,0,0,0,0,0,4,0,0, 0,11,0,0,0,67,0,0,0,115,17,1,0,0,124,0, @@ -1915,7 +1915,7 @@ const unsigned char _Py_M__importlib[] = { 111,100,117,108,101,114,2,1,0,0,41,4,114,71,0,0, 0,114,179,0,0,0,114,67,0,0,0,114,171,0,0,0, 114,4,0,0,0,114,4,0,0,0,114,5,0,0,0,114, - 175,0,0,0,108,4,0,0,115,32,0,0,0,0,2,12, + 175,0,0,0,109,4,0,0,115,32,0,0,0,0,2,12, 1,10,1,13,1,24,1,15,1,21,1,18,1,18,1,27, 2,19,1,4,1,19,1,21,4,22,2,19,1,122,17,95, 83,112,101,99,77,101,116,104,111,100,115,46,101,120,101,99, @@ -1948,7 +1948,7 @@ const unsigned char _Py_M__importlib[] = { 0,0,114,177,0,0,0,114,179,0,0,0,114,4,0,0, 0,114,4,0,0,0,114,5,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,132,4,0,0,115,42,0,0,0,0, + 97,116,105,98,108,101,133,4,0,0,115,42,0,0,0,0, 4,9,1,19,2,16,1,24,1,3,1,16,1,13,1,8, 1,24,1,3,4,12,1,15,1,32,1,13,1,8,1,24, 1,3,1,13,1,13,1,8,1,122,38,95,83,112,101,99, @@ -1975,7 +1975,7 @@ const unsigned char _Py_M__importlib[] = { 7,0,0,0,114,73,0,0,0,41,2,114,71,0,0,0, 114,179,0,0,0,114,4,0,0,0,114,4,0,0,0,114, 5,0,0,0,218,14,95,108,111,97,100,95,117,110,108,111, - 99,107,101,100,162,4,0,0,115,20,0,0,0,0,2,18, + 99,107,101,100,163,4,0,0,115,20,0,0,0,0,2,18, 2,21,1,13,2,12,1,13,1,18,1,18,1,30,3,19, 5,122,27,95,83,112,101,99,77,101,116,104,111,100,115,46, 95,108,111,97,100,95,117,110,108,111,99,107,101,100,99,1, @@ -2000,7 +2000,7 @@ const unsigned char _Py_M__importlib[] = { 106,0,0,0,114,3,1,0,0,114,103,0,0,0,114,177, 0,0,0,114,67,0,0,0,114,6,1,0,0,41,1,114, 71,0,0,0,114,4,0,0,0,114,4,0,0,0,114,5, - 0,0,0,114,176,0,0,0,185,4,0,0,115,6,0,0, + 0,0,0,114,176,0,0,0,186,4,0,0,115,6,0,0, 0,0,9,10,1,19,1,122,17,95,83,112,101,99,77,101, 116,104,111,100,115,46,108,111,97,100,78,41,13,114,57,0, 0,0,114,56,0,0,0,114,58,0,0,0,114,59,0,0, @@ -2008,7 +2008,7 @@ const unsigned char _Py_M__importlib[] = { 114,0,1,0,0,114,2,1,0,0,114,175,0,0,0,114, 5,1,0,0,114,6,1,0,0,114,176,0,0,0,114,4, 0,0,0,114,4,0,0,0,114,4,0,0,0,114,5,0, - 0,0,114,174,0,0,0,225,3,0,0,115,20,0,0,0, + 0,0,114,174,0,0,0,226,3,0,0,115,20,0,0,0, 12,3,6,4,12,3,12,16,24,80,12,23,12,10,12,24, 12,30,12,23,114,174,0,0,0,99,0,0,0,0,0,0, 0,0,0,0,0,0,5,0,0,0,64,0,0,0,115,181, @@ -2047,7 +2047,7 @@ const unsigned char _Py_M__importlib[] = { 60,109,111,100,117,108,101,32,123,33,114,125,32,40,98,117, 105,108,116,45,105,110,41,62,41,2,114,47,0,0,0,114, 57,0,0,0,41,1,114,179,0,0,0,114,4,0,0,0, - 114,4,0,0,0,114,5,0,0,0,114,205,0,0,0,210, + 114,4,0,0,0,114,5,0,0,0,114,205,0,0,0,211, 4,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, @@ -2061,7 +2061,7 @@ const unsigned char _Py_M__importlib[] = { 110,114,173,0,0,0,41,4,218,3,99,108,115,114,158,0, 0,0,114,35,0,0,0,218,6,116,97,114,103,101,116,114, 4,0,0,0,114,4,0,0,0,114,5,0,0,0,218,9, - 102,105,110,100,95,115,112,101,99,219,4,0,0,115,10,0, + 102,105,110,100,95,115,112,101,99,220,4,0,0,115,10,0, 0,0,0,2,12,1,4,1,15,1,19,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, @@ -2083,7 +2083,7 @@ const unsigned char _Py_M__importlib[] = { 114,10,1,0,0,114,169,0,0,0,41,4,114,8,1,0, 0,114,158,0,0,0,114,35,0,0,0,114,177,0,0,0, 114,4,0,0,0,114,4,0,0,0,114,5,0,0,0,218, - 11,102,105,110,100,95,109,111,100,117,108,101,228,4,0,0, + 11,102,105,110,100,95,109,111,100,117,108,101,229,4,0,0, 115,4,0,0,0,0,9,18,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,3, @@ -2098,7 +2098,7 @@ const unsigned char _Py_M__importlib[] = { 110,105,116,95,98,117,105,108,116,105,110,114,204,0,0,0, 114,250,0,0,0,41,3,114,8,1,0,0,114,158,0,0, 0,114,179,0,0,0,114,4,0,0,0,114,4,0,0,0, - 114,5,0,0,0,114,4,1,0,0,240,4,0,0,115,10, + 114,5,0,0,0,114,4,1,0,0,241,4,0,0,115,10, 0,0,0,0,6,13,1,24,1,9,1,9,1,122,27,66, 117,105,108,116,105,110,73,109,112,111,114,116,101,114,46,108, 111,97,100,95,109,111,100,117,108,101,99,2,0,0,0,0, @@ -2110,7 +2110,7 @@ const unsigned char _Py_M__importlib[] = { 101,99,116,115,46,78,114,4,0,0,0,41,2,114,8,1, 0,0,114,158,0,0,0,114,4,0,0,0,114,4,0,0, 0,114,5,0,0,0,218,8,103,101,116,95,99,111,100,101, - 252,4,0,0,115,2,0,0,0,0,4,122,24,66,117,105, + 253,4,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,2,0, 0,0,1,0,0,0,67,0,0,0,115,4,0,0,0,100, @@ -2120,7 +2120,7 @@ const unsigned char _Py_M__importlib[] = { 118,101,32,115,111,117,114,99,101,32,99,111,100,101,46,78, 114,4,0,0,0,41,2,114,8,1,0,0,114,158,0,0, 0,114,4,0,0,0,114,4,0,0,0,114,5,0,0,0, - 218,10,103,101,116,95,115,111,117,114,99,101,2,5,0,0, + 218,10,103,101,116,95,115,111,117,114,99,101,3,5,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,2,0,0,0, @@ -2130,7 +2130,7 @@ const unsigned char _Py_M__importlib[] = { 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,4,0,0,0,41, 2,114,8,1,0,0,114,158,0,0,0,114,4,0,0,0, - 114,4,0,0,0,114,5,0,0,0,114,219,0,0,0,8, + 114,4,0,0,0,114,5,0,0,0,114,219,0,0,0,9, 5,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,14,114,57,0,0,0,114,56,0, @@ -2140,7 +2140,7 @@ const unsigned char _Py_M__importlib[] = { 0,114,11,1,0,0,114,161,0,0,0,114,4,1,0,0, 114,12,1,0,0,114,13,1,0,0,114,219,0,0,0,114, 4,0,0,0,114,4,0,0,0,114,4,0,0,0,114,5, - 0,0,0,114,7,1,0,0,201,4,0,0,115,28,0,0, + 0,0,0,114,7,1,0,0,202,4,0,0,115,28,0,0, 0,12,7,6,2,18,9,3,1,21,8,3,1,18,11,3, 1,21,11,3,1,21,5,3,1,21,5,3,1,114,7,1, 0,0,99,0,0,0,0,0,0,0,0,0,0,0,0,5, @@ -2180,7 +2180,7 @@ const unsigned char _Py_M__importlib[] = { 122,22,60,109,111,100,117,108,101,32,123,33,114,125,32,40, 102,114,111,122,101,110,41,62,41,2,114,47,0,0,0,114, 57,0,0,0,41,1,218,1,109,114,4,0,0,0,114,4, - 0,0,0,114,5,0,0,0,114,205,0,0,0,24,5,0, + 0,0,0,114,5,0,0,0,114,205,0,0,0,25,5,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,4,0, @@ -2192,7 +2192,7 @@ const unsigned char _Py_M__importlib[] = { 114,162,0,0,0,114,173,0,0,0,41,4,114,8,1,0, 0,114,158,0,0,0,114,35,0,0,0,114,9,1,0,0, 114,4,0,0,0,114,4,0,0,0,114,5,0,0,0,114, - 10,1,0,0,33,5,0,0,115,6,0,0,0,0,2,15, + 10,1,0,0,34,5,0,0,115,6,0,0,0,0,2,15, 1,19,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,3,0,0,0,2,0,0,0,67,0, @@ -2207,7 +2207,7 @@ const unsigned char _Py_M__importlib[] = { 41,2,114,106,0,0,0,114,162,0,0,0,41,3,114,8, 1,0,0,114,158,0,0,0,114,35,0,0,0,114,4,0, 0,0,114,4,0,0,0,114,5,0,0,0,114,11,1,0, - 0,40,5,0,0,115,2,0,0,0,0,7,122,26,70,114, + 0,41,5,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,1,0,0,0,0,0,0, 0,3,0,0,0,4,0,0,0,67,0,0,0,115,95,0, @@ -2225,7 +2225,7 @@ const unsigned char _Py_M__importlib[] = { 95,102,114,111,122,101,110,95,111,98,106,101,99,116,114,175, 0,0,0,114,63,0,0,0,41,3,114,179,0,0,0,114, 67,0,0,0,114,194,0,0,0,114,4,0,0,0,114,4, - 0,0,0,114,5,0,0,0,114,1,1,0,0,49,5,0, + 0,0,0,114,5,0,0,0,114,1,1,0,0,50,5,0, 0,115,12,0,0,0,0,2,12,1,15,1,18,1,12,1, 18,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, @@ -2239,7 +2239,7 @@ const unsigned char _Py_M__importlib[] = { 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,180,0,0,0,41, 2,114,8,1,0,0,114,158,0,0,0,114,4,0,0,0, - 114,4,0,0,0,114,5,0,0,0,114,4,1,0,0,58, + 114,4,0,0,0,114,5,0,0,0,114,4,1,0,0,59, 5,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,2, @@ -2250,7 +2250,7 @@ const unsigned char _Py_M__importlib[] = { 102,114,111,122,101,110,32,109,111,100,117,108,101,46,41,2, 114,106,0,0,0,114,18,1,0,0,41,2,114,8,1,0, 0,114,158,0,0,0,114,4,0,0,0,114,4,0,0,0, - 114,5,0,0,0,114,12,1,0,0,67,5,0,0,115,2, + 114,5,0,0,0,114,12,1,0,0,68,5,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,2,0,0,0,1,0,0,0,67, @@ -2260,7 +2260,7 @@ const unsigned char _Py_M__importlib[] = { 32,110,111,116,32,104,97,118,101,32,115,111,117,114,99,101, 32,99,111,100,101,46,78,114,4,0,0,0,41,2,114,8, 1,0,0,114,158,0,0,0,114,4,0,0,0,114,4,0, - 0,0,114,5,0,0,0,114,13,1,0,0,73,5,0,0, + 0,0,114,5,0,0,0,114,13,1,0,0,74,5,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,2,0,0,0,2, @@ -2272,7 +2272,7 @@ const unsigned char _Py_M__importlib[] = { 0,0,90,17,105,115,95,102,114,111,122,101,110,95,112,97, 99,107,97,103,101,41,2,114,8,1,0,0,114,158,0,0, 0,114,4,0,0,0,114,4,0,0,0,114,5,0,0,0, - 114,219,0,0,0,79,5,0,0,115,2,0,0,0,0,4, + 114,219,0,0,0,80,5,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,15,114,57,0, 0,0,114,56,0,0,0,114,58,0,0,0,114,59,0,0, @@ -2281,7 +2281,7 @@ const unsigned char _Py_M__importlib[] = { 4,1,0,0,114,164,0,0,0,114,12,1,0,0,114,13, 1,0,0,114,219,0,0,0,114,4,0,0,0,114,4,0, 0,0,114,4,0,0,0,114,5,0,0,0,114,16,1,0, - 0,15,5,0,0,115,28,0,0,0,12,7,6,2,18,9, + 0,16,5,0,0,115,28,0,0,0,12,7,6,2,18,9, 3,1,21,6,3,1,18,8,18,9,18,9,3,1,21,5, 3,1,21,5,3,1,114,16,1,0,0,99,0,0,0,0, 0,0,0,0,0,0,0,0,5,0,0,0,64,0,0,0, @@ -2319,7 +2319,7 @@ const unsigned char _Py_M__importlib[] = { 95,77,65,67,72,73,78,69,41,2,114,8,1,0,0,218, 3,107,101,121,114,4,0,0,0,114,4,0,0,0,114,5, 0,0,0,218,14,95,111,112,101,110,95,114,101,103,105,115, - 116,114,121,98,5,0,0,115,8,0,0,0,0,2,3,1, + 116,114,121,99,5,0,0,115,8,0,0,0,0,2,3,1, 23,1,13,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, @@ -2346,7 +2346,7 @@ const unsigned char _Py_M__importlib[] = { 4,104,107,101,121,218,8,102,105,108,101,112,97,116,104,114, 4,0,0,0,114,4,0,0,0,114,5,0,0,0,218,16, 95,115,101,97,114,99,104,95,114,101,103,105,115,116,114,121, - 105,5,0,0,115,22,0,0,0,0,2,9,1,12,2,9, + 106,5,0,0,115,22,0,0,0,0,2,9,1,12,2,9, 1,15,1,22,1,3,1,18,1,28,1,13,1,9,1,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, @@ -2368,7 +2368,7 @@ const unsigned char _Py_M__importlib[] = { 0,114,158,0,0,0,114,35,0,0,0,114,9,1,0,0, 114,27,1,0,0,114,169,0,0,0,114,127,0,0,0,114, 177,0,0,0,114,4,0,0,0,114,4,0,0,0,114,5, - 0,0,0,114,10,1,0,0,120,5,0,0,115,24,0,0, + 0,0,0,114,10,1,0,0,121,5,0,0,115,24,0,0, 0,0,2,15,1,12,1,4,1,3,1,14,1,13,1,9, 1,22,1,21,1,21,1,9,1,122,31,87,105,110,100,111, 119,115,82,101,103,105,115,116,114,121,70,105,110,100,101,114, @@ -2387,7 +2387,7 @@ const unsigned char _Py_M__importlib[] = { 32,78,41,2,114,10,1,0,0,114,169,0,0,0,41,4, 114,8,1,0,0,114,158,0,0,0,114,35,0,0,0,114, 177,0,0,0,114,4,0,0,0,114,4,0,0,0,114,5, - 0,0,0,114,11,1,0,0,135,5,0,0,115,8,0,0, + 0,0,0,114,11,1,0,0,136,5,0,0,115,8,0,0, 0,0,7,18,1,12,1,7,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,12,114,57, @@ -2396,7 +2396,7 @@ const unsigned char _Py_M__importlib[] = { 0,114,15,1,0,0,114,22,1,0,0,114,28,1,0,0, 114,10,1,0,0,114,11,1,0,0,114,4,0,0,0,114, 4,0,0,0,114,4,0,0,0,114,5,0,0,0,114,19, - 1,0,0,86,5,0,0,115,20,0,0,0,12,2,6,3, + 1,0,0,87,5,0,0,115,20,0,0,0,12,2,6,3, 6,3,6,2,6,2,18,7,18,15,3,1,21,14,3,1, 114,19,1,0,0,99,0,0,0,0,0,0,0,0,0,0, 0,0,2,0,0,0,64,0,0,0,115,52,0,0,0,101, @@ -2432,7 +2432,7 @@ const unsigned char _Py_M__importlib[] = { 0,0,114,158,0,0,0,114,131,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,4,0,0,0,114,4,0,0,0, - 114,5,0,0,0,114,219,0,0,0,154,5,0,0,115,8, + 114,5,0,0,0,114,219,0,0,0,155,5,0,0,115,8, 0,0,0,0,3,25,1,22,1,19,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,3,0, @@ -2451,14 +2451,14 @@ const unsigned char _Py_M__importlib[] = { 0,0,0,114,114,0,0,0,114,175,0,0,0,114,63,0, 0,0,41,3,114,71,0,0,0,114,179,0,0,0,114,194, 0,0,0,114,4,0,0,0,114,4,0,0,0,114,5,0, - 0,0,114,1,1,0,0,162,5,0,0,115,10,0,0,0, + 0,0,114,1,1,0,0,163,5,0,0,115,10,0,0,0, 0,2,18,1,12,1,3,1,24,1,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,78,41,8,114,57,0,0,0,114,56,0, 0,0,114,58,0,0,0,114,59,0,0,0,114,219,0,0, 0,114,1,1,0,0,114,180,0,0,0,114,4,1,0,0, 114,4,0,0,0,114,4,0,0,0,114,4,0,0,0,114, - 5,0,0,0,114,29,1,0,0,149,5,0,0,115,8,0, + 5,0,0,0,114,29,1,0,0,150,5,0,0,115,8,0, 0,0,12,3,6,2,12,8,12,8,114,29,1,0,0,99, 0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0, 64,0,0,0,115,106,0,0,0,101,0,0,90,1,0,100, @@ -2486,7 +2486,7 @@ const unsigned char _Py_M__importlib[] = { 218,7,73,79,69,114,114,111,114,41,2,114,71,0,0,0, 114,35,0,0,0,114,4,0,0,0,114,4,0,0,0,114, 5,0,0,0,218,10,112,97,116,104,95,109,116,105,109,101, - 175,5,0,0,115,2,0,0,0,0,6,122,23,83,111,117, + 176,5,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,2,0,0, 0,3,0,0,0,67,0,0,0,115,20,0,0,0,105,1, @@ -2521,7 +2521,7 @@ const unsigned char _Py_M__importlib[] = { 32,32,32,114,183,0,0,0,41,1,114,32,1,0,0,41, 2,114,71,0,0,0,114,35,0,0,0,114,4,0,0,0, 114,4,0,0,0,114,5,0,0,0,218,10,112,97,116,104, - 95,115,116,97,116,115,183,5,0,0,115,2,0,0,0,0, + 95,115,116,97,116,115,184,5,0,0,115,2,0,0,0,0, 11,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,4,0,0,0,3,0,0,0,67,0,0,0,115, @@ -2545,7 +2545,7 @@ const unsigned char _Py_M__importlib[] = { 141,0,0,0,90,10,99,97,99,104,101,95,112,97,116,104, 114,53,0,0,0,114,4,0,0,0,114,4,0,0,0,114, 5,0,0,0,218,15,95,99,97,99,104,101,95,98,121,116, - 101,99,111,100,101,196,5,0,0,115,2,0,0,0,0,8, + 101,99,111,100,101,197,5,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,3,0,0,0,1,0,0,0,67, @@ -2562,7 +2562,7 @@ const unsigned char _Py_M__importlib[] = { 32,32,32,32,32,32,78,114,4,0,0,0,41,3,114,71, 0,0,0,114,35,0,0,0,114,53,0,0,0,114,4,0, 0,0,114,4,0,0,0,114,5,0,0,0,114,34,1,0, - 0,206,5,0,0,115,0,0,0,0,122,21,83,111,117,114, + 0,207,5,0,0,115,0,0,0,0,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,5,0,0,0,16,0, 0,0,67,0,0,0,115,105,0,0,0,124,0,0,106,0, @@ -2583,7 +2583,7 @@ const unsigned char _Py_M__importlib[] = { 0,114,153,0,0,0,114,203,0,0,0,41,5,114,71,0, 0,0,114,158,0,0,0,114,35,0,0,0,114,201,0,0, 0,218,3,101,120,99,114,4,0,0,0,114,4,0,0,0, - 114,5,0,0,0,114,13,1,0,0,213,5,0,0,115,14, + 114,5,0,0,0,114,13,1,0,0,214,5,0,0,115,14, 0,0,0,0,2,15,1,3,1,19,1,18,1,9,1,31, 1,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,218,9,95,111,112,116, @@ -2605,7 +2605,7 @@ const unsigned char _Py_M__importlib[] = { 108,101,41,4,114,71,0,0,0,114,53,0,0,0,114,35, 0,0,0,114,38,1,0,0,114,4,0,0,0,114,4,0, 0,0,114,5,0,0,0,218,14,115,111,117,114,99,101,95, - 116,111,95,99,111,100,101,223,5,0,0,115,4,0,0,0, + 116,111,95,99,111,100,101,224,5,0,0,115,4,0,0,0, 0,5,18,1,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,10,0,0,0,45,0, @@ -2666,7 +2666,7 @@ const unsigned char _Py_M__importlib[] = { 0,0,218,10,98,121,116,101,115,95,100,97,116,97,114,201, 0,0,0,90,11,99,111,100,101,95,111,98,106,101,99,116, 114,4,0,0,0,114,4,0,0,0,114,5,0,0,0,114, - 12,1,0,0,231,5,0,0,115,78,0,0,0,0,7,15, + 12,1,0,0,232,5,0,0,115,78,0,0,0,0,7,15, 1,6,1,3,1,16,1,13,1,11,2,3,1,19,1,13, 1,5,2,16,1,3,1,19,1,13,1,5,2,3,1,9, 1,12,1,13,1,19,1,5,2,9,1,7,1,15,1,6, @@ -2678,7 +2678,7 @@ const unsigned char _Py_M__importlib[] = { 1,0,0,114,35,1,0,0,114,34,1,0,0,114,13,1, 0,0,114,41,1,0,0,114,12,1,0,0,114,4,0,0, 0,114,4,0,0,0,114,4,0,0,0,114,5,0,0,0, - 114,30,1,0,0,173,5,0,0,115,14,0,0,0,12,2, + 114,30,1,0,0,174,5,0,0,115,14,0,0,0,12,2, 12,8,12,13,12,10,12,7,12,10,18,8,114,30,1,0, 0,99,0,0,0,0,0,0,0,0,0,0,0,0,4,0, 0,0,0,0,0,0,115,112,0,0,0,101,0,0,90,1, @@ -2707,7 +2707,7 @@ const unsigned char _Py_M__importlib[] = { 46,78,41,2,114,67,0,0,0,114,35,0,0,0,41,3, 114,71,0,0,0,114,158,0,0,0,114,35,0,0,0,114, 4,0,0,0,114,4,0,0,0,114,5,0,0,0,114,72, - 0,0,0,32,6,0,0,115,4,0,0,0,0,3,9,1, + 0,0,0,33,6,0,0,115,4,0,0,0,0,3,9,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,2,0, 0,0,3,0,0,0,67,0,0,0,115,34,0,0,0,124, @@ -2716,7 +2716,7 @@ const unsigned char _Py_M__importlib[] = { 83,41,1,78,41,2,114,224,0,0,0,114,63,0,0,0, 41,2,114,71,0,0,0,114,227,0,0,0,114,4,0,0, 0,114,4,0,0,0,114,5,0,0,0,114,229,0,0,0, - 38,6,0,0,115,4,0,0,0,0,1,18,1,122,17,70, + 39,6,0,0,115,4,0,0,0,0,1,18,1,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,1,0,0,0,3,0,0, 0,67,0,0,0,115,26,0,0,0,116,0,0,124,0,0, @@ -2724,7 +2724,7 @@ const unsigned char _Py_M__importlib[] = { 1,0,65,83,41,1,78,41,3,218,4,104,97,115,104,114, 67,0,0,0,114,35,0,0,0,41,1,114,71,0,0,0, 114,4,0,0,0,114,4,0,0,0,114,5,0,0,0,218, - 8,95,95,104,97,115,104,95,95,42,6,0,0,115,2,0, + 8,95,95,104,97,115,104,95,95,43,6,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,2,0,0,0,3,0,0,0,3,0,0,0,115,22, @@ -2739,7 +2739,7 @@ const unsigned char _Py_M__importlib[] = { 32,41,3,218,5,115,117,112,101,114,114,45,1,0,0,114, 4,1,0,0,41,2,114,71,0,0,0,114,158,0,0,0, 41,1,114,224,0,0,0,114,4,0,0,0,114,5,0,0, - 0,114,4,1,0,0,45,6,0,0,115,2,0,0,0,0, + 0,114,4,1,0,0,46,6,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,2,0,0,0,1,0,0,0,67,0,0,0,115,7, @@ -2749,7 +2749,7 @@ const unsigned char _Py_M__importlib[] = { 32,97,115,32,102,111,117,110,100,32,98,121,32,116,104,101, 32,102,105,110,100,101,114,46,41,1,114,35,0,0,0,41, 2,114,71,0,0,0,114,158,0,0,0,114,4,0,0,0, - 114,4,0,0,0,114,5,0,0,0,114,238,0,0,0,57, + 114,4,0,0,0,114,5,0,0,0,114,238,0,0,0,58, 6,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,3,0,0,0, @@ -2762,7 +2762,7 @@ const unsigned char _Py_M__importlib[] = { 46,218,1,114,78,41,3,114,49,0,0,0,114,50,0,0, 0,90,4,114,101,97,100,41,3,114,71,0,0,0,114,35, 0,0,0,114,54,0,0,0,114,4,0,0,0,114,4,0, - 0,0,114,5,0,0,0,114,36,1,0,0,62,6,0,0, + 0,0,114,5,0,0,0,114,36,1,0,0,63,6,0,0, 115,4,0,0,0,0,2,21,1,122,19,70,105,108,101,76, 111,97,100,101,114,46,103,101,116,95,100,97,116,97,41,11, 114,57,0,0,0,114,56,0,0,0,114,58,0,0,0,114, @@ -2770,7 +2770,7 @@ const unsigned char _Py_M__importlib[] = { 1,0,0,114,156,0,0,0,114,4,1,0,0,114,238,0, 0,0,114,36,1,0,0,114,4,0,0,0,114,4,0,0, 0,41,1,114,224,0,0,0,114,5,0,0,0,114,45,1, - 0,0,27,6,0,0,115,14,0,0,0,12,3,6,2,12, + 0,0,28,6,0,0,115,14,0,0,0,12,3,6,2,12, 6,12,4,12,3,24,12,18,5,114,45,1,0,0,99,0, 0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,64, 0,0,0,115,64,0,0,0,101,0,0,90,1,0,100,0, @@ -2793,7 +2793,7 @@ const unsigned char _Py_M__importlib[] = { 218,8,115,116,95,109,116,105,109,101,90,7,115,116,95,115, 105,122,101,41,3,114,71,0,0,0,114,35,0,0,0,114, 43,1,0,0,114,4,0,0,0,114,4,0,0,0,114,5, - 0,0,0,114,33,1,0,0,72,6,0,0,115,4,0,0, + 0,0,0,114,33,1,0,0,73,6,0,0,115,4,0,0, 0,0,2,12,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,5,0,0,0,5, @@ -2804,7 +2804,7 @@ const unsigned char _Py_M__importlib[] = { 34,1,0,0,41,5,114,71,0,0,0,114,141,0,0,0, 114,140,0,0,0,114,53,0,0,0,114,42,0,0,0,114, 4,0,0,0,114,4,0,0,0,114,5,0,0,0,114,35, - 1,0,0,77,6,0,0,115,4,0,0,0,0,2,12,1, + 1,0,0,78,6,0,0,115,4,0,0,0,0,2,12,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,52,1,0,0,105,182,1,0,0,99,3,0,0, @@ -2842,7 +2842,7 @@ const unsigned char _Py_M__importlib[] = { 1,0,0,114,233,0,0,0,114,131,0,0,0,114,27,0, 0,0,114,23,0,0,0,114,37,1,0,0,114,4,0,0, 0,114,4,0,0,0,114,5,0,0,0,114,34,1,0,0, - 82,6,0,0,115,38,0,0,0,0,2,18,1,6,2,22, + 83,6,0,0,115,38,0,0,0,0,2,18,1,6,2,22, 1,18,1,17,2,19,1,15,1,3,1,17,1,13,2,7, 1,18,3,16,1,27,1,3,1,16,1,17,1,18,2,122, 25,83,111,117,114,99,101,70,105,108,101,76,111,97,100,101, @@ -2850,7 +2850,7 @@ const unsigned char _Py_M__importlib[] = { 0,0,114,56,0,0,0,114,58,0,0,0,114,59,0,0, 0,114,33,1,0,0,114,35,1,0,0,114,34,1,0,0, 114,4,0,0,0,114,4,0,0,0,114,4,0,0,0,114, - 5,0,0,0,114,50,1,0,0,68,6,0,0,115,8,0, + 5,0,0,0,114,50,1,0,0,69,6,0,0,115,8,0, 0,0,12,2,6,2,12,5,12,5,114,50,1,0,0,99, 0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0, 64,0,0,0,115,46,0,0,0,101,0,0,90,1,0,100, @@ -2872,7 +2872,7 @@ const unsigned char _Py_M__importlib[] = { 0,0,114,190,0,0,0,114,195,0,0,0,41,5,114,71, 0,0,0,114,158,0,0,0,114,35,0,0,0,114,53,0, 0,0,114,44,1,0,0,114,4,0,0,0,114,4,0,0, - 0,114,5,0,0,0,114,12,1,0,0,115,6,0,0,115, + 0,114,5,0,0,0,114,12,1,0,0,116,6,0,0,115, 8,0,0,0,0,1,15,1,15,1,24,1,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, @@ -2882,14 +2882,14 @@ const unsigned char _Py_M__importlib[] = { 101,32,105,115,32,110,111,32,115,111,117,114,99,101,32,99, 111,100,101,46,78,114,4,0,0,0,41,2,114,71,0,0, 0,114,158,0,0,0,114,4,0,0,0,114,4,0,0,0, - 114,5,0,0,0,114,13,1,0,0,121,6,0,0,115,2, + 114,5,0,0,0,114,13,1,0,0,122,6,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,57,0,0,0,114,56, 0,0,0,114,58,0,0,0,114,59,0,0,0,114,12,1, 0,0,114,13,1,0,0,114,4,0,0,0,114,4,0,0, 0,114,4,0,0,0,114,5,0,0,0,114,54,1,0,0, - 111,6,0,0,115,6,0,0,0,12,2,6,2,12,6,114, + 112,6,0,0,115,6,0,0,0,12,2,6,2,12,6,114, 54,1,0,0,99,0,0,0,0,0,0,0,0,0,0,0, 0,3,0,0,0,64,0,0,0,115,130,0,0,0,101,0, 0,90,1,0,100,0,0,90,2,0,100,1,0,90,3,0, @@ -2913,7 +2913,7 @@ const unsigned char _Py_M__importlib[] = { 1,0,100,0,0,83,41,1,78,41,2,114,67,0,0,0, 114,35,0,0,0,41,3,114,71,0,0,0,114,67,0,0, 0,114,35,0,0,0,114,4,0,0,0,114,4,0,0,0, - 114,5,0,0,0,114,72,0,0,0,138,6,0,0,115,4, + 114,5,0,0,0,114,72,0,0,0,139,6,0,0,115,4, 0,0,0,0,1,9,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,2,0, @@ -2923,7 +2923,7 @@ const unsigned char _Py_M__importlib[] = { 83,41,1,78,41,2,114,224,0,0,0,114,63,0,0,0, 41,2,114,71,0,0,0,114,227,0,0,0,114,4,0,0, 0,114,4,0,0,0,114,5,0,0,0,114,229,0,0,0, - 142,6,0,0,115,4,0,0,0,0,1,18,1,122,26,69, + 143,6,0,0,115,4,0,0,0,0,1,18,1,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,1,0,0,0,3,0,0,0,67,0,0,0,115,26, @@ -2931,7 +2931,7 @@ const unsigned char _Py_M__importlib[] = { 0,0,124,0,0,106,2,0,131,1,0,65,83,41,1,78, 41,3,114,46,1,0,0,114,67,0,0,0,114,35,0,0, 0,41,1,114,71,0,0,0,114,4,0,0,0,114,4,0, - 0,0,114,5,0,0,0,114,47,1,0,0,146,6,0,0, + 0,0,114,5,0,0,0,114,47,1,0,0,147,6,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,4,0, @@ -2960,7 +2960,7 @@ const unsigned char _Py_M__importlib[] = { 0,0,114,32,0,0,0,41,4,114,71,0,0,0,114,158, 0,0,0,114,179,0,0,0,114,219,0,0,0,114,4,0, 0,0,114,4,0,0,0,114,5,0,0,0,114,4,1,0, - 0,149,6,0,0,115,24,0,0,0,0,5,13,1,9,1, + 0,150,6,0,0,115,24,0,0,0,0,5,13,1,9,1, 21,1,16,1,15,1,22,1,28,1,9,1,12,1,6,1, 28,1,122,31,69,120,116,101,110,115,105,111,110,70,105,108, 101,76,111,97,100,101,114,46,108,111,97,100,95,109,111,100, @@ -2979,7 +2979,7 @@ const unsigned char _Py_M__importlib[] = { 41,2,114,72,0,0,0,78,114,4,0,0,0,41,2,114, 22,0,0,0,218,6,115,117,102,102,105,120,41,1,218,9, 102,105,108,101,95,110,97,109,101,114,4,0,0,0,114,5, - 0,0,0,114,77,0,0,0,170,6,0,0,115,2,0,0, + 0,0,0,114,77,0,0,0,171,6,0,0,115,2,0,0, 0,6,1,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, @@ -2987,7 +2987,7 @@ const unsigned char _Py_M__importlib[] = { 0,0,114,78,0,0,0,218,18,69,88,84,69,78,83,73, 79,78,95,83,85,70,70,73,88,69,83,41,2,114,71,0, 0,0,114,158,0,0,0,114,4,0,0,0,41,1,114,57, - 1,0,0,114,5,0,0,0,114,219,0,0,0,167,6,0, + 1,0,0,114,5,0,0,0,114,219,0,0,0,168,6,0, 0,115,6,0,0,0,0,2,19,1,18,1,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, @@ -2999,7 +2999,7 @@ const unsigned char _Py_M__importlib[] = { 32,99,111,100,101,32,111,98,106,101,99,116,46,78,114,4, 0,0,0,41,2,114,71,0,0,0,114,158,0,0,0,114, 4,0,0,0,114,4,0,0,0,114,5,0,0,0,114,12, - 1,0,0,173,6,0,0,115,2,0,0,0,0,2,122,28, + 1,0,0,174,6,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,2,0,0,0,1,0,0,0,67,0,0, @@ -3009,7 +3009,7 @@ const unsigned char _Py_M__importlib[] = { 97,118,101,32,110,111,32,115,111,117,114,99,101,32,99,111, 100,101,46,78,114,4,0,0,0,41,2,114,71,0,0,0, 114,158,0,0,0,114,4,0,0,0,114,4,0,0,0,114, - 5,0,0,0,114,13,1,0,0,177,6,0,0,115,2,0, + 5,0,0,0,114,13,1,0,0,178,6,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,2,0,0, @@ -3020,7 +3020,7 @@ const unsigned char _Py_M__importlib[] = { 111,117,110,100,32,98,121,32,116,104,101,32,102,105,110,100, 101,114,46,41,1,114,35,0,0,0,41,2,114,71,0,0, 0,114,158,0,0,0,114,4,0,0,0,114,4,0,0,0, - 114,5,0,0,0,114,238,0,0,0,181,6,0,0,115,2, + 114,5,0,0,0,114,238,0,0,0,182,6,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,13,114,57,0,0,0,114, @@ -3029,7 +3029,7 @@ const unsigned char _Py_M__importlib[] = { 0,0,114,4,1,0,0,114,219,0,0,0,114,12,1,0, 0,114,13,1,0,0,114,238,0,0,0,114,4,0,0,0, 114,4,0,0,0,114,4,0,0,0,114,5,0,0,0,114, - 55,1,0,0,130,6,0,0,115,18,0,0,0,12,6,6, + 55,1,0,0,131,6,0,0,115,18,0,0,0,12,6,6, 2,12,4,12,4,12,3,18,18,12,6,12,4,12,4,114, 55,1,0,0,99,0,0,0,0,0,0,0,0,0,0,0, 0,2,0,0,0,64,0,0,0,115,130,0,0,0,101,0, @@ -3073,7 +3073,7 @@ const unsigned char _Py_M__importlib[] = { 101,114,41,4,114,71,0,0,0,114,67,0,0,0,114,35, 0,0,0,218,11,112,97,116,104,95,102,105,110,100,101,114, 114,4,0,0,0,114,4,0,0,0,114,5,0,0,0,114, - 72,0,0,0,194,6,0,0,115,8,0,0,0,0,1,9, + 72,0,0,0,195,6,0,0,115,8,0,0,0,0,1,9, 1,9,1,21,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,4,0,0,0,3,0,0,0,67, @@ -3091,7 +3091,7 @@ const unsigned char _Py_M__importlib[] = { 0,41,4,114,71,0,0,0,114,233,0,0,0,218,3,100, 111,116,114,94,0,0,0,114,4,0,0,0,114,4,0,0, 0,114,5,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,200, + 114,101,110,116,95,112,97,116,104,95,110,97,109,101,115,201, 6,0,0,115,8,0,0,0,0,2,27,1,12,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, @@ -3105,7 +3105,7 @@ const unsigned char _Py_M__importlib[] = { 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,4,0,0, 0,114,4,0,0,0,114,5,0,0,0,114,60,1,0,0, - 210,6,0,0,115,4,0,0,0,0,1,18,1,122,31,95, + 211,6,0,0,115,4,0,0,0,0,1,18,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,3,0,0,0,3,0,0,0,67, @@ -3123,7 +3123,7 @@ const unsigned char _Py_M__importlib[] = { 253,0,0,0,41,3,114,71,0,0,0,90,11,112,97,114, 101,110,116,95,112,97,116,104,114,177,0,0,0,114,4,0, 0,0,114,4,0,0,0,114,5,0,0,0,218,12,95,114, - 101,99,97,108,99,117,108,97,116,101,214,6,0,0,115,16, + 101,99,97,108,99,117,108,97,116,101,215,6,0,0,115,16, 0,0,0,0,2,18,1,15,1,21,3,27,1,9,1,18, 1,12,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, @@ -3132,7 +3132,7 @@ const unsigned char _Py_M__importlib[] = { 106,1,0,131,0,0,131,1,0,83,41,1,78,41,2,218, 4,105,116,101,114,114,66,1,0,0,41,1,114,71,0,0, 0,114,4,0,0,0,114,4,0,0,0,114,5,0,0,0, - 218,8,95,95,105,116,101,114,95,95,227,6,0,0,115,2, + 218,8,95,95,105,116,101,114,95,95,228,6,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,1, 0,0,0,0,0,0,0,1,0,0,0,2,0,0,0,67, @@ -3140,7 +3140,7 @@ const unsigned char _Py_M__importlib[] = { 0,131,0,0,131,1,0,83,41,1,78,41,2,114,31,0, 0,0,114,66,1,0,0,41,1,114,71,0,0,0,114,4, 0,0,0,114,4,0,0,0,114,5,0,0,0,218,7,95, - 95,108,101,110,95,95,230,6,0,0,115,2,0,0,0,0, + 95,108,101,110,95,95,231,6,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,1,0,0,0,2,0,0,0,67,0,0,0,115,16, @@ -3149,7 +3149,7 @@ const unsigned char _Py_M__importlib[] = { 99,101,80,97,116,104,40,123,33,114,125,41,41,2,114,47, 0,0,0,114,253,0,0,0,41,1,114,71,0,0,0,114, 4,0,0,0,114,4,0,0,0,114,5,0,0,0,114,101, - 0,0,0,233,6,0,0,115,2,0,0,0,0,1,122,23, + 0,0,0,234,6,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, 2,0,0,0,2,0,0,0,67,0,0,0,115,16,0,0, @@ -3157,7 +3157,7 @@ const unsigned char _Py_M__importlib[] = { 83,41,1,78,41,1,114,66,1,0,0,41,2,114,71,0, 0,0,218,4,105,116,101,109,114,4,0,0,0,114,4,0, 0,0,114,5,0,0,0,218,12,95,95,99,111,110,116,97, - 105,110,115,95,95,236,6,0,0,115,2,0,0,0,0,1, + 105,110,115,95,95,237,6,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,2,0,0,0,2,0,0,0,67,0, @@ -3165,7 +3165,7 @@ const unsigned char _Py_M__importlib[] = { 124,1,0,131,1,0,1,100,0,0,83,41,1,78,41,2, 114,253,0,0,0,114,223,0,0,0,41,2,114,71,0,0, 0,114,70,1,0,0,114,4,0,0,0,114,4,0,0,0, - 114,5,0,0,0,114,223,0,0,0,239,6,0,0,115,2, + 114,5,0,0,0,114,223,0,0,0,240,6,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,13,114, 57,0,0,0,114,56,0,0,0,114,58,0,0,0,114,59, @@ -3173,7 +3173,7 @@ const unsigned char _Py_M__importlib[] = { 0,0,114,66,1,0,0,114,68,1,0,0,114,69,1,0, 0,114,101,0,0,0,114,71,1,0,0,114,223,0,0,0, 114,4,0,0,0,114,4,0,0,0,114,4,0,0,0,114, - 5,0,0,0,114,59,1,0,0,187,6,0,0,115,20,0, + 5,0,0,0,114,59,1,0,0,188,6,0,0,115,20,0, 0,0,12,5,6,2,12,6,12,10,12,4,12,13,12,3, 12,3,12,3,12,3,114,59,1,0,0,99,0,0,0,0, 0,0,0,0,0,0,0,0,3,0,0,0,64,0,0,0, @@ -3191,7 +3191,7 @@ const unsigned char _Py_M__importlib[] = { 1,0,0,114,253,0,0,0,41,4,114,71,0,0,0,114, 67,0,0,0,114,35,0,0,0,114,63,1,0,0,114,4, 0,0,0,114,4,0,0,0,114,5,0,0,0,114,72,0, - 0,0,245,6,0,0,115,2,0,0,0,0,1,122,25,95, + 0,0,246,6,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,2,0,0,0,2,0,0,0,67,0,0,0,115,16,0, @@ -3208,21 +3208,21 @@ const unsigned char _Py_M__importlib[] = { 99,101,41,62,41,2,114,47,0,0,0,114,57,0,0,0, 41,2,114,8,1,0,0,114,179,0,0,0,114,4,0,0, 0,114,4,0,0,0,114,5,0,0,0,114,205,0,0,0, - 248,6,0,0,115,2,0,0,0,0,7,122,28,95,78,97, + 249,6,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,2,0,0,0,1,0,0,0,67,0,0,0,115,4, 0,0,0,100,1,0,83,41,2,78,84,114,4,0,0,0, 41,2,114,71,0,0,0,114,158,0,0,0,114,4,0,0, 0,114,4,0,0,0,114,5,0,0,0,114,219,0,0,0, - 1,7,0,0,115,2,0,0,0,0,1,122,27,95,78,97, + 2,7,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,2,0,0,0,1,0,0,0,67,0,0,0,115,4,0, 0,0,100,1,0,83,41,2,78,114,30,0,0,0,114,4, 0,0,0,41,2,114,71,0,0,0,114,158,0,0,0,114, 4,0,0,0,114,4,0,0,0,114,5,0,0,0,114,13, - 1,0,0,4,7,0,0,115,2,0,0,0,0,1,122,27, + 1,0,0,5,7,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,2,0,0,0,6,0,0,0,67,0,0,0, @@ -3231,14 +3231,14 @@ const unsigned char _Py_M__importlib[] = { 0,0,0,122,8,60,115,116,114,105,110,103,62,114,175,0, 0,0,114,39,1,0,0,84,41,1,114,40,1,0,0,41, 2,114,71,0,0,0,114,158,0,0,0,114,4,0,0,0, - 114,4,0,0,0,114,5,0,0,0,114,12,1,0,0,7, + 114,4,0,0,0,114,5,0,0,0,114,12,1,0,0,8, 7,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,2,0, 0,0,1,0,0,0,67,0,0,0,115,4,0,0,0,100, 0,0,83,41,1,78,114,4,0,0,0,41,2,114,71,0, 0,0,114,179,0,0,0,114,4,0,0,0,114,4,0,0, - 0,114,5,0,0,0,114,1,1,0,0,10,7,0,0,115, + 0,114,5,0,0,0,114,1,1,0,0,11,7,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,2,0,0, @@ -3256,7 +3256,7 @@ const unsigned char _Py_M__importlib[] = { 112,97,116,104,32,123,33,114,125,41,3,114,152,0,0,0, 114,253,0,0,0,114,180,0,0,0,41,2,114,71,0,0, 0,114,158,0,0,0,114,4,0,0,0,114,4,0,0,0, - 114,5,0,0,0,114,4,1,0,0,13,7,0,0,115,4, + 114,5,0,0,0,114,4,1,0,0,14,7,0,0,115,4, 0,0,0,0,7,16,1,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,11,114,57,0,0,0,114,56,0, @@ -3264,7 +3264,7 @@ const unsigned char _Py_M__importlib[] = { 0,114,205,0,0,0,114,219,0,0,0,114,13,1,0,0, 114,12,1,0,0,114,1,1,0,0,114,4,1,0,0,114, 4,0,0,0,114,4,0,0,0,114,4,0,0,0,114,5, - 0,0,0,114,251,0,0,0,244,6,0,0,115,14,0,0, + 0,0,0,114,251,0,0,0,245,6,0,0,115,14,0,0, 0,12,1,12,3,18,9,12,3,12,3,12,3,12,3,114, 251,0,0,0,99,0,0,0,0,0,0,0,0,0,0,0, 0,5,0,0,0,64,0,0,0,115,160,0,0,0,101,0, @@ -3302,7 +3302,7 @@ const unsigned char _Py_M__importlib[] = { 101,218,6,118,97,108,117,101,115,114,60,0,0,0,114,73, 1,0,0,41,2,114,8,1,0,0,218,6,102,105,110,100, 101,114,114,4,0,0,0,114,4,0,0,0,114,5,0,0, - 0,114,73,1,0,0,30,7,0,0,115,6,0,0,0,0, + 0,114,73,1,0,0,31,7,0,0,115,6,0,0,0,0, 4,22,1,15,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,3,0,0,0, @@ -3326,7 +3326,7 @@ const unsigned char _Py_M__importlib[] = { 0,0,114,167,0,0,0,114,168,0,0,0,114,153,0,0, 0,41,3,114,8,1,0,0,114,35,0,0,0,90,4,104, 111,111,107,114,4,0,0,0,114,4,0,0,0,114,5,0, - 0,0,218,11,95,112,97,116,104,95,104,111,111,107,115,38, + 0,0,218,11,95,112,97,116,104,95,104,111,111,107,115,39, 7,0,0,115,16,0,0,0,0,7,9,1,19,1,16,1, 3,1,14,1,13,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, @@ -3356,7 +3356,7 @@ const unsigned char _Py_M__importlib[] = { 0,114,78,1,0,0,41,3,114,8,1,0,0,114,35,0, 0,0,114,76,1,0,0,114,4,0,0,0,114,4,0,0, 0,114,5,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,55,7,0,0, + 112,111,114,116,101,114,95,99,97,99,104,101,56,7,0,0, 115,16,0,0,0,0,8,12,1,15,1,3,1,17,1,13, 1,15,1,18,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, @@ -3375,7 +3375,7 @@ const unsigned char _Py_M__importlib[] = { 114,158,0,0,0,114,76,1,0,0,114,169,0,0,0,114, 170,0,0,0,114,177,0,0,0,114,4,0,0,0,114,4, 0,0,0,114,5,0,0,0,218,16,95,108,101,103,97,99, - 121,95,103,101,116,95,115,112,101,99,72,7,0,0,115,18, + 121,95,103,101,116,95,115,112,101,99,73,7,0,0,115,18, 0,0,0,0,4,15,1,24,2,15,1,6,1,12,1,13, 1,15,1,9,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, @@ -3411,7 +3411,7 @@ const unsigned char _Py_M__importlib[] = { 97,109,101,115,112,97,99,101,95,112,97,116,104,90,5,101, 110,116,114,121,114,76,1,0,0,114,177,0,0,0,114,170, 0,0,0,114,4,0,0,0,114,4,0,0,0,114,5,0, - 0,0,218,9,95,103,101,116,95,115,112,101,99,87,7,0, + 0,0,218,9,95,103,101,116,95,115,112,101,99,88,7,0, 0,115,40,0,0,0,0,5,6,1,13,1,21,1,6,1, 15,1,12,1,15,1,21,2,18,1,12,1,6,1,15,1, 4,1,9,1,12,1,15,5,20,2,15,1,9,1,122,20, @@ -3439,7 +3439,7 @@ const unsigned char _Py_M__importlib[] = { 59,1,0,0,41,6,114,8,1,0,0,114,158,0,0,0, 114,35,0,0,0,114,9,1,0,0,114,177,0,0,0,114, 83,1,0,0,114,4,0,0,0,114,4,0,0,0,114,5, - 0,0,0,114,10,1,0,0,119,7,0,0,115,26,0,0, + 0,0,0,114,10,1,0,0,120,7,0,0,115,26,0,0, 0,0,4,12,1,12,1,21,1,12,1,4,1,15,1,9, 1,6,3,9,1,24,1,4,2,7,2,122,20,80,97,116, 104,70,105,110,100,101,114,46,102,105,110,100,95,115,112,101, @@ -3461,7 +3461,7 @@ const unsigned char _Py_M__importlib[] = { 32,32,78,41,2,114,10,1,0,0,114,169,0,0,0,41, 4,114,8,1,0,0,114,158,0,0,0,114,35,0,0,0, 114,177,0,0,0,114,4,0,0,0,114,4,0,0,0,114, - 5,0,0,0,114,11,1,0,0,141,7,0,0,115,8,0, + 5,0,0,0,114,11,1,0,0,142,7,0,0,115,8,0, 0,0,0,8,18,1,12,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,41,12,114,57,0,0,0,114,56,0,0,0,114,58, @@ -3469,7 +3469,7 @@ const unsigned char _Py_M__importlib[] = { 0,0,114,78,1,0,0,114,79,1,0,0,114,80,1,0, 0,114,84,1,0,0,114,10,1,0,0,114,11,1,0,0, 114,4,0,0,0,114,4,0,0,0,114,4,0,0,0,114, - 5,0,0,0,114,72,1,0,0,26,7,0,0,115,22,0, + 5,0,0,0,114,72,1,0,0,27,7,0,0,115,22,0, 0,0,12,2,6,2,18,8,18,17,18,17,18,15,3,1, 18,31,3,1,21,21,3,1,114,72,1,0,0,99,0,0, 0,0,0,0,0,0,0,0,0,0,3,0,0,0,64,0, @@ -3518,7 +3518,7 @@ const unsigned char _Py_M__importlib[] = { 136,0,0,102,2,0,86,1,113,3,0,100,0,0,83,41, 1,78,114,4,0,0,0,41,2,114,22,0,0,0,114,56, 1,0,0,41,1,114,169,0,0,0,114,4,0,0,0,114, - 5,0,0,0,114,77,0,0,0,170,7,0,0,115,2,0, + 5,0,0,0,114,77,0,0,0,171,7,0,0,115,2,0, 0,0,6,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,116,0,0, @@ -3531,7 +3531,7 @@ const unsigned char _Py_M__importlib[] = { 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,127,0,0,0, 114,4,0,0,0,41,1,114,169,0,0,0,114,5,0,0, - 0,114,72,0,0,0,164,7,0,0,115,16,0,0,0,0, + 0,114,72,0,0,0,165,7,0,0,115,16,0,0,0,0, 4,6,1,19,1,36,1,9,2,15,1,9,1,12,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,1,0,0, @@ -3541,7 +3541,7 @@ const unsigned char _Py_M__importlib[] = { 114,101,99,116,111,114,121,32,109,116,105,109,101,46,114,29, 0,0,0,78,114,138,0,0,0,41,1,114,87,1,0,0, 41,1,114,71,0,0,0,114,4,0,0,0,114,4,0,0, - 0,114,5,0,0,0,114,73,1,0,0,178,7,0,0,115, + 0,114,5,0,0,0,114,73,1,0,0,179,7,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,3,0,0, @@ -3565,7 +3565,7 @@ const unsigned char _Py_M__importlib[] = { 32,32,78,41,3,114,10,1,0,0,114,169,0,0,0,114, 220,0,0,0,41,3,114,71,0,0,0,114,158,0,0,0, 114,177,0,0,0,114,4,0,0,0,114,4,0,0,0,114, - 5,0,0,0,114,165,0,0,0,184,7,0,0,115,8,0, + 5,0,0,0,114,165,0,0,0,185,7,0,0,115,8,0, 0,0,0,7,15,1,12,1,10,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,7,0,0,0,7, @@ -3577,7 +3577,7 @@ const unsigned char _Py_M__importlib[] = { 243,0,0,0,114,158,0,0,0,114,35,0,0,0,114,228, 0,0,0,114,9,1,0,0,114,169,0,0,0,114,4,0, 0,0,114,4,0,0,0,114,5,0,0,0,114,84,1,0, - 0,196,7,0,0,115,6,0,0,0,0,1,15,1,18,1, + 0,197,7,0,0,115,6,0,0,0,0,1,15,1,18,1, 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, 14,0,0,0,15,0,0,0,67,0,0,0,115,240,1,0, @@ -3640,7 +3640,7 @@ const unsigned char _Py_M__importlib[] = { 104,114,56,1,0,0,114,243,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,177,0,0,0,114,4,0,0,0,114, - 4,0,0,0,114,5,0,0,0,114,10,1,0,0,201,7, + 4,0,0,0,114,5,0,0,0,114,10,1,0,0,202,7, 0,0,115,68,0,0,0,0,3,6,1,19,1,3,1,34, 1,13,1,11,1,15,1,10,1,12,2,9,1,9,1,15, 2,9,1,6,2,12,1,18,1,22,1,10,1,15,1,12, @@ -3677,7 +3677,7 @@ const unsigned char _Py_M__importlib[] = { 0,146,2,0,113,6,0,83,114,4,0,0,0,41,1,114, 139,0,0,0,41,2,114,22,0,0,0,90,2,102,110,114, 4,0,0,0,114,4,0,0,0,114,5,0,0,0,250,9, - 60,115,101,116,99,111,109,112,62,19,8,0,0,115,2,0, + 60,115,101,116,99,111,109,112,62,20,8,0,0,115,2,0, 0,0,9,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, @@ -3695,7 +3695,7 @@ const unsigned char _Py_M__importlib[] = { 110,116,101,110,116,115,114,70,1,0,0,114,67,0,0,0, 114,64,1,0,0,114,56,1,0,0,90,8,110,101,119,95, 110,97,109,101,114,4,0,0,0,114,4,0,0,0,114,5, - 0,0,0,114,92,1,0,0,246,7,0,0,115,34,0,0, + 0,0,0,114,92,1,0,0,247,7,0,0,115,34,0,0, 0,0,2,9,1,3,1,31,1,22,3,11,3,18,1,18, 7,9,1,13,1,24,1,6,1,27,2,6,1,17,1,9, 1,18,1,122,22,70,105,108,101,70,105,110,100,101,114,46, @@ -3734,7 +3734,7 @@ const unsigned char _Py_M__importlib[] = { 0,0,0,41,1,114,35,0,0,0,41,2,114,8,1,0, 0,114,91,1,0,0,114,4,0,0,0,114,5,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,31,8,0,0,115,6, + 70,105,108,101,70,105,110,100,101,114,32,8,0,0,115,6, 0,0,0,0,2,12,1,21,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, @@ -3742,7 +3742,7 @@ const unsigned char _Py_M__importlib[] = { 114,114,4,0,0,0,41,3,114,8,1,0,0,114,91,1, 0,0,114,98,1,0,0,114,4,0,0,0,41,2,114,8, 1,0,0,114,91,1,0,0,114,5,0,0,0,218,9,112, - 97,116,104,95,104,111,111,107,21,8,0,0,115,4,0,0, + 97,116,104,95,104,111,111,107,22,8,0,0,115,4,0,0, 0,0,10,21,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,1,0,0,0,2,0,0,0,67,0,0,0, @@ -3751,7 +3751,7 @@ const unsigned char _Py_M__importlib[] = { 110,100,101,114,40,123,33,114,125,41,41,2,114,47,0,0, 0,114,35,0,0,0,41,1,114,71,0,0,0,114,4,0, 0,0,114,4,0,0,0,114,5,0,0,0,114,101,0,0, - 0,39,8,0,0,115,2,0,0,0,0,1,122,19,70,105, + 0,40,8,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,15,114,57,0,0,0,114,56,0,0,0,114,58,0, 0,0,114,59,0,0,0,114,72,0,0,0,114,73,1,0, @@ -3759,7 +3759,7 @@ const unsigned char _Py_M__importlib[] = { 114,84,1,0,0,114,10,1,0,0,114,92,1,0,0,114, 15,1,0,0,114,99,1,0,0,114,101,0,0,0,114,4, 0,0,0,114,4,0,0,0,114,4,0,0,0,114,5,0, - 0,0,114,85,1,0,0,155,7,0,0,115,20,0,0,0, + 0,0,114,85,1,0,0,156,7,0,0,115,20,0,0,0, 12,7,6,2,12,14,12,4,6,2,12,12,12,5,15,45, 12,31,18,18,114,85,1,0,0,99,0,0,0,0,0,0, 0,0,0,0,0,0,2,0,0,0,64,0,0,0,115,46, @@ -3776,7 +3776,7 @@ const unsigned char _Py_M__importlib[] = { 32,116,104,101,32,105,109,112,111,114,116,32,108,111,99,107, 46,78,41,2,114,106,0,0,0,114,3,1,0,0,41,1, 114,71,0,0,0,114,4,0,0,0,114,4,0,0,0,114, - 5,0,0,0,114,75,0,0,0,49,8,0,0,115,2,0, + 5,0,0,0,114,75,0,0,0,50,8,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,4,0,0,0,1, @@ -3790,13 +3790,13 @@ const unsigned char _Py_M__importlib[] = { 101,120,99,95,116,121,112,101,90,9,101,120,99,95,118,97, 108,117,101,90,13,101,120,99,95,116,114,97,99,101,98,97, 99,107,114,4,0,0,0,114,4,0,0,0,114,5,0,0, - 0,114,81,0,0,0,53,8,0,0,115,2,0,0,0,0, + 0,114,81,0,0,0,54,8,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,57,0,0,0,114,56,0,0,0,114,58,0,0,0, 114,59,0,0,0,114,75,0,0,0,114,81,0,0,0,114, 4,0,0,0,114,4,0,0,0,114,4,0,0,0,114,5, - 0,0,0,114,100,1,0,0,45,8,0,0,115,6,0,0, + 0,0,0,114,100,1,0,0,46,8,0,0,115,6,0,0, 0,12,2,6,2,12,4,114,100,1,0,0,99,3,0,0, 0,0,0,0,0,5,0,0,0,4,0,0,0,67,0,0, 0,115,91,0,0,0,124,1,0,106,0,0,100,1,0,124, @@ -3818,7 +3818,7 @@ const unsigned char _Py_M__importlib[] = { 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,4,0,0,0,114, 4,0,0,0,114,5,0,0,0,218,13,95,114,101,115,111, - 108,118,101,95,110,97,109,101,58,8,0,0,115,10,0,0, + 108,118,101,95,110,97,109,101,59,8,0,0,115,10,0,0, 0,0,2,22,1,18,1,15,1,10,1,114,103,1,0,0, 99,3,0,0,0,0,0,0,0,4,0,0,0,3,0,0, 0,67,0,0,0,115,47,0,0,0,124,0,0,106,0,0, @@ -3829,7 +3829,7 @@ const unsigned char _Py_M__importlib[] = { 67,0,0,0,114,35,0,0,0,114,169,0,0,0,114,4, 0,0,0,114,4,0,0,0,114,5,0,0,0,218,17,95, 102,105,110,100,95,115,112,101,99,95,108,101,103,97,99,121, - 67,8,0,0,115,8,0,0,0,0,3,18,1,12,1,4, + 68,8,0,0,115,8,0,0,0,0,3,18,1,12,1,4, 1,114,104,1,0,0,99,3,0,0,0,0,0,0,0,9, 0,0,0,27,0,0,0,67,0,0,0,115,34,1,0,0, 116,0,0,106,1,0,115,28,0,116,2,0,106,3,0,100, @@ -3862,7 +3862,7 @@ const unsigned char _Py_M__importlib[] = { 100,114,76,1,0,0,114,10,1,0,0,114,177,0,0,0, 114,179,0,0,0,114,208,0,0,0,114,4,0,0,0,114, 4,0,0,0,114,5,0,0,0,218,10,95,102,105,110,100, - 95,115,112,101,99,76,8,0,0,115,48,0,0,0,0,2, + 95,115,112,101,99,77,8,0,0,115,48,0,0,0,0,2, 9,1,19,4,15,1,16,1,10,1,3,1,13,1,13,1, 18,1,12,1,11,2,24,1,12,2,22,1,13,1,3,1, 13,1,13,4,9,2,12,1,4,2,7,2,11,2,114,106, @@ -3899,7 +3899,7 @@ const unsigned char _Py_M__importlib[] = { 121,115,116,101,109,69,114,114,111,114,41,4,114,67,0,0, 0,114,101,1,0,0,114,102,1,0,0,114,171,0,0,0, 114,4,0,0,0,114,4,0,0,0,114,5,0,0,0,218, - 13,95,115,97,110,105,116,121,95,99,104,101,99,107,116,8, + 13,95,115,97,110,105,116,121,95,99,104,101,99,107,117,8, 0,0,115,24,0,0,0,0,2,15,1,30,1,12,1,15, 1,6,1,15,1,15,1,15,1,6,2,27,1,19,1,114, 109,1,0,0,122,16,78,111,32,109,111,100,117,108,101,32, @@ -3938,7 +3938,7 @@ const unsigned char _Py_M__importlib[] = { 114,177,0,0,0,114,179,0,0,0,114,4,0,0,0,114, 4,0,0,0,114,5,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,136,8,0,0,115,42,0,0,0,0,1,6,1,19, + 101,100,137,8,0,0,115,42,0,0,0,0,1,6,1,19, 1,6,1,15,1,16,2,15,1,11,1,13,1,3,1,13, 1,13,1,22,1,26,1,15,1,12,1,30,2,18,1,6, 2,13,1,32,1,114,112,1,0,0,99,2,0,0,0,0, @@ -3952,7 +3952,7 @@ const unsigned char _Py_M__importlib[] = { 107,46,78,41,2,114,103,0,0,0,114,112,1,0,0,41, 2,114,67,0,0,0,114,111,1,0,0,114,4,0,0,0, 114,4,0,0,0,114,5,0,0,0,218,14,95,102,105,110, - 100,95,97,110,100,95,108,111,97,100,163,8,0,0,115,4, + 100,95,97,110,100,95,108,111,97,100,164,8,0,0,115,4, 0,0,0,0,2,13,1,114,113,1,0,0,99,3,0,0, 0,0,0,0,0,5,0,0,0,4,0,0,0,67,0,0, 0,115,172,0,0,0,116,0,0,124,0,0,124,1,0,124, @@ -3996,7 +3996,7 @@ const unsigned char _Py_M__importlib[] = { 0,114,112,0,0,0,41,5,114,67,0,0,0,114,101,1, 0,0,114,102,1,0,0,114,179,0,0,0,114,151,0,0, 0,114,4,0,0,0,114,4,0,0,0,114,5,0,0,0, - 114,114,1,0,0,169,8,0,0,115,26,0,0,0,0,9, + 114,114,1,0,0,170,8,0,0,115,26,0,0,0,0,9, 16,1,12,1,21,1,10,1,15,1,13,1,13,1,12,1, 10,2,15,1,21,1,10,1,114,114,1,0,0,99,3,0, 0,0,0,0,0,0,6,0,0,0,17,0,0,0,67,0, @@ -4043,7 +4043,7 @@ const unsigned char _Py_M__importlib[] = { 90,9,102,114,111,109,95,110,97,109,101,114,37,1,0,0, 114,4,0,0,0,114,4,0,0,0,114,5,0,0,0,218, 16,95,104,97,110,100,108,101,95,102,114,111,109,108,105,115, - 116,193,8,0,0,115,34,0,0,0,0,10,15,1,12,1, + 116,194,8,0,0,115,34,0,0,0,0,10,15,1,12,1, 12,1,13,1,15,1,22,1,13,1,15,1,21,1,3,1, 17,1,18,4,21,1,15,1,9,1,32,1,114,120,1,0, 0,99,1,0,0,0,0,0,0,0,2,0,0,0,2,0, @@ -4068,7 +4068,7 @@ const unsigned char _Py_M__importlib[] = { 114,93,0,0,0,114,32,0,0,0,41,2,218,7,103,108, 111,98,97,108,115,114,101,1,0,0,114,4,0,0,0,114, 4,0,0,0,114,5,0,0,0,218,17,95,99,97,108,99, - 95,95,95,112,97,99,107,97,103,101,95,95,225,8,0,0, + 95,95,95,112,97,99,107,97,103,101,95,95,226,8,0,0, 115,12,0,0,0,0,7,15,1,12,1,10,1,12,1,25, 1,114,122,1,0,0,99,0,0,0,0,0,0,0,0,3, 0,0,0,3,0,0,0,67,0,0,0,115,55,0,0,0, @@ -4088,7 +4088,7 @@ const unsigned char _Py_M__importlib[] = { 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,4, 0,0,0,114,4,0,0,0,114,5,0,0,0,114,240,0, - 0,0,240,8,0,0,115,8,0,0,0,0,5,18,1,12, + 0,0,241,8,0,0,115,8,0,0,0,0,5,18,1,12, 1,12,1,114,240,0,0,0,99,5,0,0,0,0,0,0, 0,9,0,0,0,5,0,0,0,67,0,0,0,115,227,0, 0,0,124,4,0,100,1,0,107,2,0,114,27,0,116,0, @@ -4143,7 +4143,7 @@ const unsigned char _Py_M__importlib[] = { 114,102,1,0,0,114,179,0,0,0,90,8,103,108,111,98, 97,108,115,95,114,101,1,0,0,90,7,99,117,116,95,111, 102,102,114,4,0,0,0,114,4,0,0,0,114,5,0,0, - 0,218,10,95,95,105,109,112,111,114,116,95,95,251,8,0, + 0,218,10,95,95,105,109,112,111,114,116,95,95,252,8,0, 0,115,26,0,0,0,0,11,12,1,15,2,24,1,12,1, 18,1,6,3,12,1,23,1,6,1,4,4,35,3,40,2, 114,125,1,0,0,99,1,0,0,0,0,0,0,0,3,0, @@ -4159,7 +4159,7 @@ const unsigned char _Py_M__importlib[] = { 0,0,0,114,177,0,0,0,114,178,0,0,0,114,4,0, 0,0,114,4,0,0,0,114,5,0,0,0,218,18,95,98, 117,105,108,116,105,110,95,102,114,111,109,95,110,97,109,101, - 30,9,0,0,115,10,0,0,0,0,1,15,1,12,1,19, + 31,9,0,0,115,10,0,0,0,0,1,15,1,12,1,19, 1,12,1,114,126,1,0,0,99,2,0,0,0,0,0,0, 0,19,0,0,0,12,0,0,0,67,0,0,0,115,232,2, 0,0,124,1,0,97,0,0,124,0,0,97,1,0,116,1, @@ -4233,7 +4233,7 @@ const unsigned char _Py_M__importlib[] = { 0,107,2,0,86,1,113,3,0,100,1,0,83,41,2,114, 29,0,0,0,78,41,1,114,31,0,0,0,41,2,114,22, 0,0,0,114,130,0,0,0,114,4,0,0,0,114,4,0, - 0,0,114,5,0,0,0,114,77,0,0,0,82,9,0,0, + 0,0,114,5,0,0,0,114,77,0,0,0,83,9,0,0, 115,2,0,0,0,6,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,84,0,0,0,122,30,105,109,112,111,114,116,108, @@ -4269,7 +4269,7 @@ const unsigned char _Py_M__importlib[] = { 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,4,0,0, 0,114,4,0,0,0,114,5,0,0,0,218,6,95,115,101, - 116,117,112,38,9,0,0,115,108,0,0,0,0,9,6,1, + 116,117,112,39,9,0,0,115,108,0,0,0,0,9,6,1, 6,2,12,1,9,2,6,3,12,1,28,1,15,1,15,1, 9,1,15,1,9,2,3,1,15,1,12,1,20,3,13,1, 13,1,15,1,15,2,13,1,20,3,33,1,19,2,31,1, @@ -4299,7 +4299,7 @@ const unsigned char _Py_M__importlib[] = { 134,1,0,0,90,17,115,117,112,112,111,114,116,101,100,95, 108,111,97,100,101,114,115,114,4,0,0,0,114,4,0,0, 0,114,5,0,0,0,218,8,95,105,110,115,116,97,108,108, - 125,9,0,0,115,16,0,0,0,0,2,13,1,9,1,28, + 126,9,0,0,115,16,0,0,0,0,2,13,1,9,1,28, 1,16,1,16,1,15,1,19,1,114,136,1,0,0,41,3, 122,3,119,105,110,114,1,0,0,0,114,2,0,0,0,41, 91,114,59,0,0,0,114,10,0,0,0,114,11,0,0,0, @@ -4337,7 +4337,7 @@ const unsigned char _Py_M__importlib[] = { 115,168,0,0,0,6,17,6,3,12,12,12,5,12,5,12, 6,12,12,12,10,12,9,12,5,12,7,15,22,12,8,12, 4,15,4,19,20,6,2,6,3,22,4,19,68,19,21,19, - 19,12,19,12,20,12,114,22,1,18,2,6,2,9,2,9, + 19,12,19,12,20,12,115,22,1,18,2,6,2,9,2,9, 1,9,2,15,27,12,23,12,19,12,12,18,8,12,18,12, 11,12,11,12,17,12,16,21,55,21,12,18,10,12,14,12, 36,19,27,19,106,24,22,9,3,12,1,15,63,18,45,19, diff --git a/Python/opcode_targets.h b/Python/opcode_targets.h index f90a17a..1553a7a 100644 --- a/Python/opcode_targets.h +++ b/Python/opcode_targets.h @@ -15,8 +15,8 @@ static void *opcode_targets[256] = { &&_unknown_opcode, &&_unknown_opcode, &&TARGET_UNARY_INVERT, - &&_unknown_opcode, - &&_unknown_opcode, + &&TARGET_BINARY_MATRIX_MULTIPLY, + &&TARGET_INPLACE_MATRIX_MULTIPLY, &&_unknown_opcode, &&TARGET_BINARY_POWER, &&TARGET_BINARY_MULTIPLY, |