diff options
32 files changed, 531 insertions, 208 deletions
diff --git a/Doc/library/asyncio-eventloop.rst b/Doc/library/asyncio-eventloop.rst index a25f9d1..2e529b1 100644 --- a/Doc/library/asyncio-eventloop.rst +++ b/Doc/library/asyncio-eventloop.rst @@ -180,6 +180,20 @@ a different clock than :func:`time.time`. The :func:`asyncio.sleep` function. +Futures +------- + +.. method:: BaseEventLoop.create_future() + + Create an :class:`asyncio.Future` object attached to the loop. + + This is a preferred way to create futures in asyncio, as event + loop implementations can provide alternative implementations + of the Future class (with better performance or instrumentation). + + .. versionadded:: 3.5.2 + + Tasks ----- @@ -670,6 +684,13 @@ Allows customizing how exceptions are handled in the event loop. will be a ``dict`` object (see :meth:`call_exception_handler` documentation for details about context). +.. method:: BaseEventLoop.get_exception_handler() + + Return the exception handler, or ``None`` if the default one + is in use. + + .. versionadded:: 3.5.2 + .. method:: BaseEventLoop.default_exception_handler(context) Default exception handler. diff --git a/Doc/library/asyncio-stream.rst b/Doc/library/asyncio-stream.rst index fa076df..08fe071 100644 --- a/Doc/library/asyncio-stream.rst +++ b/Doc/library/asyncio-stream.rst @@ -142,6 +142,30 @@ StreamReader This method is a :ref:`coroutine <coroutine>`. + .. coroutinemethod:: readuntil(separator=b'\n') + + Read data from the stream until ``separator`` is found. + + On success, the data and separator will be removed from the + internal buffer (consumed). Returned data will include the + separator at the end. + + Configured stream limit is used to check result. Limit sets the + maximal length of data that can be returned, not counting the + separator. + + If an EOF occurs and the complete separator is still not found, + an :exc:`IncompleteReadError` exception will be + raised, and the internal buffer will be reset. The + :attr:`IncompleteReadError.partial` attribute may contain the + separator partially. + + If the data cannot be read because of over limit, a + :exc:`LimitOverrunError` exception will be raised, and the data + will be left in the internal buffer, so it can be read again. + + .. versionadded:: 3.5.2 + .. method:: at_eof() Return ``True`` if the buffer is empty and :meth:`feed_eof` was called. @@ -251,6 +275,18 @@ IncompleteReadError Read bytes string before the end of stream was reached (:class:`bytes`). +LimitOverrunError +================= + +.. exception:: LimitOverrunError + + Reached the buffer limit while looking for a separator. + + .. attribute:: consumed + + Total number of to be consumed bytes. + + Stream examples =============== diff --git a/Doc/library/asyncio-task.rst b/Doc/library/asyncio-task.rst index 6f56026..cb5fae5 100644 --- a/Doc/library/asyncio-task.rst +++ b/Doc/library/asyncio-task.rst @@ -677,6 +677,8 @@ Task functions Passing ``None`` as *timeout* argument disables the manager logic. + .. versionadded:: 3.5.2 + .. coroutinefunction:: wait(futures, \*, loop=None, timeout=None,\ return_when=ALL_COMPLETED) diff --git a/Doc/reference/compound_stmts.rst b/Doc/reference/compound_stmts.rst index 513cc15..1a29692 100644 --- a/Doc/reference/compound_stmts.rst +++ b/Doc/reference/compound_stmts.rst @@ -469,7 +469,7 @@ A function definition defines a user-defined function object (see section .. productionlist:: funcdef: [`decorators`] "def" `funcname` "(" [`parameter_list`] ")" ["->" `expression`] ":" `suite` decorators: `decorator`+ - decorator: "@" `dotted_name` ["(" [`parameter_list` [","]] ")"] NEWLINE + decorator: "@" `dotted_name` ["(" [`argument_list` [","]] ")"] NEWLINE dotted_name: `identifier` ("." `identifier`)* parameter_list: `defparameter` ("," `defparameter`)* ["," [`parameter_list_starargs`]] : | `parameter_list_starargs` @@ -604,7 +604,7 @@ A class definition defines a class object (see section :ref:`types`): .. productionlist:: classdef: [`decorators`] "class" `classname` [`inheritance`] ":" `suite` - inheritance: "(" [`parameter_list`] ")" + inheritance: "(" [`argument_list`] ")" classname: `identifier` A class definition is an executable statement. The inheritance list usually diff --git a/Doc/whatsnew/3.5.rst b/Doc/whatsnew/3.5.rst index 01ec64e..73a6dd1 100644 --- a/Doc/whatsnew/3.5.rst +++ b/Doc/whatsnew/3.5.rst @@ -822,6 +822,33 @@ Updates in 3.5.1: method can now accept a list of hosts. (Contributed by Yann Sionneau.) +Updates in 3.5.2: + +* New :meth:`loop.create_future() <asyncio.BaseEventLoop.create_future>` + method to create Future objects. This allows alternative event + loop implementations, such as + `uvloop <https://github.com/MagicStack/uvloop>`_, to provide a faster + :class:`asyncio.Future` implementation. + (Contributed by Yury Selivanov.) + +* New :meth:`loop.get_exception_handler() <asyncio.BaseEventLoop.get_exception_handler>` + method to get the current exception handler. + (Contributed by Yury Selivanov.) + +* New :func:`~asyncio.timeout` context manager to simplify timeouts + handling code. + (Contributed by Andrew Svetlov.) + +* New :meth:`StreamReader.readuntil() <asyncio.StreamReader.readuntil>` + method to read data from the stream until a separator bytes + sequence appears. + (Contributed by Mark Korenberg.) + +* The :meth:`loop.getaddrinfo() <asyncio.BaseEventLoop.getaddrinfo>` + method is optimized to avoid calling the system ``getaddrinfo`` + function if the address is already resolved. + (Contributed by A. Jesse Jiryu Davis.) + bz2 --- diff --git a/Doc/whatsnew/3.6.rst b/Doc/whatsnew/3.6.rst index bad0f9e..52be134 100644 --- a/Doc/whatsnew/3.6.rst +++ b/Doc/whatsnew/3.6.rst @@ -190,6 +190,59 @@ New Modules Improved Modules ================ + +asyncio +------- + +Since the :mod:`asyncio` module is :term:`provisional <provisional api>`, +all changes introduced in Python 3.6 have also been backported to Python +3.5.x. + +Notable changes in the :mod:`asyncio` module since Python 3.5.0: + +* The :func:`~asyncio.ensure_future` function and all functions that + use it, such as :meth:`loop.run_until_complete() <asyncio.BaseEventLoop.run_until_complete>`, + now accept all kinds of :term:`awaitable objects <awaitable>`. + (Contributed by Yury Selivanov.) + +* New :func:`~asyncio.run_coroutine_threadsafe` function to submit + coroutines to event loops from other threads. + (Contributed by Vincent Michel.) + +* New :meth:`Transport.is_closing() <asyncio.BaseTransport.is_closing>` + method to check if the transport is closing or closed. + (Contributed by Yury Selivanov.) + +* The :meth:`loop.create_server() <asyncio.BaseEventLoop.create_server>` + method can now accept a list of hosts. + (Contributed by Yann Sionneau.) + +* New :meth:`loop.create_future() <asyncio.BaseEventLoop.create_future>` + method to create Future objects. This allows alternative event + loop implementations, such as + `uvloop <https://github.com/MagicStack/uvloop>`_, to provide a faster + :class:`asyncio.Future` implementation. + (Contributed by Yury Selivanov.) + +* New :meth:`loop.get_exception_handler() <asyncio.BaseEventLoop.get_exception_handler>` + method to get the current exception handler. + (Contributed by Yury Selivanov.) + +* New :func:`~asyncio.timeout` context manager to simplify timeouts + handling code. + (Contributed by Andrew Svetlov.) + +* New :meth:`StreamReader.readuntil() <asyncio.StreamReader.readuntil>` + method to read data from the stream until a separator bytes + sequence appears. + (Contributed by Mark Korenberg.) + +* The :meth:`loop.getaddrinfo() <asyncio.BaseEventLoop.getaddrinfo>` + method is optimized to avoid calling the system ``getaddrinfo`` + function if the address is already resolved. + (Contributed by A. Jesse Jiryu Davis.) + + contextlib ---------- @@ -489,6 +542,10 @@ API and Feature Removals :mod:`traceback` module. They were undocumented methods deprecated since Python 3.2 and equivalent functionality is available from private methods. +* The ``tk_menuBar()`` and ``tk_bindForTraversal()`` dummy methods in + :mod:`tkinter` widget classes were removed (corresponding Tk commands + were obsolete since Tk 4.0). + Porting to Python 3.6 ===================== diff --git a/Lib/asyncio/base_events.py b/Lib/asyncio/base_events.py index 99d503f..4aac4ac 100644 --- a/Lib/asyncio/base_events.py +++ b/Lib/asyncio/base_events.py @@ -209,7 +209,7 @@ class Server(events.AbstractServer): def wait_closed(self): if self.sockets is None or self._waiters is None: return - waiter = futures.Future(loop=self._loop) + waiter = self._loop.create_future() self._waiters.append(waiter) yield from waiter @@ -243,6 +243,10 @@ class BaseEventLoop(events.AbstractEventLoop): % (self.__class__.__name__, self.is_running(), self.is_closed(), self.get_debug())) + def create_future(self): + """Create a Future object attached to the loop.""" + return futures.Future(loop=self) + def create_task(self, coro): """Schedule a coroutine object. @@ -537,7 +541,7 @@ class BaseEventLoop(events.AbstractEventLoop): assert not args assert not isinstance(func, events.TimerHandle) if func._cancelled: - f = futures.Future(loop=self) + f = self.create_future() f.set_result(None) return f func, args = func._callback, func._args @@ -580,7 +584,7 @@ class BaseEventLoop(events.AbstractEventLoop): family=0, type=0, proto=0, flags=0): info = _ipaddr_info(host, port, family, type, proto) if info is not None: - fut = futures.Future(loop=self) + fut = self.create_future() fut.set_result([info]) return fut elif self._debug: @@ -721,7 +725,7 @@ class BaseEventLoop(events.AbstractEventLoop): def _create_connection_transport(self, sock, protocol_factory, ssl, server_hostname): protocol = protocol_factory() - waiter = futures.Future(loop=self) + waiter = self.create_future() if ssl: sslcontext = None if isinstance(ssl, bool) else ssl transport = self._make_ssl_transport( @@ -841,7 +845,7 @@ class BaseEventLoop(events.AbstractEventLoop): raise exceptions[0] protocol = protocol_factory() - waiter = futures.Future(loop=self) + waiter = self.create_future() transport = self._make_datagram_transport( sock, protocol, r_addr, waiter) if self._debug: @@ -980,7 +984,7 @@ class BaseEventLoop(events.AbstractEventLoop): @coroutine def connect_read_pipe(self, protocol_factory, pipe): protocol = protocol_factory() - waiter = futures.Future(loop=self) + waiter = self.create_future() transport = self._make_read_pipe_transport(pipe, protocol, waiter) try: @@ -997,7 +1001,7 @@ class BaseEventLoop(events.AbstractEventLoop): @coroutine def connect_write_pipe(self, protocol_factory, pipe): protocol = protocol_factory() - waiter = futures.Future(loop=self) + waiter = self.create_future() transport = self._make_write_pipe_transport(pipe, protocol, waiter) try: @@ -1079,6 +1083,11 @@ class BaseEventLoop(events.AbstractEventLoop): logger.info('%s: %r' % (debug_log, transport)) return transport, protocol + def get_exception_handler(self): + """Return an exception handler, or None if the default one is in use. + """ + return self._exception_handler + def set_exception_handler(self, handler): """Set handler as the new event loop exception handler. diff --git a/Lib/asyncio/base_subprocess.py b/Lib/asyncio/base_subprocess.py index efe0831..bf74e94 100644 --- a/Lib/asyncio/base_subprocess.py +++ b/Lib/asyncio/base_subprocess.py @@ -228,7 +228,7 @@ class BaseSubprocessTransport(transports.SubprocessTransport): if self._returncode is not None: return self._returncode - waiter = futures.Future(loop=self._loop) + waiter = self._loop.create_future() self._exit_waiters.append(waiter) return (yield from waiter) diff --git a/Lib/asyncio/events.py b/Lib/asyncio/events.py index 176a846..c48c5be 100644 --- a/Lib/asyncio/events.py +++ b/Lib/asyncio/events.py @@ -266,6 +266,9 @@ class AbstractEventLoop: def time(self): raise NotImplementedError + def create_future(self): + raise NotImplementedError + # Method scheduling a coroutine object: create a task. def create_task(self, coro): @@ -484,6 +487,9 @@ class AbstractEventLoop: # Error handlers. + def get_exception_handler(self): + raise NotImplementedError + def set_exception_handler(self, handler): raise NotImplementedError diff --git a/Lib/asyncio/futures.py b/Lib/asyncio/futures.py index ddb9cde..1feba4d 100644 --- a/Lib/asyncio/futures.py +++ b/Lib/asyncio/futures.py @@ -451,6 +451,8 @@ def wrap_future(future, *, loop=None): return future assert isinstance(future, concurrent.futures.Future), \ 'concurrent.futures.Future is expected, got {!r}'.format(future) - new_future = Future(loop=loop) + if loop is None: + loop = events.get_event_loop() + new_future = loop.create_future() _chain_future(future, new_future) return new_future diff --git a/Lib/asyncio/locks.py b/Lib/asyncio/locks.py index 34f6bc1..1804d7b 100644 --- a/Lib/asyncio/locks.py +++ b/Lib/asyncio/locks.py @@ -170,7 +170,7 @@ class Lock(_ContextManagerMixin): self._locked = True return True - fut = futures.Future(loop=self._loop) + fut = self._loop.create_future() self._waiters.append(fut) try: yield from fut @@ -258,7 +258,7 @@ class Event: if self._value: return True - fut = futures.Future(loop=self._loop) + fut = self._loop.create_future() self._waiters.append(fut) try: yield from fut @@ -320,7 +320,7 @@ class Condition(_ContextManagerMixin): self.release() try: - fut = futures.Future(loop=self._loop) + fut = self._loop.create_future() self._waiters.append(fut) try: yield from fut @@ -433,7 +433,7 @@ class Semaphore(_ContextManagerMixin): True. """ while self._value <= 0: - fut = futures.Future(loop=self._loop) + fut = self._loop.create_future() self._waiters.append(fut) try: yield from fut diff --git a/Lib/asyncio/proactor_events.py b/Lib/asyncio/proactor_events.py index db16fe2..530a667 100644 --- a/Lib/asyncio/proactor_events.py +++ b/Lib/asyncio/proactor_events.py @@ -444,7 +444,7 @@ class BaseProactorEventLoop(base_events.BaseEventLoop): try: base_events._check_resolved_address(sock, address) except ValueError as err: - fut = futures.Future(loop=self) + fut = self.create_future() fut.set_exception(err) return fut else: diff --git a/Lib/asyncio/queues.py b/Lib/asyncio/queues.py index e3a1d5e..c453f02 100644 --- a/Lib/asyncio/queues.py +++ b/Lib/asyncio/queues.py @@ -128,7 +128,7 @@ class Queue: This method is a coroutine. """ while self.full(): - putter = futures.Future(loop=self._loop) + putter = self._loop.create_future() self._putters.append(putter) try: yield from putter @@ -162,7 +162,7 @@ class Queue: This method is a coroutine. """ while self.empty(): - getter = futures.Future(loop=self._loop) + getter = self._loop.create_future() self._getters.append(getter) try: yield from getter diff --git a/Lib/asyncio/selector_events.py b/Lib/asyncio/selector_events.py index 6838d72..29db06b 100644 --- a/Lib/asyncio/selector_events.py +++ b/Lib/asyncio/selector_events.py @@ -196,7 +196,7 @@ class BaseSelectorEventLoop(base_events.BaseEventLoop): transport = None try: protocol = protocol_factory() - waiter = futures.Future(loop=self) + waiter = self.create_future() if sslcontext: transport = self._make_ssl_transport( conn, protocol, sslcontext, waiter=waiter, @@ -314,7 +314,7 @@ class BaseSelectorEventLoop(base_events.BaseEventLoop): """ if self._debug and sock.gettimeout() != 0: raise ValueError("the socket must be non-blocking") - fut = futures.Future(loop=self) + fut = self.create_future() self._sock_recv(fut, False, sock, n) return fut @@ -352,7 +352,7 @@ class BaseSelectorEventLoop(base_events.BaseEventLoop): """ if self._debug and sock.gettimeout() != 0: raise ValueError("the socket must be non-blocking") - fut = futures.Future(loop=self) + fut = self.create_future() if data: self._sock_sendall(fut, False, sock, data) else: @@ -395,7 +395,7 @@ class BaseSelectorEventLoop(base_events.BaseEventLoop): """ if self._debug and sock.gettimeout() != 0: raise ValueError("the socket must be non-blocking") - fut = futures.Future(loop=self) + fut = self.create_future() try: base_events._check_resolved_address(sock, address) except ValueError as err: @@ -453,7 +453,7 @@ class BaseSelectorEventLoop(base_events.BaseEventLoop): """ if self._debug and sock.gettimeout() != 0: raise ValueError("the socket must be non-blocking") - fut = futures.Future(loop=self) + fut = self.create_future() self._sock_accept(fut, False, sock) return fut diff --git a/Lib/asyncio/streams.py b/Lib/asyncio/streams.py index b7b0485..0345a3d 100644 --- a/Lib/asyncio/streams.py +++ b/Lib/asyncio/streams.py @@ -14,13 +14,12 @@ if hasattr(socket, 'AF_UNIX'): from . import coroutines from . import compat from . import events -from . import futures from . import protocols from .coroutines import coroutine from .log import logger -_DEFAULT_LIMIT = 2**16 +_DEFAULT_LIMIT = 2 ** 16 class IncompleteReadError(EOFError): @@ -38,15 +37,13 @@ class IncompleteReadError(EOFError): class LimitOverrunError(Exception): - """Reached buffer limit while looking for the separator. + """Reached the buffer limit while looking for a separator. Attributes: - - message: error message - - consumed: total number of bytes that should be consumed + - consumed: total number of to be consumed bytes. """ def __init__(self, message, consumed): super().__init__(message) - self.message = message self.consumed = consumed @@ -132,7 +129,6 @@ if hasattr(socket, 'AF_UNIX'): writer = StreamWriter(transport, protocol, reader, loop) return reader, writer - @coroutine def start_unix_server(client_connected_cb, path=None, *, loop=None, limit=_DEFAULT_LIMIT, **kwds): @@ -210,7 +206,7 @@ class FlowControlMixin(protocols.Protocol): return waiter = self._drain_waiter assert waiter is None or waiter.cancelled() - waiter = futures.Future(loop=self._loop) + waiter = self._loop.create_future() self._drain_waiter = waiter yield from waiter @@ -416,8 +412,8 @@ class StreamReader: self._wakeup_waiter() if (self._transport is not None and - not self._paused and - len(self._buffer) > 2*self._limit): + not self._paused and + len(self._buffer) > 2 * self._limit): try: self._transport.pause_reading() except NotImplementedError: @@ -449,7 +445,7 @@ class StreamReader: self._paused = False self._transport.resume_reading() - self._waiter = futures.Future(loop=self._loop) + self._waiter = self._loop.create_future() try: yield from self._waiter finally: @@ -489,24 +485,24 @@ class StreamReader: @coroutine def readuntil(self, separator=b'\n'): - """Read chunk of data from the stream until `separator` is found. - - On success, chunk and its separator will be removed from internal buffer - (i.e. consumed). Returned chunk will include separator at the end. + """Read data from the stream until ``separator`` is found. - Configured stream limit is used to check result. Limit means maximal - length of chunk that can be returned, not counting the separator. + On success, the data and separator will be removed from the + internal buffer (consumed). Returned data will include the + separator at the end. - If EOF occurs and complete separator still not found, - IncompleteReadError(<partial data>, None) will be raised and internal - buffer becomes empty. This partial data may contain a partial separator. + Configured stream limit is used to check result. Limit sets the + maximal length of data that can be returned, not counting the + separator. - If chunk cannot be read due to overlimit, LimitOverrunError will be raised - and data will be left in internal buffer, so it can be read again, in - some different way. + If an EOF occurs and the complete separator is still not found, + an IncompleteReadError exception will be raised, and the internal + buffer will be reset. The IncompleteReadError.partial attribute + may contain the separator partially. - If stream was paused, this function will automatically resume it if - needed. + If the data cannot be read because of over limit, a + LimitOverrunError exception will be raised, and the data + will be left in the internal buffer, so it can be read again. """ seplen = len(separator) if seplen == 0: @@ -532,8 +528,8 @@ class StreamReader: # performance problems. Even when reading MIME-encoded # messages :) - # `offset` is the number of bytes from the beginning of the buffer where - # is no occurrence of `separator`. + # `offset` is the number of bytes from the beginning of the buffer + # where there is no occurrence of `separator`. offset = 0 # Loop until we find `separator` in the buffer, exceed the buffer size, @@ -547,14 +543,16 @@ class StreamReader: isep = self._buffer.find(separator, offset) if isep != -1: - # `separator` is in the buffer. `isep` will be used later to - # retrieve the data. + # `separator` is in the buffer. `isep` will be used later + # to retrieve the data. break # see upper comment for explanation. offset = buflen + 1 - seplen if offset > self._limit: - raise LimitOverrunError('Separator is not found, and chunk exceed the limit', offset) + raise LimitOverrunError( + 'Separator is not found, and chunk exceed the limit', + offset) # Complete message (with full separator) may be present in buffer # even when EOF flag is set. This may happen when the last chunk @@ -569,7 +567,8 @@ class StreamReader: yield from self._wait_for_data('readuntil') if isep > self._limit: - raise LimitOverrunError('Separator is found, but chunk is longer than limit', isep) + raise LimitOverrunError( + 'Separator is found, but chunk is longer than limit', isep) chunk = self._buffer[:isep + seplen] del self._buffer[:isep + seplen] @@ -591,7 +590,8 @@ class StreamReader: received before any byte is read, this function returns empty byte object. - Returned value is not limited with limit, configured at stream creation. + Returned value is not limited with limit, configured at stream + creation. If stream was paused, this function will automatically resume it if needed. @@ -630,13 +630,14 @@ class StreamReader: def readexactly(self, n): """Read exactly `n` bytes. - Raise an `IncompleteReadError` if EOF is reached before `n` bytes can be - read. The `IncompleteReadError.partial` attribute of the exception will + Raise an IncompleteReadError if EOF is reached before `n` bytes can be + read. The IncompleteReadError.partial attribute of the exception will contain the partial read bytes. if n is zero, return empty bytes object. - Returned value is not limited with limit, configured at stream creation. + Returned value is not limited with limit, configured at stream + creation. If stream was paused, this function will automatically resume it if needed. diff --git a/Lib/asyncio/tasks.py b/Lib/asyncio/tasks.py index cab4998..81510ba 100644 --- a/Lib/asyncio/tasks.py +++ b/Lib/asyncio/tasks.py @@ -373,7 +373,7 @@ def wait_for(fut, timeout, *, loop=None): if timeout is None: return (yield from fut) - waiter = futures.Future(loop=loop) + waiter = loop.create_future() timeout_handle = loop.call_later(timeout, _release_waiter, waiter) cb = functools.partial(_release_waiter, waiter) @@ -406,7 +406,7 @@ def _wait(fs, timeout, return_when, loop): The fs argument must be a collection of Futures. """ assert fs, 'Set of Futures is empty.' - waiter = futures.Future(loop=loop) + waiter = loop.create_future() timeout_handle = None if timeout is not None: timeout_handle = loop.call_later(timeout, _release_waiter, waiter) @@ -507,7 +507,9 @@ def sleep(delay, result=None, *, loop=None): yield return result - future = futures.Future(loop=loop) + if loop is None: + loop = events.get_event_loop() + future = loop.create_future() h = future._loop.call_later(delay, futures._set_result_unless_cancelled, future, result) @@ -604,7 +606,9 @@ def gather(*coros_or_futures, loop=None, return_exceptions=False): be cancelled.) """ if not coros_or_futures: - outer = futures.Future(loop=loop) + if loop is None: + loop = events.get_event_loop() + outer = loop.create_future() outer.set_result([]) return outer @@ -692,7 +696,7 @@ def shield(arg, *, loop=None): # Shortcut. return inner loop = inner._loop - outer = futures.Future(loop=loop) + outer = loop.create_future() def _done_callback(inner): if outer.cancelled(): diff --git a/Lib/asyncio/unix_events.py b/Lib/asyncio/unix_events.py index 666706f..ce49c4f 100644 --- a/Lib/asyncio/unix_events.py +++ b/Lib/asyncio/unix_events.py @@ -177,7 +177,7 @@ class _UnixSelectorEventLoop(selector_events.BaseSelectorEventLoop): stdin, stdout, stderr, bufsize, extra=None, **kwargs): with events.get_child_watcher() as watcher: - waiter = futures.Future(loop=self) + waiter = self.create_future() transp = _UnixSubprocessTransport(self, protocol, args, shell, stdin, stdout, stderr, bufsize, waiter=waiter, extra=extra, diff --git a/Lib/asyncio/windows_events.py b/Lib/asyncio/windows_events.py index 7be3e02..668fe14 100644 --- a/Lib/asyncio/windows_events.py +++ b/Lib/asyncio/windows_events.py @@ -366,7 +366,7 @@ class ProactorEventLoop(proactor_events.BaseProactorEventLoop): def _make_subprocess_transport(self, protocol, args, shell, stdin, stdout, stderr, bufsize, extra=None, **kwargs): - waiter = futures.Future(loop=self) + waiter = self.create_future() transp = _WindowsSubprocessTransport(self, protocol, args, shell, stdin, stdout, stderr, bufsize, waiter=waiter, extra=extra, @@ -417,7 +417,7 @@ class IocpProactor: return tmp def _result(self, value): - fut = futures.Future(loop=self._loop) + fut = self._loop.create_future() fut.set_result(value) return fut diff --git a/Lib/idlelib/UndoDelegator.py b/Lib/idlelib/UndoDelegator.py index 04c1cf5..1c2502d 100644 --- a/Lib/idlelib/UndoDelegator.py +++ b/Lib/idlelib/UndoDelegator.py @@ -336,30 +336,33 @@ class CommandSequence(Command): self.depth = self.depth + incr return self.depth -def _undo_delegator(parent): + +def _undo_delegator(parent): # htest # + import re + import tkinter as tk from idlelib.Percolator import Percolator - root = Tk() - root.title("Test UndoDelegator") + undowin = tk.Toplevel() + undowin.title("Test UndoDelegator") width, height, x, y = list(map(int, re.split('[x+]', parent.geometry()))) - root.geometry("+%d+%d"%(x, y + 150)) + undowin.geometry("+%d+%d"%(x, y + 150)) - text = Text(root) - text.config(height=10) + text = Text(undowin, height=10) text.pack() text.focus_set() p = Percolator(text) d = UndoDelegator() p.insertfilter(d) - undo = Button(root, text="Undo", command=lambda:d.undo_event(None)) + undo = Button(undowin, text="Undo", command=lambda:d.undo_event(None)) undo.pack(side='left') - redo = Button(root, text="Redo", command=lambda:d.redo_event(None)) + redo = Button(undowin, text="Redo", command=lambda:d.redo_event(None)) redo.pack(side='left') - dump = Button(root, text="Dump", command=lambda:d.dump_event(None)) + dump = Button(undowin, text="Dump", command=lambda:d.dump_event(None)) dump.pack(side='left') - root.mainloop() - if __name__ == "__main__": + import unittest + unittest.main('idlelib.idle_test.test_undodelegator', verbosity=2, + exit=False) from idlelib.idle_test.htest import run run(_undo_delegator) diff --git a/Lib/idlelib/configDialog.py b/Lib/idlelib/configDialog.py index f00db39..b702253 100644 --- a/Lib/idlelib/configDialog.py +++ b/Lib/idlelib/configDialog.py @@ -483,6 +483,17 @@ class ConfigDialog(Toplevel): self.autoSave.trace_variable('w', self.VarChanged_autoSave) self.encoding.trace_variable('w', self.VarChanged_encoding) + def remove_var_callbacks(self): + "Remove callbacks to prevent memory leaks." + for var in ( + self.fontSize, self.fontName, self.fontBold, + self.spaceNum, self.colour, self.builtinTheme, + self.customTheme, self.themeIsBuiltin, self.highlightTarget, + self.keyBinding, self.builtinKeys, self.customKeys, + self.keysAreBuiltin, self.winWidth, self.winHeight, + self.startupEdit, self.autoSave, self.encoding,): + var.trace_vdelete('w', var.trace_vinfo()[0][1]) + def VarChanged_font(self, *params): '''When one font attribute changes, save them all, as they are not independent from each other. In particular, when we are diff --git a/Lib/idlelib/idle_test/test_configdialog.py b/Lib/idlelib/idle_test/test_configdialog.py index 6883123..fab860b 100644 --- a/Lib/idlelib/idle_test/test_configdialog.py +++ b/Lib/idlelib/idle_test/test_configdialog.py @@ -25,6 +25,7 @@ class ConfigDialogTest(unittest.TestCase): def test_dialog(self): d=ConfigDialog(self.root, 'Test', _utest=True) + d.remove_var_callbacks() d.destroy() diff --git a/Lib/idlelib/idle_test/test_undodelegator.py b/Lib/idlelib/idle_test/test_undodelegator.py new file mode 100644 index 0000000..2657984 --- /dev/null +++ b/Lib/idlelib/idle_test/test_undodelegator.py @@ -0,0 +1,134 @@ +"""Unittest for UndoDelegator in idlelib.UndoDelegator. + +Coverage about 80% (retest). +""" +from test.support import requires +requires('gui') + +import unittest +from unittest.mock import Mock +from tkinter import Text, Tk +from idlelib.UndoDelegator import UndoDelegator +from idlelib.Percolator import Percolator + + +class UndoDelegatorTest(unittest.TestCase): + + @classmethod + def setUpClass(cls): + cls.root = Tk() + cls.text = Text(cls.root) + cls.percolator = Percolator(cls.text) + + @classmethod + def tearDownClass(cls): + cls.percolator.redir.close() + cls.root.destroy() + del cls.percolator, cls.text, cls.root + + def setUp(self): + self.delegator = UndoDelegator() + self.percolator.insertfilter(self.delegator) + self.delegator.bell = Mock(wraps=self.delegator.bell) + + def tearDown(self): + self.percolator.removefilter(self.delegator) + self.text.delete('1.0', 'end') + self.delegator.resetcache() + + def test_undo_event(self): + text = self.text + + text.insert('insert', 'foobar') + text.insert('insert', 'h') + text.event_generate('<<undo>>') + self.assertEqual(text.get('1.0', 'end'), '\n') + + text.insert('insert', 'foo') + text.insert('insert', 'bar') + text.delete('1.2', '1.4') + text.insert('insert', 'hello') + text.event_generate('<<undo>>') + self.assertEqual(text.get('1.0', '1.4'), 'foar') + text.event_generate('<<undo>>') + self.assertEqual(text.get('1.0', '1.6'), 'foobar') + text.event_generate('<<undo>>') + self.assertEqual(text.get('1.0', '1.3'), 'foo') + text.event_generate('<<undo>>') + self.delegator.undo_event('event') + self.assertTrue(self.delegator.bell.called) + + def test_redo_event(self): + text = self.text + + text.insert('insert', 'foo') + text.insert('insert', 'bar') + text.delete('1.0', '1.3') + text.event_generate('<<undo>>') + text.event_generate('<<redo>>') + self.assertEqual(text.get('1.0', '1.3'), 'bar') + text.event_generate('<<redo>>') + self.assertTrue(self.delegator.bell.called) + + def test_dump_event(self): + """ + Dump_event cannot be tested directly without changing + environment variables. So, test statements in dump_event + indirectly + """ + text = self.text + d = self.delegator + + text.insert('insert', 'foo') + text.insert('insert', 'bar') + text.delete('1.2', '1.4') + self.assertTupleEqual((d.pointer, d.can_merge), (3, True)) + text.event_generate('<<undo>>') + self.assertTupleEqual((d.pointer, d.can_merge), (2, False)) + + def test_get_set_saved(self): + # test the getter method get_saved + # test the setter method set_saved + # indirectly test check_saved + d = self.delegator + + self.assertTrue(d.get_saved()) + self.text.insert('insert', 'a') + self.assertFalse(d.get_saved()) + d.saved_change_hook = Mock() + + d.set_saved(True) + self.assertEqual(d.pointer, d.saved) + self.assertTrue(d.saved_change_hook.called) + + d.set_saved(False) + self.assertEqual(d.saved, -1) + self.assertTrue(d.saved_change_hook.called) + + def test_undo_start_stop(self): + # test the undo_block_start and undo_block_stop methods + text = self.text + + text.insert('insert', 'foo') + self.delegator.undo_block_start() + text.insert('insert', 'bar') + text.insert('insert', 'bar') + self.delegator.undo_block_stop() + self.assertEqual(text.get('1.0', '1.3'), 'foo') + + # test another code path + self.delegator.undo_block_start() + text.insert('insert', 'bar') + self.delegator.undo_block_stop() + self.assertEqual(text.get('1.0', '1.3'), 'foo') + + def test_addcmd(self): + text = self.text + # when number of undo operations exceeds max_undo + self.delegator.max_undo = max_undo = 10 + for i in range(max_undo + 10): + text.insert('insert', 'foo') + self.assertLessEqual(len(self.delegator.undolist), max_undo) + +if __name__ == '__main__': + unittest.main(verbosity=2, exit=False) diff --git a/Lib/test/test_asyncio/test_base_events.py b/Lib/test/test_asyncio/test_base_events.py index a74ac89..ef93dc0 100644 --- a/Lib/test/test_asyncio/test_base_events.py +++ b/Lib/test/test_asyncio/test_base_events.py @@ -658,8 +658,10 @@ class BaseEventLoopTests(test_utils.TestCase): self.loop.set_debug(True) self.loop._process_events = mock.Mock() + self.assertIsNone(self.loop.get_exception_handler()) mock_handler = mock.Mock() self.loop.set_exception_handler(mock_handler) + self.assertIs(self.loop.get_exception_handler(), mock_handler) handle = run_loop() mock_handler.assert_called_with(self.loop, { 'exception': MOCK_ANY, diff --git a/Lib/test/test_asyncio/test_futures.py b/Lib/test/test_asyncio/test_futures.py index e800106..c38c1f2 100644 --- a/Lib/test/test_asyncio/test_futures.py +++ b/Lib/test/test_asyncio/test_futures.py @@ -278,14 +278,15 @@ class FutureTests(test_utils.TestCase): f2 = asyncio.wrap_future(f1) self.assertIs(f1, f2) - @mock.patch('asyncio.futures.events') - def test_wrap_future_use_global_loop(self, m_events): - def run(arg): - return (arg, threading.get_ident()) - ex = concurrent.futures.ThreadPoolExecutor(1) - f1 = ex.submit(run, 'oi') - f2 = asyncio.wrap_future(f1) - self.assertIs(m_events.get_event_loop.return_value, f2._loop) + def test_wrap_future_use_global_loop(self): + with mock.patch('asyncio.futures.events') as events: + events.get_event_loop = lambda: self.loop + def run(arg): + return (arg, threading.get_ident()) + ex = concurrent.futures.ThreadPoolExecutor(1) + f1 = ex.submit(run, 'oi') + f2 = asyncio.wrap_future(f1) + self.assertIs(self.loop, f2._loop) def test_wrap_future_cancel(self): f1 = concurrent.futures.Future() diff --git a/Lib/test/test_bytes.py b/Lib/test/test_bytes.py index 5309a97..1cedd3a 100644 --- a/Lib/test/test_bytes.py +++ b/Lib/test/test_bytes.py @@ -1177,6 +1177,13 @@ class ByteArrayTest(BaseBytesTest, unittest.TestCase): b.remove(Indexable(ord('e'))) self.assertEqual(b, b'') + # test values outside of the ascii range: (0, 127) + c = bytearray([126, 127, 128, 129]) + c.remove(127) + self.assertEqual(c, bytes([126, 128, 129])) + c.remove(129) + self.assertEqual(c, bytes([126, 128])) + def test_pop(self): b = bytearray(b'world') self.assertEqual(b.pop(), ord('d')) diff --git a/Lib/tkinter/__init__.py b/Lib/tkinter/__init__.py index 7fbe147..357385e 100644 --- a/Lib/tkinter/__init__.py +++ b/Lib/tkinter/__init__.py @@ -468,12 +468,6 @@ class Misc: disabledForeground, insertBackground, troughColor.""" self.tk.call(('tk_setPalette',) + _flatten(args) + _flatten(list(kw.items()))) - def tk_menuBar(self, *args): - """Do not use. Needed in Tk 3.6 and earlier.""" - # obsolete since Tk 4.0 - import warnings - warnings.warn('tk_menuBar() does nothing and will be removed in 3.6', - DeprecationWarning, stacklevel=2) def wait_variable(self, name='PY_VAR'): """Wait until the variable is modified. @@ -2705,12 +2699,6 @@ class Menu(Widget): def tk_popup(self, x, y, entry=""): """Post the menu at position X,Y with entry ENTRY.""" self.tk.call('tk_popup', self._w, x, y, entry) - def tk_bindForTraversal(self): - # obsolete since Tk 4.0 - import warnings - warnings.warn('tk_bindForTraversal() does nothing and ' - 'will be removed in 3.6', - DeprecationWarning, stacklevel=2) def activate(self, index): """Activate entry at INDEX.""" self.tk.call(self._w, 'activate', index) @@ -22,6 +22,11 @@ Release date: 2016-05-16 Core and Builtins ----------------- +- Issue #26991: Fix possible refleak when creating a function with annotations. + +- Issue #27039: Fixed bytearray.remove() for values greater than 127. Based on + patch by Joe Jevnik. + - Issue #23640: int.from_bytes() no longer bypasses constructors for subclasses. - Issue #27005: Optimized the float.fromhex() class method for exact float. @@ -289,6 +294,9 @@ Core and Builtins Library ------- +- Issue #27031: Removed dummy methods in Tkinter widget classes: tk_menuBar() + and tk_bindForTraversal(). + - Issue #14132: Fix urllib.request redirect handling when the target only has a query string. Original fix by Ján Janech. @@ -988,6 +996,10 @@ Library - Issue #26848: Fix asyncio/subprocess.communicate() to handle empty input. Patch by Jack O'Connor. +- Issue #27040: Add loop.get_exception_handler method + +- Issue #27041: asyncio: Add loop.create_future method + IDLE ---- diff --git a/Objects/bytearrayobject.c b/Objects/bytearrayobject.c index 9457768..b7dfd6f 100644 --- a/Objects/bytearrayobject.c +++ b/Objects/bytearrayobject.c @@ -1734,11 +1734,8 @@ bytearray_remove_impl(PyByteArrayObject *self, int value) Py_ssize_t where, n = Py_SIZE(self); char *buf = PyByteArray_AS_STRING(self); - for (where = 0; where < n; where++) { - if (buf[where] == value) - break; - } - if (where == n) { + where = stringlib_find_char(buf, n, value); + if (where < 0) { PyErr_SetString(PyExc_ValueError, "value not found in bytearray"); return NULL; } diff --git a/PC/launcher.c b/PC/launcher.c index 89a3ea2..e5f2cea 100644 --- a/PC/launcher.c +++ b/PC/launcher.c @@ -1082,7 +1082,7 @@ static PYC_MAGIC magic_values[] = { { 3190, 3230, L"3.3" }, { 3250, 3310, L"3.4" }, { 3320, 3350, L"3.5" }, - { 3350, 3350, L"3.6" }, + { 3360, 3361, L"3.6" }, { 0 } }; diff --git a/Python/ceval.c b/Python/ceval.c index b461030..9870a55 100644 --- a/Python/ceval.c +++ b/Python/ceval.c @@ -3291,6 +3291,7 @@ PyEval_EvalFrameEx(PyFrameObject *f, int throwflag) PyObject *anns = PyDict_New(); if (anns == NULL) { Py_DECREF(func); + Py_DECREF(names); goto error; } name_ix = PyTuple_Size(names); @@ -3306,9 +3307,11 @@ PyEval_EvalFrameEx(PyFrameObject *f, int throwflag) if (err != 0) { Py_DECREF(anns); Py_DECREF(func); + Py_DECREF(names); goto error; } } + Py_DECREF(names); if (PyFunction_SetAnnotations(func, anns) != 0) { /* Can't happen unless @@ -3318,7 +3321,6 @@ PyEval_EvalFrameEx(PyFrameObject *f, int throwflag) goto error; } Py_DECREF(anns); - Py_DECREF(names); } /* XXX Maybe this should be a separate opcode? */ diff --git a/Python/importlib_external.h b/Python/importlib_external.h index 840e9c4..d99abfb 100644 --- a/Python/importlib_external.h +++ b/Python/importlib_external.h @@ -368,7 +368,7 @@ const unsigned char _Py_M__importlib_external[] = { 103,90,15,97,108,109,111,115,116,95,102,105,108,101,110,97, 109,101,114,4,0,0,0,114,4,0,0,0,114,5,0,0, 0,218,17,99,97,99,104,101,95,102,114,111,109,95,115,111, - 117,114,99,101,245,0,0,0,115,46,0,0,0,0,18,12, + 117,114,99,101,248,0,0,0,115,46,0,0,0,0,18,12, 1,9,1,7,1,12,1,6,1,12,1,18,1,18,1,24, 1,12,1,12,1,12,1,36,1,12,1,18,1,9,2,12, 1,12,1,12,1,12,1,21,1,21,1,114,79,0,0,0, @@ -447,7 +447,7 @@ const unsigned char _Py_M__importlib_external[] = { 101,118,101,108,90,13,98,97,115,101,95,102,105,108,101,110, 97,109,101,114,4,0,0,0,114,4,0,0,0,114,5,0, 0,0,218,17,115,111,117,114,99,101,95,102,114,111,109,95, - 99,97,99,104,101,33,1,0,0,115,44,0,0,0,0,9, + 99,97,99,104,101,36,1,0,0,115,44,0,0,0,0,9, 18,1,12,1,18,1,18,1,12,1,9,1,15,1,15,1, 12,1,9,1,15,1,12,1,22,1,15,1,9,1,12,1, 22,1,12,1,9,1,12,1,19,1,114,85,0,0,0,99, @@ -484,7 +484,7 @@ const unsigned char _Py_M__importlib_external[] = { 0,0,114,36,0,0,0,90,9,101,120,116,101,110,115,105, 111,110,218,11,115,111,117,114,99,101,95,112,97,116,104,114, 4,0,0,0,114,4,0,0,0,114,5,0,0,0,218,15, - 95,103,101,116,95,115,111,117,114,99,101,102,105,108,101,66, + 95,103,101,116,95,115,111,117,114,99,101,102,105,108,101,69, 1,0,0,115,20,0,0,0,0,7,18,1,4,1,24,1, 35,1,4,1,3,1,16,1,19,1,21,1,114,91,0,0, 0,99,1,0,0,0,0,0,0,0,1,0,0,0,11,0, @@ -499,7 +499,7 @@ const unsigned char _Py_M__importlib_external[] = { 0,0,114,79,0,0,0,114,66,0,0,0,114,74,0,0, 0,41,1,218,8,102,105,108,101,110,97,109,101,114,4,0, 0,0,114,4,0,0,0,114,5,0,0,0,218,11,95,103, - 101,116,95,99,97,99,104,101,100,85,1,0,0,115,16,0, + 101,116,95,99,97,99,104,101,100,88,1,0,0,115,16,0, 0,0,0,1,21,1,3,1,14,1,13,1,8,1,21,1, 4,2,114,95,0,0,0,99,1,0,0,0,0,0,0,0, 2,0,0,0,11,0,0,0,67,0,0,0,115,60,0,0, @@ -514,7 +514,7 @@ const unsigned char _Py_M__importlib_external[] = { 114,39,0,0,0,114,41,0,0,0,114,40,0,0,0,41, 2,114,35,0,0,0,114,42,0,0,0,114,4,0,0,0, 114,4,0,0,0,114,5,0,0,0,218,10,95,99,97,108, - 99,95,109,111,100,101,97,1,0,0,115,12,0,0,0,0, + 99,95,109,111,100,101,100,1,0,0,115,12,0,0,0,0, 2,3,1,19,1,13,1,11,3,10,1,114,97,0,0,0, 99,1,0,0,0,0,0,0,0,3,0,0,0,11,0,0, 0,3,0,0,0,115,84,0,0,0,100,1,0,135,0,0, @@ -554,7 +554,7 @@ const unsigned char _Py_M__importlib_external[] = { 103,115,90,6,107,119,97,114,103,115,41,1,218,6,109,101, 116,104,111,100,114,4,0,0,0,114,5,0,0,0,218,19, 95,99,104,101,99,107,95,110,97,109,101,95,119,114,97,112, - 112,101,114,117,1,0,0,115,12,0,0,0,0,1,12,1, + 112,101,114,120,1,0,0,115,12,0,0,0,0,1,12,1, 12,1,15,1,6,1,25,1,122,40,95,99,104,101,99,107, 95,110,97,109,101,46,60,108,111,99,97,108,115,62,46,95, 99,104,101,99,107,95,110,97,109,101,95,119,114,97,112,112, @@ -573,7 +573,7 @@ const unsigned char _Py_M__importlib_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,52,0,0,0,114,4,0,0,0,114,4,0, - 0,0,114,5,0,0,0,218,5,95,119,114,97,112,128,1, + 0,0,114,5,0,0,0,218,5,95,119,114,97,112,131,1, 0,0,115,8,0,0,0,0,1,25,1,15,1,29,1,122, 26,95,99,104,101,99,107,95,110,97,109,101,46,60,108,111, 99,97,108,115,62,46,95,119,114,97,112,41,3,218,10,95, @@ -581,7 +581,7 @@ const unsigned char _Py_M__importlib_external[] = { 78,97,109,101,69,114,114,111,114,41,3,114,102,0,0,0, 114,103,0,0,0,114,113,0,0,0,114,4,0,0,0,41, 1,114,102,0,0,0,114,5,0,0,0,218,11,95,99,104, - 101,99,107,95,110,97,109,101,109,1,0,0,115,14,0,0, + 101,99,107,95,110,97,109,101,112,1,0,0,115,14,0,0, 0,0,8,21,7,3,1,13,1,13,2,17,5,13,1,114, 116,0,0,0,99,2,0,0,0,0,0,0,0,5,0,0, 0,4,0,0,0,67,0,0,0,115,84,0,0,0,124,0, @@ -611,7 +611,7 @@ const unsigned char _Py_M__importlib_external[] = { 218,8,112,111,114,116,105,111,110,115,218,3,109,115,103,114, 4,0,0,0,114,4,0,0,0,114,5,0,0,0,218,17, 95,102,105,110,100,95,109,111,100,117,108,101,95,115,104,105, - 109,137,1,0,0,115,10,0,0,0,0,10,21,1,24,1, + 109,140,1,0,0,115,10,0,0,0,0,10,21,1,24,1, 6,1,29,1,114,123,0,0,0,99,4,0,0,0,0,0, 0,0,11,0,0,0,19,0,0,0,67,0,0,0,115,252, 1,0,0,105,0,0,125,4,0,124,2,0,100,1,0,107, @@ -698,7 +698,7 @@ const unsigned char _Py_M__importlib_external[] = { 218,11,115,111,117,114,99,101,95,115,105,122,101,114,4,0, 0,0,114,4,0,0,0,114,5,0,0,0,218,25,95,118, 97,108,105,100,97,116,101,95,98,121,116,101,99,111,100,101, - 95,104,101,97,100,101,114,154,1,0,0,115,76,0,0,0, + 95,104,101,97,100,101,114,157,1,0,0,115,76,0,0,0, 0,11,6,1,12,1,13,3,6,1,12,1,10,1,16,1, 16,1,16,1,12,1,18,1,16,1,18,1,18,1,15,1, 16,1,15,1,18,1,15,1,16,1,12,1,12,1,3,1, @@ -729,7 +729,7 @@ const unsigned char _Py_M__importlib_external[] = { 5,114,53,0,0,0,114,98,0,0,0,114,89,0,0,0, 114,90,0,0,0,218,4,99,111,100,101,114,4,0,0,0, 114,4,0,0,0,114,5,0,0,0,218,17,95,99,111,109, - 112,105,108,101,95,98,121,116,101,99,111,100,101,209,1,0, + 112,105,108,101,95,98,121,116,101,99,111,100,101,212,1,0, 0,115,16,0,0,0,0,2,15,1,15,1,16,1,12,1, 16,1,4,2,18,1,114,141,0,0,0,114,59,0,0,0, 99,3,0,0,0,0,0,0,0,4,0,0,0,3,0,0, @@ -749,7 +749,7 @@ const unsigned char _Py_M__importlib_external[] = { 100,117,109,112,115,41,4,114,140,0,0,0,114,126,0,0, 0,114,134,0,0,0,114,53,0,0,0,114,4,0,0,0, 114,4,0,0,0,114,5,0,0,0,218,17,95,99,111,100, - 101,95,116,111,95,98,121,116,101,99,111,100,101,221,1,0, + 101,95,116,111,95,98,121,116,101,99,111,100,101,224,1,0, 0,115,10,0,0,0,0,3,12,1,19,1,19,1,22,1, 114,144,0,0,0,99,1,0,0,0,0,0,0,0,5,0, 0,0,4,0,0,0,67,0,0,0,115,89,0,0,0,100, @@ -778,7 +778,7 @@ const unsigned char _Py_M__importlib_external[] = { 218,8,101,110,99,111,100,105,110,103,90,15,110,101,119,108, 105,110,101,95,100,101,99,111,100,101,114,114,4,0,0,0, 114,4,0,0,0,114,5,0,0,0,218,13,100,101,99,111, - 100,101,95,115,111,117,114,99,101,231,1,0,0,115,10,0, + 100,101,95,115,111,117,114,99,101,234,1,0,0,115,10,0, 0,0,0,5,12,1,18,1,15,1,18,1,114,149,0,0, 0,114,120,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, @@ -843,7 +843,7 @@ const unsigned char _Py_M__importlib_external[] = { 102,105,120,101,115,114,153,0,0,0,90,7,100,105,114,110, 97,109,101,114,4,0,0,0,114,4,0,0,0,114,5,0, 0,0,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,248,1,0,0,115, + 108,101,95,108,111,99,97,116,105,111,110,251,1,0,0,115, 60,0,0,0,0,12,12,4,6,1,15,2,3,1,19,1, 13,1,5,8,24,1,9,3,12,1,22,1,21,1,15,1, 9,1,5,2,4,3,12,2,15,1,3,1,19,1,13,1, @@ -883,7 +883,7 @@ const unsigned char _Py_M__importlib_external[] = { 72,75,69,89,95,76,79,67,65,76,95,77,65,67,72,73, 78,69,41,2,218,3,99,108,115,218,3,107,101,121,114,4, 0,0,0,114,4,0,0,0,114,5,0,0,0,218,14,95, - 111,112,101,110,95,114,101,103,105,115,116,114,121,70,2,0, + 111,112,101,110,95,114,101,103,105,115,116,114,121,73,2,0, 0,115,8,0,0,0,0,2,3,1,23,1,13,1,122,36, 87,105,110,100,111,119,115,82,101,103,105,115,116,114,121,70, 105,110,100,101,114,46,95,111,112,101,110,95,114,101,103,105, @@ -911,7 +911,7 @@ const unsigned char _Py_M__importlib_external[] = { 121,95,107,101,121,114,165,0,0,0,90,4,104,107,101,121, 218,8,102,105,108,101,112,97,116,104,114,4,0,0,0,114, 4,0,0,0,114,5,0,0,0,218,16,95,115,101,97,114, - 99,104,95,114,101,103,105,115,116,114,121,77,2,0,0,115, + 99,104,95,114,101,103,105,115,116,114,121,80,2,0,0,115, 22,0,0,0,0,2,9,1,12,2,9,1,15,1,26,1, 3,1,18,1,29,1,13,1,9,1,122,38,87,105,110,100, 111,119,115,82,101,103,105,115,116,114,121,70,105,110,100,101, @@ -936,7 +936,7 @@ const unsigned char _Py_M__importlib_external[] = { 103,101,116,114,171,0,0,0,114,120,0,0,0,114,160,0, 0,0,114,158,0,0,0,114,4,0,0,0,114,4,0,0, 0,114,5,0,0,0,218,9,102,105,110,100,95,115,112,101, - 99,92,2,0,0,115,26,0,0,0,0,2,15,1,12,1, + 99,95,2,0,0,115,26,0,0,0,0,2,15,1,12,1, 4,1,3,1,14,1,13,1,9,1,22,1,21,1,9,1, 15,1,9,1,122,31,87,105,110,100,111,119,115,82,101,103, 105,115,116,114,121,70,105,110,100,101,114,46,102,105,110,100, @@ -955,7 +955,7 @@ const unsigned char _Py_M__importlib_external[] = { 175,0,0,0,114,120,0,0,0,41,4,114,164,0,0,0, 114,119,0,0,0,114,35,0,0,0,114,158,0,0,0,114, 4,0,0,0,114,4,0,0,0,114,5,0,0,0,218,11, - 102,105,110,100,95,109,111,100,117,108,101,108,2,0,0,115, + 102,105,110,100,95,109,111,100,117,108,101,111,2,0,0,115, 8,0,0,0,0,7,18,1,12,1,7,2,122,33,87,105, 110,100,111,119,115,82,101,103,105,115,116,114,121,70,105,110, 100,101,114,46,102,105,110,100,95,109,111,100,117,108,101,41, @@ -964,7 +964,7 @@ const unsigned char _Py_M__importlib_external[] = { 167,0,0,0,218,11,99,108,97,115,115,109,101,116,104,111, 100,114,166,0,0,0,114,172,0,0,0,114,175,0,0,0, 114,176,0,0,0,114,4,0,0,0,114,4,0,0,0,114, - 4,0,0,0,114,5,0,0,0,114,162,0,0,0,58,2, + 4,0,0,0,114,5,0,0,0,114,162,0,0,0,61,2, 0,0,115,20,0,0,0,12,2,6,3,6,3,6,2,6, 2,18,7,18,15,3,1,21,15,3,1,114,162,0,0,0, 99,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0, @@ -1002,7 +1002,7 @@ const unsigned char _Py_M__importlib_external[] = { 100,0,0,0,114,119,0,0,0,114,94,0,0,0,90,13, 102,105,108,101,110,97,109,101,95,98,97,115,101,90,9,116, 97,105,108,95,110,97,109,101,114,4,0,0,0,114,4,0, - 0,0,114,5,0,0,0,114,153,0,0,0,127,2,0,0, + 0,0,114,5,0,0,0,114,153,0,0,0,130,2,0,0, 115,8,0,0,0,0,3,25,1,22,1,19,1,122,24,95, 76,111,97,100,101,114,66,97,115,105,99,115,46,105,115,95, 112,97,99,107,97,103,101,99,2,0,0,0,0,0,0,0, @@ -1013,7 +1013,7 @@ const unsigned char _Py_M__importlib_external[] = { 111,110,46,78,114,4,0,0,0,41,2,114,100,0,0,0, 114,158,0,0,0,114,4,0,0,0,114,4,0,0,0,114, 5,0,0,0,218,13,99,114,101,97,116,101,95,109,111,100, - 117,108,101,135,2,0,0,115,0,0,0,0,122,27,95,76, + 117,108,101,138,2,0,0,115,0,0,0,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,3,0,0,0,4,0,0,0,67,0,0,0,115,80, @@ -1034,7 +1034,7 @@ const unsigned char _Py_M__importlib_external[] = { 101,99,114,111,0,0,0,41,3,114,100,0,0,0,218,6, 109,111,100,117,108,101,114,140,0,0,0,114,4,0,0,0, 114,4,0,0,0,114,5,0,0,0,218,11,101,120,101,99, - 95,109,111,100,117,108,101,138,2,0,0,115,10,0,0,0, + 95,109,111,100,117,108,101,141,2,0,0,115,10,0,0,0, 0,2,18,1,12,1,9,1,15,1,122,25,95,76,111,97, 100,101,114,66,97,115,105,99,115,46,101,120,101,99,95,109, 111,100,117,108,101,99,2,0,0,0,0,0,0,0,2,0, @@ -1045,14 +1045,14 @@ const unsigned char _Py_M__importlib_external[] = { 114,0,0,0,218,17,95,108,111,97,100,95,109,111,100,117, 108,101,95,115,104,105,109,41,2,114,100,0,0,0,114,119, 0,0,0,114,4,0,0,0,114,4,0,0,0,114,5,0, - 0,0,218,11,108,111,97,100,95,109,111,100,117,108,101,146, + 0,0,218,11,108,111,97,100,95,109,111,100,117,108,101,149, 2,0,0,115,2,0,0,0,0,2,122,25,95,76,111,97, 100,101,114,66,97,115,105,99,115,46,108,111,97,100,95,109, 111,100,117,108,101,78,41,8,114,105,0,0,0,114,104,0, 0,0,114,106,0,0,0,114,107,0,0,0,114,153,0,0, 0,114,180,0,0,0,114,185,0,0,0,114,187,0,0,0, 114,4,0,0,0,114,4,0,0,0,114,4,0,0,0,114, - 5,0,0,0,114,178,0,0,0,122,2,0,0,115,10,0, + 5,0,0,0,114,178,0,0,0,125,2,0,0,115,10,0, 0,0,12,3,6,2,12,8,12,3,12,8,114,178,0,0, 0,99,0,0,0,0,0,0,0,0,0,0,0,0,4,0, 0,0,64,0,0,0,115,106,0,0,0,101,0,0,90,1, @@ -1080,7 +1080,7 @@ const unsigned char _Py_M__importlib_external[] = { 41,1,218,7,73,79,69,114,114,111,114,41,2,114,100,0, 0,0,114,35,0,0,0,114,4,0,0,0,114,4,0,0, 0,114,5,0,0,0,218,10,112,97,116,104,95,109,116,105, - 109,101,153,2,0,0,115,2,0,0,0,0,6,122,23,83, + 109,101,156,2,0,0,115,2,0,0,0,0,6,122,23,83, 111,117,114,99,101,76,111,97,100,101,114,46,112,97,116,104, 95,109,116,105,109,101,99,2,0,0,0,0,0,0,0,2, 0,0,0,3,0,0,0,67,0,0,0,115,19,0,0,0, @@ -1115,7 +1115,7 @@ const unsigned char _Py_M__importlib_external[] = { 32,32,32,32,114,126,0,0,0,41,1,114,190,0,0,0, 41,2,114,100,0,0,0,114,35,0,0,0,114,4,0,0, 0,114,4,0,0,0,114,5,0,0,0,218,10,112,97,116, - 104,95,115,116,97,116,115,161,2,0,0,115,2,0,0,0, + 104,95,115,116,97,116,115,164,2,0,0,115,2,0,0,0, 0,11,122,23,83,111,117,114,99,101,76,111,97,100,101,114, 46,112,97,116,104,95,115,116,97,116,115,99,4,0,0,0, 0,0,0,0,4,0,0,0,3,0,0,0,67,0,0,0, @@ -1139,7 +1139,7 @@ const unsigned char _Py_M__importlib_external[] = { 114,90,0,0,0,90,10,99,97,99,104,101,95,112,97,116, 104,114,53,0,0,0,114,4,0,0,0,114,4,0,0,0, 114,5,0,0,0,218,15,95,99,97,99,104,101,95,98,121, - 116,101,99,111,100,101,174,2,0,0,115,2,0,0,0,0, + 116,101,99,111,100,101,177,2,0,0,115,2,0,0,0,0, 8,122,28,83,111,117,114,99,101,76,111,97,100,101,114,46, 95,99,97,99,104,101,95,98,121,116,101,99,111,100,101,99, 3,0,0,0,0,0,0,0,3,0,0,0,1,0,0,0, @@ -1156,7 +1156,7 @@ const unsigned char _Py_M__importlib_external[] = { 32,32,32,32,32,32,32,78,114,4,0,0,0,41,3,114, 100,0,0,0,114,35,0,0,0,114,53,0,0,0,114,4, 0,0,0,114,4,0,0,0,114,5,0,0,0,114,192,0, - 0,0,184,2,0,0,115,0,0,0,0,122,21,83,111,117, + 0,0,187,2,0,0,115,0,0,0,0,122,21,83,111,117, 114,99,101,76,111,97,100,101,114,46,115,101,116,95,100,97, 116,97,99,2,0,0,0,0,0,0,0,5,0,0,0,16, 0,0,0,67,0,0,0,115,105,0,0,0,124,0,0,106, @@ -1178,7 +1178,7 @@ const unsigned char _Py_M__importlib_external[] = { 0,0,0,114,119,0,0,0,114,35,0,0,0,114,147,0, 0,0,218,3,101,120,99,114,4,0,0,0,114,4,0,0, 0,114,5,0,0,0,218,10,103,101,116,95,115,111,117,114, - 99,101,191,2,0,0,115,14,0,0,0,0,2,15,1,3, + 99,101,194,2,0,0,115,14,0,0,0,0,2,15,1,3, 1,19,1,18,1,9,1,31,1,122,23,83,111,117,114,99, 101,76,111,97,100,101,114,46,103,101,116,95,115,111,117,114, 99,101,218,9,95,111,112,116,105,109,105,122,101,114,29,0, @@ -1200,7 +1200,7 @@ const unsigned char _Py_M__importlib_external[] = { 108,101,41,4,114,100,0,0,0,114,53,0,0,0,114,35, 0,0,0,114,197,0,0,0,114,4,0,0,0,114,4,0, 0,0,114,5,0,0,0,218,14,115,111,117,114,99,101,95, - 116,111,95,99,111,100,101,201,2,0,0,115,4,0,0,0, + 116,111,95,99,111,100,101,204,2,0,0,115,4,0,0,0, 0,5,21,1,122,27,83,111,117,114,99,101,76,111,97,100, 101,114,46,115,111,117,114,99,101,95,116,111,95,99,111,100, 101,99,2,0,0,0,0,0,0,0,10,0,0,0,43,0, @@ -1261,7 +1261,7 @@ const unsigned char _Py_M__importlib_external[] = { 89,0,0,0,218,2,115,116,114,53,0,0,0,218,10,98, 121,116,101,115,95,100,97,116,97,114,147,0,0,0,90,11, 99,111,100,101,95,111,98,106,101,99,116,114,4,0,0,0, - 114,4,0,0,0,114,5,0,0,0,114,181,0,0,0,209, + 114,4,0,0,0,114,5,0,0,0,114,181,0,0,0,212, 2,0,0,115,78,0,0,0,0,7,15,1,6,1,3,1, 16,1,13,1,11,2,3,1,19,1,13,1,5,2,16,1, 3,1,19,1,13,1,5,2,3,1,9,1,12,1,13,1, @@ -1274,7 +1274,7 @@ const unsigned char _Py_M__importlib_external[] = { 0,0,0,114,192,0,0,0,114,196,0,0,0,114,200,0, 0,0,114,181,0,0,0,114,4,0,0,0,114,4,0,0, 0,114,4,0,0,0,114,5,0,0,0,114,188,0,0,0, - 151,2,0,0,115,14,0,0,0,12,2,12,8,12,13,12, + 154,2,0,0,115,14,0,0,0,12,2,12,8,12,13,12, 10,12,7,12,10,18,8,114,188,0,0,0,99,0,0,0, 0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0, 0,115,112,0,0,0,101,0,0,90,1,0,100,0,0,90, @@ -1302,7 +1302,7 @@ const unsigned char _Py_M__importlib_external[] = { 32,32,32,32,32,102,105,110,100,101,114,46,78,41,2,114, 98,0,0,0,114,35,0,0,0,41,3,114,100,0,0,0, 114,119,0,0,0,114,35,0,0,0,114,4,0,0,0,114, - 4,0,0,0,114,5,0,0,0,114,179,0,0,0,10,3, + 4,0,0,0,114,5,0,0,0,114,179,0,0,0,13,3, 0,0,115,4,0,0,0,0,3,9,1,122,19,70,105,108, 101,76,111,97,100,101,114,46,95,95,105,110,105,116,95,95, 99,2,0,0,0,0,0,0,0,2,0,0,0,2,0,0, @@ -1312,7 +1312,7 @@ const unsigned char _Py_M__importlib_external[] = { 2,218,9,95,95,99,108,97,115,115,95,95,114,111,0,0, 0,41,2,114,100,0,0,0,218,5,111,116,104,101,114,114, 4,0,0,0,114,4,0,0,0,114,5,0,0,0,218,6, - 95,95,101,113,95,95,16,3,0,0,115,4,0,0,0,0, + 95,95,101,113,95,95,19,3,0,0,115,4,0,0,0,0, 1,18,1,122,17,70,105,108,101,76,111,97,100,101,114,46, 95,95,101,113,95,95,99,1,0,0,0,0,0,0,0,1, 0,0,0,3,0,0,0,67,0,0,0,115,26,0,0,0, @@ -1320,7 +1320,7 @@ const unsigned char _Py_M__importlib_external[] = { 0,0,106,2,0,131,1,0,65,83,41,1,78,41,3,218, 4,104,97,115,104,114,98,0,0,0,114,35,0,0,0,41, 1,114,100,0,0,0,114,4,0,0,0,114,4,0,0,0, - 114,5,0,0,0,218,8,95,95,104,97,115,104,95,95,20, + 114,5,0,0,0,218,8,95,95,104,97,115,104,95,95,23, 3,0,0,115,2,0,0,0,0,1,122,19,70,105,108,101, 76,111,97,100,101,114,46,95,95,104,97,115,104,95,95,99, 2,0,0,0,0,0,0,0,2,0,0,0,3,0,0,0, @@ -1335,7 +1335,7 @@ const unsigned char _Py_M__importlib_external[] = { 32,32,32,32,32,32,32,41,3,218,5,115,117,112,101,114, 114,204,0,0,0,114,187,0,0,0,41,2,114,100,0,0, 0,114,119,0,0,0,41,1,114,205,0,0,0,114,4,0, - 0,0,114,5,0,0,0,114,187,0,0,0,23,3,0,0, + 0,0,114,5,0,0,0,114,187,0,0,0,26,3,0,0, 115,2,0,0,0,0,10,122,22,70,105,108,101,76,111,97, 100,101,114,46,108,111,97,100,95,109,111,100,117,108,101,99, 2,0,0,0,0,0,0,0,2,0,0,0,1,0,0,0, @@ -1346,7 +1346,7 @@ const unsigned char _Py_M__importlib_external[] = { 98,121,32,116,104,101,32,102,105,110,100,101,114,46,41,1, 114,35,0,0,0,41,2,114,100,0,0,0,114,119,0,0, 0,114,4,0,0,0,114,4,0,0,0,114,5,0,0,0, - 114,151,0,0,0,35,3,0,0,115,2,0,0,0,0,3, + 114,151,0,0,0,38,3,0,0,115,2,0,0,0,0,3, 122,23,70,105,108,101,76,111,97,100,101,114,46,103,101,116, 95,102,105,108,101,110,97,109,101,99,2,0,0,0,0,0, 0,0,3,0,0,0,9,0,0,0,67,0,0,0,115,42, @@ -1359,14 +1359,14 @@ const unsigned char _Py_M__importlib_external[] = { 0,0,0,114,50,0,0,0,90,4,114,101,97,100,41,3, 114,100,0,0,0,114,35,0,0,0,114,54,0,0,0,114, 4,0,0,0,114,4,0,0,0,114,5,0,0,0,114,194, - 0,0,0,40,3,0,0,115,4,0,0,0,0,2,21,1, + 0,0,0,43,3,0,0,115,4,0,0,0,0,2,21,1, 122,19,70,105,108,101,76,111,97,100,101,114,46,103,101,116, 95,100,97,116,97,41,11,114,105,0,0,0,114,104,0,0, 0,114,106,0,0,0,114,107,0,0,0,114,179,0,0,0, 114,207,0,0,0,114,209,0,0,0,114,116,0,0,0,114, 187,0,0,0,114,151,0,0,0,114,194,0,0,0,114,4, 0,0,0,114,4,0,0,0,41,1,114,205,0,0,0,114, - 5,0,0,0,114,204,0,0,0,5,3,0,0,115,14,0, + 5,0,0,0,114,204,0,0,0,8,3,0,0,115,14,0, 0,0,12,3,6,2,12,6,12,4,12,3,24,12,18,5, 114,204,0,0,0,99,0,0,0,0,0,0,0,0,0,0, 0,0,4,0,0,0,64,0,0,0,115,64,0,0,0,101, @@ -1389,7 +1389,7 @@ const unsigned char _Py_M__importlib_external[] = { 114,39,0,0,0,218,8,115,116,95,109,116,105,109,101,90, 7,115,116,95,115,105,122,101,41,3,114,100,0,0,0,114, 35,0,0,0,114,202,0,0,0,114,4,0,0,0,114,4, - 0,0,0,114,5,0,0,0,114,191,0,0,0,50,3,0, + 0,0,0,114,5,0,0,0,114,191,0,0,0,53,3,0, 0,115,4,0,0,0,0,2,12,1,122,27,83,111,117,114, 99,101,70,105,108,101,76,111,97,100,101,114,46,112,97,116, 104,95,115,116,97,116,115,99,4,0,0,0,0,0,0,0, @@ -1400,7 +1400,7 @@ const unsigned char _Py_M__importlib_external[] = { 97,0,0,0,114,192,0,0,0,41,5,114,100,0,0,0, 114,90,0,0,0,114,89,0,0,0,114,53,0,0,0,114, 42,0,0,0,114,4,0,0,0,114,4,0,0,0,114,5, - 0,0,0,114,193,0,0,0,55,3,0,0,115,4,0,0, + 0,0,0,114,193,0,0,0,58,3,0,0,115,4,0,0, 0,0,2,12,1,122,32,83,111,117,114,99,101,70,105,108, 101,76,111,97,100,101,114,46,95,99,97,99,104,101,95,98, 121,116,101,99,111,100,101,114,214,0,0,0,105,182,1,0, @@ -1439,7 +1439,7 @@ const unsigned char _Py_M__importlib_external[] = { 0,114,214,0,0,0,218,6,112,97,114,101,110,116,114,94, 0,0,0,114,27,0,0,0,114,23,0,0,0,114,195,0, 0,0,114,4,0,0,0,114,4,0,0,0,114,5,0,0, - 0,114,192,0,0,0,60,3,0,0,115,42,0,0,0,0, + 0,114,192,0,0,0,63,3,0,0,115,42,0,0,0,0, 2,18,1,6,2,22,1,18,1,17,2,19,1,15,1,3, 1,17,1,13,2,7,1,18,3,9,1,10,1,27,1,3, 1,16,1,20,1,18,2,12,1,122,25,83,111,117,114,99, @@ -1448,7 +1448,7 @@ const unsigned char _Py_M__importlib_external[] = { 0,114,106,0,0,0,114,107,0,0,0,114,191,0,0,0, 114,193,0,0,0,114,192,0,0,0,114,4,0,0,0,114, 4,0,0,0,114,4,0,0,0,114,5,0,0,0,114,212, - 0,0,0,46,3,0,0,115,8,0,0,0,12,2,6,2, + 0,0,0,49,3,0,0,115,8,0,0,0,12,2,6,2, 12,5,12,5,114,212,0,0,0,99,0,0,0,0,0,0, 0,0,0,0,0,0,2,0,0,0,64,0,0,0,115,46, 0,0,0,101,0,0,90,1,0,100,0,0,90,2,0,100, @@ -1470,7 +1470,7 @@ const unsigned char _Py_M__importlib_external[] = { 0,114,141,0,0,0,41,5,114,100,0,0,0,114,119,0, 0,0,114,35,0,0,0,114,53,0,0,0,114,203,0,0, 0,114,4,0,0,0,114,4,0,0,0,114,5,0,0,0, - 114,181,0,0,0,95,3,0,0,115,8,0,0,0,0,1, + 114,181,0,0,0,98,3,0,0,115,8,0,0,0,0,1, 15,1,15,1,24,1,122,29,83,111,117,114,99,101,108,101, 115,115,70,105,108,101,76,111,97,100,101,114,46,103,101,116, 95,99,111,100,101,99,2,0,0,0,0,0,0,0,2,0, @@ -1480,13 +1480,13 @@ const unsigned char _Py_M__importlib_external[] = { 111,32,115,111,117,114,99,101,32,99,111,100,101,46,78,114, 4,0,0,0,41,2,114,100,0,0,0,114,119,0,0,0, 114,4,0,0,0,114,4,0,0,0,114,5,0,0,0,114, - 196,0,0,0,101,3,0,0,115,2,0,0,0,0,2,122, + 196,0,0,0,104,3,0,0,115,2,0,0,0,0,2,122, 31,83,111,117,114,99,101,108,101,115,115,70,105,108,101,76, 111,97,100,101,114,46,103,101,116,95,115,111,117,114,99,101, 78,41,6,114,105,0,0,0,114,104,0,0,0,114,106,0, 0,0,114,107,0,0,0,114,181,0,0,0,114,196,0,0, 0,114,4,0,0,0,114,4,0,0,0,114,4,0,0,0, - 114,5,0,0,0,114,217,0,0,0,91,3,0,0,115,6, + 114,5,0,0,0,114,217,0,0,0,94,3,0,0,115,6, 0,0,0,12,2,6,2,12,6,114,217,0,0,0,99,0, 0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,64, 0,0,0,115,136,0,0,0,101,0,0,90,1,0,100,0, @@ -1511,7 +1511,7 @@ const unsigned char _Py_M__importlib_external[] = { 1,0,100,0,0,83,41,1,78,41,2,114,98,0,0,0, 114,35,0,0,0,41,3,114,100,0,0,0,114,98,0,0, 0,114,35,0,0,0,114,4,0,0,0,114,4,0,0,0, - 114,5,0,0,0,114,179,0,0,0,118,3,0,0,115,4, + 114,5,0,0,0,114,179,0,0,0,121,3,0,0,115,4, 0,0,0,0,1,9,1,122,28,69,120,116,101,110,115,105, 111,110,70,105,108,101,76,111,97,100,101,114,46,95,95,105, 110,105,116,95,95,99,2,0,0,0,0,0,0,0,2,0, @@ -1521,7 +1521,7 @@ const unsigned char _Py_M__importlib_external[] = { 83,41,1,78,41,2,114,205,0,0,0,114,111,0,0,0, 41,2,114,100,0,0,0,114,206,0,0,0,114,4,0,0, 0,114,4,0,0,0,114,5,0,0,0,114,207,0,0,0, - 122,3,0,0,115,4,0,0,0,0,1,18,1,122,26,69, + 125,3,0,0,115,4,0,0,0,0,1,18,1,122,26,69, 120,116,101,110,115,105,111,110,70,105,108,101,76,111,97,100, 101,114,46,95,95,101,113,95,95,99,1,0,0,0,0,0, 0,0,1,0,0,0,3,0,0,0,67,0,0,0,115,26, @@ -1529,7 +1529,7 @@ const unsigned char _Py_M__importlib_external[] = { 0,0,124,0,0,106,2,0,131,1,0,65,83,41,1,78, 41,3,114,208,0,0,0,114,98,0,0,0,114,35,0,0, 0,41,1,114,100,0,0,0,114,4,0,0,0,114,4,0, - 0,0,114,5,0,0,0,114,209,0,0,0,126,3,0,0, + 0,0,114,5,0,0,0,114,209,0,0,0,129,3,0,0, 115,2,0,0,0,0,1,122,28,69,120,116,101,110,115,105, 111,110,70,105,108,101,76,111,97,100,101,114,46,95,95,104, 97,115,104,95,95,99,2,0,0,0,0,0,0,0,3,0, @@ -1547,7 +1547,7 @@ const unsigned char _Py_M__importlib_external[] = { 97,109,105,99,114,129,0,0,0,114,98,0,0,0,114,35, 0,0,0,41,3,114,100,0,0,0,114,158,0,0,0,114, 184,0,0,0,114,4,0,0,0,114,4,0,0,0,114,5, - 0,0,0,114,180,0,0,0,129,3,0,0,115,10,0,0, + 0,0,0,114,180,0,0,0,132,3,0,0,115,10,0,0, 0,0,2,6,1,15,1,9,1,16,1,122,33,69,120,116, 101,110,115,105,111,110,70,105,108,101,76,111,97,100,101,114, 46,99,114,101,97,116,101,95,109,111,100,117,108,101,99,2, @@ -1565,7 +1565,7 @@ const unsigned char _Py_M__importlib_external[] = { 97,109,105,99,114,129,0,0,0,114,98,0,0,0,114,35, 0,0,0,41,2,114,100,0,0,0,114,184,0,0,0,114, 4,0,0,0,114,4,0,0,0,114,5,0,0,0,114,185, - 0,0,0,137,3,0,0,115,6,0,0,0,0,2,19,1, + 0,0,0,140,3,0,0,115,6,0,0,0,0,2,19,1, 9,1,122,31,69,120,116,101,110,115,105,111,110,70,105,108, 101,76,111,97,100,101,114,46,101,120,101,99,95,109,111,100, 117,108,101,99,2,0,0,0,0,0,0,0,2,0,0,0, @@ -1583,7 +1583,7 @@ const unsigned char _Py_M__importlib_external[] = { 41,2,114,179,0,0,0,78,114,4,0,0,0,41,2,114, 22,0,0,0,218,6,115,117,102,102,105,120,41,1,218,9, 102,105,108,101,95,110,97,109,101,114,4,0,0,0,114,5, - 0,0,0,250,9,60,103,101,110,101,120,112,114,62,146,3, + 0,0,0,250,9,60,103,101,110,101,120,112,114,62,149,3, 0,0,115,2,0,0,0,6,1,122,49,69,120,116,101,110, 115,105,111,110,70,105,108,101,76,111,97,100,101,114,46,105, 115,95,112,97,99,107,97,103,101,46,60,108,111,99,97,108, @@ -1592,7 +1592,7 @@ const unsigned char _Py_M__importlib_external[] = { 88,84,69,78,83,73,79,78,95,83,85,70,70,73,88,69, 83,41,2,114,100,0,0,0,114,119,0,0,0,114,4,0, 0,0,41,1,114,220,0,0,0,114,5,0,0,0,114,153, - 0,0,0,143,3,0,0,115,6,0,0,0,0,2,19,1, + 0,0,0,146,3,0,0,115,6,0,0,0,0,2,19,1, 18,1,122,30,69,120,116,101,110,115,105,111,110,70,105,108, 101,76,111,97,100,101,114,46,105,115,95,112,97,99,107,97, 103,101,99,2,0,0,0,0,0,0,0,2,0,0,0,1, @@ -1603,7 +1603,7 @@ const unsigned char _Py_M__importlib_external[] = { 101,97,116,101,32,97,32,99,111,100,101,32,111,98,106,101, 99,116,46,78,114,4,0,0,0,41,2,114,100,0,0,0, 114,119,0,0,0,114,4,0,0,0,114,4,0,0,0,114, - 5,0,0,0,114,181,0,0,0,149,3,0,0,115,2,0, + 5,0,0,0,114,181,0,0,0,152,3,0,0,115,2,0, 0,0,0,2,122,28,69,120,116,101,110,115,105,111,110,70, 105,108,101,76,111,97,100,101,114,46,103,101,116,95,99,111, 100,101,99,2,0,0,0,0,0,0,0,2,0,0,0,1, @@ -1613,7 +1613,7 @@ const unsigned char _Py_M__importlib_external[] = { 117,108,101,115,32,104,97,118,101,32,110,111,32,115,111,117, 114,99,101,32,99,111,100,101,46,78,114,4,0,0,0,41, 2,114,100,0,0,0,114,119,0,0,0,114,4,0,0,0, - 114,4,0,0,0,114,5,0,0,0,114,196,0,0,0,153, + 114,4,0,0,0,114,5,0,0,0,114,196,0,0,0,156, 3,0,0,115,2,0,0,0,0,2,122,30,69,120,116,101, 110,115,105,111,110,70,105,108,101,76,111,97,100,101,114,46, 103,101,116,95,115,111,117,114,99,101,99,2,0,0,0,0, @@ -1625,7 +1625,7 @@ const unsigned char _Py_M__importlib_external[] = { 101,32,102,105,110,100,101,114,46,41,1,114,35,0,0,0, 41,2,114,100,0,0,0,114,119,0,0,0,114,4,0,0, 0,114,4,0,0,0,114,5,0,0,0,114,151,0,0,0, - 157,3,0,0,115,2,0,0,0,0,3,122,32,69,120,116, + 160,3,0,0,115,2,0,0,0,0,3,122,32,69,120,116, 101,110,115,105,111,110,70,105,108,101,76,111,97,100,101,114, 46,103,101,116,95,102,105,108,101,110,97,109,101,78,41,14, 114,105,0,0,0,114,104,0,0,0,114,106,0,0,0,114, @@ -1633,7 +1633,7 @@ const unsigned char _Py_M__importlib_external[] = { 0,0,0,114,180,0,0,0,114,185,0,0,0,114,153,0, 0,0,114,181,0,0,0,114,196,0,0,0,114,116,0,0, 0,114,151,0,0,0,114,4,0,0,0,114,4,0,0,0, - 114,4,0,0,0,114,5,0,0,0,114,218,0,0,0,110, + 114,4,0,0,0,114,5,0,0,0,114,218,0,0,0,113, 3,0,0,115,20,0,0,0,12,6,6,2,12,4,12,4, 12,3,12,8,12,6,12,6,12,4,12,4,114,218,0,0, 0,99,0,0,0,0,0,0,0,0,0,0,0,0,2,0, @@ -1679,7 +1679,7 @@ const unsigned char _Py_M__importlib_external[] = { 4,114,100,0,0,0,114,98,0,0,0,114,35,0,0,0, 218,11,112,97,116,104,95,102,105,110,100,101,114,114,4,0, 0,0,114,4,0,0,0,114,5,0,0,0,114,179,0,0, - 0,170,3,0,0,115,8,0,0,0,0,1,9,1,9,1, + 0,173,3,0,0,115,8,0,0,0,0,1,9,1,9,1, 21,1,122,23,95,78,97,109,101,115,112,97,99,101,80,97, 116,104,46,95,95,105,110,105,116,95,95,99,1,0,0,0, 0,0,0,0,4,0,0,0,3,0,0,0,67,0,0,0, @@ -1698,7 +1698,7 @@ const unsigned char _Py_M__importlib_external[] = { 3,100,111,116,90,2,109,101,114,4,0,0,0,114,4,0, 0,0,114,5,0,0,0,218,23,95,102,105,110,100,95,112, 97,114,101,110,116,95,112,97,116,104,95,110,97,109,101,115, - 176,3,0,0,115,8,0,0,0,0,2,27,1,12,2,4, + 179,3,0,0,115,8,0,0,0,0,2,27,1,12,2,4, 3,122,38,95,78,97,109,101,115,112,97,99,101,80,97,116, 104,46,95,102,105,110,100,95,112,97,114,101,110,116,95,112, 97,116,104,95,110,97,109,101,115,99,1,0,0,0,0,0, @@ -1711,7 +1711,7 @@ const unsigned char _Py_M__importlib_external[] = { 97,114,101,110,116,95,109,111,100,117,108,101,95,110,97,109, 101,90,14,112,97,116,104,95,97,116,116,114,95,110,97,109, 101,114,4,0,0,0,114,4,0,0,0,114,5,0,0,0, - 114,227,0,0,0,186,3,0,0,115,4,0,0,0,0,1, + 114,227,0,0,0,189,3,0,0,115,4,0,0,0,0,1, 18,1,122,31,95,78,97,109,101,115,112,97,99,101,80,97, 116,104,46,95,103,101,116,95,112,97,114,101,110,116,95,112, 97,116,104,99,1,0,0,0,0,0,0,0,3,0,0,0, @@ -1729,7 +1729,7 @@ const unsigned char _Py_M__importlib_external[] = { 41,3,114,100,0,0,0,90,11,112,97,114,101,110,116,95, 112,97,116,104,114,158,0,0,0,114,4,0,0,0,114,4, 0,0,0,114,5,0,0,0,218,12,95,114,101,99,97,108, - 99,117,108,97,116,101,190,3,0,0,115,16,0,0,0,0, + 99,117,108,97,116,101,193,3,0,0,115,16,0,0,0,0, 2,18,1,15,1,21,3,27,1,9,1,12,1,9,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, @@ -1738,7 +1738,7 @@ const unsigned char _Py_M__importlib_external[] = { 0,0,131,1,0,83,41,1,78,41,2,218,4,105,116,101, 114,114,234,0,0,0,41,1,114,100,0,0,0,114,4,0, 0,0,114,4,0,0,0,114,5,0,0,0,218,8,95,95, - 105,116,101,114,95,95,203,3,0,0,115,2,0,0,0,0, + 105,116,101,114,95,95,206,3,0,0,115,2,0,0,0,0, 1,122,23,95,78,97,109,101,115,112,97,99,101,80,97,116, 104,46,95,95,105,116,101,114,95,95,99,3,0,0,0,0, 0,0,0,3,0,0,0,3,0,0,0,67,0,0,0,115, @@ -1746,7 +1746,7 @@ const unsigned char _Py_M__importlib_external[] = { 60,100,0,0,83,41,1,78,41,1,114,226,0,0,0,41, 3,114,100,0,0,0,218,5,105,110,100,101,120,114,35,0, 0,0,114,4,0,0,0,114,4,0,0,0,114,5,0,0, - 0,218,11,95,95,115,101,116,105,116,101,109,95,95,206,3, + 0,218,11,95,95,115,101,116,105,116,101,109,95,95,209,3, 0,0,115,2,0,0,0,0,1,122,26,95,78,97,109,101, 115,112,97,99,101,80,97,116,104,46,95,95,115,101,116,105, 116,101,109,95,95,99,1,0,0,0,0,0,0,0,1,0, @@ -1754,7 +1754,7 @@ const unsigned char _Py_M__importlib_external[] = { 0,0,124,0,0,106,1,0,131,0,0,131,1,0,83,41, 1,78,41,2,114,31,0,0,0,114,234,0,0,0,41,1, 114,100,0,0,0,114,4,0,0,0,114,4,0,0,0,114, - 5,0,0,0,218,7,95,95,108,101,110,95,95,209,3,0, + 5,0,0,0,218,7,95,95,108,101,110,95,95,212,3,0, 0,115,2,0,0,0,0,1,122,22,95,78,97,109,101,115, 112,97,99,101,80,97,116,104,46,95,95,108,101,110,95,95, 99,1,0,0,0,0,0,0,0,1,0,0,0,2,0,0, @@ -1763,7 +1763,7 @@ const unsigned char _Py_M__importlib_external[] = { 78,97,109,101,115,112,97,99,101,80,97,116,104,40,123,33, 114,125,41,41,2,114,47,0,0,0,114,226,0,0,0,41, 1,114,100,0,0,0,114,4,0,0,0,114,4,0,0,0, - 114,5,0,0,0,218,8,95,95,114,101,112,114,95,95,212, + 114,5,0,0,0,218,8,95,95,114,101,112,114,95,95,215, 3,0,0,115,2,0,0,0,0,1,122,23,95,78,97,109, 101,115,112,97,99,101,80,97,116,104,46,95,95,114,101,112, 114,95,95,99,2,0,0,0,0,0,0,0,2,0,0,0, @@ -1772,7 +1772,7 @@ const unsigned char _Py_M__importlib_external[] = { 41,1,114,234,0,0,0,41,2,114,100,0,0,0,218,4, 105,116,101,109,114,4,0,0,0,114,4,0,0,0,114,5, 0,0,0,218,12,95,95,99,111,110,116,97,105,110,115,95, - 95,215,3,0,0,115,2,0,0,0,0,1,122,27,95,78, + 95,218,3,0,0,115,2,0,0,0,0,1,122,27,95,78, 97,109,101,115,112,97,99,101,80,97,116,104,46,95,95,99, 111,110,116,97,105,110,115,95,95,99,2,0,0,0,0,0, 0,0,2,0,0,0,2,0,0,0,67,0,0,0,115,20, @@ -1780,7 +1780,7 @@ const unsigned char _Py_M__importlib_external[] = { 1,0,1,100,0,0,83,41,1,78,41,2,114,226,0,0, 0,114,157,0,0,0,41,2,114,100,0,0,0,114,241,0, 0,0,114,4,0,0,0,114,4,0,0,0,114,5,0,0, - 0,114,157,0,0,0,218,3,0,0,115,2,0,0,0,0, + 0,114,157,0,0,0,221,3,0,0,115,2,0,0,0,0, 1,122,21,95,78,97,109,101,115,112,97,99,101,80,97,116, 104,46,97,112,112,101,110,100,78,41,14,114,105,0,0,0, 114,104,0,0,0,114,106,0,0,0,114,107,0,0,0,114, @@ -1788,7 +1788,7 @@ const unsigned char _Py_M__importlib_external[] = { 0,0,0,114,236,0,0,0,114,238,0,0,0,114,239,0, 0,0,114,240,0,0,0,114,242,0,0,0,114,157,0,0, 0,114,4,0,0,0,114,4,0,0,0,114,4,0,0,0, - 114,5,0,0,0,114,224,0,0,0,163,3,0,0,115,22, + 114,5,0,0,0,114,224,0,0,0,166,3,0,0,115,22, 0,0,0,12,5,6,2,12,6,12,10,12,4,12,13,12, 3,12,3,12,3,12,3,12,3,114,224,0,0,0,99,0, 0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,64, @@ -1807,7 +1807,7 @@ const unsigned char _Py_M__importlib_external[] = { 0,100,0,0,83,41,1,78,41,2,114,224,0,0,0,114, 226,0,0,0,41,4,114,100,0,0,0,114,98,0,0,0, 114,35,0,0,0,114,230,0,0,0,114,4,0,0,0,114, - 4,0,0,0,114,5,0,0,0,114,179,0,0,0,224,3, + 4,0,0,0,114,5,0,0,0,114,179,0,0,0,227,3, 0,0,115,2,0,0,0,0,1,122,25,95,78,97,109,101, 115,112,97,99,101,76,111,97,100,101,114,46,95,95,105,110, 105,116,95,95,99,2,0,0,0,0,0,0,0,2,0,0, @@ -1825,21 +1825,21 @@ const unsigned char _Py_M__importlib_external[] = { 41,2,114,47,0,0,0,114,105,0,0,0,41,2,114,164, 0,0,0,114,184,0,0,0,114,4,0,0,0,114,4,0, 0,0,114,5,0,0,0,218,11,109,111,100,117,108,101,95, - 114,101,112,114,227,3,0,0,115,2,0,0,0,0,7,122, + 114,101,112,114,230,3,0,0,115,2,0,0,0,0,7,122, 28,95,78,97,109,101,115,112,97,99,101,76,111,97,100,101, 114,46,109,111,100,117,108,101,95,114,101,112,114,99,2,0, 0,0,0,0,0,0,2,0,0,0,1,0,0,0,67,0, 0,0,115,4,0,0,0,100,1,0,83,41,2,78,84,114, 4,0,0,0,41,2,114,100,0,0,0,114,119,0,0,0, 114,4,0,0,0,114,4,0,0,0,114,5,0,0,0,114, - 153,0,0,0,236,3,0,0,115,2,0,0,0,0,1,122, + 153,0,0,0,239,3,0,0,115,2,0,0,0,0,1,122, 27,95,78,97,109,101,115,112,97,99,101,76,111,97,100,101, 114,46,105,115,95,112,97,99,107,97,103,101,99,2,0,0, 0,0,0,0,0,2,0,0,0,1,0,0,0,67,0,0, 0,115,4,0,0,0,100,1,0,83,41,2,78,114,30,0, 0,0,114,4,0,0,0,41,2,114,100,0,0,0,114,119, 0,0,0,114,4,0,0,0,114,4,0,0,0,114,5,0, - 0,0,114,196,0,0,0,239,3,0,0,115,2,0,0,0, + 0,0,114,196,0,0,0,242,3,0,0,115,2,0,0,0, 0,1,122,27,95,78,97,109,101,115,112,97,99,101,76,111, 97,100,101,114,46,103,101,116,95,115,111,117,114,99,101,99, 2,0,0,0,0,0,0,0,2,0,0,0,6,0,0,0, @@ -1849,7 +1849,7 @@ const unsigned char _Py_M__importlib_external[] = { 62,114,183,0,0,0,114,198,0,0,0,84,41,1,114,199, 0,0,0,41,2,114,100,0,0,0,114,119,0,0,0,114, 4,0,0,0,114,4,0,0,0,114,5,0,0,0,114,181, - 0,0,0,242,3,0,0,115,2,0,0,0,0,1,122,25, + 0,0,0,245,3,0,0,115,2,0,0,0,0,1,122,25, 95,78,97,109,101,115,112,97,99,101,76,111,97,100,101,114, 46,103,101,116,95,99,111,100,101,99,2,0,0,0,0,0, 0,0,2,0,0,0,1,0,0,0,67,0,0,0,115,4, @@ -1858,14 +1858,14 @@ const unsigned char _Py_M__importlib_external[] = { 32,102,111,114,32,109,111,100,117,108,101,32,99,114,101,97, 116,105,111,110,46,78,114,4,0,0,0,41,2,114,100,0, 0,0,114,158,0,0,0,114,4,0,0,0,114,4,0,0, - 0,114,5,0,0,0,114,180,0,0,0,245,3,0,0,115, + 0,114,5,0,0,0,114,180,0,0,0,248,3,0,0,115, 0,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,2,0,0, 0,1,0,0,0,67,0,0,0,115,4,0,0,0,100,0, 0,83,41,1,78,114,4,0,0,0,41,2,114,100,0,0, 0,114,184,0,0,0,114,4,0,0,0,114,4,0,0,0, - 114,5,0,0,0,114,185,0,0,0,248,3,0,0,115,2, + 114,5,0,0,0,114,185,0,0,0,251,3,0,0,115,2, 0,0,0,0,1,122,28,95,78,97,109,101,115,112,97,99, 101,76,111,97,100,101,114,46,101,120,101,99,95,109,111,100, 117,108,101,99,2,0,0,0,0,0,0,0,2,0,0,0, @@ -1884,7 +1884,7 @@ const unsigned char _Py_M__importlib_external[] = { 114,114,0,0,0,114,129,0,0,0,114,226,0,0,0,114, 186,0,0,0,41,2,114,100,0,0,0,114,119,0,0,0, 114,4,0,0,0,114,4,0,0,0,114,5,0,0,0,114, - 187,0,0,0,251,3,0,0,115,6,0,0,0,0,7,9, + 187,0,0,0,254,3,0,0,115,6,0,0,0,0,7,9, 1,10,1,122,28,95,78,97,109,101,115,112,97,99,101,76, 111,97,100,101,114,46,108,111,97,100,95,109,111,100,117,108, 101,78,41,12,114,105,0,0,0,114,104,0,0,0,114,106, @@ -1892,7 +1892,7 @@ const unsigned char _Py_M__importlib_external[] = { 0,0,114,153,0,0,0,114,196,0,0,0,114,181,0,0, 0,114,180,0,0,0,114,185,0,0,0,114,187,0,0,0, 114,4,0,0,0,114,4,0,0,0,114,4,0,0,0,114, - 5,0,0,0,114,243,0,0,0,223,3,0,0,115,16,0, + 5,0,0,0,114,243,0,0,0,226,3,0,0,115,16,0, 0,0,12,1,12,3,18,9,12,3,12,3,12,3,12,3, 12,3,114,243,0,0,0,99,0,0,0,0,0,0,0,0, 0,0,0,0,5,0,0,0,64,0,0,0,115,160,0,0, @@ -1930,7 +1930,7 @@ const unsigned char _Py_M__importlib_external[] = { 101,218,6,118,97,108,117,101,115,114,108,0,0,0,114,246, 0,0,0,41,2,114,164,0,0,0,218,6,102,105,110,100, 101,114,114,4,0,0,0,114,4,0,0,0,114,5,0,0, - 0,114,246,0,0,0,13,4,0,0,115,6,0,0,0,0, + 0,114,246,0,0,0,16,4,0,0,115,6,0,0,0,0, 4,22,1,15,1,122,28,80,97,116,104,70,105,110,100,101, 114,46,105,110,118,97,108,105,100,97,116,101,95,99,97,99, 104,101,115,99,2,0,0,0,0,0,0,0,3,0,0,0, @@ -1955,7 +1955,7 @@ const unsigned char _Py_M__importlib_external[] = { 61,0,0,0,114,118,0,0,0,114,99,0,0,0,41,3, 114,164,0,0,0,114,35,0,0,0,90,4,104,111,111,107, 114,4,0,0,0,114,4,0,0,0,114,5,0,0,0,218, - 11,95,112,97,116,104,95,104,111,111,107,115,21,4,0,0, + 11,95,112,97,116,104,95,104,111,111,107,115,24,4,0,0, 115,16,0,0,0,0,7,25,1,16,1,16,1,3,1,14, 1,13,1,12,2,122,22,80,97,116,104,70,105,110,100,101, 114,46,95,112,97,116,104,95,104,111,111,107,115,99,2,0, @@ -1988,7 +1988,7 @@ const unsigned char _Py_M__importlib_external[] = { 0,41,3,114,164,0,0,0,114,35,0,0,0,114,249,0, 0,0,114,4,0,0,0,114,4,0,0,0,114,5,0,0, 0,218,20,95,112,97,116,104,95,105,109,112,111,114,116,101, - 114,95,99,97,99,104,101,38,4,0,0,115,22,0,0,0, + 114,95,99,97,99,104,101,41,4,0,0,115,22,0,0,0, 0,8,12,1,3,1,16,1,13,3,9,1,3,1,17,1, 13,1,15,1,18,1,122,31,80,97,116,104,70,105,110,100, 101,114,46,95,112,97,116,104,95,105,109,112,111,114,116,101, @@ -2008,7 +2008,7 @@ const unsigned char _Py_M__importlib_external[] = { 0,114,249,0,0,0,114,120,0,0,0,114,121,0,0,0, 114,158,0,0,0,114,4,0,0,0,114,4,0,0,0,114, 5,0,0,0,218,16,95,108,101,103,97,99,121,95,103,101, - 116,95,115,112,101,99,60,4,0,0,115,18,0,0,0,0, + 116,95,115,112,101,99,63,4,0,0,115,18,0,0,0,0, 4,15,1,24,2,15,1,6,1,12,1,16,1,18,1,9, 1,122,27,80,97,116,104,70,105,110,100,101,114,46,95,108, 101,103,97,99,121,95,103,101,116,95,115,112,101,99,78,99, @@ -2044,7 +2044,7 @@ const unsigned char _Py_M__importlib_external[] = { 95,112,97,116,104,90,5,101,110,116,114,121,114,249,0,0, 0,114,158,0,0,0,114,121,0,0,0,114,4,0,0,0, 114,4,0,0,0,114,5,0,0,0,218,9,95,103,101,116, - 95,115,112,101,99,75,4,0,0,115,40,0,0,0,0,5, + 95,115,112,101,99,78,4,0,0,115,40,0,0,0,0,5, 6,1,13,1,21,1,3,1,15,1,12,1,15,1,21,2, 18,1,12,1,3,1,15,1,4,1,9,1,12,1,12,5, 17,2,18,1,9,1,122,20,80,97,116,104,70,105,110,100, @@ -2071,7 +2071,7 @@ const unsigned char _Py_M__importlib_external[] = { 152,0,0,0,114,224,0,0,0,41,6,114,164,0,0,0, 114,119,0,0,0,114,35,0,0,0,114,174,0,0,0,114, 158,0,0,0,114,0,1,0,0,114,4,0,0,0,114,4, - 0,0,0,114,5,0,0,0,114,175,0,0,0,107,4,0, + 0,0,0,114,5,0,0,0,114,175,0,0,0,110,4,0, 0,115,26,0,0,0,0,4,12,1,9,1,21,1,12,1, 4,1,15,1,9,1,6,3,9,1,24,1,4,2,7,2, 122,20,80,97,116,104,70,105,110,100,101,114,46,102,105,110, @@ -2093,7 +2093,7 @@ const unsigned char _Py_M__importlib_external[] = { 32,32,32,32,32,32,32,78,41,2,114,175,0,0,0,114, 120,0,0,0,41,4,114,164,0,0,0,114,119,0,0,0, 114,35,0,0,0,114,158,0,0,0,114,4,0,0,0,114, - 4,0,0,0,114,5,0,0,0,114,176,0,0,0,129,4, + 4,0,0,0,114,5,0,0,0,114,176,0,0,0,132,4, 0,0,115,8,0,0,0,0,8,18,1,12,1,4,1,122, 22,80,97,116,104,70,105,110,100,101,114,46,102,105,110,100, 95,109,111,100,117,108,101,41,12,114,105,0,0,0,114,104, @@ -2101,7 +2101,7 @@ const unsigned char _Py_M__importlib_external[] = { 0,0,114,246,0,0,0,114,251,0,0,0,114,253,0,0, 0,114,254,0,0,0,114,1,1,0,0,114,175,0,0,0, 114,176,0,0,0,114,4,0,0,0,114,4,0,0,0,114, - 4,0,0,0,114,5,0,0,0,114,245,0,0,0,9,4, + 4,0,0,0,114,5,0,0,0,114,245,0,0,0,12,4, 0,0,115,22,0,0,0,12,2,6,2,18,8,18,17,18, 22,18,15,3,1,18,31,3,1,21,21,3,1,114,245,0, 0,0,99,0,0,0,0,0,0,0,0,0,0,0,0,3, @@ -2150,7 +2150,7 @@ const unsigned char _Py_M__importlib_external[] = { 1,0,124,1,0,136,0,0,102,2,0,86,1,113,3,0, 100,0,0,83,41,1,78,114,4,0,0,0,41,2,114,22, 0,0,0,114,219,0,0,0,41,1,114,120,0,0,0,114, - 4,0,0,0,114,5,0,0,0,114,221,0,0,0,158,4, + 4,0,0,0,114,5,0,0,0,114,221,0,0,0,161,4, 0,0,115,2,0,0,0,6,0,122,38,70,105,108,101,70, 105,110,100,101,114,46,95,95,105,110,105,116,95,95,46,60, 108,111,99,97,108,115,62,46,60,103,101,110,101,120,112,114, @@ -2163,7 +2163,7 @@ const unsigned char _Py_M__importlib_external[] = { 0,0,114,35,0,0,0,218,14,108,111,97,100,101,114,95, 100,101,116,97,105,108,115,90,7,108,111,97,100,101,114,115, 114,160,0,0,0,114,4,0,0,0,41,1,114,120,0,0, - 0,114,5,0,0,0,114,179,0,0,0,152,4,0,0,115, + 0,114,5,0,0,0,114,179,0,0,0,155,4,0,0,115, 16,0,0,0,0,4,6,1,19,1,36,1,9,2,15,1, 9,1,12,1,122,19,70,105,108,101,70,105,110,100,101,114, 46,95,95,105,110,105,116,95,95,99,1,0,0,0,0,0, @@ -2174,7 +2174,7 @@ const unsigned char _Py_M__importlib_external[] = { 109,101,46,114,29,0,0,0,78,114,87,0,0,0,41,1, 114,4,1,0,0,41,1,114,100,0,0,0,114,4,0,0, 0,114,4,0,0,0,114,5,0,0,0,114,246,0,0,0, - 166,4,0,0,115,2,0,0,0,0,2,122,28,70,105,108, + 169,4,0,0,115,2,0,0,0,0,2,122,28,70,105,108, 101,70,105,110,100,101,114,46,105,110,118,97,108,105,100,97, 116,101,95,99,97,99,104,101,115,99,2,0,0,0,0,0, 0,0,3,0,0,0,2,0,0,0,67,0,0,0,115,59, @@ -2197,7 +2197,7 @@ const unsigned char _Py_M__importlib_external[] = { 32,32,32,32,32,32,32,78,41,3,114,175,0,0,0,114, 120,0,0,0,114,150,0,0,0,41,3,114,100,0,0,0, 114,119,0,0,0,114,158,0,0,0,114,4,0,0,0,114, - 4,0,0,0,114,5,0,0,0,114,117,0,0,0,172,4, + 4,0,0,0,114,5,0,0,0,114,117,0,0,0,175,4, 0,0,115,8,0,0,0,0,7,15,1,12,1,10,1,122, 22,70,105,108,101,70,105,110,100,101,114,46,102,105,110,100, 95,108,111,97,100,101,114,99,6,0,0,0,0,0,0,0, @@ -2209,7 +2209,7 @@ const unsigned char _Py_M__importlib_external[] = { 100,0,0,0,114,159,0,0,0,114,119,0,0,0,114,35, 0,0,0,90,4,115,109,115,108,114,174,0,0,0,114,120, 0,0,0,114,4,0,0,0,114,4,0,0,0,114,5,0, - 0,0,114,1,1,0,0,184,4,0,0,115,6,0,0,0, + 0,0,114,1,1,0,0,187,4,0,0,115,6,0,0,0, 0,1,15,1,18,1,122,20,70,105,108,101,70,105,110,100, 101,114,46,95,103,101,116,95,115,112,101,99,78,99,3,0, 0,0,0,0,0,0,14,0,0,0,15,0,0,0,67,0, @@ -2272,7 +2272,7 @@ const unsigned char _Py_M__importlib_external[] = { 104,114,219,0,0,0,114,159,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,158,0,0,0,114,4,0,0,0,114, - 4,0,0,0,114,5,0,0,0,114,175,0,0,0,189,4, + 4,0,0,0,114,5,0,0,0,114,175,0,0,0,192,4, 0,0,115,70,0,0,0,0,3,6,1,19,1,3,1,34, 1,13,1,11,1,15,1,10,1,9,2,9,1,9,1,15, 2,9,1,6,2,12,1,18,1,22,1,10,1,15,1,12, @@ -2309,7 +2309,7 @@ const unsigned char _Py_M__importlib_external[] = { 146,2,0,113,6,0,83,114,4,0,0,0,41,1,114,88, 0,0,0,41,2,114,22,0,0,0,90,2,102,110,114,4, 0,0,0,114,4,0,0,0,114,5,0,0,0,250,9,60, - 115,101,116,99,111,109,112,62,8,5,0,0,115,2,0,0, + 115,101,116,99,111,109,112,62,11,5,0,0,115,2,0,0, 0,9,0,122,41,70,105,108,101,70,105,110,100,101,114,46, 95,102,105,108,108,95,99,97,99,104,101,46,60,108,111,99, 97,108,115,62,46,60,115,101,116,99,111,109,112,62,78,41, @@ -2326,7 +2326,7 @@ const unsigned char _Py_M__importlib_external[] = { 111,110,116,101,110,116,115,114,241,0,0,0,114,98,0,0, 0,114,231,0,0,0,114,219,0,0,0,90,8,110,101,119, 95,110,97,109,101,114,4,0,0,0,114,4,0,0,0,114, - 5,0,0,0,114,9,1,0,0,235,4,0,0,115,34,0, + 5,0,0,0,114,9,1,0,0,238,4,0,0,115,34,0, 0,0,0,2,9,1,3,1,31,1,22,3,11,3,18,1, 18,7,9,1,13,1,24,1,6,1,27,2,6,1,17,1, 9,1,18,1,122,22,70,105,108,101,70,105,110,100,101,114, @@ -2365,7 +2365,7 @@ const unsigned char _Py_M__importlib_external[] = { 0,41,1,114,35,0,0,0,41,2,114,164,0,0,0,114, 8,1,0,0,114,4,0,0,0,114,5,0,0,0,218,24, 112,97,116,104,95,104,111,111,107,95,102,111,114,95,70,105, - 108,101,70,105,110,100,101,114,20,5,0,0,115,6,0,0, + 108,101,70,105,110,100,101,114,23,5,0,0,115,6,0,0, 0,0,2,12,1,18,1,122,54,70,105,108,101,70,105,110, 100,101,114,46,112,97,116,104,95,104,111,111,107,46,60,108, 111,99,97,108,115,62,46,112,97,116,104,95,104,111,111,107, @@ -2373,7 +2373,7 @@ const unsigned char _Py_M__importlib_external[] = { 4,0,0,0,41,3,114,164,0,0,0,114,8,1,0,0, 114,14,1,0,0,114,4,0,0,0,41,2,114,164,0,0, 0,114,8,1,0,0,114,5,0,0,0,218,9,112,97,116, - 104,95,104,111,111,107,10,5,0,0,115,4,0,0,0,0, + 104,95,104,111,111,107,13,5,0,0,115,4,0,0,0,0, 10,21,6,122,20,70,105,108,101,70,105,110,100,101,114,46, 112,97,116,104,95,104,111,111,107,99,1,0,0,0,0,0, 0,0,1,0,0,0,2,0,0,0,67,0,0,0,115,16, @@ -2381,7 +2381,7 @@ const unsigned char _Py_M__importlib_external[] = { 1,0,83,41,2,78,122,16,70,105,108,101,70,105,110,100, 101,114,40,123,33,114,125,41,41,2,114,47,0,0,0,114, 35,0,0,0,41,1,114,100,0,0,0,114,4,0,0,0, - 114,4,0,0,0,114,5,0,0,0,114,240,0,0,0,28, + 114,4,0,0,0,114,5,0,0,0,114,240,0,0,0,31, 5,0,0,115,2,0,0,0,0,1,122,19,70,105,108,101, 70,105,110,100,101,114,46,95,95,114,101,112,114,95,95,41, 15,114,105,0,0,0,114,104,0,0,0,114,106,0,0,0, @@ -2390,7 +2390,7 @@ const unsigned char _Py_M__importlib_external[] = { 1,0,0,114,175,0,0,0,114,9,1,0,0,114,177,0, 0,0,114,15,1,0,0,114,240,0,0,0,114,4,0,0, 0,114,4,0,0,0,114,4,0,0,0,114,5,0,0,0, - 114,2,1,0,0,143,4,0,0,115,20,0,0,0,12,7, + 114,2,1,0,0,146,4,0,0,115,20,0,0,0,12,7, 6,2,12,14,12,4,6,2,12,12,12,5,15,46,12,31, 18,18,114,2,1,0,0,99,4,0,0,0,0,0,0,0, 6,0,0,0,11,0,0,0,67,0,0,0,115,195,0,0, @@ -2416,7 +2416,7 @@ const unsigned char _Py_M__importlib_external[] = { 97,109,101,90,9,99,112,97,116,104,110,97,109,101,114,120, 0,0,0,114,158,0,0,0,114,4,0,0,0,114,4,0, 0,0,114,5,0,0,0,218,14,95,102,105,120,95,117,112, - 95,109,111,100,117,108,101,34,5,0,0,115,34,0,0,0, + 95,109,111,100,117,108,101,37,5,0,0,115,34,0,0,0, 0,2,15,1,15,1,6,1,6,1,12,1,12,1,18,2, 15,1,6,1,21,1,3,1,10,1,10,1,10,1,14,1, 13,2,114,20,1,0,0,99,0,0,0,0,0,0,0,0, @@ -2437,7 +2437,7 @@ const unsigned char _Py_M__importlib_external[] = { 3,90,10,101,120,116,101,110,115,105,111,110,115,90,6,115, 111,117,114,99,101,90,8,98,121,116,101,99,111,100,101,114, 4,0,0,0,114,4,0,0,0,114,5,0,0,0,114,155, - 0,0,0,57,5,0,0,115,8,0,0,0,0,5,18,1, + 0,0,0,60,5,0,0,115,8,0,0,0,0,5,18,1, 12,1,12,1,114,155,0,0,0,99,1,0,0,0,0,0, 0,0,12,0,0,0,12,0,0,0,67,0,0,0,115,70, 2,0,0,124,0,0,97,0,0,116,0,0,106,1,0,97, @@ -2498,7 +2498,7 @@ const unsigned char _Py_M__importlib_external[] = { 100,0,0,107,2,0,86,1,113,3,0,100,1,0,83,41, 2,114,29,0,0,0,78,41,1,114,31,0,0,0,41,2, 114,22,0,0,0,114,77,0,0,0,114,4,0,0,0,114, - 4,0,0,0,114,5,0,0,0,114,221,0,0,0,93,5, + 4,0,0,0,114,5,0,0,0,114,221,0,0,0,96,5, 0,0,115,2,0,0,0,6,0,122,25,95,115,101,116,117, 112,46,60,108,111,99,97,108,115,62,46,60,103,101,110,101, 120,112,114,62,114,59,0,0,0,122,30,105,109,112,111,114, @@ -2529,7 +2529,7 @@ const unsigned char _Py_M__importlib_external[] = { 119,101,97,107,114,101,102,95,109,111,100,117,108,101,90,13, 119,105,110,114,101,103,95,109,111,100,117,108,101,114,4,0, 0,0,114,4,0,0,0,114,5,0,0,0,218,6,95,115, - 101,116,117,112,68,5,0,0,115,82,0,0,0,0,8,6, + 101,116,117,112,71,5,0,0,115,82,0,0,0,0,8,6, 1,9,1,9,3,13,1,13,1,15,1,18,2,13,1,20, 3,33,1,19,2,31,1,10,1,15,1,13,1,4,2,3, 1,15,1,5,1,13,1,12,2,12,1,16,1,16,1,25, @@ -2555,7 +2555,7 @@ const unsigned char _Py_M__importlib_external[] = { 0,0,0,41,2,114,28,1,0,0,90,17,115,117,112,112, 111,114,116,101,100,95,108,111,97,100,101,114,115,114,4,0, 0,0,114,4,0,0,0,114,5,0,0,0,218,8,95,105, - 110,115,116,97,108,108,136,5,0,0,115,16,0,0,0,0, + 110,115,116,97,108,108,139,5,0,0,115,16,0,0,0,0, 2,10,1,9,1,28,1,15,1,16,1,16,4,9,1,114, 31,1,0,0,41,3,122,3,119,105,110,114,1,0,0,0, 114,2,0,0,0,41,56,114,107,0,0,0,114,10,0,0, @@ -2584,7 +2584,7 @@ const unsigned char _Py_M__importlib_external[] = { 0,114,5,0,0,0,218,8,60,109,111,100,117,108,101,62, 8,0,0,0,115,102,0,0,0,6,17,6,3,12,12,12, 5,12,5,12,6,12,12,12,10,12,9,12,5,12,7,15, - 22,15,112,22,1,18,2,6,1,6,2,9,2,9,2,10, + 22,15,115,22,1,18,2,6,1,6,2,9,2,9,2,10, 2,21,44,12,33,12,19,12,12,12,12,12,28,12,17,21, 55,21,12,18,10,12,14,9,3,12,1,15,65,19,64,19, 29,22,110,19,41,25,45,25,16,6,3,25,53,19,60,19, diff --git a/Tools/msi/buildrelease.bat b/Tools/msi/buildrelease.bat index fc7cb9f..2eae07a 100644 --- a/Tools/msi/buildrelease.bat +++ b/Tools/msi/buildrelease.bat @@ -168,7 +168,7 @@ if not "%SKIPBUILD%" EQU "1" ( "%BUILD%python.exe" %PGO%
)
- @call "%PCBUILD%build.bat" -e -p %BUILD_PLAT% -c PGUpdate -t %TARGET% %CERTOPTS%
+ @call "%PCBUILD%build.bat" -e -p %BUILD_PLAT% -c PGUpdate -t Build %CERTOPTS%
)
@if errorlevel 1 exit /B
@echo off
|