[Python-checkins] bpo-43754: Eliminate bindings for partial pattern matches (GH-25229)

brandtbucher webhook-mailer at python.org
Sun May 2 16:02:21 EDT 2021


https://github.com/python/cpython/commit/0ad1e0384c8afc5259a6d03363491d89500a5d03
commit: 0ad1e0384c8afc5259a6d03363491d89500a5d03
branch: master
author: Brandt Bucher <brandt at python.org>
committer: brandtbucher <brandtbucher at gmail.com>
date: 2021-05-02T13:02:10-07:00
summary:

bpo-43754: Eliminate bindings for partial pattern matches (GH-25229)

files:
A Misc/NEWS.d/next/Core and Builtins/2021-04-24-16-40-23.bpo-43754.9SzHWG.rst
M Doc/library/dis.rst
M Include/opcode.h
M Lib/importlib/_bootstrap_external.py
M Lib/opcode.py
M Lib/test/test_patma.py
M Python/ceval.c
M Python/compile.c
M Python/importlib_external.h
M Python/opcode_targets.h

diff --git a/Doc/library/dis.rst b/Doc/library/dis.rst
index 875ab8b61117ee..0491a9d4a072bf 100644
--- a/Doc/library/dis.rst
+++ b/Doc/library/dis.rst
@@ -1256,6 +1256,15 @@ All of the following opcodes use their arguments.
 
    .. versionadded:: 3.10
 
+
+.. opcode:: ROT_N (count)
+
+   Lift the top *count* stack items one position up, and move TOS down to
+   position *count*.
+
+   .. versionadded:: 3.10
+
+
 .. opcode:: HAVE_ARGUMENT
 
    This is not really an opcode.  It identifies the dividing line between
diff --git a/Include/opcode.h b/Include/opcode.h
index 4f52c5f23e271b..52039754bd88ea 100644
--- a/Include/opcode.h
+++ b/Include/opcode.h
@@ -81,6 +81,7 @@ extern "C" {
 #define DELETE_ATTR              96
 #define STORE_GLOBAL             97
 #define DELETE_GLOBAL            98
+#define ROT_N                    99
 #define LOAD_CONST              100
 #define LOAD_NAME               101
 #define BUILD_TUPLE             102
diff --git a/Lib/importlib/_bootstrap_external.py b/Lib/importlib/_bootstrap_external.py
index 2b2818715e9e6a..9a73c7b43a08cf 100644
--- a/Lib/importlib/_bootstrap_external.py
+++ b/Lib/importlib/_bootstrap_external.py
@@ -351,6 +351,7 @@ def _write_atomic(path, data, mode=0o666):
 #     Python 3.10b1 3436 (Add GEN_START bytecode #43683)
 #     Python 3.10b1 3437 (Undo making 'annotations' future by default - We like to dance among core devs!)
 #     Python 3.10b1 3438 Safer line number table handling.
+#     Python 3.10b1 3439 (Add ROT_N)
 
 #
 # MAGIC must change whenever the bytecode emitted by the compiler may no
@@ -360,7 +361,7 @@ def _write_atomic(path, data, mode=0o666):
 # Whenever MAGIC_NUMBER is changed, the ranges in the magic_values array
 # in PC/launcher.c must also be updated.
 
-MAGIC_NUMBER = (3438).to_bytes(2, 'little') + b'\r\n'
+MAGIC_NUMBER = (3439).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 196e6f8a27eed4..37e88e92df70ec 100644
--- a/Lib/opcode.py
+++ b/Lib/opcode.py
@@ -139,7 +139,7 @@ def jabs_op(name, op):
 name_op('DELETE_ATTR', 96)      # ""
 name_op('STORE_GLOBAL', 97)     # ""
 name_op('DELETE_GLOBAL', 98)    # ""
-
+def_op('ROT_N', 99)
 def_op('LOAD_CONST', 100)       # Index in const list
 hasconst.append(100)
 name_op('LOAD_NAME', 101)       # Index in name list
diff --git a/Lib/test/test_patma.py b/Lib/test/test_patma.py
index 1f80fb48f43e3c..8a273be7250bb1 100644
--- a/Lib/test/test_patma.py
+++ b/Lib/test/test_patma.py
@@ -2905,6 +2905,79 @@ def test_patma_288(self):
                 pass
         """)
 
+    def test_patma_289(self):
+        x = {"y": 1}
+        match x:
+            case {"y": (0 as y) | (1 as y)}:
+                z = 0
+        self.assertEqual(x, {"y": 1})
+        self.assertEqual(y, 1)
+        self.assertEqual(z, 0)
+
+    @no_perf
+    def test_patma_290(self):
+        self.assert_syntax_error("""
+        match ...:
+            case [a, [b] | [c] | [d]]:
+                pass
+        """)
+
+    @no_perf
+    def test_patma_291(self):
+        # Hunting for leaks using -R doesn't catch leaks in the compiler itself,
+        # just the code under test. This test ensures that if there are leaks in
+        # the pattern compiler, those runs will fail:
+        with open(__file__) as file:
+            compile(file.read(), __file__, "exec")
+
+    def test_patma_292(self):
+        def f(x):
+            match x:
+                case ((a, b, c, d, e, f, g, h, i, 9) |
+                      (h, g, i, a, b, d, e, c, f, 10) |
+                      (g, b, a, c, d, -5, e, h, i, f) |
+                      (-1, d, f, b, g, e, i, a, h, c)):
+                    w = 0
+            out = locals()
+            del out["x"]
+            return out
+        alts = [
+            dict(a=0, b=1, c=2, d=3, e=4, f=5, g=6, h=7, i=8, w=0),
+            dict(h=1, g=2, i=3, a=4, b=5, d=6, e=7, c=8, f=9, w=0),
+            dict(g=0, b=-1, a=-2, c=-3, d=-4, e=-6, h=-7, i=-8, f=-9, w=0),
+            dict(d=-2, f=-3, b=-4, g=-5, e=-6, i=-7, a=-8, h=-9, c=-10, w=0),
+            dict(),
+        ]
+        self.assertEqual(f(range(10)), alts[0])
+        self.assertEqual(f(range(1, 11)), alts[1])
+        self.assertEqual(f(range(0, -10, -1)), alts[2])
+        self.assertEqual(f(range(-1, -11, -1)), alts[3])
+        self.assertEqual(f(range(10, 20)), alts[4])
+
+    def test_patma_293(self):
+        def f(x):
+            match x:
+                case [y, (a, b, c, d, e, f, g, h, i, 9) |
+                         (h, g, i, a, b, d, e, c, f, 10) |
+                         (g, b, a, c, d, -5, e, h, i, f) |
+                         (-1, d, f, b, g, e, i, a, h, c), z]:
+                    w = 0
+            out = locals()
+            del out["x"]
+            return out
+        alts = [
+            dict(a=0, b=1, c=2, d=3, e=4, f=5, g=6, h=7, i=8, w=0, y=False, z=True),
+            dict(h=1, g=2, i=3, a=4, b=5, d=6, e=7, c=8, f=9, w=0, y=False, z=True),
+            dict(g=0, b=-1, a=-2, c=-3, d=-4, e=-6, h=-7, i=-8, f=-9, w=0, y=False, z=True),
+            dict(d=-2, f=-3, b=-4, g=-5, e=-6, i=-7, a=-8, h=-9, c=-10, w=0, y=False, z=True),
+            dict(),
+        ]
+        self.assertEqual(f((False, range(10), True)), alts[0])
+        self.assertEqual(f((False, range(1, 11), True)), alts[1])
+        self.assertEqual(f((False, range(0, -10, -1), True)), alts[2])
+        self.assertEqual(f((False, range(-1, -11, -1), True)), alts[3])
+        self.assertEqual(f((False, range(10, 20), True)), alts[4])
+
 
 class PerfPatma(TestPatma):
 
@@ -2936,7 +3009,8 @@ def setUpClass():
 
 
 """
-sudo ./python -m pyperf system tune && \
-     ./python -m pyperf timeit --rigorous --setup "from test.test_patma import PerfPatma; p = PerfPatma()" "p.run_perf()"; \
-sudo ./python -m pyperf system reset
+# From inside venv pointing to this Python, with pyperf installed:
+sudo $(which python) -m pyperf system tune && \
+     $(which python) -m pyperf timeit --rigorous --setup "from test.test_patma import PerfPatma; p = PerfPatma()" "p.run_perf()"; \
+sudo $(which python) -m pyperf system reset
 """
diff --git a/Misc/NEWS.d/next/Core and Builtins/2021-04-24-16-40-23.bpo-43754.9SzHWG.rst b/Misc/NEWS.d/next/Core and Builtins/2021-04-24-16-40-23.bpo-43754.9SzHWG.rst
new file mode 100644
index 00000000000000..54556fa299814c
--- /dev/null
+++ b/Misc/NEWS.d/next/Core and Builtins/2021-04-24-16-40-23.bpo-43754.9SzHWG.rst	
@@ -0,0 +1,2 @@
+When performing structural pattern matching (:pep:`634`), captured names are
+now left unbound until the *entire* pattern has matched successfully.
diff --git a/Python/ceval.c b/Python/ceval.c
index 866c57afdbf9d0..25548e34db246b 100644
--- a/Python/ceval.c
+++ b/Python/ceval.c
@@ -4399,6 +4399,14 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, PyFrameObject *f, int throwflag)
             DISPATCH();
         }
 
+        case TARGET(ROT_N): {
+            PyObject *top = TOP();
+            memmove(&PEEK(oparg - 1), &PEEK(oparg),
+                    sizeof(PyObject*) * (oparg - 1));
+            PEEK(oparg) = top;
+            DISPATCH();
+        }
+
         case TARGET(EXTENDED_ARG): {
             int oldoparg = oparg;
             NEXTOPARG();
diff --git a/Python/compile.c b/Python/compile.c
index 4411edb6678438..7cc75ada472c7c 100644
--- a/Python/compile.c
+++ b/Python/compile.c
@@ -230,8 +230,28 @@ struct compiler {
 };
 
 typedef struct {
+    // A list of strings corresponding to name captures. It is used to track:
+    // - Repeated name assignments in the same pattern.
+    // - Different name assignments in alternatives.
+    // - The order of name assignments in alternatives.
     PyObject *stores;
+    // If 0, any name captures against our subject will raise.
     int allow_irrefutable;
+    // An array of blocks to jump to on failure. Jumping to fail_pop[i] will pop
+    // i items off of the stack. The end result looks like this (with each block
+    // falling through to the next):
+    // fail_pop[4]: POP_TOP
+    // fail_pop[3]: POP_TOP
+    // fail_pop[2]: POP_TOP
+    // fail_pop[1]: POP_TOP
+    // fail_pop[0]: NOP
+    basicblock **fail_pop;
+    // The current length of fail_pop.
+    Py_ssize_t fail_pop_size;
+    // The number of items on top of the stack that need to *stay* on top of the
+    // stack. Variable captures go beneath these. All of them will be popped on
+    // failure.
+    Py_ssize_t on_top;
 } pattern_context;
 
 static int compiler_enter_scope(struct compiler *, identifier, int, void *, int);
@@ -1188,6 +1208,8 @@ stack_effect(int opcode, int oparg, int jump)
             return 1;
         case MATCH_KEYS:
             return 2;
+        case ROT_N:
+            return 0;
         default:
             return PY_INVALID_STACK_EFFECT;
     }
@@ -5594,11 +5616,15 @@ compiler_slice(struct compiler *c, expr_ty s)
 
 // PEP 634: Structural Pattern Matching
 
-// To keep things simple, all compiler_pattern_* routines follow the convention
-// of replacing TOS (the subject for the given pattern) with either True (match)
-// or False (no match). We do this even for irrefutable patterns; the idea is
-// that it's much easier to smooth out any redundant pushing, popping, and
-// jumping in the peephole optimizer than to detect or predict it here.
+// To keep things simple, all compiler_pattern_* and pattern_helper_* routines
+// follow the convention of consuming TOS (the subject for the given pattern)
+// and calling jump_to_fail_pop on failure (no match).
+
+// When calling into these routines, it's important that pc->on_top be kept
+// updated to reflect the current number of items that we are using on the top
+// of the stack: they will be popped on failure, and any name captures will be
+// stored *underneath* them on success. This lets us defer all names stores
+// until the *entire* pattern matches.
 
 #define WILDCARD_CHECK(N) \
     ((N)->kind == MatchAs_kind && !(N)->v.MatchAs.name)
@@ -5610,6 +5636,72 @@ compiler_slice(struct compiler *c, expr_ty s)
 #define MATCH_VALUE_EXPR(N) \
     ((N)->kind == Constant_kind || (N)->kind == Attribute_kind)
 
+// Allocate or resize pc->fail_pop to allow for n items to be popped on failure.
+static int
+ensure_fail_pop(struct compiler *c, pattern_context *pc, Py_ssize_t n)
+{
+    Py_ssize_t size = n + 1;
+    if (size <= pc->fail_pop_size) {
+        return 1;
+    }
+    Py_ssize_t needed = sizeof(basicblock*) * size;
+    basicblock **resized = PyObject_Realloc(pc->fail_pop, needed);
+    if (resized == NULL) {
+        PyErr_NoMemory();
+        return 0;
+    }
+    pc->fail_pop = resized;
+    while (pc->fail_pop_size < size) {
+        basicblock *new_block;
+        RETURN_IF_FALSE(new_block = compiler_new_block(c));
+        pc->fail_pop[pc->fail_pop_size++] = new_block;
+    }
+    return 1;
+}
+
+// Use op to jump to the correct fail_pop block.
+static int
+jump_to_fail_pop(struct compiler *c, pattern_context *pc, int op)
+{
+    // Pop any items on the top of the stack, plus any objects we were going to
+    // capture on success:
+    Py_ssize_t pops = pc->on_top + PyList_GET_SIZE(pc->stores);
+    RETURN_IF_FALSE(ensure_fail_pop(c, pc, pops));
+    ADDOP_JUMP(c, op, pc->fail_pop[pops]);
+    NEXT_BLOCK(c);
+    return 1;
+}
+
+// Build all of the fail_pop blocks and reset fail_pop.
+static int
+emit_and_reset_fail_pop(struct compiler *c, pattern_context *pc)
+{
+    if (!pc->fail_pop_size) {
+        assert(pc->fail_pop == NULL);
+        NEXT_BLOCK(c);
+        return 1;
+    }
+    while (--pc->fail_pop_size) {
+        compiler_use_next_block(c, pc->fail_pop[pc->fail_pop_size]);
+        if (!compiler_addop(c, POP_TOP)) {
+            pc->fail_pop_size = 0;
+            PyObject_Free(pc->fail_pop);
+            pc->fail_pop = NULL;
+            return 0;
+        }
+    }
+    compiler_use_next_block(c, pc->fail_pop[0]);
+    PyObject_Free(pc->fail_pop);
+    pc->fail_pop = NULL;
+    return 1;
+}
+
+static int
+compiler_error_duplicate_store(struct compiler *c, identifier n)
+{
+    return compiler_error(c, "multiple assignments to name %R in pattern", n);
+}
+
 static int
 pattern_helper_store_name(struct compiler *c, identifier n, pattern_context *pc)
 {
@@ -5621,22 +5713,16 @@ pattern_helper_store_name(struct compiler *c, identifier n, pattern_context *pc)
         return 0;
     }
     // Can't assign to the same name twice:
-    if (pc->stores == NULL) {
-        RETURN_IF_FALSE(pc->stores = PySet_New(NULL));
+    int duplicate = PySequence_Contains(pc->stores, n);
+    if (duplicate < 0) {
+        return 0;
     }
-    else {
-        int duplicate = PySet_Contains(pc->stores, n);
-        if (duplicate < 0) {
-            return 0;
-        }
-        if (duplicate) {
-            const char *e = "multiple assignments to name %R in pattern";
-            return compiler_error(c, e, n);
-        }
+    if (duplicate) {
+        return compiler_error_duplicate_store(c, n);
     }
-    RETURN_IF_FALSE(!PySet_Add(pc->stores, n));
-    RETURN_IF_FALSE(compiler_nameop(c, n, Store));
-    return 1;
+    // Rotate this object underneath any items we need to preserve:
+    ADDOP_I(c, ROT_N, pc->on_top + PyList_GET_SIZE(pc->stores) + 1);
+    return !PyList_Append(pc->stores, n);
 }
 
 
@@ -5672,65 +5758,17 @@ pattern_helper_sequence_unpack(struct compiler *c, asdl_pattern_seq *patterns,
                                Py_ssize_t star, pattern_context *pc)
 {
     RETURN_IF_FALSE(pattern_unpack_helper(c, patterns));
-    // We've now got a bunch of new subjects on the stack. If any of them fail
-    // to match, we need to pop everything else off, then finally push False.
-    // fails is an array of blocks that correspond to the necessary amount of
-    // popping for each element:
-    basicblock **fails;
     Py_ssize_t size = asdl_seq_LEN(patterns);
-    fails = (basicblock **)PyObject_Malloc(sizeof(basicblock*) * size);
-    if (fails == NULL) {
-        PyErr_NoMemory();
-        return 0;
-    }
-    // NOTE: Can't use our nice returning macros anymore: they'll leak memory!
-    // goto error on error.
-    for (Py_ssize_t i = 0; i < size; i++) {
-        fails[i] = compiler_new_block(c);
-        if (fails[i] == NULL) {
-            goto error;
-        }
-    }
+    // We've now got a bunch of new subjects on the stack. They need to remain
+    // there after each subpattern match:
+    pc->on_top += size;
     for (Py_ssize_t i = 0; i < size; i++) {
+        // One less item to keep track of each time we loop through:
+        pc->on_top--;
         pattern_ty pattern = asdl_seq_GET(patterns, i);
-        assert((i == star) == (pattern->kind == MatchStar_kind));
-        if (!compiler_pattern_subpattern(c, pattern, pc) ||
-            !compiler_addop_j(c, POP_JUMP_IF_FALSE, fails[i]) ||
-            compiler_next_block(c) == NULL)
-        {
-            goto error;
-        }
-    }
-    // Success!
-    basicblock *end = compiler_new_block(c);
-    if (end == NULL ||
-        !compiler_addop_load_const(c, Py_True) ||
-        !compiler_addop_j(c, JUMP_FORWARD, end))
-    {
-        goto error;
-    }
-    // This is where we handle failed sub-patterns. For a sequence pattern like
-    // [a, b, c, d], this will look like:
-    // fails[0]: POP_TOP
-    // fails[1]: POP_TOP
-    // fails[2]: POP_TOP
-    // fails[3]: LOAD_CONST False
-    for (Py_ssize_t i = 0; i < size - 1; i++) {
-        compiler_use_next_block(c, fails[i]);
-        if (!compiler_addop(c, POP_TOP)) {
-            goto error;
-        }
-    }
-    compiler_use_next_block(c, fails[size - 1]);
-    if (!compiler_addop_load_const(c, Py_False)) {
-        goto error;
+        RETURN_IF_FALSE(compiler_pattern_subpattern(c, pattern, pc));
     }
-    compiler_use_next_block(c, end);
-    PyObject_Free(fails);
     return 1;
-error:
-    PyObject_Free(fails);
-    return 0;
 }
 
 // Like pattern_helper_sequence_unpack, but uses BINARY_SUBSCR instead of
@@ -5740,9 +5778,8 @@ static int
 pattern_helper_sequence_subscr(struct compiler *c, asdl_pattern_seq *patterns,
                                Py_ssize_t star, pattern_context *pc)
 {
-    basicblock *end, *fail_pop_1;
-    RETURN_IF_FALSE(end = compiler_new_block(c));
-    RETURN_IF_FALSE(fail_pop_1 = compiler_new_block(c));
+    // We need to keep the subject around for extracting elements:
+    pc->on_top++;
     Py_ssize_t size = asdl_seq_LEN(patterns);
     for (Py_ssize_t i = 0; i < size; i++) {
         pattern_ty pattern = asdl_seq_GET(patterns, i);
@@ -5766,16 +5803,10 @@ pattern_helper_sequence_subscr(struct compiler *c, asdl_pattern_seq *patterns,
         }
         ADDOP(c, BINARY_SUBSCR);
         RETURN_IF_FALSE(compiler_pattern_subpattern(c, pattern, pc));
-        ADDOP_JUMP(c, POP_JUMP_IF_FALSE, fail_pop_1);
-        NEXT_BLOCK(c);
     }
+    // Pop the subject, we're done with it:
+    pc->on_top--;
     ADDOP(c, POP_TOP);
-    ADDOP_LOAD_CONST(c, Py_True);
-    ADDOP_JUMP(c, JUMP_FORWARD, end);
-    compiler_use_next_block(c, fail_pop_1);
-    ADDOP(c, POP_TOP);
-    ADDOP_LOAD_CONST(c, Py_False);
-    compiler_use_next_block(c, end);
     return 1;
 }
 
@@ -5804,26 +5835,15 @@ compiler_pattern_as(struct compiler *c, pattern_ty p, pattern_context *pc)
             const char *e = "wildcard makes remaining patterns unreachable";
             return compiler_error(c, e);
         }
-        RETURN_IF_FALSE(pattern_helper_store_name(c, p->v.MatchAs.name, pc));
-        ADDOP_LOAD_CONST(c, Py_True);
-        return 1;
+        return pattern_helper_store_name(c, p->v.MatchAs.name, pc);
     }
-    basicblock *end, *fail_pop_1;
-    RETURN_IF_FALSE(end = compiler_new_block(c));
-    RETURN_IF_FALSE(fail_pop_1 = compiler_new_block(c));
     // Need to make a copy for (possibly) storing later:
+    pc->on_top++;
     ADDOP(c, DUP_TOP);
     RETURN_IF_FALSE(compiler_pattern(c, p->v.MatchAs.pattern, pc));
-    ADDOP_JUMP(c, POP_JUMP_IF_FALSE, fail_pop_1);
-    NEXT_BLOCK(c);
+    // Success! Store it:
+    pc->on_top--;
     RETURN_IF_FALSE(pattern_helper_store_name(c, p->v.MatchAs.name, pc));
-    ADDOP_LOAD_CONST(c, Py_True);
-    ADDOP_JUMP(c, JUMP_FORWARD, end);
-    compiler_use_next_block(c, fail_pop_1);
-    // Need to pop that unused copy from before:
-    ADDOP(c, POP_TOP);
-    ADDOP_LOAD_CONST(c, Py_False);
-    compiler_use_next_block(c, end);
     return 1;
 }
 
@@ -5832,7 +5852,6 @@ compiler_pattern_star(struct compiler *c, pattern_ty p, pattern_context *pc)
 {
     assert(p->kind == MatchStar_kind);
     RETURN_IF_FALSE(pattern_helper_store_name(c, p->v.MatchStar.name, pc));
-    ADDOP_LOAD_CONST(c, Py_True);
     return 1;
 }
 
@@ -5884,9 +5903,6 @@ compiler_pattern_class(struct compiler *c, pattern_ty p, pattern_context *pc)
         RETURN_IF_FALSE(!validate_kwd_attrs(c, kwd_attrs, kwd_patterns));
         c->u->u_col_offset = p->col_offset; // validate_kwd_attrs moves this
     }
-    basicblock *end, *fail_pop_1;
-    RETURN_IF_FALSE(end = compiler_new_block(c));
-    RETURN_IF_FALSE(fail_pop_1 = compiler_new_block(c));
     VISIT(c, expr, p->v.MatchClass.cls);
     PyObject *attr_names;
     RETURN_IF_FALSE(attr_names = PyTuple_New(nattrs));
@@ -5898,9 +5914,9 @@ compiler_pattern_class(struct compiler *c, pattern_ty p, pattern_context *pc)
     }
     ADDOP_LOAD_CONST_NEW(c, attr_names);
     ADDOP_I(c, MATCH_CLASS, nargs);
-    ADDOP_JUMP(c, POP_JUMP_IF_FALSE, fail_pop_1);
-    NEXT_BLOCK(c);
-    // TOS is now a tuple of (nargs + nkwargs) attributes.
+    // TOS is now a tuple of (nargs + nattrs) attributes. Preserve it:
+    pc->on_top++;
+    RETURN_IF_FALSE(jump_to_fail_pop(c, pc, POP_JUMP_IF_FALSE));
     for (i = 0; i < nargs + nattrs; i++) {
         pattern_ty pattern;
         if (i < nargs) {
@@ -5919,17 +5935,10 @@ compiler_pattern_class(struct compiler *c, pattern_ty p, pattern_context *pc)
         ADDOP_LOAD_CONST_NEW(c, PyLong_FromSsize_t(i));
         ADDOP(c, BINARY_SUBSCR);
         RETURN_IF_FALSE(compiler_pattern_subpattern(c, pattern, pc));
-        ADDOP_JUMP(c, POP_JUMP_IF_FALSE, fail_pop_1);
-        NEXT_BLOCK(c);
     }
     // Success! Pop the tuple of attributes:
+    pc->on_top--;
     ADDOP(c, POP_TOP);
-    ADDOP_LOAD_CONST(c, Py_True);
-    ADDOP_JUMP(c, JUMP_FORWARD, end);
-    compiler_use_next_block(c, fail_pop_1);
-    ADDOP(c, POP_TOP);
-    ADDOP_LOAD_CONST(c, Py_False);
-    compiler_use_next_block(c, end);
     return 1;
 }
 
@@ -5937,10 +5946,6 @@ static int
 compiler_pattern_mapping(struct compiler *c, pattern_ty p, pattern_context *pc)
 {
     assert(p->kind == MatchMapping_kind);
-    basicblock *end, *fail_pop_1, *fail_pop_3;
-    RETURN_IF_FALSE(end = compiler_new_block(c));
-    RETURN_IF_FALSE(fail_pop_1 = compiler_new_block(c));
-    RETURN_IF_FALSE(fail_pop_3 = compiler_new_block(c));
     asdl_expr_seq *keys = p->v.MatchMapping.keys;
     asdl_pattern_seq *patterns = p->v.MatchMapping.patterns;
     Py_ssize_t size = asdl_seq_LEN(keys);
@@ -5953,18 +5958,14 @@ compiler_pattern_mapping(struct compiler *c, pattern_ty p, pattern_context *pc)
     }
     // We have a double-star target if "rest" is set
     PyObject *star_target = p->v.MatchMapping.rest;
+    // We need to keep the subject on top during the mapping and length checks:
+    pc->on_top++;
     ADDOP(c, MATCH_MAPPING);
-    ADDOP_JUMP(c, POP_JUMP_IF_FALSE, fail_pop_1);
-    NEXT_BLOCK(c);
+    RETURN_IF_FALSE(jump_to_fail_pop(c, pc, POP_JUMP_IF_FALSE));
     if (!size && !star_target) {
-        // If the pattern is just "{}", we're done!
-        ADDOP(c, POP_TOP);
-        ADDOP_LOAD_CONST(c, Py_True);
-        ADDOP_JUMP(c, JUMP_FORWARD, end);
-        compiler_use_next_block(c, fail_pop_1);
+        // If the pattern is just "{}", we're done! Pop the subject:
+        pc->on_top--;
         ADDOP(c, POP_TOP);
-        ADDOP_LOAD_CONST(c, Py_False);
-        compiler_use_next_block(c, end);
         return 1;
     }
     if (size) {
@@ -5972,8 +5973,7 @@ compiler_pattern_mapping(struct compiler *c, pattern_ty p, pattern_context *pc)
         ADDOP(c, GET_LEN);
         ADDOP_LOAD_CONST_NEW(c, PyLong_FromSsize_t(size));
         ADDOP_COMPARE(c, GtE);
-        ADDOP_JUMP(c, POP_JUMP_IF_FALSE, fail_pop_1);
-        NEXT_BLOCK(c);
+        RETURN_IF_FALSE(jump_to_fail_pop(c, pc, POP_JUMP_IF_FALSE));
     }
     if (INT_MAX < size - 1) {
         return compiler_error(c, "too many sub-patterns in mapping pattern");
@@ -5996,9 +5996,10 @@ compiler_pattern_mapping(struct compiler *c, pattern_ty p, pattern_context *pc)
     }
     ADDOP_I(c, BUILD_TUPLE, size);
     ADDOP(c, MATCH_KEYS);
-    ADDOP_JUMP(c, POP_JUMP_IF_FALSE, fail_pop_3);
-    NEXT_BLOCK(c);
-    // So far so good. There's now a tuple of values on the stack to match
+    // There's now a tuple of keys and a tuple of values on top of the subject:
+    pc->on_top += 2;
+    RETURN_IF_FALSE(jump_to_fail_pop(c, pc, POP_JUMP_IF_FALSE));
+    // So far so good. Use that tuple of values on the stack to match
     // sub-patterns against:
     for (Py_ssize_t i = 0; i < size; i++) {
         pattern_ty pattern = asdl_seq_GET(patterns, i);
@@ -6009,10 +6010,10 @@ compiler_pattern_mapping(struct compiler *c, pattern_ty p, pattern_context *pc)
         ADDOP_LOAD_CONST_NEW(c, PyLong_FromSsize_t(i));
         ADDOP(c, BINARY_SUBSCR);
         RETURN_IF_FALSE(compiler_pattern_subpattern(c, pattern, pc));
-        ADDOP_JUMP(c, POP_JUMP_IF_FALSE, fail_pop_3);
-        NEXT_BLOCK(c);
     }
-    // If we get this far, it's a match! We're done with that tuple of values.
+    // If we get this far, it's a match! We're done with the tuple of values,
+    // and whatever happens next should consume the tuple of keys underneath it:
+    pc->on_top -= 2;
     ADDOP(c, POP_TOP);
     if (star_target) {
         // If we have a starred name, bind a dict of remaining items to it:
@@ -6024,19 +6025,8 @@ compiler_pattern_mapping(struct compiler *c, pattern_ty p, pattern_context *pc)
         ADDOP(c, POP_TOP);
     }
     // Pop the subject:
+    pc->on_top--;
     ADDOP(c, POP_TOP);
-    ADDOP_LOAD_CONST(c, Py_True);
-    ADDOP_JUMP(c, JUMP_FORWARD, end);
-    // The top two items are a tuple of values or None, followed by a tuple of
-    // keys. Pop them both:
-    compiler_use_next_block(c, fail_pop_3);
-    ADDOP(c, POP_TOP);
-    ADDOP(c, POP_TOP);
-    compiler_use_next_block(c, fail_pop_1);
-    // Pop the subject:
-    ADDOP(c, POP_TOP);
-    ADDOP_LOAD_CONST(c, Py_False);
-    compiler_use_next_block(c, end);
     return 1;
 }
 
@@ -6044,69 +6034,148 @@ static int
 compiler_pattern_or(struct compiler *c, pattern_ty p, pattern_context *pc)
 {
     assert(p->kind == MatchOr_kind);
-    // control is the set of names bound by the first alternative. If all of the
-    // others bind the same names (they should), then this becomes pc->stores.
-    PyObject *control = NULL;
-    basicblock *end, *pass_pop_1;
+    basicblock *end;
     RETURN_IF_FALSE(end = compiler_new_block(c));
-    RETURN_IF_FALSE(pass_pop_1 = compiler_new_block(c));
     Py_ssize_t size = asdl_seq_LEN(p->v.MatchOr.patterns);
     assert(size > 1);
     // We're going to be messing with pc. Keep the original info handy:
-    PyObject *stores_init = pc->stores;
-    int allow_irrefutable = pc->allow_irrefutable;
+    pattern_context old_pc = *pc;
+    Py_INCREF(pc->stores);
+    // control is the list of names bound by the first alternative. It is used
+    // for checking different name bindings in alternatives, and for correcting
+    // the order in which extracted elements are placed on the stack.
+    PyObject *control = NULL;
+    // NOTE: We can't use returning macros anymore! goto error on error.
     for (Py_ssize_t i = 0; i < size; i++) {
-        // NOTE: Can't use our nice returning macros in here: they'll leak sets!
         pattern_ty alt = asdl_seq_GET(p->v.MatchOr.patterns, i);
-        pc->stores = PySet_New(stores_init);
-        // An irrefutable sub-pattern must be last, if it is allowed at all:
-        int is_last = i == size - 1;
-        pc->allow_irrefutable = allow_irrefutable && is_last;
         SET_LOC(c, alt);
-        if (pc->stores == NULL ||
-            // Only copy the subject if we're *not* on the last alternative:
-            (!is_last && !compiler_addop(c, DUP_TOP)) ||
-            !compiler_pattern(c, alt, pc) ||
-            // Only jump if we're *not* on the last alternative:
-            (!is_last && !compiler_addop_j(c, POP_JUMP_IF_TRUE, pass_pop_1)) ||
-            !compiler_next_block(c))
-        {
-            goto fail;
+        PyObject *pc_stores = PyList_New(0);
+        if (pc_stores == NULL) {
+            goto error;
+        }
+        Py_SETREF(pc->stores, pc_stores);
+        // An irrefutable sub-pattern must be last, if it is allowed at all:
+        pc->allow_irrefutable = (i == size - 1) && old_pc.allow_irrefutable;
+        pc->fail_pop = NULL;
+        pc->fail_pop_size = 0;
+        pc->on_top = 0;
+        if (!compiler_addop(c, DUP_TOP) || !compiler_pattern(c, alt, pc)) {
+            goto error;
         }
+        // Success!
+        Py_ssize_t nstores = PyList_GET_SIZE(pc->stores);
         if (!i) {
-            // If this is the first alternative, save its stores as a "control"
-            // for the others (they can't bind a different set of names):
+            // This is the first alternative, so save its stores as a "control"
+            // for the others (they can't bind a different set of names, and
+            // might need to be reordered):
+            assert(control == NULL);
             control = pc->stores;
-            continue;
-        }
-        if (PySet_GET_SIZE(pc->stores) || PySet_GET_SIZE(control)) {
-            // Otherwise, check to see if we differ from the control set:
-            PyObject *diff = PyNumber_InPlaceXor(pc->stores, control);
-            if (diff == NULL) {
-                goto fail;
-            }
-            if (PySet_GET_SIZE(diff)) {
-                // The names differ! Raise.
-                Py_DECREF(diff);
-                compiler_error(c, "alternative patterns bind different names");
-                goto fail;
+            Py_INCREF(control);
+        }
+        else if (nstores != PyList_GET_SIZE(control)) {
+            goto diff;
+        }
+        else if (nstores) {
+            // There were captures. Check to see if we differ from control:
+            Py_ssize_t icontrol = nstores;
+            while (icontrol--) {
+                PyObject *name = PyList_GET_ITEM(control, icontrol);
+                Py_ssize_t istores = PySequence_Index(pc->stores, name);
+                if (istores < 0) {
+                    PyErr_Clear();
+                    goto diff;
+                }
+                if (icontrol != istores) {
+                    // Reorder the names on the stack to match the order of the
+                    // names in control. There's probably a better way of doing
+                    // this; the current solution is potentially very
+                    // inefficient when each alternative subpattern binds lots
+                    // of names in different orders. It's fine for reasonable
+                    // cases, though.
+                    assert(istores < icontrol);
+                    Py_ssize_t rotations = istores + 1;
+                    // Perfom the same rotation on pc->stores:
+                    PyObject *rotated = PyList_GetSlice(pc->stores, 0,
+                                                        rotations);
+                    if (rotated == NULL ||
+                        PyList_SetSlice(pc->stores, 0, rotations, NULL) ||
+                        PyList_SetSlice(pc->stores, icontrol - istores,
+                                        icontrol - istores, rotated))
+                    {
+                        Py_XDECREF(rotated);
+                        goto error;
+                    }
+                    Py_DECREF(rotated);
+                    // That just did:
+                    // rotated = pc_stores[:rotations]
+                    // del pc_stores[:rotations]
+                    // pc_stores[icontrol-istores:icontrol-istores] = rotated
+                    // Do the same thing to the stack, using several ROT_Ns:
+                    while (rotations--) {
+                        if (!compiler_addop_i(c, ROT_N, icontrol + 1)) {
+                            goto error;
+                        }
+                    }
+                }
             }
-            Py_DECREF(diff);
         }
-        Py_DECREF(pc->stores);
+        assert(control);
+        if (!compiler_addop_j(c, JUMP_FORWARD, end) ||
+            !compiler_next_block(c) ||
+            !emit_and_reset_fail_pop(c, pc))
+        {
+            goto error;
+        }
+    }
+    Py_DECREF(pc->stores);
+    *pc = old_pc;
+    Py_INCREF(pc->stores);
+    // Need to NULL this for the PyObject_Free call in the error block.
+    old_pc.fail_pop = NULL;
+    // No match. Pop the remaining copy of the subject and fail:
+    if (!compiler_addop(c, POP_TOP) || !jump_to_fail_pop(c, pc, JUMP_FORWARD)) {
+        goto error;
     }
-    Py_XDECREF(stores_init);
-    // Update pc->stores and restore pc->allow_irrefutable:
-    pc->stores = control;
-    pc->allow_irrefutable = allow_irrefutable;
-    ADDOP_JUMP(c, JUMP_FORWARD, end);
-    compiler_use_next_block(c, pass_pop_1);
-    ADDOP(c, POP_TOP);
-    ADDOP_LOAD_CONST(c, Py_True);
     compiler_use_next_block(c, end);
+    Py_ssize_t nstores = PyList_GET_SIZE(control);
+    // There's a bunch of stuff on the stack between any where the new stores
+    // are and where they need to be:
+    // - The other stores.
+    // - A copy of the subject.
+    // - Anything else that may be on top of the stack.
+    // - Any previous stores we've already stashed away on the stack.
+    int nrots = nstores + 1 + pc->on_top + PyList_GET_SIZE(pc->stores);
+    for (Py_ssize_t i = 0; i < nstores; i++) {
+        // Rotate this capture to its proper place on the stack:
+        if (!compiler_addop_i(c, ROT_N, nrots)) {
+            goto error;
+        }
+        // Update the list of previous stores with this new name, checking for
+        // duplicates:
+        PyObject *name = PyList_GET_ITEM(control, i);
+        int dupe = PySequence_Contains(pc->stores, name);
+        if (dupe < 0) {
+            goto error;
+        }
+        if (dupe) {
+            compiler_error_duplicate_store(c, name);
+            goto error;
+        }
+        if (PyList_Append(pc->stores, name)) {
+            goto error;
+        }
+    }
+    Py_DECREF(old_pc.stores);
+    Py_DECREF(control);
+    // NOTE: Returning macros are safe again.
+    // Pop the copy of the subject:
+    ADDOP(c, POP_TOP);
     return 1;
-fail:
-    Py_XDECREF(stores_init);
+diff:
+    compiler_error(c, "alternative patterns bind different names");
+error:
+    PyObject_Free(old_pc.fail_pop);
+    Py_DECREF(old_pc.stores);
     Py_XDECREF(control);
     return 0;
 }
@@ -6136,32 +6205,29 @@ compiler_pattern_sequence(struct compiler *c, pattern_ty p, pattern_context *pc)
         }
         only_wildcard &= WILDCARD_CHECK(pattern);
     }
-    basicblock *end, *fail_pop_1;
-    RETURN_IF_FALSE(end = compiler_new_block(c));
-    RETURN_IF_FALSE(fail_pop_1 = compiler_new_block(c));
+    // We need to keep the subject on top during the sequence and length checks:
+    pc->on_top++;
     ADDOP(c, MATCH_SEQUENCE);
-    ADDOP_JUMP(c, POP_JUMP_IF_FALSE, fail_pop_1);
-    NEXT_BLOCK(c);
+    RETURN_IF_FALSE(jump_to_fail_pop(c, pc, POP_JUMP_IF_FALSE));
     if (star < 0) {
         // No star: len(subject) == size
         ADDOP(c, GET_LEN);
         ADDOP_LOAD_CONST_NEW(c, PyLong_FromSsize_t(size));
         ADDOP_COMPARE(c, Eq);
-        ADDOP_JUMP(c, POP_JUMP_IF_FALSE, fail_pop_1);
-        NEXT_BLOCK(c);
+        RETURN_IF_FALSE(jump_to_fail_pop(c, pc, POP_JUMP_IF_FALSE));
     }
     else if (size > 1) {
         // Star: len(subject) >= size - 1
         ADDOP(c, GET_LEN);
         ADDOP_LOAD_CONST_NEW(c, PyLong_FromSsize_t(size - 1));
         ADDOP_COMPARE(c, GtE);
-        ADDOP_JUMP(c, POP_JUMP_IF_FALSE, fail_pop_1);
-        NEXT_BLOCK(c);
+        RETURN_IF_FALSE(jump_to_fail_pop(c, pc, POP_JUMP_IF_FALSE));
     }
+    // Whatever comes next should consume the subject:
+    pc->on_top--;
     if (only_wildcard) {
         // Patterns like: [] / [_] / [_, _] / [*_] / [_, *_] / [_, _, *_] / etc.
         ADDOP(c, POP_TOP);
-        ADDOP_LOAD_CONST(c, Py_True);
     }
     else if (star_wildcard) {
         RETURN_IF_FALSE(pattern_helper_sequence_subscr(c, patterns, star, pc));
@@ -6169,11 +6235,6 @@ compiler_pattern_sequence(struct compiler *c, pattern_ty p, pattern_context *pc)
     else {
         RETURN_IF_FALSE(pattern_helper_sequence_unpack(c, patterns, star, pc));
     }
-    ADDOP_JUMP(c, JUMP_FORWARD, end);
-    compiler_use_next_block(c, fail_pop_1);
-    ADDOP(c, POP_TOP)
-    ADDOP_LOAD_CONST(c, Py_False);
-    compiler_use_next_block(c, end);
     return 1;
 }
 
@@ -6188,6 +6249,7 @@ compiler_pattern_value(struct compiler *c, pattern_ty p, pattern_context *pc)
     }
     VISIT(c, expr, value);
     ADDOP_COMPARE(c, Eq);
+    RETURN_IF_FALSE(jump_to_fail_pop(c, pc, POP_JUMP_IF_FALSE));
     return 1;
 }
 
@@ -6197,6 +6259,7 @@ compiler_pattern_singleton(struct compiler *c, pattern_ty p, pattern_context *pc
     assert(p->kind == MatchSingleton_kind);
     ADDOP_LOAD_CONST(c, p->v.MatchSingleton.value);
     ADDOP_COMPARE(c, Is);
+    RETURN_IF_FALSE(jump_to_fail_pop(c, pc, POP_JUMP_IF_FALSE));
     return 1;
 }
 
@@ -6229,39 +6292,48 @@ compiler_pattern(struct compiler *c, pattern_ty p, pattern_context *pc)
 }
 
 static int
-compiler_match(struct compiler *c, stmt_ty s)
+compiler_match_inner(struct compiler *c, stmt_ty s, pattern_context *pc)
 {
     VISIT(c, expr, s->v.Match.subject);
-    basicblock *next, *end;
+    basicblock *end;
     RETURN_IF_FALSE(end = compiler_new_block(c));
     Py_ssize_t cases = asdl_seq_LEN(s->v.Match.cases);
     assert(cases > 0);
-    pattern_context pc;
-    // We use pc.stores to track:
-    // - Repeated name assignments in the same pattern.
-    // - Different name assignments in alternatives.
-    // It's a set of names, but we don't create it until it's needed:
-    pc.stores = NULL;
     match_case_ty m = asdl_seq_GET(s->v.Match.cases, cases - 1);
     int has_default = WILDCARD_CHECK(m->pattern) && 1 < cases;
     for (Py_ssize_t i = 0; i < cases - has_default; i++) {
         m = asdl_seq_GET(s->v.Match.cases, i);
         SET_LOC(c, m->pattern);
-        RETURN_IF_FALSE(next = compiler_new_block(c));
-        // If pc.allow_irrefutable is 0, any name captures against our subject
-        // will raise. Irrefutable cases must be either guarded, last, or both:
-        pc.allow_irrefutable = m->guard != NULL || i == cases - 1;
         // Only copy the subject if we're *not* on the last case:
         if (i != cases - has_default - 1) {
             ADDOP(c, DUP_TOP);
         }
-        int result = compiler_pattern(c, m->pattern, &pc);
-        Py_CLEAR(pc.stores);
-        RETURN_IF_FALSE(result);
-        ADDOP_JUMP(c, POP_JUMP_IF_FALSE, next);
-        NEXT_BLOCK(c);
+        RETURN_IF_FALSE(pc->stores = PyList_New(0));
+        // Irrefutable cases must be either guarded, last, or both:
+        pc->allow_irrefutable = m->guard != NULL || i == cases - 1;
+        pc->fail_pop = NULL;
+        pc->fail_pop_size = 0;
+        pc->on_top = 0;
+        // NOTE: Can't use returning macros here (they'll leak pc->stores)!
+        if (!compiler_pattern(c, m->pattern, pc)) {
+            Py_DECREF(pc->stores);
+            return 0;
+        }
+        assert(!pc->on_top);
+        // It's a match! Store all of the captured names (they're on the stack).
+        Py_ssize_t nstores = PyList_GET_SIZE(pc->stores);
+        for (Py_ssize_t n = 0; n < nstores; n++) {
+            PyObject *name = PyList_GET_ITEM(pc->stores, n);
+            if (!compiler_nameop(c, name, Store)) {
+                Py_DECREF(pc->stores);
+                return 0;
+            }
+        }
+        Py_DECREF(pc->stores);
+        // NOTE: Returning macros are safe again.
         if (m->guard) {
-            RETURN_IF_FALSE(compiler_jump_if(c, m->guard, next, 0));
+            RETURN_IF_FALSE(ensure_fail_pop(c, pc, 0));
+            RETURN_IF_FALSE(compiler_jump_if(c, m->guard, pc->fail_pop[0], 0));
         }
         // Success! Pop the subject off, we're done with it:
         if (i != cases - has_default - 1) {
@@ -6269,7 +6341,7 @@ compiler_match(struct compiler *c, stmt_ty s)
         }
         VISIT_SEQ(c, stmt, m->body);
         ADDOP_JUMP(c, JUMP_FORWARD, end);
-        compiler_use_next_block(c, next);
+        RETURN_IF_FALSE(emit_and_reset_fail_pop(c, pc));
     }
     if (has_default) {
         if (cases == 1) {
@@ -6289,6 +6361,16 @@ compiler_match(struct compiler *c, stmt_ty s)
     return 1;
 }
 
+static int
+compiler_match(struct compiler *c, stmt_ty s)
+{
+    pattern_context pc;
+    pc.fail_pop = NULL;
+    int result = compiler_match_inner(c, s, &pc);
+    PyObject_Free(pc.fail_pop);
+    return result;
+}
+
 #undef WILDCARD_CHECK
 #undef WILDCARD_STAR_CHECK
 
@@ -7031,6 +7113,38 @@ fold_tuple_on_constants(struct compiler *c,
 }
 
 
+// Eliminate n * ROT_N(n).
+static void
+fold_rotations(struct instr *inst, int n)
+{
+    for (int i = 0; i < n; i++) {
+        int rot;
+        switch (inst[i].i_opcode) {
+            case ROT_N:
+                rot = inst[i].i_oparg;
+                break;
+            case ROT_FOUR:
+                rot = 4;
+                break;
+            case ROT_THREE:
+                rot = 3;
+                break;
+            case ROT_TWO:
+                rot = 2;
+                break;
+            default:
+                return;
+        }
+        if (rot != n) {
+            return;
+        }
+    }
+    for (int i = 0; i < n; i++) {
+        inst[i].i_opcode = NOP;
+    }
+}
+
+
 static int
 eliminate_jump_to_jump(basicblock *bb, int opcode) {
     assert (bb->b_iused > 0);
@@ -7273,6 +7387,27 @@ optimize_basic_block(struct compiler *c, basicblock *bb, PyObject *consts)
                             bb->b_exit = 1;
                         }
                 }
+                break;
+            case ROT_N:
+                switch (oparg) {
+                    case 0:
+                    case 1:
+                        inst->i_opcode = NOP;
+                        continue;
+                    case 2:
+                        inst->i_opcode = ROT_TWO;
+                        break;
+                    case 3:
+                        inst->i_opcode = ROT_THREE;
+                        break;
+                    case 4:
+                        inst->i_opcode = ROT_FOUR;
+                        break;
+                }
+                if (i >= oparg - 1) {
+                    fold_rotations(inst - oparg + 1, oparg);
+                }
+                break;
         }
     }
     return 0;
diff --git a/Python/importlib_external.h b/Python/importlib_external.h
index 6b9bd0df8135d7..8f4eeb0e53483a 100644
--- a/Python/importlib_external.h
+++ b/Python/importlib_external.h
@@ -357,7 +357,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = {
     0,0,0,115,36,0,0,0,16,5,6,1,22,1,4,255,
     2,2,14,3,12,1,28,255,18,2,12,1,2,1,12,1,
     2,3,12,254,2,1,2,1,2,254,2,253,114,95,0,0,
-    0,105,110,13,0,0,114,44,0,0,0,114,32,0,0,0,
+    0,105,111,13,0,0,114,44,0,0,0,114,32,0,0,0,
     115,2,0,0,0,13,10,90,11,95,95,112,121,99,97,99,
     104,101,95,95,122,4,111,112,116,45,122,3,46,112,121,122,
     4,46,112,121,119,122,4,46,112,121,99,41,1,218,12,111,
@@ -471,7 +471,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = {
     108,109,111,115,116,95,102,105,108,101,110,97,109,101,218,8,
     102,105,108,101,110,97,109,101,114,7,0,0,0,114,7,0,
     0,0,114,8,0,0,0,218,17,99,97,99,104,101,95,102,
-    114,111,109,95,115,111,117,114,99,101,123,1,0,0,115,72,
+    114,111,109,95,115,111,117,114,99,101,124,1,0,0,115,72,
     0,0,0,8,18,6,1,2,1,4,255,8,2,4,1,8,
     1,12,1,10,1,12,1,16,1,8,1,8,1,8,1,24,
     1,8,1,12,1,6,1,8,2,8,1,8,1,8,1,14,
@@ -552,7 +552,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = {
     116,95,108,101,118,101,108,90,13,98,97,115,101,95,102,105,
     108,101,110,97,109,101,114,7,0,0,0,114,7,0,0,0,
     114,8,0,0,0,218,17,115,111,117,114,99,101,95,102,114,
-    111,109,95,99,97,99,104,101,194,1,0,0,115,60,0,0,
+    111,109,95,99,97,99,104,101,195,1,0,0,115,60,0,0,
     0,12,9,8,1,10,1,12,1,4,1,10,1,12,1,14,
     1,16,1,4,1,4,1,12,1,8,1,8,1,2,1,8,
     255,10,2,8,1,14,1,8,1,16,1,10,1,4,1,2,
@@ -587,7 +587,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = {
     218,1,95,90,9,101,120,116,101,110,115,105,111,110,218,11,
     115,111,117,114,99,101,95,112,97,116,104,114,7,0,0,0,
     114,7,0,0,0,114,8,0,0,0,218,15,95,103,101,116,
-    95,115,111,117,114,99,101,102,105,108,101,234,1,0,0,115,
+    95,115,111,117,114,99,101,102,105,108,101,235,1,0,0,115,
     22,0,0,0,12,7,4,1,16,1,24,1,4,1,2,1,
     12,1,16,1,14,1,16,1,2,254,114,135,0,0,0,99,
     1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,
@@ -600,7 +600,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = {
     117,112,108,101,114,127,0,0,0,114,121,0,0,0,114,107,
     0,0,0,114,113,0,0,0,41,1,114,120,0,0,0,114,
     7,0,0,0,114,7,0,0,0,114,8,0,0,0,218,11,
-    95,103,101,116,95,99,97,99,104,101,100,253,1,0,0,115,
+    95,103,101,116,95,99,97,99,104,101,100,254,1,0,0,115,
     18,0,0,0,14,1,2,1,10,1,12,1,6,1,14,1,
     4,1,4,2,2,251,114,137,0,0,0,99,1,0,0,0,
     0,0,0,0,0,0,0,0,2,0,0,0,8,0,0,0,
@@ -615,7 +615,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = {
     0,0,114,77,0,0,0,114,76,0,0,0,41,2,114,65,
     0,0,0,114,78,0,0,0,114,7,0,0,0,114,7,0,
     0,0,114,8,0,0,0,218,10,95,99,97,108,99,95,109,
-    111,100,101,9,2,0,0,115,14,0,0,0,2,2,14,1,
+    111,100,101,10,2,0,0,115,14,0,0,0,2,2,14,1,
     12,1,6,1,8,3,4,1,2,251,114,139,0,0,0,99,
     1,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,
     4,0,0,0,3,0,0,0,115,52,0,0,0,100,6,135,
@@ -652,7 +652,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = {
     141,0,0,0,218,4,97,114,103,115,218,6,107,119,97,114,
     103,115,169,1,218,6,109,101,116,104,111,100,114,7,0,0,
     0,114,8,0,0,0,218,19,95,99,104,101,99,107,95,110,
-    97,109,101,95,119,114,97,112,112,101,114,29,2,0,0,115,
+    97,109,101,95,119,114,97,112,112,101,114,30,2,0,0,115,
     18,0,0,0,8,1,8,1,10,1,4,1,8,1,2,255,
     2,1,6,255,24,2,122,40,95,99,104,101,99,107,95,110,
     97,109,101,46,60,108,111,99,97,108,115,62,46,95,99,104,
@@ -670,7 +670,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = {
     116,97,116,116,114,218,8,95,95,100,105,99,116,95,95,218,
     6,117,112,100,97,116,101,41,3,90,3,110,101,119,90,3,
     111,108,100,114,85,0,0,0,114,7,0,0,0,114,7,0,
-    0,0,114,8,0,0,0,218,5,95,119,114,97,112,42,2,
+    0,0,114,8,0,0,0,218,5,95,119,114,97,112,43,2,
     0,0,115,10,0,0,0,8,1,10,1,18,1,2,128,18,
     1,122,26,95,99,104,101,99,107,95,110,97,109,101,46,60,
     108,111,99,97,108,115,62,46,95,119,114,97,112,114,69,0,
@@ -678,7 +678,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = {
     114,158,0,0,0,41,3,114,147,0,0,0,114,148,0,0,
     0,114,158,0,0,0,114,7,0,0,0,114,146,0,0,0,
     114,8,0,0,0,218,11,95,99,104,101,99,107,95,110,97,
-    109,101,21,2,0,0,115,12,0,0,0,14,8,8,10,8,
+    109,101,22,2,0,0,115,12,0,0,0,14,8,8,10,8,
     1,8,2,10,6,4,1,114,160,0,0,0,99,2,0,0,
     0,0,0,0,0,0,0,0,0,5,0,0,0,6,0,0,
     0,67,0,0,0,115,72,0,0,0,116,0,160,1,100,1,
@@ -713,7 +713,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = {
     114,218,8,112,111,114,116,105,111,110,115,218,3,109,115,103,
     114,7,0,0,0,114,7,0,0,0,114,8,0,0,0,218,
     17,95,102,105,110,100,95,109,111,100,117,108,101,95,115,104,
-    105,109,52,2,0,0,115,16,0,0,0,6,7,2,2,4,
+    105,109,53,2,0,0,115,16,0,0,0,6,7,2,2,4,
     254,14,6,16,1,4,1,22,1,4,1,114,167,0,0,0,
     99,3,0,0,0,0,0,0,0,0,0,0,0,6,0,0,
     0,4,0,0,0,67,0,0,0,115,166,0,0,0,124,0,
@@ -780,7 +780,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = {
     101,120,99,95,100,101,116,97,105,108,115,90,5,109,97,103,
     105,99,114,117,0,0,0,114,16,0,0,0,114,7,0,0,
     0,114,7,0,0,0,114,8,0,0,0,218,13,95,99,108,
-    97,115,115,105,102,121,95,112,121,99,72,2,0,0,115,28,
+    97,115,115,105,102,121,95,112,121,99,73,2,0,0,115,28,
     0,0,0,12,16,8,1,16,1,12,1,16,1,12,1,10,
     1,12,1,8,1,16,1,8,2,16,1,16,1,4,1,114,
     176,0,0,0,99,5,0,0,0,0,0,0,0,0,0,0,
@@ -835,7 +835,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = {
     101,95,115,105,122,101,114,141,0,0,0,114,175,0,0,0,
     114,117,0,0,0,114,7,0,0,0,114,7,0,0,0,114,
     8,0,0,0,218,23,95,118,97,108,105,100,97,116,101,95,
-    116,105,109,101,115,116,97,109,112,95,112,121,99,105,2,0,
+    116,105,109,101,115,116,97,109,112,95,112,121,99,106,2,0,
     0,115,18,0,0,0,24,19,10,1,12,1,16,1,8,1,
     22,1,2,255,22,2,8,254,114,180,0,0,0,99,4,0,
     0,0,0,0,0,0,0,0,0,0,4,0,0,0,4,0,
@@ -882,7 +882,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = {
     95,104,97,115,104,114,141,0,0,0,114,175,0,0,0,114,
     7,0,0,0,114,7,0,0,0,114,8,0,0,0,218,18,
     95,118,97,108,105,100,97,116,101,95,104,97,115,104,95,112,
-    121,99,133,2,0,0,115,14,0,0,0,16,17,2,1,8,
+    121,99,134,2,0,0,115,14,0,0,0,16,17,2,1,8,
     1,4,255,2,2,6,254,4,255,114,182,0,0,0,99,4,
     0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,5,
     0,0,0,67,0,0,0,115,76,0,0,0,116,0,160,1,
@@ -906,7 +906,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = {
     0,0,0,114,134,0,0,0,218,4,99,111,100,101,114,7,
     0,0,0,114,7,0,0,0,114,8,0,0,0,218,17,95,
     99,111,109,112,105,108,101,95,98,121,116,101,99,111,100,101,
-    157,2,0,0,115,18,0,0,0,10,2,10,1,12,1,8,
+    158,2,0,0,115,18,0,0,0,10,2,10,1,12,1,8,
     1,12,1,4,1,10,2,4,1,6,255,114,189,0,0,0,
     99,3,0,0,0,0,0,0,0,0,0,0,0,4,0,0,
     0,5,0,0,0,67,0,0,0,115,70,0,0,0,116,0,
@@ -924,7 +924,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = {
     109,101,114,179,0,0,0,114,41,0,0,0,114,7,0,0,
     0,114,7,0,0,0,114,8,0,0,0,218,22,95,99,111,
     100,101,95,116,111,95,116,105,109,101,115,116,97,109,112,95,
-    112,121,99,170,2,0,0,115,12,0,0,0,8,2,14,1,
+    112,121,99,171,2,0,0,115,12,0,0,0,8,2,14,1,
     14,1,14,1,16,1,4,1,114,194,0,0,0,84,99,3,
     0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,5,
     0,0,0,67,0,0,0,115,80,0,0,0,116,0,116,1,
@@ -942,7 +942,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = {
     0,0,90,7,99,104,101,99,107,101,100,114,41,0,0,0,
     114,16,0,0,0,114,7,0,0,0,114,7,0,0,0,114,
     8,0,0,0,218,17,95,99,111,100,101,95,116,111,95,104,
-    97,115,104,95,112,121,99,180,2,0,0,115,14,0,0,0,
+    97,115,104,95,112,121,99,181,2,0,0,115,14,0,0,0,
     8,2,12,1,14,1,16,1,10,1,16,1,4,1,114,195,
     0,0,0,99,1,0,0,0,0,0,0,0,0,0,0,0,
     5,0,0,0,6,0,0,0,67,0,0,0,115,62,0,0,
@@ -970,7 +970,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = {
     103,90,15,110,101,119,108,105,110,101,95,100,101,99,111,100,
     101,114,114,7,0,0,0,114,7,0,0,0,114,8,0,0,
     0,218,13,100,101,99,111,100,101,95,115,111,117,114,99,101,
-    191,2,0,0,115,10,0,0,0,8,5,12,1,10,1,12,
+    192,2,0,0,115,10,0,0,0,8,5,12,1,10,1,12,
     1,20,1,114,200,0,0,0,169,2,114,164,0,0,0,218,
     26,115,117,98,109,111,100,117,108,101,95,115,101,97,114,99,
     104,95,108,111,99,97,116,105,111,110,115,99,2,0,0,0,
@@ -1035,7 +1035,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = {
     7,100,105,114,110,97,109,101,114,7,0,0,0,114,7,0,
     0,0,114,8,0,0,0,218,23,115,112,101,99,95,102,114,
     111,109,95,102,105,108,101,95,108,111,99,97,116,105,111,110,
-    208,2,0,0,115,84,0,0,0,8,12,4,4,10,1,2,
+    209,2,0,0,115,84,0,0,0,8,12,4,4,10,1,2,
     2,14,1,12,1,4,1,2,251,10,7,8,1,2,1,18,
     1,12,1,2,1,16,8,6,1,8,3,14,1,14,1,10,
     1,6,1,4,1,2,253,4,5,8,3,10,2,2,1,14,
@@ -1074,7 +1074,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = {
     76,79,67,65,76,95,77,65,67,72,73,78,69,114,19,0,
     0,0,114,7,0,0,0,114,7,0,0,0,114,8,0,0,
     0,218,14,95,111,112,101,110,95,114,101,103,105,115,116,114,
-    121,37,3,0,0,115,10,0,0,0,2,2,16,1,12,1,
+    121,38,3,0,0,115,10,0,0,0,2,2,16,1,12,1,
     18,1,2,255,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,
@@ -1101,7 +1101,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = {
     114,20,0,0,0,90,4,104,107,101,121,218,8,102,105,108,
     101,112,97,116,104,114,7,0,0,0,114,7,0,0,0,114,
     8,0,0,0,218,16,95,115,101,97,114,99,104,95,114,101,
-    103,105,115,116,114,121,44,3,0,0,115,30,0,0,0,6,
+    103,105,115,116,114,121,45,3,0,0,115,30,0,0,0,6,
     2,8,1,6,2,6,1,16,1,6,255,2,2,12,1,14,
     1,28,255,2,128,4,4,12,254,6,1,2,255,122,38,87,
     105,110,100,111,119,115,82,101,103,105,115,116,114,121,70,105,
@@ -1124,7 +1124,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = {
     114,103,101,116,114,222,0,0,0,114,164,0,0,0,114,212,
     0,0,0,114,210,0,0,0,114,7,0,0,0,114,7,0,
     0,0,114,8,0,0,0,218,9,102,105,110,100,95,115,112,
-    101,99,59,3,0,0,115,34,0,0,0,10,2,8,1,4,
+    101,99,60,3,0,0,115,34,0,0,0,10,2,8,1,4,
     1,2,1,12,1,12,1,6,1,14,1,14,1,6,1,8,
     1,2,1,6,254,8,3,2,252,4,255,2,254,122,31,87,
     105,110,100,111,119,115,82,101,103,105,115,116,114,121,70,105,
@@ -1152,7 +1152,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = {
     0,0,169,4,114,221,0,0,0,114,163,0,0,0,114,65,
     0,0,0,114,210,0,0,0,114,7,0,0,0,114,7,0,
     0,0,114,8,0,0,0,218,11,102,105,110,100,95,109,111,
-    100,117,108,101,75,3,0,0,115,14,0,0,0,6,7,2,
+    100,117,108,101,76,3,0,0,115,14,0,0,0,6,7,2,
     2,4,254,12,3,8,1,6,1,4,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,169,2,
@@ -1165,7 +1165,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = {
     218,11,99,108,97,115,115,109,101,116,104,111,100,114,223,0,
     0,0,114,226,0,0,0,114,229,0,0,0,114,7,0,0,
     0,114,7,0,0,0,114,7,0,0,0,114,8,0,0,0,
-    114,214,0,0,0,25,3,0,0,115,30,0,0,0,8,0,
+    114,214,0,0,0,26,3,0,0,115,30,0,0,0,8,0,
     4,2,2,3,2,255,2,4,2,255,12,3,2,2,10,1,
     2,6,10,1,2,14,12,1,2,15,16,1,114,214,0,0,
     0,99,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
@@ -1201,7 +1201,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = {
     114,163,0,0,0,114,120,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,7,0,0,0,114,7,0,0,0,114,8,
-    0,0,0,114,206,0,0,0,97,3,0,0,115,8,0,0,
+    0,0,0,114,206,0,0,0,98,3,0,0,115,8,0,0,
     0,18,3,16,1,14,1,16,1,122,24,95,76,111,97,100,
     101,114,66,97,115,105,99,115,46,105,115,95,112,97,99,107,
     97,103,101,99,2,0,0,0,0,0,0,0,0,0,0,0,
@@ -1211,7 +1211,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = {
     111,100,117,108,101,32,99,114,101,97,116,105,111,110,46,78,
     114,7,0,0,0,169,2,114,143,0,0,0,114,210,0,0,
     0,114,7,0,0,0,114,7,0,0,0,114,8,0,0,0,
-    218,13,99,114,101,97,116,101,95,109,111,100,117,108,101,105,
+    218,13,99,114,101,97,116,101,95,109,111,100,117,108,101,106,
     3,0,0,243,2,0,0,0,4,0,122,27,95,76,111,97,
     100,101,114,66,97,115,105,99,115,46,99,114,101,97,116,101,
     95,109,111,100,117,108,101,99,2,0,0,0,0,0,0,0,
@@ -1232,7 +1232,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = {
     0,41,3,114,143,0,0,0,218,6,109,111,100,117,108,101,
     114,188,0,0,0,114,7,0,0,0,114,7,0,0,0,114,
     8,0,0,0,218,11,101,120,101,99,95,109,111,100,117,108,
-    101,108,3,0,0,115,12,0,0,0,12,2,8,1,4,1,
+    101,109,3,0,0,115,12,0,0,0,12,2,8,1,4,1,
     8,1,4,255,20,2,122,25,95,76,111,97,100,101,114,66,
     97,115,105,99,115,46,101,120,101,99,95,109,111,100,117,108,
     101,99,2,0,0,0,0,0,0,0,0,0,0,0,2,0,
@@ -1243,14 +1243,14 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = {
     0,218,17,95,108,111,97,100,95,109,111,100,117,108,101,95,
     115,104,105,109,169,2,114,143,0,0,0,114,163,0,0,0,
     114,7,0,0,0,114,7,0,0,0,114,8,0,0,0,218,
-    11,108,111,97,100,95,109,111,100,117,108,101,116,3,0,0,
+    11,108,111,97,100,95,109,111,100,117,108,101,117,3,0,0,
     115,2,0,0,0,12,3,122,25,95,76,111,97,100,101,114,
     66,97,115,105,99,115,46,108,111,97,100,95,109,111,100,117,
     108,101,78,41,8,114,150,0,0,0,114,149,0,0,0,114,
     151,0,0,0,114,152,0,0,0,114,206,0,0,0,114,239,
     0,0,0,114,245,0,0,0,114,248,0,0,0,114,7,0,
     0,0,114,7,0,0,0,114,7,0,0,0,114,8,0,0,
-    0,114,235,0,0,0,92,3,0,0,115,12,0,0,0,8,
+    0,114,235,0,0,0,93,3,0,0,115,12,0,0,0,8,
     0,4,2,8,3,8,8,8,3,12,8,114,235,0,0,0,
     99,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
     0,3,0,0,0,64,0,0,0,115,74,0,0,0,101,0,
@@ -1275,7 +1275,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = {
     32,32,32,78,41,1,114,76,0,0,0,169,2,114,143,0,
     0,0,114,65,0,0,0,114,7,0,0,0,114,7,0,0,
     0,114,8,0,0,0,218,10,112,97,116,104,95,109,116,105,
-    109,101,124,3,0,0,115,2,0,0,0,4,6,122,23,83,
+    109,101,125,3,0,0,115,2,0,0,0,4,6,122,23,83,
     111,117,114,99,101,76,111,97,100,101,114,46,112,97,116,104,
     95,109,116,105,109,101,99,2,0,0,0,0,0,0,0,0,
     0,0,0,2,0,0,0,4,0,0,0,67,0,0,0,115,
@@ -1309,7 +1309,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = {
     32,32,32,32,32,32,32,114,193,0,0,0,78,41,1,114,
     251,0,0,0,114,250,0,0,0,114,7,0,0,0,114,7,
     0,0,0,114,8,0,0,0,218,10,112,97,116,104,95,115,
-    116,97,116,115,132,3,0,0,115,2,0,0,0,14,12,122,
+    116,97,116,115,133,3,0,0,115,2,0,0,0,14,12,122,
     23,83,111,117,114,99,101,76,111,97,100,101,114,46,112,97,
     116,104,95,115,116,97,116,115,99,4,0,0,0,0,0,0,
     0,0,0,0,0,4,0,0,0,4,0,0,0,67,0,0,
@@ -1333,7 +1333,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = {
     0,0,0,90,10,99,97,99,104,101,95,112,97,116,104,114,
     41,0,0,0,114,7,0,0,0,114,7,0,0,0,114,8,
     0,0,0,218,15,95,99,97,99,104,101,95,98,121,116,101,
-    99,111,100,101,146,3,0,0,115,2,0,0,0,12,8,122,
+    99,111,100,101,147,3,0,0,115,2,0,0,0,12,8,122,
     28,83,111,117,114,99,101,76,111,97,100,101,114,46,95,99,
     97,99,104,101,95,98,121,116,101,99,111,100,101,99,3,0,
     0,0,0,0,0,0,0,0,0,0,3,0,0,0,1,0,
@@ -1350,7 +1350,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = {
     32,32,32,32,32,78,114,7,0,0,0,41,3,114,143,0,
     0,0,114,65,0,0,0,114,41,0,0,0,114,7,0,0,
     0,114,7,0,0,0,114,8,0,0,0,114,253,0,0,0,
-    156,3,0,0,114,240,0,0,0,122,21,83,111,117,114,99,
+    157,3,0,0,114,240,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,0,0,0,0,5,0,0,
     0,10,0,0,0,67,0,0,0,115,70,0,0,0,124,0,
@@ -1370,7 +1370,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = {
     0,0,114,163,0,0,0,114,65,0,0,0,114,198,0,0,
     0,218,3,101,120,99,114,7,0,0,0,114,7,0,0,0,
     114,8,0,0,0,218,10,103,101,116,95,115,111,117,114,99,
-    101,163,3,0,0,115,24,0,0,0,10,2,2,1,12,1,
+    101,164,3,0,0,115,24,0,0,0,10,2,2,1,12,1,
     8,4,14,253,4,1,2,1,4,255,2,1,2,255,8,128,
     2,255,122,23,83,111,117,114,99,101,76,111,97,100,101,114,
     46,103,101,116,95,115,111,117,114,99,101,114,130,0,0,0,
@@ -1392,7 +1392,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = {
     7,99,111,109,112,105,108,101,41,4,114,143,0,0,0,114,
     41,0,0,0,114,65,0,0,0,114,2,1,0,0,114,7,
     0,0,0,114,7,0,0,0,114,8,0,0,0,218,14,115,
-    111,117,114,99,101,95,116,111,95,99,111,100,101,173,3,0,
+    111,117,114,99,101,95,116,111,95,99,111,100,101,174,3,0,
     0,115,6,0,0,0,12,5,4,1,6,255,122,27,83,111,
     117,114,99,101,76,111,97,100,101,114,46,115,111,117,114,99,
     101,95,116,111,95,99,111,100,101,99,2,0,0,0,0,0,
@@ -1468,7 +1468,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = {
     2,115,116,114,41,0,0,0,114,175,0,0,0,114,16,0,
     0,0,90,10,98,121,116,101,115,95,100,97,116,97,90,11,
     99,111,100,101,95,111,98,106,101,99,116,114,7,0,0,0,
-    114,7,0,0,0,114,8,0,0,0,114,241,0,0,0,181,
+    114,7,0,0,0,114,8,0,0,0,114,241,0,0,0,182,
     3,0,0,115,168,0,0,0,10,7,4,1,4,1,4,1,
     4,1,4,1,2,1,12,1,14,1,8,1,2,2,14,1,
     14,1,4,1,12,2,2,1,14,1,14,1,4,1,2,3,
@@ -1486,7 +1486,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = {
     0,0,0,114,254,0,0,0,114,253,0,0,0,114,1,1,
     0,0,114,5,1,0,0,114,241,0,0,0,114,7,0,0,
     0,114,7,0,0,0,114,7,0,0,0,114,8,0,0,0,
-    114,249,0,0,0,122,3,0,0,115,16,0,0,0,8,0,
+    114,249,0,0,0,123,3,0,0,115,16,0,0,0,8,0,
     8,2,8,8,8,14,8,10,8,7,14,10,12,8,114,249,
     0,0,0,99,0,0,0,0,0,0,0,0,0,0,0,0,
     0,0,0,0,4,0,0,0,0,0,0,0,115,92,0,0,
@@ -1513,7 +1513,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = {
     101,10,32,32,32,32,32,32,32,32,102,105,110,100,101,114,
     46,78,114,183,0,0,0,41,3,114,143,0,0,0,114,163,
     0,0,0,114,65,0,0,0,114,7,0,0,0,114,7,0,
-    0,0,114,8,0,0,0,114,236,0,0,0,15,4,0,0,
+    0,0,114,8,0,0,0,114,236,0,0,0,16,4,0,0,
     115,4,0,0,0,6,3,10,1,122,19,70,105,108,101,76,
     111,97,100,101,114,46,95,95,105,110,105,116,95,95,99,2,
     0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,2,
@@ -1523,7 +1523,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = {
     108,97,115,115,95,95,114,156,0,0,0,169,2,114,143,0,
     0,0,90,5,111,116,104,101,114,114,7,0,0,0,114,7,
     0,0,0,114,8,0,0,0,218,6,95,95,101,113,95,95,
-    21,4,0,0,243,6,0,0,0,12,1,10,1,2,255,122,
+    22,4,0,0,243,6,0,0,0,12,1,10,1,2,255,122,
     17,70,105,108,101,76,111,97,100,101,114,46,95,95,101,113,
     95,95,99,1,0,0,0,0,0,0,0,0,0,0,0,1,
     0,0,0,3,0,0,0,67,0,0,0,243,20,0,0,0,
@@ -1531,7 +1531,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = {
     65,0,83,0,114,69,0,0,0,169,3,218,4,104,97,115,
     104,114,141,0,0,0,114,65,0,0,0,169,1,114,143,0,
     0,0,114,7,0,0,0,114,7,0,0,0,114,8,0,0,
-    0,218,8,95,95,104,97,115,104,95,95,25,4,0,0,243,
+    0,218,8,95,95,104,97,115,104,95,95,26,4,0,0,243,
     2,0,0,0,20,1,122,19,70,105,108,101,76,111,97,100,
     101,114,46,95,95,104,97,115,104,95,95,99,2,0,0,0,
     0,0,0,0,0,0,0,0,2,0,0,0,3,0,0,0,
@@ -1546,7 +1546,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = {
     32,78,41,3,218,5,115,117,112,101,114,114,11,1,0,0,
     114,248,0,0,0,114,247,0,0,0,169,1,114,14,1,0,
     0,114,7,0,0,0,114,8,0,0,0,114,248,0,0,0,
-    28,4,0,0,115,2,0,0,0,16,10,122,22,70,105,108,
+    29,4,0,0,115,2,0,0,0,16,10,122,22,70,105,108,
     101,76,111,97,100,101,114,46,108,111,97,100,95,109,111,100,
     117,108,101,99,2,0,0,0,0,0,0,0,0,0,0,0,
     2,0,0,0,1,0,0,0,67,0,0,0,243,6,0,0,
@@ -1556,7 +1556,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = {
     32,102,111,117,110,100,32,98,121,32,116,104,101,32,102,105,
     110,100,101,114,46,78,114,71,0,0,0,114,247,0,0,0,
     114,7,0,0,0,114,7,0,0,0,114,8,0,0,0,114,
-    203,0,0,0,40,4,0,0,243,2,0,0,0,6,3,122,
+    203,0,0,0,41,4,0,0,243,2,0,0,0,6,3,122,
     23,70,105,108,101,76,111,97,100,101,114,46,103,101,116,95,
     102,105,108,101,110,97,109,101,99,2,0,0,0,0,0,0,
     0,0,0,0,0,3,0,0,0,8,0,0,0,67,0,0,
@@ -1577,7 +1577,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = {
     110,95,99,111,100,101,114,109,0,0,0,90,4,114,101,97,
     100,114,92,0,0,0,41,3,114,143,0,0,0,114,65,0,
     0,0,114,94,0,0,0,114,7,0,0,0,114,7,0,0,
-    0,114,8,0,0,0,114,255,0,0,0,45,4,0,0,115,
+    0,114,8,0,0,0,114,255,0,0,0,46,4,0,0,115,
     22,0,0,0,14,2,16,1,6,1,14,255,2,1,20,255,
     14,3,6,1,14,255,2,1,20,255,122,19,70,105,108,101,
     76,111,97,100,101,114,46,103,101,116,95,100,97,116,97,99,
@@ -1590,7 +1590,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = {
     0,41,3,114,143,0,0,0,114,244,0,0,0,114,31,1,
     0,0,114,7,0,0,0,114,7,0,0,0,114,8,0,0,
     0,218,19,103,101,116,95,114,101,115,111,117,114,99,101,95,
-    114,101,97,100,101,114,54,4,0,0,115,4,0,0,0,12,
+    114,101,97,100,101,114,55,4,0,0,115,4,0,0,0,12,
     2,8,1,122,30,70,105,108,101,76,111,97,100,101,114,46,
     103,101,116,95,114,101,115,111,117,114,99,101,95,114,101,97,
     100,101,114,41,13,114,150,0,0,0,114,149,0,0,0,114,
@@ -1599,7 +1599,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = {
     0,0,114,203,0,0,0,114,255,0,0,0,114,33,1,0,
     0,90,13,95,95,99,108,97,115,115,99,101,108,108,95,95,
     114,7,0,0,0,114,7,0,0,0,114,25,1,0,0,114,
-    8,0,0,0,114,11,1,0,0,10,4,0,0,115,24,0,
+    8,0,0,0,114,11,1,0,0,11,4,0,0,115,24,0,
     0,0,8,0,4,2,8,3,8,6,8,4,2,3,14,1,
     2,11,10,1,8,4,2,9,18,1,114,11,1,0,0,99,
     0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
@@ -1622,7 +1622,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = {
     95,109,116,105,109,101,90,7,115,116,95,115,105,122,101,41,
     3,114,143,0,0,0,114,65,0,0,0,114,10,1,0,0,
     114,7,0,0,0,114,7,0,0,0,114,8,0,0,0,114,
-    252,0,0,0,64,4,0,0,115,4,0,0,0,8,2,14,
+    252,0,0,0,65,4,0,0,115,4,0,0,0,8,2,14,
     1,122,27,83,111,117,114,99,101,70,105,108,101,76,111,97,
     100,101,114,46,112,97,116,104,95,115,116,97,116,115,99,4,
     0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,5,
@@ -1632,7 +1632,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = {
     41,2,114,139,0,0,0,114,253,0,0,0,41,5,114,143,
     0,0,0,114,134,0,0,0,114,132,0,0,0,114,41,0,
     0,0,114,78,0,0,0,114,7,0,0,0,114,7,0,0,
-    0,114,8,0,0,0,114,254,0,0,0,69,4,0,0,115,
+    0,114,8,0,0,0,114,254,0,0,0,70,4,0,0,115,
     4,0,0,0,8,2,16,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,87,0,0,0,114,
@@ -1668,7 +1668,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = {
     0,0,218,6,112,97,114,101,110,116,114,120,0,0,0,114,
     63,0,0,0,114,68,0,0,0,114,0,1,0,0,114,7,
     0,0,0,114,7,0,0,0,114,8,0,0,0,114,253,0,
-    0,0,74,4,0,0,115,56,0,0,0,12,2,4,1,12,
+    0,0,75,4,0,0,115,56,0,0,0,12,2,4,1,12,
     2,12,1,10,1,12,254,12,4,10,1,2,1,14,1,12,
     1,4,2,14,1,6,3,4,1,4,255,16,2,8,128,2,
     1,12,1,18,1,14,1,8,2,2,1,18,255,8,128,2,
@@ -1677,7 +1677,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = {
     7,114,150,0,0,0,114,149,0,0,0,114,151,0,0,0,
     114,152,0,0,0,114,252,0,0,0,114,254,0,0,0,114,
     253,0,0,0,114,7,0,0,0,114,7,0,0,0,114,7,
-    0,0,0,114,8,0,0,0,114,34,1,0,0,60,4,0,
+    0,0,0,114,8,0,0,0,114,34,1,0,0,61,4,0,
     0,115,10,0,0,0,8,0,4,2,8,2,8,5,18,5,
     114,34,1,0,0,99,0,0,0,0,0,0,0,0,0,0,
     0,0,0,0,0,0,2,0,0,0,64,0,0,0,115,32,
@@ -1699,7 +1699,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = {
     0,114,176,0,0,0,114,189,0,0,0,114,7,1,0,0,
     41,5,114,143,0,0,0,114,163,0,0,0,114,65,0,0,
     0,114,41,0,0,0,114,175,0,0,0,114,7,0,0,0,
-    114,7,0,0,0,114,8,0,0,0,114,241,0,0,0,109,
+    114,7,0,0,0,114,8,0,0,0,114,241,0,0,0,110,
     4,0,0,115,22,0,0,0,10,1,10,1,2,4,2,1,
     6,254,12,4,2,1,14,1,2,1,2,1,6,253,122,29,
     83,111,117,114,99,101,108,101,115,115,70,105,108,101,76,111,
@@ -1710,13 +1710,13 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = {
     101,114,101,32,105,115,32,110,111,32,115,111,117,114,99,101,
     32,99,111,100,101,46,78,114,7,0,0,0,114,247,0,0,
     0,114,7,0,0,0,114,7,0,0,0,114,8,0,0,0,
-    114,1,1,0,0,125,4,0,0,114,24,0,0,0,122,31,
+    114,1,1,0,0,126,4,0,0,114,24,0,0,0,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,150,0,0,0,114,149,0,0,0,114,151,0,0,
     0,114,152,0,0,0,114,241,0,0,0,114,1,1,0,0,
     114,7,0,0,0,114,7,0,0,0,114,7,0,0,0,114,
-    8,0,0,0,114,41,1,0,0,105,4,0,0,115,8,0,
+    8,0,0,0,114,41,1,0,0,106,4,0,0,115,8,0,
     0,0,8,0,4,2,8,2,12,16,114,41,1,0,0,99,
     0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
     3,0,0,0,64,0,0,0,115,92,0,0,0,101,0,90,
@@ -1737,20 +1737,20 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = {
     0,95,0,124,2,124,0,95,1,100,0,83,0,114,69,0,
     0,0,114,183,0,0,0,41,3,114,143,0,0,0,114,141,
     0,0,0,114,65,0,0,0,114,7,0,0,0,114,7,0,
-    0,0,114,8,0,0,0,114,236,0,0,0,138,4,0,0,
+    0,0,114,8,0,0,0,114,236,0,0,0,139,4,0,0,
     115,4,0,0,0,6,1,10,1,122,28,69,120,116,101,110,
     115,105,111,110,70,105,108,101,76,111,97,100,101,114,46,95,
     95,105,110,105,116,95,95,99,2,0,0,0,0,0,0,0,
     0,0,0,0,2,0,0,0,2,0,0,0,67,0,0,0,
     114,12,1,0,0,114,69,0,0,0,114,13,1,0,0,114,
     15,1,0,0,114,7,0,0,0,114,7,0,0,0,114,8,
-    0,0,0,114,16,1,0,0,142,4,0,0,114,17,1,0,
+    0,0,0,114,16,1,0,0,143,4,0,0,114,17,1,0,
     0,122,26,69,120,116,101,110,115,105,111,110,70,105,108,101,
     76,111,97,100,101,114,46,95,95,101,113,95,95,99,1,0,
     0,0,0,0,0,0,0,0,0,0,1,0,0,0,3,0,
     0,0,67,0,0,0,114,18,1,0,0,114,69,0,0,0,
     114,19,1,0,0,114,21,1,0,0,114,7,0,0,0,114,
-    7,0,0,0,114,8,0,0,0,114,22,1,0,0,146,4,
+    7,0,0,0,114,8,0,0,0,114,22,1,0,0,147,4,
     0,0,114,23,1,0,0,122,28,69,120,116,101,110,115,105,
     111,110,70,105,108,101,76,111,97,100,101,114,46,95,95,104,
     97,115,104,95,95,99,2,0,0,0,0,0,0,0,0,0,
@@ -1767,7 +1767,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = {
     97,116,101,95,100,121,110,97,109,105,99,114,173,0,0,0,
     114,141,0,0,0,114,65,0,0,0,41,3,114,143,0,0,
     0,114,210,0,0,0,114,244,0,0,0,114,7,0,0,0,
-    114,7,0,0,0,114,8,0,0,0,114,239,0,0,0,149,
+    114,7,0,0,0,114,8,0,0,0,114,239,0,0,0,150,
     4,0,0,115,14,0,0,0,4,2,6,1,4,255,6,2,
     8,1,4,255,4,2,122,33,69,120,116,101,110,115,105,111,
     110,70,105,108,101,76,111,97,100,101,114,46,99,114,101,97,
@@ -1785,7 +1785,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = {
     100,121,110,97,109,105,99,114,173,0,0,0,114,141,0,0,
     0,114,65,0,0,0,169,2,114,143,0,0,0,114,244,0,
     0,0,114,7,0,0,0,114,7,0,0,0,114,8,0,0,
-    0,114,245,0,0,0,157,4,0,0,115,8,0,0,0,14,
+    0,114,245,0,0,0,158,4,0,0,115,8,0,0,0,14,
     2,6,1,8,1,8,255,122,31,69,120,116,101,110,115,105,
     111,110,70,105,108,101,76,111,97,100,101,114,46,101,120,101,
     99,95,109,111,100,117,108,101,99,2,0,0,0,0,0,0,
@@ -1803,14 +1803,14 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = {
     114,236,0,0,0,78,114,7,0,0,0,169,2,114,5,0,
     0,0,218,6,115,117,102,102,105,120,169,1,90,9,102,105,
     108,101,95,110,97,109,101,114,7,0,0,0,114,8,0,0,
-    0,114,9,0,0,0,166,4,0,0,115,6,0,0,0,6,
+    0,114,9,0,0,0,167,4,0,0,115,6,0,0,0,6,
     128,2,1,20,255,122,49,69,120,116,101,110,115,105,111,110,
     70,105,108,101,76,111,97,100,101,114,46,105,115,95,112,97,
     99,107,97,103,101,46,60,108,111,99,97,108,115,62,46,60,
     103,101,110,101,120,112,114,62,78,41,4,114,74,0,0,0,
     114,65,0,0,0,218,3,97,110,121,114,232,0,0,0,114,
     247,0,0,0,114,7,0,0,0,114,45,1,0,0,114,8,
-    0,0,0,114,206,0,0,0,163,4,0,0,115,8,0,0,
+    0,0,0,114,206,0,0,0,164,4,0,0,115,8,0,0,
     0,14,2,12,1,2,1,8,255,122,30,69,120,116,101,110,
     115,105,111,110,70,105,108,101,76,111,97,100,101,114,46,105,
     115,95,112,97,99,107,97,103,101,99,2,0,0,0,0,0,
@@ -1821,7 +1821,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = {
     110,110,111,116,32,99,114,101,97,116,101,32,97,32,99,111,
     100,101,32,111,98,106,101,99,116,46,78,114,7,0,0,0,
     114,247,0,0,0,114,7,0,0,0,114,7,0,0,0,114,
-    8,0,0,0,114,241,0,0,0,169,4,0,0,114,24,0,
+    8,0,0,0,114,241,0,0,0,170,4,0,0,114,24,0,
     0,0,122,28,69,120,116,101,110,115,105,111,110,70,105,108,
     101,76,111,97,100,101,114,46,103,101,116,95,99,111,100,101,
     99,2,0,0,0,0,0,0,0,0,0,0,0,2,0,0,
@@ -1831,14 +1831,14 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = {
     101,115,32,104,97,118,101,32,110,111,32,115,111,117,114,99,
     101,32,99,111,100,101,46,78,114,7,0,0,0,114,247,0,
     0,0,114,7,0,0,0,114,7,0,0,0,114,8,0,0,
-    0,114,1,1,0,0,173,4,0,0,114,24,0,0,0,122,
+    0,114,1,1,0,0,174,4,0,0,114,24,0,0,0,122,
     30,69,120,116,101,110,115,105,111,110,70,105,108,101,76,111,
     97,100,101,114,46,103,101,116,95,115,111,117,114,99,101,99,
     2,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,
     1,0,0,0,67,0,0,0,114,26,1,0,0,114,27,1,
     0,0,114,71,0,0,0,114,247,0,0,0,114,7,0,0,
     0,114,7,0,0,0,114,8,0,0,0,114,203,0,0,0,
-    177,4,0,0,114,28,1,0,0,122,32,69,120,116,101,110,
+    178,4,0,0,114,28,1,0,0,122,32,69,120,116,101,110,
     115,105,111,110,70,105,108,101,76,111,97,100,101,114,46,103,
     101,116,95,102,105,108,101,110,97,109,101,78,41,14,114,150,
     0,0,0,114,149,0,0,0,114,151,0,0,0,114,152,0,
@@ -1846,7 +1846,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = {
     0,114,239,0,0,0,114,245,0,0,0,114,206,0,0,0,
     114,241,0,0,0,114,1,1,0,0,114,160,0,0,0,114,
     203,0,0,0,114,7,0,0,0,114,7,0,0,0,114,7,
-    0,0,0,114,8,0,0,0,114,30,1,0,0,130,4,0,
+    0,0,0,114,8,0,0,0,114,30,1,0,0,131,4,0,
     0,115,24,0,0,0,8,0,4,2,8,6,8,4,8,4,
     8,3,8,8,8,6,8,6,8,4,2,4,14,1,114,30,
     1,0,0,99,0,0,0,0,0,0,0,0,0,0,0,0,
@@ -1889,7 +1889,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = {
     105,110,100,101,114,169,4,114,143,0,0,0,114,141,0,0,
     0,114,65,0,0,0,90,11,112,97,116,104,95,102,105,110,
     100,101,114,114,7,0,0,0,114,7,0,0,0,114,8,0,
-    0,0,114,236,0,0,0,190,4,0,0,115,8,0,0,0,
+    0,0,114,236,0,0,0,191,4,0,0,115,8,0,0,0,
     6,1,6,1,14,1,10,1,122,23,95,78,97,109,101,115,
     112,97,99,101,80,97,116,104,46,95,95,105,110,105,116,95,
     95,99,1,0,0,0,0,0,0,0,0,0,0,0,4,0,
@@ -1907,7 +1907,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = {
     218,3,100,111,116,90,2,109,101,114,7,0,0,0,114,7,
     0,0,0,114,8,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,196,4,0,0,115,8,0,0,0,18,2,8,1,4,2,
+    115,197,4,0,0,115,8,0,0,0,18,2,8,1,4,2,
     8,3,122,38,95,78,97,109,101,115,112,97,99,101,80,97,
     116,104,46,95,102,105,110,100,95,112,97,114,101,110,116,95,
     112,97,116,104,95,110,97,109,101,115,99,1,0,0,0,0,
@@ -1920,7 +1920,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = {
     110,116,95,109,111,100,117,108,101,95,110,97,109,101,90,14,
     112,97,116,104,95,97,116,116,114,95,110,97,109,101,114,7,
     0,0,0,114,7,0,0,0,114,8,0,0,0,114,50,1,
-    0,0,206,4,0,0,115,4,0,0,0,12,1,16,1,122,
+    0,0,207,4,0,0,115,4,0,0,0,12,1,16,1,122,
     31,95,78,97,109,101,115,112,97,99,101,80,97,116,104,46,
     95,103,101,116,95,112,97,114,101,110,116,95,112,97,116,104,
     99,1,0,0,0,0,0,0,0,0,0,0,0,3,0,0,
@@ -1936,7 +1936,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = {
     143,0,0,0,90,11,112,97,114,101,110,116,95,112,97,116,
     104,114,210,0,0,0,114,7,0,0,0,114,7,0,0,0,
     114,8,0,0,0,218,12,95,114,101,99,97,108,99,117,108,
-    97,116,101,210,4,0,0,115,16,0,0,0,12,2,10,1,
+    97,116,101,211,4,0,0,115,16,0,0,0,12,2,10,1,
     14,1,18,3,6,1,8,1,6,1,6,1,122,27,95,78,
     97,109,101,115,112,97,99,101,80,97,116,104,46,95,114,101,
     99,97,108,99,117,108,97,116,101,99,1,0,0,0,0,0,
@@ -1945,7 +1945,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = {
     1,83,0,114,69,0,0,0,41,2,218,4,105,116,101,114,
     114,57,1,0,0,114,21,1,0,0,114,7,0,0,0,114,
     7,0,0,0,114,8,0,0,0,218,8,95,95,105,116,101,
-    114,95,95,223,4,0,0,243,2,0,0,0,12,1,122,23,
+    114,95,95,224,4,0,0,243,2,0,0,0,12,1,122,23,
     95,78,97,109,101,115,112,97,99,101,80,97,116,104,46,95,
     95,105,116,101,114,95,95,99,2,0,0,0,0,0,0,0,
     0,0,0,0,2,0,0,0,2,0,0,0,67,0,0,0,
@@ -1953,7 +1953,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = {
     0,114,69,0,0,0,169,1,114,57,1,0,0,41,2,114,
     143,0,0,0,218,5,105,110,100,101,120,114,7,0,0,0,
     114,7,0,0,0,114,8,0,0,0,218,11,95,95,103,101,
-    116,105,116,101,109,95,95,226,4,0,0,114,61,1,0,0,
+    116,105,116,101,109,95,95,227,4,0,0,114,61,1,0,0,
     122,26,95,78,97,109,101,115,112,97,99,101,80,97,116,104,
     46,95,95,103,101,116,105,116,101,109,95,95,99,3,0,0,
     0,0,0,0,0,0,0,0,0,3,0,0,0,3,0,0,
@@ -1962,14 +1962,14 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = {
     49,1,0,0,41,3,114,143,0,0,0,114,63,1,0,0,
     114,65,0,0,0,114,7,0,0,0,114,7,0,0,0,114,
     8,0,0,0,218,11,95,95,115,101,116,105,116,101,109,95,
-    95,229,4,0,0,115,2,0,0,0,14,1,122,26,95,78,
+    95,230,4,0,0,115,2,0,0,0,14,1,122,26,95,78,
     97,109,101,115,112,97,99,101,80,97,116,104,46,95,95,115,
     101,116,105,116,101,109,95,95,99,1,0,0,0,0,0,0,
     0,0,0,0,0,1,0,0,0,3,0,0,0,67,0,0,
     0,114,58,1,0,0,114,69,0,0,0,41,2,114,4,0,
     0,0,114,57,1,0,0,114,21,1,0,0,114,7,0,0,
     0,114,7,0,0,0,114,8,0,0,0,218,7,95,95,108,
-    101,110,95,95,232,4,0,0,114,61,1,0,0,122,22,95,
+    101,110,95,95,233,4,0,0,114,61,1,0,0,122,22,95,
     78,97,109,101,115,112,97,99,101,80,97,116,104,46,95,95,
     108,101,110,95,95,99,1,0,0,0,0,0,0,0,0,0,
     0,0,1,0,0,0,3,0,0,0,67,0,0,0,243,12,
@@ -1978,7 +1978,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = {
     116,104,40,123,33,114,125,41,41,2,114,89,0,0,0,114,
     49,1,0,0,114,21,1,0,0,114,7,0,0,0,114,7,
     0,0,0,114,8,0,0,0,218,8,95,95,114,101,112,114,
-    95,95,235,4,0,0,114,61,1,0,0,122,23,95,78,97,
+    95,95,236,4,0,0,114,61,1,0,0,122,23,95,78,97,
     109,101,115,112,97,99,101,80,97,116,104,46,95,95,114,101,
     112,114,95,95,99,2,0,0,0,0,0,0,0,0,0,0,
     0,2,0,0,0,3,0,0,0,67,0,0,0,115,12,0,
@@ -1986,7 +1986,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = {
     0,0,0,114,62,1,0,0,169,2,114,143,0,0,0,218,
     4,105,116,101,109,114,7,0,0,0,114,7,0,0,0,114,
     8,0,0,0,218,12,95,95,99,111,110,116,97,105,110,115,
-    95,95,238,4,0,0,114,61,1,0,0,122,27,95,78,97,
+    95,95,239,4,0,0,114,61,1,0,0,122,27,95,78,97,
     109,101,115,112,97,99,101,80,97,116,104,46,95,95,99,111,
     110,116,97,105,110,115,95,95,99,2,0,0,0,0,0,0,
     0,0,0,0,0,2,0,0,0,3,0,0,0,67,0,0,
@@ -1994,7 +1994,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = {
     1,0,100,0,83,0,114,69,0,0,0,41,2,114,49,1,
     0,0,114,61,0,0,0,114,69,1,0,0,114,7,0,0,
     0,114,7,0,0,0,114,8,0,0,0,114,61,0,0,0,
-    241,4,0,0,243,2,0,0,0,16,1,122,21,95,78,97,
+    242,4,0,0,243,2,0,0,0,16,1,122,21,95,78,97,
     109,101,115,112,97,99,101,80,97,116,104,46,97,112,112,101,
     110,100,78,41,15,114,150,0,0,0,114,149,0,0,0,114,
     151,0,0,0,114,152,0,0,0,114,236,0,0,0,114,55,
@@ -2002,7 +2002,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = {
     0,0,114,64,1,0,0,114,65,1,0,0,114,66,1,0,
     0,114,68,1,0,0,114,71,1,0,0,114,61,0,0,0,
     114,7,0,0,0,114,7,0,0,0,114,7,0,0,0,114,
-    8,0,0,0,114,47,1,0,0,183,4,0,0,115,26,0,
+    8,0,0,0,114,47,1,0,0,184,4,0,0,115,26,0,
     0,0,8,0,4,1,8,6,8,6,8,10,8,4,8,13,
     8,3,8,3,8,3,8,3,8,3,12,3,114,47,1,0,
     0,99,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
@@ -2019,7 +2019,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = {
     3,131,3,124,0,95,1,100,0,83,0,114,69,0,0,0,
     41,2,114,47,1,0,0,114,49,1,0,0,114,53,1,0,
     0,114,7,0,0,0,114,7,0,0,0,114,8,0,0,0,
-    114,236,0,0,0,247,4,0,0,115,2,0,0,0,18,1,
+    114,236,0,0,0,248,4,0,0,115,2,0,0,0,18,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,1,0,0,0,
     0,0,0,0,0,0,0,0,1,0,0,0,4,0,0,0,
@@ -2043,21 +2043,21 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = {
     100,0,0,0,114,101,0,0,0,114,89,0,0,0,114,150,
     0,0,0,41,1,114,244,0,0,0,114,7,0,0,0,114,
     7,0,0,0,114,8,0,0,0,218,11,109,111,100,117,108,
-    101,95,114,101,112,114,250,4,0,0,115,8,0,0,0,6,
+    101,95,114,101,112,114,251,4,0,0,115,8,0,0,0,6,
     7,2,1,4,255,12,2,122,28,95,78,97,109,101,115,112,
     97,99,101,76,111,97,100,101,114,46,109,111,100,117,108,101,
     95,114,101,112,114,99,2,0,0,0,0,0,0,0,0,0,
     0,0,2,0,0,0,1,0,0,0,67,0,0,0,114,23,
     0,0,0,41,2,78,84,114,7,0,0,0,114,247,0,0,
     0,114,7,0,0,0,114,7,0,0,0,114,8,0,0,0,
-    114,206,0,0,0,5,5,0,0,243,2,0,0,0,4,1,
+    114,206,0,0,0,6,5,0,0,243,2,0,0,0,4,1,
     122,27,95,78,97,109,101,115,112,97,99,101,76,111,97,100,
     101,114,46,105,115,95,112,97,99,107,97,103,101,99,2,0,
     0,0,0,0,0,0,0,0,0,0,2,0,0,0,1,0,
     0,0,67,0,0,0,114,23,0,0,0,41,2,78,114,10,
     0,0,0,114,7,0,0,0,114,247,0,0,0,114,7,0,
     0,0,114,7,0,0,0,114,8,0,0,0,114,1,1,0,
-    0,8,5,0,0,114,75,1,0,0,122,27,95,78,97,109,
+    0,9,5,0,0,114,75,1,0,0,122,27,95,78,97,109,
     101,115,112,97,99,101,76,111,97,100,101,114,46,103,101,116,
     95,115,111,117,114,99,101,99,2,0,0,0,0,0,0,0,
     0,0,0,0,2,0,0,0,6,0,0,0,67,0,0,0,
@@ -2066,20 +2066,20 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = {
     115,116,114,105,110,103,62,114,243,0,0,0,84,41,1,114,
     3,1,0,0,41,1,114,4,1,0,0,114,247,0,0,0,
     114,7,0,0,0,114,7,0,0,0,114,8,0,0,0,114,
-    241,0,0,0,11,5,0,0,114,72,1,0,0,122,25,95,
+    241,0,0,0,12,5,0,0,114,72,1,0,0,122,25,95,
     78,97,109,101,115,112,97,99,101,76,111,97,100,101,114,46,
     103,101,116,95,99,111,100,101,99,2,0,0,0,0,0,0,
     0,0,0,0,0,2,0,0,0,1,0,0,0,67,0,0,
     0,114,23,0,0,0,114,237,0,0,0,114,7,0,0,0,
     114,238,0,0,0,114,7,0,0,0,114,7,0,0,0,114,
-    8,0,0,0,114,239,0,0,0,14,5,0,0,114,240,0,
+    8,0,0,0,114,239,0,0,0,15,5,0,0,114,240,0,
     0,0,122,30,95,78,97,109,101,115,112,97,99,101,76,111,
     97,100,101,114,46,99,114,101,97,116,101,95,109,111,100,117,
     108,101,99,2,0,0,0,0,0,0,0,0,0,0,0,2,
     0,0,0,1,0,0,0,67,0,0,0,115,4,0,0,0,
     100,0,83,0,114,69,0,0,0,114,7,0,0,0,114,42,
     1,0,0,114,7,0,0,0,114,7,0,0,0,114,8,0,
-    0,0,114,245,0,0,0,17,5,0,0,114,75,1,0,0,
+    0,0,114,245,0,0,0,18,5,0,0,114,75,1,0,0,
     122,28,95,78,97,109,101,115,112,97,99,101,76,111,97,100,
     101,114,46,101,120,101,99,95,109,111,100,117,108,101,99,2,
     0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,4,
@@ -2097,7 +2097,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = {
     123,33,114,125,78,41,4,114,159,0,0,0,114,173,0,0,
     0,114,49,1,0,0,114,246,0,0,0,114,247,0,0,0,
     114,7,0,0,0,114,7,0,0,0,114,8,0,0,0,114,
-    248,0,0,0,20,5,0,0,115,8,0,0,0,6,7,4,
+    248,0,0,0,21,5,0,0,115,8,0,0,0,6,7,4,
     1,4,255,12,3,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,99,2,0,0,0,0,0,0,0,0,0,0,0,
@@ -2108,7 +2108,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = {
     101,114,41,3,114,32,1,0,0,114,76,1,0,0,114,49,
     1,0,0,41,3,114,143,0,0,0,114,244,0,0,0,114,
     76,1,0,0,114,7,0,0,0,114,7,0,0,0,114,8,
-    0,0,0,114,33,1,0,0,32,5,0,0,115,4,0,0,
+    0,0,0,114,33,1,0,0,33,5,0,0,115,4,0,0,
     0,12,1,10,1,122,36,95,78,97,109,101,115,112,97,99,
     101,76,111,97,100,101,114,46,103,101,116,95,114,101,115,111,
     117,114,99,101,95,114,101,97,100,101,114,78,41,13,114,150,
@@ -2117,7 +2117,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = {
     0,114,1,1,0,0,114,241,0,0,0,114,239,0,0,0,
     114,245,0,0,0,114,248,0,0,0,114,33,1,0,0,114,
     7,0,0,0,114,7,0,0,0,114,7,0,0,0,114,8,
-    0,0,0,114,73,1,0,0,246,4,0,0,115,22,0,0,
+    0,0,0,114,73,1,0,0,247,4,0,0,115,22,0,0,
     0,8,0,8,1,2,3,10,1,8,10,8,3,8,3,8,
     3,8,3,8,3,12,12,114,73,1,0,0,99,0,0,0,
     0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,
@@ -2154,7 +2154,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = {
     99,104,101,218,5,105,116,101,109,115,114,153,0,0,0,114,
     78,1,0,0,41,2,114,141,0,0,0,218,6,102,105,110,
     100,101,114,114,7,0,0,0,114,7,0,0,0,114,8,0,
-    0,0,114,78,1,0,0,43,5,0,0,115,14,0,0,0,
+    0,0,114,78,1,0,0,44,5,0,0,115,14,0,0,0,
     22,4,8,1,10,1,10,1,8,1,2,128,4,252,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,1,0,0,
@@ -2174,7 +2174,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = {
     162,0,0,0,114,142,0,0,0,41,2,114,65,0,0,0,
     90,4,104,111,111,107,114,7,0,0,0,114,7,0,0,0,
     114,8,0,0,0,218,11,95,112,97,116,104,95,104,111,111,
-    107,115,53,5,0,0,115,18,0,0,0,16,3,12,1,10,
+    107,115,54,5,0,0,115,18,0,0,0,16,3,12,1,10,
     1,2,1,14,1,12,1,4,1,4,2,2,253,122,22,80,
     97,116,104,70,105,110,100,101,114,46,95,112,97,116,104,95,
     104,111,111,107,115,99,2,0,0,0,0,0,0,0,0,0,
@@ -2206,7 +2206,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = {
     0,0,114,65,0,0,0,114,82,1,0,0,114,7,0,0,
     0,114,7,0,0,0,114,8,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,66,5,0,0,115,28,0,0,0,8,8,2,1,12,1,
+    101,67,5,0,0,115,28,0,0,0,8,8,2,1,12,1,
     12,1,6,3,2,1,12,1,4,4,12,253,10,1,12,1,
     4,1,2,253,2,250,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,
@@ -2236,7 +2236,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = {
     0,0,0,114,82,1,0,0,114,166,0,0,0,114,164,0,
     0,0,114,165,0,0,0,114,210,0,0,0,114,7,0,0,
     0,114,7,0,0,0,114,8,0,0,0,218,16,95,108,101,
-    103,97,99,121,95,103,101,116,95,115,112,101,99,88,5,0,
+    103,97,99,121,95,103,101,116,95,115,112,101,99,89,5,0,
     0,115,26,0,0,0,10,4,16,1,12,2,16,1,16,2,
     12,2,10,1,4,1,8,1,12,1,12,1,6,1,4,1,
     122,27,80,97,116,104,70,105,110,100,101,114,46,95,108,101,
@@ -2268,7 +2268,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = {
     101,115,112,97,99,101,95,112,97,116,104,90,5,101,110,116,
     114,121,114,82,1,0,0,114,210,0,0,0,114,165,0,0,
     0,114,7,0,0,0,114,7,0,0,0,114,8,0,0,0,
-    218,9,95,103,101,116,95,115,112,101,99,109,5,0,0,115,
+    218,9,95,103,101,116,95,115,112,101,99,110,5,0,0,115,
     42,0,0,0,4,5,8,1,14,1,2,1,10,1,8,1,
     10,1,14,1,12,2,8,1,2,1,10,1,8,1,6,1,
     8,1,8,1,10,5,2,128,12,2,6,1,4,1,122,20,
@@ -2295,7 +2295,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = {
     0,0,114,47,1,0,0,41,6,114,221,0,0,0,114,163,
     0,0,0,114,65,0,0,0,114,225,0,0,0,114,210,0,
     0,0,114,90,1,0,0,114,7,0,0,0,114,7,0,0,
-    0,114,8,0,0,0,114,226,0,0,0,141,5,0,0,115,
+    0,114,8,0,0,0,114,226,0,0,0,142,5,0,0,115,
     26,0,0,0,8,6,6,1,14,1,8,1,4,1,10,1,
     6,1,4,1,6,3,16,1,4,1,4,2,4,2,122,20,
     80,97,116,104,70,105,110,100,101,114,46,102,105,110,100,95,
@@ -2323,7 +2323,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = {
     110,100,95,115,112,101,99,40,41,32,105,110,115,116,101,97,
     100,78,114,227,0,0,0,114,228,0,0,0,114,7,0,0,
     0,114,7,0,0,0,114,8,0,0,0,114,229,0,0,0,
-    165,5,0,0,115,14,0,0,0,6,8,2,2,4,254,12,
+    166,5,0,0,115,14,0,0,0,6,8,2,2,4,254,12,
     3,8,1,4,1,6,1,122,22,80,97,116,104,70,105,110,
     100,101,114,46,102,105,110,100,95,109,111,100,117,108,101,99,
     0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,
@@ -2355,7 +2355,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = {
     115,116,114,105,98,117,116,105,111,110,115,41,3,114,144,0,
     0,0,114,145,0,0,0,114,92,1,0,0,114,7,0,0,
     0,114,7,0,0,0,114,8,0,0,0,114,93,1,0,0,
-    181,5,0,0,115,4,0,0,0,12,10,16,1,122,29,80,
+    182,5,0,0,115,4,0,0,0,12,10,16,1,122,29,80,
     97,116,104,70,105,110,100,101,114,46,102,105,110,100,95,100,
     105,115,116,114,105,98,117,116,105,111,110,115,114,69,0,0,
     0,114,230,0,0,0,41,14,114,150,0,0,0,114,149,0,
@@ -2364,7 +2364,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = {
     114,87,1,0,0,114,88,1,0,0,114,91,1,0,0,114,
     226,0,0,0,114,229,0,0,0,114,93,1,0,0,114,7,
     0,0,0,114,7,0,0,0,114,7,0,0,0,114,8,0,
-    0,0,114,77,1,0,0,39,5,0,0,115,36,0,0,0,
+    0,0,114,77,1,0,0,40,5,0,0,115,36,0,0,0,
     8,0,4,2,2,2,10,1,2,9,10,1,2,12,10,1,
     2,21,10,1,2,20,12,1,2,31,12,1,2,23,12,1,
     2,15,14,1,114,77,1,0,0,99,0,0,0,0,0,0,
@@ -2411,7 +2411,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = {
     1,136,0,102,2,86,0,1,0,113,2,100,0,83,0,114,
     69,0,0,0,114,7,0,0,0,114,43,1,0,0,169,1,
     114,164,0,0,0,114,7,0,0,0,114,8,0,0,0,114,
-    9,0,0,0,210,5,0,0,115,4,0,0,0,6,128,18,
+    9,0,0,0,211,5,0,0,115,4,0,0,0,6,128,18,
     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,97,0,0,0,114,130,
@@ -2425,7 +2425,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = {
     108,111,97,100,101,114,95,100,101,116,97,105,108,115,90,7,
     108,111,97,100,101,114,115,114,212,0,0,0,114,7,0,0,
     0,114,95,1,0,0,114,8,0,0,0,114,236,0,0,0,
-    204,5,0,0,115,20,0,0,0,4,4,12,1,26,1,6,
+    205,5,0,0,115,20,0,0,0,4,4,12,1,26,1,6,
     1,10,2,10,1,18,1,6,1,8,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,0,0,0,0,1,
@@ -2435,7 +2435,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = {
     101,99,116,111,114,121,32,109,116,105,109,101,46,114,130,0,
     0,0,78,41,1,114,97,1,0,0,114,21,1,0,0,114,
     7,0,0,0,114,7,0,0,0,114,8,0,0,0,114,78,
-    1,0,0,220,5,0,0,114,81,0,0,0,122,28,70,105,
+    1,0,0,221,5,0,0,114,81,0,0,0,122,28,70,105,
     108,101,70,105,110,100,101,114,46,105,110,118,97,108,105,100,
     97,116,101,95,99,97,99,104,101,115,99,2,0,0,0,0,
     0,0,0,0,0,0,0,3,0,0,0,4,0,0,0,67,
@@ -2466,7 +2466,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = {
     114,226,0,0,0,114,164,0,0,0,114,202,0,0,0,41,
     3,114,143,0,0,0,114,163,0,0,0,114,210,0,0,0,
     114,7,0,0,0,114,7,0,0,0,114,8,0,0,0,114,
-    161,0,0,0,226,5,0,0,115,14,0,0,0,6,7,2,
+    161,0,0,0,227,5,0,0,115,14,0,0,0,6,7,2,
     2,4,254,10,3,8,1,8,1,16,1,122,22,70,105,108,
     101,70,105,110,100,101,114,46,102,105,110,100,95,108,111,97,
     100,101,114,99,6,0,0,0,0,0,0,0,0,0,0,0,
@@ -2477,7 +2477,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = {
     0,114,211,0,0,0,114,163,0,0,0,114,65,0,0,0,
     90,4,115,109,115,108,114,225,0,0,0,114,164,0,0,0,
     114,7,0,0,0,114,7,0,0,0,114,8,0,0,0,114,
-    91,1,0,0,241,5,0,0,115,8,0,0,0,10,1,8,
+    91,1,0,0,242,5,0,0,115,8,0,0,0,10,1,8,
     1,2,1,6,255,122,20,70,105,108,101,70,105,110,100,101,
     114,46,95,103,101,116,95,115,112,101,99,78,99,3,0,0,
     0,0,0,0,0,0,0,0,0,14,0,0,0,9,0,0,
@@ -2533,7 +2533,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = {
     0,114,211,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,210,0,0,0,114,7,0,0,0,114,7,0,0,0,114,
-    8,0,0,0,114,226,0,0,0,246,5,0,0,115,86,0,
+    8,0,0,0,114,226,0,0,0,247,5,0,0,115,86,0,
     0,0,4,5,14,1,2,1,24,1,12,1,6,1,10,1,
     8,1,6,1,6,2,6,1,10,1,6,2,4,1,8,2,
     12,1,14,1,8,1,10,1,8,1,24,1,2,255,8,5,
@@ -2565,7 +2565,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = {
     0,124,0,93,6,125,1,124,1,160,0,161,0,146,2,113,
     2,83,0,114,7,0,0,0,41,1,114,131,0,0,0,41,
     2,114,5,0,0,0,90,2,102,110,114,7,0,0,0,114,
-    7,0,0,0,114,8,0,0,0,114,13,0,0,0,70,6,
+    7,0,0,0,114,8,0,0,0,114,13,0,0,0,71,6,
     0,0,115,2,0,0,0,20,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,
@@ -2582,7 +2582,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = {
     102,102,105,120,95,99,111,110,116,101,110,116,115,114,70,1,
     0,0,114,141,0,0,0,114,54,1,0,0,114,44,1,0,
     0,90,8,110,101,119,95,110,97,109,101,114,7,0,0,0,
-    114,7,0,0,0,114,8,0,0,0,114,102,1,0,0,41,
+    114,7,0,0,0,114,8,0,0,0,114,102,1,0,0,42,
     6,0,0,115,38,0,0,0,6,2,2,1,22,1,18,1,
     6,3,12,3,12,1,6,7,8,1,16,1,4,1,18,1,
     4,2,12,1,6,1,12,1,20,1,4,255,2,233,122,22,
@@ -2621,7 +2621,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = {
     0,114,142,0,0,0,114,71,0,0,0,169,2,114,221,0,
     0,0,114,101,1,0,0,114,7,0,0,0,114,8,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,82,6,0,0,115,
+    95,70,105,108,101,70,105,110,100,101,114,83,6,0,0,115,
     6,0,0,0,8,2,12,1,16,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,
@@ -2629,14 +2629,14 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = {
     101,114,78,114,7,0,0,0,41,3,114,221,0,0,0,114,
     101,1,0,0,114,107,1,0,0,114,7,0,0,0,114,106,
     1,0,0,114,8,0,0,0,218,9,112,97,116,104,95,104,
-    111,111,107,72,6,0,0,115,4,0,0,0,14,10,4,6,
+    111,111,107,73,6,0,0,115,4,0,0,0,14,10,4,6,
     122,20,70,105,108,101,70,105,110,100,101,114,46,112,97,116,
     104,95,104,111,111,107,99,1,0,0,0,0,0,0,0,0,
     0,0,0,1,0,0,0,3,0,0,0,67,0,0,0,114,
     67,1,0,0,41,2,78,122,16,70,105,108,101,70,105,110,
     100,101,114,40,123,33,114,125,41,41,2,114,89,0,0,0,
     114,65,0,0,0,114,21,1,0,0,114,7,0,0,0,114,
-    7,0,0,0,114,8,0,0,0,114,68,1,0,0,90,6,
+    7,0,0,0,114,8,0,0,0,114,68,1,0,0,91,6,
     0,0,114,61,1,0,0,122,19,70,105,108,101,70,105,110,
     100,101,114,46,95,95,114,101,112,114,95,95,114,69,0,0,
     0,41,15,114,150,0,0,0,114,149,0,0,0,114,151,0,
@@ -2645,7 +2645,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = {
     114,91,1,0,0,114,226,0,0,0,114,102,1,0,0,114,
     234,0,0,0,114,108,1,0,0,114,68,1,0,0,114,7,
     0,0,0,114,7,0,0,0,114,7,0,0,0,114,8,0,
-    0,0,114,94,1,0,0,195,5,0,0,115,24,0,0,0,
+    0,0,114,94,1,0,0,196,5,0,0,115,24,0,0,0,
     8,0,4,2,8,7,8,16,4,4,8,2,8,15,10,5,
     8,51,2,31,10,1,12,17,114,94,1,0,0,99,4,0,
     0,0,0,0,0,0,0,0,0,0,6,0,0,0,8,0,
@@ -2668,7 +2668,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = {
     90,8,112,97,116,104,110,97,109,101,90,9,99,112,97,116,
     104,110,97,109,101,114,164,0,0,0,114,210,0,0,0,114,
     7,0,0,0,114,7,0,0,0,114,8,0,0,0,218,14,
-    95,102,105,120,95,117,112,95,109,111,100,117,108,101,96,6,
+    95,102,105,120,95,117,112,95,109,111,100,117,108,101,97,6,
     0,0,115,36,0,0,0,10,2,10,1,4,1,4,1,8,
     1,8,1,12,1,10,2,4,1,14,1,2,1,8,1,8,
     1,8,1,14,1,12,1,6,2,2,254,114,113,1,0,0,
@@ -2689,7 +2689,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = {
     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,7,0,0,
     0,114,7,0,0,0,114,8,0,0,0,114,208,0,0,0,
-    119,6,0,0,115,8,0,0,0,12,5,8,1,8,1,10,
+    120,6,0,0,115,8,0,0,0,12,5,8,1,8,1,10,
     1,114,208,0,0,0,99,1,0,0,0,0,0,0,0,0,
     0,0,0,1,0,0,0,1,0,0,0,67,0,0,0,115,
     8,0,0,0,124,0,97,0,100,0,83,0,114,69,0,0,
@@ -2697,7 +2697,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = {
     116,115,116,114,97,112,95,109,111,100,117,108,101,114,7,0,
     0,0,114,7,0,0,0,114,8,0,0,0,218,21,95,115,
     101,116,95,98,111,111,116,115,116,114,97,112,95,109,111,100,
-    117,108,101,130,6,0,0,115,2,0,0,0,8,2,114,116,
+    117,108,101,131,6,0,0,115,2,0,0,0,8,2,114,116,
     1,0,0,99,1,0,0,0,0,0,0,0,0,0,0,0,
     2,0,0,0,4,0,0,0,67,0,0,0,115,50,0,0,
     0,116,0,124,0,131,1,1,0,116,1,131,0,125,1,116,
@@ -2712,7 +2712,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = {
     104,114,61,0,0,0,114,77,1,0,0,41,2,114,115,1,
     0,0,90,17,115,117,112,112,111,114,116,101,100,95,108,111,
     97,100,101,114,115,114,7,0,0,0,114,7,0,0,0,114,
-    8,0,0,0,218,8,95,105,110,115,116,97,108,108,135,6,
+    8,0,0,0,218,8,95,105,110,115,116,97,108,108,136,6,
     0,0,115,8,0,0,0,8,2,6,1,20,1,16,1,114,
     118,1,0,0,41,1,114,87,0,0,0,114,69,0,0,0,
     41,3,78,78,78,41,2,114,0,0,0,0,114,0,0,0,
@@ -2757,7 +2757,7 @@ const unsigned char _Py_M__importlib_bootstrap_external[] = {
     1,8,1,10,1,14,1,4,4,4,1,2,1,2,1,4,
     255,8,4,6,16,8,3,8,5,8,5,4,6,10,1,8,
     30,8,6,8,8,8,10,8,9,8,5,4,7,10,1,8,
-    8,10,5,10,22,0,127,16,29,12,1,4,2,4,1,6,
+    8,10,5,10,22,0,127,16,30,12,1,4,2,4,1,6,
     2,4,1,10,1,8,2,6,2,8,2,16,2,8,71,8,
     40,8,19,8,12,8,12,8,31,8,20,8,33,8,28,10,
     24,10,13,10,10,8,11,6,14,4,3,2,1,12,255,14,
diff --git a/Python/opcode_targets.h b/Python/opcode_targets.h
index e20a89862ef303..951f8f8a5569f7 100644
--- a/Python/opcode_targets.h
+++ b/Python/opcode_targets.h
@@ -98,7 +98,7 @@ static void *opcode_targets[256] = {
     &&TARGET_DELETE_ATTR,
     &&TARGET_STORE_GLOBAL,
     &&TARGET_DELETE_GLOBAL,
-    &&_unknown_opcode,
+    &&TARGET_ROT_N,
     &&TARGET_LOAD_CONST,
     &&TARGET_LOAD_NAME,
     &&TARGET_BUILD_TUPLE,



More information about the Python-checkins mailing list